Files
2024-12-20 14:15:28 +01:00

204 lines
6.1 KiB
PHP

<?php
class Anwesenheit_model extends DB_Model
{
/**
* Constructor
*/
public function __construct()
{
parent::__construct();
$this->dbTable = 'campus.tbl_anwesenheit';
$this->pk = 'anwesenheit_id';
}
/**
* Laedt die Anwesenheiten in Prozent von Studierenden bei Lehrveranstaltungen
* Wenn die StudentUID uebergeben wird, werden alle Lehrveranstaltungen zu denen der Studierenden zugeteilt ist inkl Prozent der Anwesenheit
* Wenn die LehrveranstaltungID uebergeben wird, werden alle Studierenden geholt die zugeteilt sind inkl Prozent der Anwesenheit
* Es werden pro Student die Anwesenheiten berechnet aufgrund der Lehreinheit zu der sie zugeordnet sind
*
* @param string $studiensemester_kurzbz
* @param string|null (optional) $student_uid
* @param integer|null (optional) $lehrveranstaltung_id
*
* @return stdClass
*/
public function loadAnwesenheitStudiensemester($studiensemester_kurzbz, $student_uid = null, $lehrveranstaltung_id = null)
{
$this->addSelect("vorname");
$this->addSelect("nachname");
$this->addSelect("wahlname");
$this->addSelect("lehrveranstaltung_id");
$this->addSelect("bezeichnung");
$this->addSelect("gruppe");
$this->addSelect("student_uid AS uid");
$this->addSelect("COUNT(stundenplan_id) AS gesamtstunden");
$this->addSelect("COALESCE(anwesend.summe, 0) AS anwesend");
$this->addSelect("COALESCE(nichtanwesend.summe, 0) AS nichtanwesend");
$this->addSelect("COALESCE(anwesend.summe, 0) + COALESCE(nichtanwesend.summe, 0) AS erfassteanwesenheit");
$this->addSelect("CASE
WHEN COUNT(stundenplan_id) = 0 OR COALESCE(anwesend.summe, 0) + COALESCE(nichtanwesend.summe, 0) = 0
THEN 100
ELSE TRUNC(100-(100/COUNT(stundenplan_id)*COALESCE(nichtanwesend.summe, 0)), 2)
END AS prozent");
$this->db->join("(
SELECT
semester::text AS gruppe,
public.tbl_studentlehrverband.studiensemester_kurzbz,
student_uid,
studiengang_kz
FROM public.tbl_studentlehrverband
WHERE studiensemester_kurzbz = " . $this->escape($studiensemester_kurzbz) . "
UNION
SELECT
semester || verband AS gruppe,
public.tbl_studentlehrverband.studiensemester_kurzbz,
student_uid,
studiengang_kz
FROM public.tbl_studentlehrverband
WHERE studiensemester_kurzbz = " . $this->escape($studiensemester_kurzbz) . "
UNION
SELECT
semester || verband || gruppe AS gruppe,
public.tbl_studentlehrverband.studiensemester_kurzbz,
student_uid,
studiengang_kz
FROM public.tbl_studentlehrverband
WHERE studiensemester_kurzbz = " . $this->escape($studiensemester_kurzbz) . "
UNION
SELECT
gruppe_kurzbz AS gruppe,
public.tbl_benutzergruppe.studiensemester_kurzbz,
uid AS student_uid,
studiengang_kz
FROM public.tbl_benutzergruppe
JOIN public.tbl_gruppe USING (gruppe_kurzbz)
WHERE studiensemester_kurzbz = " . $this->escape($studiensemester_kurzbz) . "
) a", "gruppe,studiensemester_kurzbz,studiengang_kz", "", false);
$this->addJoin("public.tbl_benutzer b", "b.uid = student_uid");
$this->addJoin("public.tbl_person p", "person_id");
$this->db->join("(
SELECT
lehrveranstaltung_id,
studiensemester_kurzbz, uid AS student_uid,
SUM(einheiten) AS summe
FROM campus.tbl_anwesenheit a
JOIN lehre.tbl_lehreinheit le USING (lehreinheit_id)
JOIN lehre.tbl_lehrveranstaltung lv USING (lehrveranstaltung_id)
WHERE anwesend = TRUE
AND studiensemester_kurzbz = " . $this->escape($studiensemester_kurzbz) . "
GROUP BY
lehrveranstaltung_id,
bezeichnung,
uid,
studiensemester_kurzbz
) anwesend", "lehrveranstaltung_id,student_uid,studiensemester_kurzbz", "LEFT", false);
$this->db->join("(
SELECT
lehrveranstaltung_id,
studiensemester_kurzbz,
uid AS student_uid,
SUM(einheiten) AS summe
FROM campus.tbl_anwesenheit a
JOIN lehre.tbl_lehreinheit le USING (lehreinheit_id)
JOIN lehre.tbl_lehrveranstaltung lv USING (lehrveranstaltung_id)
WHERE anwesend = FALSE
AND studiensemester_kurzbz = " . $this->escape($studiensemester_kurzbz) . "
GROUP BY
lehrveranstaltung_id, bezeichnung, uid, studiensemester_kurzbz
) nichtanwesend", "lehrveranstaltung_id,student_uid,studiensemester_kurzbz", "LEFT", false);
$this->addGroupBy("vorname");
$this->addGroupBy("nachname");
$this->addGroupBy("wahlname");
$this->addGroupBy("lehrveranstaltung_id");
$this->addGroupBy("bezeichnung");
$this->addGroupBy("gruppe");
$this->addGroupBy("student_uid");
$this->addGroupBy("anwesend.summe");
$this->addGroupBy("nichtanwesend.summe");
$where = [
"lehrveranstaltung_id >" => 0
];
if ($student_uid)
$where["student_uid"] = $student_uid;
if ($lehrveranstaltung_id)
$where["lehrveranstaltung_id"] = $lehrveranstaltung_id;
if ($lehrveranstaltung_id) {
$this->addOrder("nachname");
$this->addOrder("vorname");
} elseif ($student_uid) {
$this->addOrder("bezeichnung");
}
$tmp = $this->dbTable;
$this->dbTable = "(
SELECT
SUM(stundenplan_id) AS stundenplan_id,
datum,
stunde,
lehrveranstaltung_id,
bezeichnung,
studiensemester_kurzbz,
studiengang_kz,
TRIM(
CASE
WHEN stp.gruppe_kurzbz IS NOT NULL
THEN stp.gruppe_kurzbz
ELSE stp.semester || (
CASE
WHEN verband IS NULL
THEN ''
ELSE stp.verband
END
) || (
CASE
WHEN stp.gruppe IS NULL
THEN ''
ELSE stp.gruppe
END
)
END
) AS gruppe
FROM lehre.tbl_lehrveranstaltung lv
JOIN lehre.tbl_lehreinheit le USING (lehrveranstaltung_id)
JOIN lehre.tbl_stundenplan stp USING (lehreinheit_id,studiengang_kz)
WHERE studiensemester_kurzbz = " . $this->escape($studiensemester_kurzbz) . "
AND (titel NOT LIKE '%Nebenprüfung%' OR titel IS NULL)
GROUP BY
datum,
stunde,
lehrveranstaltung_id,
bezeichnung,
studiensemester_kurzbz,
studiengang_kz,
stp.gruppe_kurzbz,
stp.semester,
stp.verband,
stp.gruppe
) x";
$result = $this->loadWhere($where);
$this->dbTable = $tmp;
return $result;
}
}