mirror of
https://github.com/FH-Complete/FHC-Core.git
synced 2026-06-01 20:29:29 +00:00
666 lines
24 KiB
PHP
666 lines
24 KiB
PHP
<?php
|
|
class Stundenplan_model extends DB_Model
|
|
{
|
|
|
|
/**
|
|
* Constructor
|
|
*/
|
|
public function __construct()
|
|
{
|
|
parent::__construct();
|
|
$this->dbTable = 'lehre.tbl_stundenplan';
|
|
$this->pk = 'stundenplan_id';
|
|
}
|
|
|
|
/**
|
|
* @param string $ort_kurzbz
|
|
* @param string $date
|
|
*
|
|
* @return stdClass
|
|
*/
|
|
public function getRoomDataOnInterval($ort_kurzbz,$start_date,$end_date){
|
|
|
|
|
|
|
|
/*$raum_stundenplan= $this->execReadOnlyQuery("
|
|
-- merging all reservierungs information with the stundenplan information but with different types
|
|
SELECT 'stundenplan_eintrag' as eintrags_type, CONCAT(UPPER(sp.stg_typ),UPPER(sp.stg_kurzbz),'-',COALESCE(CAST(sp.semester AS varchar),'/'),COALESCE(CAST(sp.verband AS varchar),'/')) AS stg, CONCAT(lehrfach,'-',lehrform) AS lv_info, ort_kurzbz, studiengang_kz, uid, stunde, datum, titel, semester, verband, gruppe, gruppe_kurzbz, stg_kurzbz, * FROM lehre.vw_stundenplan sp
|
|
WHERE ort_kurzbz = ? AND datum >= ? AND datum <= ?
|
|
UNION ALL
|
|
SELECT 'reservierungs_eintrag' as eintrags_type, NULL, NULL, ort_kurzbz, studiengang_kz, uid, stunde, datum, titel, semester, verband, gruppe, gruppe_kurzbz, stg_kurzbz, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL FROM lehre.vw_reservierung res
|
|
WHERE ort_kurzbz = ? AND datum >= ? AND datum <= ?
|
|
", [$ort_kurzbz, $start_date, $end_date,$ort_kurzbz, $start_date, $end_date]);
|
|
*/
|
|
|
|
|
|
$raum_stundenplan= $this->execReadOnlyQuery("
|
|
SELECT CONCAT(UPPER(sp.stg_typ),UPPER(sp.stg_kurzbz),'-',COALESCE(CAST(sp.semester AS varchar),'/'),COALESCE(CAST(sp.verband AS varchar),'/')) AS stg, CONCAT(lehrfach,'-',lehrform) AS lv_info, * FROM lehre.vw_stundenplan sp
|
|
WHERE ort_kurzbz = ? AND datum >= ? AND datum <= ?
|
|
", [$ort_kurzbz, $start_date, $end_date]);
|
|
|
|
return $raum_stundenplan;
|
|
}
|
|
|
|
/**
|
|
* @param string $ort_kurzbz The room to query the planning for
|
|
* @param string $start_date The start date of the query interval
|
|
* @param string $end_date The end date of the query interval
|
|
*
|
|
* @return stdClass
|
|
*/
|
|
public function groupedCalendarEvents($ort_kurzbz,$start_date,$end_date){
|
|
|
|
$gruppierteEvents= $this->execReadOnlyQuery("
|
|
SELECT
|
|
|
|
'reservierung' as type,
|
|
NULL as unr,datum, stunde,
|
|
titel AS topic,
|
|
beschreibung as beschreibung,
|
|
string_agg(DISTINCT gruppe, '/') as gruppe,
|
|
string_agg(DISTINCT lektor, '/') as lektor,
|
|
res.ort_kurzbz,res.studiengang_kz, res.titel, res.beschreibung,NULL as lehreinheit_id,NULL as lehrfach_id,NULL as anmerkung, NULL as fix,NULL as lehrveranstaltung_id,NULL as stg_kurzbzlang,NULL as stg_bezeichnung,NULL as stg_typ, NULL as fachbereich_kurzbz,NULL as lehrfach,NULL as lehrfach_bez,NULL as farbe,NULL as lehrform, NULL as anmerkung_lehreinheit
|
|
|
|
FROM
|
|
|
|
(
|
|
SELECT
|
|
NULL as unr,datum, stunde,
|
|
CASE
|
|
WHEN gruppe_kurzbz IS NOT NULL THEN gruppe_kurzbz
|
|
ELSE CONCAT(UPPER(studg.typ),UPPER(res.stg_kurzbz),'-',COALESCE(CAST(res.semester AS varchar),'/'),COALESCE(CAST(res.verband AS varchar),'/'))
|
|
END as gruppe,
|
|
CASE
|
|
WHEN mit.kurzbz IS NOT NULL THEN mit.kurzbz
|
|
ELSE uid
|
|
END as lektor,
|
|
res.ort_kurzbz,res.studiengang_kz, res.titel, res.beschreibung,NULL as lehreinheit_id,NULL as lehrfach_id,NULL as anmerkung, NULL as fix,NULL as lehrveranstaltung_id,NULL as stg_kurzbzlang,NULL as stg_bezeichnung,NULL as stg_typ, NULL as fachbereich_kurzbz,NULL as lehrfach,NULL as lehrfach_bez,NULL as farbe,NULL as lehrform, NULL as anmerkung_lehreinheit
|
|
FROM lehre.vw_reservierung res
|
|
|
|
LEFT JOIN public.tbl_mitarbeiter mit ON mit.mitarbeiter_uid=uid
|
|
JOIN public.tbl_studiengang studg ON studg.studiengang_kz=res.studiengang_kz
|
|
|
|
WHERE
|
|
res.ort_kurzbz = ?
|
|
AND res.datum >= ?
|
|
AND res.datum <= ?
|
|
) as res
|
|
|
|
GROUP BY res.ort_kurzbz,res.studiengang_kz, res.datum, res.stunde, res.titel, res.beschreibung
|
|
|
|
UNION ALL
|
|
|
|
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 lehre.vw_stundenplan sp
|
|
|
|
WHERE ort_kurzbz = ?
|
|
AND datum >= ?
|
|
AND datum <= ?
|
|
|
|
) 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
|
|
", [$ort_kurzbz, $start_date, $end_date, $ort_kurzbz, $start_date, $end_date]);
|
|
|
|
return $gruppierteEvents;
|
|
}
|
|
|
|
|
|
/**
|
|
* groups rows of a subquery that fetches data from the lehre.vw_stundenplan table
|
|
* @param string $stundenplanViewQuery the subquery used to group the result
|
|
*
|
|
* @return stdClass
|
|
*/
|
|
public function stundenplanGruppierung($stundenplanViewQuery)
|
|
{
|
|
$query_result = $this->execReadOnlyQuery("
|
|
SELECT
|
|
'lehreinheit' as type, beginn, ende, datum,
|
|
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,
|
|
array_agg(DISTINCT lehreinheit_id) as lehreinheit_id,
|
|
|
|
titel, lehrfach, lehrform, lehrfach_bez, organisationseinheit, farbe, lehrveranstaltung_id
|
|
|
|
FROM
|
|
(
|
|
SELECT unr,datum,beginn, ende,
|
|
CASE
|
|
WHEN sp.mitarbeiter_kurzbz IS NOT NULL THEN sp.mitarbeiter_kurzbz
|
|
ELSE lektor
|
|
END as lektor,
|
|
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_kuerzel,
|
|
(SELECT bezeichnung
|
|
FROM public.tbl_organisationseinheit
|
|
WHERE oe_kurzbz IN(
|
|
SELECT oe_kurzbz
|
|
FROM lehre.tbl_lehrveranstaltung
|
|
WHERE lehrveranstaltung_id = sp.lehrveranstaltung_id
|
|
)) as organisationseinheit,
|
|
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 subquery
|
|
|
|
GROUP BY unr, datum, beginn, ende, titel, lehrform, lehrfach, lehrfach_bez, organisationseinheit, farbe, lehrveranstaltung_id
|
|
|
|
ORDER BY datum, beginn
|
|
");
|
|
|
|
return $query_result;
|
|
}
|
|
|
|
/**
|
|
* groups rows of a subquery that fetches data from the lehre.vw_stundenplan table or lehre.vw_stundenplandev
|
|
* @param string $stundenplanViewQuery the subquery used to group the result regarding consecutive hours (Tab LV Termine)
|
|
*
|
|
* @return stdClass
|
|
*/
|
|
public function stundenplanGruppierungConsecutive($stundenplanViewQuery)
|
|
{
|
|
$query_result = $this->execReadOnlyQuery("
|
|
SELECT
|
|
distinct lehrveranstaltung_id,
|
|
datum,
|
|
MIN(beginn) as beginn,
|
|
MAX(ende) as ende,
|
|
type,
|
|
topic,
|
|
gruppe,
|
|
ort_kurzbz,
|
|
lehreinheit_id,
|
|
lehrfach_bez,
|
|
lektor,
|
|
lektorname,
|
|
gruppen_kuerzel,
|
|
farbe
|
|
FROM
|
|
(
|
|
SELECT
|
|
'lehreinheit' as type, beginn, ende, datum,
|
|
CONCAT(lehrfach,'-',lehrform) as topic,
|
|
array_agg(DISTINCT lektor) as lektor,
|
|
array_agg(DISTINCT lektorname) as lektorname,
|
|
array_agg(DISTINCT (gruppe,verband,semester,studiengang_kz,gruppen_kuerzel)) as gruppe,
|
|
array_agg(DISTINCT (gruppen_kuerzel)) as gruppen_kuerzel,
|
|
string_agg(DISTINCT ort_kurzbz, '/') as ort_kurzbz,
|
|
array_agg(DISTINCT lehreinheit_id) as lehreinheit_id,
|
|
titel, lehrfach, lehrform, lehrfach_bez, organisationseinheit, farbe, lehrveranstaltung_id
|
|
|
|
FROM
|
|
(
|
|
SELECT unr,datum,beginn, ende,
|
|
CASE
|
|
WHEN sp.mitarbeiter_kurzbz IS NOT NULL THEN sp.mitarbeiter_kurzbz
|
|
ELSE lektor
|
|
END as lektor,
|
|
CASE
|
|
WHEN gruppe_kurzbz IS NOT NULL THEN gruppe_kurzbz
|
|
ELSE (SELECT UPPER(typ || kurzbz)
|
|
FROM public.tbl_studiengang
|
|
WHERE studiengang_kz=sp.studiengang_kz) || COALESCE(sp.semester,'0') || COALESCE(sp.verband,'') || COALESCE(sp.gruppe,'')
|
|
END as gruppen_kuerzel,
|
|
(SELECT bezeichnung
|
|
FROM public.tbl_organisationseinheit
|
|
WHERE oe_kurzbz IN(
|
|
SELECT oe_kurzbz
|
|
FROM lehre.tbl_lehrveranstaltung
|
|
WHERE lehrveranstaltung_id = sp.lehrveranstaltung_id
|
|
)) as organisationseinheit,
|
|
ort_kurzbz, studiengang_kz, titel,lehreinheit_id,lehrfach_id,sp.anmerkung,fix,lehrveranstaltung_id,
|
|
stg_kurzbzlang,stg_bezeichnung,stg_typ,fachbereich_kurzbz,lehrfach,lehrfach_bez,farbe,lehrform,
|
|
anmerkung_lehreinheit,gruppe, verband, semester,stg_kurzbz,
|
|
CONCAT(p.nachname, ' ', p.vorname) as lektorname
|
|
|
|
FROM (".$stundenplanViewQuery.") sp
|
|
JOIN lehre.tbl_stunde ON lehre.tbl_stunde.stunde = sp.stunde
|
|
LEFT JOIN public.tbl_benutzer bn ON bn.uid = sp.uid
|
|
LEFT JOIN public.tbl_person p ON p.person_id = bn.person_id
|
|
) as subquery
|
|
|
|
GROUP BY unr, datum, beginn, ende, ort_kurzbz, titel, lehrform, lehrfach, lehrfach_bez, organisationseinheit,
|
|
farbe, lehrveranstaltung_id
|
|
|
|
ORDER BY datum, beginn) t
|
|
|
|
GROUP BY
|
|
lehrveranstaltung_id,
|
|
type,
|
|
datum,
|
|
topic,
|
|
lektor,
|
|
lehrfach_bez,
|
|
gruppe,
|
|
ort_kurzbz,
|
|
lehreinheit_id,
|
|
lektorname,
|
|
gruppen_kuerzel,
|
|
farbe
|
|
ORDER BY
|
|
datum, beginn
|
|
"
|
|
);
|
|
return $query_result;
|
|
}
|
|
|
|
/**
|
|
* queries Stundenplan but for a whole lva, irrespective of who is requesting it
|
|
*
|
|
* @return void
|
|
*/
|
|
public function getStundenplanLVA($start_date, $end_date, $lv_id) {
|
|
return $this->execReadOnlyQuery("
|
|
|
|
SELECT
|
|
'lehreinheit' as type, beginn, ende, datum,
|
|
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,
|
|
array_agg(DISTINCT lehreinheit_id) as lehreinheit_id,
|
|
|
|
titel, lehrfach, lehrform, lehrfach_bez, organisationseinheit, farbe, lehrveranstaltung_id
|
|
|
|
FROM
|
|
(
|
|
SELECT unr,datum,beginn, ende,
|
|
CASE
|
|
WHEN sp.mitarbeiter_kurzbz IS NOT NULL THEN sp.mitarbeiter_kurzbz
|
|
ELSE lektor
|
|
END as lektor,
|
|
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_kuerzel,
|
|
(SELECT bezeichnung
|
|
FROM public.tbl_organisationseinheit
|
|
WHERE oe_kurzbz IN(
|
|
SELECT oe_kurzbz
|
|
FROM lehre.tbl_lehrveranstaltung
|
|
WHERE lehrveranstaltung_id = sp.lehrveranstaltung_id
|
|
)) as organisationseinheit,
|
|
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 (
|
|
SELECT sp.*
|
|
FROM lehre.vw_stundenplan sp
|
|
WHERE
|
|
sp.datum >= ?
|
|
AND sp.datum <= ? AND sp.lehrveranstaltung_id = ?
|
|
) sp
|
|
JOIN lehre.tbl_stunde ON lehre.tbl_stunde.stunde = sp.stunde
|
|
|
|
) as subquery
|
|
|
|
GROUP BY unr, datum, beginn, ende, titel, lehrform, lehrfach, lehrfach_bez, organisationseinheit, farbe, lehrveranstaltung_id
|
|
|
|
ORDER BY datum, beginn
|
|
", [$start_date, $end_date, $lv_id]);
|
|
}
|
|
|
|
/**
|
|
* queries Stundenplan and filters by assigned ma_kurzbz, very similar to get by LVA
|
|
*
|
|
* @return void
|
|
*/
|
|
public function getStundenplanMitarbeiter($start_date, $end_date, $ma_uid) {
|
|
return $this->execReadOnlyQuery("
|
|
|
|
SELECT
|
|
'lehreinheit' as type, beginn, ende, datum,
|
|
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,
|
|
array_agg(DISTINCT lehreinheit_id) as lehreinheit_id,
|
|
|
|
titel, lehrfach, lehrform, lehrfach_bez, organisationseinheit, farbe, lehrveranstaltung_id
|
|
|
|
FROM
|
|
(
|
|
SELECT unr,datum,beginn, ende,
|
|
CASE
|
|
WHEN sp.mitarbeiter_kurzbz IS NOT NULL THEN sp.mitarbeiter_kurzbz
|
|
ELSE sp.lektor
|
|
END as lektor,
|
|
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_kuerzel,
|
|
(SELECT bezeichnung
|
|
FROM public.tbl_organisationseinheit
|
|
WHERE oe_kurzbz IN(
|
|
SELECT oe_kurzbz
|
|
FROM lehre.tbl_lehrveranstaltung
|
|
WHERE lehrveranstaltung_id = sp.lehrveranstaltung_id
|
|
)) as organisationseinheit,
|
|
sp.ort_kurzbz, sp.studiengang_kz, sp.titel,sp.lehreinheit_id,sp.lehrfach_id,sp.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 (
|
|
SELECT sp.*
|
|
FROM lehre.vw_stundenplan sp
|
|
WHERE
|
|
sp.datum >= ?
|
|
AND sp.datum <= ?
|
|
) sp
|
|
JOIN lehre.tbl_stunde ON lehre.tbl_stunde.stunde = sp.stunde
|
|
JOIN public.tbl_mitarbeiter ON public.tbl_mitarbeiter.kurzbz = sp.mitarbeiter_kurzbz
|
|
WHERE mitarbeiter_uid = ?
|
|
|
|
) as subquery
|
|
|
|
GROUP BY unr, datum, beginn, ende, titel, lehrform, lehrfach, lehrfach_bez, organisationseinheit, farbe, lehrveranstaltung_id
|
|
|
|
ORDER BY datum, beginn", [$start_date, $end_date, $ma_uid]);
|
|
}
|
|
|
|
/**
|
|
* queries Stundenplan and filters by studiengang, semester, verband gruppe
|
|
*
|
|
* @return void
|
|
*/
|
|
public function getStundenplanStudiengang($start_date, $end_date, $stg_kz, $sem, $verband, $gruppe) {
|
|
|
|
$qry_params = [$start_date, $end_date, $stg_kz];
|
|
|
|
$qry = "
|
|
SELECT
|
|
'lehreinheit' as type, beginn, ende, datum,
|
|
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,
|
|
array_agg(DISTINCT lehreinheit_id) as lehreinheit_id,
|
|
titel, lehrfach, lehrform, lehrfach_bez, organisationseinheit, farbe, lehrveranstaltung_id
|
|
FROM
|
|
(
|
|
SELECT unr,datum,beginn, ende,
|
|
CASE
|
|
WHEN sp.mitarbeiter_kurzbz IS NOT NULL THEN sp.mitarbeiter_kurzbz
|
|
ELSE sp.lektor
|
|
END as lektor,
|
|
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_kuerzel,
|
|
(SELECT bezeichnung
|
|
FROM public.tbl_organisationseinheit
|
|
WHERE oe_kurzbz IN(
|
|
SELECT oe_kurzbz
|
|
FROM lehre.tbl_lehrveranstaltung
|
|
WHERE lehrveranstaltung_id = sp.lehrveranstaltung_id
|
|
)) as organisationseinheit,
|
|
sp.ort_kurzbz, sp.studiengang_kz, sp.titel,sp.lehreinheit_id,sp.lehrfach_id,sp.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 (
|
|
SELECT sp.*
|
|
FROM lehre.vw_stundenplan sp
|
|
WHERE
|
|
sp.datum >= ?
|
|
AND sp.datum <= ?
|
|
) sp
|
|
JOIN lehre.tbl_stunde ON lehre.tbl_stunde.stunde = sp.stunde
|
|
WHERE studiengang_kz = ? ";
|
|
|
|
if($sem != NULL)
|
|
{
|
|
$qry_params[] = $sem;
|
|
$qry .= " AND (semester = ? OR semester IS NULL)";
|
|
}
|
|
if($verband != NULL)
|
|
{
|
|
$qry_params[] = $verband;
|
|
$qry .= " AND (verband = ? OR verband IS NULL OR verband = '0' OR verband = '')";
|
|
}
|
|
if($gruppe != NULL)
|
|
{
|
|
$qry_params[] = $gruppe;
|
|
$qry .= " AND (gruppe = ? OR gruppe IS NULL OR gruppe = '0' OR gruppe = '') ";
|
|
}
|
|
$qry.= " AND (
|
|
gruppe_kurzbz is null OR EXISTS(
|
|
SELECT 1
|
|
FROM
|
|
public.tbl_gruppe WHERE gruppe_kurzbz = sp.gruppe_kurzbz AND direktinskription = false
|
|
)
|
|
)";
|
|
|
|
$qry.= " ) as subquery
|
|
|
|
GROUP BY unr, datum, beginn, ende, titel, lehrform, lehrfach, lehrfach_bez, organisationseinheit, farbe, lehrveranstaltung_id
|
|
ORDER BY datum, beginn; ";
|
|
|
|
return $this->execReadOnlyQuery($qry, $qry_params);
|
|
}
|
|
|
|
/**
|
|
* NO STANDALONE FUNCTION - Generates a SQL query string to fetch 'stundenplan' events for a specific student within the current semester.
|
|
*
|
|
* @param isLvList if condition needed for Tab LV Termine is given
|
|
* @param db_stpl_table enables switch to db 'stundenplandev'
|
|
*
|
|
* @return mixed
|
|
*/
|
|
public function getStundenplanQuery($start_date, $end_date, $semester, $gruppen, $studentlehrverbaende, $isLvList=false, $db_stpl_table='stundenplan'){
|
|
|
|
// helper function to check if either $gruppen or $studentlehrverbaende are empty for each semester
|
|
$emptyCheck = function($toBeCheckedArray) use ($semester){
|
|
$result = true;
|
|
$sem = array_keys($semester);
|
|
foreach($sem as $s){
|
|
if(count($toBeCheckedArray[$s]) > 0){
|
|
$result = false;
|
|
break;
|
|
}
|
|
}
|
|
return $result;
|
|
};
|
|
|
|
// if both the gruppen and the studentlehrverbaende are empty we early return
|
|
if($emptyCheck($gruppen) && $emptyCheck($studentlehrverbaende))
|
|
{
|
|
return false;
|
|
}
|
|
|
|
$query =
|
|
"select sp.*
|
|
from lehre.vw_".$db_stpl_table." sp
|
|
WHERE
|
|
sp.datum >= ".$this->escape($start_date)."
|
|
AND sp.datum <= ".$this->escape($end_date);
|
|
|
|
// adds the AND sql chain only if both $gruppen and $studentlehrverbaende are not empty
|
|
if(!$emptyCheck($gruppen) || !$emptyCheck($studentlehrverbaende))
|
|
{
|
|
$query .= " AND ( ";
|
|
}
|
|
|
|
foreach($semester as $sem => $semester_date_range)
|
|
{
|
|
|
|
foreach($semester_date_range as $sem_date => $sem_date_range)
|
|
{
|
|
// if there are not groups for the semester skip the iteration step
|
|
if(!array_key_exists($sem_date,$gruppen) || count($gruppen[$sem_date]) == 0)
|
|
{
|
|
continue;
|
|
}
|
|
// converts the array of gruppen strings into a sql IN (_,_,_) chain
|
|
$query .="(sp.gruppe_kurzbz IN (" .implode(',',$gruppen[$sem_date]).") AND sp.datum BETWEEN ".$this->escape($sem_date_range->start)." AND ".$this->escape($sem_date_range->ende)." )";
|
|
|
|
$query .="OR";
|
|
}
|
|
}
|
|
|
|
// if there are no studentlehrverbaende and the gruppen are not empty, we can remove the last OR added after the groups
|
|
if($emptyCheck($studentlehrverbaende) && !$emptyCheck($gruppen))
|
|
{
|
|
$query = substr($query, 0, -2);
|
|
}
|
|
|
|
//Condition for showLVList FHC4
|
|
if(!$isLvList)
|
|
$stringGroupLv = "AND gruppe_kurzbz is null";
|
|
else
|
|
$stringGroupLv ="";
|
|
|
|
foreach($semester as $sem=>$semester_date_range)
|
|
{
|
|
foreach($semester_date_range as $sem_date => $sem_date_range)
|
|
{
|
|
if(!array_key_exists($sem_date,$studentlehrverbaende) || count($studentlehrverbaende[$sem_date]) == 0)
|
|
{
|
|
continue;
|
|
}
|
|
foreach($studentlehrverbaende[$sem_date] as $key=>$lehrverband)
|
|
{
|
|
$query .= "(((sp.studiengang_kz = ".$this->escape($lehrverband->studiengang_kz)." AND sp.semester = ".$this->escape($lehrverband->semester)." AND sp.verband = ".$this->escape($lehrverband->verband)." AND sp.gruppe = ".$this->escape($lehrverband->gruppe)." AND sp.datum BETWEEN ".$this->escape($sem_date_range->start)." AND ".$this->escape($sem_date_range->ende).")";
|
|
// Eintraege fuer den ganzen Verband
|
|
$query .= "OR (sp.studiengang_kz = ".$this->escape($lehrverband->studiengang_kz)." AND sp.semester = ".$this->escape($lehrverband->semester)." AND sp.verband = ".$this->escape($lehrverband->verband)." AND (sp.gruppe is null OR sp.gruppe='') AND sp.datum BETWEEN ".$this->escape($sem_date_range->start)." AND ".$this->escape($sem_date_range->ende).")";
|
|
// Eintraege fuer das ganze Semester
|
|
$query .= "OR (sp.studiengang_kz = ".$this->escape($lehrverband->studiengang_kz)." AND sp.semester = ".$this->escape($lehrverband->semester)." AND (sp.verband is null OR sp.verband='') AND sp.datum BETWEEN ".$this->escape($sem_date_range->start)
|
|
." AND ".$this->escape($sem_date_range->ende).")) AND gruppe_kurzbz is null)";
|
|
|
|
$query .="OR";
|
|
}
|
|
}
|
|
}
|
|
|
|
// if the studentlehrverbaende is not empty we can remove the last OR that was added to the query
|
|
if(!$emptyCheck($studentlehrverbaende))
|
|
{
|
|
$query = substr($query, 0, -2);
|
|
}
|
|
|
|
// closes the AND sql chain only if it was opened previously
|
|
if(!$emptyCheck($gruppen) || !$emptyCheck($studentlehrverbaende))
|
|
{
|
|
$query .= ")";
|
|
}
|
|
|
|
return $query;
|
|
}
|
|
|
|
/**
|
|
* NO STANDALONE FUNCTION - Generates a SQL query string to fetch 'stundenplan' events for a specific room within a date range.
|
|
* @param string $ort_kurzbz the ort from which we want to query the stundenplan events
|
|
* @param string $start_date (inclusive) the minimum date that an event should have to be fetched
|
|
* @param string $end_date (inclusive) the maximum date that an event should not extend to be fetched
|
|
*
|
|
* @return string
|
|
*/
|
|
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
|
|
*
|
|
* @return stdClass
|
|
*/
|
|
public function loadForUid($uid)
|
|
{
|
|
$this->addSelect(['sp.*','le.studiensemester_kurzbz']);
|
|
$this->db->join('public.tbl_benutzergruppe bg', 'sp.gruppe_kurzbz=bg.gruppe_kurzbz AND bg.uid=?', 'LEFT', false);
|
|
$this->addJoin('public.tbl_studiensemester ss1', 'bg.studiensemester_kurzbz=ss1.studiensemester_kurzbz AND ss1.start<=sp.datum AND ss1.ende>=sp.datum', 'LEFT');
|
|
$this->db->join('public.tbl_studentlehrverband slv', "sp.studiengang_kz=slv.studiengang_kz AND slv.student_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', false);
|
|
$this->addJoin('public.tbl_studiensemester ss2', 'slv.studiensemester_kurzbz=ss2.studiensemester_kurzbz AND ss2.start<=sp.datum AND ss2.ende>=sp.datum', 'LEFT');
|
|
$this->db->join('lehre.tbl_lehreinheit le', 'le.lehreinheit_id=sp.lehreinheit_id', 'LEFT');
|
|
$this->db->or_where('ss1.studiensemester_kurzbz IS NOT NULL', null, false);
|
|
$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]);
|
|
}
|
|
|
|
/**
|
|
* Get Stundenplantermine for given Lehreinheit.
|
|
*
|
|
* @param $lehreinheit_id
|
|
* @return array|stdClass|null
|
|
*/
|
|
public function getTermineByLe($lehreinheit_id)
|
|
{
|
|
$qry = '
|
|
SELECT DISTINCT
|
|
datum
|
|
FROM
|
|
lehre.vw_stundenplan
|
|
WHERE
|
|
lehreinheit_id = ?
|
|
ORDER BY
|
|
datum ASC
|
|
';
|
|
|
|
return $this->execQuery($qry, [$lehreinheit_id]);
|
|
}
|
|
|
|
/**
|
|
* Get Stundenplantermine for given Lehrveranstaltung of given Studiensemester.
|
|
*
|
|
* @param $lehrveranstaltung_id
|
|
* @param $studiensemester_kurzbz
|
|
* @return array|stdClass|null
|
|
*/
|
|
public function getTermineByLv($lehrveranstaltung_id, $studiensemester_kurzbz)
|
|
{
|
|
$qry = '
|
|
SELECT DISTINCT
|
|
datum
|
|
FROM
|
|
lehre.vw_stundenplan
|
|
WHERE
|
|
lehreinheit_id IN (
|
|
SELECT lehreinheit_id
|
|
FROM lehre.tbl_lehreinheit
|
|
WHERE lehrveranstaltung_id = ?
|
|
AND studiensemester_kurzbz = ?
|
|
)
|
|
ORDER BY datum ASC
|
|
';
|
|
|
|
return $this->execQuery($qry, [$lehrveranstaltung_id, $studiensemester_kurzbz]);
|
|
}
|
|
}
|