updates roomEvents on change:range / groups the results of a studenplan query

This commit is contained in:
SimonGschnell
2024-08-06 14:29:24 +02:00
parent e44c1bccb3
commit 46a0706057
4 changed files with 116 additions and 72 deletions
@@ -87,22 +87,11 @@ class Stundenplan extends FHCAPI_Controller
$ort_kurzbz = $this->input->get('ort_kurzbz', TRUE);
$start_date = $this->input->get('start_date', TRUE);
$end_date = $this->input->get('end_date', TRUE);
// querying the stunden
$stunden = $this->StundeModel->load();
$stunden = $this->getDataOrTerminateWithError($stunden);
$result = $this->StundenplanModel->groupedCalendarEvents($ort_kurzbz,$start_date,$end_date);
$result = $this->StundenplanModel->stundenPlanGruppierung($this->StundenplanModel->getRoomQuery($ort_kurzbz, $start_date, $end_date));
$result = $this->getDataOrTerminateWithError($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);
}
@@ -30,12 +30,14 @@ class Stundenplan extends Auth_Controller
{
$this->load->model('ressource/Stundenplan_model', 'StundenplanModel');
$result = $this->StundenplanModel->loadForUid(get_uid());
/* $result = $this->StundenplanModel->loadForUid(get_uid());
if (isError($result))
return $this->outputJsonError(getError($result));
$this->outputJsonSuccess(getData($result));
*/
$res = $this->StundenplanModel->stundenPlanGruppierung($this->StundenplanModel->getStudenPlanQuery(get_uid()));
$res = getData($res);
$this->outputJsonSuccess($res);
}
/**
@@ -133,6 +133,71 @@ class Stundenplan_model extends DB_Model
return $gruppierteEvents;
}
public function stundenPlanGruppierung($stundenplanViewQuery)
{
$gruppierteEvents = $this->execReadOnlyQuery("
SELECT
'stundenplan' as type,
unr,datum, stunde,
CONCAT(lehrfach,'-',lehrform) as topic,
'' as beschreibung,
string_agg(DISTINCT gruppe, '/') as gruppe,
string_agg(DISTINCT lektor, '/') as lektor,
ort_kurzbz, studiengang_kz, titel,'' as beschreibung,lehreinheit_id,lehrfach_id,anmerkung,fix,lehrveranstaltung_id,stg_kurzbzlang,stg_bezeichnung,stg_typ,fachbereich_kurzbz,lehrfach,lehrfach_bez,farbe,lehrform,anmerkung_lehreinheit
FROM
(
SELECT
unr,datum, stunde,
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 gruppe,
CASE
WHEN sp.mitarbeiter_kurzbz IS NOT NULL THEN sp.mitarbeiter_kurzbz
ELSE lektor
END as lektor,
ort_kurzbz, studiengang_kz, titel,'' as beschreibung,lehreinheit_id,lehrfach_id,anmerkung,fix,lehrveranstaltung_id,stg_kurzbzlang,stg_bezeichnung,stg_typ,fachbereich_kurzbz,lehrfach,lehrfach_bez,farbe,lehrform,anmerkung_lehreinheit
FROM (".$stundenplanViewQuery.") sp
) as sp
GROUP BY
ort_kurzbz,unr, datum, stunde, lehreinheit_id, lehrfach_id,studiengang_kz,titel,anmerkung,fix,lehrveranstaltung_id,stg_kurzbzlang,stg_bezeichnung,stg_typ,fachbereich_kurzbz,lehrfach,lehrfach_bez,farbe,lehrform,anmerkung_lehreinheit
ORDER BY datum, stunde
");
return $gruppierteEvents;
}
public function getStudenPlanQuery($uid){
return
"select sp.*
from lehre.vw_stundenplan sp
left join public.tbl_benutzergruppe bg ON sp.gruppe_kurzbz=bg.gruppe_kurzbz AND bg.uid =".$this->escape($uid)."
left join public.tbl_studiensemester ss1 ON bg.studiensemester_kurzbz=ss1.studiensemester_kurzbz AND ss1.start <=sp.datum AND ss1.ende>= sp.datum
left join public.tbl_studentlehrverband slv ON sp.studiengang_kz=slv.studiengang_kz and slv.student_uid=".$this->escape($uid)." and (slv.semester=sp.semester OR sp.semester IS NULL) AND (slv.verband=sp.verband OR sp.verband IS NULL OR sp.verband='' OR sp.verband='0') AND
(slv.gruppe=sp.gruppe OR sp.gruppe IS NULL OR sp.gruppe='' OR sp.gruppe='0') AND sp.gruppe_kurzbz IS NULL
left join public.tbl_studiensemester ss2 ON slv.studiensemester_kurzbz=ss2.studiensemester_kurzbz AND ss2.start<=sp.datum and ss2.ende >= sp.datum
WHERE ss1.studiensemester_kurzbz IS NOT NULL or ss2.studiensemester_kurzbz IS NOT NULL";
}
public function getRoomQuery($ort_kurzbz, $start_date, $end_date)
{
return
"select sp.*
FROM lehre.vw_stundenplan sp
WHERE ort_kurzbz = ".$this->escape($ort_kurzbz)."
AND datum >= ".$this->escape($start_date)."
AND datum <= ".$this->escape($end_date);
}
/**
* @param string $uid
*
@@ -149,7 +214,7 @@ class Stundenplan_model extends DB_Model
$this->db->or_where('ss2.studiensemester_kurzbz IS NOT NULL', null, false);
$query = $this->db->get_compiled_select('lehre.vw_stundenplan sp');
return $this->execQuery($query, [$uid, $uid]);
}
@@ -32,6 +32,13 @@ export default{
},
},
methods:{
updateRange: function(data){
this.calendarWeek = new CalendarDate(data.start);
Vue.nextTick(() => {
this.loadRoomEvents();
});
},
// returns the string YYYY-MM-DD if param is instance of CalendarDate and null otherwise
calendarDateToString: function(calendarDate){
@@ -40,69 +47,50 @@ export default{
null;
},
loadStunden: async function(){
await this.$fhcApi.factory.stundenplan.getStunden().then(res => {
res.data.forEach(std => {
this.stunden[std.stunde] = std; // TODO(chris): geht besser
});
});
},
loadRoomEvents: function(){
this.$fhcApi.factory.stundenplan.getRoomInfo(this.ort_kurzbz, this.weekFirstDay, this.weekLastDay).then(res => {
let events;
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;
});
this.events = res.data;
}
});
}
},
created() {
async mounted() {
this.$fhcApi.factory.stundenplan.getStunden().then(res =>{
res.data.forEach(std => {
this.stunden[std.stunde] = std; // TODO(chris): geht besser
});
// old testing room EDV_A6.09
this.$fhcApi.factory.stundenplan.getRoomInfo(this.ort_kurzbz, this.weekFirstDay, this.weekLastDay).then(res =>{
let events;
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;
});
this.events = res.data;
}
// reservierungen are loaded with the stundenplan
/* this.$fhcApi.factory.stundenplan.getReservierungen('EDV_F4.26', this.weekFirstDay, this.weekLastDay).then(res => {
if (res.data && res.data.forEach) {
res.data.forEach((el, i) => {
el.reservierung = true;
el.color = '#' + (el.farbe || 'ffffff');
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.titel;
if (el.lehrform)
el.title += '-' + el.lehrform;
});
}
let reservierungs_events = res.data;
this.events = [...(this.events?this.events:[]),...reservierungs_events];
}); */
});
});
this.loadStunden();
this.loadRoomEvents();
},
template: /*html*/`
<div>
<fhc-calendar v-slot="{event,day}" :initialDate="currentDate" :events="events" initial-mode="week" show-weeks>
<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+']'" >
<div class="d-flex flex-column align-items-center justify-content-evenly h-100" >