From 9b3b571bd9127dc5e18dcc806574107e53f7218b Mon Sep 17 00:00:00 2001 From: ma0068 Date: Thu, 6 Oct 2022 08:55:11 +0200 Subject: [PATCH 001/246] Erweiterung Phrasen --- locale/de-AT/benotungstool.php | 1 + locale/en-US/benotungstool.php | 1 + 2 files changed, 2 insertions(+) diff --git a/locale/de-AT/benotungstool.php b/locale/de-AT/benotungstool.php index 3c8063936..a38aa31f3 100644 --- a/locale/de-AT/benotungstool.php +++ b/locale/de-AT/benotungstool.php @@ -171,6 +171,7 @@ $this->phrasen['benotungstool/zeunis']='Zeugnis'; $this->phrasen['benotungstool/handbuch']='Handbuch'; $this->phrasen['benotungstool/punkte']='Punkte'; $this->phrasen['benotungstool/importAnweisung']='Kopieren Sie die Spalten Personenkennzeichen und Note aus der Notenliste (bzw. StudentenUid und Note aus dem MoodleExport) und fügen Sie diese in folgendes Feld ein'; +$this->phrasen['benotungstool/importAnweisungNachp']='Kopieren Sie die Spalten Personenkennzeichen, Datum und Note aus der Notenliste (bzw. StudentenUid, Datum und Note aus dem MoodleExport) und fügen Sie diese in folgendes Feld ein'; $this->phrasen['benotungstool/pruefung']='Prüfung'; $this->phrasen['benotungstool/notenlisteImport']='Notenliste für den LV-Noten-Import (Excel)'; $this->phrasen['benotungstool/bearbeitetvon']='Bearbeitet von'; diff --git a/locale/en-US/benotungstool.php b/locale/en-US/benotungstool.php index 17f78d2ba..72f29256e 100644 --- a/locale/en-US/benotungstool.php +++ b/locale/en-US/benotungstool.php @@ -170,6 +170,7 @@ $this->phrasen['benotungstool/zeunis']='Transcript'; $this->phrasen['benotungstool/handbuch']='Handbook'; $this->phrasen['benotungstool/punkte']='Points'; $this->phrasen['benotungstool/importAnweisung']='Copy the columns "personal identifier" and "grade" from the grade list (or "student ID number" and "grade" from the moodle export file) and insert them in the following field'; +$this->phrasen['benotungstool/importAnweisungNachp']='Copy the columns "personal identifier", "date" and "grade" from the grade list (or "student ID number", "date" and "grade" from the moodle export file) and insert them in the following field'; $this->phrasen['benotungstool/pruefung']='Examination'; $this->phrasen['benotungstool/notenlisteImport']='Grade list for the subject grade import (Excel)'; $this->phrasen['benotungstool/geaenderteNotenVorhanden']='There are changed grades. Please send the changes to the assistant by clicking "Approval"'; From 54411f4de776fe238e6bd78d5b570f5f1e371bfb Mon Sep 17 00:00:00 2001 From: ma0068 Date: Wed, 12 Oct 2022 15:06:07 +0200 Subject: [PATCH 002/246] Benotungstool: Importfunktion Termin2 --- .../benotungstool/lvgesamtnoteverwalten.php | 144 ++++++- .../benotungstool/nachpruefungeintragen.php | 390 +++++++++++------- 2 files changed, 392 insertions(+), 142 deletions(-) diff --git a/cis/private/lehre/benotungstool/lvgesamtnoteverwalten.php b/cis/private/lehre/benotungstool/lvgesamtnoteverwalten.php index 916f2b4e3..6a160c646 100644 --- a/cis/private/lehre/benotungstool/lvgesamtnoteverwalten.php +++ b/cis/private/lehre/benotungstool/lvgesamtnoteverwalten.php @@ -402,6 +402,7 @@ foreach ($noten_obj->result as $row) url += '&typ='+typ; url += '&'+ts; + $.ajax({ type:"GET", url: url, @@ -602,6 +603,42 @@ foreach ($noten_obj->result as $row) $('#noteimporttextarea').focus(); } + // **** + // * Oeffnet ein Fenster fuer den Import von Noten für die Nachprüfung aus dem Excel + // **** + function GradeImportNachp() + { + var str = "
"; + str += ""; + var anlegendiv = document.getElementById("nachpruefung_div"); + var y = getOffset('y'); y = y+50; anlegendiv.style.top = y+"px"; + str += ''; + str += ''; + str += "
X
t('benotungstool/importAnweisungNachp');?>:
' onclick='saveGradeBulkNachp(\"Termin2\");'>"; + str += "
"; + anlegendiv.innerHTML = str; + anlegendiv.style.visibility = "visible"; + $('#noteimporttextareaNachp').focus(); + } + + // **** + // * Oeffnet ein Fenster fuer den Import von Noten für Termin3 aus dem Excel + // **** + function GradeImportTermin3() + { + var str = "
"; + str += ""; + var anlegendiv = document.getElementById("nachpruefung_div"); + var y = getOffset('y'); y = y+50; anlegendiv.style.top = y+"px"; + str += ''; + str += ''; + str += "
X
t('benotungstool/importAnweisungNachp');?>:
' onclick='saveGradeBulkNachp(\"Termin3\");'>"; + str += "
"; + anlegendiv.innerHTML = str; + anlegendiv.style.visibility = "visible"; + $('#noteimporttextareaTermin3').focus(); + } + // Speichert die Noten ueber den Import function saveGradeBulk() { @@ -698,6 +735,105 @@ foreach ($noten_obj->result as $row) } } + // Speichert die Noten der Nachprüfung ueber den Import + function saveGradeBulkNachp(typ) + { + data = $('#noteimporttextareaNachp').val(); + closeDiv(); + + //Reihen ermitteln + var rows = data.split("\n"); + var i=0; + var params=''; + alertMsg = ''; + + var gradedata = {}; + var validGrades = ''; + + result as $row_note) + { + if ($row_note->lehre && $row_note->aktiv) + $gradesArray[] = '"' . $row_note->anmerkung . '"'; + } + // Output JS variable with valid grades + echo 'var validGrades = [' . implode(',', $gradesArray) . '];'; + } + ?> + + for(row in rows) + { + zeile = rows[row].split(" "); + + + + if (zeile[0]!='' && zeile[1]!='' && zeile[2]!='') + { + gradedata['student_uid_'+i]=zeile[0]; + gradedata['datumNachp_'+i]=zeile[1]; + + + i++; + } + } + + if (alertMsg != "") + alert(alertMsg); + + if (i>0) + { + + var jetzt = new Date(); + var ts = jetzt.getTime(); + var url= ''; + url += '&sammel=1'; + url += '&typ=' + typ; + url += '&submit=1&'+ts; + $.ajax({ + type:"POST", + url: url, + data: gradedata, + success:function(result) + { + var resp = result; + if (resp!='') + { + alert(resp); + } + window.location.reload(); + }, + error:function(result) + { + alert('Request Nachprüfung fehlgeschlagen'); + } + }); + + } + else + { + alert('t('benotungstool/hilfeImport');?>'); + } + } + //--> @@ -1052,11 +1188,15 @@ $htmlstring .= "" . $p->t('benotungstool/punkte') . ' / ' . $p->t('benotungs if (defined('CIS_GESAMTNOTE_PRUEFUNG_TERMIN2') && CIS_GESAMTNOTE_PRUEFUNG_TERMIN2) { - $htmlstring .= "" . $p->t('benotungstool/nachpruefung') . ""; + $htmlstring .= "
" . $p->t('benotungstool/nachpruefung') . "
+ + "; } if (defined('CIS_GESAMTNOTE_PRUEFUNG_TERMIN3') && CIS_GESAMTNOTE_PRUEFUNG_TERMIN3) { - $htmlstring .= "" . $p->t('benotungstool/nachpruefung2') . ""; + $htmlstring .= "
" . $p->t('benotungstool/nachpruefung') . "
+ + "; } if (defined('CIS_GESAMTNOTE_PRUEFUNG_KOMMPRUEF') && CIS_GESAMTNOTE_PRUEFUNG_KOMMPRUEF) { diff --git a/cis/private/lehre/benotungstool/nachpruefungeintragen.php b/cis/private/lehre/benotungstool/nachpruefungeintragen.php index 0ad985e76..81545a7f6 100644 --- a/cis/private/lehre/benotungstool/nachpruefungeintragen.php +++ b/cis/private/lehre/benotungstool/nachpruefungeintragen.php @@ -41,10 +41,15 @@ require_once('../../../../include/benutzerfunktion.class.php'); require_once('../../../../include/benutzer.class.php'); require_once('../../../../include/student.class.php'); require_once('../../../../include/notenschluessel.class.php'); +require_once('../../../../include/phrasen.class.php'); + if (!$db = new basis_db()) die('Fehler beim Herstellen der Datenbankverbindung'); +$sprache = getSprache(); +$p = new phrasen($sprache); + $user = get_uid(); if(!check_lektor($user)) @@ -52,6 +57,7 @@ if(!check_lektor($user)) $lehreinheit_id=''; +$lehreinheit_id_pr=''; if(isset($_GET['lvid']) && is_numeric($_GET['lvid'])) //Lehrveranstaltung_id $lvid = $_GET['lvid']; @@ -62,60 +68,17 @@ if(isset($_GET['lehreinheit_id']) && is_numeric($_GET['lehreinheit_id'])) //Lehr $lehreinheit_id = $_GET['lehreinheit_id']; if(isset($_GET['lehreinheit_id_pr']) && is_numeric($_GET['lehreinheit_id_pr'])) //Lehreinheit_id der pruefung - $lehreinheit_id = $_GET['lehreinheit_id_pr']; - -if(isset($_GET['datum'])) -{ - $datum = $_GET['datum']; - $datum_obj = new datum(); - $datum = $datum_obj->checkformatDatum($datum, 'Y-m-d', true) OR die('Invalid date format'); -} -else - die('Fehlerhafte Parameteruebergabe'); - -//Laden der Lehrveranstaltung -$lv_obj = new lehrveranstaltung(); -if(!$lv_obj->load($lvid)) - die($lv_obj->errormsg); - -//Studiengang laden -$stg_obj = new studiengang($lv_obj->studiengang_kz); + $lehreinheit_id_pr = $_GET['lehreinheit_id_pr']; if(isset($_GET['stsem'])) $stsem = $_GET['stsem']; else $stsem = ''; - -$uebung_id = (isset($_GET['uebung_id'])?$_GET['uebung_id']:''); -$uid = (isset($_GET['uid'])?$_GET['uid']:''); - //Studiensemester laden $stsem_obj = new studiensemester(); if($stsem=='') $stsem = $stsem_obj->getaktorNext(); -$student_uid = $_REQUEST["student_uid"]; - -$note = $_REQUEST["note"]; -if(isset($_REQUEST['punkte'])) - $punkte = $_REQUEST['punkte']; -else - $punkte = ''; - -$punkte = str_replace(',','.',$punkte); - -if($punkte!='') -{ - // Bei Punkteeingabe wird die Note nochmals geprueft und ggf korrigiert - $notenschluessel = new notenschluessel(); - $note_pruef = $notenschluessel->getNote($punkte, $lvid, $stsem); - if($note_pruef!=$note) - { - $note = $note_pruef; - $note_dirty=true; - } -} - if(!isset($_GET['typ'])) { $typ='Termin2'; @@ -128,16 +91,151 @@ else die('Typ ist ungueltig'); } -if($note=='') - $note = 9; - -$old_note = $note; - -// lvgesamtnote für studenten speichern -if (isset($_REQUEST["submit"]) && ($_REQUEST["student_uid"] != '') ) +if (isset($_REQUEST['sammel']) && $_REQUEST["sammel"] == 1) +{ + foreach ($_POST as $row=>$val) + { + if(mb_strstr(mb_strtolower($row), 'student_uid_')) + { + $id=mb_substr($row, mb_strlen('student_uid_')); + + $student_uid = $_POST['student_uid_'.$id]; + $note = null; + $punkte = null; + $datum = null; + if(isset($_POST['note_'.$id])) + $note = $_POST['note_'.$id]; + elseif(isset($_POST['punkte_'.$id])) + $punkte = $_POST['punkte_'.$id]; + else + { + $response.="\nNote oder Punkte fehlen"; + continue; + } + $punkte=str_replace(',','.', $punkte); + + $datum = $_POST['datumNachp_'.$id]; + + // //check ob Matrikelnummer anstelle der student_uid übergeben wurde + // + // + // $student = new student(); + // + // + // $response2 = true; + // if (!$student->checkIfValidStudentUID($student_uid)) + // { + // //UID ermitteln + // if(!$student_uid = $student->getUidFromMatrikelnummer($student_uid)) + // { + // $response2 = false; + // $response2.="\n".$p->t('benotungstool/studentMitMatrikelnummerExistiertNicht',array($student_uid)); + // continue; + // } + // } + + + $lehreinheit_id = getLehreinheit($db, $lvid, $student_uid, $stsem); + + if(isset($_POST['student_uid_'.$id]) && (isset($_POST['note_'.$id]) || isset($_POST['punkte_'.$id])) && isset($_POST['datumNachp_'.$id])) + { + // echo "\ndb " . " lvid ". $lvid . " note " . $note . " student_uid " . $student_uid . " datum " . $datum . " studiensem " . + // $stsem . " lehreinheit_id_pr " . $lehreinheit_id . " typ " . $typ . "\n"; + + $response = savePruefung($lvid, $student_uid, $stsem, $lehreinheit_id, $datum, $typ, $note, $punkte); + + echo "\ndb " . " lvid ". $lvid . " note " . $note . " student_uid " . $student_uid . " datum " . $datum . " studiensem " . + $stsem . " lehreinheit_id_pr " . $lehreinheit_id . " typ " . $typ . " response" . $response . "\n"; + // echo $response; + + } + else + { + echo "\n fehlende oder fehlerhafte Inputparameter"; + } + } + } + +} +else +{ + // Einzelupdate + + if(isset($_GET['datum']) ) + { + $datum = $_GET['datum']; + $datum_obj = new datum(); + $datum = $datum_obj->checkformatDatum($datum, 'Y-m-d', true) OR die('Invalid date format'); + } + + // echo "Variante Einzel"; + else + die('Fehlerhafte Parameteruebergabe'); + + $student_uid = $_REQUEST["student_uid"]; + + $note = $_REQUEST["note"]; + if(isset($_REQUEST['punkte'])) + $punkte = $_REQUEST['punkte']; + else + $punkte = ''; + + $punkte = str_replace(',','.',$punkte); + + if($punkte!='') + { + // Bei Punkteeingabe wird die Note nochmals geprueft und ggf korrigiert + $notenschluessel = new notenschluessel(); + $note_pruef = $notenschluessel->getNote($punkte, $lvid, $stsem); + if($note_pruef!=$note) + { + $note = $note_pruef; + $note_dirty=true; + } + } + + if($note=='') + $note = 9; + + $old_note = $note; + + //Laden der Lehrveranstaltung + $lv_obj = new lehrveranstaltung(); + if(!$lv_obj->load($lvid)) + die($lv_obj->errormsg); + + //Studiengang laden + $stg_obj = new studiengang($lv_obj->studiengang_kz); + + $uebung_id = (isset($_GET['uebung_id'])?$_GET['uebung_id']:''); + $uid = (isset($_GET['uid'])?$_GET['uid']:''); + + // lvgesamtnote für studenten speichern + if (isset($_REQUEST["submit"]) && ($_REQUEST["student_uid"] != '') ) + { + // Die Pruefung muss einer Lehreinheit zugeordnet werden + // deshalb wird hier versucht eine passende Lehreinheit zu ermitteln. + + $lehreinheit_id = getLehreinheit($db, $lvid, $student_uid, $stsem); + + $response = savePruefung($lvid, $student_uid, $stsem, $lehreinheit_id, $datum, $typ, $note); + echo $response; + } + else + echo "Fehler beim Eintragen der Prüfungen"; + +} + +/** + * Berechnet Lehreinheit auf Basis LV-Daten + * @param string $db Datenbankvariable + * @param string $student_uid student_uid + * @param int $lvid Lehrveranstaltungsid + * @param string $stsem Studiensemester im Format 'WSYYYY' + * @return String LehreinheitId + */ +function getLehreinheit($db, $lvid, $student_uid, $stsem) { - // Die Pruefung muss einer Lehreinheit zugeordnet werden - // deshalb wird hier versucht eine passende Lehreinheit zu ermitteln. $le_arr = array(); $qry_stud = "SELECT lehreinheit_id, lehrform_kurzbz FROM @@ -158,104 +256,117 @@ if (isset($_REQUEST["submit"]) && ($_REQUEST["student_uid"] != '') ) } } - if (!in_array($lehreinheit_id,$le_arr)) + //if (!in_array($lehreinheit_id,$le_arr)) $lehreinheit_id = $le_arr[0]; + return $lehreinheit_id; +} + +/** + * Prüfung speichern + */ +function savePruefung($lvid, $student_uid, $stsem, $lehreinheit_id, $datum, $typ, $note, $punkte=null) +{ $jetzt = date("Y-m-d H:i:s"); + global $user; //, $note, $punkte, $datum; - $pr = new Pruefung(); - - // Wenn eine Pruefung angelegt wird, wird zuerst eine Pruefung mit 1. Termin angelegt - // und dort die Zeugnisnote gespeichert - if($pr->getPruefungen($student_uid, "Termin1", $lvid, $stsem)) + if ($typ == "Termin2") { - if ($pr->result) + $pr = new Pruefung(); + // Wenn eine Pruefung angelegt wird, wird zuerst eine Pruefung mit 1. Termin angelegt + // und dort die Zeugnisnote gespeichert + if($pr->getPruefungen($student_uid, "Termin1", $lvid, $stsem)) { - $termin1 = 1; - } - else - { - $lvnote = new lvgesamtnote(); - if ($lvnote->load($lvid, $student_uid, $stsem)) + if ($pr->result) { - $pr_note = $lvnote->note; - $pr_punkte = $lvnote->punkte; - $benotungsdatum = $lvnote->benotungsdatum; + $termin1 = 1; } else { - $pr_note = 9; - $pr_punkte = ''; - $benotungsdatum = $jetzt; + $lvnote = new lvgesamtnote(); + if ($lvnote->load($lvid, $student_uid, $stsem)) + { + $pr_note = $lvnote->note; + $pr_punkte = $lvnote->punkte; + $benotungsdatum = $lvnote->benotungsdatum; + } + else + { + $pr_note = 9; + $pr_punkte = ''; + $benotungsdatum = $jetzt; + } + + $pr_1 = new Pruefung(); + $pr_1->lehreinheit_id = $lehreinheit_id; + $pr_1->student_uid = $student_uid; + $pr_1->mitarbeiter_uid = $user; + $pr_1->note = $pr_note; + $pr_1->punkte = $pr_punkte; + $pr_1->pruefungstyp_kurzbz = "Termin1"; + $pr_1->datum = $benotungsdatum; + $pr_1->anmerkung = ""; + $pr_1->insertamum = $jetzt; + $pr_1->insertvon = $user; + $pr_1->updateamum = null; + $pr_1->updatevon = null; + $pr_1->ext_id = null; + $pr_1->new = true; + $pr_1->save(); + $response = "neu T1"; } - $pr_1 = new Pruefung(); - $pr_1->lehreinheit_id = $lehreinheit_id; - $pr_1->student_uid = $student_uid; - $pr_1->mitarbeiter_uid = $user; - $pr_1->note = $pr_note; - $pr_1->punkte = $pr_punkte; - $pr_1->pruefungstyp_kurzbz = "Termin1"; - $pr_1->datum = $benotungsdatum; - $pr_1->anmerkung = ""; - $pr_1->insertamum = $jetzt; - $pr_1->insertvon = $user; - $pr_1->updateamum = null; - $pr_1->updatevon = null; - $pr_1->ext_id = null; - $pr_1->new = true; - $pr_1->save(); + $prTermin2 = new Pruefung(); + $pr_2 = new Pruefung(); + + // Die Pruefung wird als Termin2 eingetragen + if ($prTermin2->getPruefungen($student_uid, 'Termin2', $lvid, $stsem)) + { + if ($prTermin2->result) + { + $pr_2->load($prTermin2->result[0]->pruefung_id); + $pr_2->new = null; + $pr_2->updateamum = $jetzt; + $pr_2->updatevon = $user; + $old_note = $pr_2->note; + $pr_2->note = $note; + $pr_2->punkte = $punkte; + $pr_2->datum = $datum; + $pr_2->anmerkung = ""; + $response = "update T2"; + } + else + { + $pr_2->lehreinheit_id = $lehreinheit_id; + $pr_2->student_uid = $student_uid; + $pr_2->mitarbeiter_uid = $user; + $pr_2->note = $note; + $pr_2->punkte = $punkte; + $pr_2->pruefungstyp_kurzbz = $typ; + $pr_2->datum = $datum; + $pr_2->anmerkung = ""; + $pr_2->insertamum = $jetzt; + $pr_2->insertvon = $user; + $pr_2->updateamum = null; + $pr_2->updatevon = null; + $pr_2->ext_id = null; + $pr_2->new = true; + $old_note = -1; + $response = "new T2"; + } + $pr_2->save(); + } } } - - - $prTermin2 = new Pruefung(); - $pr_2 = new Pruefung(); - - // Die Pruefung wird als Termin2 eingetragen - if ($prTermin2->getPruefungen($student_uid, $typ, $lvid, $stsem)) + else { - if ($prTermin2->result) - { - $pr_2->load($prTermin2->result[0]->pruefung_id); - $pr_2->new = null; - $pr_2->updateamum = $jetzt; - $pr_2->updatevon = $user; - $old_note = $pr_2->note; - $pr_2->note = $note; - $pr_2->punkte = $punkte; - $pr_2->datum = $datum; - $pr_2->anmerkung = ""; - } - else - { - $pr_2->lehreinheit_id = $lehreinheit_id; - $pr_2->student_uid = $student_uid; - $pr_2->mitarbeiter_uid = $user; - $pr_2->note = $note; - $pr_2->punkte = $punkte; - $pr_2->pruefungstyp_kurzbz = $typ; - $pr_2->datum = $datum; - $pr_2->anmerkung = ""; - $pr_2->insertamum = $jetzt; - $pr_2->insertvon = $user; - $pr_2->updateamum = null; - $pr_2->updatevon = null; - $pr_2->ext_id = null; - $pr_2->new = true; - $old_note = -1; - } - $pr_2->save(); + $response = "no existing T3"; } - - // Wenn eine Pruefung eingetragen wird, wird danach die LV-Note korrigiert - $jetzt = date("Y-m-d H:i:s"); - - $lvid = $_REQUEST["lvid"]; + //Gesamtnote updaten $lvgesamtnote = new lvgesamtnote(); - if (!$lvgesamtnote->load($lvid, $student_uid, $stsem)) - { + if (!$lvgesamtnote->load($lvid, $student_uid, $stsem)) + { $lvgesamtnote->student_uid = $student_uid; $lvgesamtnote->lehrveranstaltung_id = $lvid; $lvgesamtnote->studiensemester_kurzbz = $stsem; @@ -272,9 +383,9 @@ if (isset($_REQUEST["submit"]) && ($_REQUEST["student_uid"] != '') ) $lvgesamtnote->insertvon = $user; $new = true; $response = "neu"; - } - else - { + } + else + { $lvgesamtnote->note = $note; $lvgesamtnote->punkte = $punkte; $lvgesamtnote->benotungsdatum = $jetzt; @@ -286,12 +397,11 @@ if (isset($_REQUEST["submit"]) && ($_REQUEST["student_uid"] != '') ) else $response = "update"; } + if (!$lvgesamtnote->save($new)) - echo "".$lvgesamtnote->errormsg.""; + return $lvgesamtnote->errormsg; else - echo $response; + return $response; } -else - echo "Fehler beim Eintragen der Prüfungen"; ?> From 035d196ae5cb45b44a4f2f863e7bf5fd0ddbe872 Mon Sep 17 00:00:00 2001 From: ma0068 Date: Thu, 13 Oct 2022 08:04:10 +0200 Subject: [PATCH 003/246] Logik Matrikelnummer StudentenId --- .../benotungstool/nachpruefungeintragen.php | 34 +++++++++---------- 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/cis/private/lehre/benotungstool/nachpruefungeintragen.php b/cis/private/lehre/benotungstool/nachpruefungeintragen.php index 81545a7f6..d1a7e2326 100644 --- a/cis/private/lehre/benotungstool/nachpruefungeintragen.php +++ b/cis/private/lehre/benotungstool/nachpruefungeintragen.php @@ -99,6 +99,8 @@ if (isset($_REQUEST['sammel']) && $_REQUEST["sammel"] == 1) { $id=mb_substr($row, mb_strlen('student_uid_')); + $response2 = ''; + $student_uid = $_POST['student_uid_'.$id]; $note = null; $punkte = null; @@ -115,24 +117,21 @@ if (isset($_REQUEST['sammel']) && $_REQUEST["sammel"] == 1) $punkte=str_replace(',','.', $punkte); $datum = $_POST['datumNachp_'.$id]; + $datum_obj = new datum(); + $datum = $datum_obj->checkformatDatum($datum, 'Y-m-d', true) OR die('Invalid date format'); // //check ob Matrikelnummer anstelle der student_uid übergeben wurde - // - // - // $student = new student(); - // - // - // $response2 = true; - // if (!$student->checkIfValidStudentUID($student_uid)) - // { - // //UID ermitteln - // if(!$student_uid = $student->getUidFromMatrikelnummer($student_uid)) - // { - // $response2 = false; - // $response2.="\n".$p->t('benotungstool/studentMitMatrikelnummerExistiertNicht',array($student_uid)); - // continue; - // } - // } + + $student = new student(); + if (!$student->checkIfValidStudentUID($student_uid)) + { + //UID ermitteln + if(!$student_uid = $student->getUidFromMatrikelnummer($student_uid)) + { + $response2.="\n".$p->t('benotungstool/studentMitMatrikelnummerExistiertNicht',array($student_uid)); + continue; + } + } $lehreinheit_id = getLehreinheit($db, $lvid, $student_uid, $stsem); @@ -146,7 +145,7 @@ if (isset($_REQUEST['sammel']) && $_REQUEST["sammel"] == 1) echo "\ndb " . " lvid ". $lvid . " note " . $note . " student_uid " . $student_uid . " datum " . $datum . " studiensem " . $stsem . " lehreinheit_id_pr " . $lehreinheit_id . " typ " . $typ . " response" . $response . "\n"; - // echo $response; + echo $response2; } else @@ -168,7 +167,6 @@ else $datum = $datum_obj->checkformatDatum($datum, 'Y-m-d', true) OR die('Invalid date format'); } - // echo "Variante Einzel"; else die('Fehlerhafte Parameteruebergabe'); From 29fc5181bf237ba65337de647f1180c4d9420b9d Mon Sep 17 00:00:00 2001 From: ma0068 Date: Thu, 13 Oct 2022 10:16:26 +0200 Subject: [PATCH 004/246] Importfunktion Termin3 --- .../benotungstool/lvgesamtnoteverwalten.php | 2 +- .../benotungstool/nachpruefungeintragen.php | 48 +++++++++++++++++-- 2 files changed, 44 insertions(+), 6 deletions(-) diff --git a/cis/private/lehre/benotungstool/lvgesamtnoteverwalten.php b/cis/private/lehre/benotungstool/lvgesamtnoteverwalten.php index 6a160c646..80bb7c5a5 100644 --- a/cis/private/lehre/benotungstool/lvgesamtnoteverwalten.php +++ b/cis/private/lehre/benotungstool/lvgesamtnoteverwalten.php @@ -1194,7 +1194,7 @@ if (defined('CIS_GESAMTNOTE_PRUEFUNG_TERMIN2') && CIS_GESAMTNOTE_PRUEFUNG_TERMIN } if (defined('CIS_GESAMTNOTE_PRUEFUNG_TERMIN3') && CIS_GESAMTNOTE_PRUEFUNG_TERMIN3) { - $htmlstring .= "
" . $p->t('benotungstool/nachpruefung') . "
+ $htmlstring .= "
" . $p->t('benotungstool/nachpruefung2') . "
"; } diff --git a/cis/private/lehre/benotungstool/nachpruefungeintragen.php b/cis/private/lehre/benotungstool/nachpruefungeintragen.php index d1a7e2326..e8553ce7b 100644 --- a/cis/private/lehre/benotungstool/nachpruefungeintragen.php +++ b/cis/private/lehre/benotungstool/nachpruefungeintragen.php @@ -120,8 +120,7 @@ if (isset($_REQUEST['sammel']) && $_REQUEST["sammel"] == 1) $datum_obj = new datum(); $datum = $datum_obj->checkformatDatum($datum, 'Y-m-d', true) OR die('Invalid date format'); - // //check ob Matrikelnummer anstelle der student_uid übergeben wurde - + //check ob Matrikelnummer anstelle der student_uid übergeben wurde $student = new student(); if (!$student->checkIfValidStudentUID($student_uid)) { @@ -138,9 +137,6 @@ if (isset($_REQUEST['sammel']) && $_REQUEST["sammel"] == 1) if(isset($_POST['student_uid_'.$id]) && (isset($_POST['note_'.$id]) || isset($_POST['punkte_'.$id])) && isset($_POST['datumNachp_'.$id])) { - // echo "\ndb " . " lvid ". $lvid . " note " . $note . " student_uid " . $student_uid . " datum " . $datum . " studiensem " . - // $stsem . " lehreinheit_id_pr " . $lehreinheit_id . " typ " . $typ . "\n"; - $response = savePruefung($lvid, $student_uid, $stsem, $lehreinheit_id, $datum, $typ, $note, $punkte); echo "\ndb " . " lvid ". $lvid . " note " . $note . " student_uid " . $student_uid . " datum " . $datum . " studiensem " . @@ -356,6 +352,48 @@ function savePruefung($lvid, $student_uid, $stsem, $lehreinheit_id, $datum, $typ } } } + elseif ($typ == "Termin3") + { + $prTermin3 = new Pruefung(); + $pr_3 = new Pruefung(); + + if ($prTermin3->getPruefungen($student_uid, 'Termin3', $lvid, $stsem)) + { + if ($prTermin3->result) + { + $pr_3->load($prTermin3->result[0]->pruefung_id); + $pr_3->new = null; + $pr_3->updateamum = $jetzt; + $pr_3->updatevon = $user; + $old_note = $pr_3->note; + $pr_3->note = $note; + $pr_3->punkte = $punkte; + $pr_3->datum = $datum; + $pr_3->anmerkung = ""; + $response = "Prüfung Termin3 aktualisiert"; + } + else + { + $pr_3->lehreinheit_id = $lehreinheit_id; + $pr_3->student_uid = $student_uid; + $pr_3->mitarbeiter_uid = $user; + $pr_3->note = $note; + $pr_3->punkte = $punkte; + $pr_3->pruefungstyp_kurzbz = $typ; + $pr_3->datum = $datum; + $pr_3->anmerkung = ""; + $pr_3->insertamum = $jetzt; + $pr_3->insertvon = $user; + $pr_3->updateamum = null; + $pr_3->updatevon = null; + $pr_3->ext_id = null; + $pr_3->new = true; + $old_note = -1; + $response = "neue Prüfung Termin3"; + } + $pr_3->save(); + } + } else { $response = "no existing T3"; From ce3cea5515721e933b621cf9f2902ddca5aecf21 Mon Sep 17 00:00:00 2001 From: ma0068 Date: Thu, 13 Oct 2022 15:36:08 +0200 Subject: [PATCH 005/246] Validierungen Format Datum, Matrikelnr, StudentId, Note --- .../benotungstool/lvgesamtnoteverwalten.php | 61 +++++++++---------- .../benotungstool/nachpruefungeintragen.php | 51 +++++++--------- locale/de-AT/benotungstool.php | 4 +- locale/en-US/benotungstool.php | 1 + 4 files changed, 56 insertions(+), 61 deletions(-) diff --git a/cis/private/lehre/benotungstool/lvgesamtnoteverwalten.php b/cis/private/lehre/benotungstool/lvgesamtnoteverwalten.php index 80bb7c5a5..8a428ff2a 100644 --- a/cis/private/lehre/benotungstool/lvgesamtnoteverwalten.php +++ b/cis/private/lehre/benotungstool/lvgesamtnoteverwalten.php @@ -20,33 +20,33 @@ * Gerald Simane-Sequens < gerald.simane-sequens@technikum-wien.at > * Manuela Thamer */ -require_once ('../../../../config/cis.config.inc.php'); -require_once ('../../../../config/global.config.inc.php'); -require_once ('../../../../include/functions.inc.php'); -require_once ('../../../../include/lehrveranstaltung.class.php'); -require_once ('../../../../include/studiengang.class.php'); -require_once ('../../../../include/studiensemester.class.php'); -require_once ('../../../../include/lehreinheit.class.php'); -require_once ('../../../../include/benutzerberechtigung.class.php'); -require_once ('../../../../include/uebung.class.php'); -require_once ('../../../../include/beispiel.class.php'); -require_once ('../../../../include/studentnote.class.php'); -require_once ('../../../../include/datum.class.php'); -require_once ('../../../../include/legesamtnote.class.php'); -require_once ('../../../../include/lvgesamtnote.class.php'); -require_once ('../../../../include/zeugnisnote.class.php'); -require_once ('../../../../include/pruefung.class.php'); -require_once ('../../../../include/person.class.php'); -require_once ('../../../../include/benutzer.class.php'); -require_once ('../../../../include/mitarbeiter.class.php'); -require_once ('../../../../include/mail.class.php'); -require_once ('../../../../include/phrasen.class.php'); -require_once ('../../../../include/note.class.php'); -require_once ('../../../../include/notenschluessel.class.php'); -require_once ('../../../../include/studienplan.class.php'); -require_once ('../../../../include/addon.class.php'); -require_once ('../../../../include/mobilitaet.class.php'); -require_once ('../../../../include/student.class.php'); +require_once('../../../../config/cis.config.inc.php'); +require_once('../../../../config/global.config.inc.php'); +require_once('../../../../include/functions.inc.php'); +require_once('../../../../include/lehrveranstaltung.class.php'); +require_once('../../../../include/studiengang.class.php'); +require_once('../../../../include/studiensemester.class.php'); +require_once('../../../../include/lehreinheit.class.php'); +require_once('../../../../include/benutzerberechtigung.class.php'); +require_once('../../../../include/uebung.class.php'); +require_once('../../../../include/beispiel.class.php'); +require_once('../../../../include/studentnote.class.php'); +require_once('../../../../include/datum.class.php'); +require_once('../../../../include/legesamtnote.class.php'); +require_once('../../../../include/lvgesamtnote.class.php'); +require_once('../../../../include/zeugnisnote.class.php'); +require_once('../../../../include/pruefung.class.php'); +require_once('../../../../include/person.class.php'); +require_once('../../../../include/benutzer.class.php'); +require_once('../../../../include/mitarbeiter.class.php'); +require_once('../../../../include/mail.class.php'); +require_once('../../../../include/phrasen.class.php'); +require_once('../../../../include/note.class.php'); +require_once('../../../../include/notenschluessel.class.php'); +require_once('../../../../include/studienplan.class.php'); +require_once('../../../../include/addon.class.php'); +require_once('../../../../include/mobilitaet.class.php'); +require_once('../../../../include/student.class.php'); $summe_stud = 0; $summe_t2 = 0; @@ -190,7 +190,7 @@ foreach ($noten_obj->result as $row) $noten_array[$row->note]['lehre'] = $row->lehre; $noten_array[$row->note]['lkt_ueberschreibbar'] = $row->lkt_ueberschreibbar; $noten_array[$row->note]['anmerkung'] = $row->anmerkung; - foreach ($sprachen->result AS $s) + foreach ($sprachen->result as $s) $noten_array[$row->note]['bezeichnung_mehrsprachig'][$s->sprache] = $row->bezeichnung_mehrsprachig[$s->sprache]; } @@ -376,7 +376,7 @@ foreach ($noten_obj->result as $row) var datum_test = datum.split("."); if (datum_test[0].length != 2 || datum_test[1].length != 2 || datum_test[2].length!=4 || isNaN(datum_test[2]) || datum_test[1]>12 || datum_test[1]<1 || datum_test[0]>31 || datum_test[0]<1) - alert("Invalid Date Format: DD.MM.YYYY"); + alert("Das Datum entspricht nicht dem Format TT.MM.JJJJ!"); else { var anlegendiv = document.getElementById("nachpruefung_div"); @@ -939,7 +939,6 @@ if (defined('CIS_ANWESENHEITSLISTE_NOTENLISTE_ANZEIGEN') && CIS_ANWESENHEITSLIST { $hrefpath = "../notenliste.xls.php?stg=$stg_obj->studiengang_kz&lvid=$lvid&stsem=$stsem"; echo "
" . $p->t('benotungstool/notenlisteImport') . ""; - } // eingetragene lv-gesamtnoten freigeben @@ -1333,7 +1332,6 @@ if (defined("CIS_GESAMTNOTE_PRUEFUNG_MOODLE_LE_NOTE") && CIS_GESAMTNOTE_PRUEFUNG foreach ($grades as $uid => $data) //Ausgabe Array { - $htmlstring .= ' ' . $db->convert_html_chars($uid) . ' @@ -1465,7 +1463,6 @@ if (defined("CIS_GESAMTNOTE_PRUEFUNG_MOODLE_LE_NOTE") && CIS_GESAMTNOTE_PRUEFUNG // Punkte if (CIS_GESAMTNOTE_PUNKTE) { - $htmlstring .= ' $val) + $errorMatrnr = ''; + $errorDatum = ''; + foreach ($_POST as $row => $val) { if(mb_strstr(mb_strtolower($row), 'student_uid_')) { $id=mb_substr($row, mb_strlen('student_uid_')); - $response2 = ''; - $student_uid = $_POST['student_uid_'.$id]; $note = null; $punkte = null; @@ -114,35 +114,36 @@ if (isset($_REQUEST['sammel']) && $_REQUEST["sammel"] == 1) $response.="\nNote oder Punkte fehlen"; continue; } - $punkte=str_replace(',','.', $punkte); + $punkte=str_replace(',', '.', $punkte); $datum = $_POST['datumNachp_'.$id]; + //check Datumsformat + $checkedDatum = $datum; $datum_obj = new datum(); - $datum = $datum_obj->checkformatDatum($datum, 'Y-m-d', true) OR die('Invalid date format'); + if(!$datum = $datum_obj->checkformatDatum($datum, 'Y-m-d', true)) + { + $errorDatum .="\n".$p->t('benotungstool/datumsformatUnzulaessig', array($checkedDatum)); + continue; + } //check ob Matrikelnummer anstelle der student_uid übergeben wurde $student = new student(); if (!$student->checkIfValidStudentUID($student_uid)) { + $checkedMatrnr = $student_uid; //UID ermitteln if(!$student_uid = $student->getUidFromMatrikelnummer($student_uid)) { - $response2.="\n".$p->t('benotungstool/studentMitMatrikelnummerExistiertNicht',array($student_uid)); + $errorMatrnr.="\n".$p->t('benotungstool/studentMitMatrikelnummerExistiertNicht', array($checkedMatrnr)); continue; } } - $lehreinheit_id = getLehreinheit($db, $lvid, $student_uid, $stsem); if(isset($_POST['student_uid_'.$id]) && (isset($_POST['note_'.$id]) || isset($_POST['punkte_'.$id])) && isset($_POST['datumNachp_'.$id])) { $response = savePruefung($lvid, $student_uid, $stsem, $lehreinheit_id, $datum, $typ, $note, $punkte); - - echo "\ndb " . " lvid ". $lvid . " note " . $note . " student_uid " . $student_uid . " datum " . $datum . " studiensem " . - $stsem . " lehreinheit_id_pr " . $lehreinheit_id . " typ " . $typ . " response" . $response . "\n"; - echo $response2; - } else { @@ -150,22 +151,18 @@ if (isset($_REQUEST['sammel']) && $_REQUEST["sammel"] == 1) } } } - + echo $errorMatrnr . $errorDatum; } else { // Einzelupdate - if(isset($_GET['datum']) ) + if(isset($_GET['datum'])) { $datum = $_GET['datum']; $datum_obj = new datum(); - $datum = $datum_obj->checkformatDatum($datum, 'Y-m-d', true) OR die('Invalid date format'); + $datum = $datum_obj->checkformatDatum($datum, 'Y-m-d', true) or die($p->t('benotungstool/datumsformatUnzulaessig', array($checkedDatum))); } - - else - die('Fehlerhafte Parameteruebergabe'); - $student_uid = $_REQUEST["student_uid"]; $note = $_REQUEST["note"]; @@ -174,7 +171,7 @@ else else $punkte = ''; - $punkte = str_replace(',','.',$punkte); + $punkte = str_replace(',', '.', $punkte); if($punkte!='') { @@ -205,11 +202,10 @@ else $uid = (isset($_GET['uid'])?$_GET['uid']:''); // lvgesamtnote für studenten speichern - if (isset($_REQUEST["submit"]) && ($_REQUEST["student_uid"] != '') ) + if (isset($_REQUEST["submit"]) && ($_REQUEST["student_uid"] != '')) { // Die Pruefung muss einer Lehreinheit zugeordnet werden // deshalb wird hier versucht eine passende Lehreinheit zu ermitteln. - $lehreinheit_id = getLehreinheit($db, $lvid, $student_uid, $stsem); $response = savePruefung($lvid, $student_uid, $stsem, $lehreinheit_id, $datum, $typ, $note); @@ -217,7 +213,6 @@ else } else echo "Fehler beim Eintragen der Prüfungen"; - } /** @@ -259,7 +254,7 @@ function getLehreinheit($db, $lvid, $student_uid, $stsem) /** * Prüfung speichern */ -function savePruefung($lvid, $student_uid, $stsem, $lehreinheit_id, $datum, $typ, $note, $punkte=null) +function savePruefung($lvid, $student_uid, $stsem, $lehreinheit_id, $datum, $typ, $note, $punkte = null) { $jetzt = date("Y-m-d H:i:s"); global $user; //, $note, $punkte, $datum; @@ -370,7 +365,7 @@ function savePruefung($lvid, $student_uid, $stsem, $lehreinheit_id, $datum, $typ $pr_3->punkte = $punkte; $pr_3->datum = $datum; $pr_3->anmerkung = ""; - $response = "Prüfung Termin3 aktualisiert"; + $response = "update T3"; } else { @@ -389,14 +384,14 @@ function savePruefung($lvid, $student_uid, $stsem, $lehreinheit_id, $datum, $typ $pr_3->ext_id = null; $pr_3->new = true; $old_note = -1; - $response = "neue Prüfung Termin3"; + $response = "new T3"; } $pr_3->save(); } } else { - $response = "no existing T3"; + $response = "fehlende oder fehlerhafte Inputparameter"; } //Gesamtnote updaten diff --git a/locale/de-AT/benotungstool.php b/locale/de-AT/benotungstool.php index a38aa31f3..b7c2af638 100644 --- a/locale/de-AT/benotungstool.php +++ b/locale/de-AT/benotungstool.php @@ -148,7 +148,9 @@ $this->phrasen['benotungstool/anzahlKommisionellePruefungen']='Anzahl kommission $this->phrasen['benotungstool/pruefungAnlegenFuer']='Prüfung anlegen für'; $this->phrasen['benotungstool/kreuzerltool']='Kreuzerltool'; $this->phrasen['benotungstool/studentIstLvNichtZugeordnet']='Der Student %s %s (%s) ist dieser Lehrveranstaltung nicht zugeordnet. Die Note wird nicht uebernommen!'; -$this->phrasen['benotungstool/studentMitMatrikelnummerExistiertNicht']='Student mit Matrikelnummer %s existiert nicht.'; +$this->phrasen['benotungstool/studentMitMatrikelnummerExistiertNicht']='Student*in mit Matrikelnummer %s existiert nicht.'; +$this->phrasen['benotungstool/datumsformatUnzulaessig']='Das Datum %s entspricht nicht dem Format TT.MM.JJJJ!'; +$this->phrasen['benotungstool/noteUnzulaessig']='Die Note %s ist nicht zulaessig. Die Zeile wurde uebersprungen.'; $this->phrasen['benotungstool/noteNichtUeberschreibbar']='Für Student mit Matrikelnummer %s eingetragene Zeugnisote %s ist nicht überschreibbar'; $this->phrasen['benotungstool/fehlerhafteNoteBeiStudent']='Fehlerhafte Note bei Student %s %s'; $this->phrasen['benotungstool/keineKreuzerllistenFuerDieseLehrveranstaltung']='Derzeit gibt es keine Kreuzerllisten für diese Lehrveranstaltung'; diff --git a/locale/en-US/benotungstool.php b/locale/en-US/benotungstool.php index 72f29256e..1f1dc89c6 100644 --- a/locale/en-US/benotungstool.php +++ b/locale/en-US/benotungstool.php @@ -148,6 +148,7 @@ $this->phrasen['benotungstool/pruefungAnlegenFuer']='Create an examination for ' $this->phrasen['benotungstool/kreuzerltool']='"Kreuzerl" tool'; $this->phrasen['benotungstool/studentIstLvNichtZugeordnet']='Student is not assigned to this course. The grade was not accepted!'; $this->phrasen['benotungstool/studentMitMatrikelnummerExistiertNicht']='Student with student ID number %s does not exist.'; +$this->phrasen['benotungstool/datumsformatUnzulaessig']='The date %s is not in valid format TT.MM.JJJJ.'; $this->phrasen['benotungstool/noteNichtUeberschreibbar']='Transcript grade %2$s for student with Personal identifier %1$s is not rewritable'; $this->phrasen['benotungstool/fehlerhafteNoteBeiStudent']='Incorrect grade for student %s %s'; $this->phrasen['benotungstool/keineKreuzerllistenFuerDieseLehrveranstaltung']='There are currently no checklists for this course'; From 8754c46575f53bccffdcb1ec2dd6d51923fd0b48 Mon Sep 17 00:00:00 2001 From: ma0068 Date: Mon, 17 Oct 2022 14:34:11 +0200 Subject: [PATCH 006/246] Refactor Import Termin2 und Termin3 --- .../benotungstool/lvgesamtnoteverwalten.php | 27 ++++--------------- 1 file changed, 5 insertions(+), 22 deletions(-) diff --git a/cis/private/lehre/benotungstool/lvgesamtnoteverwalten.php b/cis/private/lehre/benotungstool/lvgesamtnoteverwalten.php index 8a428ff2a..b7bb74d54 100644 --- a/cis/private/lehre/benotungstool/lvgesamtnoteverwalten.php +++ b/cis/private/lehre/benotungstool/lvgesamtnoteverwalten.php @@ -606,7 +606,7 @@ foreach ($noten_obj->result as $row) // **** // * Oeffnet ein Fenster fuer den Import von Noten für die Nachprüfung aus dem Excel // **** - function GradeImportNachp() + function GradeImportNachp(termin) { var str = "
"; str += ""; @@ -614,31 +614,14 @@ foreach ($noten_obj->result as $row) var y = getOffset('y'); y = y+50; anlegendiv.style.top = y+"px"; str += ''; str += ''; - str += "
X
t('benotungstool/importAnweisungNachp');?>:
' onclick='saveGradeBulkNachp(\"Termin2\");'>"; + + str += "
' onclick='saveGradeBulkNachp(\""+ termin +"\");'>"; str += "
"; anlegendiv.innerHTML = str; anlegendiv.style.visibility = "visible"; $('#noteimporttextareaNachp').focus(); } - // **** - // * Oeffnet ein Fenster fuer den Import von Noten für Termin3 aus dem Excel - // **** - function GradeImportTermin3() - { - var str = "
"; - str += ""; - var anlegendiv = document.getElementById("nachpruefung_div"); - var y = getOffset('y'); y = y+50; anlegendiv.style.top = y+"px"; - str += ''; - str += ''; - str += "
X
t('benotungstool/importAnweisungNachp');?>:
' onclick='saveGradeBulkNachp(\"Termin3\");'>"; - str += "
"; - anlegendiv.innerHTML = str; - anlegendiv.style.visibility = "visible"; - $('#noteimporttextareaTermin3').focus(); - } - // Speichert die Noten ueber den Import function saveGradeBulk() { @@ -1188,13 +1171,13 @@ $htmlstring .= "" . $p->t('benotungstool/punkte') . ' / ' . $p->t('benotungs if (defined('CIS_GESAMTNOTE_PRUEFUNG_TERMIN2') && CIS_GESAMTNOTE_PRUEFUNG_TERMIN2) { $htmlstring .= "
" . $p->t('benotungstool/nachpruefung') . "
- + "; } if (defined('CIS_GESAMTNOTE_PRUEFUNG_TERMIN3') && CIS_GESAMTNOTE_PRUEFUNG_TERMIN3) { $htmlstring .= "
" . $p->t('benotungstool/nachpruefung2') . "
- + "; } if (defined('CIS_GESAMTNOTE_PRUEFUNG_KOMMPRUEF') && CIS_GESAMTNOTE_PRUEFUNG_KOMMPRUEF) From 47d3ab33e78d0fbb68f5e484494a518c7e35033c Mon Sep 17 00:00:00 2001 From: ma0068 Date: Tue, 18 Oct 2022 09:17:07 +0200 Subject: [PATCH 007/246] =?UTF-8?q?Adaptierung=20Vorlage=20Notenliste.xls?= =?UTF-8?q?=20um=20Nachpr=C3=BCfung=20und=20Termin3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../benotungstool/lvgesamtnoteeintragen.php | 21 +++--- .../benotungstool/lvgesamtnoteverwalten.php | 4 +- .../benotungstool/nachpruefungeintragen.php | 1 + cis/private/lehre/notenliste.xls.php | 67 +++++++++++++++++++ locale/de-AT/benotungstool.php | 4 +- locale/en-US/benotungstool.php | 2 +- 6 files changed, 84 insertions(+), 15 deletions(-) diff --git a/cis/private/lehre/benotungstool/lvgesamtnoteeintragen.php b/cis/private/lehre/benotungstool/lvgesamtnoteeintragen.php index 73d0e6fca..8337b7c36 100644 --- a/cis/private/lehre/benotungstool/lvgesamtnoteeintragen.php +++ b/cis/private/lehre/benotungstool/lvgesamtnoteeintragen.php @@ -98,9 +98,9 @@ if($stsem=='') //$note = $_REQUEST["note"]; -if(!$rechte->isBerechtigt('admin',0) && - !$rechte->isBerechtigt('admin',$lv_obj->studiengang_kz) && - !$rechte->isBerechtigt('lehre',$lv_obj->studiengang_kz)) +if(!$rechte->isBerechtigt('admin', 0) && + !$rechte->isBerechtigt('admin', $lv_obj->studiengang_kz) && + !$rechte->isBerechtigt('lehre', $lv_obj->studiengang_kz)) { $qry = "SELECT lehreinheit_id FROM lehre.tbl_lehrveranstaltung JOIN lehre.tbl_lehreinheit USING(lehrveranstaltung_id) JOIN lehre.tbl_lehreinheitmitarbeiter USING(lehreinheit_id) @@ -117,11 +117,11 @@ if(!$rechte->isBerechtigt('admin',0) && } } -function savenote($db,$lvid, $student_uid, $note, $punkte=null) +function savenote($db, $lvid, $student_uid, $note, $punkte = null) { global $stsem, $user, $p, $noten_anmerkung; $jetzt = date("Y-m-d H:i:s"); - $punkte = str_replace(',','.',$punkte); + $punkte = str_replace(',', '.', $punkte); //Ermitteln ob der Student diesem Kurs zugeteilt ist $qry = "SELECT 1 FROM campus.vw_student_lehrveranstaltung WHERE uid=".$db->db_add_param($student_uid)." AND lehrveranstaltung_id=".$db->db_add_param($lvid, FHC_INTEGER); if($result = $db->db_query($qry)) @@ -207,13 +207,12 @@ if (isset($_REQUEST["submit"])) $note = $_REQUEST["note"]; $punkte = (isset($_REQUEST["punkte"])?$_REQUEST["punkte"]:''); - $response = savenote($db,$lvid, $student_uid, $note, $punkte); + $response = savenote($db, $lvid, $student_uid, $note, $punkte); echo $response; } else { - - foreach ($_POST as $row=>$val) + foreach ($_POST as $row => $val) { if(mb_strstr(mb_strtolower($row), 'matrikelnr_')) { @@ -232,7 +231,7 @@ if (isset($_REQUEST["submit"])) $response.="\nNote oder Punkte fehlen"; continue; } - $punkte=str_replace(',','.', $punkte); + $punkte=str_replace(',', '.', $punkte); //check ob statt Matrikelnummer nicht bereits student_uid (Moodle Grade Import) vorliegt.. $student = new student(); @@ -241,7 +240,7 @@ if (isset($_REQUEST["submit"])) //UID ermitteln if(!$student_uid = $student->getUidFromMatrikelnummer($matrikelnummer)) { - $response.="\n".$p->t('benotungstool/studentMitMatrikelnummerExistiertNicht',array($matrikelnummer)); + $response.="\n".$p->t('benotungstool/studentMitMatrikelnummerExistiertNicht', array($matrikelnummer)); continue; } } @@ -268,7 +267,7 @@ if (isset($_REQUEST["submit"])) } } - $val=savenote($db,$lvid, $student_uid, $note, $punkte); + $val=savenote($db, $lvid, $student_uid, $note, $punkte); if($val!='neu' && $val!='update' && $val!='update_f') $response.=$val; } diff --git a/cis/private/lehre/benotungstool/lvgesamtnoteverwalten.php b/cis/private/lehre/benotungstool/lvgesamtnoteverwalten.php index b7bb74d54..64179a3e9 100644 --- a/cis/private/lehre/benotungstool/lvgesamtnoteverwalten.php +++ b/cis/private/lehre/benotungstool/lvgesamtnoteverwalten.php @@ -749,6 +749,7 @@ foreach ($noten_obj->result as $row) } ?> + for(row in rows) { zeile = rows[row].split(" "); @@ -779,6 +780,7 @@ foreach ($noten_obj->result as $row) } } + if (alertMsg != "") alert(alertMsg); @@ -1306,7 +1308,7 @@ if (defined("CIS_GESAMTNOTE_PRUEFUNG_MOODLE_LE_NOTE") && CIS_GESAMTNOTE_PRUEFUNG foreach ($addon_obj->result as $row) { if (file_exists('../../../../addons/' . $row->kurzbz . '/cis/grades.inc.php')) - include ('../../../../addons/' . $row->kurzbz . '/cis/grades.inc.php'); + include('../../../../addons/' . $row->kurzbz . '/cis/grades.inc.php'); } } } diff --git a/cis/private/lehre/benotungstool/nachpruefungeintragen.php b/cis/private/lehre/benotungstool/nachpruefungeintragen.php index 307c0ca30..290113179 100644 --- a/cis/private/lehre/benotungstool/nachpruefungeintragen.php +++ b/cis/private/lehre/benotungstool/nachpruefungeintragen.php @@ -105,6 +105,7 @@ if (isset($_REQUEST['sammel']) && $_REQUEST["sammel"] == 1) $note = null; $punkte = null; $datum = null; + $response = ''; if(isset($_POST['note_'.$id])) $note = $_POST['note_'.$id]; elseif(isset($_POST['punkte_'.$id])) diff --git a/cis/private/lehre/notenliste.xls.php b/cis/private/lehre/notenliste.xls.php index 74cb7e7c1..4a6817a36 100644 --- a/cis/private/lehre/notenliste.xls.php +++ b/cis/private/lehre/notenliste.xls.php @@ -35,6 +35,7 @@ require_once('../../../include/note.class.php'); require_once('../../../include/notenschluessel.class.php'); require_once('../../../include/Excel/excel.php'); require_once('../../../include/phrasen.class.php'); +require_once('../../../include/pruefung.class.php'); $uid = get_uid(); @@ -191,6 +192,19 @@ else } //Studenten holen + + //Spaltengruppe für Nachprüfung + if (defined('CIS_GESAMTNOTE_PRUEFUNG_TERMIN2') && CIS_GESAMTNOTE_PRUEFUNG_TERMIN2) + { + $worksheet->write($lines,8,$p->t('benotungstool/nachpruefung'),$format_bold); + } + + //Spaltengruppe für 2.Nebensprüfungstermin + if (defined('CIS_GESAMTNOTE_PRUEFUNG_TERMIN3') && CIS_GESAMTNOTE_PRUEFUNG_TERMIN3) + { + $worksheet->write($lines,12,$p->t('benotungstool/nachpruefung2'),$format_bold); + } + $lines++; $worksheet->write($lines,1,$p->t('global/uid'),$format_border_bottom); $worksheet->write($lines,2,$p->t('global/nachname'),$format_border_bottom); @@ -203,6 +217,26 @@ else else $worksheet->write($lines,6,$p->t('benotungstool/note'),$format_border_bottom); + if (defined('CIS_GESAMTNOTE_PRUEFUNG_TERMIN2') && CIS_GESAMTNOTE_PRUEFUNG_TERMIN2) + { + $worksheet->write($lines,8,$p->t('global/uid'),$format_border_bottom); + $worksheet->write($lines,9,$p->t('global/datum'),$format_border_bottom); + if(defined('CIS_GESAMTNOTE_PUNKTE') && CIS_GESAMTNOTE_PUNKTE) + $worksheet->write($lines,10,$p->t('benotungstool/punkte'),$format_border_bottom); + else + $worksheet->write($lines,10,$p->t('benotungstool/note'),$format_border_bottom); + } + + if (defined('CIS_GESAMTNOTE_PRUEFUNG_TERMIN3') && CIS_GESAMTNOTE_PRUEFUNG_TERMIN3) +{ + $worksheet->write($lines,12,$p->t('global/uid'),$format_border_bottom); + $worksheet->write($lines,13,$p->t('global/uid'),$format_border_bottom); + if(defined('CIS_GESAMTNOTE_PUNKTE') && CIS_GESAMTNOTE_PUNKTE) + $worksheet->write($lines,14,$p->t('benotungstool/punkte'),$format_border_bottom); + else + $worksheet->write($lines,14,$p->t('benotungstool/note'),$format_border_bottom); +} + $stsem_obj = new studiensemester(); $stsem_obj->load($stsem); $stsemdatumvon = $stsem_obj->start; @@ -282,6 +316,39 @@ else $worksheet->write($lines,4,'="'.$elem->semester.$elem->verband.$elem->gruppe.'"'); $worksheet->write($lines,5,'="'.trim($elem->matrikelnr).'"',$format_highlight); $worksheet->write($lines,6, $note, $format_highlightright); + + // Nachprüfung + if (defined('CIS_GESAMTNOTE_PRUEFUNG_TERMIN2') && CIS_GESAMTNOTE_PRUEFUNG_TERMIN2) + { + $worksheet->write($lines,8, $elem->uid, $format_highlightright); + $pr = new Pruefung(); + $pr->getPruefungen($elem->uid, "Termin2", $lvid, $sem); + $output2 = $pr->result; + + if ($output2) + { + $resultPr = $output2[0]; + $worksheet->write($lines,9, date('d.m.Y', strtotime($resultPr->datum)), $format_highlightright); + $worksheet->write($lines,10, $resultPr->note, $format_highlightright); + } + } + + // Nachprüfung + if (defined('CIS_GESAMTNOTE_PRUEFUNG_TERMIN3') && CIS_GESAMTNOTE_PRUEFUNG_TERMIN3) + { + $worksheet->write($lines,12, $elem->uid, $format_highlightright); + $pr = new Pruefung(); + $pr->getPruefungen($elem->uid, "Termin3", $lvid, $sem); + $output3 = $pr->result; + + if ($output3) + { + $resultPr = $output3[0]; + $worksheet->write($lines,13, date('d.m.Y', strtotime($resultPr->datum)), $format_highlightright); + $worksheet->write($lines,14, $resultPr->note, $format_highlightright); + } + } + $i++; $lines++; } diff --git a/locale/de-AT/benotungstool.php b/locale/de-AT/benotungstool.php index b7c2af638..feac092f6 100644 --- a/locale/de-AT/benotungstool.php +++ b/locale/de-AT/benotungstool.php @@ -172,8 +172,8 @@ $this->phrasen['benotungstool/eingetrageneNoten']='Eingetragene Noten'; $this->phrasen['benotungstool/zeunis']='Zeugnis'; $this->phrasen['benotungstool/handbuch']='Handbuch'; $this->phrasen['benotungstool/punkte']='Punkte'; -$this->phrasen['benotungstool/importAnweisung']='Kopieren Sie die Spalten Personenkennzeichen und Note aus der Notenliste (bzw. StudentenUid und Note aus dem MoodleExport) und fügen Sie diese in folgendes Feld ein'; -$this->phrasen['benotungstool/importAnweisungNachp']='Kopieren Sie die Spalten Personenkennzeichen, Datum und Note aus der Notenliste (bzw. StudentenUid, Datum und Note aus dem MoodleExport) und fügen Sie diese in folgendes Feld ein'; +$this->phrasen['benotungstool/importAnweisung']='Kopieren Sie die Spalten StudentenUid und Note aus der Notenliste (bzw. StudentenUid und Note aus dem MoodleExport) und fügen Sie diese in folgendes Feld ein'; +$this->phrasen['benotungstool/importAnweisungNachp']='Kopieren Sie die Spalten StudentenUid (bzw. Personenkennzeichen), Datum und Note aus der Notenliste bzw. dem Moodle Export File und fügen Sie diese in folgendes Feld ein'; $this->phrasen['benotungstool/pruefung']='Prüfung'; $this->phrasen['benotungstool/notenlisteImport']='Notenliste für den LV-Noten-Import (Excel)'; $this->phrasen['benotungstool/bearbeitetvon']='Bearbeitet von'; diff --git a/locale/en-US/benotungstool.php b/locale/en-US/benotungstool.php index 1f1dc89c6..f482409d8 100644 --- a/locale/en-US/benotungstool.php +++ b/locale/en-US/benotungstool.php @@ -171,7 +171,7 @@ $this->phrasen['benotungstool/zeunis']='Transcript'; $this->phrasen['benotungstool/handbuch']='Handbook'; $this->phrasen['benotungstool/punkte']='Points'; $this->phrasen['benotungstool/importAnweisung']='Copy the columns "personal identifier" and "grade" from the grade list (or "student ID number" and "grade" from the moodle export file) and insert them in the following field'; -$this->phrasen['benotungstool/importAnweisungNachp']='Copy the columns "personal identifier", "date" and "grade" from the grade list (or "student ID number", "date" and "grade" from the moodle export file) and insert them in the following field'; +$this->phrasen['benotungstool/importAnweisungNachp']='Copy the columns "student ID number" (or "personal identifier"), "date" and "grade" from the grade list or from the moodle export file and insert them in the following field'; $this->phrasen['benotungstool/pruefung']='Examination'; $this->phrasen['benotungstool/notenlisteImport']='Grade list for the subject grade import (Excel)'; $this->phrasen['benotungstool/geaenderteNotenVorhanden']='There are changed grades. Please send the changes to the assistant by clicking "Approval"'; From 540fc4bede933b704d2d69aeb0325bcc0da780c0 Mon Sep 17 00:00:00 2001 From: ma0068 Date: Tue, 15 Nov 2022 11:22:47 +0100 Subject: [PATCH 008/246] 26198 Notenimport ausschliesslich bei vorhandener Note --- .../lehre/benotungstool/nachpruefungeintragen.php | 12 +++++++++++- locale/de-AT/benotungstool.php | 3 ++- locale/en-US/benotungstool.php | 1 + 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/cis/private/lehre/benotungstool/nachpruefungeintragen.php b/cis/private/lehre/benotungstool/nachpruefungeintragen.php index 290113179..bf0d4b197 100644 --- a/cis/private/lehre/benotungstool/nachpruefungeintragen.php +++ b/cis/private/lehre/benotungstool/nachpruefungeintragen.php @@ -95,6 +95,8 @@ if (isset($_REQUEST['sammel']) && $_REQUEST["sammel"] == 1) { $errorMatrnr = ''; $errorDatum = ''; + $errorNachp = ''; + foreach ($_POST as $row => $val) { if(mb_strstr(mb_strtolower($row), 'student_uid_')) @@ -140,6 +142,14 @@ if (isset($_REQUEST['sammel']) && $_REQUEST["sammel"] == 1) } } + //check ob eine Note vorhanden ist oder (intern) angerechnet wurde + $lvnote = new lvgesamtnote(); + if (!$lvnote->load($lvid, $student_uid, $stsem)) + { + $errorNachp.="\n".$p->t('benotungstool/NachpruefungNichtZulaessig', array($student_uid)); + continue; + } + $lehreinheit_id = getLehreinheit($db, $lvid, $student_uid, $stsem); if(isset($_POST['student_uid_'.$id]) && (isset($_POST['note_'.$id]) || isset($_POST['punkte_'.$id])) && isset($_POST['datumNachp_'.$id])) @@ -152,7 +162,7 @@ if (isset($_REQUEST['sammel']) && $_REQUEST["sammel"] == 1) } } } - echo $errorMatrnr . $errorDatum; + echo $errorMatrnr . $errorDatum . $errorNachp; } else { diff --git a/locale/de-AT/benotungstool.php b/locale/de-AT/benotungstool.php index feac092f6..d6e77d3ce 100644 --- a/locale/de-AT/benotungstool.php +++ b/locale/de-AT/benotungstool.php @@ -150,8 +150,9 @@ $this->phrasen['benotungstool/kreuzerltool']='Kreuzerltool'; $this->phrasen['benotungstool/studentIstLvNichtZugeordnet']='Der Student %s %s (%s) ist dieser Lehrveranstaltung nicht zugeordnet. Die Note wird nicht uebernommen!'; $this->phrasen['benotungstool/studentMitMatrikelnummerExistiertNicht']='Student*in mit Matrikelnummer %s existiert nicht.'; $this->phrasen['benotungstool/datumsformatUnzulaessig']='Das Datum %s entspricht nicht dem Format TT.MM.JJJJ!'; +$this->phrasen['benotungstool/NachpruefungNichtZulaessig']='Nachprüfung für Student*in %s nicht zulässig.'; $this->phrasen['benotungstool/noteUnzulaessig']='Die Note %s ist nicht zulaessig. Die Zeile wurde uebersprungen.'; -$this->phrasen['benotungstool/noteNichtUeberschreibbar']='Für Student mit Matrikelnummer %s eingetragene Zeugnisote %s ist nicht überschreibbar'; +$this->phrasen['benotungstool/noteNichtUeberschreibbar']='Für Student mit Matrikelnummer %s eingetragene Zeugnisnote %s ist nicht überschreibbar'; $this->phrasen['benotungstool/fehlerhafteNoteBeiStudent']='Fehlerhafte Note bei Student %s %s'; $this->phrasen['benotungstool/keineKreuzerllistenFuerDieseLehrveranstaltung']='Derzeit gibt es keine Kreuzerllisten für diese Lehrveranstaltung'; $this->phrasen['benotungstool/notenuebersichtFuer']='Notenübersicht für'; diff --git a/locale/en-US/benotungstool.php b/locale/en-US/benotungstool.php index f482409d8..73a3bd343 100644 --- a/locale/en-US/benotungstool.php +++ b/locale/en-US/benotungstool.php @@ -148,6 +148,7 @@ $this->phrasen['benotungstool/pruefungAnlegenFuer']='Create an examination for ' $this->phrasen['benotungstool/kreuzerltool']='"Kreuzerl" tool'; $this->phrasen['benotungstool/studentIstLvNichtZugeordnet']='Student is not assigned to this course. The grade was not accepted!'; $this->phrasen['benotungstool/studentMitMatrikelnummerExistiertNicht']='Student with student ID number %s does not exist.'; +$this->phrasen['benotungstool/NachpruefungNichtZulaessig']='Re-examination for student %s not allowed.'; $this->phrasen['benotungstool/datumsformatUnzulaessig']='The date %s is not in valid format TT.MM.JJJJ.'; $this->phrasen['benotungstool/noteNichtUeberschreibbar']='Transcript grade %2$s for student with Personal identifier %1$s is not rewritable'; $this->phrasen['benotungstool/fehlerhafteNoteBeiStudent']='Incorrect grade for student %s %s'; From d9098179a25cf789e29dc29a1407445112ce4d06 Mon Sep 17 00:00:00 2001 From: ma0048 Date: Wed, 14 Dec 2022 12:40:38 +0100 Subject: [PATCH 009/246] - ermoeglicht es master bewerber sich ueber das bewerbungstool anzumelden --- include/reihungstest.class.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/include/reihungstest.class.php b/include/reihungstest.class.php index 0140816ab..5c8e5854e 100644 --- a/include/reihungstest.class.php +++ b/include/reihungstest.class.php @@ -685,11 +685,15 @@ class reihungstest extends basis_db tbl_reihungstest.studiensemester_kurzbz, tbl_reihungstest.stufe, tbl_reihungstest.anmeldefrist, - tbl_reihungstest.aufnahmegruppe_kurzbz + tbl_reihungstest.aufnahmegruppe_kurzbz, + tbl_studiengang.typ, + tbl_studiengang.kurzbzlang FROM public.tbl_rt_person JOIN public.tbl_reihungstest ON (rt_id=reihungstest_id) + LEFT JOIN + public.tbl_studiengang ON tbl_reihungstest.studiengang_kz = tbl_studiengang.studiengang_kz WHERE tbl_rt_person.person_id=".$this->db_add_param($person_id); @@ -728,6 +732,8 @@ class reihungstest extends basis_db $obj->stufe = $row->stufe; $obj->anmeldefrist = $row->anmeldefrist; $obj->aufnahmegruppe_kurzbz = $row->aufnahmegruppe_kurzbz; + $obj->typ = $row->typ; + $obj->kurzbzlang = $row->kurzbzlang; $this->result[] = $obj; } From ed99325bb933d7fee02fffc50014d28f287f8d01 Mon Sep 17 00:00:00 2001 From: ma0048 Date: Tue, 10 Jan 2023 09:04:53 +0100 Subject: [PATCH 010/246] - anpassungen fuer master bewerbungen --- include/reihungstest.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/reihungstest.class.php b/include/reihungstest.class.php index 5c8e5854e..42af8ea7a 100644 --- a/include/reihungstest.class.php +++ b/include/reihungstest.class.php @@ -687,7 +687,7 @@ class reihungstest extends basis_db tbl_reihungstest.anmeldefrist, tbl_reihungstest.aufnahmegruppe_kurzbz, tbl_studiengang.typ, - tbl_studiengang.kurzbzlang + UPPER(typ::varchar(1) || kurzbz) AS stg_kuerzel FROM public.tbl_rt_person JOIN @@ -733,7 +733,7 @@ class reihungstest extends basis_db $obj->anmeldefrist = $row->anmeldefrist; $obj->aufnahmegruppe_kurzbz = $row->aufnahmegruppe_kurzbz; $obj->typ = $row->typ; - $obj->kurzbzlang = $row->kurzbzlang; + $obj->stg_kuerzel = $row->stg_kuerzel; $this->result[] = $obj; } From 4f2ca62d05eeead90bb89706d82f0a3f83875b09 Mon Sep 17 00:00:00 2001 From: KarpAlex Date: Thu, 23 Feb 2023 19:27:45 +0100 Subject: [PATCH 011/246] Issues: enabled extensions to produce own plausichecks, IssueResolver: moved directory names to constants, deleted unused IIssueExistsChecker --- .../controllers/jobs/PlausiIssueProducer.php | 56 ++------------- .../system/issues/Plausichecks.php | 13 ++-- application/core/IIssueExistsChecker.php | 21 ------ application/core/IssueResolver_Controller.php | 15 +++- .../core/PlausiIssueProducer_Controller.php | 66 ++++++++++++++++++ .../issues/PlausicheckDefinitionLib.php | 55 +++++++++++++++ .../libraries/issues/PlausicheckLib.php | 3 + .../issues/PlausicheckProducerLib.php | 68 ++++++------------- 8 files changed, 172 insertions(+), 125 deletions(-) delete mode 100644 application/core/IIssueExistsChecker.php create mode 100644 application/core/PlausiIssueProducer_Controller.php create mode 100644 application/libraries/issues/PlausicheckDefinitionLib.php diff --git a/application/controllers/jobs/PlausiIssueProducer.php b/application/controllers/jobs/PlausiIssueProducer.php index 943d7aa46..e94cd93dc 100644 --- a/application/controllers/jobs/PlausiIssueProducer.php +++ b/application/controllers/jobs/PlausiIssueProducer.php @@ -1,62 +1,18 @@ load->library('issues/PlausicheckProducerLib'); - $this->load->library('IssuesLib'); - } + $this->load->library('issues/PlausicheckDefinitionLib'); - /** - * Runs issue production job. - * @param studiensemester_kurzbz string job is run for students of a certain semester. - * @param studiengang_kz int job is run for students of certain Studiengang. - */ - public function run($studiensemester_kurzbz = null, $studiengang_kz = null) - { - $fehlerKurzbz = $this->plausicheckproducerlib->getFehlerKurzbz(); - - $this->logInfo("Plausicheck issue producer job started"); - - // get the data returned by Plausicheck - foreach ($fehlerKurzbz as $fehler_kurzbz) - { - // execute the check - $this->logInfo("Checking " . $fehler_kurzbz . "..."); - $plausicheckRes = $this->plausicheckproducerlib->producePlausicheckIssue($fehler_kurzbz, $studiensemester_kurzbz, $studiengang_kz); - - if (isError($plausicheckRes)) $this->logError(getError($plausicheckRes)); - - if (hasData($plausicheckRes)) - { - $plausicheckData = getData($plausicheckRes); - - foreach ($plausicheckData as $plausiData) - { - // get the data needed for issue production - $person_id = isset($plausiData['person_id']) ? $plausiData['person_id'] : null; - $oe_kurzbz = isset($plausiData['oe_kurzbz']) ? $plausiData['oe_kurzbz'] : null; - $fehlertext_params = isset($plausiData['fehlertext_params']) ? $plausiData['fehlertext_params'] : null; - $resolution_params = isset($plausiData['resolution_params']) ? $plausiData['resolution_params'] : null; - - // write the issue - $addIssueRes = $this->issueslib->addFhcIssue($fehler_kurzbz, $person_id, $oe_kurzbz, $fehlertext_params, $resolution_params); - - // log if error, or log info if inserted new issue - if (isError($addIssueRes)) - $this->logError(getError($addIssueRes)); - elseif (hasData($addIssueRes) && is_integer(getData($addIssueRes))) - $this->logInfo("Plausicheck issue " . $fehler_kurzbz . " successfully produced, person_id: " . $person_id); - } - } - } - - $this->logInfo("Plausicheck issue producer job stopped"); + // set fehler which can be produced by the job + // structure: fehler_kurzbz => class (library) name for resolving + $this->_fehlerLibMappings = $this->plausicheckdefinitionlib->getFehlerLibMappings(); } } diff --git a/application/controllers/system/issues/Plausichecks.php b/application/controllers/system/issues/Plausichecks.php index 748361321..ba7839bc4 100644 --- a/application/controllers/system/issues/Plausichecks.php +++ b/application/controllers/system/issues/Plausichecks.php @@ -15,6 +15,7 @@ class Plausichecks extends Auth_Controller // Load libraries $this->load->library('issues/PlausicheckProducerLib'); + $this->load->library('issues/PlausicheckDefinitionLib'); $this->load->library('WidgetLib'); // Load models @@ -44,16 +45,20 @@ class Plausichecks extends Auth_Controller // issues array for passing issue texts $issueTexts = array(); // all fehler kurzbz which are going to be checked - $fehlerKurzbz = !isEmptyString($fehler_kurzbz) ? array($fehler_kurzbz) : $this->plausicheckproducerlib->getFehlerKurzbz(); + $fehlerKurzbz = !isEmptyString($fehler_kurzbz) ? array($fehler_kurzbz) : $this->plausicheckdefinitionlib->getFehlerKurzbz(); + $fehlerLibMappings = $this->plausicheckdefinitionlib->getFehlerLibMappings(); // set Studiengang to null if not passed if (isEmptyString($studiengang_kz)) $studiengang_kz = null; // get the data returned by Plausicheck foreach ($fehlerKurzbz as $fehler_kurzbz) { - // execute the check $issueTexts[$fehler_kurzbz] = array(); - $plausicheckRes = $this->plausicheckproducerlib->producePlausicheckIssue($fehler_kurzbz, $studiensemester_kurzbz, $studiengang_kz); + // get library name for producing issue + $libName = $fehlerLibMappings[$fehler_kurzbz]; + + // execute the check + $plausicheckRes = $this->plausicheckproducerlib->producePlausicheckIssue($libName, $studiensemester_kurzbz, $studiengang_kz); if (isError($plausicheckRes)) $this->terminateWithJsonError(getError($plausicheckRes)); @@ -121,7 +126,7 @@ class Plausichecks extends Auth_Controller if (isError($studiengaengeRes)) show_error(getError($studiengaengeRes)); - $fehlerKurzbz = $this->plausicheckproducerlib->getFehlerKurzbz(); + $fehlerKurzbz = $this->plausicheckdefinitionlib->getFehlerKurzbz(); return array( 'semester' => hasData($studiensemesterRes) ? getData($studiensemesterRes) : array(), diff --git a/application/core/IIssueExistsChecker.php b/application/core/IIssueExistsChecker.php deleted file mode 100644 index 7f5a6b6e5..000000000 --- a/application/core/IIssueExistsChecker.php +++ /dev/null @@ -1,21 +0,0 @@ -behebung_parameter) ? json_decode($issue->behebung_parameter, true) : array() ); - // if called from extension (extension name set), path includes extension names, otherwise it is the core library folder - $libRootPath = isset($this->_extensionName) ? 'extensions/' . $this->_extensionName . '/' : ''; + // TODO: what if extension/library folder changes? + + // if called from extension (extension name set), path includes extension names + $libRootPath = isset($this->_extensionName) ? self::EXTENSIONS_FOLDER . '/' . $this->_extensionName . '/' : ''; + + // path for loading issue library $issuesLibPath = $libRootPath . self::ISSUE_RESOLVERS_FOLDER . '/'; - $issuesLibFilePath = DOC_ROOT . self::CI_PATH . '/' . $libRootPath . 'libraries/' . self::ISSUE_RESOLVERS_FOLDER . '/' . $libName . '.php'; + + // file path of library for check if file exists + $issuesLibFilePath = DOC_ROOT . self::CI_PATH + . '/' . $libRootPath . self::CI_LIBRARY_FOLDER . '/' . self::ISSUE_RESOLVERS_FOLDER . '/' . $libName . '.php'; // check if library file exists if (!file_exists($issuesLibFilePath)) diff --git a/application/core/PlausiIssueProducer_Controller.php b/application/core/PlausiIssueProducer_Controller.php new file mode 100644 index 000000000..b12f2481d --- /dev/null +++ b/application/core/PlausiIssueProducer_Controller.php @@ -0,0 +1,66 @@ +load->library('issues/PlausicheckProducerLib'); + $this->load->library('IssuesLib'); + } + + /** + * Runs issue production job. + * @param studiensemester_kurzbz string job is run for students of a certain semester. + * @param studiengang_kz int job is run for students of certain Studiengang. + */ + public function run($studiensemester_kurzbz = null, $studiengang_kz = null) + { + $this->logInfo("Plausicheck issue producer job started"); + + // get the data returned by Plausicheck + foreach ($this->_fehlerLibMappings as $fehler_kurzbz => $libName) + { + // execute the check + $this->logInfo("Checking " . $fehler_kurzbz . "..."); + $plausicheckRes = $this->plausicheckproducerlib->producePlausicheckIssue( + $libName, + $studiensemester_kurzbz, + $studiengang_kz + ); + + if (isError($plausicheckRes)) $this->logError(getError($plausicheckRes)); + + if (hasData($plausicheckRes)) + { + $plausicheckData = getData($plausicheckRes); + + foreach ($plausicheckData as $plausiData) + { + // get the data needed for issue production + $person_id = isset($plausiData['person_id']) ? $plausiData['person_id'] : null; + $oe_kurzbz = isset($plausiData['oe_kurzbz']) ? $plausiData['oe_kurzbz'] : null; + $fehlertext_params = isset($plausiData['fehlertext_params']) ? $plausiData['fehlertext_params'] : null; + $resolution_params = isset($plausiData['resolution_params']) ? $plausiData['resolution_params'] : null; + + // write the issue + $addIssueRes = $this->issueslib->addFhcIssue($fehler_kurzbz, $person_id, $oe_kurzbz, $fehlertext_params, $resolution_params); + + // log if error, or log info if inserted new issue + if (isError($addIssueRes)) + $this->logError(getError($addIssueRes)); + elseif (hasData($addIssueRes) && is_integer(getData($addIssueRes))) + $this->logInfo("Plausicheck issue " . $fehler_kurzbz . " successfully produced, person_id: " . $person_id); + } + } + } + + $this->logInfo("Plausicheck issue producer job stopped"); + } +} diff --git a/application/libraries/issues/PlausicheckDefinitionLib.php b/application/libraries/issues/PlausicheckDefinitionLib.php new file mode 100644 index 000000000..63fd6f570 --- /dev/null +++ b/application/libraries/issues/PlausicheckDefinitionLib.php @@ -0,0 +1,55 @@ + class (library) name for resolving + private $_fehlerLibMappings = array( + 'AbbrecherAktiv' => 'AbbrecherAktiv', + 'AbschlussstatusFehlt' => 'AbschlussstatusFehlt', + 'AktSemesterNull' => 'AktSemesterNull', + 'AktiverStudentOhneStatus' => 'AktiverStudentOhneStatus', + 'AusbildungssemPrestudentUngleichAusbildungssemStatus' => 'AusbildungssemPrestudentUngleichAusbildungssemStatus', + 'BewerberNichtZumRtAngetreten' => 'BewerberNichtZumRtAngetreten', + 'DatumAbschlusspruefungFehlt' => 'DatumAbschlusspruefungFehlt', + 'DatumSponsionFehlt' => 'DatumSponsionFehlt', + 'DatumStudiensemesterFalscheReihenfolge' => 'DatumStudiensemesterFalscheReihenfolge', + 'FalscheAnzahlAbschlusspruefungen' => 'FalscheAnzahlAbschlusspruefungen', + 'FalscheAnzahlHeimatadressen' => 'FalscheAnzahlHeimatadressen', + 'FalscheAnzahlZustelladressen' => 'FalscheAnzahlZustelladressen', + 'GbDatumWeitZurueck' => 'GbDatumWeitZurueck', + 'InaktiverStudentAktiverStatus' => 'InaktiverStudentAktiverStatus', + 'IncomingHeimatNationOesterreich' => 'IncomingHeimatNationOesterreich', + 'IncomingOhneIoDatensatz' => 'IncomingOhneIoDatensatz', + 'IncomingOrGsFoerderrelevant' => 'IncomingOrGsFoerderrelevant', + 'InskriptionVorLetzerBismeldung' => 'InskriptionVorLetzerBismeldung', + 'NationNichtOesterreichAberGemeinde' => 'NationNichtOesterreichAberGemeinde', + 'OrgformStgUngleichOrgformPrestudent' => 'OrgformStgUngleichOrgformPrestudent', + 'PrestudentMischformOhneOrgform' => 'PrestudentMischformOhneOrgform', + 'StgPrestudentUngleichStgStudienplan' => 'StgPrestudentUngleichStgStudienplan', + 'StgPrestudentUngleichStgStudent' => 'StgPrestudentUngleichStgStudent', + 'StudentstatusNachAbbrecher' => 'StudentstatusNachAbbrecher' + //'StudienplanUngueltig' => 'StudienplanUngueltig' + ); + + /** + * Gets all fehler_kurzbz for fehler which need to be checked. + */ + public function getFehlerLibMappings() + { + return $this->_fehlerLibMappings; + } + + /** + * Gets all fehler_kurzbz for fehler which need to be checked. + */ + public function getFehlerKurzbz() + { + return array_keys($this->_fehlerLibMappings); + } +} diff --git a/application/libraries/issues/PlausicheckLib.php b/application/libraries/issues/PlausicheckLib.php index 5105169dd..e98070596 100644 --- a/application/libraries/issues/PlausicheckLib.php +++ b/application/libraries/issues/PlausicheckLib.php @@ -2,6 +2,9 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * Library containing database queries for execution of core plausichecks. + */ class PlausicheckLib { private $_ci; // Code igniter instance diff --git a/application/libraries/issues/PlausicheckProducerLib.php b/application/libraries/issues/PlausicheckProducerLib.php index c1e15151f..3297ecd1d 100644 --- a/application/libraries/issues/PlausicheckProducerLib.php +++ b/application/libraries/issues/PlausicheckProducerLib.php @@ -4,43 +4,15 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); class PlausicheckProducerLib { - const CI_LIBRARY_PATH = 'application/libraries'; + const CI_PATH = 'application'; + const CI_LIBRARY_FOLDER = 'libraries'; + const EXTENSIONS_FOLDER = 'extensions'; const PLAUSI_ISSUES_FOLDER = 'issues/plausichecks'; const EXECUTE_PLAUSI_CHECK_METHOD_NAME = 'executePlausiCheck'; private $_ci; // ci instance private $_currentStudiensemester; // current Studiensemester - // set fehler which can be produced by the job - // structure: fehler_kurzbz => class (library) name for resolving - private $_fehlerLibMappings = array( - 'AbbrecherAktiv' => 'AbbrecherAktiv', - 'AbschlussstatusFehlt' => 'AbschlussstatusFehlt', - 'AktSemesterNull' => 'AktSemesterNull', - 'AktiverStudentOhneStatus' => 'AktiverStudentOhneStatus', - 'AusbildungssemPrestudentUngleichAusbildungssemStatus' => 'AusbildungssemPrestudentUngleichAusbildungssemStatus', - 'BewerberNichtZumRtAngetreten' => 'BewerberNichtZumRtAngetreten', - 'DatumAbschlusspruefungFehlt' => 'DatumAbschlusspruefungFehlt', - 'DatumSponsionFehlt' => 'DatumSponsionFehlt', - 'DatumStudiensemesterFalscheReihenfolge' => 'DatumStudiensemesterFalscheReihenfolge', - 'FalscheAnzahlAbschlusspruefungen' => 'FalscheAnzahlAbschlusspruefungen', - 'FalscheAnzahlHeimatadressen' => 'FalscheAnzahlHeimatadressen', - 'FalscheAnzahlZustelladressen' => 'FalscheAnzahlZustelladressen', - 'GbDatumWeitZurueck' => 'GbDatumWeitZurueck', - 'InaktiverStudentAktiverStatus' => 'InaktiverStudentAktiverStatus', - 'IncomingHeimatNationOesterreich' => 'IncomingHeimatNationOesterreich', - 'IncomingOhneIoDatensatz' => 'IncomingOhneIoDatensatz', - 'IncomingOrGsFoerderrelevant' => 'IncomingOrGsFoerderrelevant', - 'InskriptionVorLetzerBismeldung' => 'InskriptionVorLetzerBismeldung', - 'NationNichtOesterreichAberGemeinde' => 'NationNichtOesterreichAberGemeinde', - 'OrgformStgUngleichOrgformPrestudent' => 'OrgformStgUngleichOrgformPrestudent', - 'PrestudentMischformOhneOrgform' => 'PrestudentMischformOhneOrgform', - 'StgPrestudentUngleichStgStudienplan' => 'StgPrestudentUngleichStgStudienplan', - 'StgPrestudentUngleichStgStudent' => 'StgPrestudentUngleichStgStudent', - 'StudentstatusNachAbbrecher' => 'StudentstatusNachAbbrecher' - //'StudienplanUngueltig' => 'StudienplanUngueltig' - ); - public function __construct() { $this->_ci =& get_instance(); // get ci instance @@ -54,27 +26,37 @@ class PlausicheckProducerLib } /** - * Executes check for a fehler_kurzbz, returns the result. - * @param $fehler_kurzbz string + * Executes plausicheck using a given library, returns the result. + * @param $libName string * @param $studiensemester_kurzbz string optionally needed for issue production * @param $studiengang_kz int optionally needed for issue production */ - public function producePlausicheckIssue($fehler_kurzbz, $studiensemester_kurzbz = null, $studiengang_kz = null) + public function producePlausicheckIssue($libName, $studiensemester_kurzbz = null, $studiengang_kz = null) { - $libName = $this->_fehlerLibMappings[$fehler_kurzbz]; - // get Studiensemester if (isEmptyString($studiensemester_kurzbz)) $studiensemester_kurzbz = $this->_currentStudiensemester; + // if called from extension (extension name set), path includes extension names + $libRootPath = isset($this->_extensionName) ? self::EXTENSIONS_FOLDER . '/' . $this->_extensionName . '/' : ''; + + // path for loading issue library + $issuesLibPath = $libRootPath . self::PLAUSI_ISSUES_FOLDER . '/'; + + // file path of library for check if file exists + $issuesLibFilePath = DOC_ROOT . self::CI_PATH + . '/' . $libRootPath . self::CI_LIBRARY_FOLDER . '/' . self::PLAUSI_ISSUES_FOLDER . '/' . $libName . '.php'; + // get path of library for issue to be produced - $issuesLibPath = DOC_ROOT . self::CI_LIBRARY_PATH . '/' . self::PLAUSI_ISSUES_FOLDER . '/'; - $issuesLibFilePath = $issuesLibPath . $libName . '.php'; + + //~ $issuesLibPath = DOC_ROOT . self::CI_LIBRARY_PATH . '/' . self::PLAUSI_ISSUES_FOLDER . '/'; + //~ $issuesLibFilePath = $issuesLibPath . $libName . '.php'; // check if library file exists if (!file_exists($issuesLibFilePath)) return error("Issue library file " . $issuesLibFilePath . " does not exist"); // load library connected to fehlercode - $this->_ci->load->library(self::PLAUSI_ISSUES_FOLDER . '/'.$libName); + //$this->_ci->load->library(self::PLAUSI_ISSUES_FOLDER . '/'.$libName); + $this->_ci->load->library($issuesLibPath . $libName); $lowercaseLibName = mb_strtolower($libName); @@ -91,12 +73,4 @@ class PlausicheckProducerLib // call the function for checking for issue production return $this->_ci->{$lowercaseLibName}->{self::EXECUTE_PLAUSI_CHECK_METHOD_NAME}($paramsForCheck); } - - /** - * Gets all fehler_kurzbz for fehler which need to be checked. - */ - public function getFehlerKurzbz() - { - return array_keys($this->_fehlerLibMappings); - } } From a667ddaf5e83dd361e0e1eeb70106bbbc5b9e1cb Mon Sep 17 00:00:00 2001 From: KarpAlex Date: Fri, 24 Feb 2023 13:32:37 +0100 Subject: [PATCH 012/246] Plausichecks: removed/changed comments --- application/core/IssueResolver_Controller.php | 2 -- application/libraries/issues/PlausicheckDefinitionLib.php | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/application/core/IssueResolver_Controller.php b/application/core/IssueResolver_Controller.php index 07210a2c9..758064ed8 100755 --- a/application/core/IssueResolver_Controller.php +++ b/application/core/IssueResolver_Controller.php @@ -62,8 +62,6 @@ abstract class IssueResolver_Controller extends JOB_Controller isset($issue->behebung_parameter) ? json_decode($issue->behebung_parameter, true) : array() ); - // TODO: what if extension/library folder changes? - // if called from extension (extension name set), path includes extension names $libRootPath = isset($this->_extensionName) ? self::EXTENSIONS_FOLDER . '/' . $this->_extensionName . '/' : ''; diff --git a/application/libraries/issues/PlausicheckDefinitionLib.php b/application/libraries/issues/PlausicheckDefinitionLib.php index 63fd6f570..cef28a736 100644 --- a/application/libraries/issues/PlausicheckDefinitionLib.php +++ b/application/libraries/issues/PlausicheckDefinitionLib.php @@ -38,7 +38,7 @@ class PlausicheckDefinitionLib ); /** - * Gets all fehler_kurzbz for fehler which need to be checked. + * Gets all fehler_kurzbz-library mappings for fehler which need to be checked. */ public function getFehlerLibMappings() { From 601eae1e95f8cf53b91347d0e7348f0998151537 Mon Sep 17 00:00:00 2001 From: KarpAlex Date: Fri, 24 Feb 2023 17:43:36 +0100 Subject: [PATCH 013/246] extension plausicheck bugfix: extension name is correctly passed to plausicheckproducerlib --- application/core/PlausiIssueProducer_Controller.php | 5 ++++- application/libraries/issues/PlausicheckProducerLib.php | 6 +++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/application/core/PlausiIssueProducer_Controller.php b/application/core/PlausiIssueProducer_Controller.php index b12f2481d..e6d47297c 100644 --- a/application/core/PlausiIssueProducer_Controller.php +++ b/application/core/PlausiIssueProducer_Controller.php @@ -11,7 +11,10 @@ abstract class PlausiIssueProducer_Controller extends JOB_Controller { parent::__construct(); - $this->load->library('issues/PlausicheckProducerLib'); + // pass extension name if calling from extension + $extensionName = isset($this->_extensionName) ? $this->_extensionName : null; + + $this->load->library('issues/PlausicheckProducerLib', array('extensionName' => $extensionName)); $this->load->library('IssuesLib'); } diff --git a/application/libraries/issues/PlausicheckProducerLib.php b/application/libraries/issues/PlausicheckProducerLib.php index 3297ecd1d..2f3e03f04 100644 --- a/application/libraries/issues/PlausicheckProducerLib.php +++ b/application/libraries/issues/PlausicheckProducerLib.php @@ -12,9 +12,13 @@ class PlausicheckProducerLib private $_ci; // ci instance private $_currentStudiensemester; // current Studiensemester + private $_extensionName; - public function __construct() + public function __construct($params = null) { + // set extension name if called from extension + if (isset($params['extensionName'])) $this->_extensionName = $params['extensionName']; + $this->_ci =& get_instance(); // get ci instance // load models From 84ca798dadc5ad814a949d69093ae3d113b369b9 Mon Sep 17 00:00:00 2001 From: Harald Bamberger Date: Wed, 8 Mar 2023 13:50:33 +0100 Subject: [PATCH 014/246] add format to set text as format for date columns and highlight them --- cis/private/lehre/notenliste.xls.php | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/cis/private/lehre/notenliste.xls.php b/cis/private/lehre/notenliste.xls.php index 4a6817a36..42dcc8418 100644 --- a/cis/private/lehre/notenliste.xls.php +++ b/cis/private/lehre/notenliste.xls.php @@ -121,6 +121,13 @@ else $format_highlightright->setBorderColor('white'); $format_highlightright->setAlign('right'); + $format_highlightright_date=& $workbook->addFormat(); + $format_highlightright_date->setFgColor(15); + $format_highlightright_date->setBorder(1); + $format_highlightright_date->setBorderColor('white'); + $format_highlightright_date->setAlign('right'); + $format_highlightright_date->setNumFormat(49); + $format_border_bottom =& $workbook->addFormat(); $format_border_bottom ->setBottom(2); $format_border_bottom->setBold(); @@ -230,7 +237,7 @@ else if (defined('CIS_GESAMTNOTE_PRUEFUNG_TERMIN3') && CIS_GESAMTNOTE_PRUEFUNG_TERMIN3) { $worksheet->write($lines,12,$p->t('global/uid'),$format_border_bottom); - $worksheet->write($lines,13,$p->t('global/uid'),$format_border_bottom); + $worksheet->write($lines,13,$p->t('global/datum'),$format_border_bottom); if(defined('CIS_GESAMTNOTE_PUNKTE') && CIS_GESAMTNOTE_PUNKTE) $worksheet->write($lines,14,$p->t('benotungstool/punkte'),$format_border_bottom); else @@ -328,9 +335,14 @@ else if ($output2) { $resultPr = $output2[0]; - $worksheet->write($lines,9, date('d.m.Y', strtotime($resultPr->datum)), $format_highlightright); + $worksheet->write($lines,9, date('d.m.Y', strtotime($resultPr->datum)), $format_highlightright_date); $worksheet->write($lines,10, $resultPr->note, $format_highlightright); } + else + { + $worksheet->write($lines,9, '', $format_highlightright_date); + $worksheet->write($lines,10, '', $format_highlightright); + } } // Nachprüfung @@ -344,9 +356,14 @@ else if ($output3) { $resultPr = $output3[0]; - $worksheet->write($lines,13, date('d.m.Y', strtotime($resultPr->datum)), $format_highlightright); + $worksheet->write($lines,13, date('d.m.Y', strtotime($resultPr->datum)), $format_highlightright_date); $worksheet->write($lines,14, $resultPr->note, $format_highlightright); } + else + { + $worksheet->write($lines,13, '', $format_highlightright_date); + $worksheet->write($lines,14, '', $format_highlightright); + } } $i++; From 3e056ebf3d35c6eacae1fd042e9358c3925c532c Mon Sep 17 00:00:00 2001 From: ma0068 Date: Fri, 24 Mar 2023 15:21:01 +0100 Subject: [PATCH 015/246] =?UTF-8?q?Notenimport=20Nachpr=C3=BCfung=20und=20?= =?UTF-8?q?3.Termin:=20Erg=C3=A4nzung=20um=20nicht=20numerische=20Noten?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../benotungstool/nachpruefungeintragen.php | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/cis/private/lehre/benotungstool/nachpruefungeintragen.php b/cis/private/lehre/benotungstool/nachpruefungeintragen.php index bf0d4b197..804ab34fb 100644 --- a/cis/private/lehre/benotungstool/nachpruefungeintragen.php +++ b/cis/private/lehre/benotungstool/nachpruefungeintragen.php @@ -42,6 +42,7 @@ require_once('../../../../include/benutzer.class.php'); require_once('../../../../include/student.class.php'); require_once('../../../../include/notenschluessel.class.php'); require_once('../../../../include/phrasen.class.php'); +require_once('../../../../include/note.class.php'); if (!$db = new basis_db()) @@ -79,6 +80,17 @@ $stsem_obj = new studiensemester(); if($stsem=='') $stsem = $stsem_obj->getaktorNext(); +//Notenanmerkung für Eintragung von nichtnumerischen Noten wie en (entschuldigt), ue(unentschuldigt) +$noten_anmerkung = array(); +$noten_arr = array(); +$note_obj = new note(); +$note_obj->getAll(); +foreach($note_obj->result as $row) +{ + $noten_anmerkung[$row->anmerkung] = $row->note; + $noten_arr[$row->note] = $row; +} + if(!isset($_GET['typ'])) { $typ='Termin2'; @@ -96,7 +108,7 @@ if (isset($_REQUEST['sammel']) && $_REQUEST["sammel"] == 1) $errorMatrnr = ''; $errorDatum = ''; $errorNachp = ''; - + foreach ($_POST as $row => $val) { if(mb_strstr(mb_strtolower($row), 'student_uid_')) @@ -154,6 +166,11 @@ if (isset($_REQUEST['sammel']) && $_REQUEST["sammel"] == 1) if(isset($_POST['student_uid_'.$id]) && (isset($_POST['note_'.$id]) || isset($_POST['punkte_'.$id])) && isset($_POST['datumNachp_'.$id])) { + if(!is_numeric($note)) + { + if(isset($noten_anmerkung[$note])) + $note = $noten_anmerkung[$note]; + } $response = savePruefung($lvid, $student_uid, $stsem, $lehreinheit_id, $datum, $typ, $note, $punkte); } else From 76c4c4a0e916226273063c30cc4463d051e36b62 Mon Sep 17 00:00:00 2001 From: ma0068 Date: Mon, 27 Mar 2023 08:15:29 +0200 Subject: [PATCH 016/246] Termin 3 als pruefungstyp in lehre.tbl_pruefungstyp in dbupdate hinterlegt --- system/dbupdate_3.4.php | 1 + .../25003_notenimport_nachpruefung.php | 15 +++++++++++++++ 2 files changed, 16 insertions(+) create mode 100644 system/dbupdate_3.4/25003_notenimport_nachpruefung.php diff --git a/system/dbupdate_3.4.php b/system/dbupdate_3.4.php index c3600d250..2597a0e4c 100644 --- a/system/dbupdate_3.4.php +++ b/system/dbupdate_3.4.php @@ -27,6 +27,7 @@ require_once('dbupdate_3.4/example.php'); require_once('dbupdate_3.4/example2.php'); ... */ +require_once('dbupdate_3.4/25003_notenimport_nachpruefung.php'); // *** Pruefung und hinzufuegen der neuen Attribute und Tabellen echo '

Pruefe Tabellen und Attribute!

'; diff --git a/system/dbupdate_3.4/25003_notenimport_nachpruefung.php b/system/dbupdate_3.4/25003_notenimport_nachpruefung.php new file mode 100644 index 000000000..7c2406d0e --- /dev/null +++ b/system/dbupdate_3.4/25003_notenimport_nachpruefung.php @@ -0,0 +1,15 @@ +db_query("SELECT 1 FROM lehre.tbl_pruefungstyp WHERE pruefungstyp_kurzbz='Termin3'")) +{ + if($db->db_num_rows($result)==0) + { + $qry = "INSERT INTO lehre.tbl_pruefungstyp(pruefungstyp_kurzbz, beschreibung, abschluss) VALUES('Termin3', '3.Termin', false);"; + + if(!$db->db_query($qry)) + echo 'Prüfungstyp: '.$db->db_last_error().'
'; + else + echo '
Prüfungstyp 3.Termin in lehre.tbl_pruefungstyp hinzugefügt'; + } +} From 80d5d09ed582462e1eb021799635d3f4246777c8 Mon Sep 17 00:00:00 2001 From: Harald Bamberger Date: Tue, 4 Apr 2023 08:07:03 +0200 Subject: [PATCH 017/246] fix styling of textarea in import popup --- .../lehre/benotungstool/lvgesamtnoteverwalten.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/cis/private/lehre/benotungstool/lvgesamtnoteverwalten.php b/cis/private/lehre/benotungstool/lvgesamtnoteverwalten.php index 4dcd6c7cf..d498636ae 100644 --- a/cis/private/lehre/benotungstool/lvgesamtnoteverwalten.php +++ b/cis/private/lehre/benotungstool/lvgesamtnoteverwalten.php @@ -145,8 +145,8 @@ echo ' position:absolute; top:100px; left:300px; - width:400px; - height:200px; + min-width:450px; + min-height:200px; background-color:#cccccc; visibility:hidden; border-style:solid; @@ -594,8 +594,8 @@ foreach ($noten_obj->result as $row) str += "X"; var anlegendiv = document.getElementById("nachpruefung_div"); var y = getOffset('y'); y = y+50; anlegendiv.style.top = y+"px"; - str += 't('benotungstool/importAnweisung');?>:'; - str += ''; + str += '
t('benotungstool/importAnweisung');?>:
'; + str += ''; str += "' onclick='saveGradeBulk();'>"; str += ""; anlegendiv.innerHTML = str; @@ -612,8 +612,8 @@ foreach ($noten_obj->result as $row) str += "X"; var anlegendiv = document.getElementById("nachpruefung_div"); var y = getOffset('y'); y = y+50; anlegendiv.style.top = y+"px"; - str += 't('benotungstool/importAnweisungNachp');?>:'; - str += ''; + str += '
t('benotungstool/importAnweisungNachp');?>:
'; + str += ''; str += "' onclick='saveGradeBulkNachp(\""+ termin +"\");'>"; str += ""; From fb57ea5838731be8532efd2fc5c5e8add5d8feb6 Mon Sep 17 00:00:00 2001 From: ma0048 Date: Tue, 4 Apr 2023 15:57:33 +0200 Subject: [PATCH 018/246] - splitten von reihungstest uebersichten --- include/reihungstest.class.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/include/reihungstest.class.php b/include/reihungstest.class.php index 42af8ea7a..2da424af5 100644 --- a/include/reihungstest.class.php +++ b/include/reihungstest.class.php @@ -687,7 +687,9 @@ class reihungstest extends basis_db tbl_reihungstest.anmeldefrist, tbl_reihungstest.aufnahmegruppe_kurzbz, tbl_studiengang.typ, - UPPER(typ::varchar(1) || kurzbz) AS stg_kuerzel + UPPER(typ::varchar(1) || kurzbz) AS stg_kuerzel, + tbl_studiengang.bezeichnung, + tbl_studiengang.english FROM public.tbl_rt_person JOIN @@ -734,6 +736,8 @@ class reihungstest extends basis_db $obj->aufnahmegruppe_kurzbz = $row->aufnahmegruppe_kurzbz; $obj->typ = $row->typ; $obj->stg_kuerzel = $row->stg_kuerzel; + $obj->bezeichnung = $row->bezeichnung; + $obj->english = $row->english; $this->result[] = $obj; } From a1a9b10ee1fe483c98a934346f5b4adc6ec2eebc Mon Sep 17 00:00:00 2001 From: KarpAlex Date: Tue, 4 Apr 2023 16:17:18 +0200 Subject: [PATCH 019/246] plausicheck issues: enabled generic passing of different parameters, not just core plausicheck specific. moved studiensemester param to specific PlausiIssueProducer controller --- .../controllers/jobs/PlausiIssueProducer.php | 23 ++++++++++++++++ .../core/PlausiIssueProducer_Controller.php | 11 +++----- .../issues/PlausicheckProducerLib.php | 27 ++----------------- 3 files changed, 28 insertions(+), 33 deletions(-) diff --git a/application/controllers/jobs/PlausiIssueProducer.php b/application/controllers/jobs/PlausiIssueProducer.php index e94cd93dc..9e6ef1884 100644 --- a/application/controllers/jobs/PlausiIssueProducer.php +++ b/application/controllers/jobs/PlausiIssueProducer.php @@ -5,14 +5,37 @@ */ class PlausiIssueProducer extends PlausiIssueProducer_Controller { + private $_currentStudiensemester; + public function __construct() { parent::__construct(); $this->load->library('issues/PlausicheckDefinitionLib'); + // load models + $this->load->model('organisation/studiensemester_model', 'StudiensemesterModel'); + + // get current Studiensemester + $studiensemesterRes = $this->StudiensemesterModel->getAkt(); + if (hasData($studiensemesterRes)) $this->_currentStudiensemester = getData($studiensemesterRes)[0]->studiensemester_kurzbz; + // set fehler which can be produced by the job // structure: fehler_kurzbz => class (library) name for resolving $this->_fehlerLibMappings = $this->plausicheckdefinitionlib->getFehlerLibMappings(); } + + /** + * Runs issue production job. + * @param studiensemester_kurzbz string job is run for students of a certain semester. + * @param studiengang_kz int job is run for students of certain Studiengang. + */ + public function run($studiensemester_kurzbz = null, $studiengang_kz = null) + { + // get Studiensemester + if (isEmptyString($studiensemester_kurzbz)) $studiensemester_kurzbz = $this->_currentStudiensemester; + + // producing issues for semester and optionally Studiengang + $this->producePlausicheckIssues(array('studiensemester_kurzbz' => $studiensemester_kurzbz, 'studiengang_kz' => $studiengang_kz)); + } } diff --git a/application/core/PlausiIssueProducer_Controller.php b/application/core/PlausiIssueProducer_Controller.php index e6d47297c..16d01e787 100644 --- a/application/core/PlausiIssueProducer_Controller.php +++ b/application/core/PlausiIssueProducer_Controller.php @@ -14,16 +14,12 @@ abstract class PlausiIssueProducer_Controller extends JOB_Controller // pass extension name if calling from extension $extensionName = isset($this->_extensionName) ? $this->_extensionName : null; + // load libraries $this->load->library('issues/PlausicheckProducerLib', array('extensionName' => $extensionName)); $this->load->library('IssuesLib'); } - /** - * Runs issue production job. - * @param studiensemester_kurzbz string job is run for students of a certain semester. - * @param studiengang_kz int job is run for students of certain Studiengang. - */ - public function run($studiensemester_kurzbz = null, $studiengang_kz = null) + protected function producePlausicheckIssues($params) { $this->logInfo("Plausicheck issue producer job started"); @@ -34,8 +30,7 @@ abstract class PlausiIssueProducer_Controller extends JOB_Controller $this->logInfo("Checking " . $fehler_kurzbz . "..."); $plausicheckRes = $this->plausicheckproducerlib->producePlausicheckIssue( $libName, - $studiensemester_kurzbz, - $studiengang_kz + $params ); if (isError($plausicheckRes)) $this->logError(getError($plausicheckRes)); diff --git a/application/libraries/issues/PlausicheckProducerLib.php b/application/libraries/issues/PlausicheckProducerLib.php index 2f3e03f04..c726fa6da 100644 --- a/application/libraries/issues/PlausicheckProducerLib.php +++ b/application/libraries/issues/PlausicheckProducerLib.php @@ -11,7 +11,6 @@ class PlausicheckProducerLib const EXECUTE_PLAUSI_CHECK_METHOD_NAME = 'executePlausiCheck'; private $_ci; // ci instance - private $_currentStudiensemester; // current Studiensemester private $_extensionName; public function __construct($params = null) @@ -20,13 +19,6 @@ class PlausicheckProducerLib if (isset($params['extensionName'])) $this->_extensionName = $params['extensionName']; $this->_ci =& get_instance(); // get ci instance - - // load models - $this->_ci->load->model('organisation/studiensemester_model', 'StudiensemesterModel'); - - // get current Studiensemester - $studiensemesterRes = $this->_ci->StudiensemesterModel->getAkt(); - if (hasData($studiensemesterRes)) $this->_currentStudiensemester = getData($studiensemesterRes)[0]->studiensemester_kurzbz; } /** @@ -35,11 +27,8 @@ class PlausicheckProducerLib * @param $studiensemester_kurzbz string optionally needed for issue production * @param $studiengang_kz int optionally needed for issue production */ - public function producePlausicheckIssue($libName, $studiensemester_kurzbz = null, $studiengang_kz = null) + public function producePlausicheckIssue($libName, $params) { - // get Studiensemester - if (isEmptyString($studiensemester_kurzbz)) $studiensemester_kurzbz = $this->_currentStudiensemester; - // if called from extension (extension name set), path includes extension names $libRootPath = isset($this->_extensionName) ? self::EXTENSIONS_FOLDER . '/' . $this->_extensionName . '/' : ''; @@ -50,16 +39,10 @@ class PlausicheckProducerLib $issuesLibFilePath = DOC_ROOT . self::CI_PATH . '/' . $libRootPath . self::CI_LIBRARY_FOLDER . '/' . self::PLAUSI_ISSUES_FOLDER . '/' . $libName . '.php'; - // get path of library for issue to be produced - - //~ $issuesLibPath = DOC_ROOT . self::CI_LIBRARY_PATH . '/' . self::PLAUSI_ISSUES_FOLDER . '/'; - //~ $issuesLibFilePath = $issuesLibPath . $libName . '.php'; - // check if library file exists if (!file_exists($issuesLibFilePath)) return error("Issue library file " . $issuesLibFilePath . " does not exist"); // load library connected to fehlercode - //$this->_ci->load->library(self::PLAUSI_ISSUES_FOLDER . '/'.$libName); $this->_ci->load->library($issuesLibPath . $libName); $lowercaseLibName = mb_strtolower($libName); @@ -68,13 +51,7 @@ class PlausicheckProducerLib if (!is_callable(array($this->_ci->{$lowercaseLibName}, self::EXECUTE_PLAUSI_CHECK_METHOD_NAME))) return error("Method " . self::EXECUTE_PLAUSI_CHECK_METHOD_NAME . " is not defined in library $lowercaseLibName"); - // pass the data needed for issue check - $paramsForCheck = array( - 'studiensemester_kurzbz' => $studiensemester_kurzbz, - 'studiengang_kz' => $studiengang_kz - ); - // call the function for checking for issue production - return $this->_ci->{$lowercaseLibName}->{self::EXECUTE_PLAUSI_CHECK_METHOD_NAME}($paramsForCheck); + return $this->_ci->{$lowercaseLibName}->{self::EXECUTE_PLAUSI_CHECK_METHOD_NAME}($params); } } From a63a79ab91a2a2233e974328ad0e7ff0efc327ae Mon Sep 17 00:00:00 2001 From: cgfhtw Date: Fri, 7 Apr 2023 14:10:30 +0200 Subject: [PATCH 020/246] add param tableOnly & save for multiple components on one page --- public/js/components/filter/Filter.js | 247 +++++++++++++++----------- 1 file changed, 142 insertions(+), 105 deletions(-) diff --git a/public/js/components/filter/Filter.js b/public/js/components/filter/Filter.js index e153042ad..7a46fd629 100644 --- a/public/js/components/filter/Filter.js +++ b/public/js/components/filter/Filter.js @@ -23,6 +23,8 @@ import {CoreFetchCmpt} from '../../components/Fetch.js'; const FILTER_COMPONENT_NEW_FILTER = 'Filter Component New Filter'; const FILTER_COMPONENT_NEW_FILTER_TYPE = 'Filter Component New Filter Type'; +var _uuid = 0; + /** * */ @@ -42,10 +44,12 @@ export const CoreFilterCmpt = { required: true }, tabulatorOptions: Object, - tabulatorEvents: Array + tabulatorEvents: Array, + tableOnly: Boolean }, data: function() { return { + uuid: 0, // FilterCmpt properties filterName: null, fields: null, @@ -54,7 +58,6 @@ export const CoreFilterCmpt = { selectedFields: null, notSelectedFields: null, filterFields: null, - columnsAlias: null, availableFilters: null, @@ -64,104 +67,136 @@ export const CoreFilterCmpt = { fetchCmptApiFunctionParams: null, fetchCmptDataFetched: null, - tabulator: null + tabulator: null, + tableBuilt: false }; }, - created: function() { - this.getFilter(); // get the filter data - }, - updated: function() { - // - let dataset = JSON.parse(JSON.stringify(this.dataset)); - let fields = JSON.parse(JSON.stringify(this.fields)); - let selectedFields = JSON.parse(JSON.stringify(this.selectedFields)); + computed: { + filteredData() { + if (!this.dataset) + return []; + return JSON.parse(JSON.stringify(this.dataset)); + }, + filteredColumns() { + let fields = JSON.parse(JSON.stringify(this.fields)) || []; + let selectedFields = JSON.parse(JSON.stringify(this.selectedFields)) || []; - // - let columns = null; + let columns = null; - // If the tabulator options has been provided and it contains the property columns - if (this.tabulatorOptions != null && this.tabulatorOptions.hasOwnProperty('columns')) - { - columns = this.tabulatorOptions.columns; - } + // If the tabulator options has been provided and it contains the property columns + if (this.tabulatorOptions && this.tabulatorOptions.hasOwnProperty('columns')) + columns = this.tabulatorOptions.columns; - // If columns is not an array or it is an array with less elements then the array fields - if (!Array.isArray(columns) || (Array.isArray(columns) && columns.length < fields.length)) - { - columns = []; // set it as an empty array - - // Loop throught all the retrieved columns from database - for (let i = 0; i < fields.length; i++) + // If columns is not an array or it is an array with less elements then the array fields + if (!Array.isArray(columns) || (Array.isArray(columns) && columns.length < fields.length)) { - // Create a new column having the title equal to the field name - let column = { - title: fields[i], - field: fields[i] - }; + columns = []; // set it as an empty array - // If the column has to be displayed or not - selectedFields.indexOf(fields[i]) >= 0 ? column.visible = true : column.visible = false; - - // Add the new column to the list of columns - columns.push(column); - } - } - else // the property columns has been provided in the tabulator options - { - // Loop throught the property columns of the tabulator options - for (let i = 0; i < columns.length; i++) - { - // If the column has to be displayed or not - selectedFields.indexOf(columns[i].field) >= 0 ? columns[i].visible = true : columns[i].visible = false; - - if (columns[i].hasOwnProperty('resizable')) + // Loop throught all the retrieved columns from database + for (let field of fields) { - columns[i].visible ? columns[i].resizable = true : columns[i].resizable = false; - } + // Create a new column having the title equal to the field name + let column = { + title: field, + field: field + }; + + // If the column has to be displayed or not + column.visible = selectedFields.indexOf(field) >= 0; + + // Add the new column to the list of columns + columns.push(column); + } } - } - - this.columnsAlias = columns; - - // Define a default tabulator options in case it was not provided - let tabulatorOptions = { - height: 500, - layout: "fitColumns", - movableColumns: true, - reactiveData: true, - columns: columns, - data: JSON.parse(JSON.stringify(this.dataset)) - }; - - // If it was provided - if (this.tabulatorOptions != null) - { - // Then copy it... - tabulatorOptions = this.tabulatorOptions; - // ...and overwrite the properties data, reactiveData, movableColumns and columns - tabulatorOptions.data = JSON.parse(JSON.stringify(this.dataset)); - tabulatorOptions.columns = columns; - tabulatorOptions.reactiveData = true; - tabulatorOptions.movableColumns = true; - } - - // Start the tabulator with the buid options - this.tabulator = new Tabulator( - "#filterTableDataset", - tabulatorOptions - ); - - // If event handlers have been provided - if (Array.isArray(this.tabulatorEvents) && this.tabulatorEvents.length > 0) - { - // Attach all the provided event handlers to the started tabulator - for (let i = 0; i < this.tabulatorEvents.length; i++) + else // the property columns has been provided in the tabulator options { - this.tabulator.on(this.tabulatorEvents[i].event, this.tabulatorEvents[i].handler); + // Loop throught the property columns of the tabulator options + for (let col of columns) + { + // If the column has to be displayed or not + col.visible = selectedFields.indexOf(col.field) >= 0; + + if (col.hasOwnProperty('resizable')) + col.resizable = col.visible; + } } + + return columns; + }, + fieldNames() { + if (!this.tableBuilt) + return {}; + return this.tabulator.getColumns().reduce((res, col) => { + res[col.getField()] = col.getDefinition().title; + return res; + }, {}); + }, + idExtra() { + if (!this.uuid) + return ''; + return '-' + this.uuid; } }, + beforeCreate() { + if (!this.tableOnly == !this.filterType) + console.warn('You can not have a filter-type in table-only mode!'); + }, + created() { + this.uuid = _uuid++; + if (!this.tableOnly) + this.getFilter(); // get the filter data + }, + mounted() { + this.initTabulator(); + }, methods: { + initTabulator() { + // Define a default tabulator options in case it was not provided + let tabulatorOptions = {...{ + height: 500, + layout: "fitColumns", + movableColumns: true, + reactiveData: true + }, ...(this.tabulatorOptions || {})}; + + if (!this.tableOnly) { + tabulatorOptions.data = this.filteredData; + tabulatorOptions.columns = this.filteredColumns; + } + + // Start the tabulator with the build options + this.tabulator = new Tabulator( + this.$refs.table, + tabulatorOptions + ); + // If event handlers have been provided + if (Array.isArray(this.tabulatorEvents) && this.tabulatorEvents.length > 0) + { + // Attach all the provided event handlers to the started tabulator + for (let evt of this.tabulatorEvents) + this.tabulator.on(evt.event, evt.handler); + } + this.tabulator.on('tableBuilt', () => this.tableBuilt = true); + if (this.tableOnly) { + this.tabulator.on('tableBuilt', () => { + const cols = this.tabulator.getColumns(); + this.fields = cols.map(col => col.getField()); + this.selectedFields = cols.filter(col => col.isVisible()).map(col => col.getField()); + }); + } + }, + updateTabulator() { + if (this.tabulator) { + if (this.tableBuilt) + this._updateTabulator(); + else + this.tabulator.on('tableBuilt', this._updateTabulator); + } + }, + _updateTabulator() { + this.tabulator.setData(this.filteredData); + this.tabulator.setColumns(this.filteredColumns); + }, /** * */ @@ -209,6 +244,7 @@ export const CoreFilterCmpt = { { this.setDropDownMenu(data); } + this.updateTabulator(); } else { @@ -335,7 +371,7 @@ export const CoreFilterCmpt = { this.startFetchCmpt( CoreFilterAPIs.saveCustomFilter, { - customFilterName: document.getElementById('customFilterName').value + customFilterName: this.$refscustomFilterName.value }, this.getFilter ); @@ -463,22 +499,22 @@ export const CoreFilterCmpt = { /* * */ - handlerToggleSelectedField: function(event) { + handlerToggleSelectedField(field) { // If it is a selected field - if (this.selectedFields.indexOf(event.target.innerText) != -1) + if (this.selectedFields.indexOf(field) != -1) { // then hide it - this.tabulator.hideColumn(event.target.innerText); + this.tabulator.hideColumn(field); // and remove it from the this.selectedFields property - this.selectedFields.splice(this.selectedFields.indexOf(event.target.innerText), 1); + this.selectedFields.splice(this.selectedFields.indexOf(field), 1); } else // otherwise { // show it - this.tabulator.showColumn(event.target.innerText); + this.tabulator.showColumn(field); // and add it to the this.selectedFields property - this.selectedFields.push(event.target.innerText); + this.selectedFields.push(field); } }, /** @@ -527,6 +563,7 @@ export const CoreFilterCmpt = { template: ` -
+
- [ {{ filterName }} ] - - + [ {{ filterName }} ] + +
-
+
@@ -558,9 +595,9 @@ export const CoreFilterCmpt = {
- {{ fieldToDisplay }} + {{ fieldNames[fieldToDisplay] || fieldToDisplay }}
@@ -568,7 +605,7 @@ export const CoreFilterCmpt = {
-
+
@@ -591,7 +628,7 @@ export const CoreFilterCmpt = {
-
+
diff --git a/public/js/components/Studierendenantrag/Lvzuweisung.js b/public/js/components/Studierendenantrag/Lvzuweisung.js index cbc97b79e..d987f55be 100644 --- a/public/js/components/Studierendenantrag/Lvzuweisung.js +++ b/public/js/components/Studierendenantrag/Lvzuweisung.js @@ -108,6 +108,14 @@ export default { { let res = {}; for (var k in result.data.retval) { + if (result.data.retval[k] === null) { + const alert = document.createElement('div'); + alert.innerHTML = this.p.t('studierendenantrag', 'error_stg_last_semester'); + alert.className = 'alert alert-warning'; + alert.role = 'alert'; + this.$refs["lvtable" + k.substr(0,1)].append(alert); + continue; + } let lvs = result.data.retval[k].reduce((obj,lv) => { obj[lv.studienplan_lehrveranstaltung_id] = lv; return obj; @@ -129,8 +137,9 @@ export default { var table = new Tabulator(this.$refs["lvtable" + k.substr(0,1)], { data: current, dataTree: true, - dataTreeStartExpanded:true, //start with an expanded tree - dataTreeChildIndent:15, + dataTreeStartExpanded: true, //start with an expanded tree + dataTreeChildIndent: 15, + layout: "fitDataStretch", columns: [ {title: this.p.t('ui','bezeichnung'), field: "bezeichnung"}, {title: this.p.t('lehre','lehrform'), field: "lehrform_kurzbz"}, @@ -197,7 +206,7 @@ export default { input.type = "text"; input.value = cell.getValue() || ""; input.addEventListener('input', () => { - lvs[data.studienplan_lehrveranstaltung_id].antrag_zugelassen = input.value; + lvs[data.studienplan_lehrveranstaltung_id].antrag_anmerkung = input.value; }); return input; } diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php index f6df3afad..562e4e5c2 100644 --- a/system/phrasesupdate.php +++ b/system/phrasesupdate.php @@ -19906,6 +19906,26 @@ array( ) ) ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'error_stg_last_semester', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Der Studiengang hat nicht genügend Semester', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'The course does not have enough semesters', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), ); From 3ca80904eafa3080bb9615426514db987dd1ced4 Mon Sep 17 00:00:00 2001 From: cgfhtw Date: Tue, 4 Jul 2023 15:59:43 +0200 Subject: [PATCH 087/246] =?UTF-8?q?Verbesserungen=20Unterbrecher=20best?= =?UTF-8?q?=C3=A4tigen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- application/libraries/AntragLib.php | 6 ++++++ application/libraries/PrestudentLib.php | 19 +++++++++++++++++-- .../27351_digitalisierung_formulare.php | 4 ++-- 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/application/libraries/AntragLib.php b/application/libraries/AntragLib.php index f1a757bc2..e3119d65b 100644 --- a/application/libraries/AntragLib.php +++ b/application/libraries/AntragLib.php @@ -288,6 +288,7 @@ class AntragLib } else { + $studierendenantrag_status_id = getData($result); $resultAntrag = $this->_ci->StudierendenantragModel->load($studierendenantrag_id); if (isError($resultAntrag)) return $resultAntrag; @@ -299,6 +300,11 @@ class AntragLib // Prestudentstatus und Unterbrechungsfolgeaktionen setzen $result = $this->_ci->prestudentlib->setUnterbrecher($resultAntrag->prestudent_id, $resultAntrag->studiensemester_kurzbz, $studierendenantrag_id); + if (isError($result)) { + $this->_ci->StudierendenantragstatusModel->delete($studierendenantrag_status_id); + return $result; + } + //Mail $subject = 'Unterbrechung freigegeben'; $mail = []; diff --git a/application/libraries/PrestudentLib.php b/application/libraries/PrestudentLib.php index 6dff4e812..2597b40d0 100644 --- a/application/libraries/PrestudentLib.php +++ b/application/libraries/PrestudentLib.php @@ -203,8 +203,23 @@ class PrestudentLib if (isError($result)) return $result; $result = getData($result); - if (!$result) - return error('Kein Prestudent in diesem Studiensemester gefunden'); + if (!$result) { + /** TODO(chris): Zukünftige Unterbrecher so nicht möglich + * - Verband und Gruppe dürfen noch nicht gesetzt werden + * - Keine Garantie das Ausbildungssemester gleich bleibt (weiter Unterbrechungen oder eine Wiederholung in der Zwischenzeit) + * - LVs eventuell nicht zugewießen + * Mögliche Lösung: JOB! + + $result = $this->_ci->PrestudentstatusModel->getLastStatus($prestudent_id); + if (isError($result)) + return $result; + $result = getData($result); + if (!$result) { + return error('Kein Prestudent status gefunden'); + } + $result->studiensemester_kurzbz*/ + return error('Kein Prestudent status gefunden'); + } $prestudent_status = current($result); diff --git a/system/dbupdate_3.4/27351_digitalisierung_formulare.php b/system/dbupdate_3.4/27351_digitalisierung_formulare.php index a40b457e2..e94bd2b61 100644 --- a/system/dbupdate_3.4/27351_digitalisierung_formulare.php +++ b/system/dbupdate_3.4/27351_digitalisierung_formulare.php @@ -100,8 +100,8 @@ if(!$result = @$db->db_query("SELECT 1 FROM campus.tbl_studierendenantrag_status CACHE 1; ALTER TABLE campus.tbl_studierendenantrag_status ALTER COLUMN studierendenantrag_status_id SET DEFAULT nextval('campus.tbl_studierendenantrag_status_studierendenantrag_status_id_seq'); - GRANT SELECT, INSERT ON campus.tbl_studierendenantrag_status TO vilesci; - GRANT SELECT, INSERT ON campus.tbl_studierendenantrag_status TO web; + GRANT SELECT, INSERT, DELETE ON campus.tbl_studierendenantrag_status TO vilesci; + GRANT SELECT, INSERT, DELETE ON campus.tbl_studierendenantrag_status TO web; GRANT SELECT, UPDATE ON campus.tbl_studierendenantrag_status_studierendenantrag_status_id_seq TO vilesci; GRANT SELECT, UPDATE ON campus.tbl_studierendenantrag_status_studierendenantrag_status_id_seq TO web;"; From 800b490c620315da87ed8cb2d050f0c11526192d Mon Sep 17 00:00:00 2001 From: Werner Masik Date: Tue, 4 Jul 2023 18:07:09 +0200 Subject: [PATCH 088/246] added function to get chart data --- .../vertragsbestandteil/Gehaltsbestandteil.php | 17 +++++++++++++++++ .../Gehaltsbestandteil_model.php | 6 ++++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/application/libraries/vertragsbestandteil/Gehaltsbestandteil.php b/application/libraries/vertragsbestandteil/Gehaltsbestandteil.php index f48a969c8..6964907f3 100644 --- a/application/libraries/vertragsbestandteil/Gehaltsbestandteil.php +++ b/application/libraries/vertragsbestandteil/Gehaltsbestandteil.php @@ -1,6 +1,8 @@ bis; } + public function getVonDateTime() + { + return $this->toDateTime($this->von); + } + + public function getBisDateTime() + { + return $this->toDateTime($this->bis); + } + + protected function toDateTime($d) { + if ($d == null) return null; + return new DateTimeImmutable($d); + } + public function getAnmerkung() { return $this->anmerkung; diff --git a/application/models/vertragsbestandteil/Gehaltsbestandteil_model.php b/application/models/vertragsbestandteil/Gehaltsbestandteil_model.php index bb00345f2..f640e25d0 100644 --- a/application/models/vertragsbestandteil/Gehaltsbestandteil_model.php +++ b/application/models/vertragsbestandteil/Gehaltsbestandteil_model.php @@ -71,13 +71,14 @@ class Gehaltsbestandteil_model extends DB_Model implements IEncryption $this->getEncryptedColumns()); } - public function getGBTChartDataByDV($dienstverhaeltnis_id) + public function getGBTChartDataByDV_old($dienstverhaeltnis_id) { $qry = " WITH gbt as (select von,bis,grundbetrag as grund_betrag_decrypted from hr.tbl_gehaltsbestandteil where dienstverhaeltnis_id=?) - select von,bis, (select sum(gbt.grund_betrag_decrypted) as sum_betrag from gbt where gbt.von<=gbtmeta.von and (gbt.bis is null or gbt.bis>=gbtmeta.von) + select von,bis, (select sum(gbt.grund_betrag_decrypted) as sum_betrag + from gbt where gbt.von<=gbtmeta.von and (gbt.bis is null or gbt.bis>=gbtmeta.von) ) as summe from gbt as gbtmeta order by von,bis "; @@ -85,6 +86,7 @@ class Gehaltsbestandteil_model extends DB_Model implements IEncryption array($dienstverhaeltnis_id), $this->getEncryptedColumns()); } + public function getGehaltsbestandteile($dienstverhaeltnis_id, $stichtag=null, $includefuture=false) { From 61856473eaf40242128fd170c23d156bc0b3c0ba Mon Sep 17 00:00:00 2001 From: cgfhtw Date: Wed, 5 Jul 2023 08:30:33 +0200 Subject: [PATCH 089/246] Leitungsansicht Autocomplete 1st draft --- .../components/Antrag/Abmeldung.php | 7 +- application/libraries/AntragLib.php | 10 ++- .../models/organisation/Studiengang_model.php | 17 +++- application/views/templates/FHC-Footer.php | 1 + public/js/apps/lehre/Antrag/Leitung.js | 2 +- .../Studierendenantrag/Leitung/Actions/New.js | 84 ++++++++++++------- 6 files changed, 86 insertions(+), 35 deletions(-) diff --git a/application/controllers/components/Antrag/Abmeldung.php b/application/controllers/components/Antrag/Abmeldung.php index 9130c1d7d..44d1b5c4a 100644 --- a/application/controllers/components/Antrag/Abmeldung.php +++ b/application/controllers/components/Antrag/Abmeldung.php @@ -167,9 +167,12 @@ class Abmeldung extends FHC_Controller { $this->load->library('PermissionLib'); + $_POST = json_decode($this->input->raw_input_stream, true); + $query = $this->input->post('query'); + $studiengaenge = $this->permissionlib->getSTG_isEntitledFor('student/studierendenantrag'); - $result = $this->antraglib->getAbmeldeBerechtigtForStg($studiengaenge); + $result = $this->antraglib->getAktivePrestudentenInStgs($studiengaenge, $query); if (isError($result)) { return $this->outputJsonError(getError($result)); } @@ -178,6 +181,8 @@ class Abmeldung extends FHC_Controller return $this->outputJsonSuccess([]); } + return $this->outputJsonSuccess($result); + $sortedStudents = []; foreach ($result as $item) { if (!isset($sortedStudents[$item->studiengang_kz])) diff --git a/application/libraries/AntragLib.php b/application/libraries/AntragLib.php index e3119d65b..e06c57544 100644 --- a/application/libraries/AntragLib.php +++ b/application/libraries/AntragLib.php @@ -1188,13 +1188,15 @@ class AntragLib return $stsems; } - public function getAbmeldeBerechtigtForStg($studiengaenge) + public function getAktivePrestudentenInStgs($studiengaenge, $query) { $blacklist = $this->_ci->config->item('stgkz_blacklist_abmeldung'); $studiengaenge = array_diff($studiengaenge, $blacklist); - return $this->_ci->StudiengangModel->getAktivePrestudenten($studiengaenge, [ - Studierendenantrag_model::TYP_ABMELDUNG - ]); + return $this->_ci->StudiengangModel->getAktivePrestudenten( + $studiengaenge, + [ Studierendenantrag_model::TYP_ABMELDUNG ], + $query + ); } public function getFailedExamForPrestudent($prestudent_id) diff --git a/application/models/organisation/Studiengang_model.php b/application/models/organisation/Studiengang_model.php index ea9e5857e..1e5c16cc5 100644 --- a/application/models/organisation/Studiengang_model.php +++ b/application/models/organisation/Studiengang_model.php @@ -532,7 +532,7 @@ class Studiengang_model extends DB_Model * * @return stdClass */ - public function getAktivePrestudenten($studiengang_kzs, $not_antrag_typ = null) + public function getAktivePrestudenten($studiengang_kzs, $not_antrag_typ = null, $query = null) { $this->load->config('studierendenantrag'); @@ -571,6 +571,21 @@ class Studiengang_model extends DB_Model $this->db->group_end(); } + if ($query) { + $query = explode(' ', $query); + $this->db->group_start(); + foreach ($query as $q) { + $this->db->group_start(); + $this->db->where('pers.vorname ILIKE', "%" . $q . "%"); + $this->db->or_where('pers.nachname ILIKE', "%" . $q . "%"); + $this->db->or_where($this->dbTable . '.bezeichnung ILIKE', "%" . $q . "%"); + if (is_numeric($q)) + $this->db->or_where('p.prestudent_id', $q); + $this->db->group_end(); + } + $this->db->group_end(); + } + return $this->load(); } } diff --git a/application/views/templates/FHC-Footer.php b/application/views/templates/FHC-Footer.php index c461dd8b0..f4d66a9b9 100644 --- a/application/views/templates/FHC-Footer.php +++ b/application/views/templates/FHC-Footer.php @@ -122,6 +122,7 @@ generateJSsInclude('vendor/npm-asset/primevue/column/column.min.js'); generateJSsInclude('vendor/npm-asset/primevue/calendar/calendar.min.js'); generateJSsInclude('vendor/npm-asset/primevue/skeleton/skeleton.min.js'); + generateJSsInclude('vendor/npm-asset/primevue/autocomplete/autocomplete.min.js'); } // -------------------------------------------------------------------------------------------------------- diff --git a/public/js/apps/lehre/Antrag/Leitung.js b/public/js/apps/lehre/Antrag/Leitung.js index 0e68cccba..e243aad93 100644 --- a/public/js/apps/lehre/Antrag/Leitung.js +++ b/public/js/apps/lehre/Antrag/Leitung.js @@ -5,4 +5,4 @@ const app = Vue.createApp({ StudierendenantragLeitung } }); -app.mount('#wrapper'); +app.use(primevue.config.default).mount('#wrapper'); diff --git a/public/js/components/Studierendenantrag/Leitung/Actions/New.js b/public/js/components/Studierendenantrag/Leitung/Actions/New.js index 8a98a6aa5..b9c21b05f 100644 --- a/public/js/components/Studierendenantrag/Leitung/Actions/New.js +++ b/public/js/components/Studierendenantrag/Leitung/Actions/New.js @@ -4,7 +4,8 @@ import Phrasen from '../../../../mixins/Phrasen.js'; export default { components: { - BsModal + BsModal, + AutoComplete: primevue.autocomplete }, mixins: [ Phrasen @@ -15,8 +16,7 @@ export default { data() { return { data: [], - student: '', - stg: '' + student: '' } }, computed: { @@ -24,13 +24,13 @@ export default { return FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + '/lehre/Studierendenantrag/abmeldung/' + this.student; }, students() { - if (!this.stg) - return []; - if (!this.data[this.stg]) - return []; - return this.data[this.stg].studenten.sort( + return this.data.sort( (a, b) => a.nachname == b.nachname ? - a.vorname > b.vorname : + ( + a.vorname == b.vorname ? + a.bezeichnung > b.bezeichnung : + a.vorname > b.vorname + ) : a.nachname > b.nachname ); }, @@ -47,15 +47,17 @@ export default { }), { dialogClass: 'modal-fullscreen' }, this.p.t('studierendenantrag', 'antrag_header')).then(() => { + this.data = []; this.loadSelects(); this.$emit('reload'); }); }, - loadSelects() { - return axios.get( + loadData(evt) { + axios.post( FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + - '/components/Antrag/Abmeldung/getStudiengaengeAssistenz/' + '/components/Antrag/Abmeldung/getStudiengaengeAssistenz/', + evt ).then( result => { if (result.data.error) { @@ -66,14 +68,30 @@ export default { return result; } ); + }, + loadSelects() { + if (this.hasNoData) { + return axios.post( + FHC_JS_DATA_STORAGE_OBJECT.app_root + + FHC_JS_DATA_STORAGE_OBJECT.ci_router + + '/components/Antrag/Abmeldung/getStudiengaengeAssistenz/', + {query: 'felix'} + ).then( + result => { + if (result.data.error) { + BsAlert.popup(result.data.retval, {dialogClass: 'alert alert-danger'}); + } else { + this.data = result.data.retval; + } + return result; + } + ); + } } }, - created() { - return this.loadSelects(); - }, template: `
- @@ -85,22 +103,32 @@ export default {
From d4450e1ae16da849079fbcc2b946c8aaecb1ed14 Mon Sep 17 00:00:00 2001 From: Paolo Date: Wed, 5 Jul 2023 15:07:05 +0200 Subject: [PATCH 091/246] Removed check of the tbl_benutzer.aktiv field in the AuthLib --- application/libraries/AuthLib.php | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/application/libraries/AuthLib.php b/application/libraries/AuthLib.php index ae30d41fa..de9c15350 100644 --- a/application/libraries/AuthLib.php +++ b/application/libraries/AuthLib.php @@ -551,10 +551,7 @@ class AuthLib // Needed information $this->_ci->PersonModel->addSelect('person_id, vorname, nachname, uid'); // Retrieves the uid if it is possible for active users - $this->_ci->PersonModel->addJoin( - '(SELECT uid, person_id FROM public.tbl_benutzer WHERE aktiv = TRUE) tb', 'person_id', - 'LEFT' - ); + $this->_ci->PersonModel->addJoin('public.tbl_benutzer', 'person_id', 'LEFT'); // Execute query with where clause $personResult = $this->_ci->PersonModel->loadWhere($queryParamsArray); From cb4ce6dab6616712e425b8ecf00de896d426bea8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20=C3=96sterreicher?= Date: Thu, 6 Jul 2023 13:30:43 +0200 Subject: [PATCH 092/246] Anzeige Lehre Saldo in der Zeitaufzeichnung deaktiviert --- cis/private/tools/zeitaufzeichnung.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cis/private/tools/zeitaufzeichnung.php b/cis/private/tools/zeitaufzeichnung.php index 773582177..0eb86bdb1 100644 --- a/cis/private/tools/zeitaufzeichnung.php +++ b/cis/private/tools/zeitaufzeichnung.php @@ -1433,7 +1433,8 @@ if ($projekt->getProjekteMitarbeiter($user, true)) $sem_akt = $stsem->getakt(); $lehre = new zeitaufzeichnung(); $l_arr = $lehre->getLehreForUser($user, $sem_akt); - if ($l_arr["LehreAuftraege"]>0 || $l_arr["Lehre"] > 0 || $l_arr["LehreExtern"] > 0) + $displayLehresaldo = false; + if ($displayLehresaldo && ($l_arr["LehreAuftraege"]>0 || $l_arr["Lehre"] > 0 || $l_arr["LehreExtern"] > 0)) { if ($lehre_inkludiert == -1) { From af9418d456495d2a985f19bd1fa6f88ce00d6fae Mon Sep 17 00:00:00 2001 From: Manfred Date: Thu, 6 Jul 2023 18:05:24 +0200 Subject: [PATCH 093/246] Anmerkung und Insertdaten bei Rolleberechtigung MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit + Vergleichsskript für Rechte in einzelnen Rollen --- include/berechtigung.class.php | 23 +- system/dbupdate_3.4.php | 3 +- ...537_anmerkung_in_tbl_rolleberechtigung.php | 15 + vilesci/stammdaten/berechtigungrolle.php | 587 +++++++++--------- 4 files changed, 343 insertions(+), 285 deletions(-) create mode 100644 system/dbupdate_3.4/30537_anmerkung_in_tbl_rolleberechtigung.php diff --git a/include/berechtigung.class.php b/include/berechtigung.class.php index e7be01283..9d9a8e79b 100644 --- a/include/berechtigung.class.php +++ b/include/berechtigung.class.php @@ -29,6 +29,10 @@ class berechtigung extends basis_db public $rolle_kurzbz; public $beschreibung; public $berechtigung_kurzbz; + public $art; + public $anmerkung; + public $insertamum; + public $insertvon; /** * Konstruktor @@ -78,8 +82,7 @@ class berechtigung extends basis_db public function save($new=null) { if(is_null($new)) - $new = $this->new; - + if($new) { $qry = "INSERT INTO system.tbl_berechtigung(berechtigung_kurzbz, beschreibung) VALUES(". @@ -176,6 +179,9 @@ class berechtigung extends basis_db $obj->rolle_kurzbz = $row->rolle_kurzbz; $obj->art = $row->art; $obj->beschreibung = $row->beschreibung; + $obj->anmerkung = $row->anmerkung; + $obj->insertamum = $row->insertamum; + $obj->insertvon = $row->insertvon; $this->result[] = $obj; } @@ -276,15 +282,22 @@ class berechtigung extends basis_db if($this->db_num_rows()>0) { //Update - $qry = "UPDATE system.tbl_rolleberechtigung SET art=".$this->db_add_param($this->art)." WHERE rolle_kurzbz=".$this->db_add_param($this->rolle_kurzbz)." AND berechtigung_kurzbz=".$this->db_add_param($this->berechtigung_kurzbz).";"; + $qry = "UPDATE system.tbl_rolleberechtigung SET art=".$this->db_add_param($this->art).", + anmerkung=".$this->db_add_param($this->anmerkung).", + insertamum=".$this->db_add_param($this->insertamum).", + insertvon=".$this->db_add_param($this->insertvon)." + WHERE rolle_kurzbz=".$this->db_add_param($this->rolle_kurzbz)." AND berechtigung_kurzbz=".$this->db_add_param($this->berechtigung_kurzbz).";"; } else { //Insert - $qry = "INSERT INTO system.tbl_rolleberechtigung (rolle_kurzbz, berechtigung_kurzbz, art) VALUES(". + $qry = "INSERT INTO system.tbl_rolleberechtigung (rolle_kurzbz, berechtigung_kurzbz, art, anmerkung, insertamum, insertvon) VALUES(". $this->db_add_param($this->rolle_kurzbz).",". $this->db_add_param($this->berechtigung_kurzbz).",". - $this->db_add_param($this->art).");"; + $this->db_add_param($this->art).",". + $this->db_add_param($this->anmerkung).",". + $this->db_add_param($this->insertamum).",". + $this->db_add_param($this->insertvon).");"; } if($this->db_query($qry)) diff --git a/system/dbupdate_3.4.php b/system/dbupdate_3.4.php index 9fda09bba..ed60aeddf 100644 --- a/system/dbupdate_3.4.php +++ b/system/dbupdate_3.4.php @@ -39,6 +39,7 @@ require_once('dbupdate_3.4/27107_vilesci_erfassung_abwesenheiten_reinigung.php') require_once('dbupdate_3.4/24913_tabelle_raumtyp_neues_attribut_aktiv.php'); require_once('dbupdate_3.4/28089_plausichecks_in_extension_hinzufuegen.php'); require_once('dbupdate_3.4/29133_einzelne_studiengaenge_aus_issuechecks_ausnehmen.php'); +require_once('dbupdate_3.4/30537_anmerkung_in_tbl_rolleberechtigung.php'); // *** Pruefung und hinzufuegen der neuen Attribute und Tabellen echo '

Pruefe Tabellen und Attribute!

'; @@ -326,7 +327,7 @@ $tabellen=array( "system.tbl_phrase" => array("phrase_id","app","phrase","insertamum","insertvon","category"), "system.tbl_phrasentext" => array("phrasentext_id","phrase_id","sprache","orgeinheit_kurzbz","orgform_kurzbz","text","description","insertamum","insertvon"), "system.tbl_rolle" => array("rolle_kurzbz","beschreibung"), - "system.tbl_rolleberechtigung" => array("berechtigung_kurzbz","rolle_kurzbz","art"), + "system.tbl_rolleberechtigung" => array("berechtigung_kurzbz","rolle_kurzbz","art","anmerkung","insertamum","insertvon"), "system.tbl_verarbeitungstaetigkeit" => array("taetigkeit_kurzbz", "bezeichnung", "bezeichnung_mehrsprachig","aktiv"), "system.tbl_webservicelog" => array("webservicelog_id","webservicetyp_kurzbz","request_id","beschreibung","request_data","execute_time","execute_user"), "system.tbl_webservicerecht" => array("webservicerecht_id","berechtigung_kurzbz","methode","attribut","insertamum","insertvon","updateamum","updatevon","klasse"), diff --git a/system/dbupdate_3.4/30537_anmerkung_in_tbl_rolleberechtigung.php b/system/dbupdate_3.4/30537_anmerkung_in_tbl_rolleberechtigung.php new file mode 100644 index 000000000..0d7b43b8f --- /dev/null +++ b/system/dbupdate_3.4/30537_anmerkung_in_tbl_rolleberechtigung.php @@ -0,0 +1,15 @@ +db_query("SELECT anmerkung FROM system.tbl_rolleberechtigung LIMIT 1")) +{ + $qry = "ALTER TABLE system.tbl_rolleberechtigung ADD COLUMN anmerkung varchar(256); + ALTER TABLE system.tbl_rolleberechtigung ADD COLUMN insertamum timestamp DEFAULT now(); + ALTER TABLE system.tbl_rolleberechtigung ADD COLUMN insertvon varchar(32);"; + + if(!$db->db_query($qry)) + echo 'system.tbl_rolleberechtigung '.$db->db_last_error().'
'; + else + echo '
Spalten anmerkung, insertamum, insertvon in system.tbl_rolleberechtigung hinzugefügt'; +} diff --git a/vilesci/stammdaten/berechtigungrolle.php b/vilesci/stammdaten/berechtigungrolle.php index 82430d64e..7e87a4901 100644 --- a/vilesci/stammdaten/berechtigungrolle.php +++ b/vilesci/stammdaten/berechtigungrolle.php @@ -1,239 +1,3 @@ - - * Andreas Oesterreicher < andreas.oesterreicher@technikum-wien.at > - * Rudolf Hangl < rudolf.hangl@technikum-wien.at > - * Gerald Simane-Sequens < gerald.simane-sequens@technikum-wien.at > - */ -require_once('../../config/vilesci.config.inc.php'); -require_once('../../include/functions.inc.php'); -require_once('../../include/berechtigung.class.php'); -require_once('../../include/benutzerberechtigung.class.php'); - -$user = get_uid(); - -$rechte = new benutzerberechtigung(); -$rechte->getBerechtigungen($user); - -if(!$rechte->isBerechtigt('basis/berechtigung')) - die($rechte->errormsg); - -$berechtigung_kurzbz = filter_input(INPUT_POST, 'berechtigung_kurzbz'); -$beschreibung = filter_input(INPUT_POST, 'beschreibung'); -$kurzbz = filter_input(INPUT_GET, 'kurzbz'); -$kurzbzPost = filter_input(INPUT_POST, 'kurzbz_post'); -$edit = filter_input(INPUT_GET, 'edit'); -$save = filter_input(INPUT_POST, 'save'); -$delete = filter_input(INPUT_GET, 'delete'); -$saveNew = filter_input(INPUT_POST, 'saveNew'); - -//$delete = filter_input(INPUT_GET, 'delete', FILTER_VALIDATE_BOOLEAN); -?> - - - Rechte - - - - - - - - - - -

Rollenübersicht

- - berechtigung_kurzbz = $kurzbzPost; - $berechtigung->beschreibung = $beschreibung; - $berechtigung->new = true; - - if($berechtigung->save()) - { - echo 'Recht '.$kurzbzPost.' wurde angelegt

'; - } - else - { - echo 'Fehler beim Speichern:'.$berechtigung->errormsg.'

'; - } - } - else - { - echo 'Zum Speichern der Daten muss die Kurzbz und die Beschreibung angegeben werden

'; - } - } - - if(isset($delete) && isset($kurzbz)) - { - $berechtigung = new berechtigung(); - if($berechtigung->delete($kurzbz)) - echo 'Das Recht "'.$kurzbz.'" wurde erfolgreich gelöscht

'; - else - echo 'Fehler beim Löschen des Rechts:'.$berechtigung->errormsg.'

'; - } - - if(isset($save)) - { - $berechtigung = new berechtigung(); - $berechtigung->load($berechtigung_kurzbz); - $berechtigung->beschreibung = $beschreibung; - if (!$berechtigung->save(false)) - echo 'Fehler beim Speichern:'.$berechtigung->errormsg.'

'; - } - - //Tabelle mit Rollen anzeigen - $berechtigung = new berechtigung(); - $berechtigung->getBerechtigungen(); - - echo ''; - echo ' - - - - - - - - - '; - - foreach($berechtigung->result as $recht) - { - if($edit && $recht->berechtigung_kurzbz == $kurzbz) - { - echo ' - - - - '; - } - else - { - echo ' - - - - - - '; - } - } - echo ' - -
KurzbzBeschreibungAktion
- '.$recht->berechtigung_kurzbz.' -
- - '.(256 - strlen($recht->beschreibung)).' - - -
-
'.$recht->berechtigung_kurzbz.''.$recht->beschreibung.' - - Bearbeiten - - - - Recht löschen - -
- -
'; - - echo '
-

Neues Recht einfügen

- Kurzbz: - Beschreibung: - 256 -   -
-
- -'; - ?> - - - - - - - - - - - - - - - - - - isBerechtigt('basis/berechtigung')) $rolle_kurzbz = filter_input(INPUT_GET, 'rolle_kurzbz'); $delete = filter_input(INPUT_GET, 'delete', FILTER_VALIDATE_BOOLEAN); +$copy = filter_input(INPUT_POST, 'copy'); +$vergleich = filter_input(INPUT_GET, 'vergleich'); ?> - Berechtigungen Uebersicht + Rollen Uebersicht @@ -290,15 +56,37 @@ $delete = filter_input(INPUT_GET, 'delete', FILTER_VALIDATE_BOOLEAN); $("#t1").tablesorter( { sortList: [[0,0]], - widgets: ["zebra"], - headers: {3:{sorter:false}} + widgets: ["zebra", "filter", "stickyHeaders"], + headers: {3:{filter:false, sorter:false}}, + widgetOptions : {filter_saveFilters : true} }); $("#t2").tablesorter( { sortList: [[0,0]], - widgets: ["zebra"], - headers: {2:{sorter:false}} + widgets: ["zebra", "filter", "stickyHeaders"], + headers: {2:{filter:false, sorter:false}}, + widgetOptions : {filter_saveFilters : true} + }); + $("#t3").tablesorter( + { + sortList: [], + widgets: ["zebra"] + }); + $("#t4").tablesorter( + { + sortList: [], + widgets: ["zebra"] + }); + $('.resetsaved').click(function() + { + $(".tablesorter").trigger("filterReset"); + window.location(""); + return false; + }); + $("textarea").keyup(function() + { + $(this).siblings("span").text((256 - $(this).val().length)); }); // Breite des Autocompletes korrigieren um das Springen zu verhindern @@ -329,16 +117,15 @@ $delete = filter_input(INPUT_GET, 'delete', FILTER_VALIDATE_BOOLEAN); $(this).val(ui.item.berechtigung_kurzbz); } }); - }); - function confdel() - { - var value=prompt('Achtung! Sie sind dabei eine Rolle zu löschen. Die Zuordnungen gehen dadurch verloren! Um diese Rolle wirklich zu Löschen tippen Sie "LÖSCHEN" in das untenstehende Feld.'); - if(value=='LÖSCHEN') - return true; - else - return false; - } + $(".copyButton").click(function(event) + { + event.preventDefault(); + $(this).siblings().show(); + $(this).hide(); + }); + }); + function validateNewData() { if($('#berechtigung_neu_autocomplete').val() == '') @@ -374,14 +161,16 @@ $delete = filter_input(INPUT_GET, 'delete', FILTER_VALIDATE_BOOLEAN); -

Berechtigung - Rolle -

+ Berechtigungen der Rolle "'.$rolle_kurzbz.'"'; $berechtigung_kurzbz = filter_input(INPUT_GET, 'berechtigung_kurzbz'); $art = filter_input(INPUT_GET, 'art'); $save = filter_input(INPUT_GET, 'save'); + $anmerkung = filter_input(INPUT_GET, 'anmerkung'); if(isset($save)) { @@ -391,10 +180,17 @@ $delete = filter_input(INPUT_GET, 'delete', FILTER_VALIDATE_BOOLEAN); $berechtigung->rolle_kurzbz = $rolle_kurzbz; $berechtigung->berechtigung_kurzbz = $berechtigung_kurzbz; $berechtigung->art = $art; + $berechtigung->anmerkung = $anmerkung; + $berechtigung->insertamum = date('Y-m-d H:i:s'); + $berechtigung->insertvon = $user; if($berechtigung->saveRolleBerechtigung()): ?> Zuteilung gespeichert - + Fehler beim Speichern der Zuteilung: errormsg ?> - Zurück zur Rollenübersicht + Zurück zur Rollen Übersicht

getBerechtigungen(); ?>
- +
+ - - getRolleBerechtigung($rolle_kurzbz); - $berechtigungen_arr = array(); - foreach ($berechtigungen->result as $row) - { - $berechtigungen_arr[] = $row->berechtigung_kurzbz; - } - foreach ($berechtigung->result as $row): ?> - - - - + + +
- + - + + @@ -460,9 +262,15 @@ $delete = filter_input(INPUT_GET, 'delete', FILTER_VALIDATE_BOOLEAN); + + @@ -471,8 +279,166 @@ $delete = filter_input(INPUT_GET, 'delete', FILTER_VALIDATE_BOOLEAN);
Kurzbz Art BeschreibungAnmerkung
berechtigung_kurzbz ?> art ?> beschreibung ?>anmerkung ?> - - entfernen + + Bearbeiten + + + + Recht entfernen
Rollen vergleichen'; + $rolle1 = filter_input(INPUT_GET, 'rolle_kurzbz1'); + $rolle2 = filter_input(INPUT_GET, 'rolle_kurzbz2'); + ?> + + + Zurück zur Rollen Übersicht + +

+ + getRolleBerechtigung($rolle1); + foreach ($rollen->result AS $recht) + { + $rollen1Arr[$recht->berechtigung_kurzbz] = $recht->art; + } + $rollen = new berechtigung(); + $rollen->getRolleBerechtigung($rolle2); + foreach ($rollen->result AS $recht) + { + $rollen2Arr[$recht->berechtigung_kurzbz] = $recht->art; + } + $rollenGesamt = array_merge($rollen1Arr,$rollen2Arr); + ksort($rollenGesamt); + + echo '
+
+
+ Rolle 1: + '; + if (isset($rolle1)) + { + echo ' + + + + + + + '; + + foreach ($rollenGesamt AS $recht => $art) + { + if (array_key_exists($recht, $rollen1Arr)) + { + if ($art != $rollen1Arr[$recht]) + { + echo ' + + + '; + } + else + { + echo ' + + + '; + } + + } + else + { + echo ' + + + '; + } + } + echo ' + +
KurzbzArt
'.$recht.''.$rollen1Arr[$recht].'
'.$recht.''.$art.'
  
'; + } + echo ' +
+
+ Rolle 2: + '; + echo ''; + if (isset($rolle2)) + { + echo ' + + + + + + + '; + foreach ($rollenGesamt AS $recht => $art) + { + if (array_key_exists($recht, $rollen2Arr)) + { + if ($art != $rollen2Arr[$recht]) + { + echo ' + + + '; + } + else + { + echo ' + + + '; + } + } + else + { + echo ' + + + '; + } + } + echo ' + +
KurzbzArt
'.$recht.''.$rollen2Arr[$recht].'
'.$recht.''.$art.'
  
'; + } + echo ' +
+
+
'; + } else { + echo '

Rollen Übersicht

'; $save = filter_input(INPUT_POST, 'save'); $edit = filter_input(INPUT_POST, 'edit'); @@ -509,11 +475,56 @@ $delete = filter_input(INPUT_GET, 'delete', FILTER_VALIDATE_BOOLEAN); { $berechtigung = new berechtigung(); if($berechtigung->deleteRolle($kurzbz)) - echo 'Rolle wurde entfernt'; + echo 'Die Rolle '.$kurzbz.' wurde erfolgreich gelöscht'; else echo 'Fehler beim Löschen:'.$berechtigung->errormsg; } + if(isset($copy)) + { + $kurzbz = filter_input(INPUT_POST, 'kurzbz'); + $copyName = filter_input(INPUT_POST, 'copy_name'); + $beschreibung = filter_input(INPUT_POST, 'beschreibung'); + + if(isset($kurzbz)) + { + $berechtigung = new berechtigung(); + $berechtigung->rolle_kurzbz = $copyName; + $berechtigung->beschreibung = $beschreibung; + $berechtigung->new = true; + + if($berechtigung->saveRolle()) + { + $rollenrechte = new berechtigung(); + $rollenrechte->getRolleBerechtigung($kurzbz); + foreach($rollenrechte->result as $rollenrecht) + { + $newRolleRecht = new berechtigung(); + $newRolleRecht->rolle_kurzbz = $copyName; + $newRolleRecht->berechtigung_kurzbz = $rollenrecht->berechtigung_kurzbz; + $newRolleRecht->art = $rollenrecht->art; + $newRolleRecht->anmerkung = $rollenrecht->anmerkung; + $newRolleRecht->insertamum = date('Y-m-d H:i:s'); + $newRolleRecht->insertvon = $user; + if(!$newRolleRecht->saveRolleBerechtigung()) + { + echo 'Fehler beim Speichern des Rechts '.$rollenrecht->berechtigung_kurzbz.' zur Rolle '.$rollenrecht->rolle_kurzbz; + break; + } + } + echo 'Rolle erfolgreich kopiert'; + } + else + { + echo 'Fehler beim kopieren der Rolle '.$kurzbz.':'.$berechtigung->errormsg; + } + } + else + { + echo 'Zum Speichern der Daten muss die kurzbz und die Beschreibung angegeben werden'; + } + } + if(isset($edit)) { $beschreibung = filter_input(INPUT_POST, 'beschreibung'); @@ -528,13 +539,18 @@ $delete = filter_input(INPUT_GET, 'delete', FILTER_VALIDATE_BOOLEAN); $berechtigung = new berechtigung(); $berechtigung->getRollen(); ?> -

Rollen:

+

+ + Rollen vergleichen + +

+ - + @@ -561,7 +577,18 @@ $delete = filter_input(INPUT_GET, 'delete', FILTER_VALIDATE_BOOLEAN); + @@ -577,6 +604,7 @@ $delete = filter_input(INPUT_GET, 'delete', FILTER_VALIDATE_BOOLEAN); Kurzbz: Beschreibung: + beschreibung)) ?>  Neue Rolle anlegen @@ -584,6 +612,7 @@ $delete = filter_input(INPUT_GET, 'delete', FILTER_VALIDATE_BOOLEAN); Kurzbz: Beschreibung: + 256   From 9651903200ff2556dc55c4f57af0e4a25c0384ca Mon Sep 17 00:00:00 2001 From: Manfred Date: Thu, 6 Jul 2023 18:08:06 +0200 Subject: [PATCH 094/246] Diverse Titel und Textkorrekturen bei Rechte-Skripten --- include/tw/vilesci_menu_main.inc.php | 15 ++++++------- .../benutzerberechtigung_autocomplete.php | 22 ++++++++++++++----- .../benutzerberechtigung_details.php | 2 +- .../benutzerberechtigung_uebersicht.php | 4 ++-- vilesci/stammdaten/berechtigungen.php | 4 ++-- 5 files changed, 29 insertions(+), 18 deletions(-) diff --git a/include/tw/vilesci_menu_main.inc.php b/include/tw/vilesci_menu_main.inc.php index c28319957..7d24f16f3 100644 --- a/include/tw/vilesci_menu_main.inc.php +++ b/include/tw/vilesci_menu_main.inc.php @@ -33,7 +33,7 @@ $menu=array 'Lehrveranstaltung'=>array('name'=>'Lehrveranstaltung', 'link'=>'lehre/lehrveranstaltung_frameset.html', 'target'=>'main'), /* Leerzeile */'emptyrow1'=>array('name'=>'', 'link'=>'#empty', 'target'=>'main'), 'Verplanungsuebersicht'=>array('name'=>'Verplanungsübersicht', 'link'=>'lehre/check/verplanungsuebersicht.php', 'target'=>'main'), - 'Reihungstest'=>array('name'=>'Reihungstest', 'link'=>'stammdaten/reihungstestverwaltung.php', 'target'=>'main','permissions'=>array('reihungstest')), + 'Reihungstest'=>array('name'=>'Reihungstest', 'link'=>'stammdaten/reihungstestverwaltung.php', 'target'=>'main','permissions'=>array('lehre/reihungstest')), 'LV-Planung'=>array ( 'name'=>'LV-Planung', 'permissions'=>array('admin','lv-plan','support'), @@ -109,7 +109,7 @@ $menu=array ), 'Benutzer'=>array ( - 'name'=>'Benutzer','permissions'=>array('admin','lv-plan','support'), + 'name'=>'Benutzer','permissions'=>array('admin','lv-plan','support','mitarbeiter'), 'Funktionen'=>array('name'=>'Funktionen', 'link'=>'personen/funktion.php', 'target'=>'main', 'permissions'=>array('mitarbeiter')), 'Berechtigungen'=>array('name'=>'Berechtigungen', 'link'=>'stammdaten/benutzerberechtigung_frameset.html', 'target'=>'main','permissions'=>array('basis/berechtigung')), 'Rollen'=>array('name'=>'Rollen', 'link'=>'stammdaten/berechtigungrolle.php', 'target'=>'main','permissions'=>array('basis/berechtigung')), @@ -132,16 +132,15 @@ $menu=array 'name'=>'Stammdaten', 'opener'=>'true', 'hide'=>'true', 'permissions'=>array('admin','lv-plan','support','basis/berechtigung','basis/variable','basis/studiengang','basis/ort','basis/firma','basis/fhausweis','basis/infoscreen','basis/organisationseinheit'), 'image'=>'vilesci_stammdaten.png', 'link'=>'left.php?categorie=Stammdaten', 'target'=>'nav', 'Betriebsmittel'=>array('name'=>'Betriebsmittel', 'link'=>'stammdaten/betriebsmittel_frameset.php', 'target'=>'main','permissions'=>array('basis/betriebsmittel')), - 'Reihungstest'=>array('name'=>'Reihungstest', 'link'=>'stammdaten/reihungstestverwaltung.php', 'target'=>'main','permissions'=>array('admin','assistenz')), + 'Reihungstest'=>array('name'=>'Reihungstest', 'link'=>'stammdaten/reihungstestverwaltung.php', 'target'=>'main','permissions'=>array('lehre/reihungstest')), - 'User'=>array + 'Rechtemanagement'=>array ( - 'name'=>'User', 'permissions'=>array('basis/variable','basis/berechtigung'), - 'Rechte'=>array('name'=>'Rechte', 'link'=>'stammdaten/berechtigungen.php', 'target'=>'main','permissions'=>array('basis/berechtigung')), + 'name'=>'Rechtemanagement', 'permissions'=>array('basis/berechtigung','mitarbeiter'), 'Berechtigungen'=>array('name'=>'Berechtigungen', 'link'=>'stammdaten/benutzerberechtigung_frameset.html', 'target'=>'main','permissions'=>array('basis/berechtigung')), + 'Rechte'=>array('name'=>'Rechte', 'link'=>'stammdaten/berechtigungen.php', 'target'=>'main','permissions'=>array('basis/berechtigung')), 'Rollen'=>array('name'=>'Rollen', 'link'=>'stammdaten/berechtigungrolle.php', 'target'=>'main','permissions'=>array('basis/berechtigung')), 'Funktionen'=>array('name'=>'Funktionen', 'link'=>'personen/funktion.php', 'target'=>'main', 'permissions'=>array('mitarbeiter')), - 'Variablen'=>array('name'=>'Variablen', 'link'=>'stammdaten/variablen_frameset.html', 'target'=>'main', 'target'=>'main','permissions'=>array('basis/variable')), ), 'Personal'=>array ( @@ -157,7 +156,7 @@ $menu=array 'Statistik'=>array('name'=>'Statistik', 'link'=>'stammdaten/statistik_frameset.html', 'target'=>'main','permissions'=>array('basis/statistik')), 'Ampel'=>array('name'=>'Ampel', 'link'=>'stammdaten/ampel_frameset.html', 'target'=>'main','permissions'=>array('basis/ampel')), 'Infoscreen'=>array('name'=>'Infoscreen', 'link'=>'stammdaten/infoscreen_frameset.html', 'target'=>'main','permissions'=>array('basis/infoscreen')), - 'Ferien'=>array('name'=>'Ferien', 'link'=>'lehre/ferienverwaltung.php', 'target'=>'main','permissions'=>array('admin')), + 'Ferien'=>array('name'=>'Ferien', 'link'=>'lehre/ferienverwaltung.php', 'target'=>'main','permissions'=>array('basis/ferien')), 'Service'=>array('name'=>'Service', 'link'=>'stammdaten/service_frameset.html', 'target'=>'main','permissions'=>array('basis/service')), 'Dokumentvorlagen'=>array('name'=>'Dokumentvorlagen', 'link'=>'stammdaten/dokumentvorlagen_verwaltung.php', 'target'=>'main','permissions'=>array('basis/dokumente')), 'GSProgramm'=>array('name'=>'GSProgramm', 'link'=>'stammdaten/gsprogramm.php', 'target'=>'main','permissions'=>array('inout/uebersicht')), diff --git a/vilesci/stammdaten/benutzerberechtigung_autocomplete.php b/vilesci/stammdaten/benutzerberechtigung_autocomplete.php index a888a5b67..774828c19 100644 --- a/vilesci/stammdaten/benutzerberechtigung_autocomplete.php +++ b/vilesci/stammdaten/benutzerberechtigung_autocomplete.php @@ -98,17 +98,29 @@ if (isset($_REQUEST['autocomplete']) && $_REQUEST['autocomplete'] == 'oe_kurzbz' if(is_array($oe->result) && count($oe->result) > 0) { - $result_obj = array(); + $resultArray = array(); foreach($oe->result as $row) { if($row->aktiv==true) { - $item['oe_kurzbz'] = html_entity_decode($row->oe_kurzbz); - $item['organisationseinheittyp_kurzbz'] = html_entity_decode($row->organisationseinheittyp_kurzbz); - $item['bezeichnung'] = html_entity_decode($row->bezeichnung); - $result_obj[] = $item; + $resultArray[html_entity_decode($row->oe_kurzbz)] = array('organisationseinheittyp_kurzbz' => html_entity_decode($row->organisationseinheittyp_kurzbz),'bezeichnung' => html_entity_decode($row->bezeichnung)); } } + + usort($resultArray, function($a, $b) + { + return $a['organisationseinheittyp_kurzbz'] <=> $b['organisationseinheittyp_kurzbz']; + }); + + $result_obj = array(); + foreach($resultArray as $key => $value) + { + $item['oe_kurzbz'] = $key; + $item['organisationseinheittyp_kurzbz'] = $value['organisationseinheittyp_kurzbz']; + $item['bezeichnung'] = $value['bezeichnung']; + $result_obj[] = $item; + } + echo json_encode($result_obj); } exit(); diff --git a/vilesci/stammdaten/benutzerberechtigung_details.php b/vilesci/stammdaten/benutzerberechtigung_details.php index 7ae0e711b..b230d702f 100644 --- a/vilesci/stammdaten/benutzerberechtigung_details.php +++ b/vilesci/stammdaten/benutzerberechtigung_details.php @@ -599,7 +599,7 @@ if (isset($_REQUEST['uid']) || isset($_REQUEST['funktion_kurzbz'])) } if (count($bn) > 0) { - $htmlstr .= "

Rechte Details

"; + $htmlstr .= "

Rechte Detailaufschlüsselung

"; } } elseif(isset($_REQUEST['funktion_kurzbz']) && $_REQUEST['funktion_kurzbz']!='') diff --git a/vilesci/stammdaten/benutzerberechtigung_uebersicht.php b/vilesci/stammdaten/benutzerberechtigung_uebersicht.php index d986d6642..0be268b70 100644 --- a/vilesci/stammdaten/benutzerberechtigung_uebersicht.php +++ b/vilesci/stammdaten/benutzerberechtigung_uebersicht.php @@ -182,7 +182,7 @@ $(document).ready(function() -

Benutzerberechtigungen Übersicht

'; +

Berechtigungen Übersicht

'; if (!$db = new basis_db()) die('Es konnte keine Verbindung zum Server aufgebaut werden.'); @@ -229,7 +229,7 @@ $htmlstr='

- Berechtigung: + Rechte:
Kurzbz BeschreibungAktionAktion
- +
+ + + + +
+
+ Rolle kopieren + +
+ Rolle löschen
+ + + + + + + + + + + + + + + + + + + + + + + + +
{{p.t('lehre', 'studiengang')}}{{data.bezeichnung}}
{{p.t('lehre', 'organisationsform')}}{{data.orgform_bezeichnung}}
{{p.t('projektarbeitsbeurteilung', 'nameStudierende')}}{{data.name}}
{{p.t('person', 'personenkennzeichen')}}{{data.matrikelnr}}
{{p.t('lehre', 'studienjahr')}}{{data.studienjahr_kurzbz}}
{{p.t('lehre', 'semester')}}{{data.semester}}
+
+
+
{{p.t('studierendenantrag', 'antrag_grund')}}:
+
{{data.grund}}
+
+
+ + +
+ ` +} diff --git a/public/js/components/Studierendenantrag/Leitung/Actions/New.js b/public/js/components/Studierendenantrag/Leitung/Actions/New.js index 6169fef72..9fb5e7a64 100644 --- a/public/js/components/Studierendenantrag/Leitung/Actions/New.js +++ b/public/js/components/Studierendenantrag/Leitung/Actions/New.js @@ -79,6 +79,7 @@ export default { @complete="loadData" inputId="newAntragModalAutoComplete" dropdown + dropdown-mode="current" > ` } diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php index a754cf277..155ef3217 100644 --- a/system/phrasesupdate.php +++ b/system/phrasesupdate.php @@ -18363,26 +18363,6 @@ array( ) ) ), - array( - 'app' => 'core', - 'category' => 'studierendenantrag', - 'phrase' => 'antraege_header', - 'insertvon' => 'system', - 'phrases' => array( - array( - 'sprache' => 'German', - 'text' => 'Anträge auf Änderung des Studierendenstatus', - 'description' => '', - 'insertvon' => 'system' - ), - array( - 'sprache' => 'English', - 'text' => 'Requests for changing the Studierendenstatus', - 'description' => '', - 'insertvon' => 'system' - ) - ) - ), array( 'app' => 'core', 'category' => 'studierendenantrag', @@ -18391,13 +18371,13 @@ array( 'phrases' => array( array( 'sprache' => 'German', - 'text' => 'Antrag auf Änderung des Studierendenstatus', + 'text' => 'Verwaltung des Studierendenstatus', 'description' => '', 'insertvon' => 'system' ), array( 'sprache' => 'English', - 'text' => 'Request for changing the Studierendenstatus', + 'text' => 'Management of student status', 'description' => '', 'insertvon' => 'system' ) @@ -19073,13 +19053,13 @@ array( 'phrases' => array( array( 'sprache' => 'German', - 'text' => 'Genehmigen', + 'text' => 'Bestätigen', 'description' => '', 'insertvon' => 'system' ), array( 'sprache' => 'English', - 'text' => 'Approve', + 'text' => 'Confirm', 'description' => '', 'insertvon' => 'system' ) From 6f1eed669643690be9c472b5f147aed3654d76b9 Mon Sep 17 00:00:00 2001 From: ma0068 Date: Tue, 11 Jul 2023 17:01:22 +0200 Subject: [PATCH 112/246] =?UTF-8?q?Abbrecher=202dos:=20=C3=84nderungen=20W?= =?UTF-8?q?ordings,=20neue=20Statusgr=C3=BCnde=20preabbrecher,=20durchStgl?= =?UTF-8?q?,=20durchStud,=20update=20setAbbrecher?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- application/controllers/jobs/AntragJob.php | 11 ++-- application/libraries/AntragLib.php | 54 +++++++++++++------ application/libraries/PrestudentLib.php | 17 ++++-- .../models/crm/Prestudentstatus_model.php | 16 ++++++ .../27351_digitalisierung_formulare.php | 39 ++++++++++++++ 5 files changed, 113 insertions(+), 24 deletions(-) diff --git a/application/controllers/jobs/AntragJob.php b/application/controllers/jobs/AntragJob.php index 71068fbe9..39c2519af 100644 --- a/application/controllers/jobs/AntragJob.php +++ b/application/controllers/jobs/AntragJob.php @@ -177,9 +177,14 @@ class AntragJob extends JOB_Controller $dateDeadline = new DateTime(); $dateDeadline->sub(DateInterval::createFromDateString($modifier_deadline)); + $this->StudierendenantragModel->addSelect('prestudent_id'); + $this->StudierendenantragModel->addSelect('studiensemester_kurzbz'); + $this->StudierendenantragModel->addSelect('s.insertamum'); + $result = $this->StudierendenantragModel->getWithLastStatusWhere( [ - 'studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_APPROVED_STGL, + 'typ' => Studierendenantrag_model::TYP_ABMELDUNG_STGL, + 'studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_APPROVED, 's.insertamum <=' => $dateDeadline->format('c') ] ); @@ -195,8 +200,8 @@ class AntragJob extends JOB_Controller foreach ($antraege as $antrag) { - $result = $this->antraglib->approveAbmeldung([$antrag->studierendenantrag_id], $insertvon); + $result = $this->prestudentlib->setAbbrecher($antrag->prestudent_id, $antrag->studiensemester_kurzbz, $insertvon, 'abbrecherStgl', $antrag->insertamum); if (isError($result)) $this->logError(getError($result)); else @@ -316,7 +321,7 @@ class AntragJob extends JOB_Controller 'urlCIS' => $urlCIS, 'fristablauf' => $fristende->format('d.m.Y') ); - + // NOTE(chris): Sancho mail if(sendSanchoMail('Sancho_Mail_Antrag_W_' . $name, $dataMail, $email, $subject)) { diff --git a/application/libraries/AntragLib.php b/application/libraries/AntragLib.php index 190997c19..d02ce9012 100644 --- a/application/libraries/AntragLib.php +++ b/application/libraries/AntragLib.php @@ -137,26 +137,21 @@ class AntragLib $errors[] = $this->_ci->p->t('studierendenantrag', 'error_no_antrag_found', ['id' => $studierendenantrag_id]); continue; } - $status = getData($result)[0]; + $antrag = getData($result)[0]; + + $insertam = date('c'); $result = $this->_ci->StudierendenantragstatusModel->insert([ 'studierendenantrag_id' => $studierendenantrag_id, 'studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_APPROVED, - 'insertvon' => $insertvon + 'insertvon' => $insertvon, + 'insertam' => $insertam ]); if (isError($result)) $errors[] = getError($result); else { - $resultPrestudent = $this->_ci->StudierendenantragModel->load($studierendenantrag_id); - if (isError($resultPrestudent)) + if ($antrag->typ == Studierendenantrag_model::TYP_ABMELDUNG) { - $errors[] = getError($resultPrestudent); - continue; - } - if ($status->typ == Studierendenantrag_model::TYP_ABMELDUNG) - { - $antrag = getData($resultPrestudent)[0]; - $resultPrestudentStatus = $this->_ci->PrestudentstatusModel->getLastStatusWithStgEmail($antrag->prestudent_id); if (isError($resultPrestudentStatus)) $errors[] = getError($resultPrestudentStatus); @@ -167,7 +162,7 @@ class AntragLib $vorlage ='Sancho_Mail_Antrag_A_Approve'; $subject = $this->_ci->p->t('studierendenantrag', 'mail_subject_A_Approve'); - $result = $this->_ci->prestudentlib->setAbbrecher($antrag->prestudent_id, $antrag->studiensemester_kurzbz, $insertvon); + $result = $this->_ci->prestudentlib->setAbbrecher($antrag->prestudent_id, $antrag->studiensemester_kurzbz, $insertvon, 'abbrecherStud', $antrag->datum, $insertam) ; if (isError($result)) { $errors[] = getError($result); @@ -186,8 +181,35 @@ class AntragLib sendSanchoMail($vorlage, $data, $prestudent_status->email, $subject); } } - if ($status->typ == Studierendenantrag_model::TYP_ABMELDUNG_STGL) { - $res = $this->_ci->PrestudentModel->load($status->prestudent_id); + if ($antrag->typ == Studierendenantrag_model::TYP_ABMELDUNG_STGL) { + $result = $this->_ci->PrestudentstatusModel->getLastStatus($antrag->prestudent_id, '', 'Student'); + if (isError($result)) + { + $errors[] = getError($result); + continue; + } + if(!hasData($result)) + { + $errors[] = $this->_ci->p->t('studierendenantrag', 'error_no_prestudentstatus', ['prestudent_id' => $antrag->prestudent_id]); + continue; + } + $prestudentstatus = getData($result)[0]; + + $result = $this->_ci->PrestudentstatusModel->withGrund('preabbrecher')->update([ + 'prestudent_id' => $prestudentstatus->prestudent_id, + 'status_kurzbz'=>$prestudentstatus->status_kurzbz, + 'studiensemester_kurzbz'=>$prestudentstatus->studiensemester_kurzbz, + 'ausbildungssemester'=>$prestudentstatus->ausbildungssemester + ],[]); + if (isError($result)) + { + $errors[] = getError($result); + continue; + } + + + $res = $this->_ci->PrestudentModel->load($antrag->prestudent_id); + if (hasData($res)) { $prestudent = current(getData($res)); $res = $this->_ci->PersonModel->load($prestudent->person_id); @@ -205,7 +227,7 @@ class AntragLib 'Sancho_Mail_Antrag_A_Stgl', [ 'name' => $name, - 'grund' => $status->grund + 'grund' => $antrag->grund ], $email, $this->_ci->p->t('studierendenantrag', 'mail_subject_A_Stgl') @@ -857,7 +879,7 @@ class AntragLib if (!hasData($result)) return error($this->_ci->p->t('studierendenantrag', 'error_no_stg', ['studiengang_kz' => $studiengang_kz])); $stg = current(getData($result)); - + if ($ausbildungssemester > $stg->max_semester) return success(); return error($this->_ci->p->t('studierendenantrag', 'error_no_studienplan', [ diff --git a/application/libraries/PrestudentLib.php b/application/libraries/PrestudentLib.php index 5024c6c22..bb1250a62 100644 --- a/application/libraries/PrestudentLib.php +++ b/application/libraries/PrestudentLib.php @@ -35,7 +35,7 @@ class PrestudentLib } - public function setAbbrecher($prestudent_id, $studiensemester_kurzbz, $insertvon = null) + public function setAbbrecher($prestudent_id, $studiensemester_kurzbz, $insertvon = null, $statusgrund_kurzbz = null, $datum = null, $bestaetigtam = null) { if (!$insertvon) $insertvon = getAuthUID(); @@ -62,24 +62,31 @@ class PrestudentLib $student = current($result); - //Status updaten - $result = $this->_ci->PrestudentstatusModel->insert([ + if(!$datum) + $datum = date('c'); + + if(!$bestaetigtam) + $bestaetigtam = date('c'); + + //Status und Statusgrund updaten + $result = $this->_ci->PrestudentstatusModel->withGrund($statusgrund_kurzbz)->insert([ 'prestudent_id' => $prestudent_id, 'status_kurzbz' => Prestudentstatus_model::STATUS_ABBRECHER, 'studiensemester_kurzbz' => $studiensemester_kurzbz, 'ausbildungssemester' => $prestudent_status->ausbildungssemester, - 'datum' => date('c'), + 'datum' => $datum, 'insertvon' => $insertvon, 'insertamum' => date('c'), 'orgform_kurzbz'=> $prestudent_status->orgform_kurzbz, 'studienplan_id'=> $prestudent_status->studienplan_id, 'bestaetigtvon' => $insertvon, - 'bestaetigtam' => date('c') + 'bestaetigtam' => $bestaetigtam ]); if (isError($result)) return $result; + //Verband anlegen $result = $this->_ci->LehrverbandModel->load([ 'studiengang_kz' => $student->studiengang_kz, diff --git a/application/models/crm/Prestudentstatus_model.php b/application/models/crm/Prestudentstatus_model.php index 620b897e6..ddf8d3a7a 100644 --- a/application/models/crm/Prestudentstatus_model.php +++ b/application/models/crm/Prestudentstatus_model.php @@ -316,4 +316,20 @@ class Prestudentstatus_model extends DB_Model return $this->loadWhere($whereArr); } + + /** + * call like this: + * $this->PrestudentstatusModel->withGrund('grund_kurzbz')->update($id, $otherData); + * or: + * $this->PrestudentstatusModel->withGrund('grund_kurzbz')->insert($otherData); + * @param string $statusgrund_kurzbz + * @return object $this + */ + public function withGrund($statusgrund_kurzbz) + { + if($statusgrund_kurzbz) + $this->db->set('statusgrund_id', '(SELECT statusgrund_id FROM public.tbl_status_grund WHERE statusgrund_kurzbz =' . $this->db->escape($statusgrund_kurzbz) .')', FALSE); + + return $this; + } } diff --git a/system/dbupdate_3.4/27351_digitalisierung_formulare.php b/system/dbupdate_3.4/27351_digitalisierung_formulare.php index 1fbe56945..5041b86f5 100644 --- a/system/dbupdate_3.4/27351_digitalisierung_formulare.php +++ b/system/dbupdate_3.4/27351_digitalisierung_formulare.php @@ -285,3 +285,42 @@ if (!$result = @$db->db_query("SELECT public.get_stdsem_prestudent(0, null)")) { else echo '
public.get_stdsem_prestudent(integer, character varying): function created'; } + +if($result = @$db->db_query("SELECT 1 FROM public.tbl_status_grund WHERE statusgrund_kurzbz = 'abbrecherStgl';")) +{ + if($db->db_num_rows($result) == 0) + { + $qry = "INSERT INTO public.tbl_status_grund(statusgrund_kurzbz, status_kurzbz, aktiv, beschreibung, bezeichnung_mehrsprachig) VALUES('abbrecherStgl', 'Abbrecher', TRUE, '{\"durch Stgl\", \"by Course Director\"}', '{\"durch Stgl\", \"by Course Director\"}');"; + + if(!$db->db_query($qry)) + echo 'public.tbl_status_grund '.$db->db_last_error().'
'; + else + echo ' public.tbl_status_grund: Added Statusgrund abbrecherStgl for Abbrecher
'; + } +} + +if($result = @$db->db_query("SELECT 1 FROM public.tbl_status_grund WHERE statusgrund_kurzbz = 'abbrecherStud';")) +{ + if($db->db_num_rows($result) == 0) + { + $qry = "INSERT INTO public.tbl_status_grund(statusgrund_kurzbz, status_kurzbz, aktiv, beschreibung, bezeichnung_mehrsprachig) VALUES('abbrecherStud', 'Abbrecher', TRUE, '{\"durch Stud\", \"by Student\"}', '{\"durch Stud\", \"by Student\"}');"; + + if(!$db->db_query($qry)) + echo 'public.tbl_status_grund '.$db->db_last_error().'
'; + else + echo ' public.tbl_status_grund: Added Statusgrund abbrecherStud for Abbrecher
'; + } +} + +if($result = @$db->db_query("SELECT 1 FROM public.tbl_status_grund WHERE statusgrund_kurzbz = 'preabbrecher';")) +{ + if($db->db_num_rows($result) == 0) + { + $qry = "INSERT INTO public.tbl_status_grund(statusgrund_kurzbz, status_kurzbz, aktiv, beschreibung, bezeichnung_mehrsprachig) VALUES('preabbrecher', 'Student', TRUE, '{\"Pre-Abbrecher\", \"Pre-Aborted\"}', '{\"Pre-Abbrecher\", \"Pre-Aborted\"}');"; + + if(!$db->db_query($qry)) + echo 'public.tbl_status_grund '.$db->db_last_error().'
'; + else + echo ' public.tbl_status_grund: Added Statusgrund pre-abbrecher for Student
'; + } +} From 3192a1b3f2ebd7f4717a90e16ac728a93e9a2698 Mon Sep 17 00:00:00 2001 From: ma0048 Date: Wed, 12 Jul 2023 09:47:01 +0200 Subject: [PATCH 113/246] - job hinzugefuegt um bewerber status automatisch zu setzen - fas filter hinzugefugt --- include/prestudent.class.php | 36 +++++++++++++++++++++++ rdf/lehrverbandsgruppe.rdf.php | 52 ++++++++++++++++++++++++++++++++-- rdf/student.rdf.php | 2 +- 3 files changed, 86 insertions(+), 4 deletions(-) diff --git a/include/prestudent.class.php b/include/prestudent.class.php index 13f3e5e00..557412413 100644 --- a/include/prestudent.class.php +++ b/include/prestudent.class.php @@ -870,6 +870,42 @@ class prestudent extends person AND tbl_reihungstest.studiensemester_kurzbz=".$this->db_add_param($studiensemester_kurzbz)." )"; break; + case "bewerberrtnichtangemeldet": + $qry.=" AND a.rolle='Bewerber' + AND NOT EXISTS ( + SELECT + 1 + FROM + public.tbl_rt_person + JOIN public.tbl_reihungstest ON (rt_id = reihungstest_id) + WHERE + person_id=a.person_id + AND studienplan_id IN ( + SELECT studienplan_id FROM lehre.tbl_studienplan + JOIN lehre.tbl_studienordnung USING(studienordnung_id) + WHERE tbl_studienordnung.studiengang_kz=a.studiengang_kz + ) + AND tbl_reihungstest.studiensemester_kurzbz=".$this->db_add_param($studiensemester_kurzbz)." + )"; + break; + case "bewerberrtangemeldet": + $qry.=" AND a.rolle='Bewerber' + AND EXISTS ( + SELECT + 1 + FROM + public.tbl_rt_person + JOIN public.tbl_reihungstest ON (rt_id = reihungstest_id) + WHERE + person_id=a.person_id + AND studienplan_id IN ( + SELECT studienplan_id FROM lehre.tbl_studienplan + JOIN lehre.tbl_studienordnung USING(studienordnung_id) + WHERE tbl_studienordnung.studiengang_kz=a.studiengang_kz + ) + AND tbl_reihungstest.studiensemester_kurzbz=".$this->db_add_param($studiensemester_kurzbz)." + )"; + break; case "zgv": $stg_obj = new studiengang(); $stg_obj->load($studiengang_kz); diff --git a/rdf/lehrverbandsgruppe.rdf.php b/rdf/lehrverbandsgruppe.rdf.php index 20956d279..19affa245 100644 --- a/rdf/lehrverbandsgruppe.rdf.php +++ b/rdf/lehrverbandsgruppe.rdf.php @@ -290,6 +290,24 @@ function draw_orgformsubmenu($stg_kz, $orgform) bewerber + + + Nicht zum Reihungstest angemeldet + + + studiensemester_kurzbz.']]> + bewerberrtnichtangemeldet + + + + + Reihungstest angemeldet + + + studiensemester_kurzbz.']]> + bewerberrtangemeldet + + Aufgenommen @@ -344,8 +362,14 @@ function draw_orgformsubmenu($stg_kz, $orgform) $orgform_sequence[$stg_kz].= "\t\t\t\tstudiensemester_kurzbz/interessenten/reihungstestangemeldet\" />\n"; $orgform_sequence[$stg_kz].= "\t\t\t\t"; $orgform_sequence[$stg_kz].= "\n\t\t\t\n"; - - $orgform_sequence[$stg_kz].= "\t\t\tstudiensemester_kurzbz/bewerber\" />\n"; + + $orgform_sequence[$stg_kz].= "\t\t\t"; + $orgform_sequence[$stg_kz].= "\n\t\t\t\tstudiensemester_kurzbz/bewerber\">\n"; + $orgform_sequence[$stg_kz].= "\t\t\tstudiensemester_kurzbz/bewerber/reihungstestnichtangemeldet\" />\n"; + $orgform_sequence[$stg_kz].= "\t\t\tstudiensemester_kurzbz/bewerber/reihungstestangemeldet\" />\n"; + $orgform_sequence[$stg_kz].= "\t\t\t\t"; + $orgform_sequence[$stg_kz].= "\n\t\t\t\n"; + $orgform_sequence[$stg_kz].= "\t\t\tstudiensemester_kurzbz/aufgenommen\" />\n"; $orgform_sequence[$stg_kz].= "\t\t\tstudiensemester_kurzbz/warteliste\" />\n"; $orgform_sequence[$stg_kz].= "\t\t\tstudiensemester_kurzbz/absage\" />\n"; @@ -624,6 +648,22 @@ while ($row=$dbo->db_fetch_object()) + + + ]]> + studiengang_kz; ?>]]> + studiensemester_kurzbz; ?>]]> + + + + + + ]]> + studiengang_kz; ?>]]> + studiensemester_kurzbz; ?>]]> + + + ]]> @@ -832,8 +872,14 @@ draw_orgformpart($stg_kz); echo "\t\t\t\tstudiensemester_kurzbz/interessenten/reihungstestangemeldet\" />\n"; echo "\t\t\t\t"; echo "\n\t\t\t\n"; + + echo "\t\t\t"; + echo "\t\t\t\tstudiensemester_kurzbz/bewerber\">\n"; + echo "\t\t\t\tstudiensemester_kurzbz/bewerber/reihungstestnichtangemeldet\" />\n"; + echo "\t\t\t\tstudiensemester_kurzbz/bewerber/reihungstestangemeldet\" />\n"; + echo "\t\t\t\t"; + echo "\n\t\t\t\n"; - echo "\t\t\t\tstudiensemester_kurzbz/bewerber\" />\n"; echo "\t\t\t\tstudiensemester_kurzbz/aufgenommen\" />\n"; echo "\t\t\t\tstudiensemester_kurzbz/warteliste\" />\n"; echo "\t\t\t\tstudiensemester_kurzbz/absage\" />\n"; diff --git a/rdf/student.rdf.php b/rdf/student.rdf.php index 11e841c2b..1625f161c 100644 --- a/rdf/student.rdf.php +++ b/rdf/student.rdf.php @@ -737,7 +737,7 @@ if($xmlformat=='rdf') } elseif(in_array($typ, array('prestudent', 'interessenten', 'bewerber', 'aufgenommen', 'warteliste', 'absage', 'zgv', 'reihungstestangemeldet', 'reihungstestnichtangemeldet', 'absolvent', - 'diplomand', 'bewerbungnichtabgeschickt', 'bewerbungabgeschickt', 'statusbestaetigt', 'statusbestaetigtrtnichtangemeldet', 'statusbestaetigtrtangemeldet'))) + 'diplomand', 'bewerbungnichtabgeschickt', 'bewerbungabgeschickt', 'statusbestaetigt', 'statusbestaetigtrtnichtangemeldet', 'statusbestaetigtrtangemeldet', 'bewerberrtangemeldet', 'bewerberrtnichtangemeldet'))) { $prestd = new prestudent(); From 545b9cb0ded721c63af9f656b8aafe3d5f0b4cfe Mon Sep 17 00:00:00 2001 From: Harald Bamberger Date: Thu, 13 Jul 2023 11:35:42 +0200 Subject: [PATCH 114/246] modify searchbar add category for employess without kst and oe assignment --- application/libraries/SearchBarLib.php | 63 ++++++++++++++++++++- public/js/components/searchbar/searchbar.js | 1 + 2 files changed, 63 insertions(+), 1 deletion(-) diff --git a/application/libraries/SearchBarLib.php b/application/libraries/SearchBarLib.php index 3a9d06d13..ed4a66ffb 100644 --- a/application/libraries/SearchBarLib.php +++ b/application/libraries/SearchBarLib.php @@ -32,7 +32,7 @@ class SearchBarLib const ERROR_WRONG_TYPES = 'ERR004'; // List of allowed types of search - const ALLOWED_TYPES = ['mitarbeiter', 'organisationunit', 'raum', 'person', 'student', 'prestudent', 'document', 'cms']; + const ALLOWED_TYPES = ['mitarbeiter', 'mitarbeiter_ohne_zuordnung', 'organisationunit', 'raum', 'person', 'student', 'prestudent', 'document', 'cms']; const PHOTO_IMG_URL = '/cis/public/bild.php?src=person&person_id='; @@ -108,6 +108,67 @@ class SearchBarLib return $result; } + private function _mitarbeiter_ohne_zuordnung($searchstr, $type) + { + $dbModel = new DB_Model(); + + $sql = ' + SELECT + \''.$type.'\' AS type, + b.uid AS uid, + p.person_id AS person_id, + p.vorname || \' \' || p.nachname AS name, + ARRAY_AGG(DISTINCT(org.bezeichnung)) AS organisationunit_name, + COALESCE(b.alias, b.uid) || \''.'@'.DOMAIN.'\' AS email, + TRIM(COALESCE(k.kontakt, \'\') || \' \' || COALESCE(m.telefonklappe, \'\')) AS phone, + \''.base_url(self::PHOTO_IMG_URL).'\' || p.person_id AS photo_url, + ARRAY_AGG(DISTINCT(stdkst.bezeichnung)) AS standardkostenstelle + FROM public.tbl_mitarbeiter m + JOIN public.tbl_benutzer b ON(b.uid = m.mitarbeiter_uid) + LEFT JOIN ( + SELECT o.bezeichnung, bf.uid + FROM public.tbl_benutzerfunktion bf + JOIN public.tbl_organisationseinheit o USING(oe_kurzbz) + WHERE bf.funktion_kurzbz = \'kstzuordnung\' + AND (bf.datum_von IS NULL OR bf.datum_von <= NOW()) + AND (bf.datum_bis IS NULL OR bf.datum_bis >= NOW()) + GROUP BY o.bezeichnung, bf.uid + ) stdkst ON stdkst.uid = b.uid + JOIN public.tbl_person p USING(person_id) + LEFT JOIN ( + SELECT o.bezeichnung, bf.uid + FROM public.tbl_benutzerfunktion bf + JOIN public.tbl_organisationseinheit o USING(oe_kurzbz) + WHERE bf.funktion_kurzbz = \'oezuordnung\' + AND (bf.datum_von IS NULL OR bf.datum_von <= NOW()) + AND (bf.datum_bis IS NULL OR bf.datum_bis >= NOW()) + GROUP BY o.bezeichnung, bf.uid + ) org ON org.uid = b.uid + LEFT JOIN ( + SELECT kontakt, standort_id + FROM public.tbl_kontakt + WHERE kontakttyp = \'telefon\' + ) k ON(k.standort_id = m.standort_id) + WHERE + stdkst.bezeichnung IS NULL + AND org.bezeichnung IS NULL + AND ( + b.uid ILIKE \'%'.$dbModel->escapeLike($searchstr).'%\' + OR p.vorname ILIKE \'%'.$dbModel->escapeLike($searchstr).'%\' + OR p.nachname ILIKE \'%'.$dbModel->escapeLike($searchstr).'%\' + ) + GROUP BY type, b.uid, p.person_id, name, email, m.telefonklappe, phone + '; + + $employees = $dbModel->execReadOnlyQuery($sql); + + // If something has been found then return it + if (hasData($employees)) return getData($employees); + + // Otherwise return an empty array + return array(); + } + /** * Search for employees */ diff --git a/public/js/components/searchbar/searchbar.js b/public/js/components/searchbar/searchbar.js index 155ea495b..277566f8d 100644 --- a/public/js/components/searchbar/searchbar.js +++ b/public/js/components/searchbar/searchbar.js @@ -46,6 +46,7 @@ export default { + - diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php index aa16ea77b..442ef7f81 100644 --- a/system/phrasesupdate.php +++ b/system/phrasesupdate.php @@ -20666,6 +20666,26 @@ array( ) ) ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'mail_part_grund', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => '

Grund:

{grund}

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

Reason:

{grund}

', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), array( 'app' => 'core', 'category' => 'studierendenantrag', From 02b64ad6a7c8690e95dc9b88166ca1443ee6f8ce Mon Sep 17 00:00:00 2001 From: cgfhtw Date: Tue, 25 Jul 2023 13:59:18 +0200 Subject: [PATCH 138/246] =?UTF-8?q?Assistenz=20kann=20eigene=20Abmeldungen?= =?UTF-8?q?=20Zur=C3=BCckziehen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- application/libraries/AntragLib.php | 3 +-- .../components/Studierendenantrag/Leitung.js | 20 +++++++++++++++++++ .../Studierendenantrag/Leitung/Table.js | 11 +++++++++- 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/application/libraries/AntragLib.php b/application/libraries/AntragLib.php index a04a03d84..0b5ec1957 100644 --- a/application/libraries/AntragLib.php +++ b/application/libraries/AntragLib.php @@ -1627,8 +1627,7 @@ class AntragLib if ($antrag->typ != Studierendenantrag_model::TYP_ABMELDUNG_STGL) return $this->isOwnAntrag($antrag_id); - // TODO(chris): assistenz can not cancel - should they be able to? - return false; + return $this->hasAccessToAntrag($antrag_id, 'student/studierendenantrag'); } /** diff --git a/public/js/components/Studierendenantrag/Leitung.js b/public/js/components/Studierendenantrag/Leitung.js index 2b2a53d61..747ad7123 100644 --- a/public/js/components/Studierendenantrag/Leitung.js +++ b/public/js/components/Studierendenantrag/Leitung.js @@ -267,6 +267,25 @@ export default { .then(this.showValidation) .catch(this.showError); }, + actionCancel(evt) { + var antraege = evt || this.selectedData; + this.$refs.loader.show(); + axios + .all( + antraege.map( + antrag => axios.post( + FHC_JS_DATA_STORAGE_OBJECT.app_root + + FHC_JS_DATA_STORAGE_OBJECT.ci_router + + '/components/Antrag/Abmeldung/cancelAntrag/', + { + antrag_id: antrag.studierendenantrag_id + } + ) + ) + ) + .then(this.showValidation) + .catch(this.showError); + }, showValidation(results) { var errors = results.filter(res => res.data.error); this.$refs.loader.hide(); @@ -327,6 +346,7 @@ export default { @action:object="actionObject" @action:objectionDeny="actionoObjectionDeny" @action:objectionApprove="actionObjectionApprove" + @action:cancel="actionCancel" > diff --git a/public/js/components/Studierendenantrag/Leitung/Table.js b/public/js/components/Studierendenantrag/Leitung/Table.js index cb469ee57..ba665c6f9 100644 --- a/public/js/components/Studierendenantrag/Leitung/Table.js +++ b/public/js/components/Studierendenantrag/Leitung/Table.js @@ -25,7 +25,8 @@ export default { 'action:reopen', 'action:object', 'action:objectionDeny', - 'action:objectionApprove' + 'action:objectionApprove', + 'action:cancel' ], data() { return { @@ -272,6 +273,14 @@ export default { }; container.append(button); } + // NOTE(chris): Cancel + if (data.typ == 'AbmeldungStgl' && data.status == 'Erstellt') { + let button = document.createElement('button'); + button.innerHTML = this.p.t('studierendenantrag', 'btn_cancel'); + button.className = "btn btn-outline-secondary"; + button.addEventListener('click',() => this.$emit('action:cancel', [cell.getData()])); + container.append(button); + } } if (this.stgL.includes(data.studiengang_kz)) { From 91f79b202186032d9404f5edf4f38aa510268ed6 Mon Sep 17 00:00:00 2001 From: ma0048 Date: Wed, 26 Jul 2023 13:27:51 +0200 Subject: [PATCH 139/246] - aufgenommen filter infocenter fuer lehrgaenge --- .../system/infocenter/InfoCenter.php | 31 +++++- .../infocenter/infocenterAufgenommen.php | 50 ++++++++++ .../infocenter/infocenterAufgenommenData.php | 95 +++++++++++++++++++ system/filtersupdate.php | 21 ++++ 4 files changed, 196 insertions(+), 1 deletion(-) create mode 100644 application/views/system/infocenter/infocenterAufgenommen.php create mode 100644 application/views/system/infocenter/infocenterAufgenommenData.php diff --git a/application/controllers/system/infocenter/InfoCenter.php b/application/controllers/system/infocenter/InfoCenter.php index 548b071d3..e6d307322 100644 --- a/application/controllers/system/infocenter/InfoCenter.php +++ b/application/controllers/system/infocenter/InfoCenter.php @@ -21,6 +21,7 @@ class InfoCenter extends Auth_Controller const FREIGEGEBEN_PAGE = 'freigegeben'; const REIHUNGSTESTABSOLVIERT_PAGE = 'reihungstestAbsolviert'; const ABGEWIESEN_PAGE = 'abgewiesen'; + const AUFGENOMMEN_PAGE = 'aufgenommen'; const SHOW_DETAILS_PAGE = 'showDetails'; const SHOW_ZGV_DETAILS_PAGE = 'showZGVDetails'; const ZGV_UBERPRUEFUNG_PAGE = 'ZGVUeberpruefung'; @@ -115,6 +116,7 @@ class InfoCenter extends Auth_Controller 'index' => 'infocenter:r', 'freigegeben' => 'infocenter:r', 'abgewiesen' => 'infocenter:r', + 'aufgenommen' => 'infocenter:r', 'reihungstestAbsolviert' => 'infocenter:r', 'showDetails' => 'infocenter:r', 'showZGVDetails' => 'lehre/zgvpruefung:r', @@ -228,6 +230,16 @@ class InfoCenter extends Auth_Controller $this->load->view('system/infocenter/infocenterAbgewiesen.php'); } + + /** + * Aufgenommene page of the InfoCenter tool + */ + public function aufgenommen() + { + $this->_setNavigationMenu(self::AUFGENOMMEN_PAGE); // define the navigation menu for this page + + $this->load->view('system/infocenter/infocenterAufgenommen.php'); + } /** * @@ -1526,6 +1538,7 @@ class InfoCenter extends Auth_Controller $freigegebenLink = site_url(self::INFOCENTER_URI.'/'.self::FREIGEGEBEN_PAGE); $reihungstestAbsolviertLink = site_url(self::INFOCENTER_URI.'/'.self::REIHUNGSTESTABSOLVIERT_PAGE); $abgewiesenLink = site_url(self::INFOCENTER_URI.'/'.self::ABGEWIESEN_PAGE); + $aufgenommenLink = site_url(self::INFOCENTER_URI.'/'.self::AUFGENOMMEN_PAGE); $currentFilterId = $this->input->get(self::FILTER_ID); if (isset($currentFilterId)) @@ -1533,6 +1546,7 @@ class InfoCenter extends Auth_Controller $freigegebenLink .= '?'.self::PREV_FILTER_ID.'='.$currentFilterId; $reihungstestAbsolviertLink .= '?'.self::PREV_FILTER_ID.'='.$currentFilterId; $abgewiesenLink .= '?'.self::PREV_FILTER_ID.'='.$currentFilterId; + $aufgenommenLink .= '?'.self::PREV_FILTER_ID.'='.$currentFilterId; } $this->navigationlib->setSessionMenu( @@ -1583,7 +1597,19 @@ class InfoCenter extends Auth_Controller null, // subscriptLinkValue '', // target 30 // sort - ) + ), + 'aufgenommen' => $this->navigationlib->oneLevel( + 'Aufgenommene', // description + $aufgenommenLink, // link + null, // children + 'check', // icon + null, // subscriptDescription + false, // expand + null, // subscriptLinkClass + null, // subscriptLinkValue + '', // target + 40 // sort + ), ) ); } @@ -1611,6 +1637,9 @@ class InfoCenter extends Auth_Controller if ($origin_page === self::ABGEWIESEN_PAGE) $link = site_url(self::INFOCENTER_URI.'/'.self::ABGEWIESEN_PAGE); + if ($origin_page === self::AUFGENOMMEN_PAGE) + $link = site_url(self::INFOCENTER_URI.'/'.self::AUFGENOMMEN_PAGE); + $prevFilterId = $this->input->get(self::PREV_FILTER_ID); if (isset($prevFilterId)) { diff --git a/application/views/system/infocenter/infocenterAufgenommen.php b/application/views/system/infocenter/infocenterAufgenommen.php new file mode 100644 index 000000000..6d65c0f7c --- /dev/null +++ b/application/views/system/infocenter/infocenterAufgenommen.php @@ -0,0 +1,50 @@ +load->view( + 'templates/FHC-Header', + array( + 'title' => 'Info Center', + 'jquery3' => true, + 'jqueryui1' => true, + 'jquerycheckboxes1' => true, + 'bootstrap3' => true, + 'fontawesome4' => true, + 'sbadmintemplate3' => true, + 'tablesorter2' => true, + 'ajaxlib' => true, + 'filterwidget' => true, + 'navigationwidget' => true, + 'dialoglib' => true, + 'phrases' => array( + 'person' => array('vorname', 'nachname'), + 'global' => array('mailAnXversandt'), + 'ui' => array('bitteEintragWaehlen') + ), + 'customCSSs' => array('public/css/sbadmin2/tablesort_bootstrap.css', 'public/css/infocenter/infocenterPersonDataset.css'), + 'customJSs' => array('public/js/bootstrapper.js', 'public/js/infocenter/infocenterPersonDataset.js') + ) + ); +?> + + +
+ + widgetlib->widget('NavigationWidget'); ?> + +
+
+
+
+ +
+
+
+ load->view('system/infocenter/infocenterAufgenommenData.php'); ?> +
+
+
+
+ + +load->view('templates/FHC-Footer'); ?> diff --git a/application/views/system/infocenter/infocenterAufgenommenData.php b/application/views/system/infocenter/infocenterAufgenommenData.php new file mode 100644 index 000000000..720d118e3 --- /dev/null +++ b/application/views/system/infocenter/infocenterAufgenommenData.php @@ -0,0 +1,95 @@ +config->load('infocenter'); + $AUFGENOMMENER_STATUS = '\'Aufgenommener\''; + $REJECTED_STATUS = '\'Abgewiesener\''; + $STUDIENGANG_TYP = '\'l\''; + $STUDIENSEMESTER = '\''.$this->variablelib->getVar('infocenter_studiensemester').'\''; + $LOGDATA_NAME = '\'Message sent\''; + $LOGDATA_VON = '\'online\''; + +$query = ' + SELECT + p.person_id AS "PersonId", + p.vorname AS "Vorname", + p.nachname AS "Nachname", + ( + SELECT ARRAY_TO_STRING(ARRAY_AGG(DISTINCT UPPER(sg.typ) || UPPER(sg.kurzbz)), \', \') + FROM public.tbl_prestudentstatus pss + JOIN public.tbl_prestudent ps USING(prestudent_id) + JOIN public.tbl_studiengang sg USING(studiengang_kz) + WHERE + pss.status_kurzbz = '. $AUFGENOMMENER_STATUS .' + AND ps.person_id = p.person_id + AND sg.typ IN ('.$STUDIENGANG_TYP.') + AND pss.studiensemester_kurzbz = '.$STUDIENSEMESTER.' + AND NOT EXISTS ( + SELECT 1 + FROM tbl_prestudentstatus spss + WHERE spss.prestudent_id = pss.prestudent_id + AND spss.status_kurzbz = '. $REJECTED_STATUS .' + AND spss.studiensemester_kurzbz IN ( + SELECT ss.studiensemester_kurzbz FROM public.tbl_studiensemester ss WHERE ss.ende > + (SELECT start FROM public.tbl_studiensemester sss WHERE studiensemester_kurzbz = '. $STUDIENSEMESTER .')) + ) + LIMIT 1 + ) AS "Studiengang" + FROM + public.tbl_person p + WHERE + EXISTS ( + SELECT 1 + FROM public.tbl_prestudent sps + JOIN public.tbl_studiengang ssg USING(studiengang_kz) + WHERE sps.person_id = p.person_id + AND ssg.typ IN (' . $STUDIENGANG_TYP . ') + AND ' . $AUFGENOMMENER_STATUS . ' = ( + SELECT spss.status_kurzbz + FROM public.tbl_prestudentstatus spss + WHERE spss.prestudent_id = sps.prestudent_id + ORDER BY spss.datum DESC, spss.insertamum DESC, spss.ext_id DESC + LIMIT 1 + ) + AND EXISTS ( + SELECT 1 + FROM tbl_prestudentstatus spss + WHERE spss.prestudent_id = sps.prestudent_id + AND spss.status_kurzbz = ' . $AUFGENOMMENER_STATUS . ' + AND spss.studiensemester_kurzbz = ' . $STUDIENSEMESTER . ' + ) + ) + + '; + + $filterWidgetArray = array( + 'query' => $query, + 'app' => InfoCenter::APP, + 'datasetName' => 'aufgenommen', + 'filter_id' => $this->input->get('filter_id'), + 'requiredPermissions' => 'infocenter', + 'datasetRepresentation' => 'tablesorter', + 'checkboxes' => 'PersonId', + 'additionalColumns' => array('Details'), + 'columnsAliases' => array( + 'PersonId', + ucfirst($this->p->t('person', 'vorname')) , + ucfirst($this->p->t('person', 'nachname')), + ucfirst($this->p->t('lehre', 'studiengang')) + ), + + 'formatRow' => function($datasetRaw) + { + $datasetRaw->{'Details'} = sprintf( + 'Details', + site_url('system/infocenter/InfoCenter/showDetails'), + $datasetRaw->{'PersonId'}, + 'aufgenommen', + (isset($_GET['fhc_controller_id']) ? $_GET['fhc_controller_id'] : ''), + (isset($_GET['filter_id']) ? $_GET['filter_id'] : '') + ); + return $datasetRaw; + } + ); + + echo $this->widgetlib->widget('FilterWidget', $filterWidgetArray); +?> diff --git a/system/filtersupdate.php b/system/filtersupdate.php index 241e44f2f..9f2b2c8e4 100644 --- a/system/filtersupdate.php +++ b/system/filtersupdate.php @@ -527,6 +527,27 @@ $filters = array( ', 'oe_kurzbz' => null, ), + array( + 'app' => 'infocenter', + 'dataset_name' => 'aufgenommen', + 'filter_kurzbz' => 'InfoCenterAufgenommenAlle', + 'description' => '{Alle}', + 'sort' => 1, + 'default_filter' => true, + 'filter' => ' + { + "name": "Aufgenommen - Alle", + "columns": [ + {"name": "PersonId"}, + {"name": "Vorname"}, + {"name": "Nachname"}, + {"name": "Studiengang"} + ], + "filters": [] + } + ', + 'oe_kurzbz' => null, + ), array( 'app' => 'budget', 'dataset_name' => 'budgetoverview', From ac5d6071cd95800017a02d8c656bafeb6e756a45 Mon Sep 17 00:00:00 2001 From: Harald Bamberger Date: Wed, 26 Jul 2023 16:27:34 +0200 Subject: [PATCH 140/246] extend VerttragsbestandteilLib to keep track on modified columns and only update dv, vbs and gbs when they differ from the status in the db --- .../AbstractBestandteil.php | 31 ++++++++++++ .../vertragsbestandteil/Dienstverhaeltnis.php | 27 ++++++++-- .../Gehaltsbestandteil.php | 32 +++++++++--- .../GehaltsbestandteilLib.php | 5 ++ .../Vertragsbestandteil.php | 27 +++++++--- .../VertragsbestandteilFactory.php | 16 +++--- .../VertragsbestandteilFreitext.php | 17 ++++--- .../VertragsbestandteilFunktion.php | 13 +++-- .../VertragsbestandteilKarenz.php | 19 ++++--- .../VertragsbestandteilKuendigungsfrist.php | 14 ++++-- .../VertragsbestandteilLib.php | 49 +++++++++++-------- .../VertragsbestandteilStunden.php | 17 ++++--- .../VertragsbestandteilUrlaubsanspruch.php | 13 +++-- .../VertragsbestandteilZeitaufzeichnung.php | 15 ++++-- .../Gehaltsbestandteil_model.php | 4 +- .../Vertragsbestandteil_model.php | 4 +- application/views/templates/FHC-Footer.php | 1 + composer.json | 14 +++--- composer.lock | 16 +++--- 19 files changed, 230 insertions(+), 104 deletions(-) create mode 100644 application/libraries/vertragsbestandteil/AbstractBestandteil.php diff --git a/application/libraries/vertragsbestandteil/AbstractBestandteil.php b/application/libraries/vertragsbestandteil/AbstractBestandteil.php new file mode 100644 index 000000000..72119968b --- /dev/null +++ b/application/libraries/vertragsbestandteil/AbstractBestandteil.php @@ -0,0 +1,31 @@ +modifiedcolumns = array(); + $this->fromdb = false; + } + + public function isDirty() { + return count($this->modifiedcolumns) > 0; + } + + protected function markDirty($columnname, $old_value, $new_value) { + if( !$this->fromdb && ($old_value != $new_value) ) { + $this->modifiedcolumns[$columnname] = $columnname; + } + } + + abstract public function hydrateByStdClass($data, $fromdb=false); +} diff --git a/application/libraries/vertragsbestandteil/Dienstverhaeltnis.php b/application/libraries/vertragsbestandteil/Dienstverhaeltnis.php index 3bd36aa78..d452f3982 100644 --- a/application/libraries/vertragsbestandteil/Dienstverhaeltnis.php +++ b/application/libraries/vertragsbestandteil/Dienstverhaeltnis.php @@ -2,6 +2,10 @@ namespace vertragsbestandteil; require_once __DIR__ . '/IValidation.php'; +require_once __DIR__ . '/AbstractBestandteil.php'; + +use vertragsbestandteil\AbstractBestandteil; +use vertragsbestandteil\IValidation; const TYPE_ECHT = 'echterdv'; const TYPE_STUDENTISCHE_HILFSKRAFT = 'studentischehilfskr'; @@ -12,7 +16,7 @@ const TYPE_ECHT_FREI = 'echterfreier'; const TYPE_WERKVERTRAG = 'werkvertrag'; const TYPE_UEBERLASSUNG = 'ueberlassungsvertrag'; -class Dienstverhaeltnis implements IValidation { +class Dienstverhaeltnis extends AbstractBestandteil implements IValidation { protected $dienstverhaeltnis_id; protected $mitarbeiter_uid; protected $vertragsart_kurzbz; @@ -29,12 +33,14 @@ class Dienstverhaeltnis implements IValidation { public function __construct() { + parent::__construct(); $this->isvalid = false; $this->validationerrors = array(); } - public function hydrateByStdClass($data) + public function hydrateByStdClass($data, $fromdb=false) { + $this->fromdb = $fromdb; isset($data->dienstverhaeltnis_id) && $this->setDienstverhaeltnis_id($data->dienstverhaeltnis_id); isset($data->mitarbeiter_uid) && $this->setMitarbeiter_uid($data->mitarbeiter_uid); isset($data->vertragsart_kurzbz) && $this->setVertragsart_kurzbz($data->vertragsart_kurzbz); @@ -45,6 +51,7 @@ class Dienstverhaeltnis implements IValidation { isset($data->insertvon) && $this->setInsertvon($data->insertvon); isset($data->updateamum) && $this->setUpdateamum($data->updateamum); isset($data->updatevon) && $this->setUpdatevon($data->updatevon); + $this->fromdb = false; } public function toStdClass(): \stdClass @@ -62,9 +69,9 @@ class Dienstverhaeltnis implements IValidation { 'updatevon' => $this->getUpdatevon() ); - $tmp = array_filter($tmp, function($v) { - return !is_null($v); - }); + $tmp = array_filter($tmp, function($k) { + return in_array($k, $this->modifiedcolumns); + }, ARRAY_FILTER_USE_KEY); return (object) $tmp; } @@ -136,60 +143,70 @@ EOTXT; public function setDienstverhaeltnis_id($dienstverhaeltnis_id) { + $this->markDirty('dienstverhaeltnis_id', $this->dienstverhaeltnis_id, $dienstverhaeltnis_id); $this->dienstverhaeltnis_id = $dienstverhaeltnis_id; return $this; } public function setMitarbeiter_uid($mitarbeiter_uid) { + $this->markDirty('mitarbeiter_uid', $this->mitarbeiter_uid, $mitarbeiter_uid); $this->mitarbeiter_uid = $mitarbeiter_uid; return $this; } public function setVertragsart_kurzbz($vertragsart_kurzbz) { + $this->markDirty('vertragsart_kurzbz', $this->vertragsart_kurzbz, $vertragsart_kurzbz); $this->vertragsart_kurzbz = $vertragsart_kurzbz; return $this; } public function setOe_kurzbz($oe_kurzbz) { + $this->markDirty('oe_kurzbz', $this->oe_kurzbz, $oe_kurzbz); $this->oe_kurzbz = $oe_kurzbz; return $this; } public function setVon($von) { + $this->markDirty('von', $this->von, $von); $this->von = $von; return $this; } public function setBis($bis) { + $this->markDirty('bis', $this->bis, $bis); $this->bis = $bis; return $this; } public function setInsertamum($insertamum) { + $this->markDirty('insertamum', $this->insertamum, $insertamum); $this->insertamum = $insertamum; return $this; } public function setInsertvon($insertvon) { + $this->markDirty('insertvon', $this->insertvon, $insertvon); $this->insertvon = $insertvon; return $this; } public function setUpdateamum($updateamum) { + $this->markDirty('updateamum', $this->updateamum, $updateamum); $this->updateamum = $updateamum; return $this; } public function setUpdatevon($updatevon) { + $this->markDirty('updatevon', $this->updatevon, $updatevon); $this->updatevon = $updatevon; return $this; } diff --git a/application/libraries/vertragsbestandteil/Gehaltsbestandteil.php b/application/libraries/vertragsbestandteil/Gehaltsbestandteil.php index 6964907f3..3ad74704b 100644 --- a/application/libraries/vertragsbestandteil/Gehaltsbestandteil.php +++ b/application/libraries/vertragsbestandteil/Gehaltsbestandteil.php @@ -1,12 +1,13 @@ isvalid = false; $this->validationerrors = array(); } - public function hydrateByStdClass($data) - { + public function hydrateByStdClass($data, $fromdb=false) + { + $this->fromdb = $fromdb; isset($data->gehaltsbestandteil_id) && $this->setGehaltsbestandteil_id($data->gehaltsbestandteil_id); isset($data->dienstverhaeltnis_id) && $this->setDienstverhaeltnis_id($data->dienstverhaeltnis_id); isset($data->vertragsbestandteil_id) && $this->setVertragsbestandteil_id($data->vertragsbestandteil_id); @@ -54,6 +57,7 @@ class Gehaltsbestandteil implements IValidation, \JsonSerializable isset($data->insertvon) && $this->setInsertvon($data->insertvon); isset($data->updateamum) && $this->setUpdateamum($data->updateamum); isset($data->updatevon) && $this->setUpdatevon($data->updatevon); + $this->fromdb = false; } public function getGehaltsbestandteil_id() @@ -153,96 +157,112 @@ class Gehaltsbestandteil implements IValidation, \JsonSerializable public function setGehaltsbestandteil_id($gehaltsbestandteil_id) { + $this->markDirty('gehaltsbestandteil_id', $this->gehaltsbestandteil_id, $gehaltsbestandteil_id); $this->gehaltsbestandteil_id = $gehaltsbestandteil_id; return $this; } public function setDienstverhaeltnis_id($dienstverhaeltnis_id) { + $this->markDirty('dienstverhaeltnis_id', $this->dienstverhaeltnis_id, $dienstverhaeltnis_id); $this->dienstverhaeltnis_id = $dienstverhaeltnis_id; return $this; } public function setVertragsbestandteil_id($vertragsbestandteil_id) { + $this->markDirty('vertragsbestandteil_id', $this->vertragsbestandteil_id, $vertragsbestandteil_id); $this->vertragsbestandteil_id = $vertragsbestandteil_id; return $this; } public function setGehaltstyp_kurzbz($gehaltstyp_kurzbz) { + $this->markDirty('gehaltstyp_kurzbz', $this->gehaltstyp_kurzbz, $gehaltstyp_kurzbz); $this->gehaltstyp_kurzbz = $gehaltstyp_kurzbz; return $this; } public function setVon($von) { + $this->markDirty('von', $this->von, $von); $this->von = $von; return $this; } public function setBis($bis) { + $this->markDirty('bis', $this->bis, $bis); $this->bis = $bis; return $this; } public function setAnmerkung($anmerkung) { + $this->markDirty('anmerkung', $this->anmerkung, $anmerkung); $this->anmerkung = $anmerkung; return $this; } public function setGrundbetrag($grundbetrag) { + $this->markDirty('grundbetrag', $this->grundbetrag, $grundbetrag); $this->grundbetrag = $grundbetrag; return $this; } public function setBetrag_valorisiert($betrag_valorisiert) { + $this->markDirty('betrag_valorisiert', $this->betrag_valorisiert, $betrag_valorisiert); $this->betrag_valorisiert = $betrag_valorisiert; return $this; } public function setValorisierungssperre($valorisierungssperre) { + $this->markDirty('valorisierungssperre', $this->valorisierungssperre, $valorisierungssperre); $this->valorisierungssperre = $valorisierungssperre; return $this; } public function setValorisierung($valorisierung) { + $this->markDirty('valorisierung', $this->valorisierung, $valorisierung); $this->valorisierung = $valorisierung; return $this; } public function setAuszahlungen($auszahlungen) { + $this->markDirty('auszahlungen', $this->auszahlungen, $auszahlungen); $this->auszahlungen = $auszahlungen; return $this; } public function setInsertamum($insertamum) { + $this->markDirty('insertamum', $this->insertamum, $insertamum); $this->insertamum = $insertamum; return $this; } public function setInsertvon($insertvon) { + $this->markDirty('insertvon', $this->insertvon, $insertvon); $this->insertvon = $insertvon; return $this; } public function setUpdateamum($updateamum) { + $this->markDirty('updateamum', $this->updateamum, $updateamum); $this->updateamum = $updateamum; return $this; } public function setUpdatevon($updatevon) { + $this->markDirty('updatevon', $this->updatevon, $updatevon); $this->updatevon = $updatevon; return $this; } @@ -275,9 +295,9 @@ class Gehaltsbestandteil implements IValidation, \JsonSerializable 'updatevon' => $this->getUpdatevon() ); - $tmp = array_filter($tmp, function($v) { - return !is_null($v); - }); + $tmp = array_filter($tmp, function($k) { + return in_array($k, $this->modifiedcolumns); + }, ARRAY_FILTER_USE_KEY); return (object) $tmp; } diff --git a/application/libraries/vertragsbestandteil/GehaltsbestandteilLib.php b/application/libraries/vertragsbestandteil/GehaltsbestandteilLib.php index c8673e5b4..74dc35672 100644 --- a/application/libraries/vertragsbestandteil/GehaltsbestandteilLib.php +++ b/application/libraries/vertragsbestandteil/GehaltsbestandteilLib.php @@ -1,5 +1,6 @@ isDirty()) { + return; + } + $gehaltsbestandteil->setUpdatevon($this->loggedInUser) ->setUpdateamum(strftime('%Y-%m-%d %H:%M:%S')); $ret = $this->GehaltsbestandteilModel->update($gehaltsbestandteil->getGehaltsbestandteil_id(), diff --git a/application/libraries/vertragsbestandteil/Vertragsbestandteil.php b/application/libraries/vertragsbestandteil/Vertragsbestandteil.php index cf62966fc..cb3b066f8 100644 --- a/application/libraries/vertragsbestandteil/Vertragsbestandteil.php +++ b/application/libraries/vertragsbestandteil/Vertragsbestandteil.php @@ -1,12 +1,14 @@ gehaltsbestandteile = array(); $this->isvalid = false; $this->validationerrors = array(); } - public function hydrateByStdClass($data) - { + public function hydrateByStdClass($data, $fromdb=false) + { + $this->fromdb = $fromdb; isset($data->vertragsbestandteil_id) && $this->setVertragsbestandteil_id($data->vertragsbestandteil_id); isset($data->dienstverhaeltnis_id) && $this->setDienstverhaeltnis_id($data->dienstverhaeltnis_id); isset($data->von) && $this->setVon($data->von); @@ -40,6 +44,7 @@ abstract class Vertragsbestandteil implements \JsonSerializable, IValidation isset($data->insertvon) && $this->setInsertvon($data->insertvon); isset($data->updateamum) && $this->setUpdateamum($data->updateamum); isset($data->updatevon) && $this->setUpdatevon($data->updatevon); + $this->fromdb = false; } public function addGehaltsbestandteil(Gehaltsbestandteil $gehaltsbestandteil) @@ -108,6 +113,7 @@ abstract class Vertragsbestandteil implements \JsonSerializable, IValidation public function setVertragsbestandteil_id($vertragsbestandteil_id) { + $this->markDirty('vertragsbestandteil_id', $this->vertragsbestandteil_id, $vertragsbestandteil_id); $this->vertragsbestandteil_id = $vertragsbestandteil_id; foreach ($this->gehaltsbestandteile as $gehaltsbestandteil) { @@ -118,6 +124,7 @@ abstract class Vertragsbestandteil implements \JsonSerializable, IValidation public function setDienstverhaeltnis_id($dienstverhaeltnis_id) { + $this->markDirty('dienstverhaeltnis_id', $this->dienstverhaeltnis_id, $dienstverhaeltnis_id); $this->dienstverhaeltnis_id = $dienstverhaeltnis_id; foreach ($this->gehaltsbestandteile as $gehaltsbestandteil) { @@ -128,42 +135,50 @@ abstract class Vertragsbestandteil implements \JsonSerializable, IValidation public function setVon($von) { + $this->markDirty('von', $this->von, $von); $this->von = $von; return $this; } public function setBis($bis) { + $this->markDirty('bis', $this->bis, $bis); $this->bis = $bis; return $this; } public function setVertragsbestandteiltyp_kurzbz($vertragsbestandteiltyp_kurzbz) { + // type should never change and is set in constructor so do not mark dirty + //$this->markDirty('vertragsbestandteiltyp_kurzbz', $this->vertragsbestandteiltyp_kurzbz, $vertragsbestandteiltyp_kurzbz); $this->vertragsbestandteiltyp_kurzbz = $vertragsbestandteiltyp_kurzbz; return $this; } public function setInsertamum($insertamum) { + $this->markDirty('insertamum', $this->insertamum, $insertamum); $this->insertamum = $insertamum; return $this; } public function setInsertvon($insertvon) { + $this->markDirty('insertvon', $this->insertvon, $insertvon); $this->insertvon = $insertvon; return $this; } public function setUpdateamum($updateamum) { + $this->markDirty('updateamum', $this->updateamum, $updateamum); $this->updateamum = $updateamum; return $this; } public function setUpdatevon($updatevon) { + $this->markDirty('updatevon', $this->updatevon, $updatevon); $this->updatevon = $updatevon; return $this; } @@ -181,9 +196,9 @@ abstract class Vertragsbestandteil implements \JsonSerializable, IValidation 'updatevon' => $this->getUpdatevon(), ); - $tmp = array_filter($tmp, function($v) { - return !is_null($v); - }); + $tmp = array_filter($tmp, function($k) { + return in_array($k, $this->modifiedcolumns); + }, ARRAY_FILTER_USE_KEY); return (object) $tmp; } diff --git a/application/libraries/vertragsbestandteil/VertragsbestandteilFactory.php b/application/libraries/vertragsbestandteil/VertragsbestandteilFactory.php index 220ee5dff..6e7b0af06 100644 --- a/application/libraries/vertragsbestandteil/VertragsbestandteilFactory.php +++ b/application/libraries/vertragsbestandteil/VertragsbestandteilFactory.php @@ -23,7 +23,7 @@ class VertragsbestandteilFactory const VERTRAGSBESTANDTEIL_ZEITAUFZEICHNUNG = 'zeitaufzeichnung'; const VERTRAGSBESTANDTEIL_LEHRE = 'lehre'; - public static function getVertragsbestandteil($data) + public static function getVertragsbestandteil($data, $fromdb=false) { $vertragsbestandteiltyp_kurzbz = isset($data->vertragsbestandteiltyp_kurzbz) ? $data->vertragsbestandteiltyp_kurzbz : false; @@ -37,37 +37,37 @@ class VertragsbestandteilFactory { case self::VERTRAGSBESTANDTEIL_FREITEXT: $vertragsbestandteil = new VertragsbestandteilFreitext(); - $vertragsbestandteil->hydrateByStdClass($data); + $vertragsbestandteil->hydrateByStdClass($data, $fromdb); break; case self::VERTRAGSBESTANDTEIL_FUNKTION: $vertragsbestandteil = new VertragsbestandteilFunktion(); - $vertragsbestandteil->hydrateByStdClass($data); + $vertragsbestandteil->hydrateByStdClass($data, $fromdb); break; case self::VERTRAGSBESTANDTEIL_KARENZ: $vertragsbestandteil = new VertragsbestandteilKarenz(); - $vertragsbestandteil->hydrateByStdClass($data); + $vertragsbestandteil->hydrateByStdClass($data, $fromdb); break; case self::VERTRAGSBESTANDTEIL_KUENDIGUNGSFRIST: $vertragsbestandteil = new VertragsbestandteilKuendigungsfrist(); - $vertragsbestandteil->hydrateByStdClass($data); + $vertragsbestandteil->hydrateByStdClass($data, $fromdb); break; case self::VERTRAGSBESTANDTEIL_STUNDEN: $vertragsbestandteil = new VertragsbestandteilStunden(); - $vertragsbestandteil->hydrateByStdClass($data); + $vertragsbestandteil->hydrateByStdClass($data, $fromdb); break; case self::VERTRAGSBESTANDTEIL_URLAUBSANSPRUCH: $vertragsbestandteil = new VertragsbestandteilUrlaubsanspruch(); - $vertragsbestandteil->hydrateByStdClass($data); + $vertragsbestandteil->hydrateByStdClass($data, $fromdb); break; case self::VERTRAGSBESTANDTEIL_ZEITAUFZEICHNUNG: $vertragsbestandteil = new VertragsbestandteilZeitaufzeichnung(); - $vertragsbestandteil->hydrateByStdClass($data); + $vertragsbestandteil->hydrateByStdClass($data, $fromdb); break; default: diff --git a/application/libraries/vertragsbestandteil/VertragsbestandteilFreitext.php b/application/libraries/vertragsbestandteil/VertragsbestandteilFreitext.php index 213067610..8d16e0ef0 100644 --- a/application/libraries/vertragsbestandteil/VertragsbestandteilFreitext.php +++ b/application/libraries/vertragsbestandteil/VertragsbestandteilFreitext.php @@ -17,14 +17,16 @@ class VertragsbestandteilFreitext extends Vertragsbestandteil VertragsbestandteilFactory::VERTRAGSBESTANDTEIL_FREITEXT); } - public function hydrateByStdClass($data) + public function hydrateByStdClass($data, $fromdb=false) { - parent::hydrateByStdClass($data); + parent::hydrateByStdClass($data, $fromdb); + $this->fromdb = $fromdb; isset($data->freitexttyp) && $this->setFreitexttypKurzbz($data->freitexttyp); isset($data->freitexttyp_kurzbz) && $this->setFreitexttypKurzbz($data->freitexttyp_kurzbz); isset($data->titel) && $this->setTitel($data->titel); isset($data->freitext) && $this->setAnmerkung($data->freitext); isset($data->anmerkung) && $this->setAnmerkung($data->anmerkung); + $this->fromdb = false; } public function toStdClass(): \stdClass @@ -36,9 +38,9 @@ class VertragsbestandteilFreitext extends Vertragsbestandteil 'anmerkung' => $this->getAnmerkung() ); - $tmp = array_filter($tmp, function($v) { - return !is_null($v); - }); + $tmp = array_filter($tmp, function($k) { + return in_array($k, $this->modifiedcolumns); + }, ARRAY_FILTER_USE_KEY); return (object) $tmp; } @@ -67,6 +69,7 @@ EOTXT; */ public function setAnmerkung($anmerkung): self { + $this->markDirty('anmerkung', $this->anmerkung, $anmerkung); $this->anmerkung = $anmerkung; return $this; @@ -85,6 +88,7 @@ EOTXT; */ public function setTitel($titel): self { + $this->markDirty('titel', $this->titel, $titel); $this->titel = $titel; return $this; @@ -94,7 +98,7 @@ EOTXT; * Get the value of freitexttyp_kurzbz */ public function getFreitexttypKurzbz() - { + { return $this->freitexttyp_kurzbz; } @@ -103,6 +107,7 @@ EOTXT; */ public function setFreitexttypKurzbz($freitexttyp_kurzbz): self { + $this->markDirty('freitexttyp_kurzbz', $this->freitexttyp_kurzbz, $freitexttyp_kurzbz); $this->freitexttyp_kurzbz = $freitexttyp_kurzbz; return $this; diff --git a/application/libraries/vertragsbestandteil/VertragsbestandteilFunktion.php b/application/libraries/vertragsbestandteil/VertragsbestandteilFunktion.php index 21cb861d4..374db9181 100644 --- a/application/libraries/vertragsbestandteil/VertragsbestandteilFunktion.php +++ b/application/libraries/vertragsbestandteil/VertragsbestandteilFunktion.php @@ -78,9 +78,9 @@ class VertragsbestandteilFunktion extends Vertragsbestandteil 'benutzerfunktion_id' => $this->getBenutzerfunktion_id() ); - $tmp = array_filter($tmp, function($v) { - return !is_null($v); - }); + $tmp = array_filter($tmp, function($k) { + return in_array($k, $this->modifiedcolumns); + }, ARRAY_FILTER_USE_KEY); return (object) $tmp; } @@ -94,15 +94,17 @@ EOTXT; return parent::__toString() . $txt; } - public function hydrateByStdClass($data) + public function hydrateByStdClass($data, $fromdb=false) { - parent::hydrateByStdClass($data); + parent::hydrateByStdClass($data, $fromdb); + $this->fromdb = $fromdb; isset($data->benutzerfunktionid) && $this->setBenutzerfunktion_id($data->benutzerfunktionid); isset($data->benutzerfunktion_id) && $this->setBenutzerfunktion_id($data->benutzerfunktion_id); isset($data->funktion) && isset($data->orget) && isset($data->mitarbeiter_uid) && $this->createBenutzerfunktionData($data); isset($data->funktion_bezeichnung) && isset($data->oe_bezeichnung) && $this->createBenutzerfunktionData4Display($data); + $this->fromdb = false; } @@ -113,6 +115,7 @@ EOTXT; public function setBenutzerfunktion_id($benutzerfunktion_id) { + $this->markDirty('benutzerfunktion_id', $this->benutzerfunktion_id, $benutzerfunktion_id); $this->benutzerfunktion_id = $benutzerfunktion_id; return $this; } diff --git a/application/libraries/vertragsbestandteil/VertragsbestandteilKarenz.php b/application/libraries/vertragsbestandteil/VertragsbestandteilKarenz.php index ba123503e..7b49bfe4c 100644 --- a/application/libraries/vertragsbestandteil/VertragsbestandteilKarenz.php +++ b/application/libraries/vertragsbestandteil/VertragsbestandteilKarenz.php @@ -17,12 +17,14 @@ class VertragsbestandteilKarenz extends Vertragsbestandteil VertragsbestandteilFactory::VERTRAGSBESTANDTEIL_KARENZ); } - public function hydrateByStdClass($data) + public function hydrateByStdClass($data, $fromdb=false) { - parent::hydrateByStdClass($data); + parent::hydrateByStdClass($data, $fromdb); + $this->fromdb = $fromdb; isset($data->karenztyp_kurzbz) && $this->setKarenztypKurzbz($data->karenztyp_kurzbz); isset($data->geplanter_geburtstermin) && $this->setGeplanterGeburtstermin($data->geplanter_geburtstermin); - isset($data->tatsaechlicher_geburtstermin) && $this->setTatsaechlicherGeburtstermin($data->tatsaechlicher_geburtstermin); + isset($data->tatsaechlicher_geburtstermin) && $this->setTatsaechlicherGeburtstermin($data->tatsaechlicher_geburtstermin); + $this->fromdb = false; } /** @@ -38,6 +40,7 @@ class VertragsbestandteilKarenz extends Vertragsbestandteil */ public function setKarenztypKurzbz($karenztyp_kurzbz): self { + $this->markDirty('karenztyp_kurzbz', $this->karenztyp_kurzbz, $karenztyp_kurzbz); $this->karenztyp_kurzbz = $karenztyp_kurzbz; return $this; @@ -47,7 +50,7 @@ class VertragsbestandteilKarenz extends Vertragsbestandteil * Get the value of tatsaechlicher_geburtstermin */ public function getTatsaechlicherGeburtstermin() - { + { return $this->tatsaechlicher_geburtstermin; } @@ -56,6 +59,7 @@ class VertragsbestandteilKarenz extends Vertragsbestandteil */ public function setTatsaechlicherGeburtstermin($tatsaechlicher_geburtstermin): self { + $this->markDirty('tatsaechlicher_geburtstermin', $this->tatsaechlicher_geburtstermin, $tatsaechlicher_geburtstermin); $this->tatsaechlicher_geburtstermin = $tatsaechlicher_geburtstermin; return $this; @@ -74,6 +78,7 @@ class VertragsbestandteilKarenz extends Vertragsbestandteil */ public function setGeplanterGeburtstermin($geplanter_geburtstermin): self { + $this->markDirty('geplanter_geburtstermin', $this->geplanter_geburtstermin, $geplanter_geburtstermin); $this->geplanter_geburtstermin = $geplanter_geburtstermin; return $this; @@ -88,9 +93,9 @@ class VertragsbestandteilKarenz extends Vertragsbestandteil 'geplanter_geburtstermin' => $this->getGeplanterGeburtstermin() ); - $tmp = array_filter($tmp, function($v) { - return !is_null($v); - }); + $tmp = array_filter($tmp, function($k) { + return in_array($k, $this->modifiedcolumns); + }, ARRAY_FILTER_USE_KEY); return (object) $tmp; } diff --git a/application/libraries/vertragsbestandteil/VertragsbestandteilKuendigungsfrist.php b/application/libraries/vertragsbestandteil/VertragsbestandteilKuendigungsfrist.php index 1d2788b57..81ea0dcec 100644 --- a/application/libraries/vertragsbestandteil/VertragsbestandteilKuendigungsfrist.php +++ b/application/libraries/vertragsbestandteil/VertragsbestandteilKuendigungsfrist.php @@ -16,11 +16,13 @@ class VertragsbestandteilKuendigungsfrist extends Vertragsbestandteil VertragsbestandteilFactory::VERTRAGSBESTANDTEIL_KUENDIGUNGSFRIST); } - public function hydrateByStdClass($data) + public function hydrateByStdClass($data, $fromdb=false) { - parent::hydrateByStdClass($data); + parent::hydrateByStdClass($data, $fromdb); + $this->fromdb = $fromdb; isset($data->arbeitgeber_frist) && $this->setArbeitgeberFrist($data->arbeitgeber_frist); isset($data->arbeitnehmer_frist) && $this->setArbeitnehmerFrist($data->arbeitnehmer_frist); + $this->fromdb = false; } /** @@ -36,6 +38,7 @@ class VertragsbestandteilKuendigungsfrist extends Vertragsbestandteil */ public function setArbeitgeberFrist($arbeitgeber_frist): self { + $this->markDirty('arbeitgeber_frist', $this->arbeitgeber_frist, $arbeitgeber_frist); $this->arbeitgeber_frist = $arbeitgeber_frist; return $this; @@ -54,6 +57,7 @@ class VertragsbestandteilKuendigungsfrist extends Vertragsbestandteil */ public function setArbeitnehmerFrist($arbeitnehmer_frist): self { + $this->markDirty('arbeitnehmer_frist', $this->arbeitnehmer_frist, $arbeitnehmer_frist); $this->arbeitnehmer_frist = $arbeitnehmer_frist; return $this; @@ -67,9 +71,9 @@ class VertragsbestandteilKuendigungsfrist extends Vertragsbestandteil 'arbeitnehmer_frist' => $this->getArbeitnehmerFrist() ); - $tmp = array_filter($tmp, function($v) { - return !is_null($v); - }); + $tmp = array_filter($tmp, function($k) { + return in_array($k, $this->modifiedcolumns); + }, ARRAY_FILTER_USE_KEY); return (object) $tmp; } diff --git a/application/libraries/vertragsbestandteil/VertragsbestandteilLib.php b/application/libraries/vertragsbestandteil/VertragsbestandteilLib.php index 56b5760e8..6fbbebac7 100644 --- a/application/libraries/vertragsbestandteil/VertragsbestandteilLib.php +++ b/application/libraries/vertragsbestandteil/VertragsbestandteilLib.php @@ -1,5 +1,6 @@ hydrateByStdClass($row[0]); + $dv->hydrateByStdClass($row[0], true); } return $dv; } @@ -270,6 +271,10 @@ class VertragsbestandteilLib protected function updateDienstverhaeltnis(Dienstverhaeltnis $dv) { + if(!$dv->isDirty()) { + return; + } + $dv->setUpdatevon($this->loggedInUser) ->setUpdateamum(strftime('%Y-%m-%d %H:%M:%S')); $ret = $this->DienstverhaeltnisModel->update($dv->getDienstverhaeltnis_id(), @@ -315,26 +320,28 @@ class VertragsbestandteilLib protected function updateVertragsbestandteil(Vertragsbestandteil $vertragsbestandteil) { - $vertragsbestandteil->setUpdatevon($this->loggedInUser) - ->setUpdateamum(strftime('%Y-%m-%d %H:%M:%S')); - $vertragsbestandteil->beforePersist(); - $ret = $this->VertragsbestandteilModel->update($vertragsbestandteil->getVertragsbestandteil_id(), - $vertragsbestandteil->baseToStdClass()); - - if(isError($ret) ) - { - throw new Exception('error updating vertragsbestandteil'); - } - - $specialisedModel = VertragsbestandteilFactory::getVertragsbestandteilDBModel( - $vertragsbestandteil->getVertragsbestandteiltyp_kurzbz()); - $retspecial = $specialisedModel->update($vertragsbestandteil->getVertragsbestandteil_id(), - $vertragsbestandteil->toStdClass()); - - if(isError($retspecial) ) - { - throw new Exception('error updating vertragsbestandteil ' - . $vertragsbestandteil->getVertragsbestandteiltyp_kurzbz()); + if($vertragsbestandteil->isDirty()) { + $vertragsbestandteil->setUpdatevon($this->loggedInUser) + ->setUpdateamum(strftime('%Y-%m-%d %H:%M:%S')); + $vertragsbestandteil->beforePersist(); + $ret = $this->VertragsbestandteilModel->update($vertragsbestandteil->getVertragsbestandteil_id(), + $vertragsbestandteil->baseToStdClass()); + + if(isError($ret) ) + { + throw new Exception('error updating vertragsbestandteil'); + } + + $specialisedModel = VertragsbestandteilFactory::getVertragsbestandteilDBModel( + $vertragsbestandteil->getVertragsbestandteiltyp_kurzbz()); + $retspecial = $specialisedModel->update($vertragsbestandteil->getVertragsbestandteil_id(), + $vertragsbestandteil->toStdClass()); + + if(isError($retspecial) ) + { + throw new Exception('error updating vertragsbestandteil ' + . $vertragsbestandteil->getVertragsbestandteiltyp_kurzbz()); + } } try diff --git a/application/libraries/vertragsbestandteil/VertragsbestandteilStunden.php b/application/libraries/vertragsbestandteil/VertragsbestandteilStunden.php index ff9318134..e49a227c6 100644 --- a/application/libraries/vertragsbestandteil/VertragsbestandteilStunden.php +++ b/application/libraries/vertragsbestandteil/VertragsbestandteilStunden.php @@ -24,11 +24,13 @@ class VertragsbestandteilStunden extends Vertragsbestandteil VertragsbestandteilFactory::VERTRAGSBESTANDTEIL_STUNDEN); } - public function hydrateByStdClass($data) + public function hydrateByStdClass($data, $fromdb=false) { - parent::hydrateByStdClass($data); + parent::hydrateByStdClass($data, $fromdb); + $this->fromdb = $fromdb; isset($data->wochenstunden) && $this->setWochenstunden($data->wochenstunden); isset($data->teilzeittyp_kurzbz) && $this->setTeilzeittyp_kurzbz($data->teilzeittyp_kurzbz); + $this->fromdb = false; } public function getWochenstunden() @@ -43,14 +45,17 @@ class VertragsbestandteilStunden extends Vertragsbestandteil public function setWochenstunden($wochenstunden) { + $this->markDirty('wochenstunden', $this->wochenstunden, $wochenstunden); $this->wochenstunden = $wochenstunden; return $this; } public function setTeilzeittyp_kurzbz($teilzeittyp_kurzbz) { - $this->teilzeittyp_kurzbz = ($teilzeittyp_kurzbz !== '') + $teilzeittyp_kurzbz = ($teilzeittyp_kurzbz !== '') ? $teilzeittyp_kurzbz : null; + $this->markDirty('teilzeittyp_kurzbz', $this->teilzeittyp_kurzbz, $teilzeittyp_kurzbz); + $this->teilzeittyp_kurzbz = $teilzeittyp_kurzbz; return $this; } @@ -62,9 +67,9 @@ class VertragsbestandteilStunden extends Vertragsbestandteil 'teilzeittyp_kurzbz' => $this->getTeilzeittyp_kurzbz() ); - $tmp = array_filter($tmp, function($v) { - return !is_null($v); - }); + $tmp = array_filter($tmp, function($k) { + return in_array($k, $this->modifiedcolumns); + }, ARRAY_FILTER_USE_KEY); return (object) $tmp; } diff --git a/application/libraries/vertragsbestandteil/VertragsbestandteilUrlaubsanspruch.php b/application/libraries/vertragsbestandteil/VertragsbestandteilUrlaubsanspruch.php index fde150317..fe683211d 100644 --- a/application/libraries/vertragsbestandteil/VertragsbestandteilUrlaubsanspruch.php +++ b/application/libraries/vertragsbestandteil/VertragsbestandteilUrlaubsanspruch.php @@ -15,10 +15,12 @@ class VertragsbestandteilUrlaubsanspruch extends Vertragsbestandteil VertragsbestandteilFactory::VERTRAGSBESTANDTEIL_URLAUBSANSPRUCH); } - public function hydrateByStdClass($data) + public function hydrateByStdClass($data, $fromdb=false) { - parent::hydrateByStdClass($data); + parent::hydrateByStdClass($data, $fromdb); + $this->fromdb = $fromdb; isset($data->tage) && $this->setTage($data->tage); + $this->fromdb = false; } /** @@ -34,6 +36,7 @@ class VertragsbestandteilUrlaubsanspruch extends Vertragsbestandteil */ public function setTage($tage): self { + $this->markDirty('tage', $this->tage, $tage); $this->tage = $tage; return $this; @@ -46,9 +49,9 @@ class VertragsbestandteilUrlaubsanspruch extends Vertragsbestandteil 'tage' => $this->getTage(), ); - $tmp = array_filter($tmp, function($v) { - return !is_null($v); - }); + $tmp = array_filter($tmp, function($k) { + return in_array($k, $this->modifiedcolumns); + }, ARRAY_FILTER_USE_KEY); return (object) $tmp; } diff --git a/application/libraries/vertragsbestandteil/VertragsbestandteilZeitaufzeichnung.php b/application/libraries/vertragsbestandteil/VertragsbestandteilZeitaufzeichnung.php index 3fce91995..5bbdaa36f 100644 --- a/application/libraries/vertragsbestandteil/VertragsbestandteilZeitaufzeichnung.php +++ b/application/libraries/vertragsbestandteil/VertragsbestandteilZeitaufzeichnung.php @@ -17,12 +17,14 @@ class VertragsbestandteilZeitaufzeichnung extends Vertragsbestandteil VertragsbestandteilFactory::VERTRAGSBESTANDTEIL_ZEITAUFZEICHNUNG); } - public function hydrateByStdClass($data) + public function hydrateByStdClass($data, $fromdb=false) { - parent::hydrateByStdClass($data); + parent::hydrateByStdClass($data, $fromdb); + $this->fromdb = $fromdb; isset($data->zeitaufzeichnung) && $this->setZeitaufzeichnung($data->zeitaufzeichnung); isset($data->azgrelevant) && $this->setAzgrelevant($data->azgrelevant); isset($data->homeoffice) && $this->setHomeoffice($data->homeoffice); + $this->fromdb = false; } /** @@ -38,6 +40,7 @@ class VertragsbestandteilZeitaufzeichnung extends Vertragsbestandteil */ public function setZeitaufzeichnung($zeitaufzeichnung): self { + $this->markDirty('zeitaufzeichnung', $this->zeitaufzeichnung, $zeitaufzeichnung); $this->zeitaufzeichnung = $zeitaufzeichnung; return $this; @@ -56,6 +59,7 @@ class VertragsbestandteilZeitaufzeichnung extends Vertragsbestandteil */ public function setAzgrelevant($azgrelevant): self { + $this->markDirty('azgrelevant', $this->azgrelevant, $azgrelevant); $this->azgrelevant = $azgrelevant; return $this; @@ -74,6 +78,7 @@ class VertragsbestandteilZeitaufzeichnung extends Vertragsbestandteil */ public function setHomeoffice($homeoffice): self { + $this->markDirty('homeoffice', $this->homeoffice, $homeoffice); $this->homeoffice = $homeoffice; return $this; @@ -88,9 +93,9 @@ class VertragsbestandteilZeitaufzeichnung extends Vertragsbestandteil 'homeoffice' => $this->getHomeoffice() ); - $tmp = array_filter($tmp, function($v) { - return !is_null($v); - }); + $tmp = array_filter($tmp, function($k) { + return in_array($k, $this->modifiedcolumns); + }, ARRAY_FILTER_USE_KEY); return (object) $tmp; } diff --git a/application/models/vertragsbestandteil/Gehaltsbestandteil_model.php b/application/models/vertragsbestandteil/Gehaltsbestandteil_model.php index f640e25d0..4623e6157 100644 --- a/application/models/vertragsbestandteil/Gehaltsbestandteil_model.php +++ b/application/models/vertragsbestandteil/Gehaltsbestandteil_model.php @@ -121,7 +121,7 @@ EOSQL; { foreach( $rows as $row ) { $tmpgb = new Gehaltsbestandteil(); - $tmpgb->hydrateByStdClass($row); + $tmpgb->hydrateByStdClass($row, true); $gehaltsbestandteile[] = $tmpgb; } } @@ -139,7 +139,7 @@ EOSQL; if( null !== ($row = getData($query)) ) { $gehaltsbestandteil = new Gehaltsbestandteil(); - $gehaltsbestandteil->hydrateByStdClass($row[0]); + $gehaltsbestandteil->hydrateByStdClass($row[0], true); } return $gehaltsbestandteil; diff --git a/application/models/vertragsbestandteil/Vertragsbestandteil_model.php b/application/models/vertragsbestandteil/Vertragsbestandteil_model.php index a5df8ed0d..233df350c 100644 --- a/application/models/vertragsbestandteil/Vertragsbestandteil_model.php +++ b/application/models/vertragsbestandteil/Vertragsbestandteil_model.php @@ -97,7 +97,7 @@ EOSQL; foreach( $data as $row ) { try { - $vertragsbestandteile[] = VertragsbestandteilFactory::getVertragsbestandteil($row); + $vertragsbestandteile[] = VertragsbestandteilFactory::getVertragsbestandteil($row, true); } catch (Exception $ex) { @@ -129,7 +129,7 @@ EOSQL; $data = getData($query)[0]; try { - $vertragsbestandteil = VertragsbestandteilFactory::getVertragsbestandteil($data); // TODO add decryption + $vertragsbestandteil = VertragsbestandteilFactory::getVertragsbestandteil($data, true); // TODO add decryption } catch (Exception $ex) { diff --git a/application/views/templates/FHC-Footer.php b/application/views/templates/FHC-Footer.php index 31ee96950..225c70517 100644 --- a/application/views/templates/FHC-Footer.php +++ b/application/views/templates/FHC-Footer.php @@ -123,6 +123,7 @@ generateJSsInclude('vendor/npm-asset/primevue/calendar/calendar.min.js'); generateJSsInclude('vendor/npm-asset/primevue/skeleton/skeleton.min.js'); generateJSsInclude('vendor/npm-asset/primevue/timeline/timeline.min.js'); + generateJSsInclude('vendor/npm-asset/primevue/autocomplete/autocomplete.min.js'); } // -------------------------------------------------------------------------------------------------------- diff --git a/composer.json b/composer.json index 229b83a98..d9da3b2d8 100644 --- a/composer.json +++ b/composer.json @@ -352,9 +352,9 @@ "type": "package", "package": { "name": "vuejs/vuedatepicker_js", - "version": "4.2.3", + "version": "5.4.0", "dist": { - "url": "https://unpkg.com/@vuepic/vue-datepicker@4.2.3/dist/vue-datepicker.iife.js", + "url": "https://unpkg.com/@vuepic/vue-datepicker@5.4.0/dist/vue-datepicker.iife.js", "type": "file" } } @@ -363,9 +363,9 @@ "type": "package", "package": { "name": "vuejs/vuedatepicker_css", - "version": "4.2.3", + "version": "5.4.0", "dist": { - "url": "https://unpkg.com/@vuepic/vue-datepicker@4.2.3/dist/main.css", + "url": "https://unpkg.com/@vuepic/vue-datepicker@5.4.0/dist/main.css", "type": "file" } } @@ -422,7 +422,7 @@ "nategood/httpful": "0.2.*", "netcarver/textile": "3.7.*", "nicolaskruchten/pivottable": "2.23.0", - "npm-asset/primevue": "3.15.*", + "npm-asset/primevue": "3.29.1", "npm-asset/primeicons": "5.0.0", "olifolkerd/tabulator4": "4.9.*", @@ -443,8 +443,8 @@ "vuejs/vuejs3": "3.2.33", "vuejs/vuerouter4": "4.1.3", - "vuejs/vuedatepicker_js": "4.2.3", - "vuejs/vuedatepicker_css": "4.2.3" + "vuejs/vuedatepicker_js": "5.4.0", + "vuejs/vuedatepicker_css": "5.4.0" }, "config": { "bin-dir": "vendor/bin" diff --git a/composer.lock b/composer.lock index e5a839b3b..645cd0cae 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "12acec21673c71641f7f1a6586ec666f", + "content-hash": "ca679afc87606768c8ae706f9a8ac6b6", "packages": [ { "name": "afarkas/html5shiv", @@ -1490,10 +1490,10 @@ }, { "name": "npm-asset/primevue", - "version": "3.15.0", + "version": "3.29.1", "dist": { "type": "tar", - "url": "https://registry.npmjs.org/primevue/-/primevue-3.15.0.tgz" + "url": "https://registry.npmjs.org/primevue/-/primevue-3.29.1.tgz" }, "type": "npm-asset", "license": [ @@ -1850,19 +1850,19 @@ }, { "name": "vuejs/vuedatepicker_css", - "version": "4.2.3", + "version": "5.4.0", "dist": { "type": "file", - "url": "https://unpkg.com/@vuepic/vue-datepicker@4.2.3/dist/main.css" + "url": "https://unpkg.com/@vuepic/vue-datepicker@5.4.0/dist/main.css" }, "type": "library" }, { "name": "vuejs/vuedatepicker_js", - "version": "4.2.3", + "version": "5.4.0", "dist": { "type": "file", - "url": "https://unpkg.com/@vuepic/vue-datepicker@4.2.3/dist/vue-datepicker.iife.js" + "url": "https://unpkg.com/@vuepic/vue-datepicker@5.4.0/dist/vue-datepicker.iife.js" }, "type": "library" }, @@ -4738,5 +4738,5 @@ "php": ">=5.6.40" }, "platform-dev": [], - "plugin-api-version": "2.2.0" + "plugin-api-version": "2.1.0" } From 18e82225cebbd3b7226fb577fb946d99e4727639 Mon Sep 17 00:00:00 2001 From: Harald Bamberger Date: Wed, 26 Jul 2023 17:28:37 +0200 Subject: [PATCH 141/246] handle vertragsbestandteil_kurzbz different for insert and update --- .../vertragsbestandteil/AbstractBestandteil.php | 11 ++++++++++- .../vertragsbestandteil/Vertragsbestandteil.php | 4 ++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/application/libraries/vertragsbestandteil/AbstractBestandteil.php b/application/libraries/vertragsbestandteil/AbstractBestandteil.php index 72119968b..bdaf46bd4 100644 --- a/application/libraries/vertragsbestandteil/AbstractBestandteil.php +++ b/application/libraries/vertragsbestandteil/AbstractBestandteil.php @@ -22,7 +22,16 @@ abstract class AbstractBestandteil } protected function markDirty($columnname, $old_value, $new_value) { - if( !$this->fromdb && ($old_value != $new_value) ) { + if( $this->fromdb ) { + // data comes from db dont check for changes + if( isset($this->modifiedcolumns[$columnname]) ) { + unset($this->modifiedcolumns[$columnname]); + } + return; + } + + if($old_value != $new_value) { + $this->modifiedcolumns[$columnname] = $columnname; } } diff --git a/application/libraries/vertragsbestandteil/Vertragsbestandteil.php b/application/libraries/vertragsbestandteil/Vertragsbestandteil.php index cb3b066f8..beda78773 100644 --- a/application/libraries/vertragsbestandteil/Vertragsbestandteil.php +++ b/application/libraries/vertragsbestandteil/Vertragsbestandteil.php @@ -40,6 +40,7 @@ abstract class Vertragsbestandteil extends AbstractBestandteil implements \JsonS isset($data->dienstverhaeltnis_id) && $this->setDienstverhaeltnis_id($data->dienstverhaeltnis_id); isset($data->von) && $this->setVon($data->von); isset($data->bis) && $this->setBis($data->bis); + isset($data->vertragsbestandteiltyp_kurzbz) && $this->setVertragsbestandteiltyp_kurzbz($data->vertragsbestandteiltyp_kurzbz); isset($data->insertamum) && $this->setInsertamum($data->insertamum); isset($data->insertvon) && $this->setInsertvon($data->insertvon); isset($data->updateamum) && $this->setUpdateamum($data->updateamum); @@ -149,8 +150,7 @@ abstract class Vertragsbestandteil extends AbstractBestandteil implements \JsonS public function setVertragsbestandteiltyp_kurzbz($vertragsbestandteiltyp_kurzbz) { - // type should never change and is set in constructor so do not mark dirty - //$this->markDirty('vertragsbestandteiltyp_kurzbz', $this->vertragsbestandteiltyp_kurzbz, $vertragsbestandteiltyp_kurzbz); + $this->markDirty('vertragsbestandteiltyp_kurzbz', $this->vertragsbestandteiltyp_kurzbz, $vertragsbestandteiltyp_kurzbz); $this->vertragsbestandteiltyp_kurzbz = $vertragsbestandteiltyp_kurzbz; return $this; } From bbe1fe2d4914c2f66cf71fa47213e2a36cb1d8f5 Mon Sep 17 00:00:00 2001 From: Harald Bamberger Date: Wed, 26 Jul 2023 17:41:23 +0200 Subject: [PATCH 142/246] refactor markDirty check --- .../libraries/vertragsbestandteil/AbstractBestandteil.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/application/libraries/vertragsbestandteil/AbstractBestandteil.php b/application/libraries/vertragsbestandteil/AbstractBestandteil.php index bdaf46bd4..62c6a2c31 100644 --- a/application/libraries/vertragsbestandteil/AbstractBestandteil.php +++ b/application/libraries/vertragsbestandteil/AbstractBestandteil.php @@ -30,8 +30,9 @@ abstract class AbstractBestandteil return; } - if($old_value != $new_value) { - + if( is_bool($new_value) && ($old_value !== $new_value) ) { + $this->modifiedcolumns[$columnname] = $columnname; + } else if($old_value != $new_value) { $this->modifiedcolumns[$columnname] = $columnname; } } From 3eaefc88bd9bee8e8483691448b5c41914e2f6d3 Mon Sep 17 00:00:00 2001 From: Harald Bamberger Date: Wed, 26 Jul 2023 18:40:37 +0200 Subject: [PATCH 143/246] set hasSequence correct --- .../models/vertragsbestandteil/Dienstverhaeltnis_model.php | 1 + .../models/vertragsbestandteil/Gehaltsbestandteil_model.php | 1 + .../vertragsbestandteil/VertragsbestandteilFreitext_model.php | 1 + .../vertragsbestandteil/VertragsbestandteilFunktion_model.php | 1 + .../vertragsbestandteil/VertragsbestandteilKarenz_model.php | 1 + .../VertragsbestandteilKuendigungsfrist_model.php | 1 + .../vertragsbestandteil/VertragsbestandteilStunden_model.php | 1 + .../VertragsbestandteilUrlaubsanspruch_model.php | 1 + .../VertragsbestandteilZeitaufzeichnung_model.php | 1 + .../models/vertragsbestandteil/Vertragsbestandteil_model.php | 1 + 10 files changed, 10 insertions(+) diff --git a/application/models/vertragsbestandteil/Dienstverhaeltnis_model.php b/application/models/vertragsbestandteil/Dienstverhaeltnis_model.php index 5cbc1e40d..9890a2be5 100644 --- a/application/models/vertragsbestandteil/Dienstverhaeltnis_model.php +++ b/application/models/vertragsbestandteil/Dienstverhaeltnis_model.php @@ -8,6 +8,7 @@ class Dienstverhaeltnis_model extends DB_Model parent::__construct(); $this->dbTable = 'hr.tbl_dienstverhaeltnis'; $this->pk = 'dienstverhaeltnis_id'; + $this->hasSequence = true; } /** diff --git a/application/models/vertragsbestandteil/Gehaltsbestandteil_model.php b/application/models/vertragsbestandteil/Gehaltsbestandteil_model.php index 4623e6157..49c619644 100644 --- a/application/models/vertragsbestandteil/Gehaltsbestandteil_model.php +++ b/application/models/vertragsbestandteil/Gehaltsbestandteil_model.php @@ -11,6 +11,7 @@ class Gehaltsbestandteil_model extends DB_Model implements IEncryption parent::__construct(); $this->dbTable = 'hr.tbl_gehaltsbestandteil'; $this->pk = 'gehaltsbestandteil_id'; + $this->hasSequence = true; } public function getEncryptedColumns(): array diff --git a/application/models/vertragsbestandteil/VertragsbestandteilFreitext_model.php b/application/models/vertragsbestandteil/VertragsbestandteilFreitext_model.php index 7da091f11..f616aa0d3 100644 --- a/application/models/vertragsbestandteil/VertragsbestandteilFreitext_model.php +++ b/application/models/vertragsbestandteil/VertragsbestandteilFreitext_model.php @@ -8,5 +8,6 @@ class VertragsbestandteilFreitext_model extends DB_Model parent::__construct(); $this->dbTable = 'hr.tbl_vertragsbestandteil_freitext'; $this->pk = 'vertragsbestandteil_id'; + $this->hasSequence = false; } } diff --git a/application/models/vertragsbestandteil/VertragsbestandteilFunktion_model.php b/application/models/vertragsbestandteil/VertragsbestandteilFunktion_model.php index 23bffed7b..1171c6a21 100644 --- a/application/models/vertragsbestandteil/VertragsbestandteilFunktion_model.php +++ b/application/models/vertragsbestandteil/VertragsbestandteilFunktion_model.php @@ -14,5 +14,6 @@ class VertragsbestandteilFunktion_model extends DB_Model parent::__construct(); $this->dbTable = 'hr.tbl_vertragsbestandteil_funktion'; $this->pk = 'vertragsbestandteil_id'; + $this->hasSequence = false; } } diff --git a/application/models/vertragsbestandteil/VertragsbestandteilKarenz_model.php b/application/models/vertragsbestandteil/VertragsbestandteilKarenz_model.php index 525291439..f5576d370 100644 --- a/application/models/vertragsbestandteil/VertragsbestandteilKarenz_model.php +++ b/application/models/vertragsbestandteil/VertragsbestandteilKarenz_model.php @@ -10,5 +10,6 @@ class VertragsbestandteilKarenz_model extends DB_Model parent::__construct(); $this->dbTable = 'hr.tbl_vertragsbestandteil_karenz'; $this->pk = 'vertragsbestandteil_id'; + $this->hasSequence = false; } } diff --git a/application/models/vertragsbestandteil/VertragsbestandteilKuendigungsfrist_model.php b/application/models/vertragsbestandteil/VertragsbestandteilKuendigungsfrist_model.php index ccb02dd88..40a88e084 100644 --- a/application/models/vertragsbestandteil/VertragsbestandteilKuendigungsfrist_model.php +++ b/application/models/vertragsbestandteil/VertragsbestandteilKuendigungsfrist_model.php @@ -10,5 +10,6 @@ class VertragsbestandteilKuendigungsfrist_model extends DB_Model parent::__construct(); $this->dbTable = 'hr.tbl_vertragsbestandteil_kuendigungsfrist'; $this->pk = 'vertragsbestandteil_id'; + $this->hasSequence = false; } } diff --git a/application/models/vertragsbestandteil/VertragsbestandteilStunden_model.php b/application/models/vertragsbestandteil/VertragsbestandteilStunden_model.php index 569c9a601..73071fddd 100644 --- a/application/models/vertragsbestandteil/VertragsbestandteilStunden_model.php +++ b/application/models/vertragsbestandteil/VertragsbestandteilStunden_model.php @@ -14,5 +14,6 @@ class VertragsbestandteilStunden_model extends DB_Model parent::__construct(); $this->dbTable = 'hr.tbl_vertragsbestandteil_stunden'; $this->pk = 'vertragsbestandteil_id'; + $this->hasSequence = false; } } diff --git a/application/models/vertragsbestandteil/VertragsbestandteilUrlaubsanspruch_model.php b/application/models/vertragsbestandteil/VertragsbestandteilUrlaubsanspruch_model.php index 561ed2932..c436364c0 100644 --- a/application/models/vertragsbestandteil/VertragsbestandteilUrlaubsanspruch_model.php +++ b/application/models/vertragsbestandteil/VertragsbestandteilUrlaubsanspruch_model.php @@ -7,5 +7,6 @@ class VertragsbestandteilUrlaubsanspruch_model extends DB_Model parent::__construct(); $this->dbTable = 'hr.tbl_vertragsbestandteil_urlaubsanspruch'; $this->pk = 'vertragsbestandteil_id'; + $this->hasSequence = false; } } diff --git a/application/models/vertragsbestandteil/VertragsbestandteilZeitaufzeichnung_model.php b/application/models/vertragsbestandteil/VertragsbestandteilZeitaufzeichnung_model.php index 8e2d45e1a..d5851a096 100644 --- a/application/models/vertragsbestandteil/VertragsbestandteilZeitaufzeichnung_model.php +++ b/application/models/vertragsbestandteil/VertragsbestandteilZeitaufzeichnung_model.php @@ -8,5 +8,6 @@ class VertragsbestandteilZeitaufzeichnung_model extends DB_Model parent::__construct(); $this->dbTable = 'hr.tbl_vertragsbestandteil_zeitaufzeichnung'; $this->pk = 'vertragsbestandteil_id'; + $this->hasSequence = false; } } diff --git a/application/models/vertragsbestandteil/Vertragsbestandteil_model.php b/application/models/vertragsbestandteil/Vertragsbestandteil_model.php index 233df350c..b84648a3c 100644 --- a/application/models/vertragsbestandteil/Vertragsbestandteil_model.php +++ b/application/models/vertragsbestandteil/Vertragsbestandteil_model.php @@ -15,6 +15,7 @@ class Vertragsbestandteil_model extends DB_Model parent::__construct(); $this->dbTable = 'hr.tbl_vertragsbestandteil'; $this->pk = 'vertragsbestandteil_id'; + $this->hasSequence = true; } protected function getVertragsbestandteilSQL() From 270c9e174115c6f14da6e11fa64acdb79f41ccef Mon Sep 17 00:00:00 2001 From: Harald Bamberger Date: Wed, 26 Jul 2023 19:23:31 +0200 Subject: [PATCH 144/246] remove hasSequence again to avoid error, check vbs basedata and specialdata if not empty before update --- .../VertragsbestandteilLib.php | 36 ++++++++++++------- .../Dienstverhaeltnis_model.php | 1 - .../Gehaltsbestandteil_model.php | 1 - .../VertragsbestandteilFreitext_model.php | 1 - .../VertragsbestandteilFunktion_model.php | 1 - .../VertragsbestandteilKarenz_model.php | 1 - ...tragsbestandteilKuendigungsfrist_model.php | 1 - .../VertragsbestandteilStunden_model.php | 1 - ...rtragsbestandteilUrlaubsanspruch_model.php | 1 - ...tragsbestandteilZeitaufzeichnung_model.php | 1 - .../Vertragsbestandteil_model.php | 1 - 11 files changed, 23 insertions(+), 23 deletions(-) diff --git a/application/libraries/vertragsbestandteil/VertragsbestandteilLib.php b/application/libraries/vertragsbestandteil/VertragsbestandteilLib.php index 6fbbebac7..11109ab79 100644 --- a/application/libraries/vertragsbestandteil/VertragsbestandteilLib.php +++ b/application/libraries/vertragsbestandteil/VertragsbestandteilLib.php @@ -324,23 +324,33 @@ class VertragsbestandteilLib $vertragsbestandteil->setUpdatevon($this->loggedInUser) ->setUpdateamum(strftime('%Y-%m-%d %H:%M:%S')); $vertragsbestandteil->beforePersist(); - $ret = $this->VertragsbestandteilModel->update($vertragsbestandteil->getVertragsbestandteil_id(), - $vertragsbestandteil->baseToStdClass()); - - if(isError($ret) ) + $basedata = $vertragsbestandteil->baseToStdClass(); + if( count((array) $basedata) > 0 ) { - throw new Exception('error updating vertragsbestandteil'); + $ret = $this->VertragsbestandteilModel->update( + $vertragsbestandteil->getVertragsbestandteil_id(), + $basedata); + + if(isError($ret) ) + { + throw new Exception('error updating vertragsbestandteil'); + } } - $specialisedModel = VertragsbestandteilFactory::getVertragsbestandteilDBModel( - $vertragsbestandteil->getVertragsbestandteiltyp_kurzbz()); - $retspecial = $specialisedModel->update($vertragsbestandteil->getVertragsbestandteil_id(), - $vertragsbestandteil->toStdClass()); - - if(isError($retspecial) ) + $specialisedData = $vertragsbestandteil->toStdClass(); + if( count((array) $specialisedData) > 0 ) { - throw new Exception('error updating vertragsbestandteil ' - . $vertragsbestandteil->getVertragsbestandteiltyp_kurzbz()); + $specialisedModel = VertragsbestandteilFactory::getVertragsbestandteilDBModel( + $vertragsbestandteil->getVertragsbestandteiltyp_kurzbz()); + $retspecial = $specialisedModel->update( + $vertragsbestandteil->getVertragsbestandteil_id(), + $specialisedData); + + if(isError($retspecial) ) + { + throw new Exception('error updating vertragsbestandteil ' + . $vertragsbestandteil->getVertragsbestandteiltyp_kurzbz()); + } } } diff --git a/application/models/vertragsbestandteil/Dienstverhaeltnis_model.php b/application/models/vertragsbestandteil/Dienstverhaeltnis_model.php index 9890a2be5..5cbc1e40d 100644 --- a/application/models/vertragsbestandteil/Dienstverhaeltnis_model.php +++ b/application/models/vertragsbestandteil/Dienstverhaeltnis_model.php @@ -8,7 +8,6 @@ class Dienstverhaeltnis_model extends DB_Model parent::__construct(); $this->dbTable = 'hr.tbl_dienstverhaeltnis'; $this->pk = 'dienstverhaeltnis_id'; - $this->hasSequence = true; } /** diff --git a/application/models/vertragsbestandteil/Gehaltsbestandteil_model.php b/application/models/vertragsbestandteil/Gehaltsbestandteil_model.php index 49c619644..4623e6157 100644 --- a/application/models/vertragsbestandteil/Gehaltsbestandteil_model.php +++ b/application/models/vertragsbestandteil/Gehaltsbestandteil_model.php @@ -11,7 +11,6 @@ class Gehaltsbestandteil_model extends DB_Model implements IEncryption parent::__construct(); $this->dbTable = 'hr.tbl_gehaltsbestandteil'; $this->pk = 'gehaltsbestandteil_id'; - $this->hasSequence = true; } public function getEncryptedColumns(): array diff --git a/application/models/vertragsbestandteil/VertragsbestandteilFreitext_model.php b/application/models/vertragsbestandteil/VertragsbestandteilFreitext_model.php index f616aa0d3..7da091f11 100644 --- a/application/models/vertragsbestandteil/VertragsbestandteilFreitext_model.php +++ b/application/models/vertragsbestandteil/VertragsbestandteilFreitext_model.php @@ -8,6 +8,5 @@ class VertragsbestandteilFreitext_model extends DB_Model parent::__construct(); $this->dbTable = 'hr.tbl_vertragsbestandteil_freitext'; $this->pk = 'vertragsbestandteil_id'; - $this->hasSequence = false; } } diff --git a/application/models/vertragsbestandteil/VertragsbestandteilFunktion_model.php b/application/models/vertragsbestandteil/VertragsbestandteilFunktion_model.php index 1171c6a21..23bffed7b 100644 --- a/application/models/vertragsbestandteil/VertragsbestandteilFunktion_model.php +++ b/application/models/vertragsbestandteil/VertragsbestandteilFunktion_model.php @@ -14,6 +14,5 @@ class VertragsbestandteilFunktion_model extends DB_Model parent::__construct(); $this->dbTable = 'hr.tbl_vertragsbestandteil_funktion'; $this->pk = 'vertragsbestandteil_id'; - $this->hasSequence = false; } } diff --git a/application/models/vertragsbestandteil/VertragsbestandteilKarenz_model.php b/application/models/vertragsbestandteil/VertragsbestandteilKarenz_model.php index f5576d370..525291439 100644 --- a/application/models/vertragsbestandteil/VertragsbestandteilKarenz_model.php +++ b/application/models/vertragsbestandteil/VertragsbestandteilKarenz_model.php @@ -10,6 +10,5 @@ class VertragsbestandteilKarenz_model extends DB_Model parent::__construct(); $this->dbTable = 'hr.tbl_vertragsbestandteil_karenz'; $this->pk = 'vertragsbestandteil_id'; - $this->hasSequence = false; } } diff --git a/application/models/vertragsbestandteil/VertragsbestandteilKuendigungsfrist_model.php b/application/models/vertragsbestandteil/VertragsbestandteilKuendigungsfrist_model.php index 40a88e084..ccb02dd88 100644 --- a/application/models/vertragsbestandteil/VertragsbestandteilKuendigungsfrist_model.php +++ b/application/models/vertragsbestandteil/VertragsbestandteilKuendigungsfrist_model.php @@ -10,6 +10,5 @@ class VertragsbestandteilKuendigungsfrist_model extends DB_Model parent::__construct(); $this->dbTable = 'hr.tbl_vertragsbestandteil_kuendigungsfrist'; $this->pk = 'vertragsbestandteil_id'; - $this->hasSequence = false; } } diff --git a/application/models/vertragsbestandteil/VertragsbestandteilStunden_model.php b/application/models/vertragsbestandteil/VertragsbestandteilStunden_model.php index 73071fddd..569c9a601 100644 --- a/application/models/vertragsbestandteil/VertragsbestandteilStunden_model.php +++ b/application/models/vertragsbestandteil/VertragsbestandteilStunden_model.php @@ -14,6 +14,5 @@ class VertragsbestandteilStunden_model extends DB_Model parent::__construct(); $this->dbTable = 'hr.tbl_vertragsbestandteil_stunden'; $this->pk = 'vertragsbestandteil_id'; - $this->hasSequence = false; } } diff --git a/application/models/vertragsbestandteil/VertragsbestandteilUrlaubsanspruch_model.php b/application/models/vertragsbestandteil/VertragsbestandteilUrlaubsanspruch_model.php index c436364c0..561ed2932 100644 --- a/application/models/vertragsbestandteil/VertragsbestandteilUrlaubsanspruch_model.php +++ b/application/models/vertragsbestandteil/VertragsbestandteilUrlaubsanspruch_model.php @@ -7,6 +7,5 @@ class VertragsbestandteilUrlaubsanspruch_model extends DB_Model parent::__construct(); $this->dbTable = 'hr.tbl_vertragsbestandteil_urlaubsanspruch'; $this->pk = 'vertragsbestandteil_id'; - $this->hasSequence = false; } } diff --git a/application/models/vertragsbestandteil/VertragsbestandteilZeitaufzeichnung_model.php b/application/models/vertragsbestandteil/VertragsbestandteilZeitaufzeichnung_model.php index d5851a096..8e2d45e1a 100644 --- a/application/models/vertragsbestandteil/VertragsbestandteilZeitaufzeichnung_model.php +++ b/application/models/vertragsbestandteil/VertragsbestandteilZeitaufzeichnung_model.php @@ -8,6 +8,5 @@ class VertragsbestandteilZeitaufzeichnung_model extends DB_Model parent::__construct(); $this->dbTable = 'hr.tbl_vertragsbestandteil_zeitaufzeichnung'; $this->pk = 'vertragsbestandteil_id'; - $this->hasSequence = false; } } diff --git a/application/models/vertragsbestandteil/Vertragsbestandteil_model.php b/application/models/vertragsbestandteil/Vertragsbestandteil_model.php index b84648a3c..233df350c 100644 --- a/application/models/vertragsbestandteil/Vertragsbestandteil_model.php +++ b/application/models/vertragsbestandteil/Vertragsbestandteil_model.php @@ -15,7 +15,6 @@ class Vertragsbestandteil_model extends DB_Model parent::__construct(); $this->dbTable = 'hr.tbl_vertragsbestandteil'; $this->pk = 'vertragsbestandteil_id'; - $this->hasSequence = true; } protected function getVertragsbestandteilSQL() From 1e082ed22524780673b41dee60bc02c1673c6052 Mon Sep 17 00:00:00 2001 From: KarpAlex Date: Thu, 27 Jul 2023 17:13:31 +0200 Subject: [PATCH 145/246] UHSTAT1 form: removed geburtsnation as it is saved in person table anyways, started to display existing uhstat data on form load --- application/controllers/codex/UHSTAT1.php | 73 ++++++++++++++------ application/models/codex/Abschluss_model.php | 8 ++- application/views/codex/uhstat1.php | 58 +++++----------- system/phrasesupdate.php | 40 ----------- 4 files changed, 73 insertions(+), 106 deletions(-) diff --git a/application/controllers/codex/UHSTAT1.php b/application/controllers/codex/UHSTAT1.php index 7deeb9eea..d0663c570 100644 --- a/application/controllers/codex/UHSTAT1.php +++ b/application/controllers/codex/UHSTAT1.php @@ -8,6 +8,17 @@ class UHSTAT1 extends FHC_Controller const LOWER_BOUNDARY_YEARS = 160; const UPPER_BOUNDARY_YEARS = 20; + private $_uhstat1Fields = array( + 'mutter_geburtsstaat' => array('name' => 'Geburtsstaat Mutter', 'rules' => array('required')), + 'mutter_geburtsjahr' => array('name' => 'Geburtsjahr Mutter', 'rules' => array('required')), + 'mutter_bildungsstaat' => array('name' => 'Bildungsstaat Mutter', 'rules' => array('required')), + 'mutter_bildungmax' => array('name' => 'Geburtsjahr Mutter', 'rules' => array('required')), + 'vater_geburtsstaat' => array('name' => 'Geburtsstaat Vater', 'rules' => array('required')), + 'vater_geburtsjahr', + 'vater_bildungsstaat', + 'vater_bildungmax' + ); + public function __construct() { parent::__construct( @@ -40,13 +51,17 @@ class UHSTAT1 extends FHC_Controller public function index() { - $formData = $this->_getFormData(); + $formMetaData = $this->_getFormMetaData(); - if (isError($formData)) show_error(getError($formData)); + if (isError($formMetaData)) show_error(getError($formMetaData)); - if (!hasData($formData)) show_error("No form data could be loaded"); + if (!hasData($formMetaData)) show_error("No form meta data could be loaded"); - $this->load->view("codex/uhstat1.php", array('formData' => getData($formData))); + $uhstatData = $this->_getUHSTAT1Data(); + + if (isError($uhstatData)) show_error(getError($uhstatData)); + + $this->load->view("codex/uhstat1.php", array('formMetaData' => getData($formMetaData), 'uhstatData' => getData($uhstatData))); } /** @@ -61,7 +76,6 @@ class UHSTAT1 extends FHC_Controller $this->form_validation->set_error_delimiters('', ''); // check required fields - $this->form_validation->set_rules('geburtsstaat', 'Geburtsstaat', 'required', array('required' => $this->p->t('uhstat', 'angabeFehlt'))); $this->form_validation->set_rules( 'mutter_geburtsstaat', 'Geburtsstaat Mutter', @@ -171,11 +185,11 @@ class UHSTAT1 extends FHC_Controller } } - $formData = $this->_getFormData(); + $formMetaData = $this->_getFormMetaData(); - if (isError($formData)) show_error(getError($formData)); + if (isError($formMetaData)) show_error(getError($formMetaData)); - if (!hasData($formData)) show_error("No form data could be loaded"); + if (!hasData($formMetaData)) show_error("No form data could be loaded"); // pass success/error messages to view $successMessage = isset($uhstat1datenRes) && isSuccess($uhstat1datenRes) ? $this->p->t('uhstat', 'erfolgreichGespeichert') : ''; @@ -183,7 +197,7 @@ class UHSTAT1 extends FHC_Controller // load view with form data $this->load->view("codex/uhstat1.php", array( - 'formData' => getData($formData), + 'formMetaData' => getData($formMetaData), 'successMessage' => $successMessage, 'errorMessage' => $errorMessage )); @@ -227,22 +241,23 @@ class UHSTAT1 extends FHC_Controller /** * Gets initial data needed to display UHSTAT1 form. */ - private function _getFormData() + private function _getFormMetaData() { $person_id = $this->input->get('person_id'); if (!isset($person_id) || !is_numeric($person_id)) return error("Person Id missing"); - $formData = array( + $languageIdx = $this->_getLanguageIndex(); + + $formMetaData = array( 'nation' => array(), 'abschluss_oesterreich' => array(), 'abschluss_nicht_oesterreich' => array(), 'jahre' => array(), - 'languageIdx' => $this->_getLanguageIndex(), 'person_id' => $person_id ); - $nationTextFieldName = $formData['languageIdx'] == 1 ? 'langtext' : 'engltext'; + $nationTextFieldName = $languageIdx == 1 ? 'langtext' : 'engltext'; // get nation list $this->load->model('codex/Nation_model', 'NationModel'); @@ -253,10 +268,10 @@ class UHSTAT1 extends FHC_Controller if (isError($nationRes)) return $nationRes; - if (hasData($nationRes)) $formData['nation'] = getData($nationRes); + if (hasData($nationRes)) $formMetaData['nation'] = getData($nationRes); // get abschluss list - $abschlussRes = $this->AbschlussModel->getActiveAbschluesse(); + $abschlussRes = $this->AbschlussModel->getActiveAbschluesse($languageIdx); if (isError($abschlussRes)) return $abschlussRes; @@ -267,22 +282,38 @@ class UHSTAT1 extends FHC_Controller foreach (getData($abschlussRes) as $abschluss) { if ($abschluss->in_oesterreich === true) - $formData['abschluss_oesterreich'][] = $abschluss; + $formMetaData['abschluss_oesterreich'][] = $abschluss; elseif ($abschluss->in_oesterreich === false) - $formData['abschluss_nicht_oesterreich'][] = $abschluss; + $formMetaData['abschluss_nicht_oesterreich'][] = $abschluss; else { - $formData['abschluss_oesterreich'][] = $abschluss; - $formData['abschluss_nicht_oesterreich'][] = $abschluss; + $formMetaData['abschluss_oesterreich'][] = $abschluss; + $formMetaData['abschluss_nicht_oesterreich'][] = $abschluss; } } } // get realistic birth years, dated back from current year $currYear = date("Y"); - $formData['jahre'] = range($currYear - self::UPPER_BOUNDARY_YEARS, $currYear - self::LOWER_BOUNDARY_YEARS); + $formMetaData['jahre'] = range($currYear - self::UPPER_BOUNDARY_YEARS, $currYear - self::LOWER_BOUNDARY_YEARS); - return success($formData); + return success($formMetaData); + } + + /** + * Gets initial data needed to display UHSTAT1 form. + */ + private function _getUHSTAT1Data() + { + $person_id = $this->input->get('person_id'); + + if (!isset($person_id) || !is_numeric($person_id)) return error("Person Id missing"); + + $this->Uhstat1datenModel->addSelect(" + mutter_geburtsstaat, mutter_geburtsjahr, mutter_bildungsstaat, mutter_bildungmax, + vater_geburtsstaat, vater_geburtsjahr, vater_bildungsstaat, vater_bildungmax" + ); + return $this->Uhstat1datenModel->loadWhere(array('person_id' => $person_id)); } /** diff --git a/application/models/codex/Abschluss_model.php b/application/models/codex/Abschluss_model.php index 93b940ed2..2907deff1 100644 --- a/application/models/codex/Abschluss_model.php +++ b/application/models/codex/Abschluss_model.php @@ -12,17 +12,19 @@ class Abschluss_model extends DB_Model $this->pk = 'ausbildung_code'; } - public function getActiveAbschluesse() + public function getActiveAbschluesse($languageIndex) { return $this->execQuery( ' SELECT - ausbildung_code, bezeichnung, in_oesterreich + ausbildung_code, bezeichnung[?], in_oesterreich FROM bis.tbl_abschluss WHERE aktiv - ORDER BY CASE WHEN in_oesterreich THEN 0 ELSE 1 END, ausbildung_code' + ORDER BY + CASE WHEN in_oesterreich THEN 0 ELSE 1 END, ausbildung_code', + array($languageIndex) ); } } diff --git a/application/views/codex/uhstat1.php b/application/views/codex/uhstat1.php index 918364cf6..c670373d0 100644 --- a/application/views/codex/uhstat1.php +++ b/application/views/codex/uhstat1.php @@ -23,34 +23,7 @@ $this->load->view( p->t('uhstat', 'uhstat1AnmeldungEinleitungstext') ?>


- -
- p->t('uhstat', 'persoenlicheAngaben') ?> -

- p->t('uhstat', 'persoenlicheAngabenEinleitungstext') ?> -

-
- -
- - -
-
-
-
+
p->t('uhstat', 'angabenErziehungsberechtigte') ?>

@@ -63,7 +36,7 @@ $this->load->view(

- +