From 4a01198e10c86bf2f49fdcf38f60ab5cb4270f9d Mon Sep 17 00:00:00 2001 From: SimonGschnell Date: Fri, 28 Feb 2025 14:52:02 +0100 Subject: [PATCH] refactor(Stundenplan Endpoint):puts methods used to fetch Stundenplan and Reservierungs Events in its own library and dynamically merges the moodle events if plugin is present --- .../api/frontend/v1/Stundenplan.php | 568 +++--------------- application/libraries/StundenplanLib.php | 558 +++++++++++++++++ public/js/api/stundenplan.js | 16 +- .../components/Cis/Stundenplan/Stundenplan.js | 61 +- .../components/DashboardWidget/Stundenplan.js | 60 +- 5 files changed, 647 insertions(+), 616 deletions(-) create mode 100644 application/libraries/StundenplanLib.php diff --git a/application/controllers/api/frontend/v1/Stundenplan.php b/application/controllers/api/frontend/v1/Stundenplan.php index 4abff559c..c53af8e3c 100644 --- a/application/controllers/api/frontend/v1/Stundenplan.php +++ b/application/controllers/api/frontend/v1/Stundenplan.php @@ -30,11 +30,10 @@ class Stundenplan extends FHCAPI_Controller { parent::__construct([ - 'fetchMoodleEvents' => self::PERM_LOGGED, 'getRoomplan' => self::PERM_LOGGED, 'Stunden' => self::PERM_LOGGED, 'Reservierungen' => self::PERM_LOGGED, - 'getStundenplan' => self::PERM_LOGGED, + 'StundenplanEvents' => self::PERM_LOGGED, 'getLehreinheitStudiensemester' => self::PERM_LOGGED, 'studiensemesterDateInterval' => self::PERM_LOGGED, ]); @@ -60,19 +59,83 @@ class Stundenplan extends FHCAPI_Controller //------------------------------------------------------------------------------------------------------------------ // Public methods - public function fetchMoodleEvents(){ - $this->load->library('form_validation'); - $this->form_validation->set_data($_GET); - $this->form_validation->set_rules('timestart',"timestart","required"); - $this->form_validation->set_rules('timeend',"timeend","required"); - if($this->form_validation->run() === FALSE) $this->terminateWithValidationErrors($this->form_validation->error_array()); + /** + * fetches Stundenplan and Moodle events together + * @access public + * + */ + public function StundenplanEvents(){ + $this->load->library('StundenplanLib'); - $timestart = intval($this->input->get('timestart', TRUE)); - $timeend = intval($this->input->get('timeend', TRUE)); + // form validation + $this->load->library('form_validation'); + $this->form_validation->set_data($_GET); + $this->form_validation->set_rules('start_date', "start_date", "required"); + $this->form_validation->set_rules('end_date', "end_date", "required"); + if ($this->form_validation->run() === FALSE) + $this->terminateWithValidationErrors($this->form_validation->error_array()); + + // storing the get parameter in local variables + $start_date = $this->input->get('start_date', TRUE); + $end_date = $this->input->get('end_date', TRUE); + $lv_id = $this->input->get('lv_id', TRUE); + + $stundenplan_events = $this->stundenplanlib->getStundenplan($start_date,$end_date,$lv_id); + $stundenplan_events = $this->getDataOrTerminateWithError($stundenplan_events); + + // fetching moodle events + $moodle_start_date = new DateTime($start_date); + $moodle_start_date = $moodle_start_date->getTimestamp(); + $moodle_end_date = new DateTime($end_date); + $moodle_end_date = $moodle_end_date->getTimestamp(); + $moodle_events = []; Events::trigger('moodleCalendarEvents', - ['timestart'=>$timestart,'timeend'=>$timeend, 'username'=>getAuthUID()] + function & () use (&$moodle_events) { + return $moodle_events; + }, + ['timestart'=>$moodle_start_date,'timeend'=>$moodle_end_date, 'username'=>getAuthUID()] ); - $this->terminateWithSuccess(json_decode(ob_get_contents())); + + $moodle_events = array_map(function($event){ + $moodle_event_timestart = new DateTime($event->timestart); + $moodle_event_timeend = new DateTime($event->timeend); + $convertedEvent = new stdClass(); + $convertedEvent->type = 'moodle'; + $convertedEvent->beginn = $moodle_event_timestart->format('H:i:s'); + $convertedEvent->ende = $moodle_event_timeend->format('H:i:s'); + $convertedEvent->allDayEvent = true; + $convertedEvent->datum = $moodle_event_timestart->format('Y-n-j'); + $convertedEvent->purpose = $event->purpose; + $convertedEvent->assignment = $event->activityname; + $convertedEvent->topic = $event->activitystr; + $convertedEvent->lektor = []; + $convertedEvent->gruppe = []; + $convertedEvent->ort_kurzbz = $event->location; + $convertedEvent->lehreinheit_id = $event->lehreinheitsNummber ?? null; + $convertedEvent->titel = $event->course->fullname; + $convertedEvent->lehrfach = ''; + $convertedEvent->lehrform = ''; + $convertedEvent->lehrfach_bez = ''; + $convertedEvent->organisationseinheit = ''; + $convertedEvent->farbe = '00689E'; + $convertedEvent->lehrveranstaltung_id = 0; + $convertedEvent->ort_content_id = 0; + $convertedEvent->url = $event->url; + return $convertedEvent; + },$moodle_events); + + $result = array_merge($stundenplan_events,$moodle_events); + // sort array with moodle events first + usort($result, function($a, $b){ + if ($a->type === 'moodle' && $b->type !== 'moodle') { + return -1; + } elseif ($a->type !== 'moodle' && $b->type === 'moodle') { + return 1; + } else { + return 0; + } + }); + $this->terminateWithSuccess($result); } //TODO: delete this function if we don't use the old calendar export endpoints anymore @@ -129,90 +192,7 @@ class Stundenplan extends FHCAPI_Controller $this->terminateWithSuccess($roomplan_data); } - - /** - * fetches stundenplan events from a UID and start/end date - * @access public - * - */ - - public function getStundenplan(){ - - $this->load->model('ressource/Mitarbeiter_model','MitarbeiterModel'); - $this->load->model('organisation/Studiensemester_model','StudiensemesterModel'); - $this->load->model('education/Studentlehrverband_model', 'StudentlehrverbandModel'); - $this->load->model('person/Benutzergruppe_model','BenutzergruppeModel'); - - // form validation - $this->load->library('form_validation'); - $this->form_validation->set_data($_GET); - $this->form_validation->set_rules('start_date', "start_date", "required"); - $this->form_validation->set_rules('end_date', "end_date", "required"); - if ($this->form_validation->run() === FALSE) - $this->terminateWithValidationErrors($this->form_validation->error_array()); - - // storing the get parameter in local variables - $start_date = $this->input->get('start_date', TRUE); - $end_date = $this->input->get('end_date', TRUE); - $lv_id = $this->input->get('lv_id', TRUE); - - $student_uid = getAuthUID(); - if(is_null($student_uid)) - { - $this->terminateWithError("No UID"); - } - - $semester_range = $this->studienSemesterErmitteln($start_date,$end_date); - $this->sortStudienSemester($semester_range); - $this->applyLoadUeberSemesterHaelfte($semester_range); - - if($lv_id) { // fetch Stundenplan for lva, irrelevant of who is requesting it (for now) - - $stundenplan_data = $this->StundenplanModel->getStundenplanLVA($start_date, $end_date, $lv_id); - $stundenplan_data = $this->getDataOrTerminateWithError($stundenplan_data) ?? []; - $this->expand_object_information($stundenplan_data); - - // query lv itself in case its Stundenplan is being queried and it has no entries - $this->load->model('education/Lehrveranstaltung_model','LehrveranstaltungModel'); - $lv = getData($this->LehrveranstaltungModel->load($lv_id))[0]; - $this->addMeta('lv', $lv); - $this->terminateWithSuccess($stundenplan_data); - - } - - $is_mitarbeiter = getData($this->MitarbeiterModel->isMitarbeiter($student_uid)); - if($is_mitarbeiter) - { - - $stundenplan_data = $this->StundenplanModel->getStundenplanMitarbeiter($start_date, $end_date, $student_uid); - $stundenplan_data = $this->getDataOrTerminateWithError($stundenplan_data) ?? []; - $this->expand_object_information($stundenplan_data); - $this->terminateWithSuccess($stundenplan_data); - } else { - // getting the gruppen_kurzbz of the student in the different studiensemester - $benutzer_gruppen = $this->fetchBenutzerGruppenFromStudiensemester($semester_range); - - // getting the student_lehrverbaende of the student in the different studiensemester - $student_lehrverband = $this->fetchStudentlehrverbandFromStudiensemester($semester_range); - - $stundenplan_query = $this->StundenplanModel->getStundenplanQuery($start_date, $end_date, $semester_range, $benutzer_gruppen, $student_lehrverband); - if(!$stundenplan_query) - { - $this->terminateWithSuccess([]); - } - $stundenplan_data = $this->StundenplanModel->stundenplanGruppierung($stundenplan_query); - $stundenplan_data = $this->getDataOrTerminateWithError($stundenplan_data) ?? []; - - $this->expand_object_information($stundenplan_data); - - $this->returnObj['$stundenplan_query'] = $stundenplan_query; - $this->returnObj['$student_lehrverband'] = $student_lehrverband; - $this->returnObj['$benutzer_gruppen'] = $benutzer_gruppen; - $this->terminateWithSuccess($stundenplan_data); - } - - } - + // gets the reservierungen of a room if the ort_kurzbz parameter is supplied otherwise gets the reservierungen of the stundenplan of a student public function Reservierungen($ort_kurzbz = null) { @@ -229,19 +209,10 @@ class Stundenplan extends FHCAPI_Controller $start_date = $this->input->get('start_date', TRUE); $end_date = $this->input->get('end_date', TRUE); - $is_mitarbeiter = getData($this->MitarbeiterModel->isMitarbeiter(getAuthUID())); - if($is_mitarbeiter) - { - $reservierungen = $this->ReservierungModel->getReservierungenMitarbeiter($start_date, $end_date, $ort_kurzbz); - } else { - // querying the reservierungen - $reservierungen = $this->ReservierungModel->getReservierungen($start_date, $end_date, $ort_kurzbz); - } - - $reservierungen = $this->getDataOrTerminateWithError($reservierungen) ?? []; - $this->expand_object_information($reservierungen); - $this->terminateWithSuccess($reservierungen); - + $this->load->library('StundenplanLib'); + $result = $this->stundenplanlib->getReservierungen($start_date,$end_date,$ort_kurzbz); + $result = $this->getDataOrTerminateWithError($result); + $this->terminateWithSuccess($result); } public function getLehreinheitStudiensemester($lehreinheit_id){ @@ -252,385 +223,6 @@ class Stundenplan extends FHCAPI_Controller $this->terminateWithSuccess($result); } - // ################# Private Functions - - private function expand_object_information($data){ - - foreach ($data as $item) - { - - $lektor_obj_array = array(); - $gruppe_obj_array = array(); - - // load lektor object - foreach ($item->lektor as $lv_lektor) - { - $this->StundenplanModel->addLimit(1); - $lektor_object = $this->StundenplanModel->execReadOnlyQuery(" - SELECT mitarbeiter_uid, vorname, nachname, kurzbz - FROM public.tbl_mitarbeiter - JOIN public.tbl_benutzer benutzer ON benutzer.uid = mitarbeiter_uid - JOIN public.tbl_person person ON person.person_id = benutzer.person_id - WHERE kurzbz = ?", [$lv_lektor]); - if (isError($lektor_object)) { - $this->show_error(getError($lektor_object)); - } - $lektor_object = $this->getDataOrTerminateWithError($lektor_object); - if(count($lektor_object) == 0) - { - $this->terminateWithError("No lektor object"); - } - $lektor_object = current($lektor_object); - // only provide needed information of the mitarbeiter object - $lektor_obj_array[] = $lektor_object; - } - - // load gruppe object - foreach ($item->gruppe as $lv_gruppe) - { - $lv_gruppe = strtr($lv_gruppe, ['(' => '', ')' => '', '"' => '']); - $lv_gruppe_array = explode(",", $lv_gruppe); - list($gruppe, $verband, $semester, $studiengang_kz, $gruppen_kuerzel) = $lv_gruppe_array; - - $lv_gruppe_object = new stdClass(); - $lv_gruppe_object->gruppe = $gruppe; - $lv_gruppe_object->verband = $verband; - $lv_gruppe_object->semester = $semester; - $lv_gruppe_object->studiengang_kz = $studiengang_kz; - $lv_gruppe_object->kuerzel = $gruppen_kuerzel; - - $gruppe_obj_array[] = $lv_gruppe_object; - } - - if($item->ort_kurzbz) { - - $ort_content_object = $this->StundenplanModel->execReadOnlyQuery(" - SELECT content_id - FROM public.tbl_ort - WHERE ort_kurzbz = ?", [$item->ort_kurzbz]); - if (isError($ort_content_object)) { - $this->show_error(getError($ort_content_object)); - } - $ort_content_object = getData($ort_content_object)[0]; - if($ort_content_object) { - $item->ort_content_id = $ort_content_object->content_id; - } - - - } - - $item->gruppe = $gruppe_obj_array; - $item->lektor = $lektor_obj_array; - - } - } - - // function used to sort an array of studiensemester strings - private function sortStudienSemester(&$semester_range){ - usort( - $semester_range, - function($first,$second) - { - $sem_first = null; - $year_first = null; - $match_first = null; - - $sem_second = null; - $year_second = null; - $match_second = null; - - preg_match('/([WS]+)([0-9]+)/',$first,$match_first); - preg_match('/([WS]+)([0-9]+)/',$second,$match_second); - - $sem_first = $match_first[1]; - $year_first = intval($match_first[2]); - - $sem_second = $match_second[1]; - $year_second = intval($match_second[2]); - - if($year_first < $year_second) - { - return -1; - } - else if($year_first > $year_second) - { - return 1; - } - else if($year_first == $year_second && $sem_first > $sem_second) - { - return 1; - } - else if($year_first == $year_second && $sem_first < $sem_second) - { - return -1; - } - return 0; - } - ); - } - - private function fetchBenutzerGruppenFromStudiensemester($semester_range){ - $student_uid = getAuthUID(); - $benutzer_gruppen = []; - // for each studiensemester fetch the benutzer gruppen and add them to an associate $bentuzer_gruppen array - /* - [ - ['WS2023'] => [['gruppe1_SS2023','gruppe2_SS2023'],['gruppe1_WS2023','gruppe2_WS2023']], - ['SS2024'] => [['gruppe1_WS2023','gruppe2_WS2023'],['gruppe1_SS2024','gruppe2_SS2024']], - ['WS2024'] => [['gruppe1_SS2024','gruppe2_SS2024'],['gruppe1_WS2024','gruppe2_WS2024']], - ] - */ - foreach($semester_range as $semester_key => $semester_array) - { - $benutzer_gruppen[$semester_key] = []; - // each semester could have ajoint semesters that need to be checked - foreach($semester_array as $semester=>$semester_date_range) - { - // for each active semester query the benutzer_gruppen associated to the semester - $benutzer_query = $this->BenutzergruppeModel->execReadOnlyQuery(" - SELECT * FROM tbl_benutzergruppe where uid = ? AND studiensemester_kurzbz = ?",[$student_uid, $semester]); - $benutzer_query_result = $this->getDataOrTerminateWithError($benutzer_query); - array_push( - $benutzer_gruppen[$semester_key], - array_map( - function($item) - { - return "'".$item->gruppe_kurzbz. "'"; - }, - $benutzer_query_result - ) - ); - } - } - - // merge the gruppen of each studiensemester together for the original studiensemester - /* - [ - ['WS2023'] => ['gruppe1_SS2023','gruppe2_SS2023','gruppe1_WS2023','gruppe2_WS2023'], - ['SS2024'] => ['gruppe1_WS2023','gruppe2_WS2023','gruppe1_SS2024','gruppe2_SS2024'], - ['WS2024'] => ['gruppe1_SS2024','gruppe2_SS2024','gruppe1_WS2024','gruppe2_WS2024'], - ] - */ - $benutzer_gruppen = array_map( - function($gruppe) - { - $merged_gruppe = []; - foreach($gruppe as $gruppen_array) - { - $merged_gruppe = array_merge($merged_gruppe, $gruppen_array); - } - return $merged_gruppe; - }, - $benutzer_gruppen - ); - - return $benutzer_gruppen; - } - - private function fetchStudentlehrverbandFromStudiensemester($semester_range){ - $student_uid = getAuthUID(); - $student_lehrverband = []; - // for each studiensemester fetch the studentlehrverbaende and add them to an associate $student_lehrverband array - /* - [ - ['WS2023'] => [ [ ['stg_kz'=>298,'semester'=>1,'verband'=>"A",'gruppe'=>""] ] ], - ['SS2024'] => [ [ ['stg_kz'=>298,'semester'=>1,'verband'=>"A",'gruppe'=>""] ], [ ['stg_kz'=>298,'semester'=>2,'verband'=>"A",'gruppe'=>""] ] ], - ['WS2024'] => [ [ ['stg_kz'=>298,'semester'=>2,'verband'=>"A",'gruppe'=>""] ], [ ['stg_kz'=>298,'semester'=>3,'verband'=>"A",'gruppe'=>""] ] ], - ] - */ - foreach($semester_range as $semester_key => $semester_array) - { - $student_lehrverband[$semester_key] = []; - foreach($semester_array as $semester=>$semester_date_range) - { - // for each active semester query the student_lehrverband associated to the semester - $lehrverband_query = $this->BenutzergruppeModel->execReadOnlyQuery(" - SELECT * FROM tbl_studentlehrverband where student_uid = ? AND studiensemester_kurzbz = ?", [$student_uid, $semester]); - $lehrverband_query_result = $this->getDataOrTerminateWithError($lehrverband_query); - array_push($student_lehrverband[$semester_key], array_map( - function ($item) - { - $result = new stdClass(); - $result->studiengang_kz = $item->studiengang_kz; - $result->semester = $item->semester; - $result->verband = $item->verband; - $result->gruppe = $item->gruppe; - return $result; - }, - $lehrverband_query_result)); - } - } - - // merge the studentlehrverband of each studiensemester together for the original studiensemester - /* - [ - ['WS2023'] => [ ['stg_kz'=>298,'semester'=>1,'verband'=>"A",'gruppe'=>""] ], - ['SS2024'] => [ ['stg_kz'=>298,'semester'=>1,'verband'=>"A",'gruppe'=>""], ['stg_kz'=>298,'semester'=>2,'verband'=>"A",'gruppe'=>""] ], - ['WS2024'] => [ ['stg_kz'=>298,'semester'=>2,'verband'=>"A",'gruppe'=>""], ['stg_kz'=>298,'semester'=>3,'verband'=>"A",'gruppe'=>""] ], - ] - */ - $student_lehrverband = array_map( - function($studentlehrverband) - { - $merged_studentlehrverband = []; - foreach($studentlehrverband as $studentlehrverband_array) - { - $merged_studentlehrverband = array_merge($merged_studentlehrverband, $studentlehrverband_array); - } - return $merged_studentlehrverband; - }, - $student_lehrverband - ); - - return $student_lehrverband; - } - - private function applyLoadUeberSemesterHaelfte(&$semester_range){ - /* - @var($semester_collection) - convert the array of studiensemester into an associative array with the studiensemester as the key - and the values of each key are the studiensemester needed for the query associated to that studiensemester - example: - - #INPUT: - ['WS2023','SS2024','WS2024'] - #OUTPUT: - [ - 'WS2023' => ['SS2023','WS2023'] - 'SS2024' => ['WS2023','SS2024'] - 'WS2024' => ['SS2024','WS2024'] - ] - */ - $semester_collection = []; - foreach($semester_range as $studiensemester) - { - $previous_studiensemester = $this->StudiensemesterModel->getPreviousFrom($studiensemester); - $previous_studiensemester = $this->getDataOrTerminateWithError($previous_studiensemester); - if (count($previous_studiensemester) == 0) { - $this->terminateWithError("No previous semester"); - } - $previous_studiensemester = current($previous_studiensemester)->studiensemester_kurzbz; - $semester_collection[$studiensemester] = [$previous_studiensemester, $studiensemester]; - } - - /* - @var($studienSemesterDateRanges) - fetches for each studiensemester the start and end date, (SS) summer studiensemester are extended by 1 month to cover the summerbreak - based on the LVPLAN_LOAD_UEBER_SEMESTERHAELFTE constant it will load both the semester and the previous semester with the full date range - or the semester with the full date range and the previous semester with the half date range: - - #INPUT: - [ - 'WS2023' => ['SS2023','WS2023'] - 'SS2024' => ['WS2023','SS2024'] - 'WS2024' => ['SS2024','WS2024'] - ] - #OUTPUT: depends whether LVPLAN_LOAD_UEBER_SEMESTERHAELFTE is true or false - ~ if LVPLAN_LOAD_UEBER_SEMESTERHAELFTE == true - [ - "SS2024": [ - "WS2023": [ - "start"=> "2024-02-03", - "ende"=> "2024-08-31" - ], - "SS2024": [ - "start"=> "2024-02-03", - "ende"=> "2024-08-31" - ] - ] - ] - ~ if LVPLAN_LOAD_UEBER_SEMESTERHAELFTE == false - [ - "SS2024": [ - "WS2023": [ - "start"=> "2024-02-03", - "ende"=> "2024-05-17" - ], - "SS2024": [ - "start"=> "2024-02-03", - "ende"=> "2024-08-31" - ] - ] - ] - */ - $studienSemesterDateRanges=[]; - foreach($semester_collection as $semester_original => $semester_adjoint) - { - $semester_start_ende = $this->StudiensemesterModel->getStartEndeFromStudiensemester($semester_original); - $semester_start_ende = current($this->getDataOrTerminateWithError($semester_start_ende)); - - // initialize empty arrays to add key value pairs - $studienSemesterDateRanges[$semester_original] = []; - - // check if the studiensemester is a summer semester and add 1 month to bridge the school summer break - $match = null; - preg_match("/^(SS)([0-9]+)/",$semester_original,$match); - if(count($match) >0) - { - $one_month = new DateInterval('P1M'); - $one_day = DateInterval::createFromDateString('1 days'); - $summer_studiensemester_end_date = DateTime::createFromFormat('Y-m-d',$semester_start_ende->ende); - $summer_studiensemester_end_date->add($one_month); - $summer_studiensemester_end_date->sub($one_day); - $semester_start_ende->ende = date_format($summer_studiensemester_end_date,'Y-m-d'); - } - if (defined('LVPLAN_LOAD_UEBER_SEMESTERHAELFTE') && LVPLAN_LOAD_UEBER_SEMESTERHAELFTE === true) - { - foreach($semester_adjoint as $adjoint) - { - $studienSemesterDateRanges[$semester_original][$adjoint]=$semester_start_ende; - } - } - else - { - //TODO: half of a DateInterval might not be correctly calculated - // calculate the half of the studiensemester - $studiensemester_start_date = DateTime::createFromFormat('Y-m-d',$semester_start_ende->start); - $studiensemester_end_date = DateTime::createFromFormat('Y-m-d',$semester_start_ende->ende); - $studiensemester_time_difference = $studiensemester_start_date->diff($studiensemester_end_date); - $half_dateNumber = ceil($studiensemester_time_difference->d/2)+ceil(($studiensemester_time_difference->m*30)/2); - $half_dateInterval = new DateInterval('P'.strval($half_dateNumber) .'D'); - $studiensemester_half = date_format($studiensemester_start_date->add($half_dateInterval),'Y-m-d'); - - $first_half = new stdClass(); - $first_half->start = $semester_start_ende->start; - $first_half->ende = $studiensemester_half; - - $studienSemesterDateRanges[$semester_original][$semester_adjoint[0]] = $first_half; - $studienSemesterDateRanges[$semester_original][$semester_adjoint[1]] = $semester_start_ende; - } - $semester_range = $studienSemesterDateRanges; - } - } - - private function studienSemesterErmitteln($start_date,$end_date){ - - // gets all studiensemester from the student from start_date to end_date - $semester_range = $this->StudiensemesterModel->getByDateRange($start_date,$end_date); - $semester_range = array_map( - function($sem) - { - return $sem->studiensemester_kurzbz; - }, - $this->getDataOrTerminateWithError($semester_range) - ); - - // if no studiensemester is found for the given timespan, get the nearest studiensemester - if(count($semester_range) == 0) - { - $aktuelle_studiensemester = $this->StudiensemesterModel->getNearest(); - $aktuelle_studiensemester = $this->getDataOrTerminateWithError($aktuelle_studiensemester); - if (count($aktuelle_studiensemester) == 0) { - $this->terminateWithError("No aktuelles semester"); - } - $aktuelle_studiensemester = current($aktuelle_studiensemester)->studiensemester_kurzbz; - // push aktuelles semester in active semester array - array_push($semester_range, $aktuelle_studiensemester); - - } - return $semester_range; - } - } diff --git a/application/libraries/StundenplanLib.php b/application/libraries/StundenplanLib.php new file mode 100644 index 000000000..5a741e10c --- /dev/null +++ b/application/libraries/StundenplanLib.php @@ -0,0 +1,558 @@ +_ci =& get_instance(); + + $this->_ci->load->model('ressource/Mitarbeiter_model','MitarbeiterModel'); + $this->_ci->load->model('organisation/Studiensemester_model','StudiensemesterModel'); + $this->_ci->load->model('education/Studentlehrverband_model', 'StudentlehrverbandModel'); + $this->_ci->load->model('person/Benutzergruppe_model','BenutzergruppeModel'); + + $student_uid = getAuthUID(); + if(is_null($student_uid)) + { + return error("No UID"); + } + + $semester_range = $this->studienSemesterErmitteln($start_date,$end_date); + if(isError($semester_range)) + { + return error(getData($semester_range)); + } + $semester_range = getData($semester_range); + $this->sortStudienSemester($semester_range); + $function_error = $this->applyLoadUeberSemesterHaelfte($semester_range); + if(!is_null($function_error)){ + return $function_error; + } + + if($lv_id) { // fetch Stundenplan for lva, irrelevant of who is requesting it (for now) + + $stundenplan_data = $this->_ci->StundenplanModel->getStundenplanLVA($start_date, $end_date, $lv_id); + if(isError($stundenplan_data)) + { + return error(getData($stundenplan_data)); + } + $stundenplan_data = getData($stundenplan_data) ?? []; + $function_error = $this->expand_object_information($stundenplan_data); + if(!is_null($function_error)){ + return $function_error; + } + + // query lv itself in case its Stundenplan is being queried and it has no entries + $this->_ci->load->model('education/Lehrveranstaltung_model','LehrveranstaltungModel'); + $lv_result = $this->LehrveranstaltungModel->load($lv_id); + if(isError($lv_result)) + { + return error(getData($lv_result)); + } + $lv = getData($lv_result)[0]; + return $stundenplan_data; + + } + + $is_mitarbeiter = getData($this->_ci->MitarbeiterModel->isMitarbeiter($student_uid)); + if($is_mitarbeiter) + { + + $stundenplan_data = $this->_ci->StundenplanModel->getStundenplanMitarbeiter($start_date, $end_date, $student_uid); + if(isError($stundenplan_data)) + { + return error(getData($stundenplan_data)); + } + $stundenplan_data = getData($stundenplan_data) ?? []; + $function_error = $this->expand_object_information($stundenplan_data); + if(!is_null($function_error)){ + return $function_error; + } + return $stundenplan_data; + } else { + // getting the gruppen_kurzbz of the student in the different studiensemester + $benutzer_gruppen = $this->fetchBenutzerGruppenFromStudiensemester($semester_range); + if(isError($benutzer_gruppen)) + { + return error(getData($benutzer_gruppen)); + } + $benutzer_gruppen = getData($benutzer_gruppen); + + // getting the student_lehrverbaende of the student in the different studiensemester + $student_lehrverband = $this->fetchStudentlehrverbandFromStudiensemester($semester_range); + if(isError($student_lehrverband)) + { + return error(getData($student_lehrverband)); + } + $student_lehrverband = getData($student_lehrverband); + + $stundenplan_query = $this->_ci->StundenplanModel->getStundenplanQuery($start_date, $end_date, $semester_range, $benutzer_gruppen, $student_lehrverband); + if(!$stundenplan_query) + { + return []; + } + + + $stundenplan_data = $this->_ci->StundenplanModel->stundenplanGruppierung($stundenplan_query); + if(isError($stundenplan_data)) + { + return error(getData($stundenplan_data)); + } + $stundenplan_data = getData($stundenplan_data) ?? []; + + $function_error = $this->expand_object_information($stundenplan_data); + if(!is_null($function_error)){ + return $function_error; + } + + return success($stundenplan_data); + } + + } + + public function getReservierungen($start_date, $end_date, $ort_kurzbz){ + $this->_ci =& get_instance(); + $is_mitarbeiter = getData($this->_ci->MitarbeiterModel->isMitarbeiter(getAuthUID())); + if($is_mitarbeiter) + { + $reservierungen = $this->_ci->ReservierungModel->getReservierungenMitarbeiter($start_date, $end_date, $ort_kurzbz); + } else { + // querying the reservierungen + $reservierungen = $this->_ci->ReservierungModel->getReservierungen($start_date, $end_date, $ort_kurzbz); + } + if(isError($reservierungen)) + { + return error(getData($reservierungen)); + } + $reservierungen = getData($reservierungen) ?? []; + $function_error = $this->expand_object_information($reservierungen); + if(!is_null($function_error)){ + return $function_error; + } + return success($reservierungen); + } + + + private function expand_object_information($data){ + + foreach ($data as $item) + { + + $lektor_obj_array = array(); + $gruppe_obj_array = array(); + + // load lektor object + foreach ($item->lektor as $lv_lektor) + { + $this->_ci->StundenplanModel->addLimit(1); + $lektor_object = $this->_ci->StundenplanModel->execReadOnlyQuery(" + SELECT mitarbeiter_uid, vorname, nachname, kurzbz + FROM public.tbl_mitarbeiter + JOIN public.tbl_benutzer benutzer ON benutzer.uid = mitarbeiter_uid + JOIN public.tbl_person person ON person.person_id = benutzer.person_id + WHERE kurzbz = ?", [$lv_lektor]); + if (isError($lektor_object)) { + $this->_ci->show_error(getError($lektor_object)); + } + if(isError($lektor_object)) + { + return error(getData($lektor_object)); + } + $lektor_object = getData($lektor_object); + if(count($lektor_object) == 0) + { + return error("No lektor object"); + } + $lektor_object = current($lektor_object); + // only provide needed information of the mitarbeiter object + $lektor_obj_array[] = $lektor_object; + } + + // load gruppe object + foreach ($item->gruppe as $lv_gruppe) + { + $lv_gruppe = strtr($lv_gruppe, ['(' => '', ')' => '', '"' => '']); + $lv_gruppe_array = explode(",", $lv_gruppe); + list($gruppe, $verband, $semester, $studiengang_kz, $gruppen_kuerzel) = $lv_gruppe_array; + + $lv_gruppe_object = new stdClass(); + $lv_gruppe_object->gruppe = $gruppe; + $lv_gruppe_object->verband = $verband; + $lv_gruppe_object->semester = $semester; + $lv_gruppe_object->studiengang_kz = $studiengang_kz; + $lv_gruppe_object->kuerzel = $gruppen_kuerzel; + + $gruppe_obj_array[] = $lv_gruppe_object; + } + + if($item->ort_kurzbz) { + + $ort_content_object = $this->_ci->StundenplanModel->execReadOnlyQuery(" + SELECT content_id + FROM public.tbl_ort + WHERE ort_kurzbz = ?", [$item->ort_kurzbz]); + if (isError($ort_content_object)) { + return error(getData($ort_content_object)); + } + $ort_content_object = getData($ort_content_object)[0]; + if($ort_content_object) { + $item->ort_content_id = $ort_content_object->content_id; + } + + + } + + $item->gruppe = $gruppe_obj_array; + $item->lektor = $lektor_obj_array; + + } + } + + // function used to sort an array of studiensemester strings + private function sortStudienSemester(&$semester_range){ + usort( + $semester_range, + function($first,$second) + { + $sem_first = null; + $year_first = null; + $match_first = null; + + $sem_second = null; + $year_second = null; + $match_second = null; + + preg_match('/([WS]+)([0-9]+)/',$first,$match_first); + preg_match('/([WS]+)([0-9]+)/',$second,$match_second); + + $sem_first = $match_first[1]; + $year_first = intval($match_first[2]); + + $sem_second = $match_second[1]; + $year_second = intval($match_second[2]); + + if($year_first < $year_second) + { + return -1; + } + else if($year_first > $year_second) + { + return 1; + } + else if($year_first == $year_second && $sem_first > $sem_second) + { + return 1; + } + else if($year_first == $year_second && $sem_first < $sem_second) + { + return -1; + } + return 0; + } + ); + } + + + + private function fetchBenutzerGruppenFromStudiensemester($semester_range){ + $student_uid = getAuthUID(); + $benutzer_gruppen = []; + // for each studiensemester fetch the benutzer gruppen and add them to an associate $bentuzer_gruppen array + /* + [ + ['WS2023'] => [['gruppe1_SS2023','gruppe2_SS2023'],['gruppe1_WS2023','gruppe2_WS2023']], + ['SS2024'] => [['gruppe1_WS2023','gruppe2_WS2023'],['gruppe1_SS2024','gruppe2_SS2024']], + ['WS2024'] => [['gruppe1_SS2024','gruppe2_SS2024'],['gruppe1_WS2024','gruppe2_WS2024']], + ] + */ + foreach($semester_range as $semester_key => $semester_array) + { + $benutzer_gruppen[$semester_key] = []; + // each semester could have ajoint semesters that need to be checked + foreach($semester_array as $semester=>$semester_date_range) + { + // for each active semester query the benutzer_gruppen associated to the semester + $benutzer_query = $this->_ci->BenutzergruppeModel->execReadOnlyQuery(" + SELECT * FROM tbl_benutzergruppe where uid = ? AND studiensemester_kurzbz = ?",[$student_uid, $semester]); + if(isError($benutzer_query)){ + return error(getData($benutzer_query)); + } + $benutzer_query_result = getData($benutzer_query)??[]; + + array_push( + $benutzer_gruppen[$semester_key], + array_map( + function($item) + { + return "'".$item->gruppe_kurzbz. "'"; + }, + $benutzer_query_result + ) + ); + } + } + + // merge the gruppen of each studiensemester together for the original studiensemester + /* + [ + ['WS2023'] => ['gruppe1_SS2023','gruppe2_SS2023','gruppe1_WS2023','gruppe2_WS2023'], + ['SS2024'] => ['gruppe1_WS2023','gruppe2_WS2023','gruppe1_SS2024','gruppe2_SS2024'], + ['WS2024'] => ['gruppe1_SS2024','gruppe2_SS2024','gruppe1_WS2024','gruppe2_WS2024'], + ] + */ + $benutzer_gruppen = array_map( + function($gruppe) + { + $merged_gruppe = []; + foreach($gruppe as $gruppen_array) + { + $merged_gruppe = array_merge($merged_gruppe, $gruppen_array); + } + return $merged_gruppe; + }, + $benutzer_gruppen + ); + + return success($benutzer_gruppen); + } + + private function fetchStudentlehrverbandFromStudiensemester($semester_range){ + $student_uid = getAuthUID(); + $student_lehrverband = []; + // for each studiensemester fetch the studentlehrverbaende and add them to an associate $student_lehrverband array + /* + [ + ['WS2023'] => [ [ ['stg_kz'=>298,'semester'=>1,'verband'=>"A",'gruppe'=>""] ] ], + ['SS2024'] => [ [ ['stg_kz'=>298,'semester'=>1,'verband'=>"A",'gruppe'=>""] ], [ ['stg_kz'=>298,'semester'=>2,'verband'=>"A",'gruppe'=>""] ] ], + ['WS2024'] => [ [ ['stg_kz'=>298,'semester'=>2,'verband'=>"A",'gruppe'=>""] ], [ ['stg_kz'=>298,'semester'=>3,'verband'=>"A",'gruppe'=>""] ] ], + ] + */ + foreach($semester_range as $semester_key => $semester_array) + { + $student_lehrverband[$semester_key] = []; + foreach($semester_array as $semester=>$semester_date_range) + { + // for each active semester query the student_lehrverband associated to the semester + $lehrverband_query = $this->_ci->BenutzergruppeModel->execReadOnlyQuery(" + SELECT * FROM tbl_studentlehrverband where student_uid = ? AND studiensemester_kurzbz = ?", [$student_uid, $semester]); + if(isError($lehrverband_query)){ + return error(getData($lehrverband_query)); + } + $lehrverband_query_result = getData($lehrverband_query)??[]; + + $converted_studentLehrverband= array_map( + function ($item) + { + $result = new stdClass(); + $result->studiengang_kz = $item->studiengang_kz; + $result->semester = $item->semester; + $result->verband = $item->verband; + $result->gruppe = $item->gruppe; + return $result; + }, + $lehrverband_query_result); + + array_push($student_lehrverband[$semester_key], $converted_studentLehrverband); + + } + + } + + // merge the studentlehrverband of each studiensemester together for the original studiensemester + /* + [ + ['WS2023'] => [ ['stg_kz'=>298,'semester'=>1,'verband'=>"A",'gruppe'=>""] ], + ['SS2024'] => [ ['stg_kz'=>298,'semester'=>1,'verband'=>"A",'gruppe'=>""], ['stg_kz'=>298,'semester'=>2,'verband'=>"A",'gruppe'=>""] ], + ['WS2024'] => [ ['stg_kz'=>298,'semester'=>2,'verband'=>"A",'gruppe'=>""], ['stg_kz'=>298,'semester'=>3,'verband'=>"A",'gruppe'=>""] ], + ] + */ + + $student_lehrverband = array_map( + function($studentlehrverband) + { + $merged_studentlehrverband = []; + foreach($studentlehrverband as $studentlehrverband_array) + { + $merged_studentlehrverband = array_merge($merged_studentlehrverband, $studentlehrverband_array); + } + return $merged_studentlehrverband; + }, + $student_lehrverband + ); + + return success($student_lehrverband); + } + + private function applyLoadUeberSemesterHaelfte(&$semester_range){ + /* + @var($semester_collection) + convert the array of studiensemester into an associative array with the studiensemester as the key + and the values of each key are the studiensemester needed for the query associated to that studiensemester + example: + + #INPUT: + ['WS2023','SS2024','WS2024'] + #OUTPUT: + [ + 'WS2023' => ['SS2023','WS2023'] + 'SS2024' => ['WS2023','SS2024'] + 'WS2024' => ['SS2024','WS2024'] + ] + */ + $semester_collection = []; + foreach($semester_range as $studiensemester) + { + $previous_studiensemester = $this->_ci->StudiensemesterModel->getPreviousFrom($studiensemester); + if(isError($previous_studiensemester)) + { + return error(getData($previous_studiensemester)); + } + $previous_studiensemester = getData($previous_studiensemester); + if (count($previous_studiensemester) == 0) { + return error('no previous semester'); + } + $previous_studiensemester = current($previous_studiensemester)->studiensemester_kurzbz; + $semester_collection[$studiensemester] = [$previous_studiensemester, $studiensemester]; + } + + /* + @var($studienSemesterDateRanges) + fetches for each studiensemester the start and end date, (SS) summer studiensemester are extended by 1 month to cover the summerbreak + based on the LVPLAN_LOAD_UEBER_SEMESTERHAELFTE constant it will load both the semester and the previous semester with the full date range + or the semester with the full date range and the previous semester with the half date range: + + #INPUT: + [ + 'WS2023' => ['SS2023','WS2023'] + 'SS2024' => ['WS2023','SS2024'] + 'WS2024' => ['SS2024','WS2024'] + ] + #OUTPUT: depends whether LVPLAN_LOAD_UEBER_SEMESTERHAELFTE is true or false + ~ if LVPLAN_LOAD_UEBER_SEMESTERHAELFTE == true + [ + "SS2024": [ + "WS2023": [ + "start"=> "2024-02-03", + "ende"=> "2024-08-31" + ], + "SS2024": [ + "start"=> "2024-02-03", + "ende"=> "2024-08-31" + ] + ] + ] + ~ if LVPLAN_LOAD_UEBER_SEMESTERHAELFTE == false + [ + "SS2024": [ + "WS2023": [ + "start"=> "2024-02-03", + "ende"=> "2024-05-17" + ], + "SS2024": [ + "start"=> "2024-02-03", + "ende"=> "2024-08-31" + ] + ] + ] + */ + $studienSemesterDateRanges=[]; + foreach($semester_collection as $semester_original => $semester_adjoint) + { + $semester_start_ende = $this->_ci->StudiensemesterModel->getStartEndeFromStudiensemester($semester_original); + if(isError($semester_start_ende)) + { + return error(getData($semester_start_ende)); + } + $semester_start_ende = current(getData($semester_start_ende)); + + // initialize empty arrays to add key value pairs + $studienSemesterDateRanges[$semester_original] = []; + + // check if the studiensemester is a summer semester and add 1 month to bridge the school summer break + $match = null; + preg_match("/^(SS)([0-9]+)/",$semester_original,$match); + if(count($match) >0) + { + $one_month = new DateInterval('P1M'); + $one_day = DateInterval::createFromDateString('1 days'); + $summer_studiensemester_end_date = DateTime::createFromFormat('Y-m-d',$semester_start_ende->ende); + $summer_studiensemester_end_date->add($one_month); + $summer_studiensemester_end_date->sub($one_day); + $semester_start_ende->ende = date_format($summer_studiensemester_end_date,'Y-m-d'); + } + if (defined('LVPLAN_LOAD_UEBER_SEMESTERHAELFTE') && LVPLAN_LOAD_UEBER_SEMESTERHAELFTE === true) + { + foreach($semester_adjoint as $adjoint) + { + $studienSemesterDateRanges[$semester_original][$adjoint]=$semester_start_ende; + } + } + else + { + //TODO: half of a DateInterval might not be correctly calculated + // calculate the half of the studiensemester + $studiensemester_start_date = DateTime::createFromFormat('Y-m-d',$semester_start_ende->start); + $studiensemester_end_date = DateTime::createFromFormat('Y-m-d',$semester_start_ende->ende); + $studiensemester_time_difference = $studiensemester_start_date->diff($studiensemester_end_date); + $half_dateNumber = ceil($studiensemester_time_difference->d/2)+ceil(($studiensemester_time_difference->m*30)/2); + $half_dateInterval = new DateInterval('P'.strval($half_dateNumber) .'D'); + $studiensemester_half = date_format($studiensemester_start_date->add($half_dateInterval),'Y-m-d'); + + $first_half = new stdClass(); + $first_half->start = $semester_start_ende->start; + $first_half->ende = $studiensemester_half; + + $studienSemesterDateRanges[$semester_original][$semester_adjoint[0]] = $first_half; + $studienSemesterDateRanges[$semester_original][$semester_adjoint[1]] = $semester_start_ende; + } + $semester_range = $studienSemesterDateRanges; + } + } + + private function studienSemesterErmitteln($start_date,$end_date){ + + // gets all studiensemester from the student from start_date to end_date + $semester_range = $this->_ci->StudiensemesterModel->getByDateRange($start_date,$end_date); + if(isError($semester_range)) + { + return error(getData($semester_range)); + } + $semester_range = array_map( + function($sem) + { + return $sem->studiensemester_kurzbz; + }, + getData($semester_range) + ); + + // if no studiensemester is found for the given timespan, get the nearest studiensemester + if(count($semester_range) == 0) + { + $aktuelle_studiensemester = $this->_ci->StudiensemesterModel->getNearest(); + if(isError($aktuelle_studiensemester)) + { + return error(getData($aktuelle_studiensemester)); + } + $aktuelle_studiensemester = getData($aktuelle_studiensemester); + if (count($aktuelle_studiensemester) == 0) { + return error("No aktuelles semester"); + } + $aktuelle_studiensemester = current($aktuelle_studiensemester)->studiensemester_kurzbz; + // push aktuelles semester in active semester array + array_push($semester_range, $aktuelle_studiensemester); + + } + return success($semester_range); + } +} \ No newline at end of file diff --git a/public/js/api/stundenplan.js b/public/js/api/stundenplan.js index 388db5454..9b831b77e 100644 --- a/public/js/api/stundenplan.js +++ b/public/js/api/stundenplan.js @@ -6,12 +6,6 @@ export default { { ort_kurzbz, start_date, end_date} ); }, - getStundenplan(start_date, end_date, lv_id) { - return this.$fhcApi.get( - '/api/frontend/v1/Stundenplan/getStundenplan', - { start_date, end_date, lv_id } - ); - }, getStunden() { return this.$fhcApi.get( '/api/frontend/v1/Stundenplan/Stunden', @@ -42,14 +36,12 @@ export default { {} ); }, - getMoodleEventsByUserid(timestart, timeend) { + StundenplanEvents(start_date, end_date, lv_id) { return this.$fhcApi.get( - `/api/frontend/v1/Stundenplan/fetchMoodleEvents`, - { - timestart: timestart, - timeend: timeend, - } + '/api/frontend/v1/Stundenplan/StundenplanEvents', + { start_date, end_date, lv_id } ); }, + }; \ No newline at end of file diff --git a/public/js/components/Cis/Stundenplan/Stundenplan.js b/public/js/components/Cis/Stundenplan/Stundenplan.js index c8c4fb91c..e7d48fe21 100644 --- a/public/js/components/Cis/Stundenplan/Stundenplan.js +++ b/public/js/components/Cis/Stundenplan/Stundenplan.js @@ -191,6 +191,7 @@ const Stundenplan = { this.eventCalendarDate = new CalendarDate(end); Vue.nextTick(() => { this.loadEvents(); + }); } }, @@ -202,9 +203,8 @@ const Stundenplan = { }, loadEvents: function(){ Promise.allSettled([ - this.$fhcApi.factory.stundenplan.getStundenplan(this.monthFirstDay, this.monthLastDay, this.propsViewData.lv_id), + this.$fhcApi.factory.stundenplan.StundenplanEvents(this.monthFirstDay, this.monthLastDay, this.propsViewData.lv_id), this.$fhcApi.factory.stundenplan.getStundenplanReservierungen(this.monthFirstDay, this.monthLastDay), - this.loadMoodleEvents(this.monthFirstDay, this.monthLastDay) ]).then((result) => { let promise_events = []; result.forEach((promise_result) => { @@ -232,65 +232,10 @@ const Stundenplan = { promise_events = promise_events.concat(data); } }) - promise_events.sort((a, b) => { - if(a.type=='moodle'){ - return -1; - } - else if(b.type=='moodle'){ - return 1; - } - else{ - return 0; - } - }); + this.events = promise_events; }); }, - loadMoodleEvents: function(start_date, end_date){ - - let date_start = Math.floor(new Date(start_date).getTime() / 1000); - let date_end = Math.floor(new Date(end_date).getTime() / 1000); - return this.$fhcApi.factory.stundenplan.getMoodleEventsByUserid(date_start, date_end).then((response) => response?.data?.events).then(events => { - let data =events.map(event =>{ - const event_start_date = new Date(event.timestart); - const event_end_date = new Date(event.timeend); - const formatted_date = `${event_start_date.getFullYear()}-${event_start_date.getMonth()+1}-${event_start_date.getDate()}`; - // to get the same date and time as in moodle, we use the default UTC time zone - const formatted_start_time = event_start_date.toLocaleTimeString(this.$p.user_locale, {hour:'2-digit',minute:'2-digit', second:'2-digit',hour12:false}); - const formatted_end_time = event_end_date.toLocaleTimeString(this.$p.user_locale, { hour: '2-digit', minute: '2-digit', second: '2-digit', hour12: false }); - - return { - type:'moodle', - beginn: formatted_start_time, - ende: formatted_end_time, - allDayEvent: true, - datum: formatted_date, - purpose: event.purpose, - assignment: event.activityname, - topic: event.activitystr, - lektor:[], - gruppe:[], - ort_kurzbz: event.location, - //moodle idnumber entspricht der course id number die man den Kurs in Moodle vergeben kann - lehreinheit_id:event.lehreinheitsNummber??null, - titel: event.course.fullname, - lehrfach:'', - lehrform:'', - lehrfach_bez:'', - organisationseinheit:'', - farbe:'00689E', - lehrveranstaltung_id:0, - ort_content_id:0, - url:event?.url, - } - }); - return { - data: data, - meta: { status: 'success' } - }; - }) - - }, }, created() { diff --git a/public/js/components/DashboardWidget/Stundenplan.js b/public/js/components/DashboardWidget/Stundenplan.js index 006acd306..437f6a17f 100644 --- a/public/js/components/DashboardWidget/Stundenplan.js +++ b/public/js/components/DashboardWidget/Stundenplan.js @@ -124,9 +124,8 @@ export default { loadEvents: function () { Promise.allSettled([ - this.$fhcApi.factory.stundenplan.getStundenplan(this.monthFirstDay, this.monthLastDay), + this.$fhcApi.factory.stundenplan.StundenplanEvents(this.monthFirstDay, this.monthLastDay), this.$fhcApi.factory.stundenplan.getStundenplanReservierungen(this.monthFirstDay, this.monthLastDay), - this.loadMoodleEvents(this.monthFirstDay, this.monthLastDay) ]).then((result) => { let promise_events = []; result.forEach((promise_result) => { @@ -152,65 +151,10 @@ export default { promise_events = promise_events.concat(data); } }) - promise_events.sort((a, b) => { - if (a.type == 'moodle') { - return -1; - } - else if (b.type == 'moodle') { - return 1; - } - else { - return 0; - } - }); + this.events = promise_events; }); }, - loadMoodleEvents: function (start_date, end_date) { - - let date_start = Math.floor(new Date(start_date).getTime() / 1000); - let date_end = Math.floor(new Date(end_date).getTime() / 1000); - return this.$fhcApi.factory.stundenplan.getMoodleEventsByUserid(date_start, date_end).then((response) => response?.data?.events).then(events => { - let data = events.map(event => { - const event_start_date = new Date(event.timestart); - const event_end_date = new Date(event.timeend); - const formatted_date = `${event_start_date.getFullYear()}-${event_start_date.getMonth() + 1}-${event_start_date.getDate()}`; - // to get the same date and time as in moodle, we use the default UTC time zone - const formatted_start_time = event_start_date.toLocaleTimeString(this.$p.user_locale, { hour: '2-digit', minute: '2-digit', second: '2-digit', hour12: false }); - const formatted_end_time = event_end_date.toLocaleTimeString(this.$p.user_locale, { hour: '2-digit', minute: '2-digit', second: '2-digit', hour12: false }); - - return { - type: 'moodle', - beginn: formatted_start_time, - ende: formatted_end_time, - allDayEvent: true, - datum: formatted_date, - purpose: event.purpose, - assignment: event.activityname, - topic: event.activitystr, - lektor: [], - gruppe: [], - ort_kurzbz: event.location, - //moodle idnumber entspricht der course id number die man den Kurs in Moodle vergeben kann - lehreinheit_id: event.lehreinheitsNummber ?? null, - titel: event.course.fullname, - lehrfach: '', - lehrform: '', - lehrfach_bez: '', - organisationseinheit: '', - farbe: '00689E', - lehrveranstaltung_id: 0, - ort_content_id: 0, - url: event?.url, - } - }); - return { - data: data, - meta: { status: 'success' } - }; - }) - - }, setCalendarMaximized() { this.minimized = false }