work in progress

This commit is contained in:
Harald Bamberger
2026-10-09 15:14:51 +02:00
parent bdf8b3c609
commit 8b68e60ae8
3 changed files with 200 additions and 111 deletions
@@ -32,9 +32,14 @@ class LvTermine extends FHCAPI_Controller
$this->load->model('person/Benutzergruppe_model', 'BenutzergruppeModel');
}
public function getStundenplan($uid, $start_date = null, $end_date = null, $dbStundenplanTable = "stundenplan", $groupConsecutiveHours = false)
{
$this->getStundenplanbh($uid, '2026-02-04', '2027-02-03', $dbStundenplanTable, $groupConsecutiveHours);
}
//TODO Build own lib or combine with Controller Stundenplan.php
//here use of logic of Stundenplan.php, extended with parameters uid, grouping, and used dbTable
public function getStundenplan($uid, $start_date = null, $end_date = null, $dbStundenplanTable = "stundenplan", $groupConsecutiveHours = false)
public function getStundenplanbh($uid, $start_date = null, $end_date = null, $dbStundenplanTable = "stundenplan", $groupConsecutiveHours = false)
{
$ci = get_instance();
$student_uid = $uid;
@@ -59,8 +64,24 @@ class LvTermine extends FHCAPI_Controller
$ci->addMeta('spezialgruppen', $benutzer_gruppen);
// getting the student_lehrverbaende of the student in the different studiensemester
$ende_semProlonged = $semester_range[$first_semester][$first_semester]->ende;
$ci->addMeta(' E N D E _semProlonged', $ende_semProlonged);
$ci->addMeta('bhsemtest', print_r($semester_range, true));
$semester_range = array(
'SS2026' => array(
'WS2025' => (object) array(
'start' => '2026-02-04',
'ende' => '2026-05-19'
),
'SS2026' => (object) array(
'start' => '2026-02-04',
'ende' => '2026-11-15'
),
'WS2026' => (object) array(
'start' => '2026-09-01',
'ende' => '2027-02-03'
)
)
);
$student_lehrverband = $this->fetchStudentlehrverbandFromStudiensemester($student_uid, $semester_range);
@@ -68,6 +89,40 @@ class LvTermine extends FHCAPI_Controller
if (isError($student_lehrverband))
return $student_lehrverband;
$student_lehrverband = getData($student_lehrverband);
$student_lehrverband = array (
'SS2026' =>
array (
0 =>
(object) array(
'verbandsgruppe' => 'BEE1A',
'studiengang_kz' => 476,
'semester' => 1,
'verband' => 'A',
'gruppe' => ' ',
'studiensemester_kurzbz' => 'WS2025',
),
1 =>
(object) array(
'verbandsgruppe' => 'BEE2A',
'studiengang_kz' => 476,
'semester' => 2,
'verband' => 'A',
'gruppe' => ' ',
'studiensemester_kurzbz' => 'SS2026',
),
2 =>
(object) array(
'verbandsgruppe' => 'BEE3A',
'studiengang_kz' => 476,
'semester' => 3,
'verband' => 'A',
'gruppe' => ' ',
'studiensemester_kurzbz' => 'SS2026',
),
),
);
$ci->addMeta('studentlehrverbaende', $student_lehrverband);
$this->load->model('crm/Student_model', 'StudentModel');
@@ -95,10 +150,12 @@ class LvTermine extends FHCAPI_Controller
$student_lehrverband,
$dbStundenplanTable,
$groupConsecutiveHours,
$ende_semProlonged,
$semesterStud
null,
null
);
$ci->addMeta('bhstdplanquery', $stundenplan_query);
if(!$stundenplan_query)
{
$this->terminateWithSuccess([]);
@@ -258,7 +315,7 @@ class LvTermine extends FHCAPI_Controller
{
// for each active semester query the student_lehrverband associated to the semester
$lehrverband_query = $this->BenutzergruppeModel->execReadOnlyQuery("
SELECT * FROM tbl_studentlehrverband where student_uid = ? AND studiensemester_kurzbz = ?", [$student_uid, $semester]);
SELECT vbd.*, UPPER(s.typ || s.kurzbz) as stg FROM tbl_studentlehrverband vbd join tbl_studiengang s USING(studiengang_kz) where vbd.student_uid = ? AND vbd.studiensemester_kurzbz = ?", [$student_uid, $semester]);
if(isError($lehrverband_query)){
return error(getData($lehrverband_query));
}
@@ -268,6 +325,7 @@ class LvTermine extends FHCAPI_Controller
function ($item)
{
$result = new stdClass();
$result->verbandsgruppe = $item->stg . $item->semester . trim($item->verband) . trim($item->gruppe);
$result->studiengang_kz = $item->studiengang_kz;
$result->semester = $item->semester;
$result->verband = $item->verband;
+16 -1
View File
@@ -88,7 +88,22 @@ class StundenplanLib
$this->_ci->addMeta('nach_apply_semester_range', $semester_range);
if ($function_error)
return $function_error;
$this->_ci->addMeta('bhsemtest', print_r($semester_range, true));
$semester_range = array(
'SS2026' => array(
'WS2025' => (object) array(
'start' => '2026-02-04',
'ende' => '2026-05-19'
),
'SS2026' => (object) array(
'start' => '2026-02-04',
'ende' => '2026-11-15'
),
)
);
// getting the gruppen_kurzbz of the student in the different studiensemester
$benutzer_gruppen = $this->fetchBenutzerGruppenFromStudiensemester($student_uid, $semester_range);
if (isError($benutzer_gruppen))
+120 -104
View File
@@ -193,7 +193,8 @@ class Stundenplan_model extends DB_Model
*/
public function stundenplanGruppierungConsecutive($stundenplanViewQuery)
{
$query_result = $this->execReadOnlyQuery("
$query_result = $this->execReadOnlyQuery(
$stundenplanViewQuery . "
SELECT
distinct lehrveranstaltung_id,
datum,
@@ -247,7 +248,7 @@ class Stundenplan_model extends DB_Model
anmerkung_lehreinheit,gruppe, verband, semester,stg_kurzbz,
CONCAT(p.nachname, ' ', p.vorname) as lektorname
FROM (".$stundenplanViewQuery.") sp
FROM stundenplaneintraege 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
@@ -529,6 +530,95 @@ class Stundenplan_model extends DB_Model
return $this->execReadOnlyQuery($qry, $qry_params);
}
protected function genLehrverbandClauses($semester, $studentlehrverbaende)
{
$lvbdclauses = array();
$studiengang_kz = null;
foreach($semester as $sem=>$semester_date_range)
{
foreach($semester_date_range as $sem_date => $sem_date_range)
{
if(!array_key_exists($sem,$studentlehrverbaende) || count($studentlehrverbaende[$sem]) == 0)
{
continue;
}
$studlvbds = array_filter(
$studentlehrverbaende[$sem],
function($value) use ($sem_date) {
return $value->studiensemester_kurzbz === $sem_date;
}
);
foreach($studlvbds as $key=>$lehrverband)
{
$studiengang_kz = $lehrverband->studiengang_kz;
$lvbdclauses[] = <<<EOCLAUSE
(
{$this->escape($lehrverband->verbandsgruppe)} like sp.verbandsgruppe || '%'
and sp.datum between {$this->escape($sem_date_range->start)} and {$this->escape($sem_date_range->ende)}
and (sp.studiensemester_kurzbz is null or sp.studiensemester_kurzbz = {$this->escape($lehrverband->studiensemester_kurzbz)})
)
EOCLAUSE;
}
}
}
$sql = implode(PHP_EOL . " OR" . PHP_EOL, $lvbdclauses);
if($sql)
{
$sql = <<<EOSQL
(
sp.studiengang_kz = {$this->escape($studiengang_kz)}
and
sp.gruppe_kurzbz is null
and
(
{$sql}
)
)
EOSQL;
}
return $sql;
}
protected function genSpezialgruppenClauses($semester, $gruppen)
{
$spezgrpclauses = array();
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
$groups = implode(', ', $gruppen[$sem_date]);
$spezgrpclauses[] = <<<EOSPEZGRP
(
sp.gruppe_kurzbz IN ({$groups})
AND sp.datum BETWEEN {$this->escape($sem_date_range->start)} AND {$this->escape($sem_date_range->ende)}
)
EOSPEZGRP;
}
}
$sql = implode(PHP_EOL . " OR" . PHP_EOL, $spezgrpclauses);
if($sql)
{
$sql = <<<EOSQL
(
{$sql}
)
EOSQL;
}
return $sql;
}
/**
* NO STANDALONE FUNCTION - Generates a SQL query string to fetch 'stundenplan' events for a specific student within the current semester.
*
@@ -539,12 +629,6 @@ class Stundenplan_model extends DB_Model
*/
public function getStundenplanQuery($start_date, $end_date, $semester, $gruppen, $studentlehrverbaende, $db_stpl_table='stundenplan', $showLvsStundenplan=false, $endDateNextSemHalf=null, $semesterFilter=null)
{
//only use longer intervall with given semesterfilter
if($endDateNextSemHalf != null && $semesterFilter != null)
{
$end_date = $endDateNextSemHalf;
}
// helper function to check if either $gruppen or $studentlehrverbaende are empty for each semester
$emptyCheck = function($toBeCheckedArray) use ($semester){
$result = true;
@@ -564,104 +648,36 @@ class Stundenplan_model extends DB_Model
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);
$lvbdclauses = $this->genLehrverbandClauses($semester, $studentlehrverbaende);
$spezgrpclauses = $this->genSpezialgruppenClauses($semester, $gruppen);
$chainingand = ($lvbdclauses && $spezgrpclauses) ? 'AND' : '';
//necessary for new prolonged interval
if($semesterFilter && $endDateNextSemHalf)
{
$query .= " AND sp.semester = " . $semesterFilter;
}
$query = <<<EOSQL
with preprocessedsp as (
select
(UPPER(sp.stg_typ || sp.stg_kurzbz)) || sp.semester || sp.verband || sp.gruppe as verbandsgruppe,
sp.*,
le.studiensemester_kurzbz
from
lehre.vw_stundenplan sp
join
lehre.tbl_lehreinheit le on sp.lehreinheit_id = le.lehreinheit_id
where
sp.datum >= {$this->escape($start_date)}
and sp.datum <= {$this->escape($end_date)}
),
stundenplaneintraege as (
select
sp.*
from
preprocessedsp sp
where
{$lvbdclauses}
{$chainingand}
{$spezgrpclauses}
)
// 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);
}
foreach($semester as $sem=>$semester_date_range)
{
foreach($semester_date_range as $sem_date => $sem_date_range)
{
if(!array_key_exists($sem,$studentlehrverbaende) || count($studentlehrverbaende[$sem]) == 0)
{
continue;
}
$studlvbds = array_filter(
$studentlehrverbaende[$sem],
function($value) use ($sem_date) {
return $value->studiensemester_kurzbz === $sem_date;
}
);
foreach($studlvbds 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)";
// Eintraege vom Stundenplan //not in master
if($showLvsStundenplan)
{
$query .= "
OR EXISTS (
SELECT 1
FROM lehre.tbl_stundenplan tsp
WHERE tsp.lehreinheit_id = sp.lehreinheit_id
AND tsp.studiengang_kz = " . $this->escape($lehrverband->studiengang_kz) . "
AND (tsp.semester = " . $this->escape($lehrverband->semester) . " OR tsp.semester IS NULL)
AND (tsp.verband = " . $this->escape($lehrverband->verband) . " OR tsp.verband IS NULL OR tsp.verband = '0' OR tsp.verband = '')
AND (tsp.gruppe = " . $this->escape($lehrverband->gruppe) . " OR tsp.gruppe IS NULL OR tsp.gruppe = '0' OR tsp.gruppe = '')
AND tsp.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 .= ")";
}
EOSQL;
return $query;
}