From b58b4446a98ff57b3616dc35cb3ad76966703d59 Mon Sep 17 00:00:00 2001 From: ma0048 Date: Mon, 10 Aug 2026 10:57:34 +0200 Subject: [PATCH] todelete auf to_delete umebannnt to_delete_live & to_delete_preview hinugefuegt history logik umbau --- application/libraries/KalenderLib.php | 93 +++++++++++++++-------- application/libraries/KalenderSyncLib.php | 79 ++++++++++++++++--- public/js/components/Tempus/Tempus.js | 2 + system/dbupdate_3.4/46975_tempus.php | 29 +++++++ 4 files changed, 161 insertions(+), 42 deletions(-) diff --git a/application/libraries/KalenderLib.php b/application/libraries/KalenderLib.php index 174063819..58a684df0 100644 --- a/application/libraries/KalenderLib.php +++ b/application/libraries/KalenderLib.php @@ -459,7 +459,7 @@ class KalenderLib { $this->_getBasePlan($start_date, $end_date); - $this->_ci->KalenderModel->db->where('status_kurzbz', 'live'); + $this->_ci->KalenderModel->db->where_in('status_kurzbz', array('live', 'to_delete_live')); $data = $this->_ci->KalenderModel->load(); @@ -598,7 +598,7 @@ class KalenderLib $kalender_entry = getData($entryResult); - if (in_array($kalender_entry->status_kurzbz, array('todelete', 'deleted'))) + if (in_array($kalender_entry->status_kurzbz, array('to_delete', 'to_delete_live', 'to_delete_preview', 'deleted'))) { return error([ 'message' => $this->_ci->phraseslib->t('ui', 'entry_not_editable'), @@ -641,7 +641,7 @@ class KalenderLib $kalender_entry = getData($entryResult); - if (in_array($kalender_entry->status_kurzbz, array('todelete', 'deleted'))) + if (in_array($kalender_entry->status_kurzbz, array('to_delete', 'to_delete_live', 'to_delete_preview', 'deleted'))) { return error([ 'message' => $this->_ci->phraseslib->t('ui', 'entry_not_editable'), @@ -1292,7 +1292,7 @@ class KalenderLib if ($kalender_entry->typ === 'lehreinheit') { - if (in_array($kalender_entry->status_kurzbz, array('todelete', 'deleted'))) + if (in_array($kalender_entry->status_kurzbz, array('to_delete', 'to_delete_live', 'to_delete_preview', 'deleted'))) { return error([ 'message' => $this->_ci->phraseslib->t('ui', 'entry_not_editable'), @@ -1358,7 +1358,7 @@ class KalenderLib if ($kalender_entry->typ === 'lehreinheit') { - if (in_array($kalender_entry->status_kurzbz, array('todelete', 'deleted'))) + if (in_array($kalender_entry->status_kurzbz, array('to_delete', 'to_delete_live', 'to_delete_preview', 'deleted'))) { return error([ 'message' => $this->_ci->phraseslib->t('ui', 'entry_not_editable'), @@ -1588,36 +1588,60 @@ class KalenderLib if (isError($result_ort)) return $result_ort; $has_ort = hasData($result_ort) ? getData($result_ort)[0] : false; - if ($entry->status_kurzbz === 'planning') + if ($entry->status_kurzbz === 'sync_preview' || $entry->status_kurzbz === 'sync_live' || $entry->status_kurzbz === 'planning') { - if ($has_ort) - $this->_deleteOrtEntry($has_ort); + $history = $this->getHistory($entry->kalender_id, false, false); - if ($has_lehreinheit) - $this->_deleteLehreinheitEntry($has_lehreinheit); + $history = hasData($history) && getData($history); - $this->_ci->KalenderModel->delete(array('tbl_kalender.kalender_id' => $entry->kalender_id)); - } - else if ($entry->status_kurzbz === 'sync_preview' || $entry->status_kurzbz === 'sync_live') - { - $history = $this->getHistory($entry->kalender_id); - $history = hasData($history) ? getData($history) : false; + if ($history) + { + $result = $this->_ci->KalenderModel->update( + array('kalender_id' => $entry->kalender_id), + array('status_kurzbz' => 'to_delete','status_kurzbz_max' => 'planning') + ); - if ($has_ort) - $result = $this->_deleteOrtEntry($has_ort); + if (isError($result)) + return error($result); + } + else + { + if ($has_ort) + { + $result = $this->_deleteOrtEntry($has_ort); + if (isError($result)) + return error($result); - if ($has_lehreinheit) - $result = $this->_deleteLehreinheitEntry($has_lehreinheit); + } - $this->_ci->KalenderModel->delete(array('tbl_kalender.kalender_id' => $entry->kalender_id)); + + if ($has_lehreinheit) + { + $result = $this->_deleteLehreinheitEntry($has_lehreinheit); + if (isError($result)) + return error($result); + } + + $result = $this->_ci->KalenderModel->delete(array('tbl_kalender.kalender_id' => $entry->kalender_id)); + + if (isError($result)) + return error($result); + } } else if ($entry->status_kurzbz === 'preview' || $entry->status_kurzbz === 'live') { - //TODO (david) überprüfen ob sinnvoll, verschwindet direkt in den ansichten (student, lecturer) + if ($entry->status_kurzbz === 'preview') + $new_status = 'to_delete_preview'; + else + $new_status = 'to_delete_live'; + $result = $this->_ci->KalenderModel->update( array('kalender_id' => $entry->kalender_id), - array('status_kurzbz' => 'todelete') + array('status_kurzbz' => $new_status) ); + + if (isError($result)) + return error($result); } return success(); @@ -1642,11 +1666,11 @@ class KalenderLib return $this->_ci->KalenderEventModel->delete(array('kalender_id' => $entry->kalender_id)); } - public function getHistory($kalender_id, $only_previous = false) + public function getHistory($kalender_id, $only_previous = false, $include_self = true) { $dbModel = new DB_Model(); - $history_entries = $dbModel->execReadOnlyQuery(" - WITH RECURSIVE + $history_sql =" + WITH RECURSIVE vorgaenger(kalender_id, vorgaenger_kalender_id) AS ( SELECT kalender_id, vorgaenger_kalender_id FROM lehre.tbl_kalender @@ -1685,12 +1709,19 @@ class KalenderLib SELECT kalender_id FROM nachfolger ) combined JOIN lehre.tbl_kalender USING(kalender_id) - LEFT JOIN orte USING(kalender_id) - ORDER BY kalender_id DESC - - " . ($only_previous ? ' LIMIT 1' : ''), array($kalender_id, $kalender_id)); + LEFT JOIN orte USING(kalender_id)"; - return $history_entries; + $params = array($kalender_id, $kalender_id); + + if (!$include_self) + { + $history_sql .= " WHERE kalender_id != ?"; + $params[] = $kalender_id; + } + + $history_sql .= " ORDER BY kalender_id DESC" . ($only_previous ? ' LIMIT 1' : ''); + + return $dbModel->execReadOnlyQuery($history_sql, $params); } } diff --git a/application/libraries/KalenderSyncLib.php b/application/libraries/KalenderSyncLib.php index 7c10c2add..fce0ecd5d 100644 --- a/application/libraries/KalenderSyncLib.php +++ b/application/libraries/KalenderSyncLib.php @@ -19,6 +19,7 @@ class KalenderSyncLib $this->_ci->load->model('ressource/Kalendersyncstatus_model', 'KalendersyncstatusModel'); $this->_ci->load->model('organisation/Studiengang_model', 'StudiengangModel'); $this->_ci->load->model('organisation/Organisationseinheit_model', 'OrganisationseinheitModel'); + $this->_ci->load->library('KalenderLib'); } public function run($studiensemester_kurzbz) @@ -41,7 +42,7 @@ class KalenderSyncLib $ziel_status = isEmptyString($config->sync_status_kurzbz) ? 'live' : $config->sync_status_kurzbz; - $relevante_stati = array_merge($this->status_map[$ziel_status], array('todelete')); + $relevante_stati = array_merge($this->status_map[$ziel_status], array('to_delete', 'to_delete_live', 'to_delete_preview')); $kalender_ids_result = $this->getKalenderIds( $config->oe_kurzbz, @@ -89,7 +90,7 @@ class KalenderSyncLib public function runManual($oe_kurzbz, $studiensemester_kurzbz, $ausbildungssemester = null, $studienplan_id = null, $mail = true, $datum_bis = null, $ziel_status = 'live') { - $relevante_stati = array_merge($this->status_map[$ziel_status], array('todelete')); + $relevante_stati = array_merge($this->status_map[$ziel_status], array('to_delete', 'to_delete_live', 'to_delete_preview')); $kalender_ids_result = $this->getKalenderIds( $oe_kurzbz, @@ -126,7 +127,7 @@ class KalenderSyncLib $mail_infos_gesamt = []; $synced_gesamt = 0; - $todelete_ids_result = $this->_getManuallySetStatus(array('todelete')); + $todelete_ids_result = $this->_getManuallySetStatus(array('to_delete', 'to_delete_live', 'to_delete_preview')); if (isError($todelete_ids_result)) return $todelete_ids_result; @@ -264,30 +265,34 @@ class KalenderSyncLib private function _archiveVorgaenger($vorgaenger_kalender_id, $stop_at_live = false) { - if (!$vorgaenger_kalender_id) return; + $return_array = array(); + if (!$vorgaenger_kalender_id) return success($return_array); $current_id = $vorgaenger_kalender_id; while ($current_id) { $vorgaenger = $this->_ci->KalenderModel->load(array('kalender_id' => $current_id)); - if (!hasData($vorgaenger)) return; + if (!hasData($vorgaenger)) return success($return_array); $vorgaenger = getData($vorgaenger)[0]; if ($stop_at_live && $vorgaenger->status_kurzbz === 'live') - return; + return success($return_array); if (in_array($vorgaenger->status_kurzbz, array('preview', 'live'))) { $this->_ci->KalenderModel->update( array('kalender_id' => $current_id), - array('status_kurzbz' => 'archived') + array('status_kurzbz' => 'archived', 'status_kurzbz_max' => $vorgaenger->status_kurzbz) ); + + $return_array[] = $vorgaenger; } $current_id = $vorgaenger->vorgaenger_kalender_id; } + return success($return_array); } private function _syncKalenderIds($kalender_ids, $ziel_status) @@ -312,11 +317,63 @@ class KalenderSyncLib foreach (getData($to_update) as $entry) { - if ($entry->status_kurzbz === 'todelete') + if (in_array($entry->status_kurzbz, array('to_delete', 'to_delete_live', 'to_delete_preview'))) { - $this->_ci->KalenderModel->update(array('kalender_id' => $entry->kalender_id), array('status_kurzbz' => 'deleted')); - $this->_archiveVorgaenger($entry->vorgaenger_kalender_id, false); - $mail_infos[] = array('entry' => $entry, 'new_status' => 'deleted', 'notify' => array('lektor', 'student')); + $notify = array(); + if ($entry->status_kurzbz === 'to_delete_live') + { + $status_max = 'live'; + $notify = array('lektor', 'student'); + } + else if ($entry->status_kurzbz === 'to_delete_preview') + { + $status_max = 'preview'; + $notify = array('lektor'); + } + else if ($entry->status_kurzbz === 'to_delete') + { + $status_max = 'planning'; + } + + $this->_ci->KalenderModel->update(array('kalender_id' => $entry->kalender_id), array('status_kurzbz' => 'deleted', 'status_kurzbz_max' => $status_max)); + $mail_infos[] = array('entry' => $entry, 'new_status' => 'deleted', 'notify' => $notify); + + $vorgaenger_array = $this->_archiveVorgaenger($entry->vorgaenger_kalender_id); + + + + if (hasData($vorgaenger_array)) + { + foreach(getData($vorgaenger_array) as $vorgaenger) + { + $archive_notify = array(); + + if ($vorgaenger->status_kurzbz === 'preview') + $archive_notify = array('lektor'); + else if ($vorgaenger->status_kurzbz === 'live') + { + $archive_notify = array('student', 'lektor'); + + $history = $this->_ci->kalenderlib->getHistory($vorgaenger->kalender_id, false, false); + if (hasData($history)) + { + $history = getData($history); + + foreach ($history as $entry) + { + if ($entry->status_kurzbz === 'deleted' && $entry->status_kurzbz_max === 'preview') + { + $archive_notify = array('student'); + break; + } + } + } + } + + $mail_infos[] = array('entry' => $vorgaenger, 'new_status' => 'deleted', 'notify' => $archive_notify); + } + } + $synced++; continue; } diff --git a/public/js/components/Tempus/Tempus.js b/public/js/components/Tempus/Tempus.js index 360c198d7..c08ea3b3c 100644 --- a/public/js/components/Tempus/Tempus.js +++ b/public/js/components/Tempus/Tempus.js @@ -1356,6 +1356,7 @@ export default { Von Bis Status + Max Status Ort @@ -1364,6 +1365,7 @@ export default { {{ entry.von }} {{ entry.bis }} {{ entry.status_kurzbz }} + {{ entry.status_kurzbz_max }} {{ entry.ort }} diff --git a/system/dbupdate_3.4/46975_tempus.php b/system/dbupdate_3.4/46975_tempus.php index 68d5cdcf8..5dc9f730b 100644 --- a/system/dbupdate_3.4/46975_tempus.php +++ b/system/dbupdate_3.4/46975_tempus.php @@ -249,3 +249,32 @@ if ($result = @$db->db_query("SELECT 1 FROM public.tbl_variablenname WHERE name echo 'public.tbl_variablenname: Added name "tempus_favorites"
'; } } + + +if(!$result = @$db->db_query("SELECT status_kurzbz_max FROM lehre.tbl_kalender LIMIT 1")) +{ + $qry = "ALTER TABLE lehre.tbl_kalender ADD COLUMN status_kurzbz_max character varying(32); + + UPDATE lehre.tbl_kalender_status + SET status_kurzbz = 'to_delete', + bezeichnung = 'to_delete', + WHERE status_kurzbz = 'todelete'; + UPDATE lehre.tbl_kalender_status SET sort = 9 WHERE status_kurzbz = 'deleted'; + UPDATE lehre.tbl_kalender_status SET sort = 10 WHERE status_kurzbz = 'archived'; + INSERT INTO lehre.tbl_kalender_status (status_kurzbz, bezeichnung, bezeichnung_mehrsprachig, sort) VALUES (E'to_delete_preview', E'to_delete_preview', E'{\"Zur Löschung in Voransicht\", \"Marked for Deletion in Preview\"}', 7); + INSERT INTO lehre.tbl_kalender_status (status_kurzbz, bezeichnung, bezeichnung_mehrsprachig, sort) VALUES (E'to_delete_live', E'to_delete_live', E'{\"Zur Löschung in Live\", \"Marked for Deletion in Live\"}', 8); + + ALTER TABLE lehre.tbl_kalender ADD CONSTRAINT tbl_kalender_status_max_fk FOREIGN KEY (status_kurzbz_max) + REFERENCES lehre.tbl_kalender_status (status_kurzbz) MATCH FULL ON DELETE RESTRICT ON UPDATE CASCADE; +"; + + + if(!$db->db_query($qry)) + echo 'lehre.tbl_kalender: '.$db->db_last_error().'
'; + else + echo '
lehre.tbl_kalender: Spalte status_kurzbz_max hinzugefuegt. +
lehre.tbl_kalender_status: status_kurzbz von todelete auf to_delete umbenannt. +
lehre.tbl_kalender_status: status_kurzbz to_delete_preview hinzugefuegt. +
lehre.tbl_kalender_status: status_kurzbz to_delete_live hinzugefuegt. + '; +} \ No newline at end of file