From 175b077d874c83fbbfaa3dda58634f6e28db01fa Mon Sep 17 00:00:00 2001 From: Ivymaster Date: Mon, 7 Sep 2026 17:50:09 +0200 Subject: [PATCH] Added mod --- application/libraries/KalenderLib.php | 57 ++++++++++++++++++--------- 1 file changed, 39 insertions(+), 18 deletions(-) diff --git a/application/libraries/KalenderLib.php b/application/libraries/KalenderLib.php index 623784c9d..6afd07349 100644 --- a/application/libraries/KalenderLib.php +++ b/application/libraries/KalenderLib.php @@ -34,13 +34,28 @@ class KalenderLib } - private function _getBasePlan($start_date, $end_date) + private function _buildFilteredKalenderCte($start_date, $end_date) + { + $end_date = date('Y-m-d', strtotime($end_date . ' +1 day')); + + return sprintf( + 'WITH filtered_kalender AS MATERIALIZED ( + SELECT * + FROM lehre.tbl_kalender + WHERE von >= timestamp %s + AND bis < timestamp %s + AND status_kurzbz <> \'deleted\' + )', + $this->_ci->KalenderModel->db->escape(date('Y-m-d H:i:s', strtotime($start_date))), + $this->_ci->KalenderModel->db->escape(date('Y-m-d H:i:s', strtotime($end_date))) + ); + } + + private function _buildBasePlanQuery() { $language = $this->getLanguageIndex(); $index_bezeichnung_mehrsprachig = $language - 1; - $end_date = date('Y-m-d', strtotime($end_date . ' +1 day')); - $this->_ci->KalenderModel->addSelect('tbl_kalender.kalender_id, tbl_kalender.eindeutige_kalender_gruppen_id, tbl_kalender.status_kurzbz, @@ -139,6 +154,7 @@ class KalenderLib $this->_ci->KalenderModel->addJoin('public.tbl_benutzer resevierung_benutzer', 'reservierung_ma.mitarbeiter_uid = resevierung_benutzer.uid', 'LEFT'); $this->_ci->KalenderModel->addJoin('public.tbl_person reservierung_person', 'reservierung_person.person_id = resevierung_benutzer.person_id', 'LEFT'); + $this->_ci->KalenderModel->addJoin('lehre.tbl_lehreinheitgruppe', 'tbl_lehreinheit.lehreinheit_id = tbl_lehreinheitgruppe.lehreinheit_id', 'LEFT'); $this->_ci->KalenderModel->addJoin('public.tbl_gruppe le_gruppe', 'tbl_lehreinheitgruppe.gruppe_kurzbz = le_gruppe.gruppe_kurzbz', 'LEFT'); $this->_ci->KalenderModel->addJoin('public.tbl_lehrverband le_lehrverband', @@ -216,12 +232,17 @@ class KalenderLib $this->_ci->KalenderModel->db->join('lehre.tbl_stunde vonstunde', 'tbl_kalender.von::time = vonstunde.beginn', 'LEFT', FALSE); $this->_ci->KalenderModel->db->join('lehre.tbl_stunde bisstunde', 'tbl_kalender.bis::time = bisstunde.ende', 'LEFT', FALSE); - $this->_ci->KalenderModel->db->where('tbl_kalender.von >=', $start_date); - $this->_ci->KalenderModel->db->where('tbl_kalender.bis <', $end_date); - $this->_ci->KalenderModel->addOrder('tbl_kalender.eindeutige_kalender_gruppen_id', 'DESC'); } + private function _loadFilteredBasePlan($start_date, $end_date) + { + $query = $this->_buildFilteredKalenderCte($start_date, $end_date) . "\n" . + $this->_ci->KalenderModel->db->get_compiled_select('filtered_kalender AS tbl_kalender'); + + return $this->_ci->KalenderModel->execReadOnlyQuery($query); + } + private function _mapEvents($data, $collisionCheck = true) { $stundenplan_data = []; @@ -369,10 +390,10 @@ class KalenderLib } public function getPlanByOrt($start_date, $end_date, $ort) { - $this->_getBasePlan($start_date, $end_date); + $this->_buildBasePlanQuery(); $this->_ci->KalenderModel->db->where('tbl_kalender_ort.ort_kurzbz', $ort); - $data = $this->_ci->KalenderModel->load(); + $data = $this->_loadFilteredBasePlan($start_date, $end_date); return $this->_mapEvents($data); } @@ -382,7 +403,7 @@ class KalenderLib $start_date = date('Y-m-d', strtotime($start_date)); $end_date = date('Y-m-d', strtotime($end_date . ' +1 day')); - $this->_getBasePlan($start_date, $end_date); + $this->_buildBasePlanQuery(); $this->_ci->KalenderModel->db->where('NOT EXISTS ( SELECT 1 FROM lehre.tbl_kalender nachfolger @@ -414,7 +435,7 @@ class KalenderLib $this->_ci->KalenderModel->db->group_end(); } - $data = $this->_ci->KalenderModel->load(); + $data = $this->_loadFilteredBasePlan($start_date, $end_date); return $this->_mapEvents($data, false); } @@ -430,14 +451,14 @@ class KalenderLib $kalender_entry = getData($kalender_entry)[0]; - $this->_getBasePlan($kalender_entry->von, $kalender_entry->bis); + $this->_buildBasePlanQuery(); $this->_ci->KalenderModel->db->where('tbl_kalender.kalender_id', $kalender_entry->kalender_id); - $data = $this->_ci->KalenderModel->load(); + $data = $this->_loadFilteredBasePlan($kalender_entry->von, $kalender_entry->bis); return $this->_mapEvents($data); } public function getPlanForPlanner($start_date, $end_date, $ort = null, $uids = null, $studiengaenge = null) { - $this->_getBasePlan($start_date, $end_date); + $this->_buildBasePlanQuery(); if (!is_null($ort)) { @@ -540,18 +561,18 @@ class KalenderLib ) AS has_assigned_resources" ]); - $data = $this->_ci->KalenderModel->load(); + $data = $this->_loadFilteredBasePlan($start_date, $end_date); return $this->_mapEvents($data); } public function getPlanForStudent($start_date, $end_date) { - $this->_getBasePlan($start_date, $end_date); + $this->_buildBasePlanQuery(); $this->_ci->KalenderModel->db->where_in('status_kurzbz', array('live', 'to_delete_live')); - $data = $this->_ci->KalenderModel->load(); + $data = $this->_loadFilteredBasePlan($start_date, $end_date); return $this->_mapEvents($data); } @@ -559,7 +580,7 @@ class KalenderLib public function getPlanForLecturer($start_date, $end_date) { - $this->_getBasePlan($start_date, $end_date); + $this->_buildBasePlanQuery(); $this->_ci->KalenderModel->addJoin( 'lehre.tbl_kalender neuerer', @@ -571,7 +592,7 @@ class KalenderLib OR (tbl_kalender.status_kurzbz = 'preview' AND neuerer.kalender_id IS NULL) OR (tbl_kalender.status_kurzbz = 'live' AND neuerer.kalender_id IS NULL) )", NULL, FALSE); - $data = $this->_ci->KalenderModel->load(); + $data = $this->_loadFilteredBasePlan($start_date, $end_date); return $this->_mapEvents($data); }