From 015c8ca0f1b56d6b6f0b588c6c15bfb6b10ecdb5 Mon Sep 17 00:00:00 2001 From: ma0048 Date: Tue, 11 Aug 2026 11:48:29 +0200 Subject: [PATCH] kollisionscheck auf lehreinheit_id umgebaut raumvorschlag by lehreinheit hinzuegfuegt --- .../controllers/system/MigrateKalender.php | 18 +- application/libraries/KalenderLib.php | 77 +++--- application/libraries/RaumvorschlagLib.php | 115 ++++++--- .../checks/LectureCollisionCheck.php | 67 ++++- .../checks/ResourcesCollisionCheck.php | 19 +- .../collision/checks/RoomCollisionCheck.php | 19 +- .../checks/StudentCollisionCheck.php | 71 ++++-- .../checks/VerbandCollisionCheck.php | 239 +++++++++++------- 8 files changed, 422 insertions(+), 203 deletions(-) diff --git a/application/controllers/system/MigrateKalender.php b/application/controllers/system/MigrateKalender.php index 49e895dbc..ecb2e63c2 100644 --- a/application/controllers/system/MigrateKalender.php +++ b/application/controllers/system/MigrateKalender.php @@ -121,7 +121,14 @@ class MigrateKalender extends CLI_Controller $ids = is_array($block->stundenplandev_ids) ? $block->stundenplandev_ids : explode(',', $block->stundenplandev_ids); /*$ids = array_map('intval', $ids);*/ - $this->SyncModel->db->where_in('stundenplandev_id', $ids); + $this->SyncModel->db->group_start(); + $where_ids_chunks = array_chunk($ids,25); + foreach($where_ids_chunks as $where_ids) + { + $this->SyncModel->db->or_where_in('stundenplandev_id', $where_ids); + } + $this->SyncModel->db->group_end(); + $sync_result = $this->SyncModel->load(); if (!hasData($sync_result)) @@ -230,7 +237,14 @@ class MigrateKalender extends CLI_Controller $ids = is_array($block->reservierung_ids) ? $block->reservierung_ids : explode(',', $block->reservierung_ids); - $this->SyncReservierungModel->db->where_in('reservierung_id', $ids); + $this->SyncReservierungModel->db->group_start(); + $where_ids_chunks = array_chunk($ids,25); + foreach($where_ids_chunks as $where_ids) + { + $this->SyncReservierungModel->db->or_where_in('reservierung_id', $where_ids); + } + $this->SyncReservierungModel->db->group_end(); + $sync_result = $this->SyncReservierungModel->load(); if (!hasData($sync_result)) diff --git a/application/libraries/KalenderLib.php b/application/libraries/KalenderLib.php index 58a684df0..ee0db8d3b 100644 --- a/application/libraries/KalenderLib.php +++ b/application/libraries/KalenderLib.php @@ -591,6 +591,16 @@ class KalenderLib } + private function _checkCollisionForLehreinheit($start_date, $end_date, $lehreinheit_id) + { + $checkerData = new stdClass(); + $checkerData->von = $start_date; + $checkerData->bis = $end_date; + $checkerData->lehreinheit_id = $lehreinheit_id; + + return $this->_ci->collisionchecker->run($checkerData); + } + public function addToKalenderEvent($target_kalender_id, $lehreinheit_id) { $entryResult = $this->_loadKalenderEntry($target_kalender_id); @@ -733,16 +743,6 @@ class KalenderLib return ['kalender_id' => $kalender_id, 'result' => $ortresult]; } - $entryResult = $this->_loadKalenderEntry($kalender_id); - if (isError($entryResult)) - return ['kalender_id' => $kalender_id, 'result' => $entryResult]; - - $kalender_entry = getData($entryResult); - $errors = $this->_ci->collisionchecker->run($kalender_entry); - - if (!empty($errors)) - return ['kalender_id' => $kalender_id, 'result' => error($errors)]; - return ['kalender_id' => $kalender_id, 'result' => $kalenderlehreinheitresult]; } @@ -807,7 +807,6 @@ class KalenderLib 'false' ); - $this->_ci->KalenderModel->db->trans_start(); while ($rest > 0 && new DateTime($current_date) < $ende) { @@ -849,18 +848,9 @@ class KalenderLib $start_str = $current_date . ' ' . $start_time; $end_str = $current_date . ' ' . $end_time; - $insert = $this->_insertKalenderEventRaw($start_str, $end_str, $lehreinheit_id, $ort_kurzbz); - $kalender_id = $insert['kalender_id']; - $insert_result = $insert['result']; + $collisions = $this->_checkCollisionForLehreinheit($start_str, $end_str, $lehreinheit_id); - $collisions = isError($insert_result) ? getError($insert_result) : []; - - $raum_vorschlaege = []; - if ($kalender_id) - { - $vorschlaege = $this->_ci->raumvorschlaglib->getVorschlaege($kalender_id); - $raum_vorschlaege = is_array($vorschlaege) ? $vorschlaege : []; - } + $raum_vorschlaege = $this->_ci->raumvorschlaglib->getVorschlaegeByLehreinheit($lehreinheit_id, $start_str, $end_str); $plan[] = [ 'datum' => $current_date, @@ -869,14 +859,13 @@ class KalenderLib 'block' => $current_block, 'ort_kurzbz' => $ort_kurzbz, 'collisions' => $collisions, - 'raum_vorschlaege' => $raum_vorschlaege, + 'raum_vorschlaege' => is_array($raum_vorschlaege) ? $raum_vorschlaege : [], ]; $rest -= $current_block; $current_date = $this->_addWeeks($current_date, $wochenrythmus); } - $this->_ci->KalenderModel->db->trans_rollback(); $this->_ci->VariableModel->setVariable( getAuthUID(), @@ -939,6 +928,12 @@ class KalenderLib public function addKalenderEvent($start_date, $end_date, $lehreinheit_id, $ort_kurzbz) { + + $errors = $this->_checkCollisionForLehreinheit($start_date, $end_date, $lehreinheit_id); + + if (!empty($errors)) + return error($errors); + $this->_ci->KalenderModel->db->trans_start(); $insert = $this->_insertKalenderEventRaw($start_date, $end_date, $lehreinheit_id, $ort_kurzbz); @@ -970,9 +965,9 @@ class KalenderLib if (hasData($reservierung_vorhanden) && !$this->_ci->permissionlib->isBerechtigt('lehre/reservierungAdvanced')) { return error([ - 'message' => $this->_ci->phraseslib->t('ui', 'already_reserved'), - 'errorCode' => 'already_reserved' - ]); + 'message' => $this->_ci->phraseslib->t('ui', 'already_reserved'), + 'errorCode' => 'already_reserved' + ]); } } @@ -1022,15 +1017,15 @@ class KalenderLib } } - /* foreach ($specialGroups as $group) - { - $this->_addSpecialGroupToEvent($kalender_id, $group['gruppe_kurzbz'], $group['rolle']); - } + /* foreach ($specialGroups as $group) + { + $this->_addSpecialGroupToEvent($kalender_id, $group['gruppe_kurzbz'], $group['rolle']); + } - foreach ($groups as $group) - { - $this->_addGroupToEvent($kalender_id, $group['stg_kz'], $group['semester'], $group['verband'], $group['gruppe'], $group['rolle']); - }*/ + foreach ($groups as $group) + { + $this->_addGroupToEvent($kalender_id, $group['stg_kz'], $group['semester'], $group['verband'], $group['gruppe'], $group['rolle']); + }*/ if (isSuccess($kalendereventresult) && !is_null($ort_kurzbz)) { @@ -1088,7 +1083,7 @@ class KalenderLib if (!empty($errors)) { return error($errors); } - + $this->_ci->db->trans_start(); $allowedResourceIDs = array_filter(array_map( @@ -1243,14 +1238,14 @@ class KalenderLib $calendarResources = $this->_ci->BetriebsmittelKalenderModel->loadWhere(['eindeutige_kalender_gruppen_id' => $kalender_entry->eindeutige_gruppen_id]); if (isError($calendarResources)) return $calendarResources; - + $calendarResourcesItems = getData($calendarResources); $calendarResourcesIDs = []; - if (is_array($calendarResourcesItems)) { + if (is_array($calendarResourcesItems)) { $calendarResourcesIDs = array_map(function($resource) { return $resource->betriebsmittel_id; }, getData($calendarResources)); - } + } $kalender_entry->betriebsmittel_ids = $calendarResourcesIDs; $kalender_entry->ort_kurzbz = !is_null($ort_kurzbz) ? (array) $ort_kurzbz : $kalender_entry->ort_kurzbz; @@ -1588,7 +1583,7 @@ class KalenderLib if (isError($result_ort)) return $result_ort; $has_ort = hasData($result_ort) ? getData($result_ort)[0] : false; - if ($entry->status_kurzbz === 'sync_preview' || $entry->status_kurzbz === 'sync_live' || $entry->status_kurzbz === 'planning') + if ($entry->status_kurzbz === 'sync_preview' || $entry->status_kurzbz === 'sync_live' || $entry->status_kurzbz === 'planning') { $history = $this->getHistory($entry->kalender_id, false, false); @@ -1724,4 +1719,4 @@ class KalenderLib return $dbModel->execReadOnlyQuery($history_sql, $params); } -} +} \ No newline at end of file diff --git a/application/libraries/RaumvorschlagLib.php b/application/libraries/RaumvorschlagLib.php index 7e4d254b9..28cc7b761 100644 --- a/application/libraries/RaumvorschlagLib.php +++ b/application/libraries/RaumvorschlagLib.php @@ -35,6 +35,50 @@ class RaumvorschlagLib { $event = $this->_ci->kalenderlib->getByKalenderId($kalender_id); $event = $event[0]; + return $this->_getVorschlaegeForEvent($event); + } + + public function getVorschlaegeByLehreinheit($lehreinheit_id, $von, $bis) + { + $lektoren_result = $this->_ci->LehreinheitMitarbeiterModel->loadWhere(['lehreinheit_id' => $lehreinheit_id]); + $lektor_uids = hasData($lektoren_result) ? array_column(getData($lektoren_result), 'mitarbeiter_uid') : []; + + $lektor_data = []; + foreach ($lektor_uids as $uid) + { + $lektor_data[] = ['mitarbeiter_uid' => $uid]; + } + + $gruppen_result = $this->_ci->LehreinheitgruppeModel->getByLehreinheit($lehreinheit_id); + + $gruppen_data = []; + if (hasData($gruppen_result)) + { + $gruppen_rows = getData($gruppen_result); + + foreach ($gruppen_rows as $gruppe) + { + $gruppen_data[] = (array) $gruppe; + } + } + + $event = (object) [ + 'kalender_id' => null, + 'lehreinheit_id' => [$lehreinheit_id], + 'isostart' => (new DateTime($von))->format('c'), + 'isoend' => (new DateTime($bis))->format('c'), + 'datum' => (new DateTime($von))->format('Y-m-d'), + 'lektor' => $lektor_data, + 'gruppe' => $gruppen_data, + ]; + + return $this->_getVorschlaegeForEvent($event); + } + + private function _getVorschlaegeForEvent($event) + { + $raumkandidaten = $this->_getRaumkandidaten($event); + if (empty($raumkandidaten)) return []; $lektor_uids = array_column($event->lektor, 'mitarbeiter_uid'); $gruppen_kurzbz = array_values(array_filter(array_column($event->gruppe, 'gruppe_kurzbz'))); @@ -44,6 +88,8 @@ class RaumvorschlagLib return empty($gruppe['gruppe_kurzbz']); })); + $lehrverband_gruppen_bezeichnung = array_column($lehrverband_gruppen, 'bezeichnung'); + $tages_events = $this->_ci->kalenderlib->getForRaumvorschlag( $event->datum, $event->datum, @@ -52,30 +98,26 @@ class RaumvorschlagLib $lehrverband_gruppen ); - $lektor_davor = $this->_getEventDavor($tages_events, $event->isostart, $lektor_uids, 'lektor'); - $gruppen_davor = $this->_getEventDavor($tages_events, $event->isostart, $gruppen_kurzbz, 'gruppe'); + return $this->_getRatings($tages_events, $event, $raumkandidaten, $lektor_uids, $gruppen_kurzbz, $lehrverband_gruppen_bezeichnung); + } + private function _getRatings($events, $event, $raumkandidaten, $lektor_uids, $gruppen_kurzbz, $lehrverband_gruppen_bezeichnung) + { + $event = (object)$event; + $lektor_davor = $this->_getEventDavor($events, $event->isostart, $lektor_uids, 'lektor'); + $gruppen_davor = $this->_getEventDavor($events, $event->isostart, $gruppen_kurzbz, 'gruppe'); + $lehrverband_davor = $this->_getEventDavor($events, $event->isostart, $lehrverband_gruppen_bezeichnung, 'lehrverband'); $lektor_davor_ort = $lektor_davor ? $this->_getOrtDetails($lektor_davor->ort_kurzbz) : null; $gruppen_davor_ort = $gruppen_davor ? $this->_getOrtDetails($gruppen_davor->ort_kurzbz) : null; - - $kandidaten = $this->_getRaumkandidaten($event); - if (empty($kandidaten)) return []; - - $unique = []; - - foreach ($kandidaten as $raum) - { - $unique[$raum->ort_kurzbz] = $raum; - } - - $kandidaten = array_values($unique); + $lehrverband_davor_ort = $lehrverband_davor ? $this->_getOrtDetails($lehrverband_davor->ort_kurzbz) : null; $ratings = []; - foreach ($kandidaten as $raum) + foreach ($raumkandidaten as $raum) { $rating = ['ort_kurzbz' => $raum->ort_kurzbz, 'score' => 100, 'details' => []]; $this->_rateLektor($rating, $raum, $lektor_davor_ort); $this->_rateGruppen($rating, $raum, $gruppen_davor_ort); + $this->_rateGruppen($rating, $raum, $lehrverband_davor_ort); Events::trigger('room_rating', function & () use (&$rating) { @@ -203,10 +245,7 @@ class RaumvorschlagLib if (empty($event->ort_kurzbz)) continue; - if ($type === 'lektor') - $event_uids = array_column($event->lektor, 'mitarbeiter_uid'); - else - $event_uids = array_column($event->gruppe, 'gruppe_kurzbz'); + $event_uids = $this->_getIds($event, $type); if (empty(array_intersect($event_uids, $uids))) continue; @@ -218,6 +257,20 @@ class RaumvorschlagLib return $kandidat; } + private function _getIds($event, $type) + { + $event_uids = array(); + + if ($type === 'lektor') + $event_uids = array_column($event->lektor, 'mitarbeiter_uid'); + else if ($type === 'gruppe') + $event_uids = array_column($event->gruppe, 'gruppe_kurzbz'); + else if ($type === 'lehrverband') + $event_uids = array_column($event->gruppe, 'bezeichnung'); + + return $event_uids; + } + private function _getRaumkandidaten($event) { $raumtyp = null; @@ -239,9 +292,19 @@ class RaumvorschlagLib $this->_ci->KalenderModel->addJoin('lehre.tbl_kalender_ort', 'tbl_kalender.kalender_id = tbl_kalender_ort.kalender_id'); $this->_ci->KalenderModel->db->where('tbl_kalender.von <', $event->isoend); $this->_ci->KalenderModel->db->where('tbl_kalender.bis >', $event->isostart); - $this->_ci->KalenderModel->db->where('tbl_kalender.kalender_id !=', $event->kalender_id); - $this->_ci->KalenderModel->db->where_not_in('tbl_kalender.status_kurzbz', ['deleted']); + if (!is_null($event->kalender_id)) + { + $this->_ci->KalenderModel->db->where('tbl_kalender.kalender_id !=', $event->kalender_id); + } + $this->_ci->KalenderModel->db->where_not_in('tbl_kalender.status_kurzbz', ['deleted', 'to_delete', 'to_delete_live', 'to_delete_preview', 'archived']); $this->_ci->KalenderModel->db->where('tbl_kalender_ort.ort_kurzbz IS NOT NULL', null, false); + $this->_ci->KalenderModel->db->where( + 'NOT EXISTS ( + SELECT 1 FROM lehre.tbl_kalender nachfolger + WHERE nachfolger.vorgaenger_kalender_id = tbl_kalender.kalender_id + )', null, false + ); + $belegte = $this->_ci->KalenderModel->load(); $belegte_orte = hasData($belegte) ? array_column(getData($belegte), 'ort_kurzbz') : []; @@ -272,6 +335,7 @@ class RaumvorschlagLib private function _getFreieRaeume($raumtyp, $belegte_orte) { + $this->_ci->OrtModel->addDistinct('ort_kurzbz, stockwerk, standort_id'); $this->_ci->OrtModel->addSelect('ort_kurzbz, stockwerk, standort_id'); $this->_ci->OrtModel->addJoin('public.tbl_ortraumtyp', 'ort_kurzbz'); @@ -285,15 +349,8 @@ class RaumvorschlagLib if (!empty($belegte_orte)) $this->_ci->OrtModel->db->where_not_in('ort_kurzbz', $belegte_orte); - $this->_ci->OrtModel->addOrder('hierarchie, ort_kurzbz'); return $this->_ci->OrtModel->load(); } - - - - - - -} +} \ No newline at end of file diff --git a/application/libraries/collision/checks/LectureCollisionCheck.php b/application/libraries/collision/checks/LectureCollisionCheck.php index 21635e203..0a3516a3b 100644 --- a/application/libraries/collision/checks/LectureCollisionCheck.php +++ b/application/libraries/collision/checks/LectureCollisionCheck.php @@ -10,6 +10,7 @@ class LectureCollisionCheck implements ICollisionCheck $this->_ci =& get_instance(); $this->_ci->load->model('ressource/Kalender_model', 'KalenderModel'); $this->_ci->load->model('ressource/Zeitsperre_model', 'ZeitsperreModel'); + $this->_ci->load->model('education/LehreinheitMitarbeiter_model', 'LehreinheitMitarbeiterModel'); $this->_ci->load->library('VariableLib', array('uid' => getAuthUID())); $this->_ci->load->library('PhrasesLib', array('ui')); @@ -22,11 +23,17 @@ class LectureCollisionCheck implements ICollisionCheck public function check($data) { - if (!isset($data->von, $data->bis, $data->kalender_id)) return []; + if (!isset($data->von, $data->bis)) return []; + if (empty($data->kalender_id) && empty($data->lehreinheit_id) && empty($data->uids)) return []; if ($this->_ci->variablelib->getVar('ignore_kollision') === 'true') return []; - $uids = $this->_getUids($data->kalender_id); + if (!empty($data->kalender_id)) + $uids = $this->_getUids($data->kalender_id); + else if (!empty($data->lehreinheit_id)) + $uids = $this->_getUidsFromLehreinheit($data->lehreinheit_id); + else + $uids = $data->uids; if (empty($uids)) return []; @@ -58,9 +65,17 @@ class LectureCollisionCheck implements ICollisionCheck $this->_ci->KalenderModel->db->where('other_kalender.kalender_id != tbl_kalender.kalender_id', null, false); $this->_ci->KalenderModel->db->where('other_kalender.von < tbl_kalender.bis', null, false); $this->_ci->KalenderModel->db->where('other_kalender.bis > tbl_kalender.von', null, false); - $this->_ci->KalenderModel->db->where_not_in('other_kalender.status_kurzbz', ['archived', 'deleted', 'to_delete']); + $this->_ci->KalenderModel->db->where_not_in('other_kalender.status_kurzbz', array('archived', 'deleted', 'to_delete', 'to_delete_live', 'to_delete_preview')); $this->_ci->KalenderModel->db->where_not_in('current_lehreinheit_ma.mitarbeiter_uid', $kollisionsfreie_user); - $this->_ci->KalenderModel->db->where_in('tbl_kalender.kalender_id', $kalender_ids); + + $this->_ci->KalenderModel->db->group_start(); + $where_ids_chunks = array_chunk($kalender_ids,25); + foreach($where_ids_chunks as $where_ids) + { + $this->_ci->KalenderModel->db->or_where_in('tbl_kalender.kalender_id', $where_ids); + } + $this->_ci->KalenderModel->db->group_end(); + $this->_ci->KalenderModel->db->where( 'other_kalender.kalender_id NOT IN (SELECT vorgaenger_kalender_id FROM lehre.tbl_kalender WHERE vorgaenger_kalender_id IS NOT NULL)', null, false @@ -85,9 +100,17 @@ class LectureCollisionCheck implements ICollisionCheck $this->_ci->KalenderModel->db->where('other_kalender.kalender_id != tbl_kalender.kalender_id', null, false); $this->_ci->KalenderModel->db->where('other_kalender.von < tbl_kalender.bis', null, false); $this->_ci->KalenderModel->db->where('other_kalender.bis > tbl_kalender.von', null, false); - $this->_ci->KalenderModel->db->where_not_in('other_kalender.status_kurzbz', ['archived', 'deleted', 'to_delete']); + $this->_ci->KalenderModel->db->where_not_in('other_kalender.status_kurzbz', ['archived', 'deleted', 'to_delete', 'to_delete_live', 'to_delete_preview']); $this->_ci->KalenderModel->db->where_not_in('current_lehreinheit_ma.mitarbeiter_uid', $kollisionsfreie_user); - $this->_ci->KalenderModel->db->where_in('tbl_kalender.kalender_id', $kalender_ids); + + $this->_ci->KalenderModel->db->group_start(); + $where_ids_chunks = array_chunk($kalender_ids,25); + foreach($where_ids_chunks as $where_ids) + { + $this->_ci->KalenderModel->db->or_where_in('tbl_kalender.kalender_id', $where_ids); + } + $this->_ci->KalenderModel->db->group_end(); + $this->_ci->KalenderModel->db->where( 'other_kalender.kalender_id NOT IN (SELECT vorgaenger_kalender_id FROM lehre.tbl_kalender WHERE vorgaenger_kalender_id IS NOT NULL)', null, false @@ -114,7 +137,13 @@ class LectureCollisionCheck implements ICollisionCheck $this->_ci->KalenderModel->db->where('(z.vondatum + COALESCE(vonstunde_z.beginn, \'00:00\'))::timestamp < tbl_kalender.bis', null, false); $this->_ci->KalenderModel->db->where('(z.bisdatum + COALESCE(bisstunde_z.ende, \'23:59\'))::timestamp > tbl_kalender.von', null, false); $this->_ci->KalenderModel->db->where_not_in('current_lehreinheit_ma.mitarbeiter_uid', $kollisionsfreie_user); - $this->_ci->KalenderModel->db->where_in('tbl_kalender.kalender_id', $kalender_ids); + $this->_ci->KalenderModel->db->group_start(); + $where_ids_chunks = array_chunk($kalender_ids,25); + foreach($where_ids_chunks as $where_ids) + { + $this->_ci->KalenderModel->db->or_where_in('tbl_kalender.kalender_id', $where_ids); + } + $this->_ci->KalenderModel->db->group_end(); $result = $this->_ci->KalenderModel->load(); @@ -159,6 +188,20 @@ class LectureCollisionCheck implements ICollisionCheck return array_unique(array_merge($mitarbeiter_uids, $event_teilnehmer)); } + private function _getUidsFromLehreinheit($lehreinheit_id) + { + $kollisionsfreie_user = unserialize(KOLLISIONSFREIE_USER); + + $result = $this->_ci->LehreinheitMitarbeiterModel->loadWhere(array('lehreinheit_id' => $lehreinheit_id)); + + if (isError($result) || !hasData($result)) return []; + + $uids = array_column(getData($result), 'mitarbeiter_uid'); + $uids = array_diff(array_filter($uids), $kollisionsfreie_user); + + return array_values(array_unique($uids)); + } + private function _checkLehreinheit($uids, $data) { $kollisionsfreie_user = unserialize(KOLLISIONSFREIE_USER); @@ -170,8 +213,9 @@ class LectureCollisionCheck implements ICollisionCheck $this->_ci->KalenderModel->addJoin('lehre.tbl_lehreinheitmitarbeiter', 'lehreinheit_id', 'LEFT'); $this->_ci->KalenderModel->db->where_in('mitarbeiter_uid', $uids); - $this->_ci->KalenderModel->db->where('tbl_kalender.kalender_id !=', $data->kalender_id); - $this->_ci->KalenderModel->db->where_not_in('tbl_kalender.status_kurzbz', array('archived', 'deleted', 'to_delete')); + if (!empty($data->kalender_id)) + $this->_ci->KalenderModel->db->where('tbl_kalender.kalender_id !=', $data->kalender_id); + $this->_ci->KalenderModel->db->where_not_in('tbl_kalender.status_kurzbz', array('archived', 'deleted', 'to_delete', 'to_delete_live', 'to_delete_preview')); $this->_ci->KalenderModel->db->where_not_in('mitarbeiter_uid', $kollisionsfreie_user); $this->_ci->KalenderModel->db->where( 'tbl_kalender.kalender_id NOT IN (SELECT vorgaenger_kalender_id FROM lehre.tbl_kalender WHERE vorgaenger_kalender_id IS NOT NULL)', @@ -207,8 +251,9 @@ class LectureCollisionCheck implements ICollisionCheck $this->_ci->KalenderModel->addJoin('lehre.tbl_kalender_event_teilnehmer', 'tbl_kalender_event.kalender_id = tbl_kalender_event_teilnehmer.kalender_id', 'LEFT'); $this->_ci->KalenderModel->db->where_in('tbl_kalender_event_teilnehmer.uid', $uids); - $this->_ci->KalenderModel->db->where('tbl_kalender.kalender_id !=', $data->kalender_id); - $this->_ci->KalenderModel->db->where_not_in('tbl_kalender.status_kurzbz', array('archived', 'deleted', 'to_delete')); + if (!empty($data->kalender_id)) + $this->_ci->KalenderModel->db->where('tbl_kalender.kalender_id !=', $data->kalender_id); + $this->_ci->KalenderModel->db->where_not_in('tbl_kalender.status_kurzbz', array('archived', 'deleted', 'to_delete', 'to_delete_live', 'to_delete_preview')); $this->_ci->KalenderModel->db->where_not_in('uid', $kollisionsfreie_user); $this->_ci->KalenderModel->db->where( 'tbl_kalender.kalender_id NOT IN (SELECT vorgaenger_kalender_id FROM lehre.tbl_kalender WHERE vorgaenger_kalender_id IS NOT NULL)', diff --git a/application/libraries/collision/checks/ResourcesCollisionCheck.php b/application/libraries/collision/checks/ResourcesCollisionCheck.php index 0be789b7f..4ffeb2d54 100644 --- a/application/libraries/collision/checks/ResourcesCollisionCheck.php +++ b/application/libraries/collision/checks/ResourcesCollisionCheck.php @@ -20,7 +20,7 @@ class ResourcesCollisionCheck implements ICollisionCheck public function check($data) { - if (!isset($data->betriebsmittel_ids, $data->von, $data->bis, $data->kalender_id)) return []; + if (!isset($data->betriebsmittel_ids, $data->von, $data->bis)) return []; if (empty($data->betriebsmittel_ids)) return []; @@ -31,9 +31,10 @@ class ResourcesCollisionCheck implements ICollisionCheck $this->_ci->KalenderModel->addJoin('lehre.tbl_betriebsmittel_kalender bk', 'bk.eindeutige_kalender_gruppen_id = tbl_kalender.eindeutige_gruppen_id'); $this->_ci->KalenderModel->addJoin('wawi.tbl_betriebsmittel bm', 'bm.betriebsmittel_id = bk.betriebsmittel_id'); - $this->_ci->KalenderModel->db->where('tbl_kalender.kalender_id !=', $data->kalender_id); + if (!empty($data->kalender_id)) + $this->_ci->KalenderModel->db->where('tbl_kalender.kalender_id !=', $data->kalender_id); $this->_ci->KalenderModel->db->where('tbl_kalender.kalender_id NOT IN (SELECT vorgaenger_kalender_id FROM lehre.tbl_kalender WHERE vorgaenger_kalender_id IS NOT NULL)', null, false); - $this->_ci->KalenderModel->db->where_not_in('tbl_kalender.status_kurzbz', ['archived', 'deleted', 'to_delete']); + $this->_ci->KalenderModel->db->where_not_in('tbl_kalender.status_kurzbz', ['archived', 'deleted', 'to_delete', 'to_delete_live', 'to_delete_preview']); $this->_ci->KalenderModel->db->where_in('bk.betriebsmittel_id', $data->betriebsmittel_ids); @@ -66,8 +67,16 @@ class ResourcesCollisionCheck implements ICollisionCheck $this->_ci->KalenderModel->db->where('other_kalender.kalender_id != tbl_kalender.kalender_id', null, false); $this->_ci->KalenderModel->db->where('other_kalender.von < tbl_kalender.bis', null, false); $this->_ci->KalenderModel->db->where('other_kalender.bis > tbl_kalender.von', null, false); - $this->_ci->KalenderModel->db->where_not_in('other_kalender.status_kurzbz', ['archived', 'deleted', 'to_delete']); - $this->_ci->KalenderModel->db->where_in('tbl_kalender.kalender_id', $kalender_ids); + $this->_ci->KalenderModel->db->where_not_in('other_kalender.status_kurzbz', ['archived', 'deleted', 'to_delete', 'to_delete_live', 'to_delete_preview']); + + $this->_ci->KalenderModel->db->group_start(); + $where_ids_chunks = array_chunk($kalender_ids,25); + foreach($where_ids_chunks as $where_ids) + { + $this->_ci->KalenderModel->db->or_where_in('tbl_kalender.kalender_id', $where_ids); + } + $this->_ci->KalenderModel->db->group_end(); + $this->_ci->KalenderModel->db->where('other_kalender.kalender_id NOT IN (SELECT vorgaenger_kalender_id FROM lehre.tbl_kalender WHERE vorgaenger_kalender_id IS NOT NULL)', null, false); $result = $this->_ci->KalenderModel->load(); diff --git a/application/libraries/collision/checks/RoomCollisionCheck.php b/application/libraries/collision/checks/RoomCollisionCheck.php index b59d79028..6e25f3ef0 100644 --- a/application/libraries/collision/checks/RoomCollisionCheck.php +++ b/application/libraries/collision/checks/RoomCollisionCheck.php @@ -20,16 +20,17 @@ class RoomCollisionCheck implements ICollisionCheck public function check($data) { - if (!isset($data->ort_kurzbz, $data->von, $data->bis, $data->kalender_id) || isEmptyArray($data->ort_kurzbz)) return []; + if (!isset($data->ort_kurzbz, $data->von, $data->bis) || isEmptyArray($data->ort_kurzbz)) return []; if ($this->_ci->variablelib->getVar('ignore_kollision') === 'true') return []; $this->_ci->KalenderModel->addSelect('kalender_id, ort_kurzbz, von, bis'); $this->_ci->KalenderModel->addJoin('lehre.tbl_kalender_ort', 'kalender_id'); - $this->_ci->KalenderModel->db->where('tbl_kalender.kalender_id !=', $data->kalender_id); + if (!empty($data->kalender_id)) + $this->_ci->KalenderModel->db->where('tbl_kalender.kalender_id !=', $data->kalender_id); $this->_ci->KalenderModel->db->where('tbl_kalender.kalender_id NOT IN (SELECT vorgaenger_kalender_id FROM lehre.tbl_kalender WHERE vorgaenger_kalender_id IS NOT NULL)', null, false); - $this->_ci->KalenderModel->db->where_not_in('tbl_kalender.status_kurzbz', ['archived', 'deleted', 'to_delete']); + $this->_ci->KalenderModel->db->where_not_in('tbl_kalender.status_kurzbz', array('archived', 'deleted', 'to_delete', 'to_delete_live', 'to_delete_preview')); $this->_ci->KalenderModel->db->where_in('ort_kurzbz', $data->ort_kurzbz); $result = $this->_ci->KalenderModel->loadWhere(array( @@ -61,8 +62,16 @@ class RoomCollisionCheck implements ICollisionCheck $this->_ci->KalenderModel->db->where('other_kalender.kalender_id != tbl_kalender.kalender_id', null, false); $this->_ci->KalenderModel->db->where('other_kalender.von < tbl_kalender.bis', null, false); $this->_ci->KalenderModel->db->where('other_kalender.bis > tbl_kalender.von', null, false); - $this->_ci->KalenderModel->db->where_not_in('other_kalender.status_kurzbz', ['archived', 'deleted', 'to_delete']); - $this->_ci->KalenderModel->db->where_in('tbl_kalender.kalender_id', $kalender_ids); + $this->_ci->KalenderModel->db->where_not_in('other_kalender.status_kurzbz', array('archived', 'deleted', 'to_delete', 'to_delete_live', 'to_delete_preview')); + + $this->_ci->KalenderModel->db->group_start(); + $where_ids_chunks = array_chunk($kalender_ids,25); + foreach($where_ids_chunks as $where_ids) + { + $this->_ci->KalenderModel->db->or_where_in('tbl_kalender.kalender_id', $where_ids); + } + $this->_ci->KalenderModel->db->group_end(); + $this->_ci->KalenderModel->db->where('other_kalender.kalender_id NOT IN (SELECT vorgaenger_kalender_id FROM lehre.tbl_kalender WHERE vorgaenger_kalender_id IS NOT NULL)', null, false); $result = $this->_ci->KalenderModel->load(); diff --git a/application/libraries/collision/checks/StudentCollisionCheck.php b/application/libraries/collision/checks/StudentCollisionCheck.php index 4ffeb071e..bb9ce10db 100644 --- a/application/libraries/collision/checks/StudentCollisionCheck.php +++ b/application/libraries/collision/checks/StudentCollisionCheck.php @@ -19,7 +19,8 @@ class StudentCollisionCheck implements ICollisionCheck public function check($data) { - if (!isset($data->von, $data->bis, $data->kalender_id)) return []; + if (!isset($data->von, $data->bis)) return []; + if (!isset($data->kalender_id) && !isset($data->lehreinheit_id)) return []; if ($this->_ci->variablelib->getVar('ignore_kollision') === 'true') return []; if ($this->_ci->variablelib->getVar('kollision_student') !== 'true') return []; @@ -30,7 +31,9 @@ class StudentCollisionCheck implements ICollisionCheck $dbModel = new DB_Model(); - $qry1 = " + if (isset($data->kalender_id)) + { + $qry1 = " SELECT DISTINCT tbl_benutzergruppe.uid FROM lehre.tbl_kalender JOIN lehre.tbl_kalender_lehreinheit USING(kalender_id) @@ -60,13 +63,48 @@ class StudentCollisionCheck implements ICollisionCheck AND (tbl_lehreinheitgruppe.gruppe = tbl_studentlehrverband.gruppe OR tbl_lehreinheitgruppe.gruppe IS NULL OR btrim(tbl_lehreinheitgruppe.gruppe::text) = '' OR tbl_studentlehrverband.gruppe IS NULL) WHERE tbl_kalender.kalender_id = ? AND tbl_studentlehrverband.student_uid NOT IN ($placeholders) + "; - "; + $qry_1_param = $data->kalender_id; + } + else + { + $qry1 = " + SELECT DISTINCT tbl_benutzergruppe.uid + FROM lehre.tbl_lehreinheit + JOIN lehre.tbl_lehreinheitgruppe ON tbl_lehreinheitgruppe.lehreinheit_id = tbl_lehreinheit.lehreinheit_id + JOIN public.tbl_gruppe + ON tbl_gruppe.studiengang_kz = tbl_lehreinheitgruppe.studiengang_kz + AND tbl_gruppe.semester = tbl_lehreinheitgruppe.semester + AND tbl_gruppe.gruppe_kurzbz = tbl_lehreinheitgruppe.gruppe_kurzbz + JOIN public.tbl_benutzergruppe ON tbl_benutzergruppe.gruppe_kurzbz = tbl_gruppe.gruppe_kurzbz + AND tbl_benutzergruppe.studiensemester_kurzbz = tbl_lehreinheit.studiensemester_kurzbz + + WHERE tbl_lehreinheit.lehreinheit_id = ? + AND tbl_benutzergruppe.uid NOT IN ($placeholders) + + UNION ALL + + SELECT DISTINCT tbl_studentlehrverband.student_uid AS uid + FROM lehre.tbl_lehreinheit + JOIN lehre.tbl_lehreinheitgruppe ON tbl_lehreinheitgruppe.lehreinheit_id = tbl_lehreinheit.lehreinheit_id + JOIN public.tbl_studentlehrverband + ON tbl_studentlehrverband.studiengang_kz = tbl_lehreinheitgruppe.studiengang_kz + AND tbl_studentlehrverband.semester = tbl_lehreinheitgruppe.semester + AND tbl_studentlehrverband.studiensemester_kurzbz = tbl_lehreinheit.studiensemester_kurzbz + AND (tbl_lehreinheitgruppe.verband = tbl_studentlehrverband.verband OR tbl_lehreinheitgruppe.verband IS NULL OR btrim(tbl_lehreinheitgruppe.verband::text) = '' OR tbl_studentlehrverband.verband IS NULL) + AND (tbl_lehreinheitgruppe.gruppe = tbl_studentlehrverband.gruppe OR tbl_lehreinheitgruppe.gruppe IS NULL OR btrim(tbl_lehreinheitgruppe.gruppe::text) = '' OR tbl_studentlehrverband.gruppe IS NULL) + WHERE tbl_lehreinheit.lehreinheit_id = ? + AND tbl_studentlehrverband.student_uid NOT IN ($placeholders) + "; + + $qry_1_param = $data->lehreinheit_id; + } $result1 = $dbModel->execReadOnlyQuery($qry1, array_merge( - [$data->kalender_id], + [$qry_1_param], $kollisionsfreie_user, - [$data->kalender_id], + [$qry_1_param], $kollisionsfreie_user )); @@ -74,6 +112,9 @@ class StudentCollisionCheck implements ICollisionCheck $curUids = array_flip(array_column(getData($result1), 'uid')); + $exclude_kalender = isset($data->kalender_id) ? "AND tbl_kalender.kalender_id != ?" : ""; + $exclude_kalender_param = isset($data->kalender_id) ? [$data->kalender_id] : []; + $qry2 = " SELECT DISTINCT tbl_kalender.kalender_id, tbl_kalender.von, tbl_kalender.bis, tbl_benutzergruppe.uid FROM lehre.tbl_kalender @@ -88,8 +129,8 @@ class StudentCollisionCheck implements ICollisionCheck AND tbl_benutzergruppe.studiensemester_kurzbz = tbl_lehreinheit.studiensemester_kurzbz WHERE tbl_kalender.von < ? AND tbl_kalender.bis > ? - AND tbl_kalender.kalender_id != ? - AND tbl_kalender.status_kurzbz NOT IN ('archived', 'deleted', 'to_delete') + $exclude_kalender + AND tbl_kalender.status_kurzbz NOT IN ('archived', 'deleted', 'to_delete', 'to_delete_live', 'to_delete_preview') AND tbl_benutzergruppe.uid NOT IN ($placeholders) AND NOT EXISTS ( SELECT 1 FROM lehre.tbl_kalender vorgaenger @@ -97,7 +138,7 @@ class StudentCollisionCheck implements ICollisionCheck ) UNION ALL - + SELECT DISTINCT tbl_kalender.kalender_id, tbl_kalender.von, tbl_kalender.bis, tbl_studentlehrverband.student_uid AS uid FROM lehre.tbl_kalender JOIN lehre.tbl_kalender_lehreinheit ON tbl_kalender_lehreinheit.kalender_id = tbl_kalender.kalender_id @@ -111,8 +152,8 @@ class StudentCollisionCheck implements ICollisionCheck AND (tbl_lehreinheitgruppe.gruppe = tbl_studentlehrverband.gruppe OR tbl_lehreinheitgruppe.gruppe IS NULL OR btrim(tbl_lehreinheitgruppe.gruppe::text) = '' OR tbl_studentlehrverband.gruppe IS NULL) WHERE tbl_kalender.von < ? AND tbl_kalender.bis > ? - AND tbl_kalender.kalender_id != ? - AND tbl_kalender.status_kurzbz NOT IN ('archived', 'deleted', 'to_delete') + $exclude_kalender + AND tbl_kalender.status_kurzbz NOT IN ('archived', 'deleted', 'to_delete', 'to_delete_live', 'to_delete_preview') AND tbl_studentlehrverband.student_uid NOT IN ($placeholders) AND NOT EXISTS ( SELECT 1 FROM lehre.tbl_kalender vorgaenger @@ -121,10 +162,8 @@ class StudentCollisionCheck implements ICollisionCheck "; $result2 = $dbModel->execReadOnlyQuery($qry2, array_merge( - [$data->bis, $data->von, $data->kalender_id], - $kollisionsfreie_user, - [$data->bis, $data->von, $data->kalender_id], - $kollisionsfreie_user + [$data->bis, $data->von], $exclude_kalender_param, $kollisionsfreie_user, + [$data->bis, $data->von], $exclude_kalender_param, $kollisionsfreie_user )); if (isError($result2) || !hasData($result2)) return []; @@ -175,7 +214,7 @@ class StudentCollisionCheck implements ICollisionCheck ON other_kalender.kalender_id != current_kalender.kalender_id AND other_kalender.von < current_kalender.bis AND other_kalender.bis > current_kalender.von - AND other_kalender.status_kurzbz NOT IN ('archived', 'deleted', 'to_delete') + AND other_kalender.status_kurzbz NOT IN ('archived', 'deleted', 'to_delete', 'to_delete_live', 'to_delete_preview') AND NOT EXISTS ( SELECT 1 FROM lehre.tbl_kalender vorgaenger WHERE vorgaenger.vorgaenger_kalender_id = other_kalender.kalender_id @@ -213,7 +252,7 @@ class StudentCollisionCheck implements ICollisionCheck ON other_kalender.kalender_id != current_kalender.kalender_id AND other_kalender.von < current_kalender.bis AND other_kalender.bis > current_kalender.von - AND other_kalender.status_kurzbz NOT IN ('archived', 'deleted', 'to_delete') + AND other_kalender.status_kurzbz NOT IN ('archived', 'deleted', 'to_delete', 'to_delete_live', 'to_delete_preview') AND NOT EXISTS ( SELECT 1 FROM lehre.tbl_kalender vorgaenger WHERE vorgaenger.vorgaenger_kalender_id = other_kalender.kalender_id diff --git a/application/libraries/collision/checks/VerbandCollisionCheck.php b/application/libraries/collision/checks/VerbandCollisionCheck.php index 40baf38a2..98ae3efee 100644 --- a/application/libraries/collision/checks/VerbandCollisionCheck.php +++ b/application/libraries/collision/checks/VerbandCollisionCheck.php @@ -21,18 +21,58 @@ class VerbandCollisionCheck implements ICollisionCheck public function check($data) { - if (!isset($data->von, $data->bis, $data->kalender_id)) return []; + if (!isset($data->von, $data->bis)) return []; + if (!isset($data->kalender_id) && !isset($data->lehreinheit_id)) return []; if ($this->_ci->variablelib->getVar('ignore_kollision') === 'true') return []; $kollision_student = $this->_ci->variablelib->getVar('kollision_student') === 'false'; $kollision_reservierung = $this->_ci->variablelib->getVar('ignore_reservierung') === 'false'; + if (!isset($data->kalender_id)) $kollision_reservierung = false; + if (!$kollision_student && !$kollision_reservierung) return []; $dbModel = new DB_Model(); $collisions = []; + $group_matching_qry = " + ( + ( + current_lehreinheitguppe.gruppe_kurzbz IS NULL + AND other_lehreinheitguppe.gruppe_kurzbz IS NULL + AND ( + current_lehreinheitguppe.verband IS NULL + OR ( + current_lehreinheitguppe.verband = other_lehreinheitguppe.verband + AND (current_lehreinheitguppe.gruppe IS NULL OR other_lehreinheitguppe.gruppe IS NULL OR current_lehreinheitguppe.gruppe = other_lehreinheitguppe.gruppe) + ) + ) + ) + OR + ( + current_lehreinheitguppe.gruppe_kurzbz IS NOT NULL + AND other_lehreinheitguppe.gruppe_kurzbz IS NOT NULL + AND current_gruppe.direktinskription IS NOT TRUE + AND other_gruppe.direktinskription IS NOT TRUE + ) + OR + ( + ( + current_lehreinheitguppe.gruppe_kurzbz IS NULL + AND other_lehreinheitguppe.gruppe_kurzbz IS NOT NULL + AND other_gruppe.direktinskription IS NOT TRUE + ) + OR + ( + current_lehreinheitguppe.gruppe_kurzbz IS NOT NULL + AND other_lehreinheitguppe.gruppe_kurzbz IS NULL + AND current_gruppe.direktinskription IS NOT TRUE + ) + ) + ) + "; + if ($kollision_student) { $union_event = ""; @@ -47,100 +87,111 @@ class VerbandCollisionCheck implements ICollisionCheck "; } - $sql_gruppen = " - SELECT - other_kalender.von, - other_kalender.bis, - COALESCE( - other_lehreinheitguppe.gruppe_kurzbz, - UPPER(stg.typ::text || stg.kurzbz::text) || '-' || other_lehreinheitguppe.semester || - COALESCE(other_lehreinheitguppe.verband::text, '') || - COALESCE(other_lehreinheitguppe.gruppe::text, '') - ) AS gruppenname - FROM lehre.tbl_kalender current_kalender + $other_lehreinheitgruppe_subquery = " + SELECT tbl_lehreinheitgruppe.studiengang_kz, tbl_lehreinheitgruppe.semester, tbl_lehreinheitgruppe.verband, tbl_lehreinheitgruppe.gruppe, + tbl_lehreinheitgruppe.gruppe_kurzbz, tbl_kalender_lehreinheit.kalender_id + FROM lehre.tbl_kalender_lehreinheit + JOIN lehre.tbl_lehreinheit ON tbl_lehreinheit.lehreinheit_id = tbl_kalender_lehreinheit.lehreinheit_id + JOIN lehre.tbl_lehreinheitgruppe ON tbl_lehreinheitgruppe.lehreinheit_id = tbl_lehreinheit.lehreinheit_id + ". $union_event ." + "; - JOIN ( - SELECT tbl_lehreinheitgruppe.studiengang_kz, tbl_lehreinheitgruppe.semester, tbl_lehreinheitgruppe.verband, tbl_lehreinheitgruppe.gruppe, - tbl_lehreinheitgruppe.gruppe_kurzbz, tbl_kalender_lehreinheit.kalender_id - FROM lehre.tbl_kalender_lehreinheit - JOIN lehre.tbl_lehreinheit ON tbl_lehreinheit.lehreinheit_id = tbl_kalender_lehreinheit.lehreinheit_id - JOIN lehre.tbl_lehreinheitgruppe ON tbl_lehreinheitgruppe.lehreinheit_id = tbl_lehreinheit.lehreinheit_id - ". $union_event ." - ) current_lehreinheitguppe ON current_lehreinheitguppe.kalender_id = current_kalender.kalender_id - - LEFT JOIN public.tbl_gruppe current_gruppe - ON current_gruppe.gruppe_kurzbz = current_lehreinheitguppe.gruppe_kurzbz - - JOIN lehre.tbl_kalender other_kalender - ON other_kalender.kalender_id != current_kalender.kalender_id - AND other_kalender.von < ? - AND other_kalender.bis > ? - - JOIN ( - SELECT tbl_lehreinheitgruppe.studiengang_kz, tbl_lehreinheitgruppe.semester, tbl_lehreinheitgruppe.verband, tbl_lehreinheitgruppe.gruppe, - tbl_lehreinheitgruppe.gruppe_kurzbz, tbl_kalender_lehreinheit.kalender_id - FROM lehre.tbl_kalender_lehreinheit - JOIN lehre.tbl_lehreinheit ON tbl_lehreinheit.lehreinheit_id = tbl_kalender_lehreinheit.lehreinheit_id - JOIN lehre.tbl_lehreinheitgruppe ON tbl_lehreinheitgruppe.lehreinheit_id = tbl_lehreinheit.lehreinheit_id - ". $union_event ." - ) other_lehreinheitguppe ON other_lehreinheitguppe.kalender_id = other_kalender.kalender_id - - LEFT JOIN public.tbl_gruppe other_gruppe - ON other_gruppe.gruppe_kurzbz = other_lehreinheitguppe.gruppe_kurzbz - - LEFT JOIN public.tbl_studiengang stg - ON stg.studiengang_kz = other_lehreinheitguppe.studiengang_kz - - WHERE current_kalender.kalender_id = ? - AND other_kalender.status_kurzbz NOT IN ('archived', 'deleted', 'to_delete') - AND current_lehreinheitguppe.studiengang_kz = other_lehreinheitguppe.studiengang_kz - AND current_lehreinheitguppe.semester = other_lehreinheitguppe.semester - AND ( - ( - current_lehreinheitguppe.gruppe_kurzbz IS NULL - AND other_lehreinheitguppe.gruppe_kurzbz IS NULL - AND ( - current_lehreinheitguppe.verband IS NULL - OR ( - current_lehreinheitguppe.verband = other_lehreinheitguppe.verband - AND (current_lehreinheitguppe.gruppe IS NULL OR other_lehreinheitguppe.gruppe IS NULL OR current_lehreinheitguppe.gruppe = other_lehreinheitguppe.gruppe) - ) - ) + if (isset($data->kalender_id)) + { + $sql_gruppen = " + SELECT + other_kalender.von, + other_kalender.bis, + COALESCE( + other_lehreinheitguppe.gruppe_kurzbz, + UPPER(stg.typ::text || stg.kurzbz::text) || '-' || other_lehreinheitguppe.semester || + COALESCE(other_lehreinheitguppe.verband::text, '') || + COALESCE(other_lehreinheitguppe.gruppe::text, '') + ) AS gruppenname + FROM lehre.tbl_kalender current_kalender + + JOIN ( + ". $other_lehreinheitgruppe_subquery ." + ) current_lehreinheitguppe ON current_lehreinheitguppe.kalender_id = current_kalender.kalender_id + + LEFT JOIN public.tbl_gruppe current_gruppe + ON current_gruppe.gruppe_kurzbz = current_lehreinheitguppe.gruppe_kurzbz + + JOIN lehre.tbl_kalender other_kalender + ON other_kalender.kalender_id != current_kalender.kalender_id + AND other_kalender.von < ? + AND other_kalender.bis > ? + + JOIN ( + ". $other_lehreinheitgruppe_subquery ." + ) other_lehreinheitguppe ON other_lehreinheitguppe.kalender_id = other_kalender.kalender_id + + LEFT JOIN public.tbl_gruppe other_gruppe + ON other_gruppe.gruppe_kurzbz = other_lehreinheitguppe.gruppe_kurzbz + + LEFT JOIN public.tbl_studiengang stg + ON stg.studiengang_kz = other_lehreinheitguppe.studiengang_kz + + WHERE current_kalender.kalender_id = ? + AND other_kalender.status_kurzbz NOT IN ('archived', 'deleted', 'to_delete', 'to_delete_live', 'to_delete_preview') + AND current_lehreinheitguppe.studiengang_kz = other_lehreinheitguppe.studiengang_kz + AND current_lehreinheitguppe.semester = other_lehreinheitguppe.semester + AND ". $group_matching_qry ." + AND other_kalender.kalender_id NOT IN ( + SELECT vorgaenger_kalender_id + FROM lehre.tbl_kalender + WHERE vorgaenger_kalender_id IS NOT NULL ) - OR - ( - current_lehreinheitguppe.gruppe_kurzbz IS NOT NULL - AND other_lehreinheitguppe.gruppe_kurzbz IS NOT NULL - AND current_gruppe.direktinskription IS NOT TRUE - AND other_gruppe.direktinskription IS NOT TRUE - ) - OR - ( - ( - current_lehreinheitguppe.gruppe_kurzbz IS NULL - AND other_lehreinheitguppe.gruppe_kurzbz IS NOT NULL - AND other_gruppe.direktinskription IS NOT TRUE - ) - OR - ( - current_lehreinheitguppe.gruppe_kurzbz IS NOT NULL - AND other_lehreinheitguppe.gruppe_kurzbz IS NULL - AND current_gruppe.direktinskription IS NOT TRUE - ) - ) - ) - AND other_kalender.kalender_id NOT IN ( - SELECT vorgaenger_kalender_id - FROM lehre.tbl_kalender - WHERE vorgaenger_kalender_id IS NOT NULL - ) - "; + "; - $result = $dbModel->execReadOnlyQuery($sql_gruppen, [ - $data->bis, - $data->von, - $data->kalender_id, - ]); + $params = [$data->bis, $data->von, $data->kalender_id]; + } + else + { + $sql_gruppen = " + SELECT + other_kalender.von, + other_kalender.bis, + COALESCE( + other_lehreinheitguppe.gruppe_kurzbz, + UPPER(stg.typ::text || stg.kurzbz::text) || '-' || other_lehreinheitguppe.semester || + COALESCE(other_lehreinheitguppe.verband::text, '') || + COALESCE(other_lehreinheitguppe.gruppe::text, '') + ) AS gruppenname + FROM lehre.tbl_lehreinheitgruppe current_lehreinheitguppe + LEFT JOIN public.tbl_gruppe current_gruppe + ON current_gruppe.gruppe_kurzbz = current_lehreinheitguppe.gruppe_kurzbz + + JOIN lehre.tbl_kalender other_kalender + ON other_kalender.von < ? + AND other_kalender.bis > ? + + JOIN ( + ". $other_lehreinheitgruppe_subquery ." + ) other_lehreinheitguppe ON other_lehreinheitguppe.kalender_id = other_kalender.kalender_id + + LEFT JOIN public.tbl_gruppe other_gruppe + ON other_gruppe.gruppe_kurzbz = other_lehreinheitguppe.gruppe_kurzbz + + LEFT JOIN public.tbl_studiengang stg + ON stg.studiengang_kz = other_lehreinheitguppe.studiengang_kz + + WHERE current_lehreinheitguppe.lehreinheit_id = ? + AND other_kalender.status_kurzbz NOT IN ('archived', 'deleted', 'to_delete', 'to_delete_live', 'to_delete_preview') + AND current_lehreinheitguppe.studiengang_kz = other_lehreinheitguppe.studiengang_kz + AND current_lehreinheitguppe.semester = other_lehreinheitguppe.semester + AND ". $group_matching_qry ." + AND other_kalender.kalender_id NOT IN ( + SELECT vorgaenger_kalender_id + FROM lehre.tbl_kalender + WHERE vorgaenger_kalender_id IS NOT NULL + ) + "; + + $params = [$data->bis, $data->von, $data->lehreinheit_id]; + } + + $result = $dbModel->execReadOnlyQuery($sql_gruppen, $params); if (!isError($result) && hasData($result)) { @@ -187,7 +238,7 @@ class VerbandCollisionCheck implements ICollisionCheck WHERE current_event_teilnehmer.kalender_id = ? AND current_event_teilnehmer.rolle_kurzbz = 'teilnehmer' - AND other_kalender.status_kurzbz NOT IN ('archived', 'deleted', 'to_delete') + AND other_kalender.status_kurzbz NOT IN ('archived', 'deleted', 'to_delete', 'to_delete_live', 'to_delete_preview') AND current_event_teilnehmer.studiengang_kz = other_event_teilnehmer.studiengang_kz AND current_event_teilnehmer.semester = other_event_teilnehmer.semester AND ( @@ -301,7 +352,7 @@ class VerbandCollisionCheck implements ICollisionCheck ON other_gruppe.gruppe_kurzbz = other_lehreinheitguppe.gruppe_kurzbz WHERE current_kalender.kalender_id IN ({$placeholders}) - AND other_kalender.status_kurzbz NOT IN ('archived', 'deleted', 'to_delete') + AND other_kalender.status_kurzbz NOT IN ('archived', 'deleted', 'to_delete', 'to_delete_live', 'to_delete_preview') AND current_lehreinheitguppe.studiengang_kz = other_lehreinheitguppe.studiengang_kz AND current_lehreinheitguppe.semester = other_lehreinheitguppe.semester AND (