From 75d2cabdbe0eef90ae8c7f21bf6ae98091018655 Mon Sep 17 00:00:00 2001 From: Harald Bamberger Date: Thu, 20 Aug 2026 15:10:26 +0200 Subject: [PATCH 1/7] bugfix lv-plan --- application/controllers/api/frontend/v1/LvPlan.php | 1 + application/libraries/StundenplanLib.php | 5 +++-- application/models/ressource/Stundenplan_model.php | 8 +++++--- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/application/controllers/api/frontend/v1/LvPlan.php b/application/controllers/api/frontend/v1/LvPlan.php index 36054003c..14ee8fa12 100644 --- a/application/controllers/api/frontend/v1/LvPlan.php +++ b/application/controllers/api/frontend/v1/LvPlan.php @@ -114,6 +114,7 @@ class LvPlan extends FHCAPI_Controller // fetching lvplan events $result = $this->stundenplanlib->getEventsUser($start_date, $end_date, $uid); + $this->addMeta('bhsql', $this->db->last_query()); $lvplanEvents = $this->getDataOrTerminateWithError($result); // fetching moodle events diff --git a/application/libraries/StundenplanLib.php b/application/libraries/StundenplanLib.php index 8d40c7abd..14cd95a8a 100644 --- a/application/libraries/StundenplanLib.php +++ b/application/libraries/StundenplanLib.php @@ -94,13 +94,13 @@ class StundenplanLib if (isError($benutzer_gruppen)) return $benutzer_gruppen; $benutzer_gruppen = getData($benutzer_gruppen); - + $this->_ci->addMeta('bhgruppen', $benutzer_gruppen); // getting the student_lehrverbaende of the student in the different studiensemester $student_lehrverband = $this->fetchStudentlehrverbandFromStudiensemester($student_uid, $semester_range); if (isError($student_lehrverband)) return $student_lehrverband; $student_lehrverband = getData($student_lehrverband); - + $this->_ci->addMeta('bhstudlvbd', $student_lehrverband); $stundenplan_query = $this->_ci->StundenplanModel->getStundenplanQuery( $start, $end, @@ -632,6 +632,7 @@ class StundenplanLib $result->semester = $item->semester; $result->verband = $item->verband; $result->gruppe = $item->gruppe; + $result->studiensemester_kurzbz = $item->studiensemester_kurzbz; return $result; }, $lehrverband_query_result); diff --git a/application/models/ressource/Stundenplan_model.php b/application/models/ressource/Stundenplan_model.php index 1eddd2e2f..375b1c79f 100644 --- a/application/models/ressource/Stundenplan_model.php +++ b/application/models/ressource/Stundenplan_model.php @@ -561,6 +561,7 @@ class Stundenplan_model extends DB_Model $query = "select sp.* from lehre.vw_".$db_stpl_table." sp + left join lehre.tbl_lehreinheit le on le.lehreinheit_id = sp.lehreinheit_id WHERE sp.datum >= ".$this->escape($start_date)." AND sp.datum <= ".$this->escape($end_date); @@ -610,11 +611,12 @@ class Stundenplan_model extends DB_Model } 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).")"; + $studsemclause = "(le.studiensemester_kurzbz IS NULL OR le.studiensemester_kurzbz = " . $this->escape($lehrverband->studiensemester_kurzbz) . ")"; + $query .= "(((" . $studsemclause . " AND 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).")"; + $query .= "OR (" . $studsemclause . " AND 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) + $query .= "OR (" . $studsemclause . " AND 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"; From 9bf5bc2ad9d9b84ab7f0c3ab0f99a27cab2f12f2 Mon Sep 17 00:00:00 2001 From: Harald Bamberger Date: Mon, 24 Aug 2026 07:26:12 +0200 Subject: [PATCH 2/7] more generic bugfix, to use studentlehrverband only with date_range for the same studiensemester_kurzbz --- .../controllers/api/frontend/v1/LvPlan.php | 2 +- application/libraries/StundenplanLib.php | 1 + .../models/ressource/Stundenplan_model.php | 18 +++++++++++------- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/application/controllers/api/frontend/v1/LvPlan.php b/application/controllers/api/frontend/v1/LvPlan.php index 14ee8fa12..f9d2cc3cf 100644 --- a/application/controllers/api/frontend/v1/LvPlan.php +++ b/application/controllers/api/frontend/v1/LvPlan.php @@ -114,7 +114,7 @@ class LvPlan extends FHCAPI_Controller // fetching lvplan events $result = $this->stundenplanlib->getEventsUser($start_date, $end_date, $uid); - $this->addMeta('bhsql', $this->db->last_query()); + $lvplanEvents = $this->getDataOrTerminateWithError($result); // fetching moodle events diff --git a/application/libraries/StundenplanLib.php b/application/libraries/StundenplanLib.php index 14cd95a8a..20613c471 100644 --- a/application/libraries/StundenplanLib.php +++ b/application/libraries/StundenplanLib.php @@ -112,6 +112,7 @@ class StundenplanLib return success([]); $stundenplan_data = $this->_ci->StundenplanModel->stundenplanGruppierung($stundenplan_query); + $this->_ci->addMeta('bhsql', $this->_ci->db->last_query()); if (isError($stundenplan_data)) return $stundenplan_data; $stundenplan_data = getData($stundenplan_data) ?? []; diff --git a/application/models/ressource/Stundenplan_model.php b/application/models/ressource/Stundenplan_model.php index 375b1c79f..0f51e4b71 100644 --- a/application/models/ressource/Stundenplan_model.php +++ b/application/models/ressource/Stundenplan_model.php @@ -561,7 +561,6 @@ class Stundenplan_model extends DB_Model $query = "select sp.* from lehre.vw_".$db_stpl_table." sp - left join lehre.tbl_lehreinheit le on le.lehreinheit_id = sp.lehreinheit_id WHERE sp.datum >= ".$this->escape($start_date)." AND sp.datum <= ".$this->escape($end_date); @@ -605,18 +604,23 @@ class Stundenplan_model extends DB_Model { foreach($semester_date_range as $sem_date => $sem_date_range) { - if(!array_key_exists($sem_date,$studentlehrverbaende) || count($studentlehrverbaende[$sem_date]) == 0) + if(!array_key_exists($sem,$studentlehrverbaende) || count($studentlehrverbaende[$sem]) == 0) { continue; } - foreach($studentlehrverbaende[$sem_date] as $key=>$lehrverband) + $studlvbds = array_filter( + $studentlehrverbaende[$sem], + function($value) use ($sem_date) { + return $value->studiensemester_kurzbz === $sem_date; + } + ); + foreach($studlvbds as $key=>$lehrverband) { - $studsemclause = "(le.studiensemester_kurzbz IS NULL OR le.studiensemester_kurzbz = " . $this->escape($lehrverband->studiensemester_kurzbz) . ")"; - $query .= "(((" . $studsemclause . " AND 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).")"; + $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 (" . $studsemclause . " AND 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).")"; + $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 (" . $studsemclause . " AND 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) + $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"; From f84d12277d1b6486ba3268beebabcf97221d1f6a Mon Sep 17 00:00:00 2001 From: Harald Bamberger Date: Mon, 24 Aug 2026 07:31:47 +0200 Subject: [PATCH 3/7] remove debug code --- application/libraries/StundenplanLib.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/application/libraries/StundenplanLib.php b/application/libraries/StundenplanLib.php index 20613c471..2c13a29d9 100644 --- a/application/libraries/StundenplanLib.php +++ b/application/libraries/StundenplanLib.php @@ -94,13 +94,13 @@ class StundenplanLib if (isError($benutzer_gruppen)) return $benutzer_gruppen; $benutzer_gruppen = getData($benutzer_gruppen); - $this->_ci->addMeta('bhgruppen', $benutzer_gruppen); + $this->_ci->addMeta('spezialgruppen', $benutzer_gruppen); // getting the student_lehrverbaende of the student in the different studiensemester $student_lehrverband = $this->fetchStudentlehrverbandFromStudiensemester($student_uid, $semester_range); if (isError($student_lehrverband)) return $student_lehrverband; $student_lehrverband = getData($student_lehrverband); - $this->_ci->addMeta('bhstudlvbd', $student_lehrverband); + $this->_ci->addMeta('studentlehrvebaende', $student_lehrverband); $stundenplan_query = $this->_ci->StundenplanModel->getStundenplanQuery( $start, $end, @@ -112,7 +112,6 @@ class StundenplanLib return success([]); $stundenplan_data = $this->_ci->StundenplanModel->stundenplanGruppierung($stundenplan_query); - $this->_ci->addMeta('bhsql', $this->_ci->db->last_query()); if (isError($stundenplan_data)) return $stundenplan_data; $stundenplan_data = getData($stundenplan_data) ?? []; From 6d641bbd064a357d28e64958d0e9625dffa12a98 Mon Sep 17 00:00:00 2001 From: Harald Bamberger Date: Mon, 24 Aug 2026 13:56:55 +0200 Subject: [PATCH 4/7] pass in uid by reference --- application/models/crm/Student_model.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/models/crm/Student_model.php b/application/models/crm/Student_model.php index ab073996f..df8c1f983 100644 --- a/application/models/crm/Student_model.php +++ b/application/models/crm/Student_model.php @@ -204,7 +204,7 @@ class Student_model extends DB_Model Events::trigger( 'generate_student_uid', - function ($value) use ($uid) { + function ($value) use (&$uid) { $uid = $value; }, $stgkzl, From 57c48f2c4ad610d2270bf3c02330a77ccf324557 Mon Sep 17 00:00:00 2001 From: Johann Hoffmann Date: Wed, 26 Aug 2026 13:15:16 +0200 Subject: [PATCH 5/7] cis4 studium page dont filter away lehrveranstaltungen without a module and give them their own box in the ui; --- application/controllers/api/frontend/v1/Studium.php | 12 ++++++++++-- public/js/components/Cis/Studium/Studium.js | 12 ++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/application/controllers/api/frontend/v1/Studium.php b/application/controllers/api/frontend/v1/Studium.php index f53a4105c..4794bedd3 100644 --- a/application/controllers/api/frontend/v1/Studium.php +++ b/application/controllers/api/frontend/v1/Studium.php @@ -167,7 +167,9 @@ class Studium extends FHCAPI_Controller if($aktuelles_studienplan){ $lehrveranstaltungen = $this->computeStudienplanLehrveranstaltungen($aktuelles_studienplan->studienplan_id, $aktuelles_semester); foreach($lehrveranstaltungen as $lehrv){ - foreach($lehrv->lehrveranstaltungen as $lv){ + // a lehrveranstaltung without a modul has no children and gets its lektoren directly + $lvs = isset($lehrv->lehrveranstaltungen) ? $lehrv->lehrveranstaltungen : [$lehrv]; + foreach($lvs as $lv){ $lvLektoren =$this->computeLektorenFromLehrveranstaltung($lv->lehrveranstaltung_id,$aktuelles_semester, $aktuelles_studiengang->studiengang_kz, $aktuelles_studiensemester->studiensemester_kurzbz); $lv->lektoren = $lvLektoren; } @@ -286,6 +288,7 @@ SELECT tbl_lehrveranstaltung.*, $lehrveranstaltungen = $this->LehrveranstaltungModel->execReadOnlyQuery($query,[$studienplan_id, $semester]); $lehrveranstaltungen = $this->getDataOrTerminateWithError($lehrveranstaltungen); + usort($lehrveranstaltungen, function($a, $b){ if($a->lehrtyp_kurzbz == "modul"){ return -1; @@ -302,12 +305,17 @@ SELECT tbl_lehrveranstaltung.*, } else{ $parent =array_filter($carry, function($item)use($lehrv){ - return $item->studienplan_lehrveranstaltung_id == $lehrv->studienplan_lehrveranstaltung_id_parent; + return isset($item->lehrveranstaltungen) + && $item->studienplan_lehrveranstaltung_id == $lehrv->studienplan_lehrveranstaltung_id_parent; }); $parent = current($parent); if($parent){ $parent->lehrveranstaltungen[] = $lehrv; } + else{ + // lehrveranstaltung without a modul: keep it on the top level + array_push($carry, $lehrv); + } } return $carry; }, []); diff --git a/public/js/components/Cis/Studium/Studium.js b/public/js/components/Cis/Studium/Studium.js index 721fec8ad..77459c913 100644 --- a/public/js/components/Cis/Studium/Studium.js +++ b/public/js/components/Cis/Studium/Studium.js @@ -206,6 +206,8 @@ export default { }); this.lehrveranstaltungen.forEach((lehrveranstaltung)=>{ + // a lehrveranstaltung without a modul has no children + if(!Array.isArray(lehrveranstaltung.lehrveranstaltungen)) return; lehrveranstaltung.lehrveranstaltungen.sort((lv1,lv2)=>{ if (lv1.bezeichnung.toLowerCase() > lv2.bezeichnung.toLowerCase()) { return 1; @@ -393,6 +395,16 @@ export default { + From cc9d1f983e452a2549a37d50cd36b473e35abbf1 Mon Sep 17 00:00:00 2001 From: chfhtw Date: Tue, 1 Sep 2026 10:39:02 +0200 Subject: [PATCH 6/7] bugfix: missing call to getStudiensemesterKurzbz --- application/controllers/api/frontend/v1/stv/Students.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/application/controllers/api/frontend/v1/stv/Students.php b/application/controllers/api/frontend/v1/stv/Students.php index 39ed72072..6427df0ac 100644 --- a/application/controllers/api/frontend/v1/stv/Students.php +++ b/application/controllers/api/frontend/v1/stv/Students.php @@ -108,6 +108,7 @@ class Students extends FHCAPI_Controller 'studiensemester_kurzbz' => $studiensemester_kurzbz ]); + $studiensemester_kurzbz = $this->getStudiensemesterKurzbz($studiensemester_kurzbz); $this->studentlistlib->addJoin( "( @@ -153,7 +154,8 @@ class Students extends FHCAPI_Controller $this->addMeta('ci_params', [ 'studiensemester_kurzbz' => $studiensemester_kurzbz ]); - + + $studiensemester_kurzbz = $this->getStudiensemesterKurzbz($studiensemester_kurzbz); $this->studentlistlib->addJoin( "( @@ -213,6 +215,7 @@ class Students extends FHCAPI_Controller 'studiensemester_kurzbz' => $studiensemester_kurzbz ]); + $studiensemester_kurzbz = $this->getStudiensemesterKurzbz($studiensemester_kurzbz); $this->studentlistlib->addJoin( "( From 658c8d6bd4ec916f77aa461dfc3f2a38bb04c5ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20=C3=96sterreicher?= Date: Thu, 3 Sep 2026 08:44:10 +0200 Subject: [PATCH 7/7] =?UTF-8?q?Schreibberechtigungspr=C3=BCfung=20bei=20An?= =?UTF-8?q?rechnungen=20angepasst=20damit=20diese=20korrekt=20angezeigt=20?= =?UTF-8?q?wird=20wenn=20oe=5Fkurzb=20nicht=20gleich=20der=20Kurzbz=20des?= =?UTF-8?q?=20Studiegangs=20ist?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../views/lehre/anrechnung/approveAnrechnungUebersichtData.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/views/lehre/anrechnung/approveAnrechnungUebersichtData.php b/application/views/lehre/anrechnung/approveAnrechnungUebersichtData.php index acfcbd907..dccc31187 100644 --- a/application/views/lehre/anrechnung/approveAnrechnungUebersichtData.php +++ b/application/views/lehre/anrechnung/approveAnrechnungUebersichtData.php @@ -16,7 +16,7 @@ $query = ' anrechnung.begruendung_id, anrechnung.dms_id, CASE - WHEN stg.typ || stg.kurzbz IN (' . $ORGANISATIONSEINHEITEN_SCHREIBBERECHTIGT . ') THEN TRUE + WHEN stg.oe_kurzbz IN (' . $ORGANISATIONSEINHEITEN_SCHREIBBERECHTIGT . ') THEN TRUE ELSE FALSE END "schreibberechtigt", anrechnung.studiensemester_kurzbz,