diff --git a/application/libraries/KalenderLib.php b/application/libraries/KalenderLib.php index 4384c0ef7..3d05c2c64 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 3e4a1834a..dbcf388e9 100644 --- a/public/js/components/Tempus/Tempus.js +++ b/public/js/components/Tempus/Tempus.js @@ -1362,6 +1362,7 @@ export default {