From 008847e490d6861a04433882bbd20f4aa84fea22 Mon Sep 17 00:00:00 2001 From: SimonGschnell Date: Mon, 24 Jun 2024 13:08:44 +0200 Subject: [PATCH] adds a sql query for the grouping algorithm --- .../api/frontend/v1/Stundenplan.php | 20 ++-- .../models/ressource/Stundenplan_model.php | 94 ++++++++++++++++++- public/js/api/ort.js | 10 ++ public/js/apps/Cis/RoomInformation.js | 37 ++++---- public/js/components/Calendar/Week/Page.js | 5 +- 5 files changed, 137 insertions(+), 29 deletions(-) create mode 100644 public/js/api/ort.js diff --git a/application/controllers/api/frontend/v1/Stundenplan.php b/application/controllers/api/frontend/v1/Stundenplan.php index fe5ac9e23..243f4b2c5 100644 --- a/application/controllers/api/frontend/v1/Stundenplan.php +++ b/application/controllers/api/frontend/v1/Stundenplan.php @@ -90,16 +90,22 @@ class Stundenplan extends FHCAPI_Controller $stunden = getData($stunden); - $result = $this->StundenplanModel->getRoomDataOnDay($ort_kurzbz,$start_date,$end_date); - - if(isError($result)){ + $result = $this->StundenplanModel->groupedRoomPlanning($ort_kurzbz,$start_date,$end_date); + //$this->loglib->logErrorDB(print_r($result,TRUE),"this is the result of the grouped query"); + + if(isError($result)){ $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); } $result = hasData($result) ? getData($result) : []; - $this->loglib->logInfoDB(print_r(count($result),true),"this is the count of the result"); - + + foreach($result as $entry){ + if(COUNT($entry->lektor)>1){ + // gruppierung hat stattgefunden und das array muss in einem String konvertiert werden + } + } + /* $final_events = array(); $grouped = array(); $associative_day_events = $this->filterEventsIntoAssociativeDateArray($result, $start_date, $end_date); @@ -196,9 +202,9 @@ class Stundenplan extends FHCAPI_Controller $final_events[] = $stunden_events[$event_key]; } } - } + } */ - $this->terminateWithSuccess($final_events); + $this->terminateWithSuccess($result); } diff --git a/application/models/ressource/Stundenplan_model.php b/application/models/ressource/Stundenplan_model.php index 5ce6a9823..5e5dc779d 100755 --- a/application/models/ressource/Stundenplan_model.php +++ b/application/models/ressource/Stundenplan_model.php @@ -18,7 +18,7 @@ class Stundenplan_model extends DB_Model * * @return stdClass */ - public function getRoomDataOnDay($ort_kurzbz,$start_date,$end_date){ + public function getRoomDataOnInterval($ort_kurzbz,$start_date,$end_date){ @@ -41,6 +41,98 @@ class Stundenplan_model extends DB_Model return $raum_stundenplan; } + /** + * @param string $ort_kurzbz The room to query the planning for + * @param string $start_date The start date of the query interval + * @param string $end_date The end date of the query interval + * + * @return stdClass + */ + public function groupedRoomPlanning($ort_kurzbz,$start_date,$end_date){ + + + $gruppierteRaumVerplannung= $this->execReadOnlyQuery(" + SELECT + + 'reservierung' as type, + NULL as unr,datum, stunde, + titel AS topic, + beschreibung as beschreibung, + string_agg(DISTINCT gruppe, '/') as gruppe, + string_agg(DISTINCT lektor, '/') as lektor, + res.ort_kurzbz,res.studiengang_kz, res.titel, res.beschreibung,NULL as lehreinheit_id,NULL as lehrfach_id,NULL as anmerkung, NULL as fix,NULL as lehrveranstaltung_id,NULL as stg_kurzbzlang,NULL as stg_bezeichnung,NULL as stg_typ, NULL as fachbereich_kurzbz,NULL as lehrfach,NULL as lehrfach_bez,NULL as farbe,NULL as lehrform, NULL as anmerkung_lehreinheit + + FROM + + ( + SELECT + NULL as unr,datum, stunde, + CASE + WHEN gruppe_kurzbz IS NOT NULL THEN gruppe_kurzbz + ELSE CONCAT(UPPER(studg.typ),UPPER(res.stg_kurzbz),'-',COALESCE(CAST(res.semester AS varchar),'/'),COALESCE(CAST(res.verband AS varchar),'/')) + END as gruppe, + CASE + WHEN mit.kurzbz IS NOT NULL THEN mit.kurzbz + ELSE uid + END as lektor, + res.ort_kurzbz,res.studiengang_kz, res.titel, res.beschreibung,NULL as lehreinheit_id,NULL as lehrfach_id,NULL as anmerkung, NULL as fix,NULL as lehrveranstaltung_id,NULL as stg_kurzbzlang,NULL as stg_bezeichnung,NULL as stg_typ, NULL as fachbereich_kurzbz,NULL as lehrfach,NULL as lehrfach_bez,NULL as farbe,NULL as lehrform, NULL as anmerkung_lehreinheit + FROM lehre.vw_reservierung res + + LEFT JOIN public.tbl_mitarbeiter mit ON mit.mitarbeiter_uid=uid + JOIN public.tbl_studiengang studg ON studg.studiengang_kz=res.studiengang_kz + + WHERE + res.ort_kurzbz = ? + AND res.datum >= ? + AND res.datum <= ? + ) as res + + GROUP BY res.ort_kurzbz,res.studiengang_kz, res.datum, res.stunde, res.titel, res.beschreibung + + UNION ALL + + SELECT + + 'stundenplan' as type, + unr,datum, stunde, + CONCAT(lehrfach,'-',lehrform) as topic, + '' as beschreibung, + string_agg(DISTINCT gruppe, '/') as gruppe, + string_agg(DISTINCT lektor, '/') as lektor, + ort_kurzbz, studiengang_kz, titel,'' as beschreibung,lehreinheit_id,lehrfach_id,anmerkung,fix,lehrveranstaltung_id,stg_kurzbzlang,stg_bezeichnung,stg_typ,fachbereich_kurzbz,lehrfach,lehrfach_bez,farbe,lehrform,anmerkung_lehreinheit + + FROM + ( + SELECT + unr,datum, stunde, + CASE + WHEN gruppe_kurzbz IS NOT NULL THEN gruppe_kurzbz + ELSE CONCAT(UPPER(sp.stg_typ),UPPER(sp.stg_kurzbz),'-',COALESCE(CAST(sp.semester AS varchar),'/'),COALESCE(CAST(sp.verband AS varchar),'/')) + END as gruppe, + CASE + WHEN sp.mitarbeiter_kurzbz IS NOT NULL THEN sp.mitarbeiter_kurzbz + ELSE lektor + END as lektor, + ort_kurzbz, studiengang_kz, titel,'' as beschreibung,lehreinheit_id,lehrfach_id,anmerkung,fix,lehrveranstaltung_id,stg_kurzbzlang,stg_bezeichnung,stg_typ,fachbereich_kurzbz,lehrfach,lehrfach_bez,farbe,lehrform,anmerkung_lehreinheit + + FROM lehre.vw_stundenplan sp + + WHERE ort_kurzbz = ? + AND datum >= ? + AND datum <= ? + + ) as sp + + GROUP BY + + ort_kurzbz,unr, datum, stunde, lehreinheit_id, lehrfach_id,studiengang_kz,titel,anmerkung,fix,lehrveranstaltung_id,stg_kurzbzlang,stg_bezeichnung,stg_typ,fachbereich_kurzbz,lehrfach,lehrfach_bez,farbe,lehrform,anmerkung_lehreinheit + + ORDER BY datum, stunde + ", [$ort_kurzbz, $start_date, $end_date, $ort_kurzbz, $start_date, $end_date]); + + return $gruppierteRaumVerplannung; + } + /** * @param string $uid * diff --git a/public/js/api/ort.js b/public/js/api/ort.js new file mode 100644 index 000000000..4c8e2ce73 --- /dev/null +++ b/public/js/api/ort.js @@ -0,0 +1,10 @@ +export default { + getContentID(ort_kurbz) { + return this.$fhcApi.get( + FHC_JS_DATA_STORAGE_OBJECT.app_root + + FHC_JS_DATA_STORAGE_OBJECT.ci_router + + "/api/frontend/v1/Ort/ContentID", + { ort_kurzbz: ort_kurbz } + ); + }, +} \ No newline at end of file diff --git a/public/js/apps/Cis/RoomInformation.js b/public/js/apps/Cis/RoomInformation.js index af92fe147..b5559047e 100644 --- a/public/js/apps/Cis/RoomInformation.js +++ b/public/js/apps/Cis/RoomInformation.js @@ -51,7 +51,13 @@ const app = Vue.createApp({ res.data.forEach((el, i) => { el.id = i; - el.color = '#' + (el.farbe || 'CCCCCC'); + if(el.type === 'reservierung') + { + el.color = '#' + (el.farbe || 'FFFFFF'); + }else{ + 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; @@ -62,7 +68,8 @@ const app = Vue.createApp({ this.events = res.data; } - this.$fhcApi.factory.stundenplan.getReservierungen('EDV_F4.26', this.weekFirstDay, this.weekLastDay).then(res => { + // reservierungen are loaded with the stundenplan + /* this.$fhcApi.factory.stundenplan.getReservierungen('EDV_F4.26', this.weekFirstDay, this.weekLastDay).then(res => { if (res.data && res.data.forEach) { res.data.forEach((el, i) => { el.reservierung = true; @@ -77,11 +84,10 @@ const app = Vue.createApp({ } let reservierungs_events = res.data; - console.log(reservierungs_events,"this are the reservierungs events that are getting from the db query") this.events = [...(this.events?this.events:[]),...reservierungs_events]; - this.events_loaded = true; - }); + + }); */ }); @@ -90,22 +96,19 @@ const app = Vue.createApp({ }, template: /*html*/`
- +
- - + {{event.orig.topic}} + {{gruppe}} + {{lektor}} + + {{event.orig.beschreibung}} + +
diff --git a/public/js/components/Calendar/Week/Page.js b/public/js/components/Calendar/Week/Page.js index efaaff131..75fef62f1 100755 --- a/public/js/components/Calendar/Week/Page.js +++ b/public/js/components/Calendar/Week/Page.js @@ -48,7 +48,6 @@ export default { nextDay.setDate(nextDay.getDate()+1); nextDay.setMilliseconds(nextDay.getMilliseconds()-1); let d = {events:[],lanes:1}; - console.log("this are the events",this.events, "and this is the key",key) if (this.events[key]) { this.events[key].forEach(evt => { let event = {orig:evt,lane:1,maxLane:1,start: evt.start < day ? day : evt.start, end: evt.end > nextDay ? nextDay : evt.end,shared:[],setSharedMaxRecursive(doneItems) { @@ -78,9 +77,7 @@ export default { } }, methods: { - printTest:function(param){ - console.log("HERE",param) - }, + changeToMonth(day) { if (!this.noMonthView) { this.date.set(day);