array('planning', 'sync_preview'), 'live' => array('planning', 'sync_preview', 'preview', 'sync_live') ); public function __construct() { $this->_ci =& get_instance(); $this->_ci->load->model('ressource/Kalender_model', 'KalenderModel'); $this->_ci->load->model('ressource/Kalendersyncstatus_model', 'KalendersyncstatusModel'); $this->_ci->load->model('organisation/Studiengang_model', 'StudiengangModel'); $this->_ci->load->model('organisation/Organisationseinheit_model', 'OrganisationseinheitModel'); $this->_ci->load->library('KalenderLib'); } public function run($studiensemester_kurzbz) { $this->_ci->KalendersyncstatusModel->db->where('studiensemester_kurzbz', $studiensemester_kurzbz); $configs = $this->_ci->KalendersyncstatusModel->load(); if (isError($configs)) return $configs; if (!hasData($configs)) return success([]); $results = []; $mail_infos_gesamt = []; foreach (getData($configs) as $config) { $ziel_status = isEmptyString($config->sync_status_kurzbz) ? 'live' : $config->sync_status_kurzbz; $relevante_stati = array_merge($this->status_map[$ziel_status], array('to_delete', 'to_delete_live', 'to_delete_preview')); $kalender_ids_result = $this->getKalenderIds( $config->oe_kurzbz, $config->studiensemester_kurzbz, $relevante_stati, $config->ausbildungssemester, $config->studienplan_id, $config->datum_bis ); if (isError($kalender_ids_result)) return $kalender_ids_result; $kalender_ids = getData($kalender_ids_result); $sync_result = $this->_syncKalenderIds($kalender_ids, $ziel_status); if (isError($sync_result)) return $sync_result; $sync_data = getData($sync_result); if ((bool) $config->mail) $mail_infos_gesamt = array_merge($mail_infos_gesamt, $sync_data['mail_infos']); $results[] = [ 'kalender_syncstatus_id' => $config->kalender_syncstatus_id, 'oe_kurzbz' => $config->oe_kurzbz, 'ausbildungssemester' => $config->ausbildungssemester, 'studienplan_id' => $config->studienplan_id, 'ziel_status' => $ziel_status, 'mail' => (bool) $config->mail, 'synced' => $sync_data['synced'] ]; } if (!empty($mail_infos_gesamt)) { $this->_ci->load->library('KalenderNotificationLib'); $this->_ci->kalendernotificationlib->sendMails($mail_infos_gesamt); } return success($results); } public function runManual($oe_kurzbz, $studiensemester_kurzbz, $ausbildungssemester = null, $studienplan_id = null, $mail = true, $datum_bis = null, $ziel_status = 'live') { $relevante_stati = array_merge($this->status_map[$ziel_status], array('to_delete', 'to_delete_live', 'to_delete_preview')); $kalender_ids_result = $this->getKalenderIds( $oe_kurzbz, $studiensemester_kurzbz, $relevante_stati, $ausbildungssemester, $studienplan_id, $datum_bis ); if (isError($kalender_ids_result)) return $kalender_ids_result; $kalender_ids = getData($kalender_ids_result); $sync_result = $this->_syncKalenderIds($kalender_ids, $ziel_status); if (isError($sync_result)) return $sync_result; $sync_data = getData($sync_result); if ($mail && !empty($sync_data['mail_infos'])) { $this->_ci->load->library('KalenderNotificationLib'); $this->_ci->kalendernotificationlib->sendMails($sync_data['mail_infos']); } return success(['synced' => $sync_data['synced']]); } public function sync() { $mail_infos_gesamt = []; $synced_gesamt = 0; $todelete_ids_result = $this->_getManuallySetStatus(array('to_delete', 'to_delete_live', 'to_delete_preview')); if (isError($todelete_ids_result)) return $todelete_ids_result; $todelete_result = $this->_syncKalenderIds(getData($todelete_ids_result), null); if (isError($todelete_result)) return $todelete_result; $todelete_data = getData($todelete_result); $mail_infos_gesamt = array_merge($mail_infos_gesamt, $todelete_data['mail_infos']); $synced_gesamt += $todelete_data['synced']; $preview_ids_result = $this->_getManuallySetStatus(array('sync_preview')); if (isError($preview_ids_result)) return $preview_ids_result; $preview_result = $this->_syncKalenderIds(getData($preview_ids_result), 'preview'); if (isError($preview_result)) return $preview_result; $preview_data = getData($preview_result); $mail_infos_gesamt = array_merge($mail_infos_gesamt, $preview_data['mail_infos']); $synced_gesamt += $preview_data['synced']; $live_ids_result = $this->_getManuallySetStatus(array('sync_live')); if (isError($live_ids_result)) return $live_ids_result; $live_result = $this->_syncKalenderIds(getData($live_ids_result), 'live'); if (isError($live_result)) return $live_result; $live_data = getData($live_result); $mail_infos_gesamt = array_merge($mail_infos_gesamt, $live_data['mail_infos']); $synced_gesamt += $live_data['synced']; if (!empty($mail_infos_gesamt)) { $this->_ci->load->library('KalenderNotificationLib'); $this->_ci->kalendernotificationlib->sendMails($mail_infos_gesamt); } return success(['synced' => $synced_gesamt]); } private function _getManuallySetStatus($status_kurzbz_list) { if (empty($status_kurzbz_list)) return success([]); $this->_ci->KalenderModel->addSelect('tbl_kalender.kalender_id'); $this->_ci->KalenderModel->db->where_in('status_kurzbz', $status_kurzbz_list); $result = $this->_ci->KalenderModel->load(); if (isError($result)) return $result; if (!hasData($result)) return success([]); return success(array_column(getData($result), 'kalender_id')); } public function getKalenderIds($oe_kurzbz, $studiensemester_kurzbz, $status_kurzbz_list, $ausbildungssemester = null, $studienplan_id = null, $datum_bis = null) { if (empty($status_kurzbz_list)) return success([]); $studiengang_result = $this->_getStudiengang($oe_kurzbz); if (isError($studiengang_result)) return $studiengang_result; $studiengang_kz = getData($studiengang_result); if (!hasData($studiengang_result)) { $organisationseinheiten = $this->_ci->OrganisationseinheitModel->getChilds($oe_kurzbz); $oe_kurzbz = hasData($organisationseinheiten) ? array_column(getData($organisationseinheiten), 'oe_kurzbz') : []; } $this->_ci->KalenderModel->addDistinct('tbl_kalender.kalender_id'); $this->_ci->KalenderModel->addSelect('tbl_kalender.kalender_id'); $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'); if (!is_null($studiengang_kz)) { $this->_ci->KalenderModel->db->where('tbl_lehrveranstaltung.studiengang_kz', $studiengang_kz); } else { $this->_ci->KalenderModel->db->where_in('tbl_lehrveranstaltung.oe_kurzbz', $oe_kurzbz); } $this->_ci->KalenderModel->db->where('tbl_lehreinheit.studiensemester_kurzbz', $studiensemester_kurzbz); $this->_ci->KalenderModel->db->where_in('tbl_kalender.status_kurzbz', $status_kurzbz_list); $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); if (!is_null($studienplan_id)) { $this->_ci->KalenderModel->addJoin('lehre.tbl_studienplan_lehrveranstaltung', 'tbl_lehrveranstaltung.lehrveranstaltung_id = tbl_studienplan_lehrveranstaltung.lehrveranstaltung_id'); $this->_ci->KalenderModel->db->where('tbl_studienplan_lehrveranstaltung.studienplan_id', $studienplan_id); } if (!is_null($ausbildungssemester)) $this->_ci->KalenderModel->db->where('tbl_lehrveranstaltung.semester', $ausbildungssemester); if (!is_null($datum_bis)) { $end_date = date('Y-m-d', strtotime($datum_bis . ' +1 day')); $this->_ci->KalenderModel->db->where('tbl_kalender.von <', $end_date); } $result = $this->_ci->KalenderModel->load(); if (isError($result)) return $result; if (!hasData($result)) return success([]); return success(array_column(getData($result), 'kalender_id')); } private function _archiveVorgaenger($vorgaenger_kalender_id, $stop_at_live = false) { $return_array = array(); if (!$vorgaenger_kalender_id) return success($return_array); $current_id = $vorgaenger_kalender_id; while ($current_id) { $vorgaenger = $this->_ci->KalenderModel->load(array('kalender_id' => $current_id)); if (!hasData($vorgaenger)) return success($return_array); $vorgaenger = getData($vorgaenger)[0]; if ($stop_at_live && $vorgaenger->status_kurzbz === 'live') return success($return_array); if (in_array($vorgaenger->status_kurzbz, array('preview', 'live'))) { $this->_ci->KalenderModel->update( array('kalender_id' => $current_id), array('status_kurzbz' => 'archived', 'status_kurzbz_max' => $vorgaenger->status_kurzbz) ); $return_array[] = $vorgaenger; } $current_id = $vorgaenger->vorgaenger_kalender_id; } return success($return_array); } private function _syncKalenderIds($kalender_ids, $ziel_status) { if (empty($kalender_ids)) return success(['synced' => 0, 'mail_infos' => []]); $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('tbl_kalender.kalender_id', $kalender_ids); $this->_ci->KalenderModel->addOrder('tbl_kalender.kalender_id', 'DESC'); $to_update = $this->_ci->KalenderModel->load(); if (isError($to_update)) return $to_update; if (!hasData($to_update)) return success(['synced' => 0, 'mail_infos' => []]); $mail_infos = []; $synced = 0; foreach (getData($to_update) as $entry) { if (in_array($entry->status_kurzbz, array('to_delete', 'to_delete_live', 'to_delete_preview'))) { $notify = array(); if ($entry->status_kurzbz === 'to_delete_live') { $status_max = 'live'; $notify = array('lektor', 'student'); } else if ($entry->status_kurzbz === 'to_delete_preview') { $status_max = 'preview'; $notify = array('lektor'); } else if ($entry->status_kurzbz === 'to_delete') { $status_max = 'planning'; } $this->_ci->KalenderModel->update(array('kalender_id' => $entry->kalender_id), array('status_kurzbz' => 'deleted', 'status_kurzbz_max' => $status_max)); $mail_infos[] = array('entry' => $entry, 'new_status' => 'deleted', 'notify' => $notify); $vorgaenger_array = $this->_archiveVorgaenger($entry->vorgaenger_kalender_id); if (hasData($vorgaenger_array)) { foreach(getData($vorgaenger_array) as $vorgaenger) { $archive_notify = array(); if ($vorgaenger->status_kurzbz === 'preview') $archive_notify = array('lektor'); else if ($vorgaenger->status_kurzbz === 'live') { $archive_notify = array('student', 'lektor'); $history = $this->_ci->kalenderlib->getHistory($vorgaenger->kalender_id, false, false); if (hasData($history)) { $history = getData($history); foreach ($history as $entry) { if ($entry->status_kurzbz === 'deleted' && $entry->status_kurzbz_max === 'preview') { $archive_notify = array('student'); break; } } } } $mail_infos[] = array('entry' => $vorgaenger, 'new_status' => 'deleted', 'notify' => $archive_notify); } } $synced++; continue; } if ($ziel_status === 'preview' && in_array($entry->status_kurzbz, array('planning', 'sync_preview'))) { $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')); $synced++; continue; } if ($ziel_status === 'live' && in_array($entry->status_kurzbz, array('planning', 'sync_preview', 'sync_live'))) { $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')); $synced++; continue; } if ($ziel_status === 'live' && $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' => 'live')); $this->_archiveVorgaenger($entry->vorgaenger_kalender_id, false); $mail_infos[] = array('entry' => $entry, 'new_status' => 'live', 'notify' => array('lektor', 'student')); $synced++; } } return success(['synced' => $synced, 'mail_infos' => $mail_infos]); } private function _getStudiengang($oe_kurzbz) { $this->_ci->StudiengangModel->addJoin('tbl_organisationseinheit', 'oe_kurzbz'); $result = $this->_ci->StudiengangModel->loadWhere(array('oe_kurzbz' => $oe_kurzbz)); if (isError($result)) return $result; if (!hasData($result)) return success(null); return success(getData($result)[0]->studiengang_kz); } }