diff --git a/application/controllers/api/frontend/v1/Stundenplan.php b/application/controllers/api/frontend/v1/Stundenplan.php index 923c7f6bb..019a8ab4a 100644 --- a/application/controllers/api/frontend/v1/Stundenplan.php +++ b/application/controllers/api/frontend/v1/Stundenplan.php @@ -28,9 +28,10 @@ class Stundenplan extends FHCAPI_Controller { parent::__construct([ - 'roomInformation' => self::PERM_LOGGED, + 'getRoomplan' => self::PERM_LOGGED, 'Stunden' => self::PERM_LOGGED, - 'Reservierungen' => self::PERM_LOGGED + 'Reservierungen' => self::PERM_LOGGED, + 'getStundenplan' => self::PERM_LOGGED, ]); $this->load->library('LogLib'); @@ -69,7 +70,7 @@ class Stundenplan extends FHCAPI_Controller * @access public * */ - public function roomInformation() + public function getRoomplan() { $this->load->model('ressource/Stundenplan_model', 'StundenplanModel'); @@ -88,7 +89,7 @@ class Stundenplan extends FHCAPI_Controller $start_date = $this->input->get('start_date', TRUE); $end_date = $this->input->get('end_date', TRUE); - $result = $this->StundenplanModel->stundenPlanGruppierung($this->StundenplanModel->getRoomQuery($ort_kurzbz, $start_date, $end_date)); + $result = $this->StundenplanModel->stundenplanGruppierung($this->StundenplanModel->getRoomQuery($ort_kurzbz, $start_date, $end_date)); $result = $this->getDataOrTerminateWithError($result); @@ -96,6 +97,22 @@ class Stundenplan extends FHCAPI_Controller } + public function getStundenplan(){ + + $this->load->model('ressource/Stundenplan_model', 'StundenplanModel'); + + /* $result = $this->StundenplanModel->loadForUid(get_uid()); + + if (isError($result)) + return $this->outputJsonError(getError($result)); + */ + $res = $this->StundenplanModel->stundenplanGruppierung($this->StundenplanModel->getStundenplanQuery(get_uid())); + + $res = getData($res); + + $this->outputJsonSuccess($res); + } + // reservierungen is not used in the prototype for the students public function Reservierungen() { @@ -125,7 +142,7 @@ class Stundenplan extends FHCAPI_Controller $result = $this->ReservierungModel->getRoomReservierungen($ort_kurzbz, $start_date, $end_date); $result = $this->getDataOrTerminateWithError($result); - + $this->terminateWithSuccess($result); // loop over the days $day_events = $this->filterEventsIntoAssociativeDateArray($result, $start_date, $end_date); $final_reservierungen = array(); @@ -173,7 +190,6 @@ class Stundenplan extends FHCAPI_Controller $grouped_uids[]= $entry->uid; } - // grouping the } diff --git a/application/controllers/components/Cis/Stundenplan.php b/application/controllers/components/Cis/Stundenplan.php index b33a0ddee..a88d061cb 100755 --- a/application/controllers/components/Cis/Stundenplan.php +++ b/application/controllers/components/Cis/Stundenplan.php @@ -17,7 +17,6 @@ class Stundenplan extends Auth_Controller 'index' => ['student/anrechnung_beantragen:r','user:r'], // TODO(chris): permissions? 'Reservierungen' => ['student/anrechnung_beantragen:r','user:r'], // TODO(chris): permissions? 'Stunden' => ['student/anrechnung_beantragen:r','user:r'], // TODO(chris): permissions? - 'RoomInformation'=> ['student/anrechnung_beantragen:r','user:r'], ]); } @@ -34,52 +33,10 @@ class Stundenplan extends Auth_Controller if (isError($result)) return $this->outputJsonError(getError($result)); - */ - - - $res = $this->StundenplanModel->stundenplanGruppierung($this->StundenplanModel->getStudenPlanQuery(get_uid())); + */ + $res = $this->StundenplanModel->stundenplanGruppierung($this->StundenplanModel->getStundenplanQuery(get_uid())); $res = getData($res); - - // get the benutzer object for the lektor of the lv - $this->load->model('ressource/Mitarbeiter_model','MitarbeiterModel'); - $this->load->model('organisation/Lehrverband_model', 'LehrverbandModel'); - foreach($res as $item){ - $lektor_obj_array = array(); - $gruppe_obj_array = array(); - // load lektor object - foreach($item->lektor as $lv_lektor){ - $this->MitarbeiterModel->addLimit(1); - $lektor_obj = $this->MitarbeiterModel->loadWhere(["kurzbz"=>$lv_lektor]); - if (isError($lektor_obj)) { - $this->outputJsonError(getError($lektor_obj)); - } - $lektor_obj = current(getData($lektor_obj)); - $lektor_obj_array[] = $lektor_obj; - } - // 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) = $lv_gruppe_array; - $this->LehrverbandModel->addLimit(1); - $lehrverband_obj = $this->LehrverbandModel->loadWhere(["gruppe" => $gruppe, "verband" => $verband, "semester" => $semester, "studiengang_kz" => $studiengang_kz]); - if (isError($lehrverband_obj)) { - $this->outputJsonError(getError($lehrverband_obj)); - } - $lehrverband_obj = current(getData($lehrverband_obj)); - $gruppe_obj_array[] = $lehrverband_obj; - } - // studiengangs object - $this->load->model('organisation/Studiengang_model','StudiengangModel'); - $this->StudiengangModel->addLimit(1); - $studiengang_object = $this->StudiengangModel->load($item->studiengang_kz); - $studiengang_object = current(getData($studiengang_object)); - $item->studiengang = $studiengang_object; - $item->lektor = $lektor_obj_array; - $item->gruppe = $gruppe_obj_array; - - } $this->outputJsonSuccess($res); } diff --git a/application/models/ressource/Reservierung_model.php b/application/models/ressource/Reservierung_model.php index e149cf0d7..c06fce206 100755 --- a/application/models/ressource/Reservierung_model.php +++ b/application/models/ressource/Reservierung_model.php @@ -22,20 +22,46 @@ class Reservierung_model extends DB_Model { $raum_reservierungen= $this->execReadOnlyQuery(" - SELECT res.*, mit.kurzbz as person_kurzbz , - CASE - WHEN res.verband IS NOT NULL OR res.semester IS NOT NULL THEN - CONCAT(UPPER(studg.typ),UPPER(studg.kurzbz),'-',res.verband,res.semester) - ELSE - CONCAT(UPPER(studg.typ),UPPER(studg.kurzbz)) - END AS stg - FROM lehre.vw_reservierung res - JOIN public.tbl_mitarbeiter mit ON mit.mitarbeiter_uid=res.uid - JOIN public.tbl_studiengang studg ON studg.studiengang_kz=res.studiengang_kz - WHERE res.ort_kurzbz = ? AND datum >= ? AND datum <= ? + SELECT ort_kurzbz, studiengang_kz, array_agg(uid) as lektor, stunde, datum, titel, beschreibung, gruppe, gruppe_kurzbz, stg_kurzbz, stg + FROM + ( + SELECT res.* , + CASE + WHEN res.verband IS NOT NULL OR res.semester IS NOT NULL THEN + CONCAT(UPPER(studg.typ),UPPER(studg.kurzbz),'-',res.verband,res.semester) + ELSE + CONCAT(UPPER(studg.typ),UPPER(studg.kurzbz)) + END AS stg + FROM lehre.vw_reservierung res + JOIN public.tbl_studiengang studg ON studg.studiengang_kz=res.studiengang_kz + WHERE res.ort_kurzbz = ? AND datum >= ? AND datum <= ? + ) AS reservierungen + GROUP BY ort_kurzbz, studiengang_kz, stunde, datum, titel, beschreibung, gruppe, stg, gruppe_kurzbz, stg_kurzbz ", [$ort_kurzbz, $start_date, $end_date]); - return $raum_reservierungen; + if(isError($raum_reservierungen)){ + show_error(getError($raum_reservierungen)); + } + + $raum_reservierungen = getData($raum_reservierungen) ?? []; + + $this->load->model("ressrouce/Mitarbeiter_model","MitarbeiterModel"); + foreach($raum_reservierungen as $reservierung){ + $lektoren_array = array(); + foreach($reservierung->lektor as $lektor){ + $this->MitarbeiterModel->addLimit(1); + $lektor_obj= $this->MitarbeiterModel->load($lektor); + if(isError($lektor_obj)){ + show_error(getError($lektor_obj)); + } + $lektor_obj = current(getData($lektor_obj)); + $lektoren_array[] = $lektor_obj; + } + + $reservierung->lektor = $lektoren_array; + + } + return success($raum_reservierungen); } /** diff --git a/application/models/ressource/Stundenplan_model.php b/application/models/ressource/Stundenplan_model.php index 9f699c6cb..6b1ed4ef0 100755 --- a/application/models/ressource/Stundenplan_model.php +++ b/application/models/ressource/Stundenplan_model.php @@ -145,18 +145,17 @@ class Stundenplan_model extends DB_Model $gruppierteEvents = $this->execReadOnlyQuery(" SELECT - unr,datum, stunde, + unr,datum, sp.stunde, CONCAT(lehrfach,'-',lehrform) as topic, - array_agg(DISTINCT gruppen_kurzbz) as gruppen_kurzbz, - array_agg(DISTINCT (gruppe,verband,semester,studiengang_kz)) as gruppe, + array_agg(DISTINCT (gruppe,verband,semester,studiengang_kz,gruppen_kuerzel)) as gruppe, array_agg(DISTINCT lektor) as lektor, - ort_kurzbz, studiengang_kz, titel, lehrfach, lehrform, lehrfach_bez + ort_kurzbz, titel, lehrfach, lehrform, lehrfach_bez, beginn, ende FROM ( SELECT - unr,datum, stunde, + unr,datum, sp.stunde,beginn, ende, CASE WHEN sp.mitarbeiter_kurzbz IS NOT NULL THEN sp.mitarbeiter_kurzbz @@ -165,30 +164,84 @@ class Stundenplan_model extends DB_Model CASE WHEN gruppe_kurzbz IS NOT NULL THEN gruppe_kurzbz ELSE CONCAT(UPPER(sp.stg_typ),UPPER(sp.stg_kurzbz),'-',COALESCE(CAST(sp.semester AS varchar),'/'),COALESCE(CAST(sp.verband AS varchar),'/')) - END as gruppen_kurzbz, + END as gruppen_kuerzel, ort_kurzbz, studiengang_kz, titel,lehreinheit_id,lehrfach_id,anmerkung,fix,lehrveranstaltung_id,stg_kurzbzlang,stg_bezeichnung,stg_typ,fachbereich_kurzbz,lehrfach,lehrfach_bez,farbe,lehrform,anmerkung_lehreinheit,gruppe, verband, semester,stg_kurzbz FROM (".$stundenplanViewQuery.") sp + JOIN lehre.tbl_stunde ON lehre.tbl_stunde.stunde = sp.stunde ) as sp GROUP BY - unr, datum, stunde, ort_kurzbz, titel, studiengang_kz, lehrform, lehrfach, lehrfach_bez + unr, datum, sp.stunde, ort_kurzbz, titel, lehrform, lehrfach, lehrfach_bez, beginn, ende - ORDER BY datum, stunde + ORDER BY datum, sp.stunde "); - return $gruppierteEvents; + if(isError($gruppierteEvents)){ + $this->output(getError($gruppierteEvents)); + } + + $gruppierteEvents = getData($gruppierteEvents) ?? []; + + // get the benutzer object for the lektor of the lv + $this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel'); + $this->load->model('organisation/Lehrverband_model', 'LehrverbandModel'); + $this->load->model('organisation/Studiengang_model', 'StudiengangModel'); + $this->load->model('person/Benutzer_model', 'BenutzerModel'); + + foreach ($gruppierteEvents as $item) { + $lektor_obj_array = array(); + $gruppe_obj_array = array(); + + // load lektor object + foreach ($item->lektor as $lv_lektor) { + $this->MitarbeiterModel->addLimit(1); + $lektor_object = $this->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 = current(getData($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; + } + + $item->lektor = $lektor_obj_array; + $item->gruppe = $gruppe_obj_array; + } + + return success($gruppierteEvents); } /** * NO STANDALONE FUNCTION - Generates a SQL query string to fetch 'stundenplan' events for a specific student within the current semester. - * @param string $uid the user id that is used to fetch the stundenplan rows from the lehre.vw_studenplan table + * @param string $uid the user id that is used to fetch the stundenplan rows from the lehre.vw_stundenplan table * * @return string */ - public function getStudenPlanQuery($uid){ + public function getStundenPlanQuery($uid){ return "select sp.* from lehre.vw_stundenplan sp diff --git a/include/lehrstunde.class.php b/include/lehrstunde.class.php index a0f52d799..dff4faba2 100755 --- a/include/lehrstunde.class.php +++ b/include/lehrstunde.class.php @@ -1073,7 +1073,7 @@ class lehrstunde extends basis_db } /** - * Holt Studenplandaten. + * Holt Stundenplandaten. * * @param $db_stpl_table * @param null $lehrveranstaltung_id diff --git a/include/wochenplan.class.php b/include/wochenplan.class.php index 34fbadc63..5274beefb 100755 --- a/include/wochenplan.class.php +++ b/include/wochenplan.class.php @@ -123,7 +123,7 @@ class wochenplan extends basis_db } /** - * initialisiert den Studenplan + * initialisiert den Stundenplan * */ public function init_stdplan() diff --git a/public/js/api/fhcapifactory.js b/public/js/api/fhcapifactory.js index 65bde56fd..c053f272c 100644 --- a/public/js/api/fhcapifactory.js +++ b/public/js/api/fhcapifactory.js @@ -22,7 +22,7 @@ import filter from "./filter.js"; import studstatus from "./studstatus.js"; import profil from "./profil.js"; import profilUpdate from "./profilUpdate.js"; -import stundenplan from "./studenplan.js"; +import stundenplan from "./stundenplan.js"; export default { search, diff --git a/public/js/api/studenplan.js b/public/js/api/stundenplan.js similarity index 89% rename from public/js/api/studenplan.js rename to public/js/api/stundenplan.js index d691a72cf..a522ef3ca 100644 --- a/public/js/api/studenplan.js +++ b/public/js/api/stundenplan.js @@ -2,7 +2,7 @@ export default { getRoomInfo(ort_kurzbz, start_date, end_date) { return this.$fhcApi.get( - '/api/frontend/v1/Stundenplan/roomInformation', + '/api/frontend/v1/Stundenplan/getRoomplan', { ort_kurzbz, start_date, end_date} ); }, diff --git a/public/js/components/Cis/Mylv/RoomInformation.js b/public/js/components/Cis/Mylv/RoomInformation.js index c905dabd8..877869fa3 100644 --- a/public/js/components/Cis/Mylv/RoomInformation.js +++ b/public/js/components/Cis/Mylv/RoomInformation.js @@ -17,7 +17,7 @@ export default{ stunden: [], events: null, calendarWeek: new CalendarDate(new Date()), - events_loaded:false, + } }, computed:{ @@ -36,6 +36,7 @@ export default{ this.calendarWeek = new CalendarDate(data.start); Vue.nextTick(() => { this.loadRoomEvents(); + //this.loadReservierungen(); }); }, @@ -56,9 +57,37 @@ export default{ }); }, - loadRoomEvents: function(){ - this.$fhcApi.factory.stundenplan.getRoomInfo(this.ort_kurzbz, this.weekFirstDay, this.weekLastDay).then(res => { - let events; + loadRoomEvents: async function () { + await this.$fhcApi.factory.stundenplan.getRoomInfo(this.ort_kurzbz, this.weekFirstDay, this.weekLastDay).then(res => { + + if (res.data && res.data.forEach) { + res.data.forEach((el, i) => { + + el.id = i; + if (el.type === 'reservierung') { + el.color = '#' + (el.farbe || 'FFFFFF'); + } else { + el.color = '#' + (el.farbe || 'CCCCCC'); + } + + el.start = new Date(el.datum + ' ' + this.stunden[el.stunde].beginn); + el.end = new Date(el.datum + ' ' + this.stunden[el.stunde].ende); + el.title = el.lehrfach; + if (el.lehrform) + el.title += '-' + el.lehrform; + }); + if (this.events){ + this.events = [...this.events, ...res.data]; + }else{ + this.events = res.data; + } + } + }); + }, + + + loadReservierungen: async function () { + await this.$fhcApi.factory.stundenplan.getReservierungen(this.ort_kurzbz, this.weekFirstDay, this.weekLastDay).then(res => { if (res.data && res.data.forEach) { res.data.forEach((el, i) => { @@ -76,33 +105,36 @@ export default{ el.title += '-' + el.lehrform; }); - this.events = res.data; + if (this.events) { + this.events = [...this.events, ...res.data]; + } else { + this.events = res.data; + } } }); } - + }, async mounted() { this.loadStunden(); this.loadRoomEvents(); + this.loadReservierungen(); }, template: /*html*/`