mirror of
https://github.com/FH-Complete/FHC-Core.git
synced 2026-07-19 16:02:15 +00:00
reworks the query for the reservierungen stundenplan/room
This commit is contained in:
@@ -97,24 +97,36 @@ class Stundenplan extends FHCAPI_Controller
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* fetches stundenplan events from a UID and start/end date
|
||||
* @access public
|
||||
*
|
||||
*/
|
||||
public function getStundenplan(){
|
||||
|
||||
// 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);
|
||||
|
||||
$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()));
|
||||
// the stundenplan query needs the uid and a start and end date
|
||||
$stundenplan_data = $this->StundenplanModel->stundenplanGruppierung($this->StundenplanModel->getStundenplanQuery(get_uid(),$start_date,$end_date));
|
||||
$stundenplan_data = $this->getDataOrTerminateWithError($stundenplan_data);
|
||||
|
||||
$res = getData($res);
|
||||
|
||||
$this->outputJsonSuccess($res);
|
||||
$this->terminateWithSuccess($stundenplan_data);
|
||||
}
|
||||
|
||||
// reservierungen is not used in the prototype for the students
|
||||
public function Reservierungen()
|
||||
// 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)
|
||||
{
|
||||
$this->load->model('ressource/Reservierung_model', 'ReservierungModel');
|
||||
$this->load->model('ressource/Stunde_model', 'StundeModel');
|
||||
@@ -123,13 +135,11 @@ class Stundenplan extends FHCAPI_Controller
|
||||
//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', "StartDate", "required");
|
||||
$this->form_validation->set_rules('end_date', "EndDate", "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);
|
||||
|
||||
@@ -139,100 +149,18 @@ class Stundenplan extends FHCAPI_Controller
|
||||
$stunden = $this->getDataOrTerminateWithError($stunden);
|
||||
|
||||
// querying the reservierungen
|
||||
$result = $this->ReservierungModel->getRoomReservierungen($ort_kurzbz, $start_date, $end_date);
|
||||
if(isset($ort_kurzbz)){
|
||||
$result = $this->ReservierungModel->getReservierungen($start_date, $end_date, $ort_kurzbz);
|
||||
}else{
|
||||
$result = $this->ReservierungModel->getReservierungen($start_date, $end_date);
|
||||
}
|
||||
|
||||
$result = $this->getDataOrTerminateWithError($result);
|
||||
$this->terminateWithSuccess($result);
|
||||
// imperative approach
|
||||
/* $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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
// 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); */
|
||||
$this->terminateWithSuccess($result);
|
||||
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -18,8 +18,31 @@ class Reservierung_model extends DB_Model
|
||||
*
|
||||
* @return stdClass
|
||||
*/
|
||||
public function getRoomReservierungen($ort_kurzbz, $start_date, $end_date)
|
||||
public function getReservierungen($start_date, $end_date, $ort_kurzbz = null)
|
||||
{
|
||||
|
||||
$stundenplan_reservierungen="SELECT r.* , beginn, ende
|
||||
FROM campus.vw_reservierung r
|
||||
LEFT JOIN public.tbl_benutzergruppe bg ON r.gruppe_kurzbz=bg.gruppe_kurzbz AND bg.uid=?
|
||||
LEFT JOIN public.tbl_studiensemester ss1 ON bg.studiensemester_kurzbz=ss1.studiensemester_kurzbz AND ss1.start <= r.datum AND ss1.ende >= r.datum
|
||||
LEFT JOIN public.tbl_studentlehrverband slv ON r.studiengang_kz=slv.studiengang_kz AND slv.student_uid=? AND (slv.semester=r.semester OR r.semester IS NULL) AND (slv.verband=r.verband OR r.verband IS NULL OR r.verband='' OR r.verband='0') AND (slv.gruppe=r.gruppe OR r.gruppe IS NULL OR r.gruppe ='' OR r.gruppe ='0') AND r.gruppe_kurzbz IS NULL
|
||||
LEFT JOIN public.tbl_studiensemester ss2 ON slv.studiensemester_kurzbz = ss2.studiensemester_kurzbz AND ss2.start <=r.datum AND ss2.ende >= r.datum
|
||||
JOIN lehre.tbl_stunde ON lehre.tbl_stunde.stunde = r.stunde
|
||||
WHERE datum >= ? AND datum <= ? AND (ss1.studiensemester_kurzbz IS NOT NULL
|
||||
OR ss2.studiensemester_kurzbz IS NOT NULL)";
|
||||
|
||||
$raum_reservierungen = "SELECT res.*, beginn, ende,
|
||||
CASE
|
||||
WHEN res.gruppe_kurzbz IS NOT NULL THEN res.gruppe_kurzbz
|
||||
ELSE CONCAT(UPPER(studg.typ),UPPER(studg.kurzbz),'-',COALESCE(CAST(res.semester AS varchar),'/'),COALESCE(CAST(res.verband AS varchar),'/'))
|
||||
END as gruppen_kuerzel
|
||||
|
||||
FROM lehre.vw_reservierung res
|
||||
JOIN public.tbl_studiengang studg ON studg.studiengang_kz=res.studiengang_kz
|
||||
JOIN lehre.tbl_stunde ON lehre.tbl_stunde.stunde = res.stunde
|
||||
WHERE res.ort_kurzbz = ? AND datum >= ? AND datum <= ?";
|
||||
|
||||
|
||||
|
||||
$raum_reservierungen= $this->execReadOnlyQuery("
|
||||
SELECT
|
||||
@@ -32,23 +55,13 @@ class Reservierung_model extends DB_Model
|
||||
|
||||
FROM
|
||||
(
|
||||
SELECT res.*, beginn, ende,
|
||||
CASE
|
||||
WHEN res.gruppe_kurzbz IS NOT NULL THEN res.gruppe_kurzbz
|
||||
ELSE CONCAT(UPPER(studg.typ),UPPER(studg.kurzbz),'-',COALESCE(CAST(res.semester AS varchar),'/'),COALESCE(CAST(res.verband AS varchar),'/'))
|
||||
END as gruppen_kuerzel
|
||||
|
||||
FROM lehre.vw_reservierung res
|
||||
JOIN public.tbl_studiengang studg ON studg.studiengang_kz=res.studiengang_kz
|
||||
JOIN lehre.tbl_stunde ON lehre.tbl_stunde.stunde = res.stunde
|
||||
WHERE res.ort_kurzbz = ? AND datum >= ? AND datum <= ?
|
||||
|
||||
". is_null($ort_kurzbz)? $stundenplan_reservierungen:$raum_reservierungen ."
|
||||
) AS subquery
|
||||
|
||||
GROUP BY datum, beginn, ende, ort_kurzbz, titel, beschreibung
|
||||
|
||||
ORDER BY datum, beginn
|
||||
", [$ort_kurzbz, $start_date, $end_date]);
|
||||
", is_null($ort_kurzbz) ?[getAuthUID(), getAuthUID(),$start_date,$end_date]: [$ort_kurzbz, $start_date, $end_date]);
|
||||
|
||||
if(isError($raum_reservierungen)){
|
||||
show_error(getError($raum_reservierungen));
|
||||
|
||||
@@ -148,8 +148,9 @@ class Stundenplan_model extends DB_Model
|
||||
CONCAT(lehrfach,'-',lehrform) as topic,
|
||||
array_agg(DISTINCT lektor) as lektor,
|
||||
array_agg(DISTINCT (gruppe,verband,semester,studiengang_kz,gruppen_kuerzel)) as gruppe,
|
||||
string_agg(DISTINCT ort_kurzbz, '/') as ort_kurzbz,
|
||||
|
||||
ort_kurzbz, titel, lehrfach, lehrform, lehrfach_bez, organisationseinheit, farbe
|
||||
titel, lehrfach, lehrform, lehrfach_bez, organisationseinheit, farbe
|
||||
|
||||
FROM
|
||||
(
|
||||
@@ -243,7 +244,7 @@ class Stundenplan_model extends DB_Model
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getStundenPlanQuery($uid){
|
||||
public function getStundenplanQuery($uid, $start_date, $end_date){
|
||||
return
|
||||
"select sp.*
|
||||
from lehre.vw_stundenplan sp
|
||||
@@ -252,7 +253,9 @@ class Stundenplan_model extends DB_Model
|
||||
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";
|
||||
WHERE ss1.studiensemester_kurzbz IS NOT NULL or ss2.studiensemester_kurzbz IS NOT NULL
|
||||
AND sp.datum >= ".$this->escape($start_date)."
|
||||
AND sp.datum <= ".$this->escape($end_date);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -6,16 +6,28 @@ export default {
|
||||
{ ort_kurzbz, start_date, end_date}
|
||||
);
|
||||
},
|
||||
getStundenplan(start_date, end_date) {
|
||||
return this.$fhcApi.get(
|
||||
'/api/frontend/v1/Stundenplan/getStundenplan',
|
||||
{ start_date, end_date }
|
||||
);
|
||||
},
|
||||
getStunden() {
|
||||
return this.$fhcApi.get(
|
||||
'/api/frontend/v1/Stundenplan/Stunden',
|
||||
{}
|
||||
);
|
||||
},
|
||||
getReservierungen(ort_kurzbz, start_date, end_date) {
|
||||
getOrtReservierungen(ort_kurzbz, start_date, end_date) {
|
||||
return this.$fhcApi.get(
|
||||
`/api/frontend/v1/Stundenplan/Reservierungen/${ort_kurzbz}`,
|
||||
{ start_date, end_date}
|
||||
);
|
||||
},
|
||||
getStundenplanReservierungen(start_date, end_date) {
|
||||
return this.$fhcApi.get(
|
||||
'/api/frontend/v1/Stundenplan/Reservierungen',
|
||||
{ ort_kurzbz, start_date, end_date}
|
||||
{ start_date, end_date }
|
||||
);
|
||||
},
|
||||
};
|
||||
@@ -1,53 +1,77 @@
|
||||
import FhcCalendar from "../../components/Calendar/Calendar.js";
|
||||
import Phrasen from "../../plugin/Phrasen.js";
|
||||
import CalendarDate from "../../composables/CalendarDate.js";
|
||||
|
||||
|
||||
const app = Vue.createApp({
|
||||
components: {
|
||||
FhcCalendar
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
stunden: [],
|
||||
events: null
|
||||
events: null,
|
||||
calendarWeek: new CalendarDate(new Date()),
|
||||
|
||||
}
|
||||
},
|
||||
created() {
|
||||
axios.get(FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + '/components/Cis/Stundenplan/Stunden').then(res => {
|
||||
res.data.retval.forEach(std => {
|
||||
this.stunden[std.stunde] = std; // TODO(chris): geht besser
|
||||
});
|
||||
axios.get(FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + '/components/Cis/Stundenplan').then(res => {
|
||||
let events;
|
||||
if (res.data.retval && res.data.retval.forEach) {
|
||||
res.data.retval.forEach((el, i) => {
|
||||
el.id = i;
|
||||
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;
|
||||
});
|
||||
events = res.data.retval;
|
||||
}
|
||||
// TODO(chris): do we need that
|
||||
axios.get(FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + '/components/Cis/Stundenplan/Reservierungen').then(res => {
|
||||
if (res.data.retval && res.data.retval.forEach) {
|
||||
res.data.retval.forEach((el, i) => {
|
||||
el.id = i + events.length;
|
||||
el.color = '#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;
|
||||
});
|
||||
events = [...events, ...res.data.retval];
|
||||
components: {
|
||||
FhcCalendar
|
||||
},
|
||||
computed:{
|
||||
weekFirstDay: function () {
|
||||
return this.calendarDateToString(this.calendarWeek.cdFirstDayOfWeek);
|
||||
},
|
||||
weekLastDay: function () {
|
||||
return this.calendarDateToString(this.calendarWeek.cdLastDayOfWeek);
|
||||
},
|
||||
},
|
||||
methods:{
|
||||
|
||||
calendarDateToString: function (calendarDate) {
|
||||
|
||||
return calendarDate instanceof CalendarDate ?
|
||||
[calendarDate.y, calendarDate.m + 1, calendarDate.d].join('-') :
|
||||
null;
|
||||
|
||||
},
|
||||
|
||||
loadEvents: function(){
|
||||
console.log("this are the days with which i am testing", this.weekFirstDay, this.weekLastDay)
|
||||
Promise.allSettled([
|
||||
this.$fhcApi.factory.stundenplan.getStundenplan(this.weekFirstDay, this.weekLastDay),
|
||||
this.$fhcApi.factory.stundenplan.getStundenplanReservierungen(this.weekFirstDay, this.weekLastDay)
|
||||
]).then((result) => {
|
||||
let promise_events = [];
|
||||
result.forEach((promise_result) => {
|
||||
if (promise_result.status === 'fulfilled' && promise_result.value.meta.status === "success") {
|
||||
|
||||
let data = promise_result.value.data;
|
||||
// adding additional information to the events
|
||||
if (data && data.forEach) {
|
||||
|
||||
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 + ' ' + el.beginn);
|
||||
el.end = new Date(el.datum + ' ' + el.ende);
|
||||
|
||||
});
|
||||
}
|
||||
promise_events = promise_events.concat(data);
|
||||
}
|
||||
this.events = events;
|
||||
});
|
||||
})
|
||||
this.events = promise_events;
|
||||
});
|
||||
});
|
||||
},
|
||||
},
|
||||
created() {
|
||||
this.loadEvents();
|
||||
|
||||
|
||||
|
||||
},
|
||||
template:/*html*/`
|
||||
<h2>Stundenplan</h2>
|
||||
|
||||
@@ -53,7 +53,7 @@ export default{
|
||||
// bundles the room_events and the reservierungen together into the this.events array
|
||||
Promise.allSettled([
|
||||
this.$fhcApi.factory.stundenplan.getRoomInfo(this.ort_kurzbz, this.weekFirstDay, this.weekLastDay),
|
||||
this.$fhcApi.factory.stundenplan.getReservierungen(this.ort_kurzbz, this.weekFirstDay, this.weekLastDay)
|
||||
this.$fhcApi.factory.stundenplan.getOrtReservierungen(this.ort_kurzbz, this.weekFirstDay, this.weekLastDay)
|
||||
]).then((result) => {
|
||||
let events = [];
|
||||
result.forEach((promise_result) => {
|
||||
|
||||
Reference in New Issue
Block a user