. */ if (! defined('BASEPATH')) exit('No direct script access allowed'); class Stundenplan extends FHCAPI_Controller { /** * Object initialization */ public function __construct() { parent::__construct([ 'roomInformation' => self::PERM_LOGGED, 'Stunden' => self::PERM_LOGGED, 'Reservierungen' => self::PERM_LOGGED ]); $this->load->library('LogLib'); $this->loglib->setConfigs(array( 'classIndex' => 5, 'functionIndex' => 5, 'lineIndex' => 4, 'dbLogType' => 'API', // required 'dbExecuteUser' => 'RESTful API' )); $this->load->library('form_validation'); } //------------------------------------------------------------------------------------------------------------------ // Public methods /** * fetches Stunden layout from database * @access public * */ public function Stunden() { $this->load->model('ressource/Stunde_model', 'StundeModel'); $stunden = $this->StundeModel->load(); $stunden = $this->getDataOrTerminateWithError($stunden); $this->terminateWithSuccess($stunden); } /** * fetches room events from a certain date * @access public * */ public function roomInformation() { $this->load->model('ressource/Stundenplan_model', 'StundenplanModel'); $this->load->model('ressource/Stunde_model', 'StundeModel'); // form validation $this->load->library('form_validation'); $this->form_validation->set_data($_GET); $this->form_validation->set_rules('ort_kurzbz',"Ort","required"); $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 $ort_kurzbz = $this->input->get('ort_kurzbz', TRUE); $start_date = $this->input->get('start_date', TRUE); $end_date = $this->input->get('end_date', TRUE); //return early if the get parameter are not present if(!$ort_kurzbz || !$start_date || !$end_date){ $this->terminateWithError("Missing parameters", self::ERROR_TYPE_GENERAL); } // querying the stunden $stunden = $this->StundeModel->load(); if(isError($stunden)) $this->terminateWithError(getError($stunden), self::ERROR_TYPE_GENERAL); $stunden = getData($stunden); $result = $this->StundenplanModel->groupedCalendarEvents($ort_kurzbz,$start_date,$end_date); //$this->loglib->logErrorDB(print_r($result,TRUE),"this is the result of the grouped query"); if(isError($result)){ $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); } $result = hasData($result) ? getData($result) : []; foreach($result as $entry){ if(COUNT($entry->lektor)>1){ // gruppierung hat stattgefunden und das array muss in einem String konvertiert werden } } $this->terminateWithSuccess($result); } public function Reservierungen() { $this->load->model('ressource/Reservierung_model', 'ReservierungModel'); $this->load->model('ressource/Stunde_model', 'StundeModel'); $this->load->model('ressource/Mitarbeiter_model','MitarbeiterModel'); // storing the get parameter in local variables $ort_kurzbz = $this->input->get('ort_kurzbz', TRUE); $start_date = $this->input->get('start_date', TRUE); $end_date = $this->input->get('end_date', TRUE); // return early if the get parameter are not present if(!$ort_kurzbz || !$start_date || !$end_date){ $this->terminateWithError("Missing parameters", self::ERROR_TYPE_GENERAL); } // querying the stunden $stunden = $this->StundeModel->load(); if(isError($stunden)) $this->terminateWithError(getError($stunden), self::ERROR_TYPE_GENERAL); $stunden = getData($stunden); // querying the reservierungen $result = $this->ReservierungModel->getRoomReservierungen($ort_kurzbz, $start_date, $end_date); if (isError($result)) return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); $result = hasData($result) ? getData($result) : []; // loop over the days $day_events = $this->filterEventsIntoAssociativeDateArray($result, $start_date, $end_date); $final_reservierungen = array(); foreach($day_events as $date => $day_eventArray){ // loop over the stunden foreach( $stunden as $stunde){ // filtering all the day reservierungen to the reservierungen that happen at the same hour of the day $hour_reservierungen = array_filter($day_eventArray, function($day_entry) use ($stunde){ return $day_entry->stunde == $stunde->stunde; }); // if there are no reservierungen within that hour than we skip that iteration of the loop if(count($hour_reservierungen) <1){ continue; } $this->loglib->logInfoDB(print_r($hour_reservierungen,true),"this is the hour reservierungen"); // grouping the reservierung information of reservervations of the same hour on the same day $grouped_uids = array(); foreach($hour_reservierungen as $entry){ // grouping the reservierungs participants $mitarbeiter_check = $this->MitarbeiterModel->isMitarbeiter($entry->uid); if(isError($mitarbeiter_check)){ $this->terminateWithError(getError($mitarbeiter_check), self::ERROR_TYPE_GENERAL); } $mitarbeiter_check = getData($mitarbeiter_check); // if the uid belongs to a mitarbeiter store the mitarbeiter_kurzbz otherwise store the student uid if($mitarbeiter_check){ $mitarbeiterKurzbz = $this->MitarbeiterModel->generateKurzbz($entry->uid); if(isError($mitarbeiterKurzbz)){ $this->terminateWithError(getError($mitarbeiterKurzbz), self::ERROR_TYPE_GENERAL); } $grouped_uids[] = getData($mitarbeiterKurzbz); }else{ $grouped_uids[]= $entry->uid; } // grouping the } // merging all the information into the first entry $final_reservierung = current($hour_reservierungen); $final_reservierung->person_kurzbz = implode(" / ",$grouped_uids); $final_reservierungen[] = $final_reservierung; } } $this->terminateWithSuccess($final_reservierungen); } private function filterEventsIntoAssociativeDateArray($events, $start_date, $end_date){ $php_start_date = new DateTime($start_date); $php_end_date = new DateTime($end_date); // count is used to ensure that the loop does not iterate more than 7 times (7 days per week) $count =0; $result = array(); // loop over the days while($php_start_date <= $php_end_date && $count <7){ $date = $php_start_date->format('Y-m-d'); // filtering all the reservierungen with the date $day_events = array_filter($events, function($event) use ($date){ // no filtering is done if the event entries do not have a datum property return isset($event->datum) ? $event->datum == $date : true; }); $result[$date] = $day_events; ++$count; $php_start_date->modify('+1 day'); } return $result; } }