diff --git a/application/config/Events.php b/application/config/Events.php index 80a8f03b3..aa539d037 100644 --- a/application/config/Events.php +++ b/application/config/Events.php @@ -33,5 +33,17 @@ Events::on('loadRenderers', function ($renderers) { ); }); +//Tempus Renderers: +Events::on('loadTempusRenderers', function ($renderers) { + $fhc_core_renderers =& $renderers(); + $fhc_core_renderers["reservierung"] = array( + 'calendarEvent' => absoluteJsImportUrl('public/js/components/Tempus/Renderer/Reservierungen/calendarEvent.js'), + 'modalTitle' => absoluteJsImportUrl('public/js/components/Tempus/Renderer/Reservierungen/modalTitle.js'), + 'modalContent' => absoluteJsImportUrl('public/js/components/Tempus/Renderer/Reservierungen/modalContent.js'), + 'calendarEventStyles' => APP_ROOT . 'public/css/Cis4/CoreCalendarEvents.css' + ); +}); + + diff --git a/application/config/tempus.php b/application/config/tempus.php new file mode 100644 index 000000000..58dccebdd --- /dev/null +++ b/application/config/tempus.php @@ -0,0 +1,3 @@ + self::PERM_LOGGED, - + 'GetTempusRenderers' => self::PERM_LOGGED, ]); $this->load->library('LogLib'); @@ -66,6 +66,26 @@ class RendererLoader extends FHCAPI_Controller $this->terminateWithSuccess($renderer_paths); } + public function GetTempusRenderers(){ + $renderer_paths = []; + Events::trigger( + 'loadRenderers', + function & () use (&$renderer_paths) + { + return $renderer_paths; + } + ); + + Events::trigger( + 'loadTempusRenderers', + function & () use (&$renderer_paths) + { + return $renderer_paths; + } + ); + $this->terminateWithSuccess($renderer_paths); + } + diff --git a/application/controllers/api/frontend/v1/lv/Gruppe.php b/application/controllers/api/frontend/v1/lv/Gruppe.php index daebe8a61..b94f1f604 100644 --- a/application/controllers/api/frontend/v1/lv/Gruppe.php +++ b/application/controllers/api/frontend/v1/lv/Gruppe.php @@ -118,54 +118,17 @@ class Gruppe extends FHCAPI_Controller $query_words = explode(' ', $query); - $this->_ci->GruppeModel->addSelect('gruppe_kurzbz, - studiengang_kz, - semester, - bezeichnung, - gid, - \'false\' as lehrverband'); - $this->_ci->GruppeModel->db->where(array('sichtbar' => true, 'aktiv' => true, 'lehre' => true, 'direktinskription' => false, 'semester IS NOT NULL' => null)); - $this->_ci->GruppeModel->db->group_start(); - foreach ($query_words as $word) - { - $this->_ci->GruppeModel->db->group_start(); - $this->_ci->GruppeModel->db->where('gruppe_kurzbz ILIKE', "%" . $word . "%"); - $this->_ci->GruppeModel->db->or_where('bezeichnung ILIKE', "%" . $word . "%"); - $this->_ci->GruppeModel->db->group_end(); - } - $this->_ci->GruppeModel->db->group_end(); - - $gruppen_result = $this->_ci->GruppeModel->load(); - - $gruppen_array = array(); + $gruppen_result = $this->_ci->GruppeModel->search($query_words); if (isError($gruppen_result)) $this->terminateWithError(getError($gruppen_result), self::ERROR_TYPE_GENERAL); + $gruppen_array = array(); + if (hasData($gruppen_result)) $gruppen_array = getData($gruppen_result); - $this->_ci->LehrverbandModel->addSelect('CONCAT(UPPER(CONCAT(typ, kurzbz)), \'\', semester, verband, COALESCE(gruppe,\'\')) as gruppe_kurzbz, - studiengang_kz, - semester, - tbl_lehrverband.bezeichnung, - gid, - \'true\' as lehrverband'); - $this->_ci->LehrverbandModel->addJoin('public.tbl_studiengang', 'studiengang_kz'); - $this->_ci->LehrverbandModel->addOrder('verband'); - $this->_ci->LehrverbandModel->addOrder('gruppe'); - $this->_ci->LehrverbandModel->db->where(array('tbl_lehrverband.aktiv' => true)); - - $this->_ci->LehrverbandModel->db->group_start(); - foreach ($query_words as $word) - { - $this->_ci->LehrverbandModel->db->group_start(); - $this->_ci->LehrverbandModel->db->where('CONCAT(CONCAT(typ, kurzbz), \'\', semester, verband, COALESCE(gruppe,\'\')) ILIKE', "%" . $word . "%"); - $this->_ci->LehrverbandModel->db->or_where('tbl_lehrverband.bezeichnung ILIKE', "%" . $word . "%"); - $this->_ci->LehrverbandModel->db->group_end(); - } - $this->_ci->LehrverbandModel->db->group_end(); - $lehrverband_result = $this->_ci->LehrverbandModel->load(); + $lehrverband_result = $this->_ci->LehrverbandModel->search($query_words); $lehrverband_array = array(); diff --git a/application/controllers/api/frontend/v1/tempus/Kalender.php b/application/controllers/api/frontend/v1/tempus/Kalender.php index b0f1bcfda..957fc263c 100644 --- a/application/controllers/api/frontend/v1/tempus/Kalender.php +++ b/application/controllers/api/frontend/v1/tempus/Kalender.php @@ -29,6 +29,7 @@ class Kalender extends FHCAPI_Controller 'getZeitsperren' => self::PERM_LOGGED, 'updateKalenderEvent' => 'lehre/lvplan:rw', 'addKalenderEvent' => 'lehre/lvplan:rw', + 'addReservierung' => 'lehre/lvplan:rw', 'sync' => 'lehre/lvplan:rw', ]); @@ -310,7 +311,7 @@ class Kalender extends FHCAPI_Controller $kalender_id = $this->_ci->input->post('kalender_id', TRUE); - $result = $this->_ci->kalenderlib->updateStatus($kalender_id, 'tosync_lektor'); + $result = $this->_ci->kalenderlib->updateStatus($kalender_id, 'sync_preview'); if (isError($result)) $this->terminateWithError(getError($result)); @@ -327,7 +328,7 @@ class Kalender extends FHCAPI_Controller $kalender_id = $this->_ci->input->post('kalender_id', TRUE); - $result = $this->_ci->kalenderlib->updateStatus($kalender_id, 'tosync_student'); + $result = $this->_ci->kalenderlib->updateStatus($kalender_id, 'sync_live'); if (isError($result)) $this->terminateWithError(getError($result)); @@ -358,6 +359,33 @@ class Kalender extends FHCAPI_Controller $this->terminateWithSuccess('Erfolgreich'); } + public function addReservierung() + { + $this->_ci->form_validation->set_data($_POST); + $this->_ci->form_validation->set_rules('titel',"titel","required"); + $this->_ci->form_validation->set_rules('beschreibung',"beschreibung","required"); + $this->_ci->form_validation->set_rules('ort_kurzbz',"ort_kurzbz","required"); + $this->_ci->form_validation->set_rules('start_date',"start_date","required"); + $this->_ci->form_validation->set_rules('end_date',"end_date","required"); + + if($this->_ci->form_validation->run() === FALSE) + $this->terminateWithValidationErrors($this->_ci->form_validation->error_array()); + + $titel = $this->_ci->input->post('titel', TRUE); + $beschreibung = $this->_ci->input->post('beschreibung', TRUE); + $ort_kurzbz = $this->_ci->input->post('ort_kurzbz', TRUE); + $start_date = $this->_ci->input->post('start_date', TRUE); + $end_date = $this->_ci->input->post('end_date', TRUE); + + + $result = $this->_ci->kalenderlib->addReservierung($titel, $beschreibung, $ort_kurzbz, $start_date, $end_date); + + if (isError($result)) + $this->terminateWithError(getError($result)); + + $this->terminateWithSuccess('Erfolgreich'); + } + private function _checkFilter($filters) { $filter_valid = true; diff --git a/application/controllers/api/frontend/v1/tempus/Reservierung.php b/application/controllers/api/frontend/v1/tempus/Reservierung.php new file mode 100644 index 000000000..c067bf876 --- /dev/null +++ b/application/controllers/api/frontend/v1/tempus/Reservierung.php @@ -0,0 +1,224 @@ + 'lehre/lvplan:rw', + 'getRollen' => 'lehre/lvplan:rw', + 'getInformation' => 'lehre/lvplan:rw', + 'getLektor' => 'lehre/lvplan:rw', + 'searchGroup' => 'lehre/lvplan:rw', + ]); + + $this->_ci =& get_instance(); + + $this->_ci->load->library('LogLib'); + $this->_ci->load->library('form_validation'); + $this->_ci->load->library('KalenderLib'); + + $this->_ci->load->model('ressource/Ort_model', 'OrtModel'); + $this->_ci->load->model('ressource/Kalender_Event_Rolle_model', 'KalenderEventRolleModel'); + $this->_ci->load->model('organisation/Studiengang_model', 'StudiengangModel'); + $this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + $this->_ci->load->model('organisation/gruppe_model', 'GruppeModel'); + + + $this->loadPhrases([ + 'ui' + ]); + } + + //------------------------------------------------------------------------------------------------------------------ + // Public methods + + public function getInformation() + { + $return_array = array('berechtigt' => false, 'studiengaenge' => []); + + $this->_ci->OrtModel->db->join(" + (select ort,standort_id,strasse, plz + FROM public.tbl_standort + LEFT JOIN public.tbl_adresse USING(adresse_id) + ) standort", "standort_id", "LEFT", false); + + $raeume = $this->_ci->OrtModel->loadWhere(array('aktiv' => true, 'reservieren' => true)); + $return_array['raeume'] = hasData($raeume) ? getData($raeume) : []; + + if (!$this->_ci->permissionlib->isBerechtigt('lehre/reservierung')) + $this->terminateWithSuccess($return_array); + + $stg_berechtigungen = $this->_ci->permissionlib->getSTG_isEntitledFor('lehre/reservierung'); + if (isEmptyArray($stg_berechtigungen)) + $this->terminateWithSuccess($return_array); + + $this->_ci->StudiengangModel->addSelect('studiengang_kz, UPPER(CONCAT(typ, kurzbz)) as kuerzel, kurzbzlang'); + $this->_ci->StudiengangModel->addOrder('typ, kurzbz'); + $this->_ci->StudiengangModel->db->where_in('studiengang_kz', $stg_berechtigungen); + $studiengaenge = $this->_ci->StudiengangModel->loadWhere(array('aktiv' => true)); + + if (isError($studiengaenge)) + $this->terminateWithError($studiengaenge); + $language = getUserLanguage() == 'German' ? 0 : 1; + $this->_ci->KalenderEventRolleModel->addOrder('sort'); + $this->_ci->KalenderEventRolleModel->addSelect('rolle_kurzbz, array_to_json(bezeichnung_mehrsprachig::varchar[])->>'. $language. ' as bezeichnung'); + + $rollen = $this->_ci->KalenderEventRolleModel->load(); + + $this->_ci->StudiensemesterModel->addOrder('start', 'DESC'); + $studiensemester = $this->_ci->StudiensemesterModel->load(); + + $return_array['studiengaenge'] = hasData($studiengaenge) ? getData($studiengaenge) : []; + $return_array['berechtigt'] = true; + $return_array['rollen'] = hasData($rollen) ? getData($rollen) : []; + $return_array['studiensemester'] = hasData($studiensemester) ? getData($studiensemester) : []; + + + $this->terminateWithSuccess($return_array); + } + public function getRaeume() + { + + $this->_ci->OrtModel->db->join(" + (select ort,standort_id,strasse, plz + FROM public.tbl_standort + LEFT JOIN public.tbl_adresse USING(adresse_id) + ) standort", "standort_id", "LEFT", false); + + $result = $this->_ci->OrtModel->loadWhere(array('aktiv' => true, 'reservieren' => true)); + + $this->terminateWithSuccess(hasData($result) ? getData($result) : []); + } + + public function searchGroup() + { + $query = $this->input->get('query'); + if (is_null($query)) + $this->terminateWithError($this->_ci->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); + + $stg_berechtigungen = $this->_ci->permissionlib->getSTG_isEntitledFor('lehre/reservierung'); + + if (isEmptyArray($stg_berechtigungen)) + $this->terminateWithSuccess([]); + + + $query_words = explode(' ', urldecode($query)); + + $gruppen_result = $this->_ci->GruppeModel->search($query_words); + + if (isError($gruppen_result)) + $this->terminateWithError(getError($gruppen_result), self::ERROR_TYPE_GENERAL); + + $gruppen_array = array(); + + if (hasData($gruppen_result)) + $gruppen_array = getData($gruppen_result); + + $lehrverband_result = $this->_ci->LehrverbandModel->search($query_words); + + $lehrverband_array = array(); + + if (isError($lehrverband_result)) + $this->terminateWithError(getError($lehrverband_result), self::ERROR_TYPE_GENERAL); + + if (hasData($lehrverband_result)) + $lehrverband_array = getData($lehrverband_result); + + $all_gruppen = array_merge($gruppen_array, $lehrverband_array); + + $gefilterte_gruppen = array_filter($all_gruppen, function($gruppe) use ($stg_berechtigungen) + { + return in_array($gruppe->studiengang_kz, $stg_berechtigungen); + }); + + $this->terminateWithSuccess($gefilterte_gruppen); + } + + public function getRollen() + { + $language = getUserLanguage() == 'German' ? 0 : 1; + + $this->_ci->KalenderEventRolleModel->addOrder('sort'); + $this->_ci->KalenderEventRolleModel->addSelect('rolle_kurzbz, array_to_json(bezeichnung_mehrsprachig::varchar[])->>'. $language. ' as bezeichnung'); + + $result = $this->_ci->KalenderEventRolleModel->load(); + + $this->terminateWithSuccess(hasData($result) ? getData($result) : []); + } + public function addReservierung() + { + + $this->_ci->form_validation->set_data($_POST); + $this->_ci->form_validation->set_rules('titel',"titel","required"); + $this->_ci->form_validation->set_rules('beschreibung',"beschreibung","required"); + $this->_ci->form_validation->set_rules('ort_kurzbz',"ort_kurzbz","required"); + $this->_ci->form_validation->set_rules('start_date',"start_date","required"); + $this->_ci->form_validation->set_rules('end_date',"end_date","required"); + + + if($this->_ci->form_validation->run() === FALSE) + $this->terminateWithValidationErrors($this->_ci->form_validation->error_array()); + + $titel = $this->_ci->input->post('titel', TRUE); + $beschreibung = $this->_ci->input->post('beschreibung', TRUE); + $ort_kurzbz = $this->_ci->input->post('ort_kurzbz', TRUE); + $start_date = $this->_ci->input->post('start_date', TRUE); + $end_date = $this->_ci->input->post('end_date', TRUE); + $teilnehmer = $this->_ci->input->post('teilnehmer', TRUE); + $specialGroups = $this->_ci->input->post('specialGroups', TRUE); + $specialFinalGroups = $this->_ci->input->post('specialFinalGroups', TRUE); + $groups = $this->_ci->input->post('groups', TRUE); + + if (empty($teilnehmer) || !is_array($teilnehmer)) + $this->terminateWithValidationErrors(['teilnehmer' => 'Teilnehmer ist erforderlich']); + + + $result = $this->_ci->kalenderlib->addReservierung($titel, $beschreibung, $ort_kurzbz, $start_date, $end_date, $teilnehmer, $specialFinalGroups, $specialGroups, $groups); + + + if (isError($result)) + $this->terminateWithError(getError($result)); + + $this->terminateWithSuccess('Erfolgreich'); + } + + + public function getLektor() + { + $query = $this->input->get('query'); + + if (is_null($query)) + $this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); + + $query_words = explode(' ', $query); + + $this->_ci->MitarbeiterModel->addSelect('uid, person_id, vorname, nachname'); + $this->_ci->MitarbeiterModel->addJoin('public.tbl_benutzer', 'uid = mitarbeiter_uid'); + $this->_ci->MitarbeiterModel->addJoin('public.tbl_person', 'person_id'); + + $this->_ci->MitarbeiterModel->db->where('public.tbl_benutzer.aktiv', true); + + $this->_ci->MitarbeiterModel->db->group_start(); + foreach ($query_words as $word) + { + $this->_ci->MitarbeiterModel->db->group_start(); + $this->_ci->MitarbeiterModel->db->where('tbl_person.vorname ILIKE', "%" . $word . "%"); + $this->_ci->MitarbeiterModel->db->or_where('tbl_person.nachname ILIKE', "%" . $word . "%"); + $this->_ci->MitarbeiterModel->db->or_where('uid ILIKE', "%" . $word . "%"); + $this->_ci->MitarbeiterModel->db->group_end(); + } + $this->_ci->MitarbeiterModel->db->group_end(); + $this->_ci->MitarbeiterModel->addOrder('nachname'); + $this->_ci->MitarbeiterModel->addOrder('vorname'); + $result = $this->_ci->MitarbeiterModel->load(); + $this->terminateWithSuccess(hasData($result) ? getData($result) : array()); + } + +} diff --git a/application/controllers/system/MigrateKalender.php b/application/controllers/system/MigrateKalender.php index ea9a7842a..95d2451d3 100644 --- a/application/controllers/system/MigrateKalender.php +++ b/application/controllers/system/MigrateKalender.php @@ -16,28 +16,45 @@ class MigrateKalender extends Auth_Controller */ public function __construct() { - parent::__construct(array('index' => ['admin:rw'])); - + parent::__construct(array( + 'migrateStundenplan' => ['admin:rw'], + 'migrateReservierung' => ['admin:rw'], + )); $this->load->model('ressource/Kalender_model', 'KalenderModel'); $this->load->model('ressource/Kalender_Lehreinheit_model', 'KalenderLehreinheitModel'); $this->load->model('ressource/Kalender_Ort_model', 'KalenderOrtModel'); $this->load->model('ressource/Stundenplandev_Kalender_model', 'SyncModel'); + $this->load->model('ressource/Reservierung_Kalender_model', 'SyncReservierungModel'); + $this->load->model('ressource/Kalender_Event_Teilnehmer_model', 'KalenderEventTeilnehmerModel'); + $this->load->model('ressource/Kalender_Event_model', 'KalenderEventModel'); + $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + $this->load->model('person/Benutzer_model', 'BenutzerModel'); } /** * Everything has a beginning */ - public function index($von = null, $bis = null) + public function migrateStundenplan($von = null, $bis = null, $studiengang_kz = null) { - $db = new DB_Model(); $stpldevsql = ' WITH eindeutige_stunden AS ( SELECT DISTINCT unr, datum, stunde FROM lehre.tbl_stundenplandev - WHERE datum >= ? AND datum <= ? - ), + WHERE datum >= ? AND datum <= ?'; + + $params = [$von, $bis]; + + if (!is_null($studiengang_kz)) + { + $stpldevsql .= ' AND studiengang_kz = ?'; + + $params[] = $studiengang_kz; + } + + $stpldevsql .= '), + block_keys AS ( SELECT unr, @@ -82,11 +99,11 @@ class MigrateKalender extends Auth_Controller JOIN lehre.tbl_stunde stundebis ON stundebis.stunde = b.stunde_bis ORDER BY b.datum, b.unr, b.block_nr;'; - $stpldev = $db->execReadOnlyQuery($stpldevsql, array($von, $bis, $von, $bis)); - + array_push($params, $von, $bis); + $stpldev = $db->execReadOnlyQuery($stpldevsql, $params); if (hasData($stpldev)) - { + { // Pruefen ob der Eintrag schon in Sync Tabelle vorhanden ist // Wenn neuere Änderungen vorhanden dann Update // Wenn keine Änderungen seit leztem Sync dann Ueberspringen @@ -97,12 +114,15 @@ class MigrateKalender extends Auth_Controller $data = getData($stpldev); foreach($data as $block) { - $this->SyncModel->db->where_in('stundenplandev_id', $block->stundenplandev_ids); + $ids = is_array($block->stundenplandev_ids) ? $block->stundenplandev_ids : explode(',', $block->stundenplandev_ids); + /*$ids = array_map('intval', $ids);*/ + + $this->SyncModel->db->where('stundenplandev_id IN (' . implode(',', $ids) . ')'); $sync_result = $this->SyncModel->load(); if (!hasData($sync_result)) { - $kalender_id = $this->_insertKalender($block); + $kalender_id = $this->_insertKalender($block, 'lehreinheit'); if ($kalender_id) { $this->_insertSync($block->stundenplandev_ids, $kalender_id); @@ -139,7 +159,7 @@ class MigrateKalender extends Auth_Controller $von = $rowstpl->datum.' '.$rowstpl->beginn; $bis = $rowstpl->datum.' '.$rowstpl->ende; $typ = 'lehreinheit'; - $status = 'visible_student'; + $status = 'live'; $insertamum = $rowstpl->insertamum; $insertvon = $rowstpl->insertvon; $updateamum = $rowstpl->updateamum; @@ -191,19 +211,175 @@ class MigrateKalender extends Auth_Controller } } + public function migrateReservierung($von = null, $bis = null, $ort_kurzbz = null) + { + $db = new DB_Model(); - private function _insertKalender($block) + $qry = "WITH eindeutige_stunden AS ( + SELECT DISTINCT titel, beschreibung, datum, stunde + FROM campus.tbl_reservierung + WHERE datum >= ? AND datum <= ?"; + + $params = array($von, $bis); + + if (!is_null($ort_kurzbz)) + { + $qry .= " AND ort_kurzbz = ?"; + $params[] = $ort_kurzbz; + } + + $qry .= "), + block_keys AS ( + SELECT + titel, beschreibung, datum, stunde, + stunde - ROW_NUMBER() OVER (PARTITION BY titel, beschreibung, datum ORDER BY stunde) AS block_nr + FROM eindeutige_stunden + ), + blocks AS ( + SELECT + bk.titel, + bk.beschreibung, + bk.datum, + bk.block_nr, + MIN(bk.stunde) AS stunde_von, + MAX(bk.stunde) AS stunde_bis, + array_agg(DISTINCT r.reservierung_id::text) AS reservierung_ids, + array_agg(DISTINCT r.uid) AS uids, + array_agg(DISTINCT r.gruppe_kurzbz) AS gruppen_kurzbz, + array_agg(DISTINCT ROW(r.semester, r.verband, r.gruppe)::text) AS svg_kombis, + MIN(r.ort_kurzbz) AS ort_kurzbz, + MIN(r.studiengang_kz) AS studiengang_kz, + MIN(r.veranstaltung_id) AS veranstaltung_id, + MIN(r.reservierung_id) AS reservierung_id, + MAX(r.insertamum) AS insertamum, + (array_agg(r.insertvon ORDER BY r.insertamum ASC))[1] AS insertvon + FROM block_keys bk + JOIN campus.tbl_reservierung r + ON r.titel = bk.titel AND r.beschreibung = bk.beschreibung AND r.datum = bk.datum AND r.stunde = bk.stunde + WHERE r.datum >= ? AND r.datum <= ? + GROUP BY bk.titel, bk.beschreibung, bk.datum, bk.block_nr + ) + SELECT + b.*, + (b.datum + s_von.beginn) AS von, + (b.datum + s_bis.ende) AS bis + FROM blocks b + JOIN lehre.tbl_stunde s_von ON s_von.stunde = b.stunde_von + JOIN lehre.tbl_stunde s_bis ON s_bis.stunde = b.stunde_bis + ORDER BY b.reservierung_id DESC;"; + /*$qry = "WITH per_stunde AS ( + SELECT + datum, + titel, + beschreibung, ort_kurzbz, studiengang_kz, stunde, + veranstaltung_id, + array_agg(DISTINCT uid) AS uids, + array_agg(DISTINCT reservierung_id::text) AS reservierung_ids, + array_agg(DISTINCT ROW(semester, verband, gruppe)::text) AS svg_kombis, + array_agg(DISTINCT gruppe_kurzbz) AS gruppen_kurzbz, + MIN(reservierung_id) AS reservierung_id, + MAX(insertamum) AS insertamum, + MAX(insertvon) AS insertvon + FROM campus.tbl_reservierung + WHERE datum >= ? AND datum <= ? + GROUP BY datum, titel, beschreibung, ort_kurzbz, studiengang_kz, stunde, veranstaltung_id + ), + numbered AS ( + SELECT + per_stunde.*, + stunde - ROW_NUMBER() OVER (PARTITION BY datum, titel, beschreibung, ort_kurzbz, studiengang_kz, veranstaltung_id ORDER BY stunde) AS grp + FROM per_stunde + ), + grouped AS ( + SELECT + MIN(reservierung_id) AS reservierung_id, + ort_kurzbz, studiengang_kz, datum, + MIN(stunde) AS stunde_von, + MAX(stunde) AS stunde_bis, + titel, beschreibung, + array_agg(DISTINCT gruppe_kurzbz_elem) AS gruppen_kurzbz, + array_agg(DISTINCT uid_elem) AS uids, + array_agg(DISTINCT res_id) AS reservierung_ids, + array_agg(DISTINCT svg_elem) AS svg_kombis, + veranstaltung_id, + MAX(insertamum) AS insertamum, + MAX(insertvon) AS insertvon + FROM numbered, + unnest(uids) AS uid_elem, + unnest(reservierung_ids) AS res_id, + unnest(gruppen_kurzbz) AS gruppe_kurzbz_elem, + unnest(svg_kombis) AS svg_elem + GROUP BY datum, titel, beschreibung, ort_kurzbz, studiengang_kz, veranstaltung_id, grp + ) + SELECT + grouped.*, + (datum + s_von.beginn) AS von, + (datum + s_bis.ende) AS bis + FROM grouped + JOIN lehre.tbl_stunde s_von ON s_von.stunde = grouped.stunde_von + JOIN lehre.tbl_stunde s_bis ON s_bis.stunde = grouped.stunde_bis + ORDER BY grouped.reservierung_id DESC";*/ + + array_push($params, $von, $bis); + $reservierung_data = $db->execReadOnlyQuery($qry, $params); + + + if (hasData($reservierung_data)) + { + $data = getData($reservierung_data); + + foreach($data as $block) + { + + $ids = is_array($block->reservierung_ids) ? $block->reservierung_ids : explode(',', $block->reservierung_ids); + + $this->SyncReservierungModel->db->where('reservierung_id IN (' . implode(',', $ids) . ')'); + $sync_result = $this->SyncReservierungModel->load(); + + if (!hasData($sync_result)) + { + $kalender_id = $this->_insertKalender($block, 'reservierung'); + if ($kalender_id) + { + $this->_insertReservierungSync($block->reservierung_ids, $kalender_id); + } + } + else + { + $syncData = getData($sync_result); + $kalender_id = $syncData[0]->kalender_id; + $last_sync = $syncData[0]->lastupdate; + $synced_ids = array_column($syncData, 'reservierung_id'); + + if ($block->insertamum > $last_sync) + { + $this->_updateKalender($kalender_id, $block); + $this->_updateReservierungSync($synced_ids, $kalender_id); + } + + $fehlende = array_diff($block->reservierung_ids, $synced_ids); + if (!empty($fehlende)) + { + $this->_insertReservierungSync($fehlende, $kalender_id); + } + } + } + } + } + + + private function _insertKalender($block, $typ) { $result = $this->KalenderModel->insert( array ( 'von' => $block->von, 'bis' => $block->bis, - 'typ' => 'lehreinheit', - 'status_kurzbz'=> 'visible_student', + 'typ' => $typ, + 'status_kurzbz'=> 'live', 'insertamum' => $block->insertamum, 'insertvon' => $block->insertvon, - 'updateamum' => $block->updateamum, - 'updatevon' => $block->updatevon + 'updateamum' => $block->updateamum ?? null, + 'updatevon' => $block->updatevon ?? null ) ); if(!isSuccess($result)) @@ -211,12 +387,94 @@ class MigrateKalender extends Auth_Controller $kalender_id = getData($result); - $this->KalenderLehreinheitModel->insert( - array ( + if ($typ === 'lehreinheit') + { + $this->KalenderLehreinheitModel->insert( + array ( + 'kalender_id' => $kalender_id, + 'lehreinheit_id'=> $block->lehreinheit_id + ) + ); + } + else if ($typ === 'reservierung') + { + $this->KalenderEventModel->insert(array( 'kalender_id' => $kalender_id, - 'lehreinheit_id'=> $block->lehreinheit_id - ) - ); + 'titel' => $block->titel, + 'beschreibung' => $block->beschreibung + )); + + + if ($block->insertvon) + { + $user = $this->BenutzerModel->load(array('uid' => $block->insertvon)); + + if (hasData($user)) + { + $this->KalenderEventTeilnehmerModel->insert(array( + 'kalender_id' => $kalender_id, + 'uid' => getData($user)[0]->uid, + 'rolle_kurzbz' => 'organisator' + )); + } + } + + $uids = is_array($block->uids) ? $block->uids : explode(',', $block->uids); + foreach ($uids as $uid) + { + $this->KalenderEventTeilnehmerModel->insert(array( + 'kalender_id' => $kalender_id, + 'uid' => $uid, + 'rolle_kurzbz' => 'teilnehmer' + )); + } + + $semester_range = $this->StudiensemesterModel->getByDateRange($block->von, $block->bis); + if (isError($semester_range)) return $semester_range; + $studiensemester_kurzbz = getData($semester_range)[0]->studiensemester_kurzbz ?? null; + + $gruppen = is_array($block->gruppen_kurzbz) ? $block->gruppen_kurzbz : explode(',', $block->gruppen_kurzbz ?? ''); + + foreach ($gruppen as $gruppe_kurzbz) + { + $gruppe_kurzbz = trim($gruppe_kurzbz); + if (!empty($gruppe_kurzbz)) + { + $this->KalenderEventTeilnehmerModel->insert(array( + 'kalender_id' => $kalender_id, + 'gruppe_kurzbz' => $gruppe_kurzbz, + 'studiengang_kz' => $block->studiengang_kz, + 'studiensemester_kurzbz' => $studiensemester_kurzbz, + 'rolle_kurzbz' => 'teilnehmer' + )); + } + } + + foreach ($block->svg_kombis as $kombi_str) + { + $kombi_str = trim($kombi_str, '()'); + list($sem, $verb, $grp) = explode(',', $kombi_str); + + $sem = trim($sem) === '' ? null : trim($sem); + $verb = trim($verb) === '' ? null : trim($verb); + $grp = trim($grp) === '' ? null : trim($grp); + + if (is_null($sem) && is_null($verb) && is_null($grp)) + continue; + + $this->KalenderEventTeilnehmerModel->insert(array( + 'kalender_id' => $kalender_id, + 'studiengang_kz' => $block->studiengang_kz, + 'semester' => $sem, + 'verband' => $verb, + 'gruppe' => $grp, + 'studiensemester_kurzbz' => $studiensemester_kurzbz, + 'rolle_kurzbz' => 'teilnehmer' + )); + } + } + + $this->KalenderOrtModel->insert( array ( 'kalender_id' => $kalender_id, @@ -240,6 +498,20 @@ class MigrateKalender extends Auth_Controller ); } } + private function _insertReservierungSync($ids, $kalender_id) + { + + foreach($ids as $id) + { + $this->SyncReservierungModel->insert( + array ( + 'reservierung_id' => $id, + 'kalender_id' => $kalender_id, + 'lastupdate' => date('Y-m-d H:i:s') + ) + ); + } + } private function _updateKalender($kalender_id, $block) { @@ -271,4 +543,20 @@ class MigrateKalender extends Auth_Controller ); } } + + private function _updateReservierungSync($ids, $kalender_id) + { + foreach($ids as $id) + { + $this->SyncReservierungModel->update( + array ( + 'reservierung_id' => $id, + 'kalender_id' => $kalender_id + ), + array ( + 'lastupdate' => date('Y-m-d H:i:s') + ) + ); + } + } } diff --git a/application/libraries/KalenderLib.php b/application/libraries/KalenderLib.php index b4799cc6c..08fc069da 100644 --- a/application/libraries/KalenderLib.php +++ b/application/libraries/KalenderLib.php @@ -11,12 +11,15 @@ class KalenderLib $this->_ci->load->model('ressource/Kalender_model', 'KalenderModel'); $this->_ci->load->model('ressource/Kalender_Lehreinheit_model', 'KalenderLehreinheitModel'); + $this->_ci->load->model('ressource/Kalender_Event_model', 'KalenderEventModel'); + $this->_ci->load->model('ressource/Kalender_Event_Teilnehmer_model', 'KalenderEventTeilnehmerModel'); $this->_ci->load->model('ressource/Kalender_Ort_model', 'KalenderOrtModel'); $this->_ci->load->model('education/Lehreinheit_model', 'LehreinheitModel'); $this->_ci->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel'); $this->_ci->load->model('education/LehreinheitMitarbeiter_model', 'LehreinheitMitarbeiterModel'); $this->_ci->load->model('ressource/Ort_model', 'OrtModel'); - + $this->_ci->load->model('organisation/gruppe_model', 'GruppeModel'); + $this->_ci->load->model('organisation/Lehrverband_model', 'LehrverbandModel'); } private function _getBasePlan($start_date, $end_date) @@ -25,6 +28,7 @@ class KalenderLib $this->_ci->KalenderModel->addSelect('tbl_kalender.kalender_id, tbl_kalender.status_kurzbz, + tbl_kalender.typ, tbl_kalender.von, tbl_kalender.bis, tbl_kalender_ort.ort_kurzbz, @@ -36,20 +40,58 @@ class KalenderLib lehrfach.kurzbz AS lehrfach_kurzbz, lehrfach.bezeichnung AS lehrfach_bezeichnung, lehrfach.farbe, - tbl_lehreinheitmitarbeiter.mitarbeiter_uid, - tbl_person.vorname, - tbl_person.nachname, - tbl_mitarbeiter.kurzbz AS ma_kurzbz'); - $this->_ci->KalenderModel->addJoin('lehre.tbl_kalender_lehreinheit', 'tbl_kalender.kalender_id = tbl_kalender_lehreinheit.kalender_id'); - $this->_ci->KalenderModel->addJoin('lehre.tbl_lehreinheit', 'tbl_kalender_lehreinheit.lehreinheit_id = tbl_lehreinheit.lehreinheit_id'); - $this->_ci->KalenderModel->addJoin('lehre.tbl_lehrveranstaltung', 'tbl_lehreinheit.lehrveranstaltung_id = tbl_lehrveranstaltung.lehrveranstaltung_id'); + COALESCE(orginasator.uid, tbl_lehreinheitmitarbeiter.mitarbeiter_uid) as mitarbeiter_uid, + COALESCE(reservierung_person.vorname, tbl_person.vorname) as vorname, + COALESCE(reservierung_person.nachname, tbl_person.nachname) as nachname, + COALESCE(reservierung_ma.kurzbz, tbl_mitarbeiter.kurzbz) AS ma_kurzbz, + teilnehmergruppe.gruppe_kurzbz as teilnehmerg_grp, + COALESCE ( + UPPER(tbl_studiengang.typ || tbl_studiengang.kurzbz) || + COALESCE(verbandgruppe.semester::varchar, \'\') || + COALESCE(verbandgruppe.verband::varchar, \'\') || + COALESCE(verbandgruppe.gruppe, \'\'), + \'\') as verband_grp, + tbl_kalender_event.beschreibung, + tbl_kalender_event.titel, + teilmitarbeiter.kurzbz as teilnehmer_kurzbz, + teilperson.vorname as teilnehmer_vorname, + teilperson.nachname as teilnehmer_nachname, + + teilbenutzer.uid as teilnehmer_uid'); + + $this->_ci->KalenderModel->addJoin('lehre.tbl_kalender_lehreinheit', 'tbl_kalender.kalender_id = tbl_kalender_lehreinheit.kalender_id', 'LEFT'); + $this->_ci->KalenderModel->addJoin('lehre.tbl_kalender_event', 'tbl_kalender.kalender_id = tbl_kalender_event.kalender_id', 'LEFT'); + + $this->_ci->KalenderModel->addJoin('lehre.tbl_kalender_event_teilnehmer orginasator', 'tbl_kalender_event.kalender_id = orginasator.kalender_id AND orginasator.rolle_kurzbz = \'organisator\'', 'LEFT'); + $this->_ci->KalenderModel->addJoin('lehre.tbl_kalender_event_teilnehmer teilnehmer', 'tbl_kalender_event.kalender_id = teilnehmer.kalender_id AND teilnehmer.rolle_kurzbz = \'teilnehmer\'', 'LEFT'); + + $this->_ci->KalenderModel->addJoin('public.tbl_benutzer teilbenutzer', 'teilnehmer.uid = teilbenutzer.uid', 'LEFT'); + $this->_ci->KalenderModel->addJoin('public.tbl_mitarbeiter teilmitarbeiter', 'teilmitarbeiter.mitarbeiter_uid = teilbenutzer.uid', 'LEFT'); + $this->_ci->KalenderModel->addJoin('public.tbl_person teilperson', 'teilperson.person_id = teilbenutzer.person_id', 'LEFT'); + + $this->_ci->KalenderModel->addJoin('public.tbl_gruppe teilnehmergruppe', 'teilnehmer.gruppe_kurzbz = teilnehmergruppe.gruppe_kurzbz', 'LEFT'); + $this->_ci->KalenderModel->addJoin('public.tbl_lehrverband verbandgruppe', + 'teilnehmer.studiengang_kz = verbandgruppe.studiengang_kz + AND teilnehmer.semester = verbandgruppe.semester + AND TRIM(COALESCE(teilnehmer.verband::text, \'\')) = TRIM(verbandgruppe.verband::text) + AND TRIM(COALESCE(teilnehmer.gruppe::text, \'\')) = TRIM(verbandgruppe.gruppe::text)', 'LEFT'); + $this->_ci->KalenderModel->addJoin('public.tbl_studiengang', 'verbandgruppe.studiengang_kz = public.tbl_studiengang.studiengang_kz', 'LEFT' ); + + + $this->_ci->KalenderModel->addJoin('lehre.tbl_lehreinheit', 'tbl_kalender_lehreinheit.lehreinheit_id = tbl_lehreinheit.lehreinheit_id', 'LEFT'); + $this->_ci->KalenderModel->addJoin('lehre.tbl_lehrveranstaltung', 'tbl_lehreinheit.lehrveranstaltung_id = tbl_lehrveranstaltung.lehrveranstaltung_id', 'LEFT'); $this->_ci->KalenderModel->addJoin('lehre.tbl_lehrveranstaltung lehrfach', 'tbl_lehreinheit.lehrfach_id = lehrfach.lehrveranstaltung_id', 'LEFT'); $this->_ci->KalenderModel->addJoin('lehre.tbl_kalender_ort', 'tbl_kalender.kalender_id = tbl_kalender_ort.kalender_id', 'LEFT'); $this->_ci->KalenderModel->addJoin('lehre.tbl_lehreinheitmitarbeiter', 'tbl_lehreinheit.lehreinheit_id = tbl_lehreinheitmitarbeiter.lehreinheit_id', 'LEFT'); + $this->_ci->KalenderModel->addJoin('public.tbl_mitarbeiter', 'tbl_mitarbeiter.mitarbeiter_uid = tbl_lehreinheitmitarbeiter.mitarbeiter_uid', 'LEFT'); $this->_ci->KalenderModel->addJoin('public.tbl_benutzer', 'tbl_mitarbeiter.mitarbeiter_uid = tbl_benutzer.uid', 'LEFT'); $this->_ci->KalenderModel->addJoin('public.tbl_person', 'tbl_person.person_id = tbl_benutzer.person_id', 'LEFT'); + $this->_ci->KalenderModel->addJoin('public.tbl_mitarbeiter reservierung_ma', 'reservierung_ma.mitarbeiter_uid = orginasator.uid', 'LEFT'); + $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->db->where('tbl_kalender.von >=', $start_date); $this->_ci->KalenderModel->db->where('tbl_kalender.bis <', $end_date); } @@ -73,7 +115,7 @@ class KalenderLib $bis = new DateTime($row->bis); $events[$id] = (object) [ - 'type' => 'lehreinheit', + 'type' => $row->typ, 'beginn' => $von->format('H:i:s'), 'ende' => $bis->format('H:i:s'), 'datum' => $von->format('Y-m-d'), @@ -91,8 +133,11 @@ class KalenderLib 'kalender_id' => $id, 'lehreinheit_id' => [], 'lektor' => [], + 'teilnehmer_gruppe' => [], + 'teilnehmer_person' => [], 'gruppe' => [], - 'titel' => '', + 'titel' => isset($row->titel) ? $row->titel : '', + 'beschreibung' => isset($row->beschreibung) ? $row->beschreibung : '', 'topic' => (isset($row->lehrfach_kurzbz) ? $row->lehrfach_kurzbz : '').' '.(isset($row->lehrform_kurzbz) ? $row->lehrform_kurzbz : ''), ]; } @@ -112,6 +157,39 @@ class KalenderLib ]; } } + + if ($row->verband_grp) + { + if (!in_array($row->teilnehmerg_grp, array_column($events[$id]->teilnehmer_gruppe, 'gruppe_kurzbz'))) + { + $events[$id]->teilnehmer_gruppe[] = [ + 'gruppe_kurzbz' => $row->verband_grp, + ]; + } + } + + if ($row->teilnehmerg_grp) + { + if (!in_array($row->teilnehmerg_grp, array_column($events[$id]->teilnehmer_gruppe, 'gruppe_kurzbz'))) + { + $events[$id]->teilnehmer_gruppe[] = [ + 'gruppe_kurzbz' => $row->teilnehmerg_grp, + ]; + } + } + + if ($row->teilnehmer_uid) + { + if (!in_array($row->teilnehmer_uid, array_column($events[$id]->teilnehmer_person, 'uid'))) + { + $events[$id]->teilnehmer_person[] = [ + 'uid' => $row->teilnehmer_uid, + 'vorname' => $row->teilnehmer_vorname, + 'nachname' => $row->teilnehmer_nachname, + 'kurzbz' => $row->teilnehmer_kurzbz, + ]; + } + } } return array_values($events); @@ -213,7 +291,7 @@ class KalenderLib { $this->_getBasePlan($start_date, $end_date); - $this->_ci->KalenderModel->db->where('status_kurzbz', 'visible_student'); + $this->_ci->KalenderModel->db->where('status_kurzbz', 'live'); $data = $this->_ci->KalenderModel->load(); @@ -227,28 +305,18 @@ class KalenderLib $this->_ci->KalenderModel->addJoin( 'lehre.tbl_kalender neuerer', - "neuerer.vorgaenger_kalender_id = tbl_kalender.kalender_id AND neuerer.status_kurzbz IN ('visible_lektor', 'tosync_student')", + "neuerer.vorgaenger_kalender_id = tbl_kalender.kalender_id AND neuerer.status_kurzbz IN ('preview', 'sync_live')", 'LEFT' ); $this->_ci->KalenderModel->db->where("( - tbl_kalender.status_kurzbz = 'tosync_student' - OR (tbl_kalender.status_kurzbz = 'visible_lektor' AND neuerer.kalender_id IS NULL) - OR (tbl_kalender.status_kurzbz = 'visible_student' AND neuerer.kalender_id IS NULL) + tbl_kalender.status_kurzbz = 'sync_live' + 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(); return $this->_mapEvents($data); } - public function getPlanForLecturer2($start_date, $end_date) - { - $this->_getBasePlan($start_date, $end_date); - - $this->_ci->KalenderModel->db->where_in('status_kurzbz', array('visible_student', 'visible_lektor')); - - $data = $this->_ci->KalenderModel->load(); - - return $this->_mapEvents($data); - } public function getZeitsperren($start_date, $end_date, $emp) { $db = new DB_Model(); @@ -387,6 +455,152 @@ class KalenderLib } } + public function addReservierung($titel, $beschreibung, $ort_kurzbz, $start_date, $end_date, $teilnehmer, $specialFinalGroups, $specialGroups, $groups) + { + + if (!is_null($ort_kurzbz)) + { + $this->_ci->KalenderModel->addSelect('1'); + $this->_ci->KalenderModel->addJoin('lehre.tbl_kalender_ort', 'kalender_id'); + $reservierung_vorhanden = $this->_ci->KalenderModel->load(array ( + 'von <=' => $end_date, + 'bis >=' => $start_date, + 'ort_kurzbz' => $ort_kurzbz, + )); + + if (hasData($reservierung_vorhanden) && !$this->_ci->permissionlib->isBerechtigt('lehre/reservierungAdvanced')) + return error ('lvplan/bereitsReserviert'); + } + + + + $kalenderresult = $this->_ci->KalenderModel->insert( + array ( + 'von' => $start_date, + 'bis' => $end_date, + 'typ' => 'reservierung', + 'status_kurzbz' => 'live', + 'insertvon' => getAuthUID(), + 'insertamum' => date('Y-m-d H:i:s') + ) + ); + + if(isSuccess($kalenderresult) && hasData($kalenderresult)) + { + $kalender_id = getData($kalenderresult); + + $kalendereventresult = $this->_ci->KalenderEventModel->insert( + array ( + 'kalender_id' => $kalender_id, + 'titel' => $titel, + 'beschreibung' => $beschreibung, + ) + ); + + foreach ($teilnehmer as $teil) + { + $this->_addTeilnehmerToEvent($kalender_id, $teil['uid'], $teil['rolle']); + } + + foreach($specialFinalGroups as $group) + { + $this->_addFinalGroupToEvent($kalender_id, $group['gid'], !($group['lehrverband'] === 'false'), $group['gruppe_kurzbz'], $group['studiensemester_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']); + }*/ + + if(isSuccess($kalendereventresult) && !is_null($ort_kurzbz)) + { + return $this->_addKalenderOrt($kalender_id, $ort_kurzbz); + } + + return $kalendereventresult; + } + } + + private function _addTeilnehmerToEvent($kalender_id, $uid, $rolle) + { + return $this->_ci->KalenderEventTeilnehmerModel->insert( + array ( + 'kalender_id' => $kalender_id, + 'uid' => $uid, + 'rolle_kurzbz' => $rolle + ) + ); + } + private function _addFinalGroupToEvent($kalender_id, $gid, $lehrverband, $gruppe_kurzbz, $studiensemester_kurzbz, $rolle) + { + + if ($lehrverband === false) + { + $gruppen_result = $this->_ci->GruppeModel->loadWhere(array('gid' => $gid)); + + if (!hasData($gruppen_result)) + return error('No group found for gid ' . $gid); + + return $this->_ci->KalenderEventTeilnehmerModel->insert( + array ( + 'kalender_id' => $kalender_id, + 'gruppe_kurzbz' => $gruppe_kurzbz, + 'studiensemester_kurzbz' => $studiensemester_kurzbz, + 'rolle_kurzbz' => $rolle + ) + ); + } + else if ($lehrverband === true) + { + $gruppen_result = $this->_ci->LehrverbandModel->loadWhere(array('gid' => $gid)); + + if (!hasData($gruppen_result)) + return error('No group found for gid ' . $gid); + + $gruppe = getData($gruppen_result)[0]; + + return $this->_ci->KalenderEventTeilnehmerModel->insert( + array ( + 'kalender_id' => $kalender_id, + 'studiengang_kz' => $gruppe->studiengang_kz, + 'studiensemester_kurzbz' => $studiensemester_kurzbz, + 'semester' => isEmptyString($gruppe->semester) ? null : $gruppe->semester, + 'verband' => isEmptyString($gruppe->verband) ? null : $gruppe->verband, + 'gruppe' => isEmptyString($gruppe->gruppe) ? null : $gruppe->gruppe, + 'rolle_kurzbz' => $rolle + ) + ); + } + } + + private function _addSpecialGroupToEvent($kalender_id, $gruppe_kurzbz, $rolle) + { + return $this->_ci->KalenderEventTeilnehmerModel->insert( + array ( + 'kalender_id' => $kalender_id, + 'gruppe_kurzbz' => $gruppe_kurzbz, + 'rolle_kurzbz' => $rolle + ) + ); + } + private function _addGroupToEvent($kalender_id, $stg_kz, $semester, $verband, $gruppe, $rolle) + { + return $this->_ci->KalenderEventTeilnehmerModel->insert( + array ( + 'kalender_id' => $kalender_id, + 'studiengang_kz' => $stg_kz, + 'semester' => isEmptyString($semester) ? null : $semester, + 'verband' => isEmptyString($verband) ? null : $verband, + 'gruppe' => isEmptyString($gruppe) ? null : $gruppe, + 'rolle_kurzbz' => $rolle + ) + ); + } private function _addKalenderOrt($kalender_id, $ort_kurzbz) { return $this->_ci->KalenderOrtModel->insert( @@ -404,11 +618,14 @@ class KalenderLib $kalender_entry = getData($entryResult); - if (in_array($kalender_entry->status_kurzbz, array('todelete', 'deleted'))) - return error('Eintrag kann nicht mehr bearbeitet werden'); + if ($kalender_entry->typ === 'lehreinheit') + { + if (in_array($kalender_entry->status_kurzbz, array('todelete', 'deleted'))) + return error('Eintrag kann nicht mehr bearbeitet werden'); - if (in_array($kalender_entry->status_kurzbz, array('visible_student', 'visible_lektor'))) - return $this->_createHistoryEntry($kalender_entry, $start_date, $end_date); + if (in_array($kalender_entry->status_kurzbz, array('live', 'preview'))) + return $this->_createHistoryEntry($kalender_entry, $start_date, $end_date); + } return $this->_ci->KalenderModel->update( array('kalender_id' => $kalender_id), @@ -428,11 +645,14 @@ class KalenderLib $kalender_entry = getData($entryResult); - if (in_array($kalender_entry->status_kurzbz, array('todelete', 'deleted'))) - return error('Eintrag kann nicht mehr bearbeitet werden'); + if ($kalender_entry->typ === 'lehreinheit') + { + if (in_array($kalender_entry->status_kurzbz, array('todelete', 'deleted'))) + return error('Eintrag kann nicht mehr bearbeitet werden'); - if (in_array($kalender_entry->status_kurzbz, array('visible_student', 'visible_lektor'))) - return $this->_createHistoryEntry($kalender_entry, null, null, $ort_kurzbz); + if (in_array($kalender_entry->status_kurzbz, array('live', 'preview'))) + return $this->_createHistoryEntry($kalender_entry, null, null, $ort_kurzbz); + } $exist = $this->_ci->KalenderOrtModel->load(array('kalender_id' => $kalender_id)); if (hasData($exist)) @@ -456,10 +676,10 @@ class KalenderLib $kalender_entry = getData($entryResult); $allowed = array( - 'planning' => array('tosync_lektor', 'tosync_student'), - 'tosync_lektor' => array('tosync_student'), - 'tosync_student' => array('tosync_lektor'), - 'visible_lektor' => array('tosync_student'), + 'planning' => array('sync_preview', 'sync_live'), + 'sync_preview' => array('sync_live'), + 'sync_live' => array('sync_preview'), + 'preview' => array('sync_live'), ); if (!isset($allowed[$kalender_entry->status_kurzbz]) || !in_array($status_kurzbz, $allowed[$kalender_entry->status_kurzbz])) @@ -527,7 +747,7 @@ class KalenderLib private function _loadKalenderEntry($kalender_id) { $this->_ci->KalenderModel->addSelect('tbl_kalender.*, tbl_kalender_lehreinheit.lehreinheit_id, tbl_kalender_ort.ort_kurzbz, tbl_kalender_ort.location'); - $this->_ci->KalenderModel->addJoin('lehre.tbl_kalender_lehreinheit', 'tbl_kalender.kalender_id = tbl_kalender_lehreinheit.kalender_id'); + $this->_ci->KalenderModel->addJoin('lehre.tbl_kalender_lehreinheit', 'tbl_kalender.kalender_id = tbl_kalender_lehreinheit.kalender_id', 'LEFT'); $this->_ci->KalenderModel->addJoin('lehre.tbl_kalender_ort', 'tbl_kalender.kalender_id = tbl_kalender_ort.kalender_id', 'LEFT'); $result = $this->_ci->KalenderModel->load(array('tbl_kalender.kalender_id' => $kalender_id)); @@ -552,6 +772,37 @@ class KalenderLib if ($entry->typ === 'lehreinheit') return $this->_deleteTypLehreinheit($entry); + if ($entry->typ === 'reservierung') + return $this->_deleteTypReservierung($entry); + } + + private function _deleteTypReservierung($entry) + { + $result_event = $this->_ci->KalenderEventModel->loadWhere(array('kalender_id' => $entry->kalender_id)); + if (isError($result_event)) return $result_event; + $has_event = hasData($result_event) ? getData($result_event)[0] : false; + + $result_teilnehmer_event = $this->_ci->KalenderEventTeilnehmerModel->loadWhere(array('kalender_id' => $entry->kalender_id)); + if (isError($result_teilnehmer_event)) + return $result_teilnehmer_event; + $has_teilnehmer_event = hasData($result_teilnehmer_event) ? getData($result_teilnehmer_event)[0] : false; + + $result_ort = $this->_ci->KalenderOrtModel->loadWhere(array('kalender_id' => $entry->kalender_id)); + if (isError($result_ort)) return $result_ort; + $has_ort = hasData($result_ort) ? getData($result_ort)[0] : false; + + if ($has_ort) + $this->_deleteOrtEntry($has_ort); + + if ($has_teilnehmer_event) + $this->_deleteReservierungTeilnehmerEntry($has_teilnehmer_event); + + if ($has_event) + $this->_deleteReservierungEntry($has_event); + + $this->_ci->KalenderModel->delete(array('tbl_kalender.kalender_id' => $entry->kalender_id)); + + return success(); } private function _deleteTypLehreinheit($entry) @@ -574,7 +825,7 @@ class KalenderLib $this->_ci->KalenderModel->delete(array('tbl_kalender.kalender_id' => $entry->kalender_id)); } - else if ($entry->status_kurzbz === 'tosync_lektor' || $entry->status_kurzbz === 'tosync_student') + else if ($entry->status_kurzbz === 'sync_preview' || $entry->status_kurzbz === 'sync_live') { $history = $this->getHistory($entry->kalender_id); $history = hasData($history) ? getData($history) : false; @@ -587,7 +838,7 @@ class KalenderLib $this->_ci->KalenderModel->delete(array('tbl_kalender.kalender_id' => $entry->kalender_id)); } - else if ($entry->status_kurzbz === 'visible_lektor' || $entry->status_kurzbz === 'visible_student') + else if ($entry->status_kurzbz === 'preview' || $entry->status_kurzbz === 'live') { //TODO (david) überprüfen ob sinnvoll, verschwindet direkt in den ansichten (student, lecturer) $result = $this->_ci->KalenderModel->update( @@ -602,13 +853,21 @@ class KalenderLib private function _deleteOrtEntry($entry) { return $this->_ci->KalenderOrtModel->delete(array('kalender_id' => $entry->kalender_id)); - } private function _deleteLehreinheitEntry($entry) { return $this->_ci->KalenderLehreinheitModel->delete(array('kalender_id' => $entry->kalender_id)); } + private function _deleteReservierungTeilnehmerEntry($entry) + { + return $this->_ci->KalenderEventTeilnehmerModel->delete(array('kalender_id' => $entry->kalender_id)); + } + + private function _deleteReservierungEntry($entry) + { + return $this->_ci->KalenderEventModel->delete(array('kalender_id' => $entry->kalender_id)); + } public function getHistory($kalender_id, $only_previous = false) { @@ -658,50 +917,60 @@ class KalenderLib //TODO in eine eigen Lib? public function sync() { - $this->_ci->load->model('ressource/Kalender_model', 'KalenderModel'); - $this->_ci->KalenderModel->db->where_in('status_kurzbz', array('tosync_student', 'tosync_lektor', 'todelete', 'planning', 'visible_lektor')); - $this->_ci->KalenderModel->addOrder('kalender_id', 'DESC'); + $this->_ci->KalenderModel->addSelect('tbl_kalender.*, tbl_kalender_ort.ort_kurzbz, tbl_kalender_ort.location'); + $this->_ci->KalenderModel->addJoin('lehre.tbl_kalender_ort', 'tbl_kalender.kalender_id = tbl_kalender_ort.kalender_id', 'LEFT'); + $this->_ci->KalenderModel->db->where_in('status_kurzbz', array('sync_live', 'sync_preview', 'todelete', 'planning', 'preview')); + $this->_ci->KalenderModel->addOrder('tbl_kalender.kalender_id', 'DESC'); $to_update = $this->_ci->KalenderModel->load(); if (!hasData($to_update)) return success(); + + $mail_infos = []; + foreach (getData($to_update) as $entry) { if ($entry->status_kurzbz === 'todelete') { $this->_ci->KalenderModel->update(array('kalender_id' => $entry->kalender_id), array('status_kurzbz' => 'deleted')); + $mail_infos[] = array('entry' => $entry, 'new_status' => 'deleted', 'notify' => array('lektor', 'student')); } - if ($entry->status_kurzbz === 'tosync_lektor') + + if ($entry->status_kurzbz === 'sync_preview') { - $this->_ci->KalenderModel->update(array('kalender_id' => $entry->kalender_id), array('status_kurzbz' => 'visible_lektor')); + $this->_ci->KalenderModel->update(array('kalender_id' => $entry->kalender_id), array('status_kurzbz' => 'preview')); $this->_archiveVorgaenger($entry->vorgaenger_kalender_id, true); + $mail_infos[] = array('entry' => $entry, 'new_status' => 'preview', 'notify' => array('lektor')); } - if ($entry->status_kurzbz === 'tosync_student' || $entry->status_kurzbz === 'planning') + if ($entry->status_kurzbz === 'sync_live' || $entry->status_kurzbz === 'planning') { - $this->_ci->KalenderModel->update(array('kalender_id' => $entry->kalender_id), array('status_kurzbz' => 'visible_student')); + $this->_ci->KalenderModel->update(array('kalender_id' => $entry->kalender_id), array('status_kurzbz' => 'live')); $this->_archiveVorgaenger($entry->vorgaenger_kalender_id, false); + $mail_infos[] = array('entry' => $entry, 'new_status' => 'live', 'notify' => array('lektor', 'student')); } - if ($entry->status_kurzbz === 'visible_lektor') + if ($entry->status_kurzbz === 'preview') { $current = getData($this->_ci->KalenderModel->load(array('kalender_id' => $entry->kalender_id)))[0]; if ($current->status_kurzbz === 'archived') continue; - $this->_ci->KalenderModel->update(array('kalender_id' => $entry->kalender_id), array('status_kurzbz' => 'visible_student')); + $this->_ci->KalenderModel->update(array('kalender_id' => $entry->kalender_id), array('status_kurzbz' => 'live')); $this->_archiveVorgaenger($entry->vorgaenger_kalender_id, false); + $mail_infos[] = array('entry' => $entry, 'new_status' => 'live', 'notify' => array('lektor', 'student')); } } + $this->_ci->load->library('KalenderNotificationLib'); + $this->_ci->kalendernotificationlib->sendMails($mail_infos); return success(); - } - private function _archiveVorgaenger($vorgaenger_kalender_id, $stop_at_visible_student = false) + private function _archiveVorgaenger($vorgaenger_kalender_id, $stop_at_live = false) { if (!$vorgaenger_kalender_id) return; @@ -714,10 +983,10 @@ class KalenderLib $vorgaenger = getData($vorgaenger)[0]; - if ($stop_at_visible_student && $vorgaenger->status_kurzbz === 'visible_student') + if ($stop_at_live && $vorgaenger->status_kurzbz === 'live') return; - if (in_array($vorgaenger->status_kurzbz, array('visible_lektor', 'visible_student'))) + if (in_array($vorgaenger->status_kurzbz, array('preview', 'live'))) { $this->_ci->KalenderModel->update( array('kalender_id' => $current_id), diff --git a/application/libraries/KalenderNotificationLib.php b/application/libraries/KalenderNotificationLib.php new file mode 100644 index 000000000..d611eb247 --- /dev/null +++ b/application/libraries/KalenderNotificationLib.php @@ -0,0 +1,170 @@ +_ci =& get_instance(); + $this->_ci->load->library('MailLib'); + $this->_ci->load->config('tempus'); + + } + + public function sendMails($mail_infos) + { + if (!$this->_ci->config->item('send_update_mails')) + return true; + + $lektor_added = array(); + $lektor_changed = array(); + $lektor_deleted = array(); + + $student_added = array(); + $student_changed = array(); + $student_deleted = array(); + + foreach ($mail_infos as $info) + { + $entry = $info['entry']; + $new_status = $info['new_status']; + $notify = $info['notify']; + + $old_entry = null; + if ($entry->vorgaenger_kalender_id) + { + $this->_ci->KalenderModel->addJoin('lehre.tbl_kalender_ort', 'tbl_kalender.kalender_id = tbl_kalender_ort.kalender_id', 'LEFT'); + $vorgaenger = $this->_ci->KalenderModel->load(array('tbl_kalender.kalender_id' => $entry->vorgaenger_kalender_id)); + if (hasData($vorgaenger)) + $old_entry = getData($vorgaenger)[0]; + } + + if ($new_status === 'deleted') + $row = $this->_buildMailDeleted($entry); + else if ($old_entry) + $row = $this->_buildMailChanged($old_entry, $entry); + else + $row = $this->_buildMailNew($entry); + + if (in_array('lektor', $notify)) + { + if ($new_status === 'deleted') + $lektor_deleted[] = $row; + else if ($old_entry) + $lektor_changed[] = $row; + else + $lektor_added[] = $row; + } + + if (in_array('student', $notify)) + { + if ($new_status === 'deleted') + $student_deleted[] = $row; + else if ($old_entry) + $student_changed[] = $row; + else + $student_added[] = $row; + } + } + + $lektor_entries = ''; + $student_entries = ''; + + if (!empty($lektor_added)) + $lektor_entries .= $this->_addToList($lektor_added, 'hinzugefügt') . '