changes the structure of the JSON data from the stundenplan

This commit is contained in:
SimonGschnell
2024-09-04 14:59:56 +02:00
parent 87f82b7f5d
commit e33162d20e
9 changed files with 176 additions and 92 deletions
@@ -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
}
@@ -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);
}
@@ -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);
}
/**
@@ -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
+1 -1
View File
@@ -1073,7 +1073,7 @@ class lehrstunde extends basis_db
}
/**
* Holt Studenplandaten.
* Holt Stundenplandaten.
*
* @param $db_stpl_table
* @param null $lehrveranstaltung_id
+1 -1
View File
@@ -123,7 +123,7 @@ class wochenplan extends basis_db
}
/**
* initialisiert den Studenplan
* initialisiert den Stundenplan
*
*/
public function init_stdplan()
+1 -1
View File
@@ -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,
@@ -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}
);
},
@@ -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*/`
<div>
<fhc-calendar @change:range="updateRange" v-slot="{event,day}" :initialDate="currentDate" :events="events" initial-mode="week" show-weeks>
<a class="text-decoration-none text-dark" href="#" :title="event.orig.title + ' - ' + event.orig.lehrfach_bez + ' [' + event.orig.ort_kurzbz+']'" >
<a class="text-decoration-none text-dark" href="#" :title="event.orig.title + ' - ' + event.orig.lehrfach_bez + ' [' + event.orig.ort_kurzbz+']'" >
<div class="d-flex flex-column align-items-center justify-content-evenly h-100" >
<!-- render content for stundenplan -->
<span >{{event.orig.topic}}</span>
<span v-for="gruppe in event.orig.gruppe.split('/')" :key="gruppe">{{gruppe}}</span>
<span v-for="lektor in event.orig.lektor.split('/')" :key="lektor">{{lektor}}</span>
<!-- add the beschreibung if the event is a reservierung -->
<span v-if="event.orig.type === 'reservierung'">{{event.orig.beschreibung}}</span>
<span v-for="gruppe_kurzbz in event.orig.gruppen_kurzbz" >{{gruppe_kurzbz}}</span>
<span v-for="lektor in event.orig.lektor" >{{lektor.kurzbz}}</span>
<!-- add the beschreibung if the event is a reservierung
<span v-if="event.orig.type === 'reservierung'">{{event.orig.beschreibung}}</span>-->
</div>
</a>
</fhc-calendar>