Merge remote-tracking branch 'origin/feature-78317/tempus_delete_status' into feature-68298/Tempus_Grundstruktur

This commit is contained in:
ma0048
2026-09-01 12:21:53 +02:00
4 changed files with 161 additions and 42 deletions
+62 -31
View File
@@ -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);
}
}
+68 -11
View File
@@ -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;
}
+2
View File
@@ -1362,6 +1362,7 @@ export default {
<th>Von</th>
<th>Bis</th>
<th>Status</th>
<th>Max Status</th>
<th>Ort</th>
</tr>
</thead>
@@ -1370,6 +1371,7 @@ export default {
<td>{{ entry.von }}</td>
<td>{{ entry.bis }}</td>
<td>{{ entry.status_kurzbz }}</td>
<td>{{ entry.status_kurzbz_max }}</td>
<td>{{ entry.ort }}</td>
</tr>
</tbody>
+29
View File
@@ -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"<br>';
}
}
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 '<strong>lehre.tbl_kalender: '.$db->db_last_error().'</strong><br>';
else
echo '<br />lehre.tbl_kalender: Spalte status_kurzbz_max hinzugefuegt.
<br />lehre.tbl_kalender_status: status_kurzbz von todelete auf to_delete umbenannt.
<br />lehre.tbl_kalender_status: status_kurzbz to_delete_preview hinzugefuegt.
<br />lehre.tbl_kalender_status: status_kurzbz to_delete_live hinzugefuegt.
';
}