From 67f30c7765dc22c18c99cba3f3fc124e3092f7d7 Mon Sep 17 00:00:00 2001 From: adisposkofh Date: Wed, 9 Sep 2026 11:30:43 +0200 Subject: [PATCH 1/4] fixed issue with wrong semester displayed and wrong ical dates used in my lv plan --- .../v1/organisation/Studiensemester.php | 14 +++++- .../organisation/Studiensemester_model.php | 20 +++++++- public/js/api/factory/studiensemester.js | 12 ++++- public/js/components/Cis/LvPlan/MyLvPlan.js | 49 ++++++++++++------- 4 files changed, 72 insertions(+), 23 deletions(-) diff --git a/application/controllers/api/frontend/v1/organisation/Studiensemester.php b/application/controllers/api/frontend/v1/organisation/Studiensemester.php index eaafc6ac5..c082d8b97 100644 --- a/application/controllers/api/frontend/v1/organisation/Studiensemester.php +++ b/application/controllers/api/frontend/v1/organisation/Studiensemester.php @@ -28,7 +28,8 @@ class Studiensemester extends FHCAPI_Controller 'getStudienjahrByStudiensemester' => self::PERM_LOGGED, 'getAllStudiensemesterAndAktOrNext' => self::PERM_LOGGED, 'current' => self::PERM_LOGGED, - 'set' => self::PERM_LOGGED + 'set' => self::PERM_LOGGED, + 'getContainingOrNearestByDateRange' => self::PERM_LOGGED, ) ); // Load model StudiensemesterModel @@ -203,4 +204,15 @@ class Studiensemester extends FHCAPI_Controller $this->terminateWithSuccess(true); } + + public function getContainingOrNearestByDateRange() + { + $from = $this->input->get("from"); + $to = $this->input->get("to"); + + $result = $this->StudiensemesterModel->getContainingOrNearestByDateRange($from, $to); + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } } diff --git a/application/models/organisation/Studiensemester_model.php b/application/models/organisation/Studiensemester_model.php index 1b480771f..6e2abae87 100644 --- a/application/models/organisation/Studiensemester_model.php +++ b/application/models/organisation/Studiensemester_model.php @@ -292,13 +292,29 @@ class Studiensemester_model extends DB_Model COALESCE( (SELECT studiensemester_kurzbz FROM semester_interval_startdate), (SELECT studiensemester_kurzbz FROM nearest_semester_interval_startdate) - ) AS studiensemester_kurzbz + ) AS studiensemester_kurzbz, + COALESCE( + (SELECT start FROM semester_interval_startdate), + (SELECT start FROM nearest_semester_interval_startdate) + ) as start, + COALESCE( + (SELECT ende FROM semester_interval_startdate), + (SELECT ende FROM nearest_semester_interval_startdate) + ) as ende UNION SELECT COALESCE( (SELECT studiensemester_kurzbz FROM semester_interval_enddate), (SELECT studiensemester_kurzbz FROM nearest_semester_interval_enddate) - ) AS studiensemester_kurzbz + ) AS studiensemester_kurzbz, + COALESCE( + (SELECT start FROM semester_interval_enddate), + (SELECT start FROM nearest_semester_interval_enddate) + ) as start, + COALESCE( + (SELECT ende FROM semester_interval_enddate), + (SELECT ende FROM nearest_semester_interval_enddate) + ) as ende EOSQL; diff --git a/public/js/api/factory/studiensemester.js b/public/js/api/factory/studiensemester.js index f57c10763..12a5106a2 100644 --- a/public/js/api/factory/studiensemester.js +++ b/public/js/api/factory/studiensemester.js @@ -44,5 +44,15 @@ export default { studiensemester_kurzbz } }; - } + }, + getContainingOrNearestByDateRange(from, to) { + return { + method: 'get', + url: 'api/frontend/v1/organisation/studiensemester/getContainingOrNearestByDateRange', + params: { + from, + to, + } + }; + }, }; \ No newline at end of file diff --git a/public/js/components/Cis/LvPlan/MyLvPlan.js b/public/js/components/Cis/LvPlan/MyLvPlan.js index cb43a06d9..f146df93b 100644 --- a/public/js/components/Cis/LvPlan/MyLvPlan.js +++ b/public/js/components/Cis/LvPlan/MyLvPlan.js @@ -1,6 +1,7 @@ import FhcCalendar from "../../Calendar/LvPlan.js"; import ApiLvPlan from '../../../api/factory/lvPlan.js'; +import ApiStudienSemester from '../../../api/factory/studiensemester.js'; import ApiAuthinfo from '../../../api/factory/authinfo.js'; export const DEFAULT_MODE_LVPLAN_DESKTOP = "Week"; @@ -16,13 +17,12 @@ export default { }, data() { return { - studiensemester_kurzbz: null, - studiensemester_start: null, - studiensemester_ende: null, uid: null, isMitarbeiter: false, isStudent: false, timezone: FHC_JS_DATA_STORAGE_OBJECT.timezone, + startSemester: null, + endSemester: null, }; }, inject: ["isMobile"], @@ -48,9 +48,12 @@ export default { return this.propsViewData?.mode; }, downloadLinks() { - if (!this.studiensemester_start || !this.studiensemester_ende || !this.uid) - return false; + const startDate = this.startSemester?.start; + const endDate = this.endSemester ? this.endSemester.ende : this.startSemester?.ende; + if (!startDate || !endDate || !this.uid) + return false; + let type = false; type = this.isStudent ? 'student' : type; type = this.isMitarbeiter ? 'lektor' : type; @@ -61,10 +64,10 @@ export default { const opts = { zone: this.timezone }; const start = luxon.DateTime - .fromISO(this.studiensemester_start, opts) + .fromISO(startDate, opts) .toUnixInteger(); const ende = luxon.DateTime - .fromISO(this.studiensemester_ende, opts) + .fromISO(endDate, opts) .toUnixInteger(); const download_link = FHC_JS_DATA_STORAGE_OBJECT.app_root @@ -109,16 +112,21 @@ export default { } }); }, - updateRange(rangeInterval) { - this.$api - .call(ApiLvPlan.studiensemesterDateInterval( - rangeInterval.end.startOf('week').toISODate() - )) - .then(res => { - this.studiensemester_kurzbz = res.data.studiensemester_kurzbz; - this.studiensemester_start = res.data.start; - this.studiensemester_ende = res.data.ende; - }); + async updateRange(rangeInterval) { + const semesterResponse = await this.$api.call( + ApiStudienSemester.getContainingOrNearestByDateRange( + rangeInterval.s.toISO().slice(0, 10), + rangeInterval.e.toISO().slice(0, 10), + ), + ); + this.startSemester = + semesterResponse.data.length + ? semesterResponse.data[0] + : null; + this.endSemester = + semesterResponse.data.length > 1 + ? semesterResponse.data[1] + : null; }, getPromiseFunc(start, end) { return [ @@ -142,8 +150,11 @@ export default {

{{ $p.t('lehre/stundenplan') }} - - {{ studiensemester_kurzbz }} + + {{ startSemester.studiensemester_kurzbz }} + + {{ "- " + endSemester.studiensemester_kurzbz }} +


From 9d4218bf38376cf59f7fb053a326d3d403cc4d26 Mon Sep 17 00:00:00 2001 From: adisposkofh Date: Wed, 9 Sep 2026 11:36:19 +0200 Subject: [PATCH 2/4] implemented displayed semester/ical dates changes from my lv plan to other lv plan --- .../js/components/Cis/LvPlan/OtherLvPlan.js | 57 +++++++++++-------- 1 file changed, 32 insertions(+), 25 deletions(-) diff --git a/public/js/components/Cis/LvPlan/OtherLvPlan.js b/public/js/components/Cis/LvPlan/OtherLvPlan.js index 6c70e1c93..48bc03760 100644 --- a/public/js/components/Cis/LvPlan/OtherLvPlan.js +++ b/public/js/components/Cis/LvPlan/OtherLvPlan.js @@ -5,6 +5,7 @@ import FhcCalendar from "../../Calendar/LvPlan.js"; import ApiLvPlan from "../.././../api/factory/lvPlan.js"; import ApiOtherLvPlan from "../.././../api/factory/otherLvPlan.js"; import ApiAuthinfo from "../../../api/factory/authinfo.js"; +import ApiStudienSemester from '../../../api/factory/studiensemester.js'; export const DEFAULT_MODE_LVPLAN_DESKTOP = "Week"; export const DEFAULT_MODE_LVPLAN_MOBILE = "List"; @@ -22,9 +23,6 @@ export default { data() { return { localProps: {}, - studiensemester_kurzbz: null, - studiensemester_start: null, - studiensemester_ende: null, isOtherPersonMitarbeiter: false, isOtherPersonStudent: false, currentStgBezeichnung: null, @@ -36,6 +34,8 @@ export default { photo: "", }, timezone: FHC_JS_DATA_STORAGE_OBJECT.timezone, + startSemester: null, + endSemester: null, }; }, inject: ["isMobile"], @@ -67,11 +67,10 @@ export default { // do not show download links in otherLvPlan Mode return false; - if ( - !this.studiensemester_start || - !this.studiensemester_ende || - !this.propsViewData.otherUid - ) + const startDate = this.startSemester?.start; + const endDate = this.endSemester ? this.endSemester.ende : this.startSemester?.ende; + + if (!startDate || !endDate || !this.uid) return false; const type = this.isOtherPersonStudent @@ -84,11 +83,11 @@ export default { const opts = { zone: this.timezone }; const start = luxon.DateTime.fromISO( - this.studiensemester_start, + startDate, opts, ).toUnixInteger(); const ende = luxon.DateTime.fromISO( - this.studiensemester_ende, + endDate, opts, ).toUnixInteger(); @@ -166,19 +165,21 @@ export default { }, }); }, - updateRange(rangeInterval) { - this.$api - .call( - ApiLvPlan.studiensemesterDateInterval( - rangeInterval.end.startOf("week").toISODate(), - ), - ) - .then((res) => { - this.studiensemester_kurzbz = - res.data.studiensemester_kurzbz; - this.studiensemester_start = res.data.start; - this.studiensemester_ende = res.data.ende; - }); + async updateRange(rangeInterval) { + const semesterResponse = await this.$api.call( + ApiStudienSemester.getContainingOrNearestByDateRange( + rangeInterval.s.toISO().slice(0, 10), + rangeInterval.e.toISO().slice(0, 10), + ), + ); + this.startSemester = + semesterResponse.data.length + ? semesterResponse.data[0] + : null; + this.endSemester = + semesterResponse.data.length > 1 + ? semesterResponse.data[1] + : null; }, getPromiseFunc(start, end) { return [ @@ -250,8 +251,14 @@ export default {

- - {{ $p.t('lehre/stundenplan') + (studiensemester_kurzbz ? " " + studiensemester_kurzbz : "") }} + + {{ $p.t('lehre/stundenplan') }} + + {{ startSemester.studiensemester_kurzbz }} + + {{ "- " + endSemester.studiensemester_kurzbz }} + +
From 36064afbba55c2eb793244e4749388a858e59bde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20=C3=96sterreicher?= Date: Thu, 1 Oct 2026 15:33:05 +0200 Subject: [PATCH 3/4] Fixed Testing Projektarbeit Seeds --- system/seeders/BS010_projektarbeiten_studiengang_4.sql | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/system/seeders/BS010_projektarbeiten_studiengang_4.sql b/system/seeders/BS010_projektarbeiten_studiengang_4.sql index 214705bc4..82db2d172 100644 --- a/system/seeders/BS010_projektarbeiten_studiengang_4.sql +++ b/system/seeders/BS010_projektarbeiten_studiengang_4.sql @@ -1,9 +1,9 @@ INSERT INTO lehre.tbl_projektarbeit -(projektarbeit_id, projekttyp_kurzbz, titel, lehreinheit_id, student_uid, firma_id, note, punkte, beginn, ende, faktor, freigegeben, gesperrtbis, stundensatz, themenbereich, anmerkung, updateamum, updatevon, insertamum, insertvon, ext_id, gesamtstunden, titel_english, sprache, seitenanzahl, abgabedatum, kontrollschlagwoerter, schlagwoerter, schlagwoerter_en, abstract, abstract_en, "final") VALUES -(1, 'Bachelor', 'Auswirkung der Sonneneinstrahlung auf die Gesundheit', 46111, 's46b413', NULL, NULL, NULL, NULL, NULL, NULL, true, NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-12 14:06:10.000', 'anondata', NULL, 3.0000, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, true), -(2, 'Bachelor', 'Neue Unterrichtsmethoden mit KI', 46111, 's46b414', NULL, NULL, NULL, NULL, NULL, NULL, true, NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-12 14:06:10.000', 'anondata', NULL, 3.0000, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, true), -(3, 'Bachelor', 'Betrugsbekämpfung bei Anwesenheitskontrolle', 46111, 's46b415', NULL, NULL, NULL, NULL, NULL, NULL, true, NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-12 14:06:10.000', 'anondata', NULL, 3.0000, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, true), -(4, 'Bachelor', 'Neuronale Netze', 46111, 's46b416', NULL, NULL, NULL, NULL, NULL, NULL, true, NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-12 14:06:10.000', 'anondata', NULL, 3.0000, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, true) +(projektarbeit_id, projekttyp_kurzbz, titel, lehreinheit_id, student_uid, firma_id, note, punkte, beginn, ende, faktor, freigegeben, gesperrtbis, stundensatz, themenbereich, anmerkung, updateamum, updatevon, insertamum, insertvon, ext_id, gesamtstunden, titel_english, sprache, seitenanzahl, abgabedatum, kontrollschlagwoerter, schlagwoerter, schlagwoerter_en, abstract, abstract_en, "final", lehrveranstaltung_id, studiensemester_kurzbz) VALUES +(1, 'Bachelor', 'Auswirkung der Sonneneinstrahlung auf die Gesundheit', 46111, 's46b413', NULL, NULL, NULL, NULL, NULL, NULL, true, NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-12 14:06:10.000', 'anondata', NULL, 3.0000, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, true, 4611, NearestWintersemester(1)), +(2, 'Bachelor', 'Neue Unterrichtsmethoden mit KI', 46111, 's46b414', NULL, NULL, NULL, NULL, NULL, NULL, true, NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-12 14:06:10.000', 'anondata', NULL, 3.0000, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, true, 4611, NearestWintersemester(1)), +(3, 'Bachelor', 'Betrugsbekämpfung bei Anwesenheitskontrolle', 46111, 's46b415', NULL, NULL, NULL, NULL, NULL, NULL, true, NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-12 14:06:10.000', 'anondata', NULL, 3.0000, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, true, 4611, NearestWintersemester(1)), +(4, 'Bachelor', 'Neuronale Netze', 46111, 's46b416', NULL, NULL, NULL, NULL, NULL, NULL, true, NULL, NULL, NULL, NULL, NULL, NULL, '2025-12-12 14:06:10.000', 'anondata', NULL, 3.0000, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, true, 4611, NearestWintersemester(1)) ; INSERT INTO lehre.tbl_projektbetreuer From 3fe10d715d87d27c35e4baf624e82f6acec079bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20=C3=96sterreicher?= Date: Fri, 2 Oct 2026 13:14:41 +0200 Subject: [PATCH 4/4] Fixed Saving of Entwicklungsteam --- include/entwicklungsteam.class.php | 88 +++++++++++++++++++++--------- include/mitarbeiter.class.php | 18 ++++++ 2 files changed, 81 insertions(+), 25 deletions(-) diff --git a/include/entwicklungsteam.class.php b/include/entwicklungsteam.class.php index b88c3971e..ec68f6918 100644 --- a/include/entwicklungsteam.class.php +++ b/include/entwicklungsteam.class.php @@ -21,6 +21,7 @@ * Manuela Thamer */ require_once(dirname(__FILE__).'/basis_db.class.php'); +require_once(dirname(__FILE__).'/mitarbeiter.class.php'); class entwicklungsteam extends basis_db { @@ -43,7 +44,6 @@ class entwicklungsteam extends basis_db public $ext_id; public $besqual; - public $studiengang_kz_old; /** * Konstruktor @@ -74,7 +74,7 @@ class entwicklungsteam extends basis_db $qry = "SELECT * FROM bis.tbl_entwicklungsteam JOIN bis.tbl_besqual USING(besqualcode) WHERE entwicklungsteam_id=".$this->db_add_param($entwicklungsteam_id); - $qry.=";"; + $qry.=";"; if($this->db_query($qry)) { @@ -147,6 +147,11 @@ class entwicklungsteam extends basis_db $this->errormsg = 'Es muss ein Mitarbeiter angegeben werden'; return false; } + if(!$this->checkIfExistingUid($this->mitarbeiter_uid)) + { + $this->errormsg = 'Bitte einen Eintrag aus dem Dropdown Personensuche auswählen!'; + return false; + } if($this->studiengang_kz=='') { $this->errormsg = 'Es muss ein Studiengang angegeben werden'; @@ -162,6 +167,26 @@ class entwicklungsteam extends basis_db $this->errormsg = 'Endedatum darf nicht vor Anfangsdatum liegen'; return false; } + + if($this->beginn != '') + { + $beginnParts = explode('-', $this->beginn); + if (!checkdate((int)$beginnParts[1], (int)$beginnParts[2], (int)$beginnParts[0])) { + $this->errormsg = 'Anfangsdatum ist ungültig'; + return false; + } + } + + if($this->ende != '') + { + $endeParts = explode('-', $this->ende); + if (!checkdate((int)$endeParts[1], (int)$endeParts[2], (int)$endeParts[0])) + { + $this->errormsg = 'Endedatum ist ungültig'; + return false; + } + } + return true; } @@ -183,30 +208,28 @@ class entwicklungsteam extends basis_db //Neuen Datensatz anlegen $qry = "INSERT INTO bis.tbl_entwicklungsteam (mitarbeiter_uid, studiengang_kz, besqualcode, beginn, ende, updateamum, updatevon, insertamum, insertvon) VALUES (". - $this->db_add_param($this->mitarbeiter_uid).', '. - $this->db_add_param($this->studiengang_kz, FHC_INTEGER).', '. - $this->db_add_param($this->besqualcode, FHC_INTEGER).', '. - $this->db_add_param($this->beginn).', '. - $this->db_add_param($this->ende).', '. - $this->db_add_param($this->updateamum).', '. - $this->db_add_param($this->updatevon).', '. - $this->db_add_param($this->insertamum).', '. - $this->db_add_param($this->insertvon).');'; + $this->db_add_param($this->mitarbeiter_uid).', '. + $this->db_add_param($this->studiengang_kz, FHC_INTEGER).', '. + $this->db_add_param($this->besqualcode, FHC_INTEGER).', '. + $this->db_add_param($this->beginn).', '. + $this->db_add_param($this->ende).', '. + $this->db_add_param($this->updateamum).', '. + $this->db_add_param($this->updatevon).', '. + $this->db_add_param($this->insertamum).', '. + $this->db_add_param($this->insertvon).');'; } else { - if($this->studiengang_kz_old=='') - $this->studiengang_kz_old = $this->studiengang_kz; - //Bestehenden Datensatz aktualisieren $qry= "UPDATE bis.tbl_entwicklungsteam SET". - " besqualcode=".$this->db_add_param($this->besqualcode, FHC_INTEGER).",". - " beginn=".$this->db_add_param($this->beginn).",". - " studiengang_kz=".$this->db_add_param($this->studiengang_kz, FHC_INTEGER).",". - " ende=".$this->db_add_param($this->ende).",". - " updateamum=".$this->db_add_param($this->updateamum).",". - " updatevon=".$this->db_add_param($this->updatevon). - " WHERE entwicklungsteam_id=".$this->db_add_param($this->entwicklungsteam_id).";"; + " besqualcode=".$this->db_add_param($this->besqualcode, FHC_INTEGER).",". + " beginn=".$this->db_add_param($this->beginn).",". + " studiengang_kz=".$this->db_add_param($this->studiengang_kz, FHC_INTEGER).",". + " ende=".$this->db_add_param($this->ende).",". + " mitarbeiter_uid=".$this->db_add_param($this->mitarbeiter_uid).",". + " updateamum=".$this->db_add_param($this->updateamum).",". + " updatevon=".$this->db_add_param($this->updatevon). + " WHERE entwicklungsteam_id=".$this->db_add_param($this->entwicklungsteam_id).";"; } if($this->db_query($qry)) @@ -234,7 +257,7 @@ class entwicklungsteam extends basis_db if($studiengang_kz!=null) $qry.=" AND studiengang_kz=".$this->db_add_param($studiengang_kz); - $qry.=";"; + $qry.=";"; if($this->db_query($qry)) { @@ -316,7 +339,7 @@ class entwicklungsteam extends basis_db if ($sort != null) { - $qry .= " ORDER BY ".$sort; + $qry .= " ORDER BY ".$sort; } $qry .= ";"; @@ -364,7 +387,7 @@ class entwicklungsteam extends basis_db $bismeldung_jahr = $datetime->format('Y'); //laden des Datensatzes - $qry = "SELECT tbl_entwicklungsteam.*, tbl_besqual.*, tbl_studiengang.studiengang_kz, tbl_studiengang.melderelevant + $qry = "SELECT tbl_entwicklungsteam.*, tbl_besqual.*, tbl_studiengang.studiengang_kz, tbl_studiengang.melderelevant FROM bis.tbl_entwicklungsteam JOIN bis.tbl_besqual USING(besqualcode) JOIN public.tbl_studiengang USING(studiengang_kz) @@ -375,7 +398,7 @@ class entwicklungsteam extends basis_db if($studiengang_kz!=null) $qry.=" AND studiengang_kz=".$this->db_add_param($studiengang_kz); - $qry.=";"; + $qry.=";"; if($this->db_query($qry)) { @@ -407,5 +430,20 @@ class entwicklungsteam extends basis_db return false; } } + + /* + * Überprüft, ob die übergebene Uid in der Tabelle tbl_mitarbeiter vorhanden ist + * @param String $uid UID des Mitarbeiters + * @return true wenn vorhanden, false wenn nicht + */ + private function checkIfExistingUid($uid) + { + $mitarbeiter = new mitarbeiter(); + + if(!$mitarbeiter->checkIfExistingUid($uid)) + return false; + + return true; + } } ?> diff --git a/include/mitarbeiter.class.php b/include/mitarbeiter.class.php index 1517122c2..7138b8578 100644 --- a/include/mitarbeiter.class.php +++ b/include/mitarbeiter.class.php @@ -1995,5 +1995,23 @@ class mitarbeiter extends benutzer return true; } } + + /** + * Prueft ob eine existierende ma_uid übergeben wurde + * @param String $mitarbeiter_uid mitarbeiter_uid + * @return bool True wenn mitarbeiter_uid vorhanden sonst false. + */ + public function checkIfExistingUid($mitarbeiter_uid) + { + $qry = "Select 1 from public.tbl_mitarbeiter where mitarbeiter_uid =".$this->db_add_param($mitarbeiter_uid); + + if ($result = $this->db_query($qry)) + { + if ($this->db_num_rows($result) > 0) + return true; + else + return false; + } + } } ?>