From 715b8075b80a1ae8a606d197ab394dfab452206f Mon Sep 17 00:00:00 2001 From: SimonGschnell Date: Tue, 10 Sep 2024 12:30:40 +0200 Subject: [PATCH] reworks the query for the reservierungen stundenplan/room --- .../api/frontend/v1/Stundenplan.php | 134 ++++-------------- .../models/ressource/Reservierung_model.php | 39 +++-- .../models/ressource/Stundenplan_model.php | 9 +- public/js/api/stundenplan.js | 16 ++- public/js/apps/Cis/Stundenplan.js | 102 ++++++++----- .../js/components/Cis/Mylv/RoomInformation.js | 2 +- 6 files changed, 141 insertions(+), 161 deletions(-) diff --git a/application/controllers/api/frontend/v1/Stundenplan.php b/application/controllers/api/frontend/v1/Stundenplan.php index d746990be..61dc5233f 100644 --- a/application/controllers/api/frontend/v1/Stundenplan.php +++ b/application/controllers/api/frontend/v1/Stundenplan.php @@ -97,24 +97,36 @@ class Stundenplan extends FHCAPI_Controller } + /** + * fetches stundenplan events from a UID and start/end date + * @access public + * + */ public function getStundenplan(){ + + // form validation + $this->load->library('form_validation'); + $this->form_validation->set_data($_GET); + $this->form_validation->set_rules('start_date', "start_date", "required"); + $this->form_validation->set_rules('end_date', "end_date", "required"); + if ($this->form_validation->run() === FALSE) + $this->terminateWithValidationErrors($this->form_validation->error_array()); + + // storing the get parameter in local variables + $start_date = $this->input->get('start_date', TRUE); + $end_date = $this->input->get('end_date', TRUE); $this->load->model('ressource/Stundenplan_model', 'StundenplanModel'); - /* $result = $this->StundenplanModel->loadForUid(get_uid()); - - if (isError($result)) - return $this->outputJsonError(getError($result)); - */ - $res = $this->StundenplanModel->stundenplanGruppierung($this->StundenplanModel->getStundenplanQuery(get_uid())); + // the stundenplan query needs the uid and a start and end date + $stundenplan_data = $this->StundenplanModel->stundenplanGruppierung($this->StundenplanModel->getStundenplanQuery(get_uid(),$start_date,$end_date)); + $stundenplan_data = $this->getDataOrTerminateWithError($stundenplan_data); - $res = getData($res); - - $this->outputJsonSuccess($res); + $this->terminateWithSuccess($stundenplan_data); } - // reservierungen is not used in the prototype for the students - public function Reservierungen() + // gets the reservierungen of a room if the ort_kurzbz parameter is supplied otherwise gets the reservierungen of the stundenplan of a student + public function Reservierungen($ort_kurzbz = null) { $this->load->model('ressource/Reservierung_model', 'ReservierungModel'); $this->load->model('ressource/Stunde_model', 'StundeModel'); @@ -123,13 +135,11 @@ class Stundenplan extends FHCAPI_Controller //form validation $this->load->library('form_validation'); $this->form_validation->set_data($_GET); - $this->form_validation->set_rules('ort_kurzbz',"Ort","required"); $this->form_validation->set_rules('start_date', "StartDate", "required"); $this->form_validation->set_rules('end_date', "EndDate", "required"); if($this->form_validation->run() == FALSE) $this->terminateWithValidationErrors($this->form_validation->error_array()); // storing the get parameter in local variables - $ort_kurzbz = $this->input->get('ort_kurzbz', TRUE); $start_date = $this->input->get('start_date', TRUE); $end_date = $this->input->get('end_date', TRUE); @@ -139,100 +149,18 @@ class Stundenplan extends FHCAPI_Controller $stunden = $this->getDataOrTerminateWithError($stunden); // querying the reservierungen - $result = $this->ReservierungModel->getRoomReservierungen($ort_kurzbz, $start_date, $end_date); + if(isset($ort_kurzbz)){ + $result = $this->ReservierungModel->getReservierungen($start_date, $end_date, $ort_kurzbz); + }else{ + $result = $this->ReservierungModel->getReservierungen($start_date, $end_date); + } $result = $this->getDataOrTerminateWithError($result); - $this->terminateWithSuccess($result); - // imperative approach - /* $day_events = $this->filterEventsIntoAssociativeDateArray($result, $start_date, $end_date); - $final_reservierungen = array(); - foreach($day_events as $date => $day_eventArray){ - - // loop over the stunden - foreach( $stunden as $stunde){ - // filtering all the day reservierungen to the reservierungen that happen at the same hour of the day - $hour_reservierungen = array_filter($day_eventArray, function($day_entry) use ($stunde){ - return $day_entry->stunde == $stunde->stunde; - }); - - // if there are no reservierungen within that hour than we skip that iteration of the loop - if(count($hour_reservierungen) <1){ - continue; - } - - $this->loglib->logInfoDB(print_r($hour_reservierungen,true),"this is the hour reservierungen"); - - // grouping the reservierung information of reservervations of the same hour on the same day - $grouped_uids = array(); - foreach($hour_reservierungen as $entry){ - - // grouping the reservierungs participants - - $mitarbeiter_check = $this->MitarbeiterModel->isMitarbeiter($entry->uid); - - if(isError($mitarbeiter_check)){ - $this->terminateWithError(getError($mitarbeiter_check), self::ERROR_TYPE_GENERAL); - } - - $mitarbeiter_check = getData($mitarbeiter_check); - - // if the uid belongs to a mitarbeiter store the mitarbeiter_kurzbz otherwise store the student uid - if($mitarbeiter_check){ - $mitarbeiterKurzbz = $this->MitarbeiterModel->generateKurzbz($entry->uid); - - if(isError($mitarbeiterKurzbz)){ - $this->terminateWithError(getError($mitarbeiterKurzbz), self::ERROR_TYPE_GENERAL); - } - - $grouped_uids[] = getData($mitarbeiterKurzbz); - - }else{ - $grouped_uids[]= $entry->uid; - } - - - } - - - // merging all the information into the first entry - $final_reservierung = current($hour_reservierungen); - - $final_reservierung->person_kurzbz = implode(" / ",$grouped_uids); - - $final_reservierungen[] = $final_reservierung; - } - - } - $this->terminateWithSuccess($final_reservierungen); */ + $this->terminateWithSuccess($result); + } - private function filterEventsIntoAssociativeDateArray($events, $start_date, $end_date){ - $php_start_date = new DateTime($start_date); - $php_end_date = new DateTime($end_date); - // count is used to ensure that the loop does not iterate more than 7 times (7 days per week) - $count =0; - - $result = array(); - - // loop over the days - while($php_start_date <= $php_end_date && $count <7){ - - $date = $php_start_date->format('Y-m-d'); - - // filtering all the reservierungen with the date - $day_events = array_filter($events, function($event) use ($date){ - // no filtering is done if the event entries do not have a datum property - return isset($event->datum) ? $event->datum == $date : true; - - }); - - $result[$date] = $day_events; - ++$count; - $php_start_date->modify('+1 day'); - } - - return $result; - } + } diff --git a/application/models/ressource/Reservierung_model.php b/application/models/ressource/Reservierung_model.php index 73e21eb2c..9a5bc6af0 100755 --- a/application/models/ressource/Reservierung_model.php +++ b/application/models/ressource/Reservierung_model.php @@ -18,8 +18,31 @@ class Reservierung_model extends DB_Model * * @return stdClass */ - public function getRoomReservierungen($ort_kurzbz, $start_date, $end_date) + public function getReservierungen($start_date, $end_date, $ort_kurzbz = null) { + + $stundenplan_reservierungen="SELECT r.* , beginn, ende + FROM campus.vw_reservierung r + LEFT JOIN public.tbl_benutzergruppe bg ON r.gruppe_kurzbz=bg.gruppe_kurzbz AND bg.uid=? + LEFT JOIN public.tbl_studiensemester ss1 ON bg.studiensemester_kurzbz=ss1.studiensemester_kurzbz AND ss1.start <= r.datum AND ss1.ende >= r.datum + LEFT JOIN public.tbl_studentlehrverband slv ON r.studiengang_kz=slv.studiengang_kz AND slv.student_uid=? AND (slv.semester=r.semester OR r.semester IS NULL) AND (slv.verband=r.verband OR r.verband IS NULL OR r.verband='' OR r.verband='0') AND (slv.gruppe=r.gruppe OR r.gruppe IS NULL OR r.gruppe ='' OR r.gruppe ='0') AND r.gruppe_kurzbz IS NULL + LEFT JOIN public.tbl_studiensemester ss2 ON slv.studiensemester_kurzbz = ss2.studiensemester_kurzbz AND ss2.start <=r.datum AND ss2.ende >= r.datum + JOIN lehre.tbl_stunde ON lehre.tbl_stunde.stunde = r.stunde + WHERE datum >= ? AND datum <= ? AND (ss1.studiensemester_kurzbz IS NOT NULL + OR ss2.studiensemester_kurzbz IS NOT NULL)"; + + $raum_reservierungen = "SELECT res.*, beginn, ende, + CASE + WHEN res.gruppe_kurzbz IS NOT NULL THEN res.gruppe_kurzbz + ELSE CONCAT(UPPER(studg.typ),UPPER(studg.kurzbz),'-',COALESCE(CAST(res.semester AS varchar),'/'),COALESCE(CAST(res.verband AS varchar),'/')) + END as gruppen_kuerzel + + FROM lehre.vw_reservierung res + JOIN public.tbl_studiengang studg ON studg.studiengang_kz=res.studiengang_kz + JOIN lehre.tbl_stunde ON lehre.tbl_stunde.stunde = res.stunde + WHERE res.ort_kurzbz = ? AND datum >= ? AND datum <= ?"; + + $raum_reservierungen= $this->execReadOnlyQuery(" SELECT @@ -32,23 +55,13 @@ class Reservierung_model extends DB_Model FROM ( - SELECT res.*, beginn, ende, - CASE - WHEN res.gruppe_kurzbz IS NOT NULL THEN res.gruppe_kurzbz - ELSE CONCAT(UPPER(studg.typ),UPPER(studg.kurzbz),'-',COALESCE(CAST(res.semester AS varchar),'/'),COALESCE(CAST(res.verband AS varchar),'/')) - END as gruppen_kuerzel - - FROM lehre.vw_reservierung res - JOIN public.tbl_studiengang studg ON studg.studiengang_kz=res.studiengang_kz - JOIN lehre.tbl_stunde ON lehre.tbl_stunde.stunde = res.stunde - WHERE res.ort_kurzbz = ? AND datum >= ? AND datum <= ? - + ". is_null($ort_kurzbz)? $stundenplan_reservierungen:$raum_reservierungen ." ) AS subquery GROUP BY datum, beginn, ende, ort_kurzbz, titel, beschreibung ORDER BY datum, beginn - ", [$ort_kurzbz, $start_date, $end_date]); + ", is_null($ort_kurzbz) ?[getAuthUID(), getAuthUID(),$start_date,$end_date]: [$ort_kurzbz, $start_date, $end_date]); if(isError($raum_reservierungen)){ show_error(getError($raum_reservierungen)); diff --git a/application/models/ressource/Stundenplan_model.php b/application/models/ressource/Stundenplan_model.php index 845b114eb..6f291d743 100755 --- a/application/models/ressource/Stundenplan_model.php +++ b/application/models/ressource/Stundenplan_model.php @@ -148,8 +148,9 @@ class Stundenplan_model extends DB_Model CONCAT(lehrfach,'-',lehrform) as topic, array_agg(DISTINCT lektor) as lektor, array_agg(DISTINCT (gruppe,verband,semester,studiengang_kz,gruppen_kuerzel)) as gruppe, + string_agg(DISTINCT ort_kurzbz, '/') as ort_kurzbz, - ort_kurzbz, titel, lehrfach, lehrform, lehrfach_bez, organisationseinheit, farbe + titel, lehrfach, lehrform, lehrfach_bez, organisationseinheit, farbe FROM ( @@ -243,7 +244,7 @@ class Stundenplan_model extends DB_Model * * @return string */ - public function getStundenPlanQuery($uid){ + public function getStundenplanQuery($uid, $start_date, $end_date){ return "select sp.* from lehre.vw_stundenplan sp @@ -252,7 +253,9 @@ class Stundenplan_model extends DB_Model left join public.tbl_studentlehrverband slv ON sp.studiengang_kz=slv.studiengang_kz and slv.student_uid=".$this->escape($uid)." and (slv.semester=sp.semester OR sp.semester IS NULL) AND (slv.verband=sp.verband OR sp.verband IS NULL OR sp.verband='' OR sp.verband='0') AND (slv.gruppe=sp.gruppe OR sp.gruppe IS NULL OR sp.gruppe='' OR sp.gruppe='0') AND sp.gruppe_kurzbz IS NULL left join public.tbl_studiensemester ss2 ON slv.studiensemester_kurzbz=ss2.studiensemester_kurzbz AND ss2.start<=sp.datum and ss2.ende >= sp.datum - WHERE ss1.studiensemester_kurzbz IS NOT NULL or ss2.studiensemester_kurzbz IS NOT NULL"; + WHERE ss1.studiensemester_kurzbz IS NOT NULL or ss2.studiensemester_kurzbz IS NOT NULL + AND sp.datum >= ".$this->escape($start_date)." + AND sp.datum <= ".$this->escape($end_date); } /** diff --git a/public/js/api/stundenplan.js b/public/js/api/stundenplan.js index a522ef3ca..1e06d3d8c 100644 --- a/public/js/api/stundenplan.js +++ b/public/js/api/stundenplan.js @@ -6,16 +6,28 @@ export default { { ort_kurzbz, start_date, end_date} ); }, + getStundenplan(start_date, end_date) { + return this.$fhcApi.get( + '/api/frontend/v1/Stundenplan/getStundenplan', + { start_date, end_date } + ); + }, getStunden() { return this.$fhcApi.get( '/api/frontend/v1/Stundenplan/Stunden', {} ); }, - getReservierungen(ort_kurzbz, start_date, end_date) { + getOrtReservierungen(ort_kurzbz, start_date, end_date) { + return this.$fhcApi.get( + `/api/frontend/v1/Stundenplan/Reservierungen/${ort_kurzbz}`, + { start_date, end_date} + ); + }, + getStundenplanReservierungen(start_date, end_date) { return this.$fhcApi.get( '/api/frontend/v1/Stundenplan/Reservierungen', - { ort_kurzbz, start_date, end_date} + { start_date, end_date } ); }, }; \ No newline at end of file diff --git a/public/js/apps/Cis/Stundenplan.js b/public/js/apps/Cis/Stundenplan.js index 773495c27..88ed725c2 100755 --- a/public/js/apps/Cis/Stundenplan.js +++ b/public/js/apps/Cis/Stundenplan.js @@ -1,53 +1,77 @@ import FhcCalendar from "../../components/Calendar/Calendar.js"; import Phrasen from "../../plugin/Phrasen.js"; +import CalendarDate from "../../composables/CalendarDate.js"; + const app = Vue.createApp({ - components: { - FhcCalendar - }, data() { return { stunden: [], - events: null + events: null, + calendarWeek: new CalendarDate(new Date()), + } }, - created() { - axios.get(FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + '/components/Cis/Stundenplan/Stunden').then(res => { - res.data.retval.forEach(std => { - this.stunden[std.stunde] = std; // TODO(chris): geht besser - }); - axios.get(FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + '/components/Cis/Stundenplan').then(res => { - let events; - if (res.data.retval && res.data.retval.forEach) { - res.data.retval.forEach((el, i) => { - el.id = i; - el.color = '#' + (el.farbe || 'CCCCCC'); - el.start = new Date(el.datum + ' ' + this.stunden[el.stunde].beginn); - el.end = new Date(el.datum + ' ' + this.stunden[el.stunde].ende); - el.title = el.lehrfach; - if (el.lehrform) - el.title += '-' + el.lehrform; - }); - events = res.data.retval; - } - // TODO(chris): do we need that - axios.get(FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + '/components/Cis/Stundenplan/Reservierungen').then(res => { - if (res.data.retval && res.data.retval.forEach) { - res.data.retval.forEach((el, i) => { - el.id = i + events.length; - el.color = '#CCCCCC'; - el.start = new Date(el.datum + ' ' + this.stunden[el.stunde].beginn); - el.end = new Date(el.datum + ' ' + this.stunden[el.stunde].ende); - el.title = el.lehrfach; - if (el.lehrform) - el.title += '-' + el.lehrform; - }); - events = [...events, ...res.data.retval]; + components: { + FhcCalendar + }, + computed:{ + weekFirstDay: function () { + return this.calendarDateToString(this.calendarWeek.cdFirstDayOfWeek); + }, + weekLastDay: function () { + return this.calendarDateToString(this.calendarWeek.cdLastDayOfWeek); + }, + }, + methods:{ + + calendarDateToString: function (calendarDate) { + + return calendarDate instanceof CalendarDate ? + [calendarDate.y, calendarDate.m + 1, calendarDate.d].join('-') : + null; + + }, + + loadEvents: function(){ + console.log("this are the days with which i am testing", this.weekFirstDay, this.weekLastDay) + Promise.allSettled([ + this.$fhcApi.factory.stundenplan.getStundenplan(this.weekFirstDay, this.weekLastDay), + this.$fhcApi.factory.stundenplan.getStundenplanReservierungen(this.weekFirstDay, this.weekLastDay) + ]).then((result) => { + let promise_events = []; + result.forEach((promise_result) => { + if (promise_result.status === 'fulfilled' && promise_result.value.meta.status === "success") { + + let data = promise_result.value.data; + // adding additional information to the events + if (data && data.forEach) { + + data.forEach((el, i) => { + el.id = i; + if (el.type === 'reservierung') { + el.color = '#' + (el.farbe || 'FFFFFF'); + } else { + el.color = '#' + (el.farbe || 'CCCCCC'); + } + + el.start = new Date(el.datum + ' ' + el.beginn); + el.end = new Date(el.datum + ' ' + el.ende); + + }); + } + promise_events = promise_events.concat(data); } - this.events = events; - }); + }) + this.events = promise_events; }); - }); + }, + }, + created() { + this.loadEvents(); + + + }, template:/*html*/`

Stundenplan

diff --git a/public/js/components/Cis/Mylv/RoomInformation.js b/public/js/components/Cis/Mylv/RoomInformation.js index a01af0ebc..1c5ab31e0 100644 --- a/public/js/components/Cis/Mylv/RoomInformation.js +++ b/public/js/components/Cis/Mylv/RoomInformation.js @@ -53,7 +53,7 @@ export default{ // bundles the room_events and the reservierungen together into the this.events array Promise.allSettled([ this.$fhcApi.factory.stundenplan.getRoomInfo(this.ort_kurzbz, this.weekFirstDay, this.weekLastDay), - this.$fhcApi.factory.stundenplan.getReservierungen(this.ort_kurzbz, this.weekFirstDay, this.weekLastDay) + this.$fhcApi.factory.stundenplan.getOrtReservierungen(this.ort_kurzbz, this.weekFirstDay, this.weekLastDay) ]).then((result) => { let events = []; result.forEach((promise_result) => {