From 08182fe0f504132293ed16ead5ae262aa1e1ccbc Mon Sep 17 00:00:00 2001 From: Cristina Date: Wed, 18 Jun 2025 12:03:09 +0200 Subject: [PATCH 01/58] Added phrases for LV-Evaluierung --- system/phrasesupdate.php | 428 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 427 insertions(+), 1 deletion(-) diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php index 0203b3c2f..7c350c452 100644 --- a/system/phrasesupdate.php +++ b/system/phrasesupdate.php @@ -41873,8 +41873,434 @@ and represent the current state of research on the topic. The prescribed citatio 'insertvon' => 'system' ) ) - ) + ), // PROJEKTARBEITSBEURTEILUNG SS2025 ENDE --------------------------------------------------------------------------- + array( + 'app' => 'core', + 'category' => 'global', + 'phrase' => 'abschicken', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Abschicken', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Submit', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'global', + 'phrase' => 'zurueckZumStart', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Zurück zum Start', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Back to Start', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'lvevaluierung', + 'category' => 'global', + 'phrase' => 'lvevaluierungAbschicken', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'LV-Evaluierung abschicken', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Submit Course Evaluation', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'lvevaluierung', + 'category' => 'global', + 'phrase' => 'lvevaluierung', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'LV-Evaluierung', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Course Evaluation', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'lvevaluierung', + 'category' => 'fragebogen', + 'phrase' => 'loginTextCodeEingeben', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Bitte geben Sie Ihren Code ein, um die Evaluierung zu starten:', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Please enter your code to start the evaluation:', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'lvevaluierung', + 'category' => 'fragebogen', + 'phrase' => 'loginCodeEingeben', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Evaluierung-Code eingeben', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Enter your Evaluation-Code', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'lvevaluierung', + 'category' => 'fragebogen', + 'phrase' => 'loginTextLvevaluierung', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => ' +
+

Die folgende LV-Evaluierung umfasst

+
+ + ', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => ' +
+

The following course evaluation includes

+
+ + ', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'lvevaluierung', + 'category' => 'fragebogen', + 'phrase' => 'loginTextAntwortoptionen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => ' +
+

Die Antwortoptionen umfassen 5 Stufen:

+
+ + ', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => ' +
+

The answer options comprise 5 levels:

+
+ + ', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'lvevaluierung', + 'category' => 'fragebogen', + 'phrase' => 'evaluierungPeriodeBeendet', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Der Evaluierungszeitraum endete am {date}', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Evaluation period was closed on {date}', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'lvevaluierung', + 'category' => 'fragebogen', + 'phrase' => 'evaluierungPeriodeStartetErst', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Der Evaluierungszeitraum startet erst am {date}', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Evaluation period starts on {date}', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'lvevaluierung', + 'category' => 'fragebogen', + 'phrase' => 'evaluierungEingereicht', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Die Evaluierung wurde am {date} eingereicht', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Evaluation was submitted on {date}', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'lvevaluierung', + 'category' => 'fragebogen', + 'phrase' => 'evaluierungNichtMehrVerfuegbar', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Diese Evaluierung ist nicht mehr verfügbar.', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'This evaluation is no longer available.', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'lvevaluierung', + 'category' => 'fragebogen', + 'phrase' => 'evaluierungNichtVerfuegbar', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Diese Evaluierung ist nicht verfügbar.', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'This evaluation is not available yet.', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'lvevaluierung', + 'category' => 'fragebogen', + 'phrase' => 'logoutTitle', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Danke!
Was passiert nun mit Ihrem Feedback?', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Thank you!
What happens to your feedback now?', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'lvevaluierung', + 'category' => 'fragebogen', + 'phrase' => 'logoutText', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => ' +

Ihr Feedback dient den Lehrenden zur Selbstevaluierung und Ihre Jahrgangsvertretungen werden von der Studiengangsleitung zum Jour-Fixe eingeladen, um die Ergebnisse zu besprechen.

+

Ihr Feedback dient der kontinuierlichen Weiterentwicklung der Lehrveranstaltung. Mehr Details dazu finden Sie hier: + ', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => ' +

Your feedback is used by the lecturers for self-evaluation and your year representatives are invited to the Jour-Fixe by the head of degree program to discuss the results.

+

Your feedback is used for the continuous further development of the course. You can find more details here: + ', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'lvevaluierung', + 'category' => 'fragebogen', + 'phrase' => 'evaluierungZeitAbgelaufen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Die Evaluierungszeit ist abgelaufen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'The Evaluation time is over', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'lvevaluierung', + 'category' => 'fragebogen', + 'phrase' => 'evaluierungAntwortenNichtUebermittelt', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Ihre Antworten wurden nicht übermittelt.', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Your responses were not submitted.', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'lvevaluierung', + 'category' => 'fragebogen', + 'phrase' => 'evaluierungCodeExistiertNicht', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Dieser Evaluierungscode exisitiert nicht', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'This evaluation code does not exist', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'lvevaluierung', + 'category' => 'fragebogen', + 'phrase' => 'evaluierungNichtAktiv', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Die Evaluierung ist nicht aktiv', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Evaluation is not active', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), ); From fd2de106f8a4a760e1df0c001896022cc95a4ba9 Mon Sep 17 00:00:00 2001 From: Cristina Date: Tue, 24 Jun 2025 15:02:45 +0200 Subject: [PATCH 02/58] Added column evaluierung to lehre.tbl_lehrveranstaltung - evaluierung (boolean) indicates if lehrveranstaltung shall be evaluated. Default is true. --- system/dbupdate_3.4.php | 3 ++- system/dbupdate_3.4/62063_lv_evaluierung.php | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 system/dbupdate_3.4/62063_lv_evaluierung.php diff --git a/system/dbupdate_3.4.php b/system/dbupdate_3.4.php index 0e2b4e7c6..6b346573a 100644 --- a/system/dbupdate_3.4.php +++ b/system/dbupdate_3.4.php @@ -74,6 +74,7 @@ require_once('dbupdate_3.4/55968_index_anrechnung.php'); require_once('dbupdate_3.4/25999_locale_update.php'); require_once('dbupdate_3.4/55289_pep_fine_tuning.php'); require_once('dbupdate_3.4/55614_perm_verwaltetoe.php'); +require_once('dbupdate_3.4/62063_lv_evaluierung.php'); // *** Pruefung und hinzufuegen der neuen Attribute und Tabellen echo '

Pruefe Tabellen und Attribute!

'; @@ -241,7 +242,7 @@ $tabellen=array( "lehre.tbl_lehrmittel" => array("lehrmittel_kurzbz","beschreibung","ort_kurzbz"), "lehre.tbl_lehrmodus" => array("lehrmodus_kurzbz","bezeichnung_mehrsprachig","aktiv"), "lehre.tbl_lehrtyp" => array("lehrtyp_kurzbz","bezeichnung"), - "lehre.tbl_lehrveranstaltung" => array("lehrveranstaltung_id","kurzbz","bezeichnung","lehrform_kurzbz","studiengang_kz","semester","sprache","ects","semesterstunden","anmerkung","lehre","lehreverzeichnis","aktiv","planfaktor","planlektoren","planpersonalkosten","plankostenprolektor","koordinator","sort","zeugnis","projektarbeit","updateamum","updatevon","insertamum","insertvon","ext_id","bezeichnung_english","orgform_kurzbz","incoming","lehrtyp_kurzbz","oe_kurzbz","raumtyp_kurzbz","anzahlsemester","semesterwochen","lvnr","farbe","semester_alternativ","old_lehrfach_id","sws","lvs","alvs","lvps","las","benotung","lvinfo","lehrauftrag","lehrmodus_kurzbz","lehrveranstaltung_template_id"), + "lehre.tbl_lehrveranstaltung" => array("lehrveranstaltung_id","kurzbz","bezeichnung","lehrform_kurzbz","studiengang_kz","semester","sprache","ects","semesterstunden","anmerkung","lehre","lehreverzeichnis","aktiv","planfaktor","planlektoren","planpersonalkosten","plankostenprolektor","koordinator","sort","zeugnis","projektarbeit","updateamum","updatevon","insertamum","insertvon","ext_id","bezeichnung_english","orgform_kurzbz","incoming","lehrtyp_kurzbz","oe_kurzbz","raumtyp_kurzbz","anzahlsemester","semesterwochen","lvnr","farbe","semester_alternativ","old_lehrfach_id","sws","lvs","alvs","lvps","las","benotung","lvinfo","lehrauftrag","lehrmodus_kurzbz","lehrveranstaltung_template_id", "evaluierung"), "lehre.tbl_lehrveranstaltung_kompatibel" => array("lehrveranstaltung_id","lehrveranstaltung_id_kompatibel"), "lehre.tbl_lvangebot" => array("lvangebot_id","lehrveranstaltung_id","studiensemester_kurzbz","gruppe_kurzbz","incomingplaetze","gesamtplaetze","anmeldefenster_start","anmeldefenster_ende","insertamum","insertvon","updateamum","updatevon"), "lehre.tbl_lvregel" => array("lvregel_id","lvregeltyp_kurzbz","operator","parameter","lvregel_id_parent","lehrveranstaltung_id","studienplan_lehrveranstaltung_id","insertamum","insertvon","updateamum","updatevon"), diff --git a/system/dbupdate_3.4/62063_lv_evaluierung.php b/system/dbupdate_3.4/62063_lv_evaluierung.php new file mode 100644 index 000000000..5a0714772 --- /dev/null +++ b/system/dbupdate_3.4/62063_lv_evaluierung.php @@ -0,0 +1,15 @@ +db_query("SELECT evaluierung FROM lehre.tbl_lehrveranstaltung LIMIT 1")) +{ + $qry = "ALTER TABLE lehre.tbl_lehrveranstaltung ADD COLUMN evaluierung boolean NOT NULL DEFAULT true; + COMMENT ON COLUMN lehre.tbl_lehrveranstaltung.evaluierung IS 'TRUE wenn für diese LV eine LV-Evaluierung durchgeführt wird'; + "; + + if(!$db->db_query($qry)) + echo 'lehre.tbl_lehrveranstaltung '.$db->db_last_error().'
'; + else + echo '
Spalte evaluierung zu Tabelle lehre.tbl_lehrveranstaltung hinzugefügt'; +} From 4b8af46a2ee0edf7968ec18c4204fd6d0e40d0cc Mon Sep 17 00:00:00 2001 From: Cristina Date: Wed, 25 Jun 2025 13:30:05 +0200 Subject: [PATCH 03/58] Added 'evaluierung' to lehrveranstaltung.class.php and updated related methods --- include/lehrveranstaltung.class.php | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/include/lehrveranstaltung.class.php b/include/lehrveranstaltung.class.php index 48edd9d0a..aa3b6771e 100644 --- a/include/lehrveranstaltung.class.php +++ b/include/lehrveranstaltung.class.php @@ -70,6 +70,7 @@ class lehrveranstaltung extends basis_db public $farbe; public $lehrauftrag=true; public $lehrveranstaltung_template_id; // integer + public $evaluierung=true; // boolean public $studienplan_lehrveranstaltung_id; @@ -170,6 +171,7 @@ class lehrveranstaltung extends basis_db $this->benotung = $this->db_parse_bool($row->benotung); $this->lvinfo = $this->db_parse_bool($row->lvinfo); $this->lehrauftrag = $this->db_parse_bool($row->lehrauftrag); + $this->evaluierung = $this->db_parse_bool($row->evaluierung); // FIXME: LV-Bezeichnung richtig mehrsprachig machen // Zwischenzeitlich 'Italian' zum bezeichnung_arr dazugegeben @@ -244,6 +246,7 @@ class lehrveranstaltung extends basis_db $lv_obj->benotung = $this->db_parse_bool($row->benotung); $lv_obj->lvinfo = $this->db_parse_bool($row->lvinfo); $lv_obj->lehrauftrag = $this->db_parse_bool($row->lehrauftrag); + $lv_obj->evaluierung = $this->db_parse_bool($row->evaluierung); $lv_obj->bezeichnung_arr['German'] = $row->bezeichnung; $lv_obj->bezeichnung_arr['English'] = $row->bezeichnung_english; @@ -394,6 +397,7 @@ class lehrveranstaltung extends basis_db $lv_obj->benotung = $this->db_parse_bool($row->benotung); $lv_obj->lvinfo = $this->db_parse_bool($row->lvinfo); $lv_obj->lehrauftrag = $this->db_parse_bool($row->lehrauftrag); + $lv_obj->evaluierung = $this->db_parse_bool($row->evaluierung); $lv_obj->bezeichnung_arr['German'] = $row->bezeichnung; $lv_obj->bezeichnung_arr['Italian'] = $row->bezeichnung; @@ -524,6 +528,7 @@ class lehrveranstaltung extends basis_db $lv_obj->benotung = $this->db_parse_bool($row->benotung); $lv_obj->lvinfo = $this->db_parse_bool($row->lvinfo); $lv_obj->lehrauftrag = $this->db_parse_bool($row->lehrauftrag); + $lv_obj->evaluierung = $this->db_parse_bool($row->evaluierung); $lv_obj->bezeichnung_arr['German'] = $row->bezeichnung; $lv_obj->bezeichnung_arr['English'] = $row->bezeichnung_english; @@ -607,6 +612,7 @@ class lehrveranstaltung extends basis_db $lv_obj->benotung = $this->db_parse_bool($row->benotung); $lv_obj->lvinfo = $this->db_parse_bool($row->lvinfo); $lv_obj->lehrauftrag = $this->db_parse_bool($row->lehrauftrag); + $lv_obj->evaluierung = $this->db_parse_bool($row->evaluierung); $lv_obj->bezeichnung_arr['German'] = $row->bezeichnung; $lv_obj->bezeichnung_arr['English'] = $row->bezeichnung_english; @@ -779,7 +785,7 @@ class lehrveranstaltung extends basis_db insertvon, planfaktor, planlektoren, planpersonalkosten, plankostenprolektor, updateamum, updatevon, sort, zeugnis, projektarbeit, sprache, koordinator, bezeichnung_english, orgform_kurzbz, incoming, lehrtyp_kurzbz, oe_kurzbz, raumtyp_kurzbz, anzahlsemester, semesterwochen, lvnr, semester_alternativ, farbe, lehrveranstaltung_template_id,sws,lvs,alvs,lvps,las,benotung,lvinfo, - lehrauftrag, lehrmodus_kurzbz) VALUES ('. + lehrauftrag, lehrmodus_kurzbz, evaluierung) VALUES ('. $this->db_add_param($this->studiengang_kz). ', '. $this->db_add_param($this->bezeichnung). ', '. $this->db_add_param($this->kurzbz). ', '. @@ -824,7 +830,8 @@ class lehrveranstaltung extends basis_db $this->db_add_param($this->benotung, FHC_BOOLEAN).','. $this->db_add_param($this->lvinfo, FHC_BOOLEAN).','. $this->db_add_param($this->lehrauftrag, FHC_BOOLEAN).','. - $this->db_add_param($this->lehrmodus_kurzbz) + $this->db_add_param($this->lehrmodus_kurzbz).','. + $this->db_add_param($this->evaluierung, FHC_BOOLEAN) .');'; } else @@ -880,7 +887,8 @@ class lehrveranstaltung extends basis_db 'las = '.$this->db_add_param($this->las).', '. 'benotung = '.$this->db_add_param($this->benotung, FHC_BOOLEAN).', '. 'lvinfo = '.$this->db_add_param($this->lvinfo, FHC_BOOLEAN).', '. - 'lehrauftrag = '.$this->db_add_param($this->lehrauftrag, FHC_BOOLEAN).' '. + 'lehrauftrag = '.$this->db_add_param($this->lehrauftrag, FHC_BOOLEAN).', '. + 'evaluierung = '.$this->db_add_param($this->evaluierung, FHC_BOOLEAN).' '. 'WHERE lehrveranstaltung_id = ' . $this->db_add_param($this->lehrveranstaltung_id, FHC_INTEGER, false) . ';'; } @@ -991,6 +999,7 @@ class lehrveranstaltung extends basis_db $lv_obj->benotung = $this->db_parse_bool($row->benotung); $lv_obj->lvinfo = $this->db_parse_bool($row->lvinfo); $lv_obj->lehrauftrag = $this->db_parse_bool($row->lehrauftrag); + $lv_obj->evaluierung = $this->db_parse_bool($row->evaluierung); $lv_obj->bezeichnung_arr['German'] = $row->bezeichnung; $lv_obj->bezeichnung_arr['English'] = $row->bezeichnung_english; @@ -1086,6 +1095,7 @@ class lehrveranstaltung extends basis_db $l->benotung = $this->db_parse_bool($row->benotung); $l->lvinfo = $this->db_parse_bool($row->lvinfo); $l->lehrauftrag = $this->db_parse_bool($row->lehrauftrag); + $l->evaluierung = $this->db_parse_bool($row->evaluierung); $l->bezeichnung_arr['German'] = $row->bezeichnung; $l->bezeichnung_arr['English'] = $row->bezeichnung_english; @@ -1170,6 +1180,7 @@ class lehrveranstaltung extends basis_db $lv_obj->benotung = $this->db_parse_bool($row->benotung); $lv_obj->lvinfo = $this->db_parse_bool($row->lvinfo); $lv_obj->lehrauftrag = $this->db_parse_bool($row->lehrauftrag); + $lv_obj->evaluierung = $this->db_parse_bool($row->evaluierung); $lv_obj->bezeichnung_arr['German'] = $row->bezeichnung; $lv_obj->bezeichnung_arr['English'] = $row->bezeichnung_english; @@ -1271,6 +1282,7 @@ class lehrveranstaltung extends basis_db $obj->benotung = $this->db_parse_bool($row->benotung); $obj->lvinfo = $this->db_parse_bool($row->lvinfo); $obj->lehrauftrag = $this->db_parse_bool($row->lehrauftrag); + $obj->evaluierung = $this->db_parse_bool($row->evaluierung); $obj->bezeichnung_arr['German'] = $row->bezeichnung; $obj->bezeichnung_arr['English'] = $row->bezeichnung_english; @@ -1396,6 +1408,7 @@ class lehrveranstaltung extends basis_db $obj->lvinfo =$this->db_parse_bool( $lv->lvinfo); $obj->zeugnis = $this->db_parse_bool($lv->zeugnis); $obj->lehrauftrag = $this->db_parse_bool($lv->lehrauftrag); + $obj->evaluierung = $this->db_parse_bool($lv->evaluierung); $values[] = $obj; @@ -1422,6 +1435,7 @@ class lehrveranstaltung extends basis_db $obj->lvinfo =$this->db_parse_bool( $this->lvinfo); $obj->zeugnis = $this->db_parse_bool($this->zeugnis); $obj->lehrauftrag = $this->db_parse_bool($this->lehrauftrag); + $obj->evaluierung = $this->db_parse_bool($this->evaluierung); $values[] = $obj; } @@ -1476,6 +1490,7 @@ class lehrveranstaltung extends basis_db $obj->export = $lv->export; $obj->genehmigung = $lv->genehmigung; $obj->lehrauftrag = $lv->lehrauftrag; + $obj->evaluierung = $lv->evaluierung; $obj->lehre = $lv->lehre; $obj->children = array(); if(count($lv->childs) > 0) @@ -1507,6 +1522,7 @@ class lehrveranstaltung extends basis_db $obj->zeugnis = $this->db_parse_bool($this->zeugnis); $obj->curriculum = $this->db_parse_bool($this->curriculum); $obj->lehrauftrag = $this->lehrauftrag; + $obj->evaluierung = $this->db_parse_bool($this->evaluierung); $values[] = $obj; } @@ -1613,6 +1629,7 @@ class lehrveranstaltung extends basis_db $lv_obj->benotung = $this->db_parse_bool($row->benotung); $lv_obj->lvinfo = $this->db_parse_bool($row->lvinfo); $lv_obj->lehrauftrag = $this->db_parse_bool($row->lehrauftrag); + $lv_obj->evaluierung = $this->db_parse_bool($row->evaluierung); $lv_obj->bezeichnung_arr['German'] = $row->bezeichnung; $lv_obj->bezeichnung_arr['English'] = $row->bezeichnung_english; @@ -1700,6 +1717,7 @@ class lehrveranstaltung extends basis_db $lv_obj->benotung = $this->db_parse_bool($row->benotung); $lv_obj->lvinfo = $this->db_parse_bool($row->lvinfo); $lv_obj->lehrauftrag = $this->db_parse_bool($row->lehrauftrag); + $lv_obj->evaluierung = $this->db_parse_bool($row->evaluierung); $lv_obj->bezeichnung_arr['German'] = $row->bezeichnung; $lv_obj->bezeichnung_arr['English'] = $row->bezeichnung_english; @@ -1873,6 +1891,7 @@ class lehrveranstaltung extends basis_db $lv_obj->benotung = $this->db_parse_bool($row->benotung); $lv_obj->lvinfo = $this->db_parse_bool($row->lvinfo); $lv_obj->lehrauftrag = $this->db_parse_bool($row->lehrauftrag); + $lv_obj->evaluierung = $this->db_parse_bool($row->evaluierung); $lv_obj->bezeichnung_arr['German'] = $row->bezeichnung; $lv_obj->bezeichnung_arr['English'] = $row->bezeichnung_english; @@ -2003,6 +2022,7 @@ class lehrveranstaltung extends basis_db $lv_obj->benotung = $this->db_parse_bool($row->benotung); $lv_obj->lvinfo = $this->db_parse_bool($row->lvinfo); $lv_obj->lehrauftrag = $this->db_parse_bool($row->lehrauftrag); + $lv_obj->evaluierung = $this->db_parse_bool($row->evaluierung); $lv_obj->studiengang_kurzbzlang = $row->studiengang_kurzbzlang; @@ -2131,6 +2151,7 @@ class lehrveranstaltung extends basis_db $lv_obj->benotung = $this->db_parse_bool($row->benotung); $lv_obj->lvinfo = $this->db_parse_bool($row->lvinfo); $lv_obj->lehrauftrag = $this->db_parse_bool($row->lehrauftrag); + $lv_obj->evaluierung = $this->db_parse_bool($row->evaluierung); $lv_obj->bezeichnung_arr['German'] = $row->bezeichnung; $lv_obj->bezeichnung_arr['English'] = $row->bezeichnung_english; @@ -2402,6 +2423,7 @@ class lehrveranstaltung extends basis_db $obj->benotung = $this->db_parse_bool($row->benotung); $obj->lvinfo = $this->db_parse_bool($row->lvinfo); $obj->lehrauftrag = $this->db_parse_bool($row->lehrauftrag); + $obj->evaluierung = $this->db_parse_bool($row->evaluierung); $obj->bezeichnung_arr['German'] = $row->bezeichnung; $obj->bezeichnung_arr['English'] = $row->bezeichnung_english; From daf9d2ea15f8d7063a07cf179cb87cdd8cda8d31 Mon Sep 17 00:00:00 2001 From: Cristina Date: Wed, 25 Jun 2025 13:35:20 +0200 Subject: [PATCH 04/58] Added checkbox 'evaluierung' Lehrveranstaltung Details in VILESCI --- vilesci/lehre/lehrveranstaltung_details.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/vilesci/lehre/lehrveranstaltung_details.php b/vilesci/lehre/lehrveranstaltung_details.php index bad2a7d93..c1433047c 100644 --- a/vilesci/lehre/lehrveranstaltung_details.php +++ b/vilesci/lehre/lehrveranstaltung_details.php @@ -122,6 +122,7 @@ $lv->benotung = isset($_POST['benotung']); $lv->lvinfo = isset($_POST['lvinfo']); $lv->lehrauftrag = isset($_POST['lehrauftrag']); + $lv->evaluierung = isset($_POST['evaluierung']); $lv->lehrveranstaltung_template_id = $lv->lehrtyp_kurzbz == 'tpl' ? '' : $_POST['lehrveranstaltung_template_id']; if(!$lv->save()) @@ -446,6 +447,10 @@ Lehrauftrag lehrauftrag?'checked':'').'> + + Evaulierung + evaluierung?'checked':'').'> + Template From 56bfe46675ff6281ca454073c486c55399b3e7fb Mon Sep 17 00:00:00 2001 From: Cristina Date: Wed, 2 Jul 2025 12:10:28 +0200 Subject: [PATCH 05/58] Added phrases for lvevaluierung --- system/phrasesupdate.php | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php index 7c350c452..8ac45c0fa 100644 --- a/system/phrasesupdate.php +++ b/system/phrasesupdate.php @@ -41915,6 +41915,7 @@ and represent the current state of research on the topic. The prescribed citatio ) ) ), + // LVEVALUIERUNG --------------------------------------------------------------------------------------------------- array( 'app' => 'lvevaluierung', 'category' => 'global', @@ -42301,6 +42302,26 @@ and represent the current state of research on the topic. The prescribed citatio ) ) ), + array( + 'app' => 'lvevaluierung', + 'category' => 'fragebogen', + 'phrase' => 'zeitLaeuftAb', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Zeit läuft bald ab – zum Speichern bitte ‚Abschicken‘ klicken', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Time is running out — please click ‘Submit’ to save your answers', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), ); From 153e273fec5396c5bd0991867a3b38b5335ab54f Mon Sep 17 00:00:00 2001 From: ma0048 Date: Wed, 9 Jul 2025 13:52:46 +0200 Subject: [PATCH 06/58] firefox check entfernt --- cis/testtool/login.php | 8 -------- 1 file changed, 8 deletions(-) diff --git a/cis/testtool/login.php b/cis/testtool/login.php index 5a2ae0dea..5306dadab 100644 --- a/cis/testtool/login.php +++ b/cis/testtool/login.php @@ -447,14 +447,6 @@ if (isset($_POST['save']) && isset($_SESSION['prestudent_id'])) { e.preventDefault(); }); - // If Browser is any other than Mozilla Firefox and the test includes any MathML, - // show message to use Mozilla Firefox - var ua = navigator.userAgent; - if ((ua.indexOf("Firefox") > -1) == false) - { - $("#alertmsgdiv").html("
BITTE VERWENDEN SIE DEN MOZILLA FIREFOX BROWSER!
(Manche Prüfungsfragen werden sonst nicht korrekt dargestellt.

PLEASE USE MOZILLA FIREFOX BROWSER!
(Otherwise some exam items will not be displayed correctly
"); - //alert('BITTE VERWENDEN SIE DEN MOZILLA FIREFOX BROWSER!\n(Manche Prüfungsfragen werden sonst nicht korrekt dargestellt.\n\nPLEASE USE MOZILLA FIREFOX BROWSER!\n(Ohterwise some exam items will not be displayed correctly.)'); - } }); Date: Wed, 16 Jul 2025 16:13:27 +0200 Subject: [PATCH 07/58] Added phrases for lvevaluierung --- system/phrasesupdate.php | 80 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php index 8ac45c0fa..417eb9110 100644 --- a/system/phrasesupdate.php +++ b/system/phrasesupdate.php @@ -42322,6 +42322,86 @@ and represent the current state of research on the topic. The prescribed citatio ) ) ), + array( + 'app' => 'lvevaluierung', + 'category' => 'fragebogen', + 'phrase' => 'spracheAuswaehlen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Sprache auswählen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Select language', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'lvevaluierung', + 'category' => 'fragebogen', + 'phrase' => 'fhtwLogo', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'FH Technikum Wien Logo', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'UAS Technikum Wien Logo', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'lvevaluierung', + 'category' => 'fragebogen', + 'phrase' => 'evaluierungscodeEingeben', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Evaluierungscode eingeben', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Enter Evaluation code', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'lvevaluierung', + 'category' => 'fragebogen', + 'phrase' => 'fragebogen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Fragebogen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Questionnaire', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), ); From fd2ff27e22d16aab895e781bf9a5d21c3ac91d51 Mon Sep 17 00:00:00 2001 From: Cristina Date: Wed, 3 Sep 2025 15:24:07 +0200 Subject: [PATCH 08/58] Added column prestudent_id to getStudentsByLv method query in Lehrveranstaltung_model.php --- application/models/education/Lehrveranstaltung_model.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/application/models/education/Lehrveranstaltung_model.php b/application/models/education/Lehrveranstaltung_model.php index 3eb4d33a2..63d1ca15c 100644 --- a/application/models/education/Lehrveranstaltung_model.php +++ b/application/models/education/Lehrveranstaltung_model.php @@ -316,7 +316,8 @@ class Lehrveranstaltung_model extends DB_Model (SELECT status_kurzbz FROM public.tbl_prestudentstatus WHERE prestudent_id=tbl_student.prestudent_id ORDER BY datum DESC, insertamum DESC, ext_id DESC LIMIT 1) as status, tbl_bisio.bisio_id, tbl_bisio.von, tbl_bisio.bis, tbl_student.studiengang_kz AS stg_kz_student, tbl_zeugnisnote.note, tbl_mitarbeiter.mitarbeiter_uid, tbl_person.matr_nr, tbl_benutzer.uid, - UPPER(tbl_studiengang.typ::varchar(1) || tbl_studiengang.kurzbz) as kuerzel, tbl_studiengang.orgform_kurzbz, vw_student_lehrveranstaltung.semester, vw_student_lehrveranstaltung.studiensemester_kurzbz, vw_student_lehrveranstaltung.bezeichnung + UPPER(tbl_studiengang.typ::varchar(1) || tbl_studiengang.kurzbz) as kuerzel, tbl_studiengang.orgform_kurzbz, vw_student_lehrveranstaltung.semester, vw_student_lehrveranstaltung.studiensemester_kurzbz, vw_student_lehrveranstaltung.bezeichnung, + tbl_student.prestudent_id FROM campus.vw_student_lehrveranstaltung From 10d58d1a42f64649ef0110ccb9528519bd05efa4 Mon Sep 17 00:00:00 2001 From: Cristina Date: Wed, 3 Sep 2025 15:24:07 +0200 Subject: [PATCH 09/58] Added column prestudent_id to getStudentsByLv method query in Lehrveranstaltung_model.php --- application/models/education/Lehrveranstaltung_model.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/application/models/education/Lehrveranstaltung_model.php b/application/models/education/Lehrveranstaltung_model.php index 3eb4d33a2..e02c1ad0b 100644 --- a/application/models/education/Lehrveranstaltung_model.php +++ b/application/models/education/Lehrveranstaltung_model.php @@ -316,8 +316,8 @@ class Lehrveranstaltung_model extends DB_Model (SELECT status_kurzbz FROM public.tbl_prestudentstatus WHERE prestudent_id=tbl_student.prestudent_id ORDER BY datum DESC, insertamum DESC, ext_id DESC LIMIT 1) as status, tbl_bisio.bisio_id, tbl_bisio.von, tbl_bisio.bis, tbl_student.studiengang_kz AS stg_kz_student, tbl_zeugnisnote.note, tbl_mitarbeiter.mitarbeiter_uid, tbl_person.matr_nr, tbl_benutzer.uid, - UPPER(tbl_studiengang.typ::varchar(1) || tbl_studiengang.kurzbz) as kuerzel, tbl_studiengang.orgform_kurzbz, vw_student_lehrveranstaltung.semester, vw_student_lehrveranstaltung.studiensemester_kurzbz, vw_student_lehrveranstaltung.bezeichnung - + UPPER(tbl_studiengang.typ::varchar(1) || tbl_studiengang.kurzbz) as kuerzel, tbl_studiengang.orgform_kurzbz, vw_student_lehrveranstaltung.semester, vw_student_lehrveranstaltung.studiensemester_kurzbz, vw_student_lehrveranstaltung.bezeichnung, + tbl_student.prestudent_id FROM campus.vw_student_lehrveranstaltung JOIN public.tbl_benutzer USING(uid) From cb64c83b504c4b1ba05b5a2bc73f0b4ea34e2d55 Mon Sep 17 00:00:00 2001 From: Cristina Date: Wed, 1 Oct 2025 13:48:10 +0200 Subject: [PATCH 10/58] Added method to get LV-Leitung from given LV --- .../education/Lehrveranstaltung_model.php | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/application/models/education/Lehrveranstaltung_model.php b/application/models/education/Lehrveranstaltung_model.php index e02c1ad0b..462e92e5e 100644 --- a/application/models/education/Lehrveranstaltung_model.php +++ b/application/models/education/Lehrveranstaltung_model.php @@ -386,6 +386,37 @@ class Lehrveranstaltung_model extends DB_Model return $this->execQuery($query, array($lehrveranstaltung_id, $studiensemester_kurzbz)); } + + /** + * Get LV-Leitung of given Lehrveranstaltung ID and Studiensemester. + * + * @param $lehrveranstaltung_id + * @param $studiensemester + * @return array|stdClass|null + */ + public function getLvLeitung($lehrveranstaltung_id, $studiensemester) + { + $params = [$lehrveranstaltung_id, $studiensemester]; + + $qry = " + SELECT + vorname, nachname, mitarbeiter_uid, lehrfunktion_kurzbz + FROM + lehre.tbl_lehreinheit + JOIN lehre.tbl_lehreinheitmitarbeiter lema USING (lehreinheit_id) + JOIN public.tbl_benutzer b ON b.uid = lema.mitarbeiter_uid + JOIN public.tbl_person p using (person_id) + WHERE + tbl_lehreinheit.lehrveranstaltung_id= ? + AND tbl_lehreinheit.studiensemester_kurzbz = ? + AND lehrfunktion_kurzbz = 'LV-Leitung' + ORDER BY + lema.insertamum DESC + LIMIT 1 + "; + + return $this->execQuery($qry, $params); + } /** * Gets all Leiter of Lehrveranstaltungsorganisationseinheit * @param $lehrveranstaltung_id From cb77f3148a5a6fe2da87f614a4897457907ddf4c Mon Sep 17 00:00:00 2001 From: Cristina Date: Wed, 1 Oct 2025 13:50:57 +0200 Subject: [PATCH 11/58] Added method to get Stundenplantermine for Lehreinheit/Lehrveranstaltung --- .../models/ressource/Stundenplan_model.php | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/application/models/ressource/Stundenplan_model.php b/application/models/ressource/Stundenplan_model.php index 389be582d..067e2b790 100644 --- a/application/models/ressource/Stundenplan_model.php +++ b/application/models/ressource/Stundenplan_model.php @@ -535,4 +535,53 @@ class Stundenplan_model extends DB_Model 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]); + } } From deebe987d32a0bec2e64bd162c4b0bade7aa7149 Mon Sep 17 00:00:00 2001 From: Cristina Date: Wed, 1 Oct 2025 13:51:43 +0200 Subject: [PATCH 12/58] Added slot selectedItem to autocomplete component in Input.js --- public/js/components/Form/Input.js | 1 + 1 file changed, 1 insertion(+) diff --git a/public/js/components/Form/Input.js b/public/js/components/Form/Input.js index 81b47d504..3c3fa45d5 100644 --- a/public/js/components/Form/Input.js +++ b/public/js/components/Form/Input.js @@ -280,6 +280,7 @@ export default { + From 2aee86baba09b66e92ad99c2881b7685dd234a5a Mon Sep 17 00:00:00 2001 From: Cristina Date: Tue, 14 Oct 2025 09:55:55 +0200 Subject: [PATCH 13/58] Changed phrase lvevaluierung/logoutText --- system/phrasesupdate.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php index 469815a46..ede5cc2e3 100644 --- a/system/phrasesupdate.php +++ b/system/phrasesupdate.php @@ -49663,8 +49663,9 @@ and represent the current state of research on the topic. The prescribed citatio array( 'sprache' => 'German', 'text' => ' -

Ihr Feedback dient den Lehrenden zur Selbstevaluierung und Ihre Jahrgangsvertretungen werden von der Studiengangsleitung zum Jour-Fixe eingeladen, um die Ergebnisse zu besprechen.

-

Ihr Feedback dient der kontinuierlichen Weiterentwicklung der Lehrveranstaltung. Mehr Details dazu finden Sie hier: +

Danke, dass Sie sich Zeit für das Feedback genommen haben! Ihre ehrliche und konstruktive Rückmeldung ist essenziell, damit Ihre Lehrenden und Ihre Studiengangsleitung die Lehrveranstaltung immer weiter verbessern und anpassen können!

+

Und was passiert jetzt mit Ihrem Feedback? Die Studiengangsleitung wird die Ergebnisse & Maßnahmen zusammen mit Ihrer Jahrgangsvertretung besprechen. So tragen Sie aktiv dazu bei, die Lehrveranstaltung für zukünftige Semester noch spannender & lehrreicher zu machen!

+

Gemeinsam für mehr Qualität in der Lehre!

', 'description' => '', 'insertvon' => 'system' @@ -49672,8 +49673,9 @@ and represent the current state of research on the topic. The prescribed citatio array( 'sprache' => 'English', 'text' => ' -

Your feedback is used by the lecturers for self-evaluation and your year representatives are invited to the Jour-Fixe by the head of degree program to discuss the results.

-

Your feedback is used for the continuous further development of the course. You can find more details here: +

Thank you for taking the time to provide feedback! Your honest and constructive input is essential for your lecturers and degree program director to continuously improve and adapt the course.

+

What happens with your feedback? The degree program director will discuss the results and potential measures together with your academic year representatives. You have thus actively contributed to making the course even more engaging and educational for future semesters!

+

Working together for higher quality in teaching!

', 'description' => '', 'insertvon' => 'system' From 6e9969d9e43c828f907e3f54a6c8c76d5717c60e Mon Sep 17 00:00:00 2001 From: ma0068 Date: Mon, 20 Oct 2025 16:08:12 +0200 Subject: [PATCH 14/58] use shorter table names for columns stg and orgform , add column ausbildungssemester --- .../models/person/Profil_update_model.php | 3 +- .../Cis/ProfilUpdate/ProfilUpdateView.js | 13 ++++-- system/phrasesupdate.php | 40 +++++++++++++++++++ 3 files changed, 51 insertions(+), 5 deletions(-) diff --git a/application/models/person/Profil_update_model.php b/application/models/person/Profil_update_model.php index 31005c4b7..039810537 100644 --- a/application/models/person/Profil_update_model.php +++ b/application/models/person/Profil_update_model.php @@ -135,7 +135,8 @@ class Profil_update_model extends DB_Model attachment_id, UPPER(public.tbl_studiengang.typ || public.tbl_studiengang.kurzbz) AS studiengang, COALESCE(of.orgform_kurzbz, public.tbl_studiengang.orgform_kurzbz) AS orgform, - NULL as oezuordnung + NULL as oezuordnung, + tbl_student.semester FROM public.tbl_profil_update JOIN public.tbl_profil_update_status ON public.tbl_profil_update_status.status_kurzbz = public.tbl_profil_update.status JOIN public.tbl_student ON public.tbl_student.student_uid=public.tbl_profil_update.uid diff --git a/public/js/components/Cis/ProfilUpdate/ProfilUpdateView.js b/public/js/components/Cis/ProfilUpdate/ProfilUpdateView.js index 745f53002..24a5d8bc3 100644 --- a/public/js/components/Cis/ProfilUpdate/ProfilUpdateView.js +++ b/public/js/components/Cis/ProfilUpdate/ProfilUpdateView.js @@ -46,7 +46,6 @@ export default { loading: false, filter: "Pending", profil_update_id: Number(this.id), - }; }, computed: { @@ -205,7 +204,7 @@ export default { //responsive:0, }, { - title: this.$p.t("lehre", "studiengang") + ' (' + this.$p.t("profil", "studentIn") + ')', + title: this.$p.t("profil", "stg_short") + ' (' + this.$p.t("profil", "studentIn") + ')', field: "studiengang", minWidth: 50, resizable: true, @@ -214,7 +213,7 @@ export default { //responsive:0, }, { - title: this.$p.t("lehre", "organisationsform") + ' (' + this.$p.t("profil", "studentIn") + ')', + title: this.$p.t("profil", "orgform_short") + ' (' + this.$p.t("profil", "studentIn") + ')', field: "orgform", minWidth: 50, resizable: true, @@ -278,6 +277,12 @@ export default { minWidth: 200, //responsive:0, }, + { + title: this.$p.t("lehre", "ausbildungssemester"), + field: "semester", + headerFilter: "list", + headerFilterParams: {valuesLookup:true, listOnEmpty:true, autocomplete:true, sort:"asc"} + }, { title: this.$p.t("profilUpdate", "actions"), headerSort: false, @@ -415,7 +420,7 @@ export default { }, template: /*html*/ `
- +
{{$p.t('ui','anzeigen')}}
diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php index 5d3833dc9..aace77876 100644 --- a/system/phrasesupdate.php +++ b/system/phrasesupdate.php @@ -28596,6 +28596,46 @@ array( ) ) ), + array( + 'app' => 'core', + 'category' => 'profil', + 'phrase' => 'stg_short', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'StG', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'degree Progr', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'profil', + 'phrase' => 'orgform_short', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'OrgForm', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'org Form', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), //Profil Phrasen ende // LvPlan Phrasen start array( From 1423579a49ad245aa9fed4bac817f500027b6741 Mon Sep 17 00:00:00 2001 From: ma0068 Date: Tue, 21 Oct 2025 14:42:02 +0200 Subject: [PATCH 15/58] refactor Profile Update for filter, backendfilter not active --- .../components/filters/ProfileUpdate.php | 51 ++++++++++ .../Cis/ProfilUpdate/ProfilUpdateView.js | 96 +++++++++++++++++-- system/filtersupdate.php | 57 +++++++++++ 3 files changed, 196 insertions(+), 8 deletions(-) create mode 100644 application/components/filters/ProfileUpdate.php diff --git a/application/components/filters/ProfileUpdate.php b/application/components/filters/ProfileUpdate.php new file mode 100644 index 000000000..1a53e5145 --- /dev/null +++ b/application/components/filters/ProfileUpdate.php @@ -0,0 +1,51 @@ + 'core', + 'datasetName' => 'profileupdate', + 'query' => ' + SELECT + profil_update_id, + tbl_profil_update.uid, + (tbl_person.vorname || \' \' || tbl_person.nachname) AS name , + topic, + requested_change, + tbl_profil_update.updateamum, + tbl_profil_update.updatevon, + tbl_profil_update.insertamum, + tbl_profil_update.insertvon, + status, + public.tbl_profil_update_status.bezeichnung_mehrsprachig[(" . $lang . ")] as status_translated, + status_timestamp, + status_message, + attachment_id, + UPPER(public.tbl_studiengang.typ || public.tbl_studiengang.kurzbz) AS studiengang, + COALESCE(of.orgform_kurzbz, public.tbl_studiengang.orgform_kurzbz) AS orgform, + NULL as oezuordnung, + tbl_student.semester + FROM public.tbl_profil_update + JOIN public.tbl_profil_update_status ON public.tbl_profil_update_status.status_kurzbz = public.tbl_profil_update.status + JOIN public.tbl_student ON public.tbl_student.student_uid=public.tbl_profil_update.uid + JOIN public.tbl_benutzer ON public.tbl_benutzer.uid = public.tbl_student.student_uid + JOIN public.tbl_person ON public.tbl_benutzer.person_id=public.tbl_person.person_id + JOIN public.tbl_studiengang ON public.tbl_studiengang.studiengang_kz=public.tbl_student.studiengang_kz + LEFT JOIN ( + select + pss.prestudent_id, COALESCE(sp.orgform_kurzbz, pss.orgform_kurzbz) as orgform_kurzbz + from ( + select + prestudent_id, max(insertamum) as insertamum + from + public.tbl_prestudentstatus + where + datum <= NOW() + group by + prestudent_id + ) mpss + join + public.tbl_prestudentstatus pss on pss.prestudent_id = mpss.prestudent_id and pss.insertamum = mpss.insertamum + left join + lehre.tbl_studienplan sp on pss.studienplan_id = sp.studienplan_id + ) of ON of.prestudent_id = public.tbl_student.prestudent_id + ', + 'requiredPermissions' => 'student/stammdaten' +); \ No newline at end of file diff --git a/public/js/components/Cis/ProfilUpdate/ProfilUpdateView.js b/public/js/components/Cis/ProfilUpdate/ProfilUpdateView.js index 24a5d8bc3..bec825495 100644 --- a/public/js/components/Cis/ProfilUpdate/ProfilUpdateView.js +++ b/public/js/components/Cis/ProfilUpdate/ProfilUpdateView.js @@ -417,25 +417,105 @@ export default { if (sessionStorage.getItem("filter")) { this.filter = sessionStorage.getItem("filter"); } - }, - template: /*html*/ ` -
- -
+ /* +
{{$p.t('ui','anzeigen')}}
- + - +
+ + + :title="$p.t('profilUpdate','profilUpdateRequests')" + +

{{$p.t('profilUpdate', 'profilUpdateRequests')}}

+ + +
+
+ +
+
+ + + //Version mit filter rechts in eigener zeile + + + +
+ +
+ +
+ + //backendfilter not working: no parameters provided + + + + */ + + + + + }, + template: /*html*/ ` +
+ + + +

{{$p.t('profilUpdate', 'profilUpdateRequests')}}

+ - +
+ +
+ +
+
+ + + +
`, }; diff --git a/system/filtersupdate.php b/system/filtersupdate.php index 9e3c62a33..2942bcb4e 100644 --- a/system/filtersupdate.php +++ b/system/filtersupdate.php @@ -1558,6 +1558,63 @@ $filters = array( }', 'oe_kurzbz' => null, ), + array( + 'app' => 'core', + 'dataset_name' => 'profileupdate', + 'filter_kurzbz' => 'ProfilupdatePending', + 'description' => '{Ausstehende Anfragen}', + 'sort' => 1, + 'default_filter' => true, + 'filter' => ' + { + "name": "Ausstehende Anfragen", + "columns": [ + {"name": "uid"}, + {"name": "name"}, + {"name": "studiengang"}, + {"name": "orgform"}, + {"name": "oezuordnung"}, + {"name": "status_translated"}, + {"name": "topic"}, + {"name": "insertamum_iso"}, + {"name": "semester"} + ], + "filters": [ + { + "name": "status_translated", + "option": "", + "operation": "equal", + "condition": "true" + } + ] + }', + 'oe_kurzbz' => null, + ), + array( + 'app' => 'core', + 'dataset_name' => 'profileupdate', + 'filter_kurzbz' => 'ProfilupdateAlle', + 'description' => '{Alle Anfragen}', + 'sort' => 1, + 'default_filter' => false, + 'filter' => ' + { + "name": "Alle Anfragen", + "columns": [ + {"name": "uid"}, + {"name": "name"}, + {"name": "studiengang"}, + {"name": "orgform"}, + {"name": "oezuordnung"}, + {"name": "status_translated"}, + {"name": "topic"}, + {"name": "insertamum_iso"}, + {"name": "semester"} + ], + "filters": [] + }', + 'oe_kurzbz' => null, + ), ); From 9a8fbabbe46f0519cecae6d6798bd8f7ee12d234 Mon Sep 17 00:00:00 2001 From: ma0068 Date: Wed, 22 Oct 2025 14:25:43 +0200 Subject: [PATCH 16/58] move dropdown profileUpdateStates to FilterComponent, delete not needed code --- .../components/filters/ProfileUpdate.php | 51 ------ .../Cis/ProfilUpdate/ProfilUpdateView.js | 146 +++++------------- system/filtersupdate.php | 58 ------- system/phrasesupdate.php | 39 +++++ 4 files changed, 74 insertions(+), 220 deletions(-) delete mode 100644 application/components/filters/ProfileUpdate.php diff --git a/application/components/filters/ProfileUpdate.php b/application/components/filters/ProfileUpdate.php deleted file mode 100644 index 1a53e5145..000000000 --- a/application/components/filters/ProfileUpdate.php +++ /dev/null @@ -1,51 +0,0 @@ - 'core', - 'datasetName' => 'profileupdate', - 'query' => ' - SELECT - profil_update_id, - tbl_profil_update.uid, - (tbl_person.vorname || \' \' || tbl_person.nachname) AS name , - topic, - requested_change, - tbl_profil_update.updateamum, - tbl_profil_update.updatevon, - tbl_profil_update.insertamum, - tbl_profil_update.insertvon, - status, - public.tbl_profil_update_status.bezeichnung_mehrsprachig[(" . $lang . ")] as status_translated, - status_timestamp, - status_message, - attachment_id, - UPPER(public.tbl_studiengang.typ || public.tbl_studiengang.kurzbz) AS studiengang, - COALESCE(of.orgform_kurzbz, public.tbl_studiengang.orgform_kurzbz) AS orgform, - NULL as oezuordnung, - tbl_student.semester - FROM public.tbl_profil_update - JOIN public.tbl_profil_update_status ON public.tbl_profil_update_status.status_kurzbz = public.tbl_profil_update.status - JOIN public.tbl_student ON public.tbl_student.student_uid=public.tbl_profil_update.uid - JOIN public.tbl_benutzer ON public.tbl_benutzer.uid = public.tbl_student.student_uid - JOIN public.tbl_person ON public.tbl_benutzer.person_id=public.tbl_person.person_id - JOIN public.tbl_studiengang ON public.tbl_studiengang.studiengang_kz=public.tbl_student.studiengang_kz - LEFT JOIN ( - select - pss.prestudent_id, COALESCE(sp.orgform_kurzbz, pss.orgform_kurzbz) as orgform_kurzbz - from ( - select - prestudent_id, max(insertamum) as insertamum - from - public.tbl_prestudentstatus - where - datum <= NOW() - group by - prestudent_id - ) mpss - join - public.tbl_prestudentstatus pss on pss.prestudent_id = mpss.prestudent_id and pss.insertamum = mpss.insertamum - left join - lehre.tbl_studienplan sp on pss.studienplan_id = sp.studienplan_id - ) of ON of.prestudent_id = public.tbl_student.prestudent_id - ', - 'requiredPermissions' => 'student/stammdaten' -); \ No newline at end of file diff --git a/public/js/components/Cis/ProfilUpdate/ProfilUpdateView.js b/public/js/components/Cis/ProfilUpdate/ProfilUpdateView.js index bec825495..222290e98 100644 --- a/public/js/components/Cis/ProfilUpdate/ProfilUpdateView.js +++ b/public/js/components/Cis/ProfilUpdate/ProfilUpdateView.js @@ -212,7 +212,13 @@ export default { headerFilterParams: {valuesLookup:true, listOnEmpty:true, autocomplete:true, sort:"asc"}, //responsive:0, }, - { + { + title: this.$p.t("profil", "sem_short") + ' (' + this.$p.t("profil", "studentIn") + ')', + field: "semester", + headerFilter: "list", + headerFilterParams: {valuesLookup:true, listOnEmpty:true, autocomplete:true, sort:"asc"} + }, + { title: this.$p.t("profil", "orgform_short") + ' (' + this.$p.t("profil", "studentIn") + ')', field: "orgform", minWidth: 50, @@ -221,8 +227,8 @@ export default { headerFilterParams: {valuesLookup:true, listOnEmpty:true, autocomplete:true, sort:"asc"}, //responsive:0, }, - { - title: this.$p.t("lehre", "organisationseinheit") + ' (' + this.$p.t("profil", "mitarbeiterIn") + ')', + { + title: this.$p.t("profil", "orgeinheit_short") + ' (' + this.$p.t("profil", "mitarbeiterIn") + ')', field: "oezuordnung", minWidth: 200, resizable: true, @@ -230,7 +236,7 @@ export default { headerFilterParams: {valuesLookup:true, listOnEmpty:true, autocomplete:true, sort:"asc"}, //responsive:0, }, - { + { title: this.$p.t("profilUpdate", "Topic"), field: "topic", resizable: true, @@ -239,7 +245,7 @@ export default { headerFilterParams: {valuesLookup:true, listOnEmpty:true, autocomplete:true, sort:"asc"}, //responsive:0, }, - { + { title: this.$p.t("profilUpdate", "insertamum"), field: "insertamum_iso", resizable: true, @@ -250,7 +256,7 @@ export default { formatterParams: this.datetimeFormatterParams(), //responsive:0, }, - { + { title: this.$p.t("profilUpdate", "Status"), field: "status_translated", hozAlign: "center", @@ -272,17 +278,10 @@ export default { } return `
${cell.getValue()}
`; }, - resizable: true, minWidth: 200, //responsive:0, }, - { - title: this.$p.t("lehre", "ausbildungssemester"), - field: "semester", - headerFilter: "list", - headerFilterParams: {valuesLookup:true, listOnEmpty:true, autocomplete:true, sort:"asc"} - }, { title: this.$p.t("profilUpdate", "actions"), headerSort: false, @@ -314,7 +313,6 @@ export default { ], }; } - }, methods: { denyProfilUpdate: function (data) { @@ -356,7 +354,6 @@ export default { this.showModal = false; this.modalData = null; }, - showAcceptDenyModal(value) { this.modalData = value; if (!this.modalData) { @@ -369,7 +366,6 @@ export default { this.$refs.AcceptDenyModal.show(); }); }, - updateData: function (event) { this.$refs.UpdatesTable.tabulator.setData(); //? store the selected view in the session storage of the browser @@ -417,105 +413,33 @@ export default { if (sessionStorage.getItem("filter")) { this.filter = sessionStorage.getItem("filter"); } - - /* -
-
{{$p.t('ui','anzeigen')}}
- - - -
- - - :title="$p.t('profilUpdate','profilUpdateRequests')" - -

{{$p.t('profilUpdate', 'profilUpdateRequests')}}

- - -
-
- -
-
- - - //Version mit filter rechts in eigener zeile - - - -
- -
- -
- - //backendfilter not working: no parameters provided - - - - */ - - - - }, template: /*html*/ `
+ +

{{$p.t('profilUpdate', 'profilUpdateRequests')}}

+ - - -

{{$p.t('profilUpdate', 'profilUpdateRequests')}}

- - - -
- -
- + + + - - - - -
`, +
`, }; diff --git a/system/filtersupdate.php b/system/filtersupdate.php index 2942bcb4e..a4deca527 100644 --- a/system/filtersupdate.php +++ b/system/filtersupdate.php @@ -1558,64 +1558,6 @@ $filters = array( }', 'oe_kurzbz' => null, ), - array( - 'app' => 'core', - 'dataset_name' => 'profileupdate', - 'filter_kurzbz' => 'ProfilupdatePending', - 'description' => '{Ausstehende Anfragen}', - 'sort' => 1, - 'default_filter' => true, - 'filter' => ' - { - "name": "Ausstehende Anfragen", - "columns": [ - {"name": "uid"}, - {"name": "name"}, - {"name": "studiengang"}, - {"name": "orgform"}, - {"name": "oezuordnung"}, - {"name": "status_translated"}, - {"name": "topic"}, - {"name": "insertamum_iso"}, - {"name": "semester"} - ], - "filters": [ - { - "name": "status_translated", - "option": "", - "operation": "equal", - "condition": "true" - } - ] - }', - 'oe_kurzbz' => null, - ), - array( - 'app' => 'core', - 'dataset_name' => 'profileupdate', - 'filter_kurzbz' => 'ProfilupdateAlle', - 'description' => '{Alle Anfragen}', - 'sort' => 1, - 'default_filter' => false, - 'filter' => ' - { - "name": "Alle Anfragen", - "columns": [ - {"name": "uid"}, - {"name": "name"}, - {"name": "studiengang"}, - {"name": "orgform"}, - {"name": "oezuordnung"}, - {"name": "status_translated"}, - {"name": "topic"}, - {"name": "insertamum_iso"}, - {"name": "semester"} - ], - "filters": [] - }', - 'oe_kurzbz' => null, - ), - ); // Loop through the filters array diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php index aace77876..ad8d52f0a 100644 --- a/system/phrasesupdate.php +++ b/system/phrasesupdate.php @@ -28636,6 +28636,45 @@ array( ) ) ), + array( + 'app' => 'core', + 'category' => 'profil', + 'phrase' => 'orgeinheit_short', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'OrgEH', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'org Unit', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), array( + 'app' => 'core', + 'category' => 'profil', + 'phrase' => 'sem_short', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Sem', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'sem', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), //Profil Phrasen ende // LvPlan Phrasen start array( From 43281c6ba2d9e6010ec3e165d2ba7ac5dad15718 Mon Sep 17 00:00:00 2001 From: Cristina Date: Thu, 13 Nov 2025 09:48:54 +0100 Subject: [PATCH 17/58] Removed test buttons from FhcChart basic template --- public/js/components/Chart/FhcChart.js | 6 ------ 1 file changed, 6 deletions(-) diff --git a/public/js/components/Chart/FhcChart.js b/public/js/components/Chart/FhcChart.js index 0733811f1..723ac0159 100644 --- a/public/js/components/Chart/FhcChart.js +++ b/public/js/components/Chart/FhcChart.js @@ -8,12 +8,6 @@ export const FhcChart = { }, template: `
-
- - - - -
From 0a118a1427a8d49f7403e32c12382682ab97cb4f Mon Sep 17 00:00:00 2001 From: Cristina Date: Thu, 13 Nov 2025 10:50:36 +0100 Subject: [PATCH 18/58] Clustered LV-Evaluierung phrases after merge --- system/phrasesupdate.php | 529 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 529 insertions(+) diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php index 096d5086c..77015ae18 100644 --- a/system/phrasesupdate.php +++ b/system/phrasesupdate.php @@ -51467,6 +51467,535 @@ I have been informed that I am under no obligation to consent to the transmissio ) ) ), + // LVEVALUIERUNG --------------------------------------------------------------------------------------------------- + array( + 'app' => 'core', + 'category' => 'global', + 'phrase' => 'abschicken', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Abschicken', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Submit', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'global', + 'phrase' => 'zurueckZumStart', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Zurück zum Start', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Back to Start', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'lvevaluierung', + 'category' => 'global', + 'phrase' => 'lvevaluierungAbschicken', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'LV-Evaluierung abschicken', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Submit Course Evaluation', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'lvevaluierung', + 'category' => 'global', + 'phrase' => 'lvevaluierung', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'LV-Evaluierung', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Course Evaluation', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'lvevaluierung', + 'category' => 'fragebogen', + 'phrase' => 'loginTextCodeEingeben', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Bitte geben Sie Ihren Code ein, um die Evaluierung zu starten:', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Please enter your code to start the evaluation:', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'lvevaluierung', + 'category' => 'fragebogen', + 'phrase' => 'loginCodeEingeben', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Evaluierung-Code eingeben', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Enter your Evaluation-Code', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'lvevaluierung', + 'category' => 'fragebogen', + 'phrase' => 'loginTextLvevaluierung', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => ' +
+

Die folgende LV-Evaluierung umfasst

+
+
    +
  • zwei (geschlossene) Pflichtfragen
  • +
  • die Möglichkeit, optional zu einzelnen Bereichen konkreteres Feedback zu geben
  • +
  • zwei optionale Freitextfragen
  • +
+ ', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => ' +
+

The following course evaluation includes

+
+
    +
  • two (closed) mandatory questions
  • +
  • the opportunity to optionally provide more specific feedback on individual areas
  • +
  • two optional free-text questions
  • +
+ ', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'lvevaluierung', + 'category' => 'fragebogen', + 'phrase' => 'loginTextAntwortoptionen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => ' +
+

Die Antwortoptionen umfassen 5 Stufen:

+
+
    +
  • Sehr gut
  • +
  • Gut
  • +
  • Mittel
  • +
  • Schlecht
  • +
  • Sehr schlecht
  • +
+ ', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => ' +
+

The answer options comprise 5 levels:

+
+
    +
  • Excellent
  • +
  • Good
  • +
  • Satisfactory
  • +
  • Poor
  • +
  • Insufficient
  • +
+ ', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'lvevaluierung', + 'category' => 'fragebogen', + 'phrase' => 'evaluierungPeriodeBeendet', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Der Evaluierungszeitraum endete am {date}', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Evaluation period was closed on {date}', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'lvevaluierung', + 'category' => 'fragebogen', + 'phrase' => 'evaluierungPeriodeStartetErst', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Der Evaluierungszeitraum startet erst am {date}', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Evaluation period starts on {date}', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'lvevaluierung', + 'category' => 'fragebogen', + 'phrase' => 'evaluierungEingereicht', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Die Evaluierung wurde am {date} eingereicht', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Evaluation was submitted on {date}', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'lvevaluierung', + 'category' => 'fragebogen', + 'phrase' => 'evaluierungNichtMehrVerfuegbar', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Diese Evaluierung ist nicht mehr verfügbar.', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'This evaluation is no longer available.', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'lvevaluierung', + 'category' => 'fragebogen', + 'phrase' => 'evaluierungNichtVerfuegbar', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Diese Evaluierung ist nicht verfügbar.', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'This evaluation is not available yet.', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'lvevaluierung', + 'category' => 'fragebogen', + 'phrase' => 'logoutTitle', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Danke!
Was passiert nun mit Ihrem Feedback?', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Thank you!
What happens to your feedback now?', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'lvevaluierung', + 'category' => 'fragebogen', + 'phrase' => 'logoutText', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => ' +

Danke, dass Sie sich Zeit für das Feedback genommen haben! Ihre ehrliche und konstruktive Rückmeldung ist essenziell, damit Ihre Lehrenden und Ihre Studiengangsleitung die Lehrveranstaltung immer weiter verbessern und anpassen können!

+

Und was passiert jetzt mit Ihrem Feedback? Die Studiengangsleitung wird die Ergebnisse & Maßnahmen zusammen mit Ihrer Jahrgangsvertretung besprechen. So tragen Sie aktiv dazu bei, die Lehrveranstaltung für zukünftige Semester noch spannender & lehrreicher zu machen!

+

Gemeinsam für mehr Qualität in der Lehre!

+ ', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => ' +

Thank you for taking the time to provide feedback! Your honest and constructive input is essential for your lecturers and degree program director to continuously improve and adapt the course.

+

What happens with your feedback? The degree program director will discuss the results and potential measures together with your academic year representatives. You have thus actively contributed to making the course even more engaging and educational for future semesters!

+

Working together for higher quality in teaching!

+ ', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'lvevaluierung', + 'category' => 'fragebogen', + 'phrase' => 'evaluierungZeitAbgelaufen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Die Evaluierungszeit ist abgelaufen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'The Evaluation time is over', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'lvevaluierung', + 'category' => 'fragebogen', + 'phrase' => 'evaluierungAntwortenNichtUebermittelt', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Ihre Antworten wurden nicht übermittelt.', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Your responses were not submitted.', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'lvevaluierung', + 'category' => 'fragebogen', + 'phrase' => 'evaluierungCodeExistiertNicht', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Dieser Evaluierungscode exisitiert nicht', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'This evaluation code does not exist', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'lvevaluierung', + 'category' => 'fragebogen', + 'phrase' => 'evaluierungNichtAktiv', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Die Evaluierung ist nicht aktiv', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Evaluation is not active', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'lvevaluierung', + 'category' => 'fragebogen', + 'phrase' => 'zeitLaeuftAb', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Zeit läuft bald ab – zum Speichern bitte ‚Abschicken‘ klicken', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Time is running out — please click ‘Submit’ to save your answers', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'lvevaluierung', + 'category' => 'fragebogen', + 'phrase' => 'spracheAuswaehlen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Sprache auswählen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Select language', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'lvevaluierung', + 'category' => 'fragebogen', + 'phrase' => 'fhtwLogo', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'FH Technikum Wien Logo', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'UAS Technikum Wien Logo', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'lvevaluierung', + 'category' => 'fragebogen', + 'phrase' => 'evaluierungscodeEingeben', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Evaluierungscode eingeben', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Enter Evaluation code', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'lvevaluierung', + 'category' => 'fragebogen', + 'phrase' => 'fragebogen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Fragebogen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Questionnaire', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), // ### DOKUMENTE ERSTELLEN PHRASEN END ### ); From 993dff3351bda12dfaf75268a228f6c8005111bb Mon Sep 17 00:00:00 2001 From: Cristina Date: Thu, 13 Nov 2025 11:11:37 +0100 Subject: [PATCH 19/58] Gendered phrase lektorInnen (FHTW style) --- system/phrasesupdate.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php index 77015ae18..ac3cba8f4 100644 --- a/system/phrasesupdate.php +++ b/system/phrasesupdate.php @@ -13357,13 +13357,13 @@ Any unusual occurrences 'phrases' => array( array( 'sprache' => 'German', - 'text' => 'LektorInnen', + 'text' => 'Lehrende', 'description' => '', 'insertvon' => 'system' ), array( 'sprache' => 'English', - 'text' => 'Lectors', + 'text' => 'Lecturers', 'description' => '', 'insertvon' => 'system' ) From d76e84639fc6ddaeabc0e45190abd7d459fd7787 Mon Sep 17 00:00:00 2001 From: ma0068 Date: Thu, 20 Nov 2025 16:18:55 +0100 Subject: [PATCH 20/58] neue Phrasen bzw. Phrasenupdate zu Abmeldungsgruende Studierendenantrag --- .../Studierendenantrag/Form/AbmeldungStgl.js | 10 +- system/phrasesupdate.php | 176 +++++++++++++++++- 2 files changed, 177 insertions(+), 9 deletions(-) diff --git a/public/js/components/Studierendenantrag/Form/AbmeldungStgl.js b/public/js/components/Studierendenantrag/Form/AbmeldungStgl.js index 81106e64c..332c2a16a 100644 --- a/public/js/components/Studierendenantrag/Form/AbmeldungStgl.js +++ b/public/js/components/Studierendenantrag/Form/AbmeldungStgl.js @@ -192,7 +192,15 @@ export default { + + + + + + - '.$gebietbezeichnung.' + '.$gebietbezeichnung.' + '; @@ -401,7 +404,7 @@ if (isset($_SESSION['pruefling_id'])) // Link zum Logout echo ' - Logout + Logout '; echo ''; @@ -461,5 +464,22 @@ else ''); } }); + + function loadContent(url) + { + if (parent && typeof parent.loadInContent === 'function') + { + parent.loadInContent(url); + return false; + } + + let frame = parent?.frames?.["content"]; + if (frame) + { + frame.location.href = url; + return false; + } + } + diff --git a/cis/testtool/resetconnection.php b/cis/testtool/resetconnection.php new file mode 100644 index 000000000..200b3d778 --- /dev/null +++ b/cis/testtool/resetconnection.php @@ -0,0 +1,25 @@ +start($_SESSION['prestudent_id'], $_SESSION['reihungstestID']); + $urlSafe = htmlspecialchars($url, ENT_QUOTES); + + + //var_dump($urlSafe); + + header("Location: $urlSafe"); + //echo ""; + $_SESSION['externe_ueberwachung_verified'] = true; + +} \ No newline at end of file diff --git a/cis/testtool/session_init.php b/cis/testtool/session_init.php new file mode 100644 index 000000000..fd7f0b5f3 --- /dev/null +++ b/cis/testtool/session_init.php @@ -0,0 +1,11 @@ + diff --git a/include/externe_ueberwachung.class.php b/include/externe_ueberwachung.class.php new file mode 100644 index 000000000..0e2e06ec9 --- /dev/null +++ b/include/externe_ueberwachung.class.php @@ -0,0 +1,203 @@ +getSessionByPrestudent($prestudent_id); + return $this->getSessionStatus($session_id); + } + public function start($prestudent_id, $reihungstest_id) + { + $session_id = $this->getSessionByPrestudent($prestudent_id); + + if (!$session_id) + { + $session_id = $this->createSession($prestudent_id); + } + else + { + $status = $this->getSessionStatus($session_id); + + if (in_array($status, array('late_to_start', 'finished'))) + { + $session_id = $this->createSession($prestudent_id); + } + } + + $payload = $this->getPayload($session_id, $prestudent_id, $reihungstest_id); + return $this->getStartUrl($payload); + } + + + private function createSession($prestudent_id) + { + if (is_null($prestudent_id)) + { + $this->errormsg = 'Falsche Parameterübergabe'; + return false; + } + + $uuid = $this->genereateUUID(); + + $qry = "INSERT INTO testtool.tbl_externe_ueberwachung (prestudent_id, session_id, insertvon) + VALUES (". + $this->db_add_param($prestudent_id).",". + $this->db_add_param($uuid).",". + $this->db_add_param(get_uid()).")"; + + if($this->db_query($qry)) + { + return $uuid; + } + else + { + $this->errormsg = 'Fehler beim Speichern der Antwort'; + return false; + } + } + public function getSessionByPrestudent($prestudent_id) + { + if (is_null($prestudent_id)) + { + $this->errormsg = 'Falsche Parameterübergabe'; + return false; + } + + $qry = "SELECT session_id + FROM testtool.tbl_externe_ueberwachung + ORDER BY insertamum DESC + LIMIT 1"; + + if($result = $this->db_query($qry)) + { + if ($row = $this->db_fetch_object($result)) + { + return $row->session_id; + } + else + { + $this->errormsg = 'Daten konnten nicht geladen werden'; + return false; + } + } + else + { + $this->errormsg = 'Fehler bei einer Abfrage'; + return false; + } + } + + public function getSessionStatus($session_id) + { + $payload = $this->getSessionPayload($session_id); + $jwt = $this->createToken($payload); + + $url = $this->getSessionUrl($session_id); + + $ch = curl_init($url); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_HTTPHEADER, [ + "Authorization: JWT {$jwt}", + "Content-Type: application/json", + ]); + curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET'); + + $response = curl_exec($ch); + $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); + + curl_close($ch); + + $data = json_decode($response, true); + return isset($data['status']) ? $data['status'] : false; + } + + private function getSessionPayload($session_id) + { + return [ + "session_id" => $session_id, + "iat" => time(), + "exp" => time() + 120, + ]; + } + + private function getPayload($session_id, $prestudent_id, $reihungstest_id) + { + $prestudent = new prestudent($prestudent_id); + $person = new Person($prestudent->person_id); + + $reihungstest = new Reihungstest($reihungstest_id); + + $datetime = new DateTime(); + $today = $datetime->format('Y-m-d'); + + $payload = [ + "userId"=> $prestudent_id, + "lastName"=> $person->nachname, + "firstName"=> $person->vorname, + "language"=> $person->sprache, + "accountName"=> "technikum_wien", + "accountId"=> "technikum_wien", + "examId" => !is_null(trim($reihungstest->anmerkung)) ? $reihungstest->anmerkung : ($today . " RT Test"), + "examName" => !is_null(trim($reihungstest->anmerkung)) ? $reihungstest->anmerkung : ($today . " RT Test"), + "allowMultipleDisplays" => true, + "allowMakingRoomScanSecondCamera" => false, + "duration"=> 120, + "schedule"=> false, + "trial"=> true, + "proctoring"=> "offline", + "identification"=> "skip", + "startDate"=> "2018-03-27T00:00:00Z", //TODO anpassen + "endDate"=> "2027-03-30T12:55:00Z", // TODO anpassen + "sessionId"=> $session_id, + "sessionUrl"=> "https://demo.dev.technikum-wien.at/cis/testtool/index.php" + ]; + return $payload; + } + + private function getSessionUrl($session_id) + { + return EXTERNE_UEBERWACHUNG_PROTOCOL_URL . "/api/v2/integration/simple/". EXTERNE_UEBERWACHUNG_INTEGRATION_NAME . "/sessions/". urlencode($session_id) ."/status/"; + } + + private function getStartUrl($payload) + { + $token = $this->createToken($payload); + $query = http_build_query(['token' => $token]); + + return EXTERNE_UEBERWACHUNG_PROTOCOL_URL . '/integration/simple/'. EXTERNE_UEBERWACHUNG_INTEGRATION_NAME .'/start?' . $query; + } + + private function createToken($payload) + { + return JWT::encode($payload, EXTERNE_UEBERWACHUNG_SECRET_KEY, 'HS256'); + } + + private function genereateUUID() + { + $data = openssl_random_pseudo_bytes(16); + + $data[6] = chr(ord($data[6]) & 0x0f | 0x40); + $data[8] = chr(ord($data[8]) & 0x3f | 0x80); + + return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4)); + } +} + +?> + + + diff --git a/include/reihungstest.class.php b/include/reihungstest.class.php index df4134ebf..94d064c25 100644 --- a/include/reihungstest.class.php +++ b/include/reihungstest.class.php @@ -63,6 +63,7 @@ class reihungstest extends basis_db public $zugangs_ueberpruefung = false; //boolean public $zugangscode; //smallint + public $externe_ueberwachung = false; //boolean /** @@ -119,6 +120,7 @@ class reihungstest extends basis_db $this->aufnahmegruppe_kurzbz = $row->aufnahmegruppe_kurzbz; $this->zugangs_ueberpruefung = $this->db_parse_bool($row->zugangs_ueberpruefung); $this->zugangscode = $row->zugangscode; + $this->externe_ueberwachung = $this->db_parse_bool($row->externe_ueberwachung); return true; } @@ -234,7 +236,7 @@ class reihungstest extends basis_db $qry = 'BEGIN; INSERT INTO public.tbl_reihungstest (studiengang_kz, ort_kurzbz, anmerkung, datum, uhrzeit, insertamum, insertvon, updateamum, updatevon, max_teilnehmer, oeffentlich, freigeschaltet, - studiensemester_kurzbz, stufe, anmeldefrist, aufnahmegruppe_kurzbz, zugangs_ueberpruefung, zugangscode) VALUES('. + studiensemester_kurzbz, stufe, anmeldefrist, aufnahmegruppe_kurzbz, zugangs_ueberpruefung, zugangscode, externe_ueberwachung) VALUES('. $this->db_add_param($this->studiengang_kz, FHC_INTEGER).', '. $this->db_add_param($this->ort_kurzbz).', '. $this->db_add_param($this->anmerkung).', '. @@ -250,7 +252,8 @@ class reihungstest extends basis_db $this->db_add_param($this->anmeldefrist).','. $this->db_add_param($this->aufnahmegruppe_kurzbz). ',' . $this->db_add_param($this->zugangs_ueberpruefung, FHC_BOOLEAN).','. - $this->db_add_param($this->zugangscode) . ');'; + $this->db_add_param($this->zugangscode) . ','. + $this->db_add_param($this->externe_ueberwachung, FHC_BOOLEAN) . ');'; } else { @@ -270,7 +273,8 @@ class reihungstest extends basis_db 'anmeldefrist='.$this->db_add_param($this->anmeldefrist).', '. 'aufnahmegruppe_kurzbz='.$this->db_add_param($this->aufnahmegruppe_kurzbz).', '. 'zugangs_ueberpruefung='.$this->db_add_param($this->zugangs_ueberpruefung, FHC_BOOLEAN).', '. - 'zugangscode='.$this->db_add_param($this->zugangscode).' '. + 'zugangscode='.$this->db_add_param($this->zugangscode).', '. + 'externe_ueberwachung='.$this->db_add_param($this->externe_ueberwachung, FHC_BOOLEAN).' '. 'WHERE reihungstest_id='.$this->db_add_param($this->reihungstest_id, FHC_INTEGER, false).';'; } diff --git a/system/dbupdate_3.4.php b/system/dbupdate_3.4.php index ed50b0df1..708e69717 100644 --- a/system/dbupdate_3.4.php +++ b/system/dbupdate_3.4.php @@ -86,6 +86,7 @@ require_once('dbupdate_3.4/40314_electronic_onboarding_anbindung_ida.php'); require_once('dbupdate_3.4/47972_pruefungsverwaltung_ects_angabe.php'); require_once('dbupdate_3.4/67490_studstatus_suche_abort_controller_haengt.php'); require_once('dbupdate_3.4/68744_StV_settings.php'); +require_once('dbupdate_3.4/62889_reihungstest_ueberwachung_mit_constructor.php'); // *** Pruefung und hinzufuegen der neuen Attribute und Tabellen echo '

Pruefe Tabellen und Attribute!

'; @@ -358,7 +359,7 @@ $tabellen=array( "public.tbl_profil_update_status" => array("status_kurzbz","beschreibung","bezeichnung_mehrsprachig"), "public.tbl_profil_update_topic" => array("topic_kurzbz","beschreibung","bezeichnung_mehrsprachig"), "public.tbl_raumtyp" => array("raumtyp_kurzbz","beschreibung","kosten","aktiv"), - "public.tbl_reihungstest" => array("reihungstest_id","studiengang_kz","ort_kurzbz","anmerkung","datum","uhrzeit","updateamum","updatevon","insertamum","insertvon","ext_id","freigeschaltet","max_teilnehmer","oeffentlich","studiensemester_kurzbz","aufnahmegruppe_kurzbz","stufe","anmeldefrist","zugangs_ueberpruefung","zugangscode"), + "public.tbl_reihungstest" => array("reihungstest_id","studiengang_kz","ort_kurzbz","anmerkung","datum","uhrzeit","updateamum","updatevon","insertamum","insertvon","ext_id","freigeschaltet","max_teilnehmer","oeffentlich","studiensemester_kurzbz","aufnahmegruppe_kurzbz","stufe","anmeldefrist","zugangs_ueberpruefung","zugangscode", "externe_ueberwachung"), "public.tbl_rueckstellung" => array("rueckstellung_id","person_id","status_kurzbz","datum_bis","insertamum","insertvon"), "public.tbl_rueckstellung_status" => array("status_kurzbz", "bezeichnung_mehrsprachig", "sort", "aktiv"), "public.tbl_rt_ort" => array("rt_id","ort_kurzbz","uid"), diff --git a/system/dbupdate_3.4/62889_reihungstest_ueberwachung_mit_constructor.php b/system/dbupdate_3.4/62889_reihungstest_ueberwachung_mit_constructor.php new file mode 100644 index 000000000..7f306e3d9 --- /dev/null +++ b/system/dbupdate_3.4/62889_reihungstest_ueberwachung_mit_constructor.php @@ -0,0 +1,42 @@ +db_query("SELECT externe_ueberwachung FROM public.tbl_reihungstest LIMIT 1")) +{ + $qry = "ALTER TABLE public.tbl_reihungstest ADD COLUMN externe_ueberwachung boolean NOT NULL DEFAULT false;"; + + if(!$db->db_query($qry)) + echo 'public.tbl_reihungstest: '.$db->db_last_error().'
'; + else + echo '
public.tbl_reihungstest: Spalte externe_ueberwachung hinzugefuegt'; +} + +if(!$result = @$db->db_query("SELECT 1 FROM testtool.tbl_externe_ueberwachung LIMIT 1")) +{ + $qry = "CREATE TABLE testtool.tbl_externe_ueberwachung ( + externe_ueberwachung_id INTEGER NOT NULL, + prestudent_id INTEGER NOT NULL, + session_id UUID NOT NULL, + insertamum TIMESTAMP DEFAULT NOW(), + insertvon VARCHAR(32) NOT NULL, + CONSTRAINT tbl_externe_ueberwachung_pk PRIMARY KEY(externe_ueberwachung_id) + ); + CREATE SEQUENCE testtool.tbl_externe_ueberwachungg_id_seq + INCREMENT BY 1 + NO MAXVALUE + NO MINVALUE + CACHE 1; + ALTER TABLE testtool.tbl_externe_ueberwachung ALTER COLUMN externe_ueberwachung_id SET DEFAULT nextval('testtool.tbl_externe_ueberwachungg_id_seq'); + ALTER TABLE testtool.tbl_externe_ueberwachung ADD CONSTRAINT fk_prestudent_externe_ueberwachung FOREIGN KEY (prestudent_id) REFERENCES public.tbl_prestudent (prestudent_id) ON DELETE RESTRICT ON UPDATE CASCADE; + ALTER TABLE testtool.tbl_externe_ueberwachung ADD CONSTRAINT unique_externe_ueberwachung_session_id UNIQUE (session_id); + GRANT SELECT, INSERT ON testtool.tbl_externe_ueberwachung TO vilesci; + GRANT SELECT, INSERT ON testtool.tbl_externe_ueberwachung TO web; + GRANT SELECT, UPDATE ON testtool.tbl_externe_ueberwachungg_id_seq TO vilesci; + GRANT SELECT, UPDATE ON testtool.tbl_externe_ueberwachungg_id_seq TO web;"; + + if(!$db->db_query($qry)) + echo 'testtool.tbl_externe_ueberwachung: '.$db->db_last_error().'
'; + else + echo '
testtool.tbl_externe_ueberwachung: table created'; +} diff --git a/vilesci/stammdaten/reihungstestverwaltung.php b/vilesci/stammdaten/reihungstestverwaltung.php index 07e88183c..babbc3ce4 100644 --- a/vilesci/stammdaten/reihungstestverwaltung.php +++ b/vilesci/stammdaten/reihungstestverwaltung.php @@ -1458,6 +1458,7 @@ if(isset($_POST['speichern']) || isset($_POST['kopieren'])) $reihungstest->anmeldefrist = $datum_obj->formatDatum($_POST['anmeldefrist']); $reihungstest->zugangs_ueberpruefung = false; $reihungstest->zugangscode = null; + $reihungstest->externe_ueberwachung = false; } else { @@ -1474,6 +1475,7 @@ if(isset($_POST['speichern']) || isset($_POST['kopieren'])) $reihungstest->updatevon = $user; $reihungstest->zugangs_ueberpruefung = isset($_POST['zugangs_ueberpruefung']); $reihungstest->zugangscode = ($_POST['zugangcode'] === '' ? null : $_POST['zugangcode']); + $reihungstest->externe_ueberwachung = isset($_POST['externe_ueberwachung']); } $reihungstest->studiengang_kz = $_POST['studiengang_kz']; //$reihungstest->ort_kurzbz = $_POST['ort_kurzbz']; @@ -2571,6 +2573,12 @@ $studienplaene_list = implode(',', array_keys($studienplaene_arr)); (Verpflichtend, wenn die Zugangsüberprüfung aktiviert ist) + + Externe Überwachnung + + externe_ueberwachung ? 'checked="checked"' : '' ?>> + +   From d8e57d43f901a5a7307bdafb3cd5af6c080f8629 Mon Sep 17 00:00:00 2001 From: ma0048 Date: Tue, 2 Dec 2025 13:53:38 +0100 Subject: [PATCH 23/58] session url in die config verschoben --- config/cis.config-default.inc.php | 1 + include/externe_ueberwachung.class.php | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/config/cis.config-default.inc.php b/config/cis.config-default.inc.php index b6607ca4a..81f09f697 100644 --- a/config/cis.config-default.inc.php +++ b/config/cis.config-default.inc.php @@ -306,5 +306,6 @@ define('CIS_REDIRECT_TO_CIS4', false); define('EXTERNE_UEBERWACHUNG_PROTOCOL_URL', 'https://example.com'); define('EXTERNE_UEBERWACHUNG_SECRET_KEY', null); define('EXTERNE_UEBERWACHUNG_INTEGRATION_NAME', 'example'); +define('EXTERNE_UEBERWACHUNG_SESSION_URL', 'https://example.com'); ?> diff --git a/include/externe_ueberwachung.class.php b/include/externe_ueberwachung.class.php index 0e2e06ec9..8adbee8a2 100644 --- a/include/externe_ueberwachung.class.php +++ b/include/externe_ueberwachung.class.php @@ -163,7 +163,7 @@ class externeUeberwachung extends basis_db "startDate"=> "2018-03-27T00:00:00Z", //TODO anpassen "endDate"=> "2027-03-30T12:55:00Z", // TODO anpassen "sessionId"=> $session_id, - "sessionUrl"=> "https://demo.dev.technikum-wien.at/cis/testtool/index.php" + "sessionUrl"=> EXTERNE_UEBERWACHUNG_SESSION_URL ]; return $payload; } From 8bab5285e9a2f083231dfb04cd5af9a2901a3ba0 Mon Sep 17 00:00:00 2001 From: ma0048 Date: Wed, 10 Dec 2025 08:08:46 +0100 Subject: [PATCH 24/58] testversuch ueber config abfrage gefixed menu wird nicht mehr angezeigt --- cis/testtool/externeueberwachung.js | 3 ++- cis/testtool/menu.php | 8 ++++++-- cis/testtool/resetconnection.php | 6 ------ config/cis.config-default.inc.php | 1 + include/externe_ueberwachung.class.php | 3 ++- 5 files changed, 11 insertions(+), 10 deletions(-) diff --git a/cis/testtool/externeueberwachung.js b/cis/testtool/externeueberwachung.js index a40a93e05..d15404dec 100644 --- a/cis/testtool/externeueberwachung.js +++ b/cis/testtool/externeueberwachung.js @@ -29,7 +29,8 @@ if (!proctoringOK) { console.warn("Constructor nicht aktiv!") - //window.location.href='resetconnection.php'; + //TODO einkommentieren + //top.location.href='resetconnection.php'; } }, 1000); })(); \ No newline at end of file diff --git a/cis/testtool/menu.php b/cis/testtool/menu.php index 2c027c886..82623c1fd 100644 --- a/cis/testtool/menu.php +++ b/cis/testtool/menu.php @@ -61,8 +61,12 @@ $p = new phrasen($sprache_user); db_add_param($_SESSION['studiengang_kz'])." LIMIT 1"; diff --git a/cis/testtool/resetconnection.php b/cis/testtool/resetconnection.php index 200b3d778..39f50dfc5 100644 --- a/cis/testtool/resetconnection.php +++ b/cis/testtool/resetconnection.php @@ -14,12 +14,6 @@ if (isset($_SESSION['externe_ueberwachung']) && $_SESSION['externe_ueberwachung' $ueberwachung = new externeUeberwachung(); $url = $ueberwachung->start($_SESSION['prestudent_id'], $_SESSION['reihungstestID']); $urlSafe = htmlspecialchars($url, ENT_QUOTES); - - - //var_dump($urlSafe); - header("Location: $urlSafe"); - //echo ""; $_SESSION['externe_ueberwachung_verified'] = true; - } \ No newline at end of file diff --git a/config/cis.config-default.inc.php b/config/cis.config-default.inc.php index 81f09f697..0bef3a523 100644 --- a/config/cis.config-default.inc.php +++ b/config/cis.config-default.inc.php @@ -307,5 +307,6 @@ define('EXTERNE_UEBERWACHUNG_PROTOCOL_URL', 'https://example.com'); define('EXTERNE_UEBERWACHUNG_SECRET_KEY', null); define('EXTERNE_UEBERWACHUNG_INTEGRATION_NAME', 'example'); define('EXTERNE_UEBERWACHUNG_SESSION_URL', 'https://example.com'); +define('EXTERNE_UEBERWACHUNG_TRIAL_TEST', false); ?> diff --git a/include/externe_ueberwachung.class.php b/include/externe_ueberwachung.class.php index 8adbee8a2..db6f5ae6a 100644 --- a/include/externe_ueberwachung.class.php +++ b/include/externe_ueberwachung.class.php @@ -79,6 +79,7 @@ class externeUeberwachung extends basis_db $qry = "SELECT session_id FROM testtool.tbl_externe_ueberwachung + WHERE prestudent_id = ".$this->db_add_param($prestudent_id, FHC_INTEGER) . " ORDER BY insertamum DESC LIMIT 1"; @@ -157,7 +158,7 @@ class externeUeberwachung extends basis_db "allowMakingRoomScanSecondCamera" => false, "duration"=> 120, "schedule"=> false, - "trial"=> true, + "trial"=> EXTERNE_UEBERWACHUNG_TRIAL_TEST, "proctoring"=> "offline", "identification"=> "skip", "startDate"=> "2018-03-27T00:00:00Z", //TODO anpassen From 48512f46ab5ea3adefe758396ca0ea1eafd1849a Mon Sep 17 00:00:00 2001 From: ma0048 Date: Wed, 10 Dec 2025 15:15:23 +0100 Subject: [PATCH 25/58] exam name geandert --- include/externe_ueberwachung.class.php | 34 +++++++++++++------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/include/externe_ueberwachung.class.php b/include/externe_ueberwachung.class.php index db6f5ae6a..32911b9c5 100644 --- a/include/externe_ueberwachung.class.php +++ b/include/externe_ueberwachung.class.php @@ -146,25 +146,25 @@ class externeUeberwachung extends basis_db $today = $datetime->format('Y-m-d'); $payload = [ - "userId"=> $prestudent_id, - "lastName"=> $person->nachname, - "firstName"=> $person->vorname, - "language"=> $person->sprache, - "accountName"=> "technikum_wien", - "accountId"=> "technikum_wien", - "examId" => !is_null(trim($reihungstest->anmerkung)) ? $reihungstest->anmerkung : ($today . " RT Test"), - "examName" => !is_null(trim($reihungstest->anmerkung)) ? $reihungstest->anmerkung : ($today . " RT Test"), + "userId" => $prestudent_id, + "lastName" => $person->nachname, + "firstName" => $person->vorname, + "language" => $person->sprache, + "accountName" => "technikum_wien", + "accountId" => "technikum_wien", + "examId" => $reihungstest_id . '_' . $today, + "examName" => !is_null(trim($reihungstest->anmerkung)) ? ($reihungstest->anmerkung . '_' . $today) : ($reihungstest_id . '_' . $today), "allowMultipleDisplays" => true, "allowMakingRoomScanSecondCamera" => false, - "duration"=> 120, - "schedule"=> false, - "trial"=> EXTERNE_UEBERWACHUNG_TRIAL_TEST, - "proctoring"=> "offline", - "identification"=> "skip", - "startDate"=> "2018-03-27T00:00:00Z", //TODO anpassen - "endDate"=> "2027-03-30T12:55:00Z", // TODO anpassen - "sessionId"=> $session_id, - "sessionUrl"=> EXTERNE_UEBERWACHUNG_SESSION_URL + "duration" => 600, + "schedule" => false, + "trial" => EXTERNE_UEBERWACHUNG_TRIAL_TEST, + "proctoring" => "offline", + "identification" => "skip", + "startDate" => "2018-03-27T00:00:00Z", //TODO anpassen + "endDate" => "2027-03-30T12:55:00Z", // TODO anpassen + "sessionId" => $session_id, + "sessionUrl" => EXTERNE_UEBERWACHUNG_SESSION_URL ]; return $payload; } From 53cf777970b95ac36d4d78e319185ffac84782a1 Mon Sep 17 00:00:00 2001 From: ma0048 Date: Wed, 10 Dec 2025 15:18:15 +0100 Subject: [PATCH 26/58] check im menu entfernt --- cis/testtool/menu.php | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/cis/testtool/menu.php b/cis/testtool/menu.php index 7c8b12b9d..7cb6f138d 100644 --- a/cis/testtool/menu.php +++ b/cis/testtool/menu.php @@ -425,28 +425,6 @@ else e.preventDefault(); }); }); - // Get users Browser - var ua = navigator.userAgent; - - // If Browser is any other than Mozilla Firefox and the test includes any MathML, - // show message to use Mozilla Firefox - if ((ua.indexOf("Firefox") > -1) == false) - { - let hasMathML = ""; - let userLang = ""; - if (hasMathML == true) - { - if (userLang == 'German') - { - alert('BITTE VERWENDEN SIE DEN MOZILLA FIREFOX BROWSER!\n(Manche Prüfungsfragen werden sonst nicht korrekt dargestellt.)'); - } - else if(userLang == 'English') - { - alert('PLEASE USE MOZILLA FIREFOX BROWSER!\n(Ohterwise some exam items will not be displayed correctly.)'); - } - } - } - // Error massage if check_gebiet function returns false $(function() { var invalid_gebiete = ""; From df639c8b0708640751026b2f5ca5f7cc63957089 Mon Sep 17 00:00:00 2001 From: ma0048 Date: Thu, 11 Dec 2025 08:28:01 +0100 Subject: [PATCH 27/58] sprache mitschicken --- cis/testtool/resetconnection.php | 2 +- include/externe_ueberwachung.class.php | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/cis/testtool/resetconnection.php b/cis/testtool/resetconnection.php index 39f50dfc5..e0141ae0b 100644 --- a/cis/testtool/resetconnection.php +++ b/cis/testtool/resetconnection.php @@ -12,7 +12,7 @@ if (!$db = new basis_db()) if (isset($_SESSION['externe_ueberwachung']) && $_SESSION['externe_ueberwachung'] === true) { $ueberwachung = new externeUeberwachung(); - $url = $ueberwachung->start($_SESSION['prestudent_id'], $_SESSION['reihungstestID']); + $url = $ueberwachung->start($_SESSION['prestudent_id'], $_SESSION['reihungstestID'], $_SESSION['sprache']); $urlSafe = htmlspecialchars($url, ENT_QUOTES); header("Location: $urlSafe"); $_SESSION['externe_ueberwachung_verified'] = true; diff --git a/include/externe_ueberwachung.class.php b/include/externe_ueberwachung.class.php index 32911b9c5..5e5bafded 100644 --- a/include/externe_ueberwachung.class.php +++ b/include/externe_ueberwachung.class.php @@ -20,7 +20,7 @@ class externeUeberwachung extends basis_db $session_id = $this->getSessionByPrestudent($prestudent_id); return $this->getSessionStatus($session_id); } - public function start($prestudent_id, $reihungstest_id) + public function start($prestudent_id, $reihungstest_id, $sprache) { $session_id = $this->getSessionByPrestudent($prestudent_id); @@ -38,7 +38,7 @@ class externeUeberwachung extends basis_db } } - $payload = $this->getPayload($session_id, $prestudent_id, $reihungstest_id); + $payload = $this->getPayload($session_id, $prestudent_id, $reihungstest_id, $sprache); return $this->getStartUrl($payload); } @@ -135,7 +135,7 @@ class externeUeberwachung extends basis_db ]; } - private function getPayload($session_id, $prestudent_id, $reihungstest_id) + private function getPayload($session_id, $prestudent_id, $reihungstest_id, $sprache) { $prestudent = new prestudent($prestudent_id); $person = new Person($prestudent->person_id); @@ -149,7 +149,7 @@ class externeUeberwachung extends basis_db "userId" => $prestudent_id, "lastName" => $person->nachname, "firstName" => $person->vorname, - "language" => $person->sprache, + "language" => $sprache === 'German' ? 'de' : 'en', "accountName" => "technikum_wien", "accountId" => "technikum_wien", "examId" => $reihungstest_id . '_' . $today, From 8280ec42b0900fbb8493fa3a38403c54a8fd8909 Mon Sep 17 00:00:00 2001 From: Cristina Date: Thu, 11 Dec 2025 16:07:07 +0100 Subject: [PATCH 28/58] Added method getEntitledStgs to Studiengang_model.php MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Get active Studiengänge with Kuerzel by given Studiengang-Kennzahlen. Helpful to easily get Studiengänge the user is entitled for. --- .../models/organisation/Studiengang_model.php | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/application/models/organisation/Studiengang_model.php b/application/models/organisation/Studiengang_model.php index 02f972690..98d650e0c 100644 --- a/application/models/organisation/Studiengang_model.php +++ b/application/models/organisation/Studiengang_model.php @@ -801,4 +801,38 @@ class Studiengang_model extends DB_Model return $this->execReadOnlyQuery($qry, array($studiengang_kz, $orgform_kurzbz, $studiensemester_kurzbz)); } + + /** + * Get active Studiengänge with Kuerzel by given Studiengang-Kennzahlen. + * Helpful to easily get Studiengänge the user is entitled for. + * + * @param $studiengang_kz_arr + * @param $studiensemester_kurzbz + * @return array|stdClass|null + */ + public function getEntitledStgs($studiengang_kz_arr, $studiensemester_kurzbz) + { + if (is_numeric($studiengang_kz_arr)) + { + $studiengang_kz_arr = [$studiengang_kz_arr]; + } + + $qry = ' + SELECT + DISTINCT stg.*, UPPER(typ::varchar(1) || kurzbz) AS kuerzel + FROM + public.tbl_studiengang stg + JOIN lehre.tbl_studienordnung sto USING(studiengang_kz) + JOIN lehre.tbl_studienplan stpl USING(studienordnung_id) + JOIN lehre.tbl_studienplan_semester stplsem USING(studienplan_id) + WHERE + stg.studiengang_kz IN ? + AND stg.aktiv = TRUE + AND stplsem.studiensemester_kurzbz = ? + ORDER BY + stg.kurzbzlang + '; + + return $this->execQuery($qry, [$studiengang_kz_arr, $studiensemester_kurzbz]); + } } From 431ae8ddac5bf53b34bc1098ee1c3d9f5ff843b1 Mon Sep 17 00:00:00 2001 From: ma0068 Date: Fri, 12 Dec 2025 13:04:58 +0100 Subject: [PATCH 29/58] - make button edit editable - set field anmerkung editable (like statusgrund and statusgrund) - refactor function updateStatus to skip validation - change phrases --- .../api/frontend/v1/stv/Status.php | 15 ++++- public/js/api/factory/stv/status.js | 7 +- .../Details/Prestudent/MultiStatus.js | 4 +- .../Details/Status/Modal.js | 67 ++++++++++++++----- system/phrasesupdate.php | 8 +-- 5 files changed, 72 insertions(+), 29 deletions(-) diff --git a/application/controllers/api/frontend/v1/stv/Status.php b/application/controllers/api/frontend/v1/stv/Status.php index 36d445fc6..0f7960f40 100644 --- a/application/controllers/api/frontend/v1/stv/Status.php +++ b/application/controllers/api/frontend/v1/stv/Status.php @@ -206,6 +206,7 @@ class Status extends FHCAPI_Controller $datum_string = date('c'); $datum = new DateTime($datum_string); + //Form Validation $this->load->library('form_validation'); @@ -1088,7 +1089,7 @@ class Status extends FHCAPI_Controller * * @return void */ - public function updateStatus($prestudent_id, $status_kurzbz, $key_studiensemester_kurzbz, $key_ausbildungssemester) + public function updateStatus($prestudent_id, $status_kurzbz, $key_studiensemester_kurzbz, $key_ausbildungssemester, $hasCriticalChangesBis=false) { $result = $this->PrestudentstatusModel->load([ $key_ausbildungssemester, @@ -1130,14 +1131,22 @@ class Status extends FHCAPI_Controller ] ); + $hasCriticalChangesBis = filter_var($hasCriticalChangesBis, FILTER_VALIDATE_BOOLEAN); + $this->form_validation->set_rules( 'datum', $this->p->t('global', 'datum'), [ 'is_valid_date', - ['meldestichtag_not_exceeded', function ($value) use ($isBerechtigtNoStudstatusCheck) { + ['meldestichtag_not_exceeded', function ($value) use ($isBerechtigtNoStudstatusCheck, $hasCriticalChangesBis){ if ($isBerechtigtNoStudstatusCheck) - return true; // Skip if access right says so + { + return true; // Skip if access right says so*/ + } + if (!$hasCriticalChangesBis) { + return true; // Skip if no critical changes were made + } + if (!$value) return true; // Error will be handled by the required statement above diff --git a/public/js/api/factory/stv/status.js b/public/js/api/factory/stv/status.js index 11e7f4fde..7910cb8c7 100644 --- a/public/js/api/factory/stv/status.js +++ b/public/js/api/factory/stv/status.js @@ -39,14 +39,17 @@ export default { status_kurzbz, studiensemester_kurzbz, ausbildungssemester - }, params) { + }, params, hasCriticalChangesBis) { + console.log("hasCriticalChangesBis " + hasCriticalChangesBis); return { + method: 'post', url: 'api/frontend/v1/stv/status/updateStatus/' + prestudent_id + '/' + status_kurzbz + '/' + studiensemester_kurzbz + '/' - + ausbildungssemester, + + ausbildungssemester + '/' + + hasCriticalChangesBis, params }; }, diff --git a/public/js/components/Stv/Studentenverwaltung/Details/Prestudent/MultiStatus.js b/public/js/components/Stv/Studentenverwaltung/Details/Prestudent/MultiStatus.js index 4b92df109..e67f19ccf 100644 --- a/public/js/components/Stv/Studentenverwaltung/Details/Prestudent/MultiStatus.js +++ b/public/js/components/Stv/Studentenverwaltung/Details/Prestudent/MultiStatus.js @@ -207,8 +207,8 @@ export default{ button.addEventListener('click', () => this.actionEditStatus(data.status_kurzbz, data.studiensemester_kurzbz, data.ausbildungssemester) ); - if (this.dataMeldestichtag && this.dataMeldestichtag > data.datum && !this.hasPermissionToSkipStatusCheck) - button.disabled = true; +/* if (this.dataMeldestichtag && this.dataMeldestichtag > data.datum && !this.hasPermissionToSkipStatusCheck) + button.disabled = true;*/ container.append(button); button = document.createElement('button'); diff --git a/public/js/components/Stv/Studentenverwaltung/Details/Status/Modal.js b/public/js/components/Stv/Studentenverwaltung/Details/Status/Modal.js index 8b0252be8..f913ab7c6 100644 --- a/public/js/components/Stv/Studentenverwaltung/Details/Status/Modal.js +++ b/public/js/components/Stv/Studentenverwaltung/Details/Status/Modal.js @@ -64,7 +64,9 @@ export default{ 'Unterbrecher', 'Diplomand', 'Incoming' - ] + ], + original: {}, + hasCriticalChangesBis: false }; }, computed: { @@ -136,6 +138,7 @@ export default{ this.statusNew = false; this.formData = result.data; this.originalDatum = new Date(result.data.datum); + this.original = { ...this.formData}; return prestudent; }) .then(this.loadStudienplaeneAndSetPrestudent) @@ -157,7 +160,7 @@ export default{ }, editStatus() { this.$refs.form - .call(ApiStvStatus.updateStatus(this.statusId, this.formData)) + .call(ApiStvStatus.updateStatus(this.statusId, this.formData, this.hasCriticalChangesBis)) .then(result => { this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successSave')); this.$reloadList(); @@ -179,30 +182,59 @@ export default{ .then(result => this.mischform = result.data.mischform); } }, + watch: { + // watching all disabled fields + "formData.status_kurzbz"(newVal) { + if (newVal !== this.original.status_kurzbz) { + this.hasCriticalChangesBis = true; + } + }, +/* "formData.studiensemester_kurzbz"(newVal) { + if (newVal !== this.original.studiensemester_kurzbz) { + this.hasCriticalChangesBis = true; + } + },*/ + "formData.orgform_kurzbz"(newVal) { + if (newVal !== this.original.orgform_kurzbz) { + this.hasCriticalChangesBis = true; + } + }, + "formData.datum"(newVal) { + if (newVal !== this.original.datum) { + this.hasCriticalChangesBis = true; + } + }, + "formData.bestaetigtam"(newVal) { + if (newVal !== this.original.bestaetigtam) { + this.hasCriticalChangesBis = true; + } + }, + "formData.bewerbung_abgeschicktamum"(newVal) { + if (newVal !== this.original.bestaetigtam) { + this.hasCriticalChangesBis = true; + } + }, + "formData.studienplan_id"(newVal) { + if (newVal !== this.original.studienplan_id) { + this.hasCriticalChangesBis = true; + } + }, + "formData.rt_stufe"(newVal) { + if (newVal !== this.original.rt_stufe) { + this.hasCriticalChangesBis = true; + } + }, + }, created() { this.$api .call(ApiStvStatus.getStatusgruende()) .then(result => this.statusgruende = result.data) .catch(this.$fhcAlert.handleSystemError); - //TODO(Manu) check why it is/was hard coded this.$api .call(ApiStvStatus.getStati()) .then(result => this.stati = result.data) .catch(this.$fhcAlert.handleSystemError); -/* this.stati = [ - { status_kurzbz: 'Interessent', bezeichnung: 'Interessent'}, - { status_kurzbz: 'Bewerber', bezeichnung: 'Bewerber'}, - { status_kurzbz: 'Aufgenommener', bezeichnung: 'Aufgenommener'}, - { status_kurzbz: 'Student', bezeichnung: 'Student'}, - { status_kurzbz: 'Unterbrecher', bezeichnung: 'Unterbrecher'}, - { status_kurzbz: 'Diplomand', bezeichnung: 'Diplomand'}, - { status_kurzbz: 'Incoming', bezeichnung: 'Incoming'}, - { status_kurzbz: 'Absolvent', bezeichnung: 'Absolvent'}, - { status_kurzbz: 'Abbrecher', bezeichnung: 'Abbrecher'}, - { status_kurzbz: 'Abgewiesener', bezeichnung: 'Abgewiesener'}, - { status_kurzbz: 'Wartender', bezeichnung: 'Wartender'} - ];*/ }, template: ` @@ -220,7 +252,7 @@ export default{

{{$p.t('bismeldestichtag', 'info_MeldestichtagStatusgrundSemester')}}

- + array( array( 'sprache' => 'German', - 'text' => 'Meldestichtag erreicht - ausschließlich Bearbeiten Statusgrund möglich', + 'text' => 'Meldestichtag erreicht - ausschließlich Bearbeiten Statusgrund und Anmerkung möglich', 'description' => '', 'insertvon' => 'system' ), array( 'sprache' => 'English', - 'text' => 'Reporting deadline reached - only editing status reason possible', + 'text' => 'Reporting deadline reached - only editing status reason and note possible', 'description' => '', 'insertvon' => 'system' ) @@ -41320,13 +41320,13 @@ array( 'phrases' => array( array( 'sprache' => 'German', - 'text' => 'Meldestichtag erreicht - Bearbeiten Ausbildungssemester und Statusgrund möglich', + 'text' => 'Meldestichtag erreicht - Bearbeiten Ausbildungssemester, Statusgrund und Anmerkung möglich', 'description' => '', 'insertvon' => 'system' ), array( 'sprache' => 'English', - 'text' => 'Edit education semester and status reason possible', + 'text' => 'Edit education semester, status reason and note possible', 'description' => '', 'insertvon' => 'system' ) From 5a77478071c7503ce32b885e0303f753343b4db2 Mon Sep 17 00:00:00 2001 From: ma0048 Date: Mon, 15 Dec 2025 12:27:17 +0100 Subject: [PATCH 30/58] insertvon entfernt --- cis/testtool/externeueberwachung.js | 4 +--- include/externe_ueberwachung.class.php | 5 ++--- .../62889_reihungstest_ueberwachung_mit_constructor.php | 1 - 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/cis/testtool/externeueberwachung.js b/cis/testtool/externeueberwachung.js index d15404dec..65143290d 100644 --- a/cis/testtool/externeueberwachung.js +++ b/cis/testtool/externeueberwachung.js @@ -28,9 +28,7 @@ setTimeout(function () { if (!proctoringOK) { - console.warn("Constructor nicht aktiv!") - //TODO einkommentieren - //top.location.href='resetconnection.php'; + top.location.href='resetconnection.php'; } }, 1000); })(); \ No newline at end of file diff --git a/include/externe_ueberwachung.class.php b/include/externe_ueberwachung.class.php index 5e5bafded..b28a8439a 100644 --- a/include/externe_ueberwachung.class.php +++ b/include/externe_ueberwachung.class.php @@ -53,11 +53,10 @@ class externeUeberwachung extends basis_db $uuid = $this->genereateUUID(); - $qry = "INSERT INTO testtool.tbl_externe_ueberwachung (prestudent_id, session_id, insertvon) + $qry = "INSERT INTO testtool.tbl_externe_ueberwachung (prestudent_id, session_id) VALUES (". $this->db_add_param($prestudent_id).",". - $this->db_add_param($uuid).",". - $this->db_add_param(get_uid()).")"; + $this->db_add_param($uuid).")"; if($this->db_query($qry)) { diff --git a/system/dbupdate_3.4/62889_reihungstest_ueberwachung_mit_constructor.php b/system/dbupdate_3.4/62889_reihungstest_ueberwachung_mit_constructor.php index 7f306e3d9..1b469a635 100644 --- a/system/dbupdate_3.4/62889_reihungstest_ueberwachung_mit_constructor.php +++ b/system/dbupdate_3.4/62889_reihungstest_ueberwachung_mit_constructor.php @@ -19,7 +19,6 @@ if(!$result = @$db->db_query("SELECT 1 FROM testtool.tbl_externe_ueberwachung LI prestudent_id INTEGER NOT NULL, session_id UUID NOT NULL, insertamum TIMESTAMP DEFAULT NOW(), - insertvon VARCHAR(32) NOT NULL, CONSTRAINT tbl_externe_ueberwachung_pk PRIMARY KEY(externe_ueberwachung_id) ); CREATE SEQUENCE testtool.tbl_externe_ueberwachungg_id_seq From 3f891179aa477e83ceb47a57fe0857c894c20954 Mon Sep 17 00:00:00 2001 From: Harald Bamberger Date: Mon, 15 Dec 2025 15:12:49 +0100 Subject: [PATCH 31/58] move check for critical changes bis from frontend to backend --- .../api/frontend/v1/stv/Status.php | 23 +++++++-- public/js/api/factory/stv/status.js | 6 +-- .../Details/Status/Modal.js | 49 +------------------ 3 files changed, 24 insertions(+), 54 deletions(-) diff --git a/application/controllers/api/frontend/v1/stv/Status.php b/application/controllers/api/frontend/v1/stv/Status.php index 0f7960f40..a99db9ac8 100644 --- a/application/controllers/api/frontend/v1/stv/Status.php +++ b/application/controllers/api/frontend/v1/stv/Status.php @@ -1079,6 +1079,24 @@ class Status extends FHCAPI_Controller $this->terminateWithSuccess(true); } + protected function checkForCriticalChangesBis($oldstatus) + { + $changedFields = array(); + $allowedFields = array('anmerkung', 'statusgrund_id'); + $oldstatus_array = get_object_vars($oldstatus); + foreach($oldstatus_array as $key => $oldValue) + { + $newValue = $this->input->post($key); + if( $newValue !== $oldValue ) + { + $changedFields[] = $key; + } + } + $criticalFieldsChanged = array_diff($changedFields, $allowedFields); + $hasCriticalChangesBis = count($criticalFieldsChanged) > 0 ? true : false; + return $hasCriticalChangesBis; + } + /** * Updates a status entry * @@ -1089,7 +1107,7 @@ class Status extends FHCAPI_Controller * * @return void */ - public function updateStatus($prestudent_id, $status_kurzbz, $key_studiensemester_kurzbz, $key_ausbildungssemester, $hasCriticalChangesBis=false) + public function updateStatus($prestudent_id, $status_kurzbz, $key_studiensemester_kurzbz, $key_ausbildungssemester) { $result = $this->PrestudentstatusModel->load([ $key_ausbildungssemester, @@ -1103,6 +1121,7 @@ class Status extends FHCAPI_Controller $oldstatus = current($oldstatus); + $hasCriticalChangesBis = $this->checkForCriticalChangesBis($oldstatus); $isBerechtigtNoStudstatusCheck = $this->permissionlib->isBerechtigt('student/keine_studstatuspruefung'); $isBerechtigtBasisPrestudentstatus = $this->permissionlib->isBerechtigt('basis/prestudentstatus'); @@ -1131,8 +1150,6 @@ class Status extends FHCAPI_Controller ] ); - $hasCriticalChangesBis = filter_var($hasCriticalChangesBis, FILTER_VALIDATE_BOOLEAN); - $this->form_validation->set_rules( 'datum', $this->p->t('global', 'datum'), diff --git a/public/js/api/factory/stv/status.js b/public/js/api/factory/stv/status.js index 7910cb8c7..7c289dc22 100644 --- a/public/js/api/factory/stv/status.js +++ b/public/js/api/factory/stv/status.js @@ -39,8 +39,7 @@ export default { status_kurzbz, studiensemester_kurzbz, ausbildungssemester - }, params, hasCriticalChangesBis) { - console.log("hasCriticalChangesBis " + hasCriticalChangesBis); + }, params) { return { method: 'post', @@ -48,8 +47,7 @@ export default { + prestudent_id + '/' + status_kurzbz + '/' + studiensemester_kurzbz + '/' - + ausbildungssemester + '/' - + hasCriticalChangesBis, + + ausbildungssemester, params }; }, diff --git a/public/js/components/Stv/Studentenverwaltung/Details/Status/Modal.js b/public/js/components/Stv/Studentenverwaltung/Details/Status/Modal.js index f913ab7c6..3b282d230 100644 --- a/public/js/components/Stv/Studentenverwaltung/Details/Status/Modal.js +++ b/public/js/components/Stv/Studentenverwaltung/Details/Status/Modal.js @@ -64,9 +64,7 @@ export default{ 'Unterbrecher', 'Diplomand', 'Incoming' - ], - original: {}, - hasCriticalChangesBis: false + ] }; }, computed: { @@ -160,7 +158,7 @@ export default{ }, editStatus() { this.$refs.form - .call(ApiStvStatus.updateStatus(this.statusId, this.formData, this.hasCriticalChangesBis)) + .call(ApiStvStatus.updateStatus(this.statusId, this.formData)) .then(result => { this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successSave')); this.$reloadList(); @@ -182,49 +180,6 @@ export default{ .then(result => this.mischform = result.data.mischform); } }, - watch: { - // watching all disabled fields - "formData.status_kurzbz"(newVal) { - if (newVal !== this.original.status_kurzbz) { - this.hasCriticalChangesBis = true; - } - }, -/* "formData.studiensemester_kurzbz"(newVal) { - if (newVal !== this.original.studiensemester_kurzbz) { - this.hasCriticalChangesBis = true; - } - },*/ - "formData.orgform_kurzbz"(newVal) { - if (newVal !== this.original.orgform_kurzbz) { - this.hasCriticalChangesBis = true; - } - }, - "formData.datum"(newVal) { - if (newVal !== this.original.datum) { - this.hasCriticalChangesBis = true; - } - }, - "formData.bestaetigtam"(newVal) { - if (newVal !== this.original.bestaetigtam) { - this.hasCriticalChangesBis = true; - } - }, - "formData.bewerbung_abgeschicktamum"(newVal) { - if (newVal !== this.original.bestaetigtam) { - this.hasCriticalChangesBis = true; - } - }, - "formData.studienplan_id"(newVal) { - if (newVal !== this.original.studienplan_id) { - this.hasCriticalChangesBis = true; - } - }, - "formData.rt_stufe"(newVal) { - if (newVal !== this.original.rt_stufe) { - this.hasCriticalChangesBis = true; - } - }, - }, created() { this.$api .call(ApiStvStatus.getStatusgruende()) From 718272e8a152a897eebeef33a58e340590bb09ac Mon Sep 17 00:00:00 2001 From: Harald Bamberger Date: Mon, 15 Dec 2025 15:13:53 +0100 Subject: [PATCH 32/58] remove empty line --- application/controllers/api/frontend/v1/stv/Status.php | 1 - 1 file changed, 1 deletion(-) diff --git a/application/controllers/api/frontend/v1/stv/Status.php b/application/controllers/api/frontend/v1/stv/Status.php index a99db9ac8..dbd9e69b4 100644 --- a/application/controllers/api/frontend/v1/stv/Status.php +++ b/application/controllers/api/frontend/v1/stv/Status.php @@ -1132,7 +1132,6 @@ class Status extends FHCAPI_Controller $ausbildungssemester = $this->input->post('ausbildungssemester') ?: $oldstatus->ausbildungssemester; $datum = $this->input->post('datum') ?: $oldstatus->datum; - //Form Validation $this->load->library('form_validation'); From 11ff26d8e7f9cf7ccee6625613370754bfaac5b6 Mon Sep 17 00:00:00 2001 From: Harald Bamberger Date: Mon, 15 Dec 2025 15:20:19 +0100 Subject: [PATCH 33/58] remove empty lines --- application/controllers/api/frontend/v1/stv/Status.php | 1 - public/js/api/factory/stv/status.js | 1 - 2 files changed, 2 deletions(-) diff --git a/application/controllers/api/frontend/v1/stv/Status.php b/application/controllers/api/frontend/v1/stv/Status.php index dbd9e69b4..09a9f18b1 100644 --- a/application/controllers/api/frontend/v1/stv/Status.php +++ b/application/controllers/api/frontend/v1/stv/Status.php @@ -206,7 +206,6 @@ class Status extends FHCAPI_Controller $datum_string = date('c'); $datum = new DateTime($datum_string); - //Form Validation $this->load->library('form_validation'); diff --git a/public/js/api/factory/stv/status.js b/public/js/api/factory/stv/status.js index 7c289dc22..11e7f4fde 100644 --- a/public/js/api/factory/stv/status.js +++ b/public/js/api/factory/stv/status.js @@ -41,7 +41,6 @@ export default { ausbildungssemester }, params) { return { - method: 'post', url: 'api/frontend/v1/stv/status/updateStatus/' + prestudent_id + '/' From 7de3c4a24e423fcdef9e6bdc787e28b1a32ae32f Mon Sep 17 00:00:00 2001 From: Harald Bamberger Date: Mon, 15 Dec 2025 15:22:32 +0100 Subject: [PATCH 34/58] remove unnecessary line --- .../components/Stv/Studentenverwaltung/Details/Status/Modal.js | 1 - 1 file changed, 1 deletion(-) diff --git a/public/js/components/Stv/Studentenverwaltung/Details/Status/Modal.js b/public/js/components/Stv/Studentenverwaltung/Details/Status/Modal.js index 3b282d230..7507b0ebd 100644 --- a/public/js/components/Stv/Studentenverwaltung/Details/Status/Modal.js +++ b/public/js/components/Stv/Studentenverwaltung/Details/Status/Modal.js @@ -136,7 +136,6 @@ export default{ this.statusNew = false; this.formData = result.data; this.originalDatum = new Date(result.data.datum); - this.original = { ...this.formData}; return prestudent; }) .then(this.loadStudienplaeneAndSetPrestudent) From cf7e9921b541a7dd0d9798bb4cd3e77f15c0c42f Mon Sep 17 00:00:00 2001 From: Harald Bamberger Date: Mon, 15 Dec 2025 16:11:46 +0100 Subject: [PATCH 35/58] change grades sort order --- application/controllers/api/frontend/v1/stv/Projektarbeit.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/application/controllers/api/frontend/v1/stv/Projektarbeit.php b/application/controllers/api/frontend/v1/stv/Projektarbeit.php index db7d99752..8740ef3d6 100644 --- a/application/controllers/api/frontend/v1/stv/Projektarbeit.php +++ b/application/controllers/api/frontend/v1/stv/Projektarbeit.php @@ -280,6 +280,9 @@ class Projektarbeit extends FHCAPI_Controller */ public function getNoten() { + $this->NoteModel->addOrder('notenwert', 'ASC'); + $this->NoteModel->addOrder('bezeichnung', 'ASC'); + $result = $this->NoteModel->load(); if (isError($result)) return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); From e6ef234c8b0aa52c43c7dd257593a1391eaef4d0 Mon Sep 17 00:00:00 2001 From: Cristina Date: Mon, 15 Dec 2025 16:27:47 +0100 Subject: [PATCH 36/58] Added method getOrgformsByStg to Studiengang_model.php Get OrgForms of given Studiengang and Studiensemester --- .../models/organisation/Studiengang_model.php | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/application/models/organisation/Studiengang_model.php b/application/models/organisation/Studiengang_model.php index 98d650e0c..893c7b2bd 100644 --- a/application/models/organisation/Studiengang_model.php +++ b/application/models/organisation/Studiengang_model.php @@ -835,4 +835,40 @@ class Studiengang_model extends DB_Model return $this->execQuery($qry, [$studiengang_kz_arr, $studiensemester_kurzbz]); } + + /** + * Get OrgForms of given Studiengang and Studiensemester. + * + * @param $studiengang_kz + * @param $studiensemester_kurzbz + * @return array|stdClass|null + */ + public function getOrgformsByStg($studiengang_kz, $studiensemester_kurzbz) + { + $qry = ' + SELECT + stpl.orgform_kurzbz + FROM + public.tbl_studiengang stg + JOIN lehre.tbl_studienordnung sto USING(studiengang_kz) + JOIN lehre.tbl_studienplan stpl USING(studienordnung_id) + JOIN lehre.tbl_studienplan_semester stplsem USING(studienplan_id) + WHERE + stg.studiengang_kz = ? + AND stg.aktiv = TRUE + AND stplsem.studiensemester_kurzbz = ? + GROUP BY + stpl.orgform_kurzbz + ORDER BY + CASE stpl.orgform_kurzbz + WHEN \'VZ\' THEN 1 + WHEN \'BB\' THEN 2 + WHEN \'DUA\' THEN 3 + ELSE 4 + END, + stpl.orgform_kurzbz; + '; + + return $this->execQuery($qry, [$studiengang_kz, $studiensemester_kurzbz]); + } } From db048e876c901f23a8e770899066fdb7bcd3329c Mon Sep 17 00:00:00 2001 From: Cristina Date: Mon, 15 Dec 2025 16:48:07 +0100 Subject: [PATCH 37/58] Renamed getEntitledStgs to getByStgs Permissions check happens in application controller. --- application/models/organisation/Studiengang_model.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/application/models/organisation/Studiengang_model.php b/application/models/organisation/Studiengang_model.php index 893c7b2bd..942b8c47e 100644 --- a/application/models/organisation/Studiengang_model.php +++ b/application/models/organisation/Studiengang_model.php @@ -808,9 +808,9 @@ class Studiengang_model extends DB_Model * * @param $studiengang_kz_arr * @param $studiensemester_kurzbz - * @return array|stdClass|null + * @return array|stdClass|null Returns one row per Studiengang. Not considering the Orgforms. */ - public function getEntitledStgs($studiengang_kz_arr, $studiensemester_kurzbz) + public function getByStgs($studiengang_kz_arr, $studiensemester_kurzbz) { if (is_numeric($studiengang_kz_arr)) { From 4f5e49a93c99cea92dd3b3bb7449d49e732a8091 Mon Sep 17 00:00:00 2001 From: Harald Bamberger Date: Tue, 16 Dec 2025 15:27:31 +0100 Subject: [PATCH 38/58] send to all private email addresses marked as zustellung --- application/config/studierendenantrag.php | 2 +- application/controllers/jobs/AntragJob.php | 14 +++++++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/application/config/studierendenantrag.php b/application/config/studierendenantrag.php index e0ef5486b..4e25aef28 100644 --- a/application/config/studierendenantrag.php +++ b/application/config/studierendenantrag.php @@ -57,7 +57,7 @@ $config['wiederholung_note_nicht_zugelassen'] = 20; * @var string A string formated as PHP DateTime modifier * @see https://www.php.net/manual/de/datetime.modify.php */ -$config['unterbrechung_job_remind_wiedereinstieg_date_modifier'] = '+166 days'; +$config['unterbrechung_job_remind_wiedereinstieg_date_modifier'] = '+3 days'; /** * The Job will sent a request to everyone who faild the 3rd committee exam diff --git a/application/controllers/jobs/AntragJob.php b/application/controllers/jobs/AntragJob.php index 9441a349b..430b07cb6 100644 --- a/application/controllers/jobs/AntragJob.php +++ b/application/controllers/jobs/AntragJob.php @@ -265,22 +265,26 @@ class AntragJob extends JOB_Controller $person_id = $dataPrestudent->person_id; $this->KontaktModel->addSelect('kontakt'); - $this->KontaktModel->addLimit(1); $result = $this->KontaktModel->loadWhere([ 'person_id'=> $person_id, 'zustellung' => true, 'kontakttyp' => 'email' ]); - if (hasData($result)) { - $dataKontakt = current(getData($result)); - $email_student_privat = $dataKontakt->kontakt; + + $email_student_privat = null; + $dataKontakt = getData($result); + if ($dataKontakt) { + $stud_private_zustell_emails = array_map(function($kontakt) { + return $kontakt->kontakt; + }, $dataKontakt); + $email_student_privat = implode(', ', $stud_private_zustell_emails); } $email_student_FH = $this->StudentModel->getEmailFH($this->StudentModel->getUID($antrag->prestudent_id)); //studiensemester - $result = $this->StudiensemesterModel->getByDate($datum->format('d.m.Y')); + $result = $this->StudiensemesterModel->getByDate($datum->format('Y-m-d')); if (hasData($result)) { $dataSem = current(getData($result)); } From ddfcef9ad724e7a2929ae5610d247d5b50f1d2dd Mon Sep 17 00:00:00 2001 From: Harald Bamberger Date: Tue, 16 Dec 2025 15:52:44 +0100 Subject: [PATCH 39/58] log Error if mail can not be sent, only change status if both reminder emails were successfully sent --- application/controllers/jobs/AntragJob.php | 33 ++++++++++++++++------ 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/application/controllers/jobs/AntragJob.php b/application/controllers/jobs/AntragJob.php index 430b07cb6..8dc4870ea 100644 --- a/application/controllers/jobs/AntragJob.php +++ b/application/controllers/jobs/AntragJob.php @@ -314,18 +314,17 @@ class AntragJob extends JOB_Controller $data['studSemShort'] = $studsemShort; // NOTE(chris): Sancho mail Assistant - if(sendSanchoMail('Sancho_Mail_Antrag_U_Reminder', $data, $antrag->email, 'Reminder: Unterbrechung Wiedereinstieg')) + $sancho_assistant_sent = sendSanchoMail('Sancho_Mail_Antrag_U_Reminder', $data, $antrag->email, 'Reminder: Unterbrechung Wiedereinstieg'); + if($sancho_assistant_sent) { $count++; - $this->StudierendenantragstatusModel->insert([ - 'studierendenantrag_id' => $antrag->studierendenantrag_id, - 'studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_REMINDERSENT, - 'insertvon' => 'AntragJob' - ]); } - + else + { + $this->logError('Error: failed to send Assistant Reminder studierendenantrag_id: ' . $antrag->studierendenantrag_id); + } //Mail to Student - if(sendSanchoMail( + $sancho_student_sent = sendSanchoMail( 'Sancho_Mail_Antrag_U_Remind_Stud', $data, $email_student_FH, @@ -333,9 +332,25 @@ class AntragJob extends JOB_Controller '', '', '', - $email_student_privat)) { + $email_student_privat); + + if($sancho_student_sent) + { $countReminderStudent++; } + else + { + $this->logError('Error: failed to send Student Reminder studierendenantrag_id: ' . $antrag->studierendenantrag_id); + } + + if($sancho_assistant_sent && $sancho_student_sent) + { + $this->StudierendenantragstatusModel->insert([ + 'studierendenantrag_id' => $antrag->studierendenantrag_id, + 'studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_REMINDERSENT, + 'insertvon' => 'AntragJob' + ]); + } } $this->logInfo($count . ' Reminder an Assistenz und ' . $countReminderStudent . ' Reminder an Student gesendet - Ende Job sendReminderWiedereinstieg'); } From 6b0526fb953e0db165e972a73046c78a2643796e Mon Sep 17 00:00:00 2001 From: Harald Bamberger Date: Wed, 17 Dec 2025 13:22:39 +0100 Subject: [PATCH 40/58] add tabulator persistence config --- public/js/components/Cis/ProfilUpdate/ProfilUpdateView.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/public/js/components/Cis/ProfilUpdate/ProfilUpdateView.js b/public/js/components/Cis/ProfilUpdate/ProfilUpdateView.js index 222290e98..9798ba7a4 100644 --- a/public/js/components/Cis/ProfilUpdate/ProfilUpdateView.js +++ b/public/js/components/Cis/ProfilUpdate/ProfilUpdateView.js @@ -59,6 +59,10 @@ export default { }, profilUpdateOptions: function () { return { + persistence: { + columns: ["width", "visible", "frozen"], + }, + persistenceID: 'cis-profilupdate-2025121702', ajaxURL: 'dummy', ajaxRequestFunc: (url, config, params) => { return this.$api.call(ApiProfilUpdate.getProfilUpdateWithPermission(params.filter)); From f9ac824cc0e29bdd23df0e1449f368bf96111eb1 Mon Sep 17 00:00:00 2001 From: Cristina Date: Wed, 17 Dec 2025 14:33:04 +0100 Subject: [PATCH 41/58] Added LV-Evaluierung NEU link button to CIS LV Menu --- config/global.config-default.inc.php | 6 +++++- include/tw/cis_menu_lv.inc.php | 21 +++++++++++++++++++++ skin/images/button_lvevaluierung.png | Bin 0 -> 3021 bytes 3 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 skin/images/button_lvevaluierung.png diff --git a/config/global.config-default.inc.php b/config/global.config-default.inc.php index f24a302cc..1e20ce506 100644 --- a/config/global.config-default.inc.php +++ b/config/global.config-default.inc.php @@ -27,12 +27,16 @@ define('CIS_LEHRVERANSTALTUNG_SEMESTERINFO_ANZEIGEN',true); define('CIS_LEHRVERANSTALTUNG_LEHRFACH_ANZEIGEN',false); define('CIS_LEHRVERANSTALTUNG_GESAMTNOTE_ANZEIGEN', true); define('CIS_LEHRVERANSTALTUNG_ANRECHNUNG_ANZEIGEN', true); -define('CIS_LEHRVERANSTALTUNG_ANWESENHEIT_ANZEIGEN', true); +define('CIS_EVALUIERUNG_ANZEIGEN_STG', true); +define('CIS_LEHRVERANSTALTUNG_EVALUIERUNG_ANZEIGEN', true); // Wenn gesetzt, werden die Digitale Anwesenheit-Icons nur fuer diese Studiengaenge angezeigt, sonst für alle // define('CIS_LEHRVERANSTALTUNG_ANWESENHEIT_ANZEIGEN_STG', serialize(array('257'))); // define('CIS_LEHRVERANSTALTUNG_ANWESENHEIT_ANZEIGEN_LVA', serialize(array('39455','39481','39480','41906','41905','41904','39459','39512','39454','39482','42230','42231','39458','41921','41922','39457','42896'))); +// Wenn gesetzt, werden die LV-Evaluierung-Icons nur für diese Studiengaenge angezeigt, sonst alle +define('CIS_EVALUIERUNG_ANZEIGEN_STG', serialize((array('335', '585', '914', '298')))); // BIW, MAI, BUB, MIO + // Im CIS Menue Links bei Modulen anzeigen wenn Lehrauftrag define('CIS_LEHRVERANSTALTUNG_MODULE_LINK',true); diff --git a/include/tw/cis_menu_lv.inc.php b/include/tw/cis_menu_lv.inc.php index 29ba54724..c6dad40e3 100644 --- a/include/tw/cis_menu_lv.inc.php +++ b/include/tw/cis_menu_lv.inc.php @@ -500,6 +500,27 @@ if((!defined('CIS_LEHRVERANSTALTUNG_ANRECHNUNG_ANZEIGEN') || CIS_LEHRVERANSTALTU ); } +// LV-Evaluierung NEU +if(defined('CIS_EVALUIERUNG_ANZEIGEN_STG') + && CIS_EVALUIERUNG_ANZEIGEN_STG + && $angemeldet + && (!defined('CIS_EVALUIERUNG_ANZEIGEN_STG') || in_array($lv->studiengang_kz, unserialize(CIS_EVALUIERUNG_ANZEIGEN_STG))) + && ($rechte->isBerechtigt('extension/lvevaluierung_init'))) +{ + $text='(Pilotphase)'; + + $link= APP_ROOT. 'index.ci.php/extensions/FHC-Core-Evaluierung/Initiierung?lehrveranstaltung_id='. urlencode($lv->lehrveranstaltung_id).'&studiensemester_kurzbz='.urlencode($angezeigtes_stsem); + + $menu[]=array + ( + 'id'=>'extension_lvevaluierung_menu_initiierung', + 'position'=>'140', + 'name'=>$p->t('lvevaluierung/lvevaluierung'). ' - '. strtoupper($p->t('global/neu')), + 'icon'=>'../../../skin/images/button_lvevaluierung.png', + 'link'=> $link, + 'text'=>$text + ); +} //************* Menuepunkte anzeigen **************** diff --git a/skin/images/button_lvevaluierung.png b/skin/images/button_lvevaluierung.png new file mode 100644 index 0000000000000000000000000000000000000000..c4175601acc735a81c267fc263cbde80e44a5542 GIT binary patch literal 3021 zcmV;;3o`VHP)WFTUBAWdOzW^!d@AWLa(WNaXJX>@2HM@dakVIipd z000XhNkl!*yRsJEwK*ck`m=G$9_zK8GfR*d`()(LvAw5Ts2LQ<{K4AOMXJBHJ1P*3-;=#));G{Sf25v-fs? zp|PJ#^nu8{2c;CIDaj7&R7wVv)<~%s9vQ{qFvbTF*$ad)EPy%BGWQ6CVSO70XbcPk z(3UU5$o4fd?J|800|P)97y|3J5R61eGl2r9R0^duDbvI-#Q2N=tu=jpeYAIUFfb4% zl}h1qxd;V=%$zxc>DOO}!{M+aG1)X)Lq|s^=PzEQr?;16GKJga;`-~arWr=znIr_;&mRd?el zm^LN6WHQN)ox3bh`T3K4v|YMPp3}+0>mI`ADYW}3rI1ou!Rqem)keu1*dNG7xI1(YANCIHU3|g(U-ErUk1Gro+9^JT};y_@^ z=md)V{L_YdJcWh4y?c)}V=+GX@85bGS6&{EZrng1P&B2FBEO$UHq_(sc=*M(-`Y`A zN+YF2N{Jz*BAaG_{{DW_=`;_lUB!iqZEW7Ml|Aq8%W-_*zdvI0me=@mODp%UU5%8I zuC8wTeOGrksZ@#w?p@8rwo7b&Wh?LPJDB6+!$W^$^OmigZ9UKZYgZwqK~A3e697%8PTLdET64Vdr1kvdX-bL%_`Du2Tx_!kzu0yO zcYZ#>k`kIvp8?=RQ!`qRXX)69=8TV16bAzMeO^8}+hPIK8mT0vk{HsIn5IN#QXC!( zb3<(nLI{@BEh13lXT|a_VOWa`Aq2OtSWX~N#LY_<12Avy4fOT*+W>p}`j|JT*7C7v zA;p0rZo74vy#{lA)B!Mm-dwu6dq42%ufT`m{V*yuHtwIjz* z(0u9)DuYETg());G)-xzu(-IG)^iuQZTT{isT6Pg>Nk9K?P_YOXWPy?I=k4u<1N1V z$k%W>oqW>LN@*x$zb_4iXlXsqtzWvCk!X~r=2M?iY@uq_O!@|fXg+<~9z!aPY07LR z$!-!W0+kiz^z`&FFc2mb3bJ6{T;6(j4`01^4YOy>q`jk)KkRyk+S#-5`Fw;2hloTX z%%3;c9=E!xiuR5U!r?)bR$S@qoQTP`zP2i!@9l;Tf0&I|t>e~n7Z^(<$uG!92*H27@~Snl*;UpqSL1lZ(WaByG))Tf^YLXi zM>3h<{SWrzDJ0)ZkTkr7UuXr!~d8v#81}gWL?UU)y^oF@)21mYESzSS zwJcw0t?B9Q<;vwN41~j&ris((Bv?{RRaF(`Wo6{$IdeEN3s4A)a3hfsJ~?}qrsh+$ zw6u~oO`Hw~b82f?xbW|&o?Vs0005DZ5#sTL<@4ajM|C=##_RDAEGfmlunaOr$Or+<#Mf-s&U$gf1cE0!h{~(!6q9(N0 z(mKQ`sVuQz%5nA3-rm93*ccl()N`@z63_kMhrGLcZ;s>r2S4PwAN-KBEv>AtUx#U$ zv|YM|arF8^0l+tLW?HQjs^C!Gs55ZuNqsNW|@bQtO zxd0D*2*9C39}@@!C@l@q)O_-q0JgNW0`S;BKRV^+)Jmh2&d9BdIRQfXm-22}90Q}20zCI;iT586^ z^8?vG%}~QX3D{;s%Fu4=`y?C*^N?)%|G1&z{=ZJ{Dn%QZA|u=#MI8I8r*xW4{Vqi3gBW_VC#BABhkGiFrccDeZFw(SUD-9ryDr?&R0 zL1(h=?;phJbh2&xn>k{0D!XO*GL|p9nbBCxj_O~md}@4?*hH-|MD1`mc&g!X1_y`u z>6X_hFDoNIKR?HT+wG>Zyqv8+`?)PPuU>;!FaA|`-^E>bewk;Ud;*8VF=e^SO|gZ` zX;F+sPY??pkB4WUZs3JYFZ05SFLV8Mr7T%oM^TZVNFAD>yC(9^9yyfKD5=nvSg=k|Ly=(&!^n|O4u^xI?Y@cOIQ;or)fPJ<%9|3Ay8PjC1ie)8{MzPH=I P00000NkvXXu0mjfB`(wT literal 0 HcmV?d00001 From 4dd4d8aaa50c81f946486d1d606964b606891467 Mon Sep 17 00:00:00 2001 From: Cristina Date: Wed, 17 Dec 2025 14:35:24 +0100 Subject: [PATCH 42/58] Removed filtering aktiv studienganege from method to get Studiengaenge by Stgs otherwise when switching to former semester (which will have inactive studiengaenge) it will not appear --- application/models/organisation/Studiengang_model.php | 1 - 1 file changed, 1 deletion(-) diff --git a/application/models/organisation/Studiengang_model.php b/application/models/organisation/Studiengang_model.php index 942b8c47e..2b235aeb8 100644 --- a/application/models/organisation/Studiengang_model.php +++ b/application/models/organisation/Studiengang_model.php @@ -827,7 +827,6 @@ class Studiengang_model extends DB_Model JOIN lehre.tbl_studienplan_semester stplsem USING(studienplan_id) WHERE stg.studiengang_kz IN ? - AND stg.aktiv = TRUE AND stplsem.studiensemester_kurzbz = ? ORDER BY stg.kurzbzlang From 0616236e00d0f788756e62519834f23154c124ee Mon Sep 17 00:00:00 2001 From: Harald Bamberger Date: Thu, 18 Dec 2025 12:48:08 +0100 Subject: [PATCH 43/58] =?UTF-8?q?bugfix:=20ZGV=20=C3=9Cbernahme=20bei=20In?= =?UTF-8?q?teressentenanlage,=20bestehende=20ZGVs=20die=20null=20sind=20au?= =?UTF-8?q?sfiltern?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- application/libraries/PrestudentLib.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/application/libraries/PrestudentLib.php b/application/libraries/PrestudentLib.php index 28879fb47..561b19fd4 100644 --- a/application/libraries/PrestudentLib.php +++ b/application/libraries/PrestudentLib.php @@ -68,7 +68,8 @@ class PrestudentLib $this->_ci->PrestudentModel->addOrder('zgv_code', 'DESC'); $this->_ci->PrestudentModel->addLimit(1); $result = $this->_ci->PrestudentModel->loadWhere([ - 'person_id' => $person_id + 'person_id' => $person_id, + 'zgv_code IS NOT NULL' => null ]); if (isError($result)) return $result; From c113c8086253f64556823171cd9935190d989cf2 Mon Sep 17 00:00:00 2001 From: Harald Bamberger Date: Mon, 22 Dec 2025 21:11:05 +0100 Subject: [PATCH 44/58] fix calculation of next student matrikelnr aka personenkennzeichen and student uid --- application/libraries/PrestudentLib.php | 8 +++----- application/models/crm/Student_model.php | 2 +- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/application/libraries/PrestudentLib.php b/application/libraries/PrestudentLib.php index 561b19fd4..a57533da0 100644 --- a/application/libraries/PrestudentLib.php +++ b/application/libraries/PrestudentLib.php @@ -687,9 +687,6 @@ class PrestudentLib $now = date('c'); $today = date('Y-m-d'); - $jahr = mb_substr($studiensemester_kurzbz, 4, 2); - - // Genererate Personenkennzeichen $personenkennzeichen = $this->_ci->StudentModel->generateMatrikelnummer2( $student_data->studiengang_kz, @@ -699,8 +696,9 @@ class PrestudentLib if (isError($personenkennzeichen)) return $personenkennzeichen; $personenkennzeichen = getData($personenkennzeichen); - - + + $jahr = mb_substr($personenkennzeichen, 0, 2); + // Generate UID $uid = $this->_ci->StudentModel->generateUID( $student_data->kurzbz, diff --git a/application/models/crm/Student_model.php b/application/models/crm/Student_model.php index 6f2404cbd..ca9cfe4c3 100644 --- a/application/models/crm/Student_model.php +++ b/application/models/crm/Student_model.php @@ -169,7 +169,7 @@ class Student_model extends DB_Model $max = 0; if ($matrikelnrres && hasData($matrikelnrres)) { - $max = mb_substr(getData($matrikelnrres)[0]->matrikelnr, 7); + $max = mb_substr(trim(getData($matrikelnrres)[0]->matrikelnr), -3); if (!is_numeric($max)) { $max = (int)$max; } From 40ae57fb0c597964d3832f2a11c75853ef170682 Mon Sep 17 00:00:00 2001 From: ma0048 Date: Thu, 8 Jan 2026 12:01:20 +0100 Subject: [PATCH 45/58] proctoring check ueberarbeitet --- cis/testtool/externeueberwachung.js | 37 ++++----------- cis/testtool/frage.css | 30 ++++++++++++ cis/testtool/frage.php | 4 +- cis/testtool/frage_externe_ueberwachung.js | 53 ++++++++++++++++++++++ cis/testtool/index.php | 1 + 5 files changed, 96 insertions(+), 29 deletions(-) create mode 100644 cis/testtool/frage.css create mode 100644 cis/testtool/frage_externe_ueberwachung.js diff --git a/cis/testtool/externeueberwachung.js b/cis/testtool/externeueberwachung.js index 65143290d..71951779f 100644 --- a/cis/testtool/externeueberwachung.js +++ b/cis/testtool/externeueberwachung.js @@ -1,34 +1,15 @@ (function () { - /* - - const params = new URLSearchParams(location.search); - let expectedOrigin = params.get("examus-client-origin"); - - if (!expectedOrigin) - { - window.top.location.href = 'resetconnection.php'; - return; + function sendMessage() { + let frame = window.frames['content']; + if (frame) + frame.postMessage({ type: "proctoringReady" }); } - */ - let proctoringOK = false; - window.addEventListener("message", function (e) { - /*if (e.origin !== expectedOrigin) { - return; - }*/ - - const data = e.data || {}; - - if (data.proctoringIsActive) + window.addEventListener("message", function (e) + { + if (e.data.indexOf("proctoringReady_") === 0) { - proctoringOK = true; + sendMessage(); } }); - - setTimeout(function () { - if (!proctoringOK) - { - top.location.href='resetconnection.php'; - } - }, 1000); -})(); \ No newline at end of file +})(); diff --git a/cis/testtool/frage.css b/cis/testtool/frage.css new file mode 100644 index 000000000..04024ae53 --- /dev/null +++ b/cis/testtool/frage.css @@ -0,0 +1,30 @@ +.proctoring-blocker +{ + position: fixed; + inset: 0; + z-index: 99999; + backdrop-filter: blur(6px); + pointer-events: all; + user-select: none; +} + +.proctoring-blocker.hidden +{ + display: none !important; +} + +.proctoring-text +{ + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + color: #fff; + font-size: 16px; + font-family: sans-serif; +} + +.proctoring-blur-fallback +{ + filter: blur(6px); +} diff --git a/cis/testtool/frage.php b/cis/testtool/frage.php index 4267d6a13..bf2ee24c5 100644 --- a/cis/testtool/frage.php +++ b/cis/testtool/frage.php @@ -183,7 +183,9 @@ if(!isset($_SESSION['pruefling_id'])) die($p->t('testtool/bitteZuerstAnmelden')); if (!empty($_SESSION['externe_ueberwachung']) && isset($_SESSION['externe_ueberwachung_verified'])): ?> - + + + Loading...
'; + document.body.appendChild(blocker); + } + document.documentElement.classList.add("proctoring-blur-fallback"); + } + + function block() { + showBlocker(); + blocker.classList.remove("hidden"); + } + + function unblock() { + document.documentElement.classList.remove("proctoring-blur-fallback"); + if (!blocker) return; + blocker.classList.add("hidden"); + } + + const blockTimer = setTimeout(function () { + if (!ok) + block(); + }, 1500); + + window.addEventListener("message", function (e) { + const data = e.data || {}; + + if (data.type === "proctoringReady") + { + ok = true; + clearTimeout(blockTimer); + unblock(); + } + }); + + setTimeout(function () { + if (!ok) { + top.location.href = "resetconnection.php"; + } + }, 3000); +})(); + + diff --git a/cis/testtool/index.php b/cis/testtool/index.php index 9aa6c3f84..6f2cfac26 100644 --- a/cis/testtool/index.php +++ b/cis/testtool/index.php @@ -22,6 +22,7 @@ if ((isset($_SESSION['externe_ueberwachung']) && $_SESSION['externe_ueberwachung + '; echo '
@@ -741,6 +741,12 @@ else // LOGIN Site (vor Login) '.$p->t('testtool/confirmationText').'

+ + '.$p->t('testtool/dsgvoConfirmText').' +

+ + '.$p->t('testtool/procotoringConfirmText').' +

diff --git a/locale/de-AT/testtool.php b/locale/de-AT/testtool.php index 6977704cc..b2a1dc38a 100644 --- a/locale/de-AT/testtool.php +++ b/locale/de-AT/testtool.php @@ -53,6 +53,8 @@ $this->phrasen['testtool/fuerFolgendeStgAngemeldet']='Für folgende Studiengäng $this->phrasen['testtool/invalideGebiete']='Ein oder mehrere Fragengebiet/e inkorrekt!
Bitte melden Sie dies der Betreuungsperson.'; $this->phrasen['testtool/confirmationText']='Ich bestätige, den Online-Reihungstest persönlich, selbständig, ohne Hilfe einer zusätzlichen Person und ohne Hilfsmittel zu absolvieren.
I confirm that I will complete the online placement test personally, independently, without the help of an additional person and without any aids.
'; +$this->phrasen['testtool/dsgvoConfirmText']='Ich habe die Datenschutzerklärung gelesen.'; +$this->phrasen['testtool/procotoringConfirmText']='Ich stimme der digitalen Beaufsichtigung beim Online-Reihungstest (Proctoring) zu.'; $this->phrasen['testtool/loginNoetig']='Bitte beachten Sie, dass der Reihungstest erst unmittelbar vor Ihrem Reihungstesttermin von uns aktiviert wird.
Please note that the test will be activated by us immediately before your placement test date.'; $this->phrasen['testtool/start']='Reihungstest jetzt starten'; From ef8314c33a2f431241e266e6b4f0292c12694f7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20=C3=96sterreicher?= Date: Wed, 21 Jan 2026 15:32:52 +0100 Subject: [PATCH 56/58] Config to check Extension LVEvaluierung is enabled --- include/tw/cis_menu_lv.inc.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/tw/cis_menu_lv.inc.php b/include/tw/cis_menu_lv.inc.php index c6dad40e3..03ce016ca 100644 --- a/include/tw/cis_menu_lv.inc.php +++ b/include/tw/cis_menu_lv.inc.php @@ -501,8 +501,8 @@ if((!defined('CIS_LEHRVERANSTALTUNG_ANRECHNUNG_ANZEIGEN') || CIS_LEHRVERANSTALTU } // LV-Evaluierung NEU -if(defined('CIS_EVALUIERUNG_ANZEIGEN_STG') - && CIS_EVALUIERUNG_ANZEIGEN_STG +if(defined('CIS_LEHRVERANSTALTUNG_EVALUIERUNG_ANZEIGEN') + && CIS_LEHRVERANSTALTUNG_EVALUIERUNG_ANZEIGEN && $angemeldet && (!defined('CIS_EVALUIERUNG_ANZEIGEN_STG') || in_array($lv->studiengang_kz, unserialize(CIS_EVALUIERUNG_ANZEIGEN_STG))) && ($rechte->isBerechtigt('extension/lvevaluierung_init'))) From f867e60702a5c6e567dc113c078ab782665639f7 Mon Sep 17 00:00:00 2001 From: Harald Bamberger Date: Wed, 21 Jan 2026 17:37:23 +0100 Subject: [PATCH 57/58] fix use of config FAS_BUCHUNGSTYP_FIXE_KOSTENSTELLE to override studiengang_kz in public.tbl_konto --- application/controllers/api/frontend/v1/stv/Konto.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/controllers/api/frontend/v1/stv/Konto.php b/application/controllers/api/frontend/v1/stv/Konto.php index 384452f3e..ecd58671a 100644 --- a/application/controllers/api/frontend/v1/stv/Konto.php +++ b/application/controllers/api/frontend/v1/stv/Konto.php @@ -239,7 +239,7 @@ class Konto extends FHCAPI_Controller $data[$field] = $this->input->post($field); if (defined('FAS_BUCHUNGSTYP_FIXE_KOSTENSTELLE') && isset(unserialize(FAS_BUCHUNGSTYP_FIXE_KOSTENSTELLE)[$data['buchungstyp_kurzbz']])) { - $data['kostenstelle'] = unserialize(FAS_BUCHUNGSTYP_FIXE_KOSTENSTELLE)[$data['buchungstyp_kurzbz']]; + $data['studiengang_kz'] = unserialize(FAS_BUCHUNGSTYP_FIXE_KOSTENSTELLE)[$data['buchungstyp_kurzbz']]; } $result = []; From 3e46e947360c3b23d6d64a5c188d2ddc0d598a30 Mon Sep 17 00:00:00 2001 From: Harald Bamberger Date: Tue, 27 Jan 2026 11:07:46 +0100 Subject: [PATCH 58/58] quick fix to prevent pruefunglist from being empty due to js error in combination with tabulator sort persistence --- .../Details/Pruefung/Pruefunglist.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/public/js/components/Stv/Studentenverwaltung/Details/Pruefung/Pruefunglist.js b/public/js/components/Stv/Studentenverwaltung/Details/Pruefung/Pruefunglist.js index 62cd47547..58d42666f 100644 --- a/public/js/components/Stv/Studentenverwaltung/Details/Pruefung/Pruefunglist.js +++ b/public/js/components/Stv/Studentenverwaltung/Details/Pruefung/Pruefunglist.js @@ -91,7 +91,15 @@ export default{ layoutColumnsOnNewData: false, height: 'auto', index: 'pruefung_id', - persistenceID: 'stv-details-pruefung-list-2025112402' + persistenceID: 'stv-details-pruefung-list-2026012701', + persistence: { + sort: false, + columns: ["width", "visible", "frozen"], + filter: false, + headerFilter: false, + group: false, + page: false + } }, tabulatorEvents: [ {