From 9b3b571bd9127dc5e18dcc806574107e53f7218b Mon Sep 17 00:00:00 2001 From: ma0068 Date: Thu, 6 Oct 2022 08:55:11 +0200 Subject: [PATCH 001/268] 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/268] 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/268] 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/268] 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/268] 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/268] 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/268] =?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 9c0d70fe890d234aa2b44086fcfec4be0074a714 Mon Sep 17 00:00:00 2001 From: Paolo Date: Tue, 8 Nov 2022 12:01:05 +0100 Subject: [PATCH 008/268] Removed version 4 of tinymce --- composer.json | 12 -- composer.lock | 424 +++++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 386 insertions(+), 50 deletions(-) diff --git a/composer.json b/composer.json index 825ed5625..46f4edc39 100644 --- a/composer.json +++ b/composer.json @@ -270,17 +270,6 @@ } } }, - { - "type": "package", - "package": { - "name": "tinymce/tinymce4", - "version": "4.9.11", - "dist": { - "url": "https://github.com/tinymce/tinymce-dist/archive/refs/tags/4.9.11.zip", - "type": "zip" - } - } - }, { "type": "package", "package": { @@ -413,7 +402,6 @@ "scottjehl/respond": "1.4.2", "tapmodo/jcrop": "2.0.4", - "tinymce/tinymce4": "4.9.*", "tinymce/tinymce5": "5.10.*", "tomazdragar/simplecropper": "1.0", "twbs/bootstrap3": "3.4.*", diff --git a/composer.lock b/composer.lock index 72f13c76f..ce909eccc 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": "d530cc4d7bd81812535eb64e87ba04f4", + "content-hash": "269157583af475d4c8cd307400c7b248", "packages": [ { "name": "afarkas/html5shiv", @@ -35,6 +35,10 @@ ], "description": "Defacto way to enable use of HTML5 sectioning elements in legacy Internet Explorer.", "homepage": "http://paulirish.com/2011/the-history-of-the-html5-shiv/", + "support": { + "issues": "https://github.com/aFarkas/html5shiv/issues", + "source": "https://github.com/aFarkas/html5shiv/tree/3.7.3" + }, "time": "2015-07-20T20:04:00+00:00" }, { @@ -130,6 +134,16 @@ "keywords": [ "qr code" ], + "support": { + "issues": "https://github.com/chillerlan/php-qrcode/issues", + "source": "https://github.com/chillerlan/php-qrcode/tree/v2.0.x" + }, + "funding": [ + { + "url": "https://ko-fi.com/codemasher", + "type": "ko_fi" + } + ], "time": "2020-04-12T07:38:35+00:00" }, { @@ -178,6 +192,10 @@ "helper", "trait" ], + "support": { + "issues": "https://github.com/chillerlan/php-traits/issues", + "source": "https://github.com/chillerlan/php-traits" + }, "abandoned": true, "time": "2018-06-22T00:30:47+00:00" }, @@ -218,6 +236,10 @@ ], "description": "REST Server for the CodeIgniter framework", "homepage": "https://github.com/chriskacerguis/codeigniter-restserver", + "support": { + "issues": "https://github.com/chriskacerguis/codeigniter-restserver/issues", + "source": "https://github.com/chriskacerguis/codeigniter-restserver" + }, "time": "2017-09-23T16:44:55+00:00" }, { @@ -236,6 +258,10 @@ }, "type": "library", "notification-url": "https://packagist.org/downloads/", + "support": { + "issues": "https://github.com/akiyatkin/tablesorter/issues", + "source": "https://github.com/akiyatkin/tablesorter/tree/master" + }, "time": "2016-09-02T11:31:54+00:00" }, { @@ -269,6 +295,13 @@ ], "description": "The CodeIgniter framework", "homepage": "https://codeigniter.com", + "support": { + "forum": "http://forum.codeigniter.com/", + "issues": "https://github.com/bcit-ci/CodeIgniter/issues", + "slack": "https://codeigniterchat.slack.com", + "source": "https://github.com/bcit-ci/CodeIgniter", + "wiki": "https://github.com/bcit-ci/CodeIgniter/wiki" + }, "time": "2022-03-03T13:21:49+00:00" }, { @@ -573,6 +606,10 @@ ], "description": "Shim repository for Angular.js", "homepage": "http://angularjs.org", + "support": { + "issues": "https://github.com/components/angular.js/issues", + "source": "https://github.com/components/angular.js/tree/master" + }, "time": "2015-06-07T20:10:38+00:00" }, { @@ -615,6 +652,13 @@ ], "description": "jQuery JavaScript Library", "homepage": "http://jquery.com", + "support": { + "forum": "http://forum.jquery.com", + "irc": "irc://irc.freenode.org/jquery", + "issues": "https://github.com/jquery/jquery/issues", + "source": "https://github.com/jquery/jquery", + "wiki": "http://docs.jquery.com/" + }, "time": "2021-03-20T19:13:42+00:00" }, { @@ -700,6 +744,10 @@ } ], "description": "jQuery UI is a curated set of user interface interactions, effects, widgets, and themes built on top of the jQuery JavaScript Library. Whether you're building highly interactive web applications or you just need to add a date picker to a form control, jQuery UI is the perfect choice.", + "support": { + "issues": "https://github.com/components/jqueryui/issues", + "source": "https://github.com/components/jqueryui/tree/master" + }, "time": "2016-09-16T05:47:55+00:00" }, { @@ -749,6 +797,10 @@ "captcha", "security" ], + "support": { + "issues": "https://github.com/dapphp/securimage/issues", + "source": "https://github.com/dapphp/securimage/tree/master" + }, "abandoned": true, "time": "2018-03-09T06:07:41+00:00" }, @@ -812,6 +864,12 @@ "rdfa", "sparql" ], + "support": { + "forum": "http://groups.google.com/group/easyrdf/", + "irc": "irc://chat.freenode.net/easyrdf", + "issues": "http://github.com/njh/easyrdf/issues", + "source": "https://github.com/easyrdf/easyrdf/tree/0.9.1" + }, "time": "2015-02-27T09:45:49+00:00" }, { @@ -890,6 +948,10 @@ "faker", "fixtures" ], + "support": { + "issues": "https://github.com/fzaninotto/Faker/issues", + "source": "https://github.com/fzaninotto/Faker/tree/v1.9.2" + }, "abandoned": true, "time": "2020-12-11T09:56:16+00:00" }, @@ -1012,6 +1074,10 @@ "json", "schema" ], + "support": { + "issues": "https://github.com/justinrainbow/json-schema/issues", + "source": "https://github.com/justinrainbow/json-schema/tree/master" + }, "time": "2014-08-25T02:48:14+00:00" }, { @@ -1046,6 +1112,10 @@ } ], "description": "A framework-agnostic PHP Implementation for generating simple forms based on json-schema", + "support": { + "issues": "https://github.com/kingsquare/json-schema-form/issues", + "source": "https://github.com/kingsquare/json-schema-form/tree/master" + }, "time": "2014-07-10T12:27:19+00:00" }, { @@ -1106,6 +1176,10 @@ "keywords": [ "markdown" ], + "support": { + "issues": "https://github.com/michelf/php-markdown/issues", + "source": "https://github.com/michelf/php-markdown/tree/lib" + }, "time": "2015-03-01T12:03:08+00:00" }, { @@ -1153,20 +1227,24 @@ "uri", "url" ], + "support": { + "issues": "https://github.com/lanthaler/IRI/issues", + "source": "https://github.com/lanthaler/IRI/tree/master" + }, "time": "2014-01-21T13:43:39+00:00" }, { "name": "ml/json-ld", - "version": "1.2.0", + "version": "1.2.1", "source": { "type": "git", "url": "https://github.com/lanthaler/JsonLD.git", - "reference": "c74a1aed5979ed1cfb1be35a55a305fd30e30b93" + "reference": "537e68e87a6bce23e57c575cd5dcac1f67ce25d8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/lanthaler/JsonLD/zipball/c74a1aed5979ed1cfb1be35a55a305fd30e30b93", - "reference": "c74a1aed5979ed1cfb1be35a55a305fd30e30b93", + "url": "https://api.github.com/repos/lanthaler/JsonLD/zipball/537e68e87a6bce23e57c575cd5dcac1f67ce25d8", + "reference": "537e68e87a6bce23e57c575cd5dcac1f67ce25d8", "shasum": "" }, "require": { @@ -1202,7 +1280,11 @@ "JSON-LD", "jsonld" ], - "time": "2020-06-16T17:45:06+00:00" + "support": { + "issues": "https://github.com/lanthaler/JsonLD/issues", + "source": "https://github.com/lanthaler/JsonLD/tree/1.2.1" + }, + "time": "2022-09-29T08:45:17+00:00" }, { "name": "moment/momentjs", @@ -1262,6 +1344,14 @@ "sorting", "table" ], + "support": { + "docs": "https://mottie.github.io/tablesorter/docs/index.html", + "email": "wowmotty@gmail.com", + "irc": "irc://irc.freenode.org/tablesorter", + "issues": "https://github.com/Mottie/tablesorter/issues", + "source": "https://github.com/Mottie/tablesorter", + "wiki": "https://github.com/Mottie/tablesorter/wiki" + }, "time": "2020-03-03T13:46:03+00:00" }, { @@ -1312,6 +1402,10 @@ "rest", "restful" ], + "support": { + "issues": "https://github.com/nategood/httpful/issues", + "source": "https://github.com/nategood/httpful/tree/v0.2.20" + }, "time": "2015-10-26T16:11:30+00:00" }, { @@ -1365,6 +1459,12 @@ "plaintext", "textile" ], + "support": { + "irc": "irc://irc.freenode.net/textile", + "issues": "https://github.com/textile/php-textile/issues", + "source": "https://github.com/textile/php-textile", + "wiki": "https://github.com/textile/php-textile/wiki" + }, "time": "2022-05-01T17:05:16+00:00" }, { @@ -1420,16 +1520,16 @@ }, { "name": "phpseclib/phpseclib", - "version": "2.0.37", + "version": "2.0.39", "source": { "type": "git", "url": "https://github.com/phpseclib/phpseclib.git", - "reference": "c812fbb4d6b4d7f30235ab7298a12f09ba13b37c" + "reference": "f3a0e2b715c40cf1fd270d444901b63311725d63" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/c812fbb4d6b4d7f30235ab7298a12f09ba13b37c", - "reference": "c812fbb4d6b4d7f30235ab7298a12f09ba13b37c", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/f3a0e2b715c40cf1fd270d444901b63311725d63", + "reference": "f3a0e2b715c40cf1fd270d444901b63311725d63", "shasum": "" }, "require": { @@ -1444,7 +1544,8 @@ "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.", "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.", "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.", - "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations." + "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations.", + "ext-xml": "Install the XML extension to load XML formatted public keys." }, "type": "library", "autoload": { @@ -1507,7 +1608,25 @@ "x.509", "x509" ], - "time": "2022-04-04T04:57:45+00:00" + "support": { + "issues": "https://github.com/phpseclib/phpseclib/issues", + "source": "https://github.com/phpseclib/phpseclib/tree/2.0.39" + }, + "funding": [ + { + "url": "https://github.com/terrafrost", + "type": "github" + }, + { + "url": "https://www.patreon.com/phpseclib", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpseclib/phpseclib", + "type": "tidelift" + } + ], + "time": "2022-10-24T10:49:03+00:00" }, { "name": "rmariuzzo/jquery-checkboxes", @@ -1587,6 +1706,23 @@ "polyfill", "portable" ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.19.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2020-10-23T09:01:57+00:00" }, { @@ -1598,15 +1734,6 @@ }, "type": "library" }, - { - "name": "tinymce/tinymce4", - "version": "4.9.11", - "dist": { - "type": "zip", - "url": "https://github.com/tinymce/tinymce-dist/archive/refs/tags/4.9.11.zip" - }, - "type": "library" - }, { "name": "tinymce/tinymce5", "version": "5.10.3", @@ -1706,6 +1833,10 @@ "keywords": [ "templating" ], + "support": { + "issues": "https://github.com/twigphp/Twig/issues", + "source": "https://github.com/twigphp/Twig/tree/1.x" + }, "time": "2020-02-11T05:59:23+00:00" }, { @@ -1779,6 +1910,24 @@ "regex", "regular expression" ], + "support": { + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/1.0.1" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], "time": "2022-01-21T20:24:37+00:00" }, { @@ -1826,20 +1975,39 @@ "Xdebug", "performance" ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/xdebug-handler/issues", + "source": "https://github.com/composer/xdebug-handler/tree/2.0.5" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], "time": "2022-02-24T20:20:32+00:00" }, { "name": "nikic/php-parser", - "version": "v4.14.0", + "version": "v4.15.1", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1" + "reference": "0ef6c55a3f47f89d7a374e6f835197a0b5fcf900" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/34bea19b6e03d8153165d8f30bba4c3be86184c1", - "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/0ef6c55a3f47f89d7a374e6f835197a0b5fcf900", + "reference": "0ef6c55a3f47f89d7a374e6f835197a0b5fcf900", "shasum": "" }, "require": { @@ -1878,20 +2046,24 @@ "parser", "php" ], - "time": "2022-05-31T20:59:12+00:00" + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.1" + }, + "time": "2022-09-04T07:30:47+00:00" }, { "name": "pdepend/pdepend", - "version": "2.10.3", + "version": "2.12.1", "source": { "type": "git", "url": "https://github.com/pdepend/pdepend.git", - "reference": "da3166a06b4a89915920a42444f707122a1584c9" + "reference": "7a892d56ceafd804b4a2ecc85184640937ce9e84" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pdepend/pdepend/zipball/da3166a06b4a89915920a42444f707122a1584c9", - "reference": "da3166a06b4a89915920a42444f707122a1584c9", + "url": "https://api.github.com/repos/pdepend/pdepend/zipball/7a892d56ceafd804b4a2ecc85184640937ce9e84", + "reference": "7a892d56ceafd804b4a2ecc85184640937ce9e84", "shasum": "" }, "require": { @@ -1925,26 +2097,36 @@ "BSD-3-Clause" ], "description": "Official version of pdepend to be handled with Composer", - "time": "2022-02-23T07:53:09+00:00" + "support": { + "issues": "https://github.com/pdepend/pdepend/issues", + "source": "https://github.com/pdepend/pdepend/tree/2.12.1" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/pdepend/pdepend", + "type": "tidelift" + } + ], + "time": "2022-09-08T19:30:37+00:00" }, { "name": "phpmd/phpmd", - "version": "2.12.0", + "version": "2.13.0", "source": { "type": "git", "url": "https://github.com/phpmd/phpmd.git", - "reference": "c0b678ba71902f539c27c14332aa0ddcf14388ec" + "reference": "dad0228156856b3ad959992f9748514fa943f3e3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpmd/phpmd/zipball/c0b678ba71902f539c27c14332aa0ddcf14388ec", - "reference": "c0b678ba71902f539c27c14332aa0ddcf14388ec", + "url": "https://api.github.com/repos/phpmd/phpmd/zipball/dad0228156856b3ad959992f9748514fa943f3e3", + "reference": "dad0228156856b3ad959992f9748514fa943f3e3", "shasum": "" }, "require": { "composer/xdebug-handler": "^1.0 || ^2.0 || ^3.0", "ext-xml": "*", - "pdepend/pdepend": "^2.10.3", + "pdepend/pdepend": "^2.12.1", "php": ">=5.3.9" }, "require-dev": { @@ -1997,7 +2179,18 @@ "phpmd", "pmd" ], - "time": "2022-03-24T13:33:01+00:00" + "support": { + "irc": "irc://irc.freenode.org/phpmd", + "issues": "https://github.com/phpmd/phpmd/issues", + "source": "https://github.com/phpmd/phpmd/tree/2.13.0" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/phpmd/phpmd", + "type": "tidelift" + } + ], + "time": "2022-09-10T08:44:15+00:00" }, { "name": "phpmetrics/phpmetrics", @@ -2061,6 +2254,10 @@ "quality", "testing" ], + "support": { + "issues": "https://github.com/PhpMetrics/PhpMetrics/issues", + "source": "https://github.com/phpmetrics/PhpMetrics/tree/v2.8.1" + }, "time": "2022-03-24T10:19:51+00:00" }, { @@ -2110,6 +2307,10 @@ "keywords": [ "timer" ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/master" + }, "time": "2017-02-26T11:10:40+00:00" }, { @@ -2159,6 +2360,10 @@ "container-interop", "psr" ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/master" + }, "time": "2017-02-14T16:28:37+00:00" }, { @@ -2206,6 +2411,9 @@ "psr", "psr-3" ], + "support": { + "source": "https://github.com/php-fig/log/tree/1.1.4" + }, "time": "2021-05-03T11:20:27+00:00" }, { @@ -2245,6 +2453,10 @@ ], "description": "FinderFacade is a convenience wrapper for Symfony's Finder component.", "homepage": "https://github.com/sebastianbergmann/finder-facade", + "support": { + "issues": "https://github.com/sebastianbergmann/finder-facade/issues", + "source": "https://github.com/sebastianbergmann/finder-facade/tree/master" + }, "abandoned": true, "time": "2017-11-18T17:31:49+00:00" }, @@ -2296,6 +2508,10 @@ ], "description": "Copy/Paste Detector (CPD) for PHP code.", "homepage": "https://github.com/sebastianbergmann/phpcpd", + "support": { + "issues": "https://github.com/sebastianbergmann/phpcpd/issues", + "source": "https://github.com/sebastianbergmann/phpcpd/tree/master" + }, "time": "2017-11-16T08:49:28+00:00" }, { @@ -2339,6 +2555,10 @@ ], "description": "Library that helps with managing the version number of Git-hosted PHP projects", "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "source": "https://github.com/sebastianbergmann/version/tree/master" + }, "time": "2016-10-03T07:35:21+00:00" }, { @@ -2390,6 +2610,11 @@ "phpcs", "standards" ], + "support": { + "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues", + "source": "https://github.com/squizlabs/PHP_CodeSniffer", + "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki" + }, "time": "2021-12-12T21:44:58+00:00" }, { @@ -2449,6 +2674,23 @@ ], "description": "Symfony Config Component", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/config/tree/v3.4.47" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2020-10-24T10:57:07+00:00" }, { @@ -2516,6 +2758,23 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/console/tree/v3.4.47" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2020-10-24T10:57:07+00:00" }, { @@ -2567,6 +2826,23 @@ ], "description": "Symfony Debug Component", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/debug/tree/v3.4.47" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "abandoned": "symfony/error-handler", "time": "2020-10-24T10:57:07+00:00" }, @@ -2634,6 +2910,23 @@ ], "description": "Symfony DependencyInjection Component", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/dependency-injection/tree/v3.4.47" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2020-10-24T10:57:07+00:00" }, { @@ -2679,6 +2972,23 @@ ], "description": "Symfony Filesystem Component", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/filesystem/tree/v3.4.47" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2020-10-24T10:57:07+00:00" }, { @@ -2723,6 +3033,23 @@ ], "description": "Symfony Finder Component", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v3.4.47" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2020-11-16T17:02:08+00:00" }, { @@ -2786,6 +3113,23 @@ "portable", "shim" ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.19.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2020-10-23T09:01:57+00:00" }, { @@ -2829,6 +3173,10 @@ ], "description": "The classes contained within this repository extend the standard DOM to use exceptions at all occasions of errors instead of PHP warnings or notices. They also add various custom methods and shortcuts for convenience and to simplify the usage of DOM.", "homepage": "https://github.com/theseer/fDOMDocument", + "support": { + "issues": "https://github.com/theseer/fDOMDocument/issues", + "source": "https://github.com/theseer/fDOMDocument/tree/1.6.7" + }, "abandoned": true, "time": "2022-01-25T23:10:35+00:00" } @@ -2842,5 +3190,5 @@ "php": ">=5.6.40" }, "platform-dev": [], - "plugin-api-version": "2.3.0" + "plugin-api-version": "2.2.0" } From ac1df7691a72d95e33b48e33426ffdb3da03870e Mon Sep 17 00:00:00 2001 From: Paolo Date: Fri, 11 Nov 2022 13:54:25 +0100 Subject: [PATCH 009/268] - Added new view application/views/system/messages/FAShtmlWriteTemplate.php to be used with FAS/SeaMonkey and TinyMCE3 - Replaced TinyMCE V4 with V5 - Dropped TinyMCE V4 - Added new JS public/js/messaging/fasMessageWrite.js to be included by application/views/system/messages/FAShtmlWriteTemplate.php --- .../system/messages/FASMessages.php | 4 +- application/views/person/bpk/bpkDetails.php | 1 - .../system/infocenter/infocenterDetails.php | 2 +- .../infocenter/infocenterZgvDetails.php | 2 +- .../system/messages/FAShtmlWriteTemplate.php | 197 ++++++++++++++++++ .../views/system/messages/ajaxRead.php | 2 +- .../views/system/messages/ajaxWrite.php | 2 +- .../views/system/messages/ajaxWriteReply.php | 2 +- .../views/system/messages/htmlWriteReply.php | 2 +- .../system/messages/htmlWriteTemplate.php | 2 +- .../views/system/vorlage/templatetextEdit.php | 2 +- application/views/templates/FHC-Common.php | 2 +- application/views/templates/FHC-Footer.php | 4 +- application/views/templates/FHC-Header.php | 3 - application/views/templates/header.php | 2 +- application/views/widgets/tinymce.php | 5 +- public/css/{TinyMCE.css => TinyMCE5.css} | 0 public/js/messaging/fasMessageWrite.js | 140 +++++++++++++ public/js/messaging/messageWrite.js | 11 +- public/js/messaging/write.js | 2 +- 20 files changed, 363 insertions(+), 24 deletions(-) create mode 100644 application/views/system/messages/FAShtmlWriteTemplate.php rename public/css/{TinyMCE.css => TinyMCE5.css} (100%) create mode 100644 public/js/messaging/fasMessageWrite.js diff --git a/application/controllers/system/messages/FASMessages.php b/application/controllers/system/messages/FASMessages.php index 55d1da25f..e2169af9b 100644 --- a/application/controllers/system/messages/FASMessages.php +++ b/application/controllers/system/messages/FASMessages.php @@ -37,7 +37,7 @@ class FASMessages extends Auth_Controller // Loads the view to write a new message with a template $this->load->view( - 'system/messages/htmlWriteTemplate', + 'system/messages/FAShtmlWriteTemplate', $this->CLMessagesModel->prepareHtmlWriteTemplatePrestudents($prestudents) ); } @@ -53,7 +53,7 @@ class FASMessages extends Auth_Controller // Loads the view to write a new message with a template $this->load->view( - 'system/messages/htmlWriteTemplate', + 'system/messages/FAShtmlWriteTemplate', $this->CLMessagesModel->prepareHtmlWriteTemplatePrestudents($prestudents, $message_id, $recipient_id) ); } diff --git a/application/views/person/bpk/bpkDetails.php b/application/views/person/bpk/bpkDetails.php index 198065c24..6b7d4430d 100644 --- a/application/views/person/bpk/bpkDetails.php +++ b/application/views/person/bpk/bpkDetails.php @@ -9,7 +9,6 @@ 'jqueryui1' => true, 'ajaxlib' => true, 'tablesorter2' => true, - 'tinymce4' => true, 'sbadmintemplate3' => true, 'addons' => true, 'navigationwidget' => true, diff --git a/application/views/system/infocenter/infocenterDetails.php b/application/views/system/infocenter/infocenterDetails.php index 158feeb2c..15eca90c2 100644 --- a/application/views/system/infocenter/infocenterDetails.php +++ b/application/views/system/infocenter/infocenterDetails.php @@ -8,7 +8,7 @@ 'dialoglib' => true, 'ajaxlib' => true, 'tablesorter2' => true, - 'tinymce4' => true, + 'tinymce5' => true, 'sbadmintemplate3' => true, 'addons' => true, 'navigationwidget' => true, diff --git a/application/views/system/infocenter/infocenterZgvDetails.php b/application/views/system/infocenter/infocenterZgvDetails.php index cf3ffad8b..bf9f69e18 100644 --- a/application/views/system/infocenter/infocenterZgvDetails.php +++ b/application/views/system/infocenter/infocenterZgvDetails.php @@ -10,7 +10,7 @@ 'dialoglib' => true, 'ajaxlib' => true, 'tablesorter2' => true, - 'tinymce4' => true, + 'tinymce5' => true, 'sbadmintemplate3' => true, 'addons' => true, 'navigationwidget' => true, diff --git a/application/views/system/messages/FAShtmlWriteTemplate.php b/application/views/system/messages/FAShtmlWriteTemplate.php new file mode 100644 index 000000000..691629c10 --- /dev/null +++ b/application/views/system/messages/FAShtmlWriteTemplate.php @@ -0,0 +1,197 @@ +load->view( + 'templates/FHC-Header', + array( + 'title' => 'Write a new message or reply using templates', + 'jquery3' => true, + 'jqueryui1' => true, + 'bootstrap3' => true, + 'ajaxlib' => true, + 'fontawesome4' => true, + 'tinymce3' => true, + 'sbadmintemplate3' => true, + 'dialoglib' => true, + 'widgets' => true, + 'customCSSs' => array('public/css/sbadmin2/admintemplate_contentonly.css', 'public/css/messaging/message.css'), + 'customJSs' => array('public/js/bootstrapper.js', 'public/js/messaging/fasMessageWrite.js') + ) + ); +?> + +
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+ +
+
+
+
+
+
+ +
+   +
+ +
+
+
+
+
+
+ + +
+
+
+ + + 19 ? 19 : count($variables); + echo $this->widgetlib->widget( + 'MultipleDropdown_widget', + array('elements' => success($variables)), + array( + 'name' => 'variables[]', + 'id' => 'variables', + 'size' => $size, + 'multiple' => true + ) + ); + ?> +
+
+
+ + + 5 ? 5 : count($user_fields); + echo $this->widgetlib->widget( + 'MultipleDropdown_widget', + array('elements' => success($user_fields)), + array( + 'name' => 'user_fields[]', + 'id' => 'user_fields', + 'size' => $size, + 'multiple' => true + ) + ); + ?> +
+
+
+
+
+
+ + widgetlib->widget( + 'Vorlage_widget', + array('oe_kurzbz' => $organisationUnits, 'isAdmin' => $senderIsAdmin), + array('name' => 'vorlage', 'id' => 'vorlageDnD') + ); + ?> + +
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+
+
+ widgetlib->widget( + 'Dropdown_widget', + array( + 'elements' => success($recipientsArray), + 'emptyElement' => ucfirst($this->p->t('global', 'empfaenger')).'...' + ), + array( + 'name' => 'recipients[]', + 'id' => 'recipients' + ) + ); + ?> + + + p->t('ui', 'refresh')); ?> + + +
+
+
+
+
+ +
+ + + + + +
+
+
+
+ + +load->view("templates/FHC-Footer"); ?> + diff --git a/application/views/system/messages/ajaxRead.php b/application/views/system/messages/ajaxRead.php index 2cb88708e..4c1a77deb 100644 --- a/application/views/system/messages/ajaxRead.php +++ b/application/views/system/messages/ajaxRead.php @@ -12,7 +12,7 @@ 'tabulator4' => true, 'ajaxlib' => true, 'dialoglib' => true, - 'tinymce4' => true, + 'tinymce5' => true, 'phrases' => array('global', 'ui'), 'customCSSs' => array('public/css/sbadmin2/admintemplate_contentonly.css', 'public/css/messaging/message.css'), 'customJSs' => array('public/js/bootstrapper.js', 'public/js/messaging/read.js') diff --git a/application/views/system/messages/ajaxWrite.php b/application/views/system/messages/ajaxWrite.php index 3b1582f22..b3a598506 100644 --- a/application/views/system/messages/ajaxWrite.php +++ b/application/views/system/messages/ajaxWrite.php @@ -10,7 +10,7 @@ 'sbadmintemplate3' => true, 'ajaxlib' => true, 'dialoglib' => true, - 'tinymce4' => true, + 'tinymce5' => true, 'phrases' => array('global', 'ui'), 'customCSSs' => array('public/css/sbadmin2/admintemplate_contentonly.css', 'public/css/messaging/message.css'), 'customJSs' => array('public/js/bootstrapper.js', 'public/js/messaging/write.js') diff --git a/application/views/system/messages/ajaxWriteReply.php b/application/views/system/messages/ajaxWriteReply.php index 0a496c93e..08dc188fa 100644 --- a/application/views/system/messages/ajaxWriteReply.php +++ b/application/views/system/messages/ajaxWriteReply.php @@ -10,7 +10,7 @@ 'sbadmintemplate3' => true, 'ajaxlib' => true, 'dialoglib' => true, - 'tinymce4' => true, + 'tinymce5' => true, 'phrases' => array('global', 'ui'), 'customCSSs' => array('public/css/sbadmin2/admintemplate_contentonly.css', 'public/css/messaging/message.css'), 'customJSs' => array('public/js/bootstrapper.js', 'public/js/messaging/writeReply.js') diff --git a/application/views/system/messages/htmlWriteReply.php b/application/views/system/messages/htmlWriteReply.php index 9106d802b..d2150c1fb 100644 --- a/application/views/system/messages/htmlWriteReply.php +++ b/application/views/system/messages/htmlWriteReply.php @@ -6,7 +6,7 @@ 'jquery3' => true, 'bootstrap3' => true, 'fontawesome4' => true, - 'tinymce4' => true, + 'tinymce5' => true, 'sbadmintemplate3' => true, 'customCSSs' => array('public/css/sbadmin2/admintemplate_contentonly.css', 'public/css/messaging/message.css'), 'customJSs' => array('public/js/bootstrapper.js', 'public/js/messaging/messageWriteReply.js') diff --git a/application/views/system/messages/htmlWriteTemplate.php b/application/views/system/messages/htmlWriteTemplate.php index 761e05f96..42a31f374 100644 --- a/application/views/system/messages/htmlWriteTemplate.php +++ b/application/views/system/messages/htmlWriteTemplate.php @@ -8,7 +8,7 @@ 'bootstrap3' => true, 'ajaxlib' => true, 'fontawesome4' => true, - 'tinymce4' => true, + 'tinymce5' => true, 'sbadmintemplate3' => true, 'dialoglib' => true, 'widgets' => true, diff --git a/application/views/system/vorlage/templatetextEdit.php b/application/views/system/vorlage/templatetextEdit.php index 42efc1519..cc2487959 100644 --- a/application/views/system/vorlage/templatetextEdit.php +++ b/application/views/system/vorlage/templatetextEdit.php @@ -1,5 +1,5 @@ load->view('templates/header', array('title' => 'VorlageEdit', 'tinymce4' => true, 'jsonforms' => true)); + $this->load->view('templates/header', array('title' => 'VorlageEdit', 'tinymce5' => true, 'jsonforms' => true)); ?>
diff --git a/application/views/templates/FHC-Common.php b/application/views/templates/FHC-Common.php index dd1d8ae1c..27282bc11 100644 --- a/application/views/templates/FHC-Common.php +++ b/application/views/templates/FHC-Common.php @@ -23,7 +23,7 @@ $tablesorter2 = isset($tablesorter2) ? $tablesorter2 : false; $tabulator4 = isset($tabulator4) ? $tabulator4 : false; $tabulator5 = isset($tabulator5) ? $tabulator5 : false; - $tinymce4 = isset($tinymce4) ? $tinymce4 : false; + $tinymce3 = isset($tinymce3) ? $tinymce3 : false; $tinymce5 = isset($tinymce5) ? $tinymce5 : false; $vue3 = isset($vue3) ? $vue3 : false; $primevue3 = isset($primevue3) ? $primevue3 : false; diff --git a/application/views/templates/FHC-Footer.php b/application/views/templates/FHC-Footer.php index 0c3782fea..ee13c69d2 100644 --- a/application/views/templates/FHC-Footer.php +++ b/application/views/templates/FHC-Footer.php @@ -100,8 +100,8 @@ // Tabulator 5 JS if ($tabulator5 === true) generateJSsInclude('vendor/olifolkerd/tabulator5/dist/js/tabulator.min.js'); - // Tinymce 4 JS - if ($tinymce4 === true) generateJSsInclude('vendor/tinymce/tinymce4/tinymce.min.js'); + // Tinymce 3 JS + if ($tinymce3 === true) generateJSsInclude('include/tiny_mce/tiny_mce.js'); // Tinymce 5 JS if ($tinymce5 === true) generateJSsInclude('vendor/tinymce/tinymce5/tinymce.min.js'); diff --git a/application/views/templates/FHC-Header.php b/application/views/templates/FHC-Header.php index aa63541c5..47eea34ec 100644 --- a/application/views/templates/FHC-Header.php +++ b/application/views/templates/FHC-Header.php @@ -79,9 +79,6 @@ // Tabulator 5 CSS if ($tabulator5 === true) generateCSSsInclude('vendor/olifolkerd/tabulator5/dist/css/tabulator_bootstrap5.min.css'); - // Tinymce 4 CSS - if ($tinymce4 === true) generateCSSsInclude('public/css/TinyMCE4.css'); - // Tinymce 5 CSS if ($tinymce5 === true) generateCSSsInclude('public/css/TinyMCE5.css'); diff --git a/application/views/templates/header.php b/application/views/templates/header.php index 637eb3c7a..e75acca4f 100644 --- a/application/views/templates/header.php +++ b/application/views/templates/header.php @@ -95,7 +95,7 @@ if($jqueryV1 && $jqueryV2) show_error("Two JQuery versions used: composer and in - + diff --git a/application/views/widgets/tinymce.php b/application/views/widgets/tinymce.php index 3e2093e55..618cb4836 100644 --- a/application/views/widgets/tinymce.php +++ b/application/views/widgets/tinymce.php @@ -5,5 +5,6 @@ plugins: [], toolbar: "" }); - - < name="" style="">> + +< name="" style="">> + diff --git a/public/css/TinyMCE.css b/public/css/TinyMCE5.css similarity index 100% rename from public/css/TinyMCE.css rename to public/css/TinyMCE5.css diff --git a/public/js/messaging/fasMessageWrite.js b/public/js/messaging/fasMessageWrite.js new file mode 100644 index 000000000..d32f80fac --- /dev/null +++ b/public/js/messaging/fasMessageWrite.js @@ -0,0 +1,140 @@ +// ******************************************************** +// JS used by view system/messages/htmlWriteTemplate +// ******************************************************** + +function tinymcePreviewSetContent() +{ + if ($("#tinymcePreview")) + { + if ($("#recipients").children(":selected").val() > -1) + { + parseMessageText($("#recipients").children(":selected").val(), tinyMCE.get("bodyTextArea").getContent()); + } + else + { + tinyMCE.get("tinymcePreview").setContent(""); + } + } +} + +function parseMessageText(receiver_id, text) +{ + FHC_AjaxClient.ajaxCallPost( + "system/messages/Messages/parseMessageText", + { + receiver_id: receiver_id, + text: text, + type: $("#type").val() + }, + { + successCallback: function(data, textStatus, jqXHR) { + + if (FHC_AjaxClient.hasData(data)) + { + tinyMCE.get("tinymcePreview").setContent(FHC_AjaxClient.getData(data)); + } + else if (FHC_AjaxClient.isError(data)) + { + FHC_DialogLib.alertError(data.retval); + } + } + } + ); +} + +$(document).ready(function () +{ + + tinymce.init({ + theme : "advanced", + mode : "textareas" + }); + + if ($("#variables")) + { + $("#variables").dblclick(function () + { + if ($("#bodyTextArea")) + { + //if editor active add at cursor position, otherwise at end + if (tinymce.activeEditor.id === "bodyTextArea") + tinymce.activeEditor.execCommand('mceInsertContent', false, $(this).children(":selected").val()); + else + tinyMCE.get("bodyTextArea").setContent(tinyMCE.get("bodyTextArea").getContent() + $(this).children(":selected").val()); + } + }); + } + + if ($("#user_fields")) + { + $("#user_fields").dblclick(function () + { + if ($("#bodyTextArea")) + { + //if editor active add at cursor position, otherwise at end + if (tinymce.activeEditor.id === "bodyTextArea") + tinymce.activeEditor.execCommand('mceInsertContent', false, $(this).children(":selected").val()); + else + tinyMCE.get("bodyTextArea").setContent(tinyMCE.get("bodyTextArea").getContent() + $(this).children(":selected").val()); + } + }); + } + + if ($("#recipients")) + { + $("#recipients").change(tinymcePreviewSetContent); + } + + if ($("#refresh")) + { + $("#refresh").click(tinymcePreviewSetContent); + } + + if ($("#sendButton") && $("#sendForm")) + { + $("#sendButton").click(function () + { + if ($("#subject") && $("#subject").val() != '' && tinyMCE.get("bodyTextArea").getContent() != '') + { + $("#sendForm").submit(); + } + else + { + FHC_DialogLib.alertInfo("Subject and text are required fields!"); + } + }); + } + + if ($("#vorlageDnD")) + { + $("#vorlageDnD").change(function () + { + var vorlage_kurzbz = this.value; + + if (vorlage_kurzbz != '') + { + FHC_AjaxClient.ajaxCallGet( + "system/messages/Messages/getVorlage", + { + vorlage_kurzbz: vorlage_kurzbz + }, + { + successCallback: function(data, textStatus, jqXHR) { + + if (FHC_AjaxClient.hasData(data)) + { + var msg = FHC_AjaxClient.getData(data); + + tinyMCE.get("bodyTextArea").setContent(msg[0].text); + $("#subject").val(msg[0].subject); + } + } + } + ); + } + }); + } + + $("#subject").focus(); + +}); diff --git a/public/js/messaging/messageWrite.js b/public/js/messaging/messageWrite.js index 8b1d73bdf..382e79948 100644 --- a/public/js/messaging/messageWrite.js +++ b/public/js/messaging/messageWrite.js @@ -42,8 +42,8 @@ function parseMessageText(receiver_id, text) ); } -$(document).ready(function () -{ +$(document).ready(function () { + tinymce.init({ selector: "#bodyTextArea", plugins: "autoresize", @@ -60,7 +60,12 @@ $(document).ready(function () menubar: false, toolbar: false, statusbar: false, - readonly: 1 + readonly: 1, + autoresize_on_init: false, + autoresize_min_height: 400, + autoresize_max_height: 700, + autoresize_bottom_margin: 10, + auto_focus: "bodyTextArea" }); if ($("#variables")) diff --git a/public/js/messaging/write.js b/public/js/messaging/write.js index 1370fb2e0..bff451c2e 100644 --- a/public/js/messaging/write.js +++ b/public/js/messaging/write.js @@ -63,7 +63,7 @@ $(document).ready(function () { tinymce.init({ selector: "#body", plugins: "autoresize", - autoresize_min_height: 150, + autoresize_min_height: 300, autoresize_max_height: 600, autoresize_bottom_margin: 10 }); From 540fc4bede933b704d2d69aeb0325bcc0da780c0 Mon Sep 17 00:00:00 2001 From: ma0068 Date: Tue, 15 Nov 2022 11:22:47 +0100 Subject: [PATCH 010/268] 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 011/268] - 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 012/268] - 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 84ca798dadc5ad814a949d69093ae3d113b369b9 Mon Sep 17 00:00:00 2001 From: Harald Bamberger Date: Wed, 8 Mar 2023 13:50:33 +0100 Subject: [PATCH 013/268] 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 25313a8f527cd7d8964cab01fbb8f5a75298a551 Mon Sep 17 00:00:00 2001 From: Paolo Date: Thu, 23 Mar 2023 14:34:37 +0100 Subject: [PATCH 014/268] Code quality check fixes --- application/views/person/bpk/bpkDetails.php | 12 ++++++++++-- .../views/system/infocenter/infocenterZgvDetails.php | 6 +++++- application/views/templates/FHC-Footer.php | 2 +- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/application/views/person/bpk/bpkDetails.php b/application/views/person/bpk/bpkDetails.php index 6b7d4430d..bd6191c6a 100644 --- a/application/views/person/bpk/bpkDetails.php +++ b/application/views/person/bpk/bpkDetails.php @@ -125,10 +125,18 @@
-
+ - +
diff --git a/application/views/system/infocenter/infocenterZgvDetails.php b/application/views/system/infocenter/infocenterZgvDetails.php index bf9f69e18..3a254b16a 100644 --- a/application/views/system/infocenter/infocenterZgvDetails.php +++ b/application/views/system/infocenter/infocenterZgvDetails.php @@ -130,7 +130,11 @@ p->t('infocenter', 'zgvNichtErfuellt') ?> - diff --git a/application/views/templates/FHC-Footer.php b/application/views/templates/FHC-Footer.php index ee13c69d2..a9a44b978 100644 --- a/application/views/templates/FHC-Footer.php +++ b/application/views/templates/FHC-Footer.php @@ -107,7 +107,7 @@ if ($tinymce5 === true) generateJSsInclude('vendor/tinymce/tinymce5/tinymce.min.js'); // Vue 3 JS - if ($vue3 === true) + if ($vue3 === true) { generateJSsInclude('vendor/vuejs/vuejs3/vue.global.prod.js'); generateJSsInclude('vendor/vuejs/vuerouter4/vue-router.global.js'); From 3e056ebf3d35c6eacae1fd042e9358c3925c532c Mon Sep 17 00:00:00 2001 From: ma0068 Date: Fri, 24 Mar 2023 15:21:01 +0100 Subject: [PATCH 015/268] =?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/268] 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/268] 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/268] - 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 da484fbbb07d7017fb232872e35562a292976294 Mon Sep 17 00:00:00 2001 From: ma0048 Date: Tue, 25 Apr 2023 08:45:16 +0200 Subject: [PATCH 019/268] - die letzten 5 tage werden geprueft anstatt nur der vortag - neue bewerbungen nach dem aufgenommen status werden nich automatisch abgewiesen --- application/controllers/jobs/ReihungstestJob.php | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/application/controllers/jobs/ReihungstestJob.php b/application/controllers/jobs/ReihungstestJob.php index ab6c429a0..431ac5b04 100644 --- a/application/controllers/jobs/ReihungstestJob.php +++ b/application/controllers/jobs/ReihungstestJob.php @@ -3,6 +3,9 @@ if (!defined('BASEPATH')) exit('No direct script access allowed'); class ReihungstestJob extends JOB_Controller { + + const LAST_DAYS_PRESTUDENTSTATUS = 5; + /** * Constructor */ @@ -826,7 +829,7 @@ class ReihungstestJob extends JOB_Controller AND tbl_studiengang.typ IN ('b', 'm') ) SELECT * FROM prst - WHERE prestudenstatus_datum >= (SELECT CURRENT_DATE - 1) + WHERE prestudenstatus_datum >= (SELECT CURRENT_DATE - ". self::LAST_DAYS_PRESTUDENTSTATUS .") AND (studiengang_typ = 'b' OR (studiengang_typ = 'm' AND EXISTS (SELECT 1 /* Master Studiengänge berücksichtigen wenn auch Bachelor im gleichen Semester */ FROM prst prstb WHERE studiengang_typ = 'b' @@ -868,7 +871,8 @@ class ReihungstestJob extends JOB_Controller tbl_person.nachname, tbl_person.vorname, tbl_prestudent.*, - tbl_studiengang.typ AS studiengang_typ + tbl_studiengang.typ AS studiengang_typ, + tbl_prestudentstatus.datum FROM PUBLIC.tbl_person JOIN PUBLIC.tbl_prestudent USING (person_id) JOIN PUBLIC.tbl_prestudentstatus USING (prestudent_id) @@ -901,7 +905,7 @@ class ReihungstestJob extends JOB_Controller $mailArray[$rowNiedrPrios->studiengang_kz][$rowNiedrPrios->orgform_kurzbz]['AufnahmeHoeherePrio'][] = $rowNiedrPrios->nachname.' '.$rowNiedrPrios->vorname.' ('.$rowNiedrPrios->prestudent_id.')'; } - elseif ($rowNiedrPrios->laststatus == 'Bewerber') + elseif ($rowNiedrPrios->laststatus == 'Bewerber' && $row_ps->prestudenstatus_datum > $rowNiedrPrios->datum) { // Abgewiesenen-Status mit Statusgrund "Aufnahme anderer Studiengang" (ID 5) setzen $lastStatus = $this->PrestudentstatusModel->getLastStatus($rowNiedrPrios->prestudent_id); @@ -927,7 +931,7 @@ class ReihungstestJob extends JOB_Controller = $rowNiedrPrios->nachname.' '.$rowNiedrPrios->vorname.' ('.$rowNiedrPrios->prestudent_id.')'; } } - elseif ($rowNiedrPrios->laststatus == 'Wartender') + elseif ($rowNiedrPrios->laststatus == 'Wartender' && $row_ps->prestudenstatus_datum > $rowNiedrPrios->datum) { // Abgewiesenen-Status mit Statusgrund "Aufnahme anderer Studiengang" (ID 5) setzen // Mail zur Info an Assistenz schicken From 33e313a633a4001f01b1ce55c4dec39f62c2d2e1 Mon Sep 17 00:00:00 2001 From: ma0068 Date: Mon, 8 May 2023 12:12:42 +0200 Subject: [PATCH 020/268] update Abfrage --- application/inputFileTest.csv | 8 +++++ application/tmp/inputFile.csv | 49 +++++++++++++++++++++++++++ application/tmp/inputFileMitError.csv | 11 ++++++ application/tmp/inputFileUltra.csv | 8 +++++ cis/private/lehre/notenliste.xls.php | 7 ++-- 5 files changed, 80 insertions(+), 3 deletions(-) create mode 100644 application/inputFileTest.csv create mode 100644 application/tmp/inputFile.csv create mode 100644 application/tmp/inputFileMitError.csv create mode 100644 application/tmp/inputFileUltra.csv diff --git a/application/inputFileTest.csv b/application/inputFileTest.csv new file mode 100644 index 000000000..927dc0062 --- /dev/null +++ b/application/inputFileTest.csv @@ -0,0 +1,8 @@ +uid,studiensemester,moodle_course_shortname,moodle_course_fullname,moodle_course_url +aburaia,SS2016,BMR4_MLAB2_2016,BMR4_Mechatronics-Lab2_2016,https://moodle.technikum-wien.at/course/view.php?id=2948 +aburaia,WS2016,MMR-VZB-3-WS2016-PRJ,Projekt,https://moodle.technikum-wien.at/course/view.php?id=3643 +adams,SS2016,BEW-BB-4-SS2016-ENG/67791,Business English 2,https://moodle.technikum-wien.at/course/view.php?id=3034 +adams,SS2016,BEW-DL-2-SS2016-ENG,Technical and Creative Communication,https://moodle.technikum-wien.at/course/view.php?id=2873 +krizek,SS2016,BVU-VZ-6-SS2016-PSB,Praxissemesterbegleitung,https://moodle.technikum-wien.at/course/view.php?id=3157 +krizek,SS2016,MIT-VZ-2-SS2016-ITS PRJ I,ITS Project I,https://moodle.technikum-wien.at/course/view.php?id=3175 +krizek,WS2016,MSC-VZ-3-WS2016-IP2,ITS Project II,https://moodle.technikum-wien.at/course/view.php?id=3713 diff --git a/application/tmp/inputFile.csv b/application/tmp/inputFile.csv new file mode 100644 index 000000000..48411ca1a --- /dev/null +++ b/application/tmp/inputFile.csv @@ -0,0 +1,49 @@ +uid,studiensemester,moodle_course_shortname,moodle_course_fullname,moodle_course_url +aburaia,SS2016,BMR4_MLAB2_2016,BMR4_Mechatronics-Lab2_2016,https://moodle.technikum-wien.at/course/view.php?id=2948 +aburaia,SS2016,BMR6_MES_2016,BMR6_Mechatronische-Systeme_2016,https://moodle.technikum-wien.at/course/view.php?id=2951 +aburaia,SS2016,BMR-VZ-6-SS2016-EMS,Entwurf mechatronischer Systeme,https://moodle.technikum-wien.at/course/view.php?id=2833 +aburaia,WS2016,BMB-VZ-5-WS2016-DF,Industrierobotik in der Digitalen Fabrik,https://moodle.technikum-wien.at/course/view.php?id=4188 +aburaia,WS2016,BMR5_PRAK_2016,BMR5_Berufspraktikum_2016,https://moodle.technikum-wien.at/course/view.php?id=3746 +aburaia,WS2016,BMR-VZ-3-WS2016-PJM,Projektmanagement,https://moodle.technikum-wien.at/course/view.php?id=3452 +aburaia,WS2016,MMR-3-WS2016_PROJ,MMR-3-WS2016 - Projekt,https://moodle.technikum-wien.at/course/view.php?id=3351 +aburaia,WS2016,MMR-BB-1-WS2016-BMECH,Mechatronik 1,https://moodle.technikum-wien.at/course/view.php?id=4038 +aburaia,WS2016,MMR-VZ-1-WS2016-VMECH,Mechatronik 1,https://moodle.technikum-wien.at/course/view.php?id=4037 +aburaia,WS2016,MMR-VZ-4-WS2016-MT,Master Thesis,https://moodle.technikum-wien.at/course/view.php?id=3956 +aburaia,WS2016,MMR-VZB-3-WS2016-PRJ,Projekt,https://moodle.technikum-wien.at/course/view.php?id=3643 +adams,SS2016,BEW-BB-4-SS2016-ENG/67791,Business English 2,https://moodle.technikum-wien.at/course/view.php?id=3034 +adams,SS2016,BEW-DL-2-SS2016-ENG,Technical and Creative Communication,https://moodle.technikum-wien.at/course/view.php?id=2873 +adams,SS2016,BEW-DL-4-SS2016-DLPS,Business Communication for Engineers,https://moodle.technikum-wien.at/course/view.php?id=2883 +adams,SS2016,BEW-DL-6-SS2016-ADC,Advanced Communication,https://moodle.technikum-wien.at/course/view.php?id=2897 +adams,SS2016,BIC-BB-2-SS2016-ENG/68928/68931,Technical and Creative Communication,https://moodle.technikum-wien.at/course/view.php?id=2898 +adams,SS2016,BIW-BB-2-SS2016-PTC/67947,BIW-BB-2-SS2016 - Professional & Technical Communication 2,https://moodle.technikum-wien.at/course/view.php?id=3020 +adams,SS2016,BWI-DL-4-SS2016-BUCdl,Business Communication,https://moodle.technikum-wien.at/course/view.php?id=2879 +adams,SS2016,EWU-VZ-1-SS2016-WUE1,Warm-up Englisch 1,https://moodle.technikum-wien.at/course/view.php?id=3415 +adams,SS2016,MGR-VZ-4-SS2016-ENG/67338,Intensiv Englisch,https://moodle.technikum-wien.at/course/view.php?id=3174 +adams,WS2016,BEW-DL-3-WS2016-DLGI,General Information,https://moodle.technikum-wien.at/course/view.php?id=3481 +adams,WS2016,BEW-DL-3-WS2016-EC,Economics Technology and Society,https://moodle.technikum-wien.at/course/view.php?id=3414 +adams,WS2016,BIC-BB-1-WS2016-PSC/70705/70740,Professional and Social Communication,https://moodle.technikum-wien.at/course/view.php?id=3559 +adams,WS2016,BIW-BB-1-WS2016-PTC/73126,BIW-BB-1-WS2016 - Professional and Technical Communication 1,https://moodle.technikum-wien.at/course/view.php?id=3403 +adams,WS2016,BIW-BB-3-WS2016-EBE/72699,English for Business and Engineering,https://moodle.technikum-wien.at/course/view.php?id=3938 +adams,WS2016,BSA-VZ-1-WS2016-PSC,Professional and Social Communication,https://moodle.technikum-wien.at/course/view.php?id=3747 +adams,WS2016,BSA-VZ-3-WS2016-TCC,Technical and Creative Communication ,https://moodle.technikum-wien.at/course/view.php?id=3748 +adams,WS2016,BWI-DL-3-WS2016-ENGdl,Econonmics Technology and Society,https://moodle.technikum-wien.at/course/view.php?id=3608 +adensam,SS2016,MEE-BB-2-SS2016-BEV,Bewertungsverfahren,https://moodle.technikum-wien.at/course/view.php?id=2955 +adensam,WS2016,MEE-BB-3-WS2016-ERT,Energierecht,https://moodle.technikum-wien.at/course/view.php?id=3964 +adensam,WS2016,MEE-BB-3-WS2016-EWT,Energiewirtschaft,https://moodle.technikum-wien.at/course/view.php?id=3794 +adensam,WS2016,MUT-BB-3-WS2016-EM,Energiemanagement,https://moodle.technikum-wien.at/course/view.php?id=3676 +kraft,WS2016,MWI-DL-3-WS2016-MBdl,Mobile Business,https://moodle.technikum-wien.at/course/view.php?id=3589 +kraft,WS2016,MWI-PT-1-WS2016-ITSCpt,IT Strategy and IT Controlling,https://moodle.technikum-wien.at/course/view.php?id=3560 +kraft,WS2016,MWI-PT-3-WS2016-MBpt,Mobile Business,https://moodle.technikum-wien.at/course/view.php?id=3590 +kralc,SS2016,MEE-BB-2-SS2020-AS Anlagentechnik und Simulation (mit Modelica und Dymola),Anlagentechnik und Simulation mit Modelica und Dymola,https://moodle.technikum-wien.at/course/view.php?id=3025 +krametz,WS2016,WS2016-BEE3-ALB,WS2016-BEE3-ALB,https://moodle.technikum-wien.at/course/view.php?id=3624 +kratochv,SS2016,BST-VZ-2-SS2016-MTL,Materialtechnologie - Labor I,https://moodle.technikum-wien.at/course/view.php?id=3332 +kravtche,WS2016,BEW-BB-1-WS2016-LAB,Labor 1,https://moodle.technikum-wien.at/course/view.php?id=3734 +krenn,SS2016,BEW-DL-2-SS2016-PHY/67684,Physics 1,https://moodle.technikum-wien.at/course/view.php?id=2862 +krenn,WS2016,BEW-BB-5-WS2016-WIA,Wissenschaftliches Arbeiten,https://moodle.technikum-wien.at/course/view.php?id=3716 +krenn,WS2016,BEW-DL-3-WS2016-DLGI,General Information,https://moodle.technikum-wien.at/course/view.php?id=3481 +krenn,WS2016,BEW-DL-3-WS2016-PHY,Physics 2,https://moodle.technikum-wien.at/course/view.php?id=3378 +krennk,WS2016,BST-VZ-5-WS2016-BA1-MBAP3,Bachelorarbeit 1 - MBA Projekt 3 ,https://moodle.technikum-wien.at/course/view.php?id=3527 +krennm,SS2016,BBE-VZ-4-SS2016-CSA,Circuitdesign and Signal Analysis,https://moodle.technikum-wien.at/course/view.php?id=2956 +krizek,SS2016,BVU-VZ-6-SS2016-PSB,Praxissemesterbegleitung,https://moodle.technikum-wien.at/course/view.php?id=3157 +krizek,SS2016,MIT-VZ-2-SS2016-ITS PRJ I,ITS Project I,https://moodle.technikum-wien.at/course/view.php?id=3175 +krizek,WS2016,MSC-VZ-3-WS2016-IP2,ITS Project II,https://moodle.technikum-wien.at/course/view.php?id=3713 diff --git a/application/tmp/inputFileMitError.csv b/application/tmp/inputFileMitError.csv new file mode 100644 index 000000000..26c53a78d --- /dev/null +++ b/application/tmp/inputFileMitError.csv @@ -0,0 +1,11 @@ +uid,studiensemester,moodle_course_shortname,moodle_course_fullname,moodle_course_url +aburaia,SS2016,BMR4_MLAB2_2016,BMR4_Mechatronics-Lab2_2016,https://moodle.technikum-wien.at/course/view.php?id=2948 +aburaia,WS2016,MMR-VZB-3-WS2016-PRJ,,https://moodle.technikum-wien.at/course/view.php?id=3643 +adams,SS2016,BEW-BB-4-SS2016-ENG/67791,Business English 2,https://moodle.technikum-wien.at/course/view.php?id=3034 +adams,SS2016,,Technical and Creative Communication,https://moodle.technikum-wien.at/course/view.php?id=2873 +krizek,SS2016,BVU-VZ-6-SS2016-PSB,Praxissemesterbegleitung, +krizek,SS2016,MIT-VZ-2-SS2016-ITS PRJ I,ITS Project I,https://moodle.technikum-wien.at/course/view.php?id=3175 +krizek,WS2016,MSC-VZ-3-WS2016-IP2,ITS Project II,https://moodle.technikum-wien.at/course/view.php?id=3713 +kraft,WS2016,MWI-DL-3-WS2016-MBdl,Mobile Business,https://moodle.technikum-wien.at/course/view.php?id=3589 +kraft,,MWI-PT-1-WS2016-ITSCpt,IT Strategy and IT Controlling,https://moodle.technikum-wien.at/course/view.php?id=3560 +kraft,WS2016,MWI-PT-3-WS2016-MBpt,Mobile Business,https://moodle.technikum-wien.at/course/view.php?id=3590 diff --git a/application/tmp/inputFileUltra.csv b/application/tmp/inputFileUltra.csv new file mode 100644 index 000000000..927dc0062 --- /dev/null +++ b/application/tmp/inputFileUltra.csv @@ -0,0 +1,8 @@ +uid,studiensemester,moodle_course_shortname,moodle_course_fullname,moodle_course_url +aburaia,SS2016,BMR4_MLAB2_2016,BMR4_Mechatronics-Lab2_2016,https://moodle.technikum-wien.at/course/view.php?id=2948 +aburaia,WS2016,MMR-VZB-3-WS2016-PRJ,Projekt,https://moodle.technikum-wien.at/course/view.php?id=3643 +adams,SS2016,BEW-BB-4-SS2016-ENG/67791,Business English 2,https://moodle.technikum-wien.at/course/view.php?id=3034 +adams,SS2016,BEW-DL-2-SS2016-ENG,Technical and Creative Communication,https://moodle.technikum-wien.at/course/view.php?id=2873 +krizek,SS2016,BVU-VZ-6-SS2016-PSB,Praxissemesterbegleitung,https://moodle.technikum-wien.at/course/view.php?id=3157 +krizek,SS2016,MIT-VZ-2-SS2016-ITS PRJ I,ITS Project I,https://moodle.technikum-wien.at/course/view.php?id=3175 +krizek,WS2016,MSC-VZ-3-WS2016-IP2,ITS Project II,https://moodle.technikum-wien.at/course/view.php?id=3713 diff --git a/cis/private/lehre/notenliste.xls.php b/cis/private/lehre/notenliste.xls.php index 42dcc8418..2e0403139 100644 --- a/cis/private/lehre/notenliste.xls.php +++ b/cis/private/lehre/notenliste.xls.php @@ -270,17 +270,18 @@ else AND tbl_zeugnisnote.student_uid=tbl_student.student_uid AND tbl_zeugnisnote.studiensemester_kurzbz=tbl_studentlehrverband.studiensemester_kurzbz) LEFT JOIN bis.tbl_bisio ON(uid=tbl_bisio.student_uid) - LEFT JOIN bis.tbl_mobilitaet USING(prestudent_id) + LEFT JOIN bis.tbl_mobilitaet ON (bis.tbl_mobilitaet.prestudent_id = public.tbl_student.prestudent_id) LEFT JOIN lehre.tbl_note USING(note) WHERE vw_student_lehrveranstaltung.lehrveranstaltung_id=".$db->db_add_param($lvid, FHC_INTEGER)." - AND vw_student_lehrveranstaltung.studiensemester_kurzbz=".$db->db_add_param($stsem);";"; + AND vw_student_lehrveranstaltung.studiensemester_kurzbz=".$db->db_add_param($stsem);";"; if($lehreinheit_id!='') $qry.=" AND vw_student_lehrveranstaltung.lehreinheit_id=".$db->db_add_param($lehreinheit_id, FHC_INTEGER); $qry.=' ORDER BY nachname, vorname, person_id, tbl_bisio.bis, doubledegree DESC'; + if($result = $db->db_query($qry)) { $i=1; @@ -338,7 +339,7 @@ else $worksheet->write($lines,9, date('d.m.Y', strtotime($resultPr->datum)), $format_highlightright_date); $worksheet->write($lines,10, $resultPr->note, $format_highlightright); } - else + else { $worksheet->write($lines,9, '', $format_highlightright_date); $worksheet->write($lines,10, '', $format_highlightright); From c086eddfaecccaf40c3dc055f56f4a7f0ed1905e Mon Sep 17 00:00:00 2001 From: ma0068 Date: Mon, 8 May 2023 14:18:07 +0200 Subject: [PATCH 021/268] update Abfrage, delete testfiles --- application/inputFileTest.csv | 8 ----- application/tmp/inputFile.csv | 49 --------------------------- application/tmp/inputFileMitError.csv | 11 ------ application/tmp/inputFileUltra.csv | 8 ----- 4 files changed, 76 deletions(-) delete mode 100644 application/inputFileTest.csv delete mode 100644 application/tmp/inputFile.csv delete mode 100644 application/tmp/inputFileMitError.csv delete mode 100644 application/tmp/inputFileUltra.csv diff --git a/application/inputFileTest.csv b/application/inputFileTest.csv deleted file mode 100644 index 927dc0062..000000000 --- a/application/inputFileTest.csv +++ /dev/null @@ -1,8 +0,0 @@ -uid,studiensemester,moodle_course_shortname,moodle_course_fullname,moodle_course_url -aburaia,SS2016,BMR4_MLAB2_2016,BMR4_Mechatronics-Lab2_2016,https://moodle.technikum-wien.at/course/view.php?id=2948 -aburaia,WS2016,MMR-VZB-3-WS2016-PRJ,Projekt,https://moodle.technikum-wien.at/course/view.php?id=3643 -adams,SS2016,BEW-BB-4-SS2016-ENG/67791,Business English 2,https://moodle.technikum-wien.at/course/view.php?id=3034 -adams,SS2016,BEW-DL-2-SS2016-ENG,Technical and Creative Communication,https://moodle.technikum-wien.at/course/view.php?id=2873 -krizek,SS2016,BVU-VZ-6-SS2016-PSB,Praxissemesterbegleitung,https://moodle.technikum-wien.at/course/view.php?id=3157 -krizek,SS2016,MIT-VZ-2-SS2016-ITS PRJ I,ITS Project I,https://moodle.technikum-wien.at/course/view.php?id=3175 -krizek,WS2016,MSC-VZ-3-WS2016-IP2,ITS Project II,https://moodle.technikum-wien.at/course/view.php?id=3713 diff --git a/application/tmp/inputFile.csv b/application/tmp/inputFile.csv deleted file mode 100644 index 48411ca1a..000000000 --- a/application/tmp/inputFile.csv +++ /dev/null @@ -1,49 +0,0 @@ -uid,studiensemester,moodle_course_shortname,moodle_course_fullname,moodle_course_url -aburaia,SS2016,BMR4_MLAB2_2016,BMR4_Mechatronics-Lab2_2016,https://moodle.technikum-wien.at/course/view.php?id=2948 -aburaia,SS2016,BMR6_MES_2016,BMR6_Mechatronische-Systeme_2016,https://moodle.technikum-wien.at/course/view.php?id=2951 -aburaia,SS2016,BMR-VZ-6-SS2016-EMS,Entwurf mechatronischer Systeme,https://moodle.technikum-wien.at/course/view.php?id=2833 -aburaia,WS2016,BMB-VZ-5-WS2016-DF,Industrierobotik in der Digitalen Fabrik,https://moodle.technikum-wien.at/course/view.php?id=4188 -aburaia,WS2016,BMR5_PRAK_2016,BMR5_Berufspraktikum_2016,https://moodle.technikum-wien.at/course/view.php?id=3746 -aburaia,WS2016,BMR-VZ-3-WS2016-PJM,Projektmanagement,https://moodle.technikum-wien.at/course/view.php?id=3452 -aburaia,WS2016,MMR-3-WS2016_PROJ,MMR-3-WS2016 - Projekt,https://moodle.technikum-wien.at/course/view.php?id=3351 -aburaia,WS2016,MMR-BB-1-WS2016-BMECH,Mechatronik 1,https://moodle.technikum-wien.at/course/view.php?id=4038 -aburaia,WS2016,MMR-VZ-1-WS2016-VMECH,Mechatronik 1,https://moodle.technikum-wien.at/course/view.php?id=4037 -aburaia,WS2016,MMR-VZ-4-WS2016-MT,Master Thesis,https://moodle.technikum-wien.at/course/view.php?id=3956 -aburaia,WS2016,MMR-VZB-3-WS2016-PRJ,Projekt,https://moodle.technikum-wien.at/course/view.php?id=3643 -adams,SS2016,BEW-BB-4-SS2016-ENG/67791,Business English 2,https://moodle.technikum-wien.at/course/view.php?id=3034 -adams,SS2016,BEW-DL-2-SS2016-ENG,Technical and Creative Communication,https://moodle.technikum-wien.at/course/view.php?id=2873 -adams,SS2016,BEW-DL-4-SS2016-DLPS,Business Communication for Engineers,https://moodle.technikum-wien.at/course/view.php?id=2883 -adams,SS2016,BEW-DL-6-SS2016-ADC,Advanced Communication,https://moodle.technikum-wien.at/course/view.php?id=2897 -adams,SS2016,BIC-BB-2-SS2016-ENG/68928/68931,Technical and Creative Communication,https://moodle.technikum-wien.at/course/view.php?id=2898 -adams,SS2016,BIW-BB-2-SS2016-PTC/67947,BIW-BB-2-SS2016 - Professional & Technical Communication 2,https://moodle.technikum-wien.at/course/view.php?id=3020 -adams,SS2016,BWI-DL-4-SS2016-BUCdl,Business Communication,https://moodle.technikum-wien.at/course/view.php?id=2879 -adams,SS2016,EWU-VZ-1-SS2016-WUE1,Warm-up Englisch 1,https://moodle.technikum-wien.at/course/view.php?id=3415 -adams,SS2016,MGR-VZ-4-SS2016-ENG/67338,Intensiv Englisch,https://moodle.technikum-wien.at/course/view.php?id=3174 -adams,WS2016,BEW-DL-3-WS2016-DLGI,General Information,https://moodle.technikum-wien.at/course/view.php?id=3481 -adams,WS2016,BEW-DL-3-WS2016-EC,Economics Technology and Society,https://moodle.technikum-wien.at/course/view.php?id=3414 -adams,WS2016,BIC-BB-1-WS2016-PSC/70705/70740,Professional and Social Communication,https://moodle.technikum-wien.at/course/view.php?id=3559 -adams,WS2016,BIW-BB-1-WS2016-PTC/73126,BIW-BB-1-WS2016 - Professional and Technical Communication 1,https://moodle.technikum-wien.at/course/view.php?id=3403 -adams,WS2016,BIW-BB-3-WS2016-EBE/72699,English for Business and Engineering,https://moodle.technikum-wien.at/course/view.php?id=3938 -adams,WS2016,BSA-VZ-1-WS2016-PSC,Professional and Social Communication,https://moodle.technikum-wien.at/course/view.php?id=3747 -adams,WS2016,BSA-VZ-3-WS2016-TCC,Technical and Creative Communication ,https://moodle.technikum-wien.at/course/view.php?id=3748 -adams,WS2016,BWI-DL-3-WS2016-ENGdl,Econonmics Technology and Society,https://moodle.technikum-wien.at/course/view.php?id=3608 -adensam,SS2016,MEE-BB-2-SS2016-BEV,Bewertungsverfahren,https://moodle.technikum-wien.at/course/view.php?id=2955 -adensam,WS2016,MEE-BB-3-WS2016-ERT,Energierecht,https://moodle.technikum-wien.at/course/view.php?id=3964 -adensam,WS2016,MEE-BB-3-WS2016-EWT,Energiewirtschaft,https://moodle.technikum-wien.at/course/view.php?id=3794 -adensam,WS2016,MUT-BB-3-WS2016-EM,Energiemanagement,https://moodle.technikum-wien.at/course/view.php?id=3676 -kraft,WS2016,MWI-DL-3-WS2016-MBdl,Mobile Business,https://moodle.technikum-wien.at/course/view.php?id=3589 -kraft,WS2016,MWI-PT-1-WS2016-ITSCpt,IT Strategy and IT Controlling,https://moodle.technikum-wien.at/course/view.php?id=3560 -kraft,WS2016,MWI-PT-3-WS2016-MBpt,Mobile Business,https://moodle.technikum-wien.at/course/view.php?id=3590 -kralc,SS2016,MEE-BB-2-SS2020-AS Anlagentechnik und Simulation (mit Modelica und Dymola),Anlagentechnik und Simulation mit Modelica und Dymola,https://moodle.technikum-wien.at/course/view.php?id=3025 -krametz,WS2016,WS2016-BEE3-ALB,WS2016-BEE3-ALB,https://moodle.technikum-wien.at/course/view.php?id=3624 -kratochv,SS2016,BST-VZ-2-SS2016-MTL,Materialtechnologie - Labor I,https://moodle.technikum-wien.at/course/view.php?id=3332 -kravtche,WS2016,BEW-BB-1-WS2016-LAB,Labor 1,https://moodle.technikum-wien.at/course/view.php?id=3734 -krenn,SS2016,BEW-DL-2-SS2016-PHY/67684,Physics 1,https://moodle.technikum-wien.at/course/view.php?id=2862 -krenn,WS2016,BEW-BB-5-WS2016-WIA,Wissenschaftliches Arbeiten,https://moodle.technikum-wien.at/course/view.php?id=3716 -krenn,WS2016,BEW-DL-3-WS2016-DLGI,General Information,https://moodle.technikum-wien.at/course/view.php?id=3481 -krenn,WS2016,BEW-DL-3-WS2016-PHY,Physics 2,https://moodle.technikum-wien.at/course/view.php?id=3378 -krennk,WS2016,BST-VZ-5-WS2016-BA1-MBAP3,Bachelorarbeit 1 - MBA Projekt 3 ,https://moodle.technikum-wien.at/course/view.php?id=3527 -krennm,SS2016,BBE-VZ-4-SS2016-CSA,Circuitdesign and Signal Analysis,https://moodle.technikum-wien.at/course/view.php?id=2956 -krizek,SS2016,BVU-VZ-6-SS2016-PSB,Praxissemesterbegleitung,https://moodle.technikum-wien.at/course/view.php?id=3157 -krizek,SS2016,MIT-VZ-2-SS2016-ITS PRJ I,ITS Project I,https://moodle.technikum-wien.at/course/view.php?id=3175 -krizek,WS2016,MSC-VZ-3-WS2016-IP2,ITS Project II,https://moodle.technikum-wien.at/course/view.php?id=3713 diff --git a/application/tmp/inputFileMitError.csv b/application/tmp/inputFileMitError.csv deleted file mode 100644 index 26c53a78d..000000000 --- a/application/tmp/inputFileMitError.csv +++ /dev/null @@ -1,11 +0,0 @@ -uid,studiensemester,moodle_course_shortname,moodle_course_fullname,moodle_course_url -aburaia,SS2016,BMR4_MLAB2_2016,BMR4_Mechatronics-Lab2_2016,https://moodle.technikum-wien.at/course/view.php?id=2948 -aburaia,WS2016,MMR-VZB-3-WS2016-PRJ,,https://moodle.technikum-wien.at/course/view.php?id=3643 -adams,SS2016,BEW-BB-4-SS2016-ENG/67791,Business English 2,https://moodle.technikum-wien.at/course/view.php?id=3034 -adams,SS2016,,Technical and Creative Communication,https://moodle.technikum-wien.at/course/view.php?id=2873 -krizek,SS2016,BVU-VZ-6-SS2016-PSB,Praxissemesterbegleitung, -krizek,SS2016,MIT-VZ-2-SS2016-ITS PRJ I,ITS Project I,https://moodle.technikum-wien.at/course/view.php?id=3175 -krizek,WS2016,MSC-VZ-3-WS2016-IP2,ITS Project II,https://moodle.technikum-wien.at/course/view.php?id=3713 -kraft,WS2016,MWI-DL-3-WS2016-MBdl,Mobile Business,https://moodle.technikum-wien.at/course/view.php?id=3589 -kraft,,MWI-PT-1-WS2016-ITSCpt,IT Strategy and IT Controlling,https://moodle.technikum-wien.at/course/view.php?id=3560 -kraft,WS2016,MWI-PT-3-WS2016-MBpt,Mobile Business,https://moodle.technikum-wien.at/course/view.php?id=3590 diff --git a/application/tmp/inputFileUltra.csv b/application/tmp/inputFileUltra.csv deleted file mode 100644 index 927dc0062..000000000 --- a/application/tmp/inputFileUltra.csv +++ /dev/null @@ -1,8 +0,0 @@ -uid,studiensemester,moodle_course_shortname,moodle_course_fullname,moodle_course_url -aburaia,SS2016,BMR4_MLAB2_2016,BMR4_Mechatronics-Lab2_2016,https://moodle.technikum-wien.at/course/view.php?id=2948 -aburaia,WS2016,MMR-VZB-3-WS2016-PRJ,Projekt,https://moodle.technikum-wien.at/course/view.php?id=3643 -adams,SS2016,BEW-BB-4-SS2016-ENG/67791,Business English 2,https://moodle.technikum-wien.at/course/view.php?id=3034 -adams,SS2016,BEW-DL-2-SS2016-ENG,Technical and Creative Communication,https://moodle.technikum-wien.at/course/view.php?id=2873 -krizek,SS2016,BVU-VZ-6-SS2016-PSB,Praxissemesterbegleitung,https://moodle.technikum-wien.at/course/view.php?id=3157 -krizek,SS2016,MIT-VZ-2-SS2016-ITS PRJ I,ITS Project I,https://moodle.technikum-wien.at/course/view.php?id=3175 -krizek,WS2016,MSC-VZ-3-WS2016-IP2,ITS Project II,https://moodle.technikum-wien.at/course/view.php?id=3713 From d4653bc89fadc01b4560b1b10a3f119e59689d7e Mon Sep 17 00:00:00 2001 From: Manfred Date: Mon, 15 May 2023 12:10:25 +0200 Subject: [PATCH 022/268] Neue Rechte anlegen und bestehende bearbeiten --- include/berechtigung.class.php | 26 +- include/tw/vilesci_menu_main.inc.php | 2 + .../benutzerberechtigung_details.php | 3 +- .../benutzerberechtigung_uebersicht.php | 2 +- vilesci/stammdaten/berechtigungen.php | 218 ++++++++++++++++ vilesci/stammdaten/berechtigungrolle.php | 236 ++++++++++++++++++ 6 files changed, 483 insertions(+), 4 deletions(-) create mode 100644 vilesci/stammdaten/berechtigungen.php diff --git a/include/berechtigung.class.php b/include/berechtigung.class.php index ab224be4d..e7be01283 100644 --- a/include/berechtigung.class.php +++ b/include/berechtigung.class.php @@ -103,14 +103,38 @@ class berechtigung extends basis_db return false; } } + + /** + * Loescht ein Recht + * + * @param $berechtigung_kurzbz + */ + public function delete($berechtigung_kurzbz) + { + $qry = "DELETE FROM system.tbl_berechtigung WHERE berechtigung_kurzbz=".$this->db_add_param($berechtigung_kurzbz).";"; + + if($this->db_query($qry)) + { + return true; + } + else + { + $this->errormsg = 'Fehler beim Löschen des Rechts:'.$this->db_last_error(); + return false; + } + } /** * Holt alle BerechtigungsRollen * @return true wenn erfolgreich, false im Fehlerfall */ - public function getRollen() + public function getRollen($order = null) { $qry = 'SELECT * FROM system.tbl_rolle'; + if ($order != '') + { + $qry .= " ORDER BY $order"; + } if($this->db_query($qry)) { diff --git a/include/tw/vilesci_menu_main.inc.php b/include/tw/vilesci_menu_main.inc.php index 204feeec3..7b6f52e85 100644 --- a/include/tw/vilesci_menu_main.inc.php +++ b/include/tw/vilesci_menu_main.inc.php @@ -137,8 +137,10 @@ $menu=array 'User'=>array ( 'name'=>'User', 'permissions'=>array('basis/variable','basis/berechtigung'), + 'Rechte'=>array('name'=>'Rechte', 'link'=>'stammdaten/berechtigungen.php', 'target'=>'main','permissions'=>array('basis/berechtigung')), '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')), + '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 diff --git a/vilesci/stammdaten/benutzerberechtigung_details.php b/vilesci/stammdaten/benutzerberechtigung_details.php index 4cee06950..7ae0e711b 100644 --- a/vilesci/stammdaten/benutzerberechtigung_details.php +++ b/vilesci/stammdaten/benutzerberechtigung_details.php @@ -479,12 +479,11 @@ if(isset($_POST['copy']) && $_POST['copy'] != '') if (!$b = new berechtigung()) die($b->errormsg); -$b->getRollen(); +$b->getRollen('rolle_kurzbz'); foreach($b->result as $berechtigung) { $rolle_arr[$berechtigung->rolle_kurzbz] = $berechtigung->beschreibung; } -ksort($rolle_arr, SORT_STRING | SORT_FLAG_CASE); $b->getBerechtigungen(); foreach($b->result as $berechtigung) diff --git a/vilesci/stammdaten/benutzerberechtigung_uebersicht.php b/vilesci/stammdaten/benutzerberechtigung_uebersicht.php index ecc9c6e09..d986d6642 100644 --- a/vilesci/stammdaten/benutzerberechtigung_uebersicht.php +++ b/vilesci/stammdaten/benutzerberechtigung_uebersicht.php @@ -251,7 +251,7 @@ $htmlstr=' + '.(256 - strlen($recht->beschreibung)).' + + + + + '; + } + else + { + echo ' + + '.$recht->berechtigung_kurzbz.' + '.$recht->beschreibung.' + + + Bearbeiten + + + + + Recht löschen + + + '; + } + } + echo ' + + + +
'; + + echo '
+

Neues Recht einfügen

+ Kurzbz: + Beschreibung: + 256 +   +
+
+ +'; + ?> diff --git a/vilesci/stammdaten/berechtigungrolle.php b/vilesci/stammdaten/berechtigungrolle.php index e33057d59..82430d64e 100644 --- a/vilesci/stammdaten/berechtigungrolle.php +++ b/vilesci/stammdaten/berechtigungrolle.php @@ -1,3 +1,239 @@ + + * 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 +   +
+
+ +'; + ?> + + + + + + + + + + + + + + + + + + Date: Wed, 17 May 2023 08:41:04 +0200 Subject: [PATCH 023/268] - details bei abgewiesenen --- .../controllers/system/infocenter/InfoCenter.php | 11 +++++++++-- .../system/infocenter/infocenterAbgewiesenData.php | 11 +++++++++++ .../views/system/infocenter/infocenterDetails.php | 3 ++- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/application/controllers/system/infocenter/InfoCenter.php b/application/controllers/system/infocenter/InfoCenter.php index 548b071d3..1e6639d25 100644 --- a/application/controllers/system/infocenter/InfoCenter.php +++ b/application/controllers/system/infocenter/InfoCenter.php @@ -314,7 +314,7 @@ class InfoCenter extends Auth_Controller show_error('Person does not exist!'); $origin_page = $this->input->get(self::ORIGIN_PAGE); - if ($origin_page == self::INDEX_PAGE) + if (in_array($origin_page, array(self::INDEX_PAGE, self::ABGEWIESEN_PAGE))) { // mark person as locked for editing $result = $this->PersonLockModel->lockPerson($person_id, $this->_uid, self::APP); @@ -359,7 +359,14 @@ class InfoCenter extends Auth_Controller if (isError($result)) show_error(getError($result)); - $redirectLink = '/'.self::INFOCENTER_URI.'?'.self::FHC_CONTROLLER_ID.'='.$this->getControllerId(); + $origin_page = $this->input->get(self::ORIGIN_PAGE); + + if ($origin_page === self::ABGEWIESEN_PAGE) + $redirectLink = self::INFOCENTER_URI. '/' .self::ABGEWIESEN_PAGE; + else + $redirectLink = '/'.self::INFOCENTER_URI; + + $redirectLink .= '?'.self::FHC_CONTROLLER_ID.'='.$this->getControllerId(); // Force reload of Dataset after Unlock $redirectLink .= '&'.self::KEEP_TABLESORTER_FILTER.'=true'; diff --git a/application/views/system/infocenter/infocenterAbgewiesenData.php b/application/views/system/infocenter/infocenterAbgewiesenData.php index d09f0f41e..94d3d6ee1 100644 --- a/application/views/system/infocenter/infocenterAbgewiesenData.php +++ b/application/views/system/infocenter/infocenterAbgewiesenData.php @@ -70,6 +70,7 @@ $query = ' 'requiredPermissions' => 'infocenter', 'datasetRepresentation' => 'tablesorter', 'checkboxes' => 'PersonId', + 'additionalColumns' => array('Details'), 'columnsAliases' => array( 'PersonId', 'PreStudentID', @@ -82,6 +83,16 @@ $query = ' ), 'formatRow' => function($datasetRaw) { + /* NOTE: Dont use $this here for PHP Version compatibility */ + $datasetRaw->{'Details'} = sprintf( + 'Details', + site_url('system/infocenter/InfoCenter/showDetails'), + $datasetRaw->{'PersonId'}, + 'abgewiesen', + (isset($_GET['fhc_controller_id']) ? $_GET['fhc_controller_id'] : ''), + (isset($_GET['filter_id']) ? $_GET['filter_id'] : '') + ); + if ($datasetRaw->{'Nachricht'} === null) { $datasetRaw->{'Nachricht'} = 'Nein'; diff --git a/application/views/system/infocenter/infocenterDetails.php b/application/views/system/infocenter/infocenterDetails.php index 401e34099..c61bb3cd2 100644 --- a/application/views/system/infocenter/infocenterDetails.php +++ b/application/views/system/infocenter/infocenterDetails.php @@ -57,10 +57,11 @@ if (isset($lockedby)): echo $this->p->t('global', 'wirdBearbeitetVon').': '; echo $lockedby; - if ($origin_page == 'index'): + if (in_array($origin_page, array('index', 'abgewiesen'))): $unlockpath = 'unlockPerson/'.$stammdaten->person_id; $unlockpath .= '?fhc_controller_id='.$fhc_controller_id; $unlockpath .= '&filter_id='.$prev_filter_id; + $unlockpath .= '&origin_page='.$origin_page; ?>    From 8584be651b00498d8d03395cfc3469e5fb46c528 Mon Sep 17 00:00:00 2001 From: ma0048 Date: Wed, 17 May 2023 15:06:39 +0200 Subject: [PATCH 024/268] - sperren von rts bearbeitet --- vilesci/stammdaten/auswertung_fhtw.php | 103 +++++++++++++++++++------ 1 file changed, 79 insertions(+), 24 deletions(-) diff --git a/vilesci/stammdaten/auswertung_fhtw.php b/vilesci/stammdaten/auswertung_fhtw.php index e5975b651..2d3d1bc61 100644 --- a/vilesci/stammdaten/auswertung_fhtw.php +++ b/vilesci/stammdaten/auswertung_fhtw.php @@ -490,22 +490,58 @@ if ($rtprueflingEntSperren) exit(); } - if (isset($_POST['prestudent_id']) && is_numeric($_POST['prestudent_id']) + if (isset($_POST['person_id']) && is_numeric($_POST['person_id']) && isset($_POST['art'])) { - $qry = "UPDATE testtool.tbl_pruefling SET gesperrt =" . $db->db_add_param($_POST['art'], 'BOOLEAN') . " - WHERE prestudent_id IN - (SELECT prestudent_id FROM public.tbl_prestudent ps - JOIN public.tbl_person tp ON tp.person_id = ps.person_id - WHERE tp.person_id = (SELECT person_id FROM public.tbl_prestudent sps WHERE sps.prestudent_id = " . $db->db_add_param($_POST['prestudent_id']) . "));"; + $qry = "SELECT pruefling_id + FROM testtool.tbl_pruefling + WHERE prestudent_id IN ( + SELECT prestudent_id + FROM public.tbl_prestudent + WHERE person_id = ". $db->db_add_param($_POST['person_id']) . " + )"; + if ($result = $db->db_query($qry)) { - $msg = $_POST['art'] === 'false' ? 'Pruefling wurde gesperrt' : 'Pruefling wurde freigeschaltet'; - echo json_encode(array( - 'status' => 'ok', - 'msg' => $msg)); - exit(); + + if ($db->db_num_rows($result) === 0) + { + echo json_encode(array( + 'status' => 'warning', + 'msg' => 'Kein Pruefling gefunden!' + )); + exit(); + } + else + { + $pruefling_ids = array(); + while ($row = $db->db_fetch_object($result)) + { + $pruefling_ids[] = $row->pruefling_id; + } + + + $qry = "UPDATE testtool.tbl_pruefling SET gesperrt =" . $db->db_add_param($_POST['art'], 'BOOLEAN') . " + WHERE pruefling_id IN (" . $db->db_implode4SQL($pruefling_ids) . ")"; + + if ($result_update = $db->db_query($qry)) + { + $msg = $_POST['art'] === 'false' ? 'Pruefling wurde gesperrt' : 'Pruefling wurde freigeschaltet'; + echo json_encode(array( + 'status' => 'ok', + 'msg' => $msg)); + exit(); + } + else + { + echo json_encode(array( + 'status' => 'fehler', + 'msg' => 'Fehler beim speichern der Daten' + )); + exit(); + } + } } else { @@ -1650,6 +1686,7 @@ if (isset($_REQUEST['reihungstest']) || isset($_POST['rtauswsubmit'])) } $gebiete_arr = array(); + $gesperrt_arr = array(); while ($row = $db->db_fetch_object($result)) { // Hack für BEW-BB, wenn auch BEW-DL-Ergebnisse vorliegen @@ -1666,7 +1703,10 @@ if (isset($_REQUEST['reihungstest']) || isset($_POST['rtauswsubmit'])) $ergebnis[$row->prestudent_id] = new stdClass(); $gebiete_arr[$row->prestudent_id] = array(); } - + + if (!isset($gesperrt_arr[$row->person_id])) + $gesperrt_arr[$row->person_id] = new stdClass(); + $ergebnis[$row->prestudent_id]->prestudent_id = $row->prestudent_id; $ergebnis[$row->prestudent_id]->person_id = $row->person_id; $ergebnis[$row->prestudent_id]->reihungstest_id = $row->reihungstest_id; @@ -1678,7 +1718,6 @@ if (isset($_REQUEST['reihungstest']) || isset($_POST['rtauswsubmit'])) $ergebnis[$row->prestudent_id]->geschlecht = $row->geschlecht; $ergebnis[$row->prestudent_id]->idnachweis = $row->idnachweis; $ergebnis[$row->prestudent_id]->registriert = $row->registriert; - $ergebnis[$row->prestudent_id]->gesperrt = $row->gesperrt; $ergebnis[$row->prestudent_id]->stg_kurzbz = $row->stg_kurzbz; $ergebnis[$row->prestudent_id]->stg_bez = $row->stg_bez; $ergebnis[$row->prestudent_id]->ausbildungssemester = $row->ausbildungssemester; @@ -1690,6 +1729,13 @@ if (isset($_REQUEST['reihungstest']) || isset($_POST['rtauswsubmit'])) $ergebnis[$row->prestudent_id]->teilgenommen = $db->db_parse_bool($row->teilgenommen); $ergebnis[$row->prestudent_id]->qualifikationskurs = $db->db_parse_bool($row->qualifikationskurs); $ergebnis[$row->prestudent_id]->letzter_status = $row->letzter_status; + $ergebnis[$row->prestudent_id]->gesperrt = $row->gesperrt; + + $gesperrt = $db->db_parse_bool($row->gesperrt); + if (!isset($gesperrt_arr[$row->person_id]->gesperrt) || ($gesperrt_arr[$row->person_id]->gesperrt !== true && $gesperrt === true)) + { + $gesperrt_arr[$row->person_id]->gesperrt = $gesperrt; + } if (!isset($ergebnis[$row->prestudent_id]->gebiet[$row->gebiet_id])) { @@ -2440,7 +2486,7 @@ else }); } } - function prueflingEntSperren(prestudent_id, name, art) + function prueflingEntSperren(person_id, name, art) { if (art === true) var text = "sperren"; @@ -2450,7 +2496,7 @@ else if (confirm("Wollen Sie den Studenten "+ name + " wirklich " + text + "?")) { data = { - prestudent_id: prestudent_id, + person_id: person_id, art: art, rtprueflingEntSperren: true }; @@ -2464,21 +2510,30 @@ else { if(data.status !== "ok") { - $("#msgbox").attr("class","alert alert-danger"); - $("#msgbox").show(); - $("#msgbox").html(data["msg"]); + if (data.status === "warning") + { + $("#msgbox").attr("class","alert alert-warning"); + $("#msgbox").show(); + $("#msgbox").html(data["msg"]); + } + else + { + $("#msgbox").attr("class","alert alert-danger"); + $("#msgbox").show(); + $("#msgbox").html(data["msg"]); + } } else { if (art === true) { - $("#prueflingentsperren_" + prestudent_id).removeClass("hidden"); - $("#prueflingsperren_" + prestudent_id).addClass("hidden"); + $(".prueflingentsperren_" + person_id).removeClass("hidden"); + $(".prueflingsperren_" + person_id).addClass("hidden"); } else if (art === false) { - $("#prueflingsperren_" + prestudent_id).removeClass("hidden"); - $("#prueflingentsperren_" + prestudent_id).addClass("hidden"); + $(".prueflingsperren_" + person_id).removeClass("hidden"); + $(".prueflingentsperren_" + person_id).addClass("hidden"); } } }, @@ -3293,10 +3348,10 @@ else echo " - + - + "; From 54de577eee823a1e4def530cd2b43046fec1feae Mon Sep 17 00:00:00 2001 From: ma0048 Date: Wed, 17 May 2023 15:08:52 +0200 Subject: [PATCH 025/268] - ausblenden des warnings --- vilesci/stammdaten/auswertung_fhtw.php | 1 + 1 file changed, 1 insertion(+) diff --git a/vilesci/stammdaten/auswertung_fhtw.php b/vilesci/stammdaten/auswertung_fhtw.php index 2d3d1bc61..e72c03bc5 100644 --- a/vilesci/stammdaten/auswertung_fhtw.php +++ b/vilesci/stammdaten/auswertung_fhtw.php @@ -2515,6 +2515,7 @@ else $("#msgbox").attr("class","alert alert-warning"); $("#msgbox").show(); $("#msgbox").html(data["msg"]); + $("#msgbox").html(data["msg"]).delay(2000).fadeOut(); } else { From 2f573263ba5cb3d00ef3e018cf2684048ef32b7c Mon Sep 17 00:00:00 2001 From: ma0048 Date: Wed, 17 May 2023 16:00:34 +0200 Subject: [PATCH 026/268] - abfrage ob der pruefling bereits gesperrt ist --- cis/testtool/frage.php | 2 +- include/pruefling.class.php | 26 ++++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/cis/testtool/frage.php b/cis/testtool/frage.php index 6f47992a1..9f6cd4fb7 100644 --- a/cis/testtool/frage.php +++ b/cis/testtool/frage.php @@ -161,7 +161,7 @@ if(!isset($_SESSION['pruefling_id'])) $pruefling = new pruefling(); $pruefling->load($_SESSION['pruefling_id']); -if ($pruefling->gesperrt === 't') +if ($pruefling->isGesperrt($_SESSION['pruefling_id'])) die(""); if (!in_array($gebiet_id, $_SESSION['alleGebiete'])) diff --git a/include/pruefling.class.php b/include/pruefling.class.php index fc64d90c4..2a482d793 100644 --- a/include/pruefling.class.php +++ b/include/pruefling.class.php @@ -557,5 +557,31 @@ class pruefling extends basis_db return false; } } + + public function isGesperrt($pruefling_id) + { + $qry = "SELECT spruefling.gesperrt + FROM testtool.tbl_pruefling + JOIN public.tbl_prestudent USING(prestudent_id) + JOIN public.tbl_person USING (person_id) + JOIN public.tbl_prestudent pss ON pss.person_id = tbl_person.person_id + JOIN testtool.tbl_pruefling spruefling ON pss.prestudent_id = spruefling.prestudent_id + WHERE tbl_pruefling.pruefling_id = ".$this->db_add_param($pruefling_id, FHC_INTEGER)." + AND spruefling.gesperrt + LIMIT 1"; + + if($result = $this->db_query($qry)) + { + if ($this->db_num_rows($result) == 0) + return false; + else + return true; + } + else + { + $this->errormsg = 'Fehler bei einer Abfrage'; + return false; + } + } } ?> From 311d235fda8cad5e69ac78702ef50a4106c45c4c Mon Sep 17 00:00:00 2001 From: ma0048 Date: Wed, 17 May 2023 16:35:22 +0200 Subject: [PATCH 027/268] - abgewiesene gesperrt von spalte --- .../infocenter/infocenterAbgewiesenData.php | 33 +++++++++++++++++++ system/filtersupdate.php | 3 +- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/application/views/system/infocenter/infocenterAbgewiesenData.php b/application/views/system/infocenter/infocenterAbgewiesenData.php index 94d3d6ee1..2307ea87e 100644 --- a/application/views/system/infocenter/infocenterAbgewiesenData.php +++ b/application/views/system/infocenter/infocenterAbgewiesenData.php @@ -1,6 +1,7 @@ config->load('infocenter'); + $APP = '\'infocenter\''; $ABGEWIESENEN_STATUS = '\'Abgewiesener\''; $STUDIENGANG_TYP = '\''.$this->variablelib->getVar('infocenter_studiensgangtyp').'\''; $ADDITIONAL_STG = $this->config->item('infocenter_studiengang_kz'); @@ -17,6 +18,8 @@ $query = ' p.nachname AS "Nachname", so.studiengangkurzbzlang as "Studiengang", pss.insertamum AS "AbgewiesenAm", + pl.zeitpunkt AS "LockDate", + pl.lockuser AS "LockUser", ( SELECT l.zeitpunkt FROM system.tbl_log l @@ -54,6 +57,15 @@ $query = ' JOIN public.tbl_studiengang sg USING(studiengang_kz) JOIN lehre.tbl_studienplan sp USING(studienplan_id) JOIN lehre.tbl_studienordnung so USING(studienordnung_id) + LEFT JOIN ( + SELECT tpl.person_id, + tpl.zeitpunkt, + sp.nachname AS lockuser + FROM system.tbl_person_lock tpl + JOIN public.tbl_benutzer sb USING (uid) + JOIN public.tbl_person sp ON sb.person_id = sp.person_id + WHERE tpl.app = '.$APP.' + ) pl USING(person_id) WHERE pss.status_kurzbz = '. $ABGEWIESENEN_STATUS .' AND pss.studiensemester_kurzbz = '. $STUDIENSEMESTER .' AND (sg.typ IN ('. $STUDIENGANG_TYP .') @@ -78,6 +90,8 @@ $query = ' ucfirst($this->p->t('person', 'nachname')), ucfirst($this->p->t('lehre', 'studiengang')), ucfirst($this->p->t('infocenter', 'abgewiesenam')), + ucfirst($this->p->t('global', 'sperrdatum')), + ucfirst($this->p->t('global', 'gesperrtVon')), ucfirst($this->p->t('global', 'nachricht')), ucfirst($this->p->t('infocenter', 'kaution')) ), @@ -114,10 +128,29 @@ $query = ' { $datasetRaw->{'Kaution'} = 'Offen'; } + + if ($datasetRaw->{'LockDate'} == null) + { + $datasetRaw->{'LockDate'} = '-'; + } + + if ($datasetRaw->{'LockUser'} == null) + { + $datasetRaw->{'LockUser'} = '-'; + } $datasetRaw->{'AbgewiesenAm'} = date_format(date_create($datasetRaw->{'AbgewiesenAm'}),'Y-m-d H:i'); return $datasetRaw; + }, + + 'markRow' => function($datasetRaw) { + + if ($datasetRaw->LockDate != null) + { + return FilterWidget::DEFAULT_MARK_ROW_CLASS; + } } + ); echo $this->widgetlib->widget('FilterWidget', $filterWidgetArray); diff --git a/system/filtersupdate.php b/system/filtersupdate.php index 2ed253422..abdea4532 100644 --- a/system/filtersupdate.php +++ b/system/filtersupdate.php @@ -520,7 +520,8 @@ $filters = array( {"name": "Studiengang"}, {"name": "AbgewiesenAm"}, {"name": "Nachricht"}, - {"name": "Kaution"} + {"name": "Kaution"}, + {"name": "LockUser"} ], "filters": [] } From 5001713d16177e0470bb443337289e3ded3c9da7 Mon Sep 17 00:00:00 2001 From: ma0068 Date: Fri, 19 May 2023 07:51:25 +0200 Subject: [PATCH 028/268] Erzwingen von Reload nach jeder Freigabe --- .../benotungstool/lvgesamtnoteverwalten.php | 288 +++++++++--------- 1 file changed, 146 insertions(+), 142 deletions(-) diff --git a/cis/private/lehre/benotungstool/lvgesamtnoteverwalten.php b/cis/private/lehre/benotungstool/lvgesamtnoteverwalten.php index d498636ae..c32fa43e6 100644 --- a/cis/private/lehre/benotungstool/lvgesamtnoteverwalten.php +++ b/cis/private/lehre/benotungstool/lvgesamtnoteverwalten.php @@ -104,6 +104,152 @@ $sprachen->getAll(true); $errormsg = ''; +// eingetragene lv-gesamtnoten freigeben +if (isset($_REQUEST["freigabe"]) && ($_REQUEST["freigabe"] == 1)) +{ + // Passwort pruefen + if (checkldapuser($user, $_REQUEST['passwort'])) + { + $jetzt = date("Y-m-d H:i:s"); + $neuenoten = 0; + + $studlist = " + "; + + // entweder personenbezogene Daten einbinden + if (defined('CIS_GESAMTNOTE_FREIGABEMAIL_NOTE') && CIS_GESAMTNOTE_FREIGABEMAIL_NOTE) + { + $studlist .= " + + + + + "; + + if (defined('CIS_GESAMTNOTE_PUNKTE') && CIS_GESAMTNOTE_PUNKTE) + { + $studlist .= "\n"; + } + $studlist .= "\n"; + + $studlist .= "\n"; + } + // oder anonymisiert nur die UIDs einbinden + else + { + $studlist .= " + \n + "; + } + + // studentenquery + $qry_stud = "SELECT + DISTINCT uid, vorname, nachname, matrikelnr, kurzbzlang + FROM + campus.vw_student_lehrveranstaltung + JOIN campus.vw_student USING(uid) + JOIN public.tbl_studiengang ON campus.vw_student.studiengang_kz = public.tbl_studiengang.studiengang_kz + WHERE + studiensemester_kurzbz = " . $db->db_add_param($stsem) . " + AND lehrveranstaltung_id = " . $db->db_add_param($lvid, FHC_INTEGER) . " + ORDER BY nachname, vorname "; + if ($result_stud = $db->db_query($qry_stud)) + { + $i = 1; + while ($row_stud = $db->db_fetch_object($result_stud)) + { + $lvgesamtnote = new lvgesamtnote(); + if ($lvgesamtnote->load($lvid, $row_stud->uid, $stsem)) + { + if ($lvgesamtnote->benotungsdatum > $lvgesamtnote->freigabedatum) + { + $lvgesamtnote->freigabedatum = $jetzt; + $lvgesamtnote->freigabevon_uid = $user; + $lvgesamtnote->save(); + + if (defined('CIS_GESAMTNOTE_FREIGABEMAIL_NOTE') && CIS_GESAMTNOTE_FREIGABEMAIL_NOTE) + { + $studlist .= ""; + $studlist .= ""; + $studlist .= ""; + $studlist .= ""; + + if (defined('CIS_GESAMTNOTE_PUNKTE') && CIS_GESAMTNOTE_PUNKTE) + { + $studlist .= "\n"; + } + $studlist .= ""; + + $studlist .= "\n"; + } + else + { + $studlist .= "\n"; + } + + $neuenoten ++; + } + } + } + } + + $studlist .= "
" . $p->t('global/personenkz') . "" . $p->t('global/studiengang') . "" . $p->t('global/nachname') . "" . $p->t('global/vorname') . "" . $p->t('benotungstool/punkte') . "" . $p->t('benotungstool/note') . "" . $p->t('benotungstool/bearbeitetvon') . "
" . $p->t('global/uid') . "
" . trim($row_stud->matrikelnr) . "" . trim($row_stud->kurzbzlang) . "" . trim($row_stud->nachname) . "" . trim($row_stud->vorname) . ""; + if ($lvgesamtnote->punkte != '') + $studlist .= trim(number_format($lvgesamtnote->punkte, 2)); + $studlist .= "" . $noten_array[trim($lvgesamtnote->note)]['bezeichnung_mehrsprachig'][$sprache] . "" . $lvgesamtnote->mitarbeiter_uid; + if ($lvgesamtnote->updatevon != '') + $studlist .= " (" . $lvgesamtnote->updatevon . ")"; + $studlist .= "
" . trim($row_stud->uid) . "
"; + + // mail an assistentin und den user selber verschicken + if ($neuenoten > 0) + { + $lv = new lehrveranstaltung($lvid); + $sg = new studiengang($lv->studiengang_kz); + $lektor_adresse = $user . "@" . DOMAIN; + $adressen = $sg->email . ", " . $user . "@" . DOMAIN; + + $studienplan = new studienplan(); + $studienplan->getStudienplanLehrveranstaltung($lvid, $stsem); + $studienplan_bezeichnung = ''; + foreach ($studienplan->result as $row) + $studienplan_bezeichnung .= $row->bezeichnung . ' '; + + $mit = new mitarbeiter(); + $mit->load($user); + $name = $mit->anrede.' '.$mit->vorname.' '.$mit->nachname.' ('.$mit->kurzbz.')'; + + $betreff = 'Notenfreigabe ' . $lv->bezeichnung . ' ' . $lv->orgform_kurzbz . ' - ' . $studienplan_bezeichnung; + $mail = new mail($adressen, 'vilesci@' . DOMAIN, $betreff, ''); + $htmlcontent = " + + $name hat neue Noten für die Lehrveranstaltung\n\n
+ " . $sg->kuerzel . ' ' . $lv->semester . '.Semester + ' . $lv->bezeichnung . " " . $lv->orgform_kurzbz . " - " . $stsem . " +
eingetragen.\n

+ Die Noten können jetzt ins Zeugnis übernommen werden.\n"; + + $htmlcontent .= $studlist; + + $htmlcontent.= " +
Anzahl der Noten:" . $neuenoten . " +

" . $p->t('abgabetool/mailVerschicktAn') . ": " . $adressen . " + "; + $mail->setHTMLContent($htmlcontent); + $mail->setReplyTo($lektor_adresse); + $mail->send(); + } + + http_response_code(303); + header('Location: ' . $_SERVER['REQUEST_URI']); + exit; + } + else + { + $errormsg = $p->t('gesamtnote/passwortFalsch'); + } +} + echo ' @@ -926,148 +1072,6 @@ if (defined('CIS_ANWESENHEITSLISTE_NOTENLISTE_ANZEIGEN') && CIS_ANWESENHEITSLIST echo "
" . $p->t('benotungstool/notenlisteImport') . ""; } -// eingetragene lv-gesamtnoten freigeben -if (isset($_REQUEST["freigabe"]) && ($_REQUEST["freigabe"] == 1)) -{ - // Passwort pruefen - if (checkldapuser($user, $_REQUEST['passwort'])) - { - $jetzt = date("Y-m-d H:i:s"); - $neuenoten = 0; - - $studlist = " - "; - - // entweder personenbezogene Daten einbinden - if (defined('CIS_GESAMTNOTE_FREIGABEMAIL_NOTE') && CIS_GESAMTNOTE_FREIGABEMAIL_NOTE) - { - $studlist .= " - - - - - "; - - if (defined('CIS_GESAMTNOTE_PUNKTE') && CIS_GESAMTNOTE_PUNKTE) - { - $studlist .= "\n"; - } - $studlist .= "\n"; - - $studlist .= "\n"; - } - // oder anonymisiert nur die UIDs einbinden - else - { - $studlist .= " - \n - "; - } - - // studentenquery - $qry_stud = "SELECT - DISTINCT uid, vorname, nachname, matrikelnr, kurzbzlang - FROM - campus.vw_student_lehrveranstaltung - JOIN campus.vw_student USING(uid) - JOIN public.tbl_studiengang ON campus.vw_student.studiengang_kz = public.tbl_studiengang.studiengang_kz - WHERE - studiensemester_kurzbz = " . $db->db_add_param($stsem) . " - AND lehrveranstaltung_id = " . $db->db_add_param($lvid, FHC_INTEGER) . " - ORDER BY nachname, vorname "; - if ($result_stud = $db->db_query($qry_stud)) - { - $i = 1; - while ($row_stud = $db->db_fetch_object($result_stud)) - { - $lvgesamtnote = new lvgesamtnote(); - if ($lvgesamtnote->load($lvid, $row_stud->uid, $stsem)) - { - if ($lvgesamtnote->benotungsdatum > $lvgesamtnote->freigabedatum) - { - $lvgesamtnote->freigabedatum = $jetzt; - $lvgesamtnote->freigabevon_uid = $user; - $lvgesamtnote->save(); - - if (defined('CIS_GESAMTNOTE_FREIGABEMAIL_NOTE') && CIS_GESAMTNOTE_FREIGABEMAIL_NOTE) - { - $studlist .= ""; - $studlist .= ""; - $studlist .= ""; - $studlist .= ""; - - if (defined('CIS_GESAMTNOTE_PUNKTE') && CIS_GESAMTNOTE_PUNKTE) - { - $studlist .= "\n"; - } - $studlist .= ""; - - $studlist .= "\n"; - } - else - { - $studlist .= "\n"; - } - - $neuenoten ++; - } - } - } - } - - $studlist .= "
" . $p->t('global/personenkz') . "" . $p->t('global/studiengang') . "" . $p->t('global/nachname') . "" . $p->t('global/vorname') . "" . $p->t('benotungstool/punkte') . "" . $p->t('benotungstool/note') . "" . $p->t('benotungstool/bearbeitetvon') . "
" . $p->t('global/uid') . "
" . trim($row_stud->matrikelnr) . "" . trim($row_stud->kurzbzlang) . "" . trim($row_stud->nachname) . "" . trim($row_stud->vorname) . ""; - if ($lvgesamtnote->punkte != '') - $studlist .= trim(number_format($lvgesamtnote->punkte, 2)); - $studlist .= "" . $noten_array[trim($lvgesamtnote->note)]['bezeichnung_mehrsprachig'][$sprache] . "" . $lvgesamtnote->mitarbeiter_uid; - if ($lvgesamtnote->updatevon != '') - $studlist .= " (" . $lvgesamtnote->updatevon . ")"; - $studlist .= "
" . trim($row_stud->uid) . "
"; - - // mail an assistentin und den user selber verschicken - if ($neuenoten > 0) - { - $lv = new lehrveranstaltung($lvid); - $sg = new studiengang($lv->studiengang_kz); - $lektor_adresse = $user . "@" . DOMAIN; - $adressen = $sg->email . ", " . $user . "@" . DOMAIN; - - $studienplan = new studienplan(); - $studienplan->getStudienplanLehrveranstaltung($lvid, $stsem); - $studienplan_bezeichnung = ''; - foreach ($studienplan->result as $row) - $studienplan_bezeichnung .= $row->bezeichnung . ' '; - - $mit = new mitarbeiter(); - $mit->load($user); - $name = $mit->anrede.' '.$mit->vorname.' '.$mit->nachname.' ('.$mit->kurzbz.')'; - - $betreff = 'Notenfreigabe ' . $lv->bezeichnung . ' ' . $lv->orgform_kurzbz . ' - ' . $studienplan_bezeichnung; - $mail = new mail($adressen, 'vilesci@' . DOMAIN, $betreff, ''); - $htmlcontent = " - - $name hat neue Noten für die Lehrveranstaltung\n\n
- " . $sg->kuerzel . ' ' . $lv->semester . '.Semester - ' . $lv->bezeichnung . " " . $lv->orgform_kurzbz . " - " . $stsem . " -
eingetragen.\n

- Die Noten können jetzt ins Zeugnis übernommen werden.\n"; - - $htmlcontent .= $studlist; - - $htmlcontent.= " -
Anzahl der Noten:" . $neuenoten . " -

" . $p->t('abgabetool/mailVerschicktAn') . ": " . $adressen . " - "; - $mail->setHTMLContent($htmlcontent); - $mail->setReplyTo($lektor_adresse); - $mail->send(); - } - } - else - { - $errormsg = $p->t('gesamtnote/passwortFalsch'); - } -} - if (defined('CIS_GESAMTNOTE_PUNKTE') && CIS_GESAMTNOTE_PUNKTE) { $onclickpath = "notenschluessel.php?lehrveranstaltung_id=$lvid&stsem=$stsem"; From f993780ec355cfec7b1612d4ab3878191c275daa Mon Sep 17 00:00:00 2001 From: ma0048 Date: Tue, 23 May 2023 13:17:27 +0200 Subject: [PATCH 029/268] - texte und anzeige angepasst --- include/reihungstest.class.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/include/reihungstest.class.php b/include/reihungstest.class.php index 2da424af5..633ddf1da 100644 --- a/include/reihungstest.class.php +++ b/include/reihungstest.class.php @@ -688,14 +688,14 @@ class reihungstest extends basis_db tbl_reihungstest.aufnahmegruppe_kurzbz, tbl_studiengang.typ, UPPER(typ::varchar(1) || kurzbz) AS stg_kuerzel, - tbl_studiengang.bezeichnung, - tbl_studiengang.english + so.studiengangbezeichnung as bezeichnung, + so.studiengangbezeichnung_englisch as english 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 + JOIN public.tbl_reihungstest ON (rt_id=reihungstest_id) + JOIN public.tbl_studiengang ON tbl_reihungstest.studiengang_kz = tbl_studiengang.studiengang_kz + JOIN lehre.tbl_studienplan sp USING(studienplan_id) + JOIN lehre.tbl_studienordnung so USING(studienordnung_id) WHERE tbl_rt_person.person_id=".$this->db_add_param($person_id); From 09bc98543138f75d16a9e4b7a968a58b19f7f071 Mon Sep 17 00:00:00 2001 From: Harald Bamberger Date: Tue, 23 May 2023 16:08:50 +0200 Subject: [PATCH 030/268] Notenumrechnung beim Punkteimport, Fehlermeldung wenn Note oder Punkte fehlen. --- .../benotungstool/lvgesamtnoteverwalten.php | 149 ++++++++++++------ .../benotungstool/nachpruefungeintragen.php | 15 ++ cis/private/lehre/notenliste.xls.php | 20 ++- 3 files changed, 132 insertions(+), 52 deletions(-) diff --git a/cis/private/lehre/benotungstool/lvgesamtnoteverwalten.php b/cis/private/lehre/benotungstool/lvgesamtnoteverwalten.php index c32fa43e6..6dce2b6ae 100644 --- a/cis/private/lehre/benotungstool/lvgesamtnoteverwalten.php +++ b/cis/private/lehre/benotungstool/lvgesamtnoteverwalten.php @@ -341,6 +341,9 @@ foreach ($noten_obj->result as $row) } ?> + + const CIS_GESAMTNOTE_PUNKTE = ; + function getOffset(pos) { var x,y; @@ -799,33 +802,48 @@ foreach ($noten_obj->result as $row) } ?> + var linenumber = 0; for(row in rows) { - zeile = rows[row].split(" "); - - - - if (zeile[0]!='' && zeile[1]!='') + linenumber++; + if( rows[row] == '' ) { - gradedata['matrikelnr_'+i]=zeile[0]; - - - i++; + //skip empty lines + continue; } + zeile = rows[row].split(" "); + + if( zeile.length < 2 ) + { + alertMsg = alertMsg + "Zeile " + linenumber + ': ' + + 'Zu wenig Paramter - 2 erforderlich. ' + + 'Die Zeile wurde uebersprungen.' + "\n\n"; + continue; + } + + if (CIS_GESAMTNOTE_PUNKTE == false) + { + // check for valid grades + if (validGrades.indexOf(zeile[1]) === -1) + { + alertMsg = alertMsg + "Zeile " + linenumber + ': ' + + "Die Note "+zeile[1]+" ist nicht zulaessig. " + + "Die Zeile wurde uebersprungen. \n\n"; + continue; + } + } + + gradedata['matrikelnr_'+i]=zeile[0]; + if (CIS_GESAMTNOTE_PUNKTE) + { + gradedata['punkte_'+i]= zeile[1]; + } + else + { + gradedata['note_'+i]= zeile[1]; + } + + i++; } if (alertMsg != "") @@ -895,35 +913,70 @@ foreach ($noten_obj->result as $row) } ?> - + var linenumber = 0; for(row in rows) { - zeile = rows[row].split(" "); - - - - if (zeile[0]!='' && zeile[1]!='' && zeile[2]!='') + linenumber++; + if( rows[row] == '' ) { - gradedata['student_uid_'+i]=zeile[0]; - gradedata['datumNachp_'+i]=zeile[1]; - - - i++; + //skip empty lines + continue; } + zeile = rows[row].split(" "); + + if( zeile.length < 3 ) + { + alertMsg = alertMsg + "Zeile " + linenumber + ': ' + + 'Zu wenig Paramter - 3 erforderlich. ' + + 'Die Zeile wurde uebersprungen.' + "\n\n"; + continue; + } + + if( zeile[1] == '' && zeile[2] == '' ) + { + // ignore lines just copied from excel + continue; + } + + if( zeile[2] == '' ) + { + alertMsg = alertMsg + "Zeile " + linenumber + ': ' + + "Die Note oder Punkte fehlen. " + + "Die Zeile wurde uebersprungen. \n\n"; + continue; + } + + if (CIS_GESAMTNOTE_PUNKTE == false) + { + // check for valid grades + if (validGrades.indexOf(zeile[2]) === -1) + { + alertMsg = alertMsg + "Zeile " + linenumber + ': ' + + "Die Note "+zeile[2]+" ist nicht zulaessig. " + + "Die Zeile wurde uebersprungen. \n\n"; + continue; + } + } + + if( !zeile[1].match(/[0-9]{2}\.[0-9]{2}\.[0-9]{4}/) ) + { + alertMsg = alertMsg + "Zeile " + linenumber + ': ' + + "Das Datum "+zeile[1]+" fehlt oder ist nicht zulaessig. " + + "Die Zeile wurde uebersprungen. \n\n"; + continue; + } + + gradedata['student_uid_'+i]=zeile[0]; + gradedata['datumNachp_'+i]=zeile[1]; + if (CIS_GESAMTNOTE_PUNKTE) + { + gradedata['punkte_'+i]= zeile[2]; + } + else + { + gradedata['note_'+i]= zeile[2]; + } + i++; } diff --git a/cis/private/lehre/benotungstool/nachpruefungeintragen.php b/cis/private/lehre/benotungstool/nachpruefungeintragen.php index 804ab34fb..873c0f173 100644 --- a/cis/private/lehre/benotungstool/nachpruefungeintragen.php +++ b/cis/private/lehre/benotungstool/nachpruefungeintragen.php @@ -130,6 +130,17 @@ if (isset($_REQUEST['sammel']) && $_REQUEST["sammel"] == 1) continue; } $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; + } + } $datum = $_POST['datumNachp_'.$id]; //check Datumsformat @@ -172,6 +183,10 @@ if (isset($_REQUEST['sammel']) && $_REQUEST["sammel"] == 1) $note = $noten_anmerkung[$note]; } $response = savePruefung($lvid, $student_uid, $stsem, $lehreinheit_id, $datum, $typ, $note, $punkte); + if($response!='neu' && $response!='update' && $response!='update_f') + { + echo $response; + } } else { diff --git a/cis/private/lehre/notenliste.xls.php b/cis/private/lehre/notenliste.xls.php index 2e0403139..63cf45d29 100644 --- a/cis/private/lehre/notenliste.xls.php +++ b/cis/private/lehre/notenliste.xls.php @@ -226,7 +226,7 @@ else if (defined('CIS_GESAMTNOTE_PRUEFUNG_TERMIN2') && CIS_GESAMTNOTE_PRUEFUNG_TERMIN2) { - $worksheet->write($lines,8,$p->t('global/uid'),$format_border_bottom); + $worksheet->write($lines,8,$p->t('global/personenkennzeichen'),$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); @@ -236,7 +236,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,12,$p->t('global/personenkennzeichen'),$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); @@ -328,7 +328,7 @@ else // Nachprüfung if (defined('CIS_GESAMTNOTE_PRUEFUNG_TERMIN2') && CIS_GESAMTNOTE_PRUEFUNG_TERMIN2) { - $worksheet->write($lines,8, $elem->uid, $format_highlightright); + $worksheet->write($lines,8, '="'.trim($elem->matrikelnr).'"', $format_highlight); $pr = new Pruefung(); $pr->getPruefungen($elem->uid, "Termin2", $lvid, $sem); $output2 = $pr->result; @@ -349,7 +349,7 @@ else // Nachprüfung if (defined('CIS_GESAMTNOTE_PRUEFUNG_TERMIN3') && CIS_GESAMTNOTE_PRUEFUNG_TERMIN3) { - $worksheet->write($lines,12, $elem->uid, $format_highlightright); + $worksheet->write($lines,12, '="'.trim($elem->matrikelnr).'"', $format_highlight); $pr = new Pruefung(); $pr->getPruefungen($elem->uid, "Termin3", $lvid, $sem); $output3 = $pr->result; @@ -420,5 +420,17 @@ else $worksheet->setColumn(0, 3, 25); $worksheet->setColumn(0, 4, 7); $worksheet->setColumn(0, 5, 21); + + if (defined('CIS_GESAMTNOTE_PRUEFUNG_TERMIN2') && CIS_GESAMTNOTE_PRUEFUNG_TERMIN2) + { + $worksheet->setColumn(8, 8, 15); + $worksheet->setColumn(9, 9, 10); + } + if (defined('CIS_GESAMTNOTE_PRUEFUNG_TERMIN3') && CIS_GESAMTNOTE_PRUEFUNG_TERMIN3) + { + $worksheet->setColumn(12, 12, 15); + $worksheet->setColumn(13, 13, 10); + } + $workbook->close(); ?> From bf344df8d6c96d1987b4ab00180471cdbf2c494b Mon Sep 17 00:00:00 2001 From: ma0048 Date: Thu, 1 Jun 2023 07:12:40 +0200 Subject: [PATCH 031/268] - abgabetool anpassungen --- cis/private/lehre/abgabe_lektor_zusatz.php | 6 ++-- cis/private/lehre/abgabe_student_details.php | 29 ++------------------ vilesci/lehre/abgabe_assistenz_zusatz.php | 6 ++-- 3 files changed, 9 insertions(+), 32 deletions(-) diff --git a/cis/private/lehre/abgabe_lektor_zusatz.php b/cis/private/lehre/abgabe_lektor_zusatz.php index 39488b6c3..b764fd556 100644 --- a/cis/private/lehre/abgabe_lektor_zusatz.php +++ b/cis/private/lehre/abgabe_lektor_zusatz.php @@ -121,15 +121,15 @@ echo ' - '.$p->t('abgabetool/kontrollierteSchlagwoerter').':* + '.$p->t('abgabetool/kontrollierteSchlagwoerter').': - '.$p->t('abgabetool/deutscheSchlagwoerter').': + '.$p->t('abgabetool/deutscheSchlagwoerter').':* - '.$p->t('abgabetool/englischeSchlagwoerter').': + '.$p->t('abgabetool/englischeSchlagwoerter').':* diff --git a/cis/private/lehre/abgabe_student_details.php b/cis/private/lehre/abgabe_student_details.php index 6575dcf70..9171a978c 100644 --- a/cis/private/lehre/abgabe_student_details.php +++ b/cis/private/lehre/abgabe_student_details.php @@ -64,7 +64,6 @@ if(!isset($_POST['uid'])) $fixtermin = false; $datum = '01.01.1980'; $kurzbz = ''; - $kontrollschlagwoerter = ''; $schlagwoerter = ''; $schlagwoerter_en = ''; $abstract = ''; @@ -88,7 +87,6 @@ else $kurzbz = (isset($_POST['kurzbz'])?$_POST['kurzbz']:''); $betreuer = (isset($_POST['betreuer'])?$_POST['betreuer']:'-1'); $sprache = (isset($_POST['sprache'])?$_POST['sprache']:'German'); - $kontrollschlagwoerter = (isset($_POST['kontrollschlagwoerter'])?$_POST['kontrollschlagwoerter']:'-1'); $schlagwoerter = (isset($_POST['schlagwoerter'])?$_POST['schlagwoerter']:'-1'); $schlagwoerter_en = (isset($_POST['schlagwoerter_en'])?$_POST['schlagwoerter_en']:'-1'); $abstract = (isset($_POST['abstract'])?$_POST['abstract']:'-1'); @@ -211,23 +209,7 @@ if($command=='add') { //zusätzliche Daten bearbeiten //Check der Eingabedaten - if(strlen($kontrollschlagwoerter)<1) - { - $error=true; - } - if(mb_strlen($kontrollschlagwoerter)>=150) - { - $kontrollschlagwoerter = mb_substr($kontrollschlagwoerter, 0, 146).'...'; - } - if(strlen($abstract)<1) - { - $error=true; - } - if(strlen($abstract_en)<1) - { - $error=true; - } - if($seitenanzahl<1) + if((strlen($schlagwoerter) < 1) || (strlen($schlagwoerter_en) < 1) || (strlen($abstract) < 1) || (strlen($abstract_en) < 1) || ($seitenanzahl < 1)) { $error=true; } @@ -237,7 +219,6 @@ if($command=='add') seitenanzahl = ".$db->db_add_param($seitenanzahl).", abgabedatum = now(), sprache = ".$db->db_add_param($sprache).", - kontrollschlagwoerter = ".$db->db_add_param($kontrollschlagwoerter).", schlagwoerter_en = ".$db->db_add_param($schlagwoerter_en).", schlagwoerter = ".$db->db_add_param($schlagwoerter).", abstract = ".$db->db_add_param($abstract).", @@ -413,12 +394,9 @@ if($command=="update" && $error!=true) $htmlstr .= " \n"; } $htmlstr .= "\n"; - $htmlstr .= ''.$p->t('abgabetool/kontrollierteSchlagwoerter').':* - - '."\n"; - $htmlstr .= ''.$p->t('abgabetool/deutscheSchlagwoerter').': + $htmlstr .= ''.$p->t('abgabetool/deutscheSchlagwoerter').':* '."\n"; - $htmlstr .= ''.$p->t('abgabetool/englischeSchlagwoerter').': + $htmlstr .= ''.$p->t('abgabetool/englischeSchlagwoerter').':* '."\n"; $htmlstr .= ''.$p->t('abgabetool/abstract').' '.$p->t('abgabetool/maxZeichen').':* '."\n"; @@ -657,7 +635,6 @@ if($command!="add") $htmlstr .= ''."\n"; $htmlstr .= ''."\n"; $htmlstr .= ''."\n"; - $htmlstr .= ''."\n"; $htmlstr .= ''."\n"; $htmlstr .= ''."\n"; $htmlstr .= ''."\n"; diff --git a/vilesci/lehre/abgabe_assistenz_zusatz.php b/vilesci/lehre/abgabe_assistenz_zusatz.php index 20dbe9d97..724658d24 100644 --- a/vilesci/lehre/abgabe_assistenz_zusatz.php +++ b/vilesci/lehre/abgabe_assistenz_zusatz.php @@ -120,15 +120,15 @@ echo '
Student: '.$uid.'
Titel: '. - Kontrollierte Schlagwörter:* + Kontrollierte Schlagwörter: - Dt. Schlagwörter: + Dt. Schlagwörter:* - Engl. Schlagwörter: + Engl. Schlagwörter:* From 9f13f876ef587ae07ae960789a45f300dca0a657 Mon Sep 17 00:00:00 2001 From: ma0048 Date: Thu, 1 Jun 2023 07:39:56 +0200 Subject: [PATCH 032/268] - swd.php entfernt --- cis/private/lehre/swd.php | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 cis/private/lehre/swd.php diff --git a/cis/private/lehre/swd.php b/cis/private/lehre/swd.php deleted file mode 100644 index 248779aac..000000000 --- a/cis/private/lehre/swd.php +++ /dev/null @@ -1,11 +0,0 @@ - From 7c2d23596021491f36560a86e2d68b98ffc7be33 Mon Sep 17 00:00:00 2001 From: Cris Date: Thu, 1 Jun 2023 12:17:21 +0200 Subject: [PATCH 033/268] Adapted: Show column 'Stundensatz' in 'Lehrauftrag bestellen' --- application/views/lehre/lehrauftrag/orderLehrauftragData.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/views/lehre/lehrauftrag/orderLehrauftragData.php b/application/views/lehre/lehrauftrag/orderLehrauftragData.php index c272c392c..5a2ad98bd 100644 --- a/application/views/lehre/lehrauftrag/orderLehrauftragData.php +++ b/application/views/lehre/lehrauftrag/orderLehrauftragData.php @@ -435,7 +435,7 @@ $filterWidgetArray = array( stunden: {align:"right", formatter: form_formatNulltoStringNumber, formatterParams:{precision:1}, headerFilter:"input", headerFilterFunc: hf_filterStringnumberWithOperator, bottomCalc:"sum", bottomCalcParams:{precision:1}}, - stundensatz: {visible: false, align:"right", formatter: form_formatNulltoStringNumber, + stundensatz: {visible: true, align:"right", formatter: form_formatNulltoStringNumber, headerFilter:"input", headerFilterFunc: hf_filterStringnumberWithOperator}, betrag: {align:"right", formatter: form_formatNulltoStringNumber, headerFilter:"input", headerFilterFunc: hf_filterStringnumberWithOperator, From 0994b2cc8fad79e3d747fa34576016e864177bb1 Mon Sep 17 00:00:00 2001 From: Cris Date: Thu, 1 Jun 2023 12:18:14 +0200 Subject: [PATCH 034/268] Added: Added column 'Stundensatz' in 'Lehrauftrag erteilen' --- .../views/lehre/lehrauftrag/approveLehrauftragData.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/application/views/lehre/lehrauftrag/approveLehrauftragData.php b/application/views/lehre/lehrauftrag/approveLehrauftragData.php index 635fd9da9..0414ddbf6 100644 --- a/application/views/lehre/lehrauftrag/approveLehrauftragData.php +++ b/application/views/lehre/lehrauftrag/approveLehrauftragData.php @@ -25,6 +25,7 @@ SELECT lv_oe_kurzbz, lektor, stunden, + stundensatz, betrag, vertrag_id, vertrag_stunden, @@ -149,6 +150,7 @@ FROM END AS "lv_oe_kurzbz", (person.nachname || \' \' || person.vorname) AS "lektor", TRUNC(lema.semesterstunden, 1) AS "stunden", + lema.stundensatz, TRUNC((lema.semesterstunden * lema.stundensatz), 2) AS "betrag", vertrag_id, vertragsstunden AS "vertrag_stunden", @@ -270,6 +272,7 @@ FROM END AS "lv_oe_kurzbz", (nachname || \' \' || vorname) AS "lektor", TRUNC(pb.stunden, 1) AS "stunden", + pb.stundensatz, TRUNC((pb.stunden * pb.stundensatz), 2) AS "betrag", vertrag_id, vertragsstunden AS "vertrag_stunden", @@ -325,6 +328,7 @@ $filterWidgetArray = array( ucfirst($this->p->t('lehre', 'organisationseinheit')), ucfirst($this->p->t('lehre', 'lektor')), ucfirst($this->p->t('ui', 'stunden')), + ucfirst($this->p->t('ui', 'stundensatz')), ucfirst($this->p->t('ui', 'betrag')), ucfirst($this->p->t('ui', 'vertrag')). '-ID', ucfirst($this->p->t('ui', 'vertrag')). '-'. ucfirst($this->p->t('ui', 'stunden')), @@ -399,6 +403,8 @@ $filterWidgetArray = array( stunden: {align:"right", formatter: form_formatNulltoStringNumber, formatterParams:{precision:1}, headerFilter:"input", headerFilterFunc: hf_filterStringnumberWithOperator, bottomCalc:"sum", bottomCalcParams:{precision:1}}, + stundensatz: {visible: true, align:"right", formatter: form_formatNulltoStringNumber, + headerFilter:"input", headerFilterFunc: hf_filterStringnumberWithOperator}, betrag: {align:"right", formatter: form_formatNulltoStringNumber, headerFilter:"input", headerFilterFunc: hf_filterStringnumberWithOperator, bottomCalc:"sum", bottomCalcParams:{precision:2}, bottomCalcFormatter:"money", bottomCalcFormatterParams:{decimal: ",", thousand: ".", symbol:"€"}}, From 9e883a48a05eb8ae56414a574461ad4db20a61db Mon Sep 17 00:00:00 2001 From: ma0068 Date: Fri, 2 Jun 2023 09:02:47 +0200 Subject: [PATCH 035/268] Adaptierungen Icalfiles Coole --- cis/public/coodle.php | 93 ++--- include/coodle.class.php | 722 ++++++++++++++++++++------------------- 2 files changed, 420 insertions(+), 395 deletions(-) diff --git a/cis/public/coodle.php b/cis/public/coodle.php index 721f2d3c0..2b8421db0 100644 --- a/cis/public/coodle.php +++ b/cis/public/coodle.php @@ -571,7 +571,7 @@ if (isset($_GET['resend'])) echo "
- + "; // Für Colspan bei Datum @@ -675,7 +675,6 @@ if (isset($_GET['resend'])) } else { - // Ort-Ressourcen ueberspringen if ($ressource->ort_kurzbz != '') { @@ -761,8 +760,8 @@ if (isset($_GET['resend'])) echo ' + @@ -98,33 +98,38 @@ export default { - - - - - - + + +
diff --git a/public/js/issues/issuesKonfiguration.js b/public/js/issues/issuesKonfiguration.js index 9e0ebaf4d..f2e7aa5c3 100644 --- a/public/js/issues/issuesKonfiguration.js +++ b/public/js/issues/issuesKonfiguration.js @@ -144,6 +144,34 @@ var IssuesKonfiguration = { } ); }, + deleteKonfigurationsWerte: function(konfigurationstyp_kurzbz, fehlercode, konfigurationsWert) + { + FHC_AjaxClient.ajaxCallPost( + 'system/issues/IssuesKonfiguration/deleteKonfigurationsWerte', + { + konfigurationstyp_kurzbz: konfigurationstyp_kurzbz, + fehlercode: fehlercode, + konfigurationsWert: konfigurationsWert + }, + { + successCallback: function(data, textStatus, jqXHR) { + if (FHC_AjaxClient.hasData(data)) + { + FHC_DialogLib.alertSuccess(FHC_PhrasesLib.t('fehlermonitoring', 'konfigurationGeloescht')) + // reload dataset to see change + IssuesKonfiguration._reloadKonfigurationOverview(); + } + else + { + FHC_DialogLib.alertError(FHC_PhrasesLib.t('fehlermonitoring', 'konfigurationGeloeschtFehler')); + } + }, + errorCallback: function(jqXHR, textStatus, errorThrown) { + FHC_DialogLib.alertError(textStatus); + } + } + ); + }, deleteKonfiguration: function(konfigurationstyp_kurzbz, fehlercode) { FHC_AjaxClient.ajaxCallPost( @@ -229,7 +257,7 @@ $(document).ready(function() { } ); - // get new fehlercodes each time app is changed + // set assign configuration event $("#assignKonfiguration").click( function() { @@ -241,6 +269,18 @@ $(document).ready(function() { } ); + // set delete configuration event + $("#deleteKonfiguration").click( + function() + { + IssuesKonfiguration.deleteKonfigurationsWerte( + $("#"+FEHLERKONFIGURATIONSTYP_DROPDOWN_ID).val(), + $("#"+FEHLERCODE_DROPDOWN_ID).val(), + $("#konfigurationsWert").val() + ); + } + ); + // set events for showing info modals $("#fehlercodeInfoIcon").click( function() diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php index 0bc748c80..28735e07f 100644 --- a/system/phrasesupdate.php +++ b/system/phrasesupdate.php @@ -17897,7 +17897,7 @@ array( ), array( 'sprache' => 'English', - 'text' => 'Invalid configuration value for data type {1}, special characters not allowed', + 'text' => 'Invalid configuration value for data type {0}, special characters not allowed', 'description' => '', 'insertvon' => 'system' ) @@ -18123,6 +18123,26 @@ array( ) ) ), + array( + 'app' => 'core', + 'category' => 'fehlermonitoring', + 'phrase' => 'konfigurationswertLoeschen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Konfigurationswert(e) löschen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Delete configuration value(s)', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), ); From ab5dc7b1ac34f3f29e557828d7747ab5bbcd945c Mon Sep 17 00:00:00 2001 From: KarpAlex Date: Mon, 12 Jun 2023 22:32:09 +0200 Subject: [PATCH 038/268] plausichecks: removed plausicheck lib, instead, methods are directly in the library for the fehler --- .../libraries/issues/PlausicheckLib.php | 1627 ----------------- .../issues/plausichecks/AbbrecherAktiv.php | 47 +- .../plausichecks/AbschlussstatusFehlt.php | 93 +- .../issues/plausichecks/AktSemesterNull.php | 49 +- .../plausichecks/AktiverStudentOhneStatus.php | 55 +- .../AktiverStudentstatusOhneKontobuchung.php | 64 +- ...PrestudentUngleichAusbildungssemStatus.php | 59 +- .../BewerberNichtZumRtAngetreten.php | 70 +- .../DatumAbschlusspruefungFehlt.php | 108 +- .../plausichecks/DatumSponsionFehlt.php | 108 +- ...DatumStudiensemesterFalscheReihenfolge.php | 62 +- .../FalscheAnzahlAbschlusspruefungen.php | 75 +- .../FalscheAnzahlHeimatadressen.php | 65 +- .../FalscheAnzahlZustelladressen.php | 67 +- .../plausichecks/GbDatumWeitZurueck.php | 63 +- .../InaktiverStudentAktiverStatus.php | 60 +- .../IncomingHeimatNationOesterreich.php | 58 +- .../plausichecks/IncomingOhneIoDatensatz.php | 52 +- .../IncomingOrGsFoerderrelevant.php | 75 +- .../InskriptionVorLetzerBismeldung.php | 91 +- .../NationNichtOesterreichAberGemeinde.php | 47 +- .../OrgformStgUngleichOrgformPrestudent.php | 72 +- .../issues/plausichecks/PlausiChecker.php | 5 +- .../PrestudentMischformOhneOrgform.php | 55 +- .../StgPrestudentUngleichStgStudent.php | 48 +- .../StgPrestudentUngleichStgStudienplan.php | 62 +- .../StudentstatusNachAbbrecher.php | 46 +- .../plausichecks/StudienplanUngueltig.php | 71 +- .../issues/resolvers/CORE_INOUT_0007.php | 4 +- .../issues/resolvers/CORE_INOUT_0008.php | 4 +- .../issues/resolvers/CORE_INOUT_0009.php | 4 +- .../issues/resolvers/CORE_PERSON_0001.php | 4 +- .../issues/resolvers/CORE_PERSON_0002.php | 4 +- .../issues/resolvers/CORE_PERSON_0003.php | 4 +- .../issues/resolvers/CORE_PERSON_0004.php | 4 +- .../issues/resolvers/CORE_STG_0001.php | 4 +- .../issues/resolvers/CORE_STG_0002.php | 4 +- .../issues/resolvers/CORE_STG_0003.php | 4 +- .../issues/resolvers/CORE_STG_0004.php | 4 +- .../resolvers/CORE_STUDENTSTATUS_0001.php | 4 +- .../resolvers/CORE_STUDENTSTATUS_0002.php | 4 +- .../resolvers/CORE_STUDENTSTATUS_0003.php | 8 +- .../resolvers/CORE_STUDENTSTATUS_0004.php | 8 +- .../resolvers/CORE_STUDENTSTATUS_0005.php | 4 +- .../resolvers/CORE_STUDENTSTATUS_0006.php | 4 +- .../resolvers/CORE_STUDENTSTATUS_0007.php | 4 +- .../resolvers/CORE_STUDENTSTATUS_0008.php | 4 +- .../resolvers/CORE_STUDENTSTATUS_0009.php | 4 +- .../resolvers/CORE_STUDENTSTATUS_0010.php | 4 +- .../resolvers/CORE_STUDENTSTATUS_0011.php | 4 +- .../resolvers/CORE_STUDENTSTATUS_0012.php | 8 +- .../resolvers/CORE_STUDENTSTATUS_0013.php | 4 +- .../resolvers/CORE_STUDENTSTATUS_0014.php | 4 +- .../resolvers/CORE_STUDENTSTATUS_0015.php | 4 +- 54 files changed, 1763 insertions(+), 1707 deletions(-) delete mode 100644 application/libraries/issues/PlausicheckLib.php diff --git a/application/libraries/issues/PlausicheckLib.php b/application/libraries/issues/PlausicheckLib.php deleted file mode 100644 index 9c768da02..000000000 --- a/application/libraries/issues/PlausicheckLib.php +++ /dev/null @@ -1,1627 +0,0 @@ -_ci =& get_instance(); // get ci instance - - // load models - $this->_ci->load->model('crm/Prestudent_model', 'PrestudentModel'); - $this->_ci->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel'); - $this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); - - // get database for queries - $this->_db = new DB_Model(); - } - - //------------------------------------------------------------------------------------------------------------------ - // Studiengang checks - - /** - * Studiengang should be the same for prestudent and student. - * @param studiengang_kz int if check is to be executed for certain Studiengang - * @param prestudent_id int if check is to be executed only for one prestudent - * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check - * @return success with prestudents or error - */ - public function getStgPrestudentUngleichStgStudent($studiengang_kz = null, $prestudent_id = null, $exkludierte_studiengang_kz = null) - { - $params = array(); - - $qry = " - SELECT - pre.person_id, pre.prestudent_id, stg.oe_kurzbz prestudent_stg_oe_kurzbz, student_stg.oe_kurzbz student_stg_oe_kurzbz - FROM - public.tbl_prestudent pre - JOIN public.tbl_student stud USING(prestudent_id) - JOIN public.tbl_person pers USING(person_id) - JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz - JOIN public.tbl_studiengang student_stg ON stud.studiengang_kz = student_stg.studiengang_kz - WHERE - stud.studiengang_kz != pre.studiengang_kz"; - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($prestudent_id)) - { - $qry .= " AND pre.prestudent_id = ?"; - $params[] = $prestudent_id; - } - - if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz NOT IN ?"; - $params[] = $exkludierte_studiengang_kz; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - /** - * Orgform of a Studiengang in Studienplan should be the same as orgform of student. - * @param studiensemester_kurzbz string check is to be executed for certain Studiensemester - * @param studiengang_kz int if check is to be executed for certain Studiengang - * @param prestudent_id int if check is to be executed only for one prestudent - * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check - * @return success with prestudents or error - */ - public function getOrgformStgUngleichOrgformPrestudent( - $studiensemester_kurzbz, - $studiengang_kz = null, - $prestudent_id = null, - $exkludierte_studiengang_kz = null - ) { - $params = array($studiensemester_kurzbz); - - $qry = " - SELECT - prestudent.person_id, prestudent.prestudent_id, status.studiensemester_kurzbz, - studiengang.orgform_kurzbz AS stg_orgform, status.orgform_kurzbz AS student_orgform, - prestudent.studiengang_kz AS student_studiengang, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz - FROM - public.tbl_studiengang studiengang - JOIN public.tbl_student student USING(studiengang_kz) - JOIN public.tbl_prestudent prestudent USING(prestudent_id) - JOIN public.tbl_prestudentstatus status USING(prestudent_id) - JOIN public.tbl_benutzer benutzer on(benutzer.uid = student.student_uid) - JOIN public.tbl_studiengang stg ON prestudent.studiengang_kz = stg.studiengang_kz - LEFT JOIN lehre.tbl_studienplan stpl USING (studienplan_id) - WHERE - benutzer.aktiv = true - AND status.status_kurzbz IN ('Student', 'Unterbrecher', 'Abbrecher', 'Diplomand', 'Absolvent') - AND studiengang.studiengang_kz < 10000 - AND status.studiensemester_kurzbz = ? - AND NOT (status.orgform_kurzbz IS NULL AND studiengang.mischform = FALSE) - AND NOT EXISTS( - SELECT 1 - FROM - lehre.tbl_studienplan - JOIN - lehre.tbl_studienordnung USING(studienordnung_id) - WHERE - tbl_studienplan.studienplan_id = stpl.studienplan_id - AND tbl_studienordnung.studiengang_kz = prestudent.studiengang_kz - AND tbl_studienplan.orgform_kurzbz = status.orgform_kurzbz)"; - - if (isset($studiengang_kz)) - { - $qry .= " AND studiengang.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($prestudent_id)) - { - $qry .= " AND prestudent.prestudent_id = ?"; - $params[] = $prestudent_id; - } - - if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz NOT IN ?"; - $params[] = $exkludierte_studiengang_kz; - } - - $qry .= " - ORDER BY student_uid"; - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - /** - * Students in "mixed" Studiengang should have Orgform. - * @param studiensemester_kurzbz string check is to be executed for certain Studiensemester - * @param studiengang_kz int if check is to be executed for certain Studiengang - * @param prestudent_id int if check is to be executed only for one prestudent - * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check - * @return success with prestudents or error - */ - public function getPrestudentMischformOhneOrgform( - $studiensemester_kurzbz, - $studiengang_kz = null, - $prestudent_id = null, - $exkludierte_studiengang_kz = null - ) { - $params = array($studiensemester_kurzbz); - - $qry = " - SELECT - pre.person_id, pre.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, status.studiensemester_kurzbz - FROM - public.tbl_prestudent pre - JOIN public.tbl_person USING(person_id) - JOIN public.tbl_prestudentstatus status USING(prestudent_id) - JOIN public.tbl_studiengang stg USING(studiengang_kz) - WHERE - status.status_kurzbz IN ('Bewerber', 'Student') - AND stg.mischform - AND (status.orgform_kurzbz='' OR status.orgform_kurzbz IS NULL) - AND status.studiensemester_kurzbz=?"; - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($prestudent_id)) - { - $qry .= " AND pre.prestudent_id = ?"; - $params[] = $prestudent_id; - } - - if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz NOT IN ?"; - $params[] = $exkludierte_studiengang_kz; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - /** - * Studiengang should be the same for prestudent and studienplan. - * @param studiengang_kz int if check is to be executed for certain Studiengang - * @param prestudent_id int if check is to be executed only for one prestudent - * @param studienordnung_id int if check is to be executed only for a certain studienordnung_id - * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check - * @return success with prestudents or error - */ - public function getStgPrestudentUngleichStgStudienplan( - $studiengang_kz = null, - $prestudent_id = null, - $studienordnung_id = null, - $exkludierte_studiengang_kz = null - ) { - $params = array(); - - $qry = " - SELECT - DISTINCT ON (ps.prestudent_id) ps.person_id, ps.prestudent_id, stordnung.studienordnung_id, - stplan.bezeichnung AS studienplan, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz - FROM - public.tbl_prestudent ps - JOIN public.tbl_prestudentstatus USING(prestudent_id) - JOIN lehre.tbl_studienplan stplan USING(studienplan_id) - JOIN lehre.tbl_studienordnung stordnung USING(studienordnung_id) - JOIN public.tbl_person USING(person_id) - JOIN public.tbl_studiengang stg ON ps.studiengang_kz = stg.studiengang_kz - WHERE - ps.studiengang_kz<>stordnung.studiengang_kz - AND stg.melderelevant"; - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($prestudent_id)) - { - $qry .= " AND ps.prestudent_id = ?"; - $params[] = $prestudent_id; - } - - if (isset($studienordnung_id)) - { - $qry .= " AND stordnung.studienordnung_id = ?"; - $params[] = $studienordnung_id; - } - - if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz NOT IN ?"; - $params[] = $exkludierte_studiengang_kz; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - //------------------------------------------------------------------------------------------------------------------ - // Studentstatus checks - - /** - * Abbrecher cannot be active. - * @param studiengang_kz int if check is to be executed for certain Studiengang - * @param prestudent_id int if check is to be executed only for one prestudent - * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check - * @return success with prestudents or error - */ - public function getAbbrecherAktiv($studiengang_kz = null, $prestudent_id = null, $exkludierte_studiengang_kz = null) - { - $params = array(); - - $qry = " - SELECT - pre.person_id, pre.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz - FROM - public.tbl_prestudentstatus pre_status - JOIN public.tbl_prestudent pre USING(prestudent_id) - JOIN public.tbl_student student USING(prestudent_id) - JOIN public.tbl_benutzer benutzer on(benutzer.uid=student.student_uid) - JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz - WHERE - pre_status.status_kurzbz ='Abbrecher' - AND benutzer.aktiv=true"; - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($prestudent_id)) - { - $qry .= " AND pre.prestudent_id = ?"; - $params[] = $prestudent_id; - } - - if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz NOT IN ?"; - $params[] = $exkludierte_studiengang_kz; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - /** - * There shouldn't be any status after Abbrecher status. - * @param studiengang_kz int if check is to be executed for certain Studiengang - * @param prestudent_id int if check is to be executed only for one prestudent - * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check - * @return success with prestudents or error - */ - public function getStudentstatusNachAbbrecher($studiengang_kz = null, $prestudent_id = null, $exkludierte_studiengang_kz = null) - { - $params = array(); - - $qry = " - SELECT - prestudent.person_id, prestudent.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz - FROM - public.tbl_student student - JOIN public.tbl_prestudent prestudent USING(prestudent_id) - JOIN public.tbl_prestudentstatus prestatus USING(prestudent_id) - JOIN public.tbl_studiengang stg ON prestudent.studiengang_kz = stg.studiengang_kz - WHERE - prestatus.status_kurzbz = 'Abbrecher' - AND get_rolle_prestudent(prestudent.prestudent_id, prestatus.studiensemester_kurzbz) <> 'Abbrecher'"; - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($prestudent_id)) - { - $qry .= " AND prestudent.prestudent_id = ?"; - $params[] = $prestudent_id; - } - - if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz NOT IN ?"; - $params[] = $exkludierte_studiengang_kz; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - /** - * Ausbildungssemester of prestudent (lehrverband) must be the same as Ausbildungssemester of prestudentstatus. - * @param studiensemester_kurzbz string check is to be executed for certain Studiensemester - * @param studiengang_kz int if check is to be executed for certain Studiengang - * @param prestudent_id int if check is to be executed only for one prestudent - * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check - * @return success with prestudents or error - */ - public function getAusbildungssemPrestudentUngleichAusbildungssemStatus( - $studiensemester_kurzbz, - $studiengang_kz = null, - $prestudent_id = null, - $exkludierte_studiengang_kz = null - ) { - $params = array($studiensemester_kurzbz, $studiensemester_kurzbz, $studiensemester_kurzbz); - - $qry = " - SELECT - DISTINCT(student.student_uid), student.student_uid, prestudent.person_id, prestudent.prestudent_id, - status.ausbildungssemester AS status_ausbildungssemester, lv.semester AS student_ausbildungssemester, status.studiensemester_kurzbz, - stg.oe_kurzbz AS prestudent_stg_oe_kurzbz - FROM - public.tbl_student student - JOIN public.tbl_studentlehrverband lv USING(student_uid) - JOIN public.tbl_prestudent prestudent USING(prestudent_id) - JOIN public.tbl_prestudentstatus status USING(prestudent_id) - JOIN public.tbl_studiengang stg ON prestudent.studiengang_kz = stg.studiengang_kz - WHERE - status.studiensemester_kurzbz = ? - AND lv.studiensemester_kurzbz = ? - AND status.status_kurzbz NOT IN ('Interessent','Bewerber','Aufgenommener','Wartender','Abgewiesener','Unterbrecher') - AND get_rolle_prestudent (prestudent_id, ?)='Student' - AND status.ausbildungssemester != lv.semester"; - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($prestudent_id)) - { - $qry .= " AND prestudent.prestudent_id = ?"; - $params[] = $prestudent_id; - } - - if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz NOT IN ?"; - $params[] = $exkludierte_studiengang_kz; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - /** - * Students with active status should have an active Benutzer. - * @param studiensemester_kurzbz string check is to be executed for certain Studiensemester - * @param studiengang_kz int if check is to be executed for certain Studiengang - * @param prestudent_id int if check is to be executed only for one prestudent - * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check - * @return success with prestudents or error - */ - public function getInaktiverStudentAktiverStatus( - $studiensemester_kurzbz, - $studiengang_kz = null, - $prestudent_id = null, - $exkludierte_studiengang_kz = null - ) { - $aktStudiensemesterRes = $this->_ci->StudiensemesterModel->getAkt(); - - if (isError($aktStudiensemesterRes)) return $aktStudiensemesterRes; - - $studiensemester_kurzbz = hasData($aktStudiensemesterRes) ? getData($aktStudiensemesterRes)[0]->studiensemester_kurzbz : ''; - - $params = array($studiensemester_kurzbz); - - $qry = " - SELECT - DISTINCT(student.student_uid), prestudent.person_id, prestudent.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz - FROM - public.tbl_benutzer benutzer - JOIN public.tbl_student student on(benutzer.uid = student.student_uid) - JOIN public.tbl_prestudent prestudent USING(prestudent_id) - JOIN public.tbl_studiengang stg ON prestudent.studiengang_kz = stg.studiengang_kz - WHERE - benutzer.aktiv=false - AND EXISTS (SELECT 1 FROM public.tbl_prestudentstatus WHERE prestudent_id = prestudent.prestudent_id AND studiensemester_kurzbz = ?) - AND get_rolle_prestudent(prestudent_id, NULL) IN ('Student', 'Diplomand', 'Unterbrecher', 'Praktikant') - AND stg.melderelevant - AND prestudent.bismelden"; - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($prestudent_id)) - { - $qry .= " AND prestudent.prestudent_id = ?"; - $params[] = $prestudent_id; - } - - if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz NOT IN ?"; - $params[] = $exkludierte_studiengang_kz; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - /** - * Students of a semester shouldn't start studies before the date of Bismeldung. - * e.g. If student studies in WS2022 datum of status shouldn't be before 15.4.2020 - * e.g. If student studies in SS2022 datum of status shouldn't be before 15.11.2022 - * @param studiensemester_kurzbz string check is to be executed for certain Studiensemester - * @param studiengang_kz int if check is to be executed for certain Studiengang - * @param prestudent_id int if check is to be executed only for one prestudent - * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check - * @return success with prestudents or error - */ - public function getInskriptionVorLetzerBismeldung( - $studiensemester_kurzbz, - $studiengang_kz = null, - $prestudent_id = null, - $exkludierte_studiengang_kz = null - ) { - // get Bismeldedatum - $datumBis = $this->_getBisdateFromSemester($studiensemester_kurzbz); - - $params = array($datumBis, $studiensemester_kurzbz, $datumBis); - - // get active students - $qry = " - SELECT - DISTINCT ON (student.student_uid) ? AS datum_bismeldung, - prestudent.person_id, prestudent.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, status.studiensemester_kurzbz - FROM - public.tbl_benutzer benutzer - JOIN public.tbl_student student on(benutzer.uid = student.student_uid) - JOIN public.tbl_prestudent prestudent USING(prestudent_id) - JOIN public.tbl_prestudentstatus status USING(prestudent_id) - JOIN public.tbl_studiengang stg ON prestudent.studiengang_kz = stg.studiengang_kz - WHERE - benutzer.aktiv=true - AND status.studiensemester_kurzbz = ? - /* inscription date before date of first student status */ - AND ( - SELECT datum - FROM public.tbl_prestudentstatus - WHERE prestudent_id = prestudent.prestudent_id - AND studiensemester_kurzbz = status.studiensemester_kurzbz - AND status_kurzbz = 'Student' - ORDER BY datum, insertamum, ext_id - LIMIT 1 - ) < ? - AND stg.melderelevant - AND prestudent.bismelden"; - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($prestudent_id)) - { - $qry .= " AND prestudent.prestudent_id = ?"; - $params[] = $prestudent_id; - } - - if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz NOT IN ?"; - $params[] = $exkludierte_studiengang_kz; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - /** - * Status Dates and status studysemester dates should be in correct order. - * @param studiengang_kz int if check is to be executed for certain Studiengang - * @param prestudent_id int if check is to be executed only for one prestudent - * @param exkludierte_studiengang_kz array if check is to be executed only for certain Studiengaenge - * @return success with prestudents or error - */ - public function getDatumStudiensemesterFalscheReihenfolge($studiengang_kz = null, $prestudent_id = null, $exkludierte_studiengang_kz = null) - { - $params = array(); - - // all active students with Status student in current semester - $qry = " - SELECT DISTINCT ON (prestudent_id) * - FROM ( - SELECT - prestudent.person_id, prestudent.prestudent_id, - stg.studiengang_kz, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, - ROW_NUMBER () OVER ( - PARTITION BY prestudent.prestudent_id - ORDER BY sem.start DESC, status.datum DESC, status.insertamum DESC, status.ext_id DESC - ) AS reihenfolge_semester, - ROW_NUMBER () OVER ( - PARTITION BY prestudent.prestudent_id - ORDER BY status.datum DESC, status.insertamum DESC, status.ext_id DESC - ) AS reihenfolge_datum - FROM - public.tbl_student student - JOIN public.tbl_benutzer benutzer on(student.student_uid = benutzer.uid) - JOIN public.tbl_prestudent prestudent USING(prestudent_id) - JOIN public.tbl_prestudentstatus status USING(prestudent_id) - JOIN public.tbl_studiensemester sem USING(studiensemester_kurzbz) - JOIN public.tbl_studiengang stg ON prestudent.studiengang_kz = stg.studiengang_kz - WHERE - benutzer.aktiv=true - AND status.status_kurzbz='Student' - ) reihenfolge - WHERE reihenfolge_semester <> reihenfolge_datum"; - - if (isset($studiengang_kz)) - { - $qry .= " AND studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($prestudent_id)) - { - $qry .= " AND prestudent_id = ?"; - $params[] = $prestudent_id; - } - - if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) - { - $qry .= " AND studiengang_kz NOT IN ?"; - $params[] = $exkludierte_studiengang_kz; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - /** - * Students with active Benutzer should have a status in the current semester. - * @param studiengang_kz int if check is to be executed for certain Studiengang - * @param prestudent_id int if check is to be executed only for one prestudent - * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check - * @return success with prestudents or error - */ - public function getAktiverStudentOhneStatus($studiengang_kz = null, $prestudent_id = null, $exkludierte_studiengang_kz = null) - { - $params = array(); - - $qry = " - SELECT - DISTINCT (student_uid), prestudent.person_id, prestudent.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz - FROM - public.tbl_student student - JOIN public.tbl_benutzer benutzer on (benutzer.uid = student.student_uid) - JOIN public.tbl_prestudent prestudent USING(prestudent_id) - JOIN public.tbl_studiengang stg ON prestudent.studiengang_kz = stg.studiengang_kz - WHERE - benutzer.aktiv=TRUE - AND stg.melderelevant - AND prestudent.bismelden - AND NOT EXISTS ( - SELECT 1 - FROM public.tbl_prestudentstatus - JOIN public.tbl_studiensemester sem USING (studiensemester_kurzbz) - WHERE prestudent_id = prestudent.prestudent_id - /* buffer of four months, as status are often entered later */ - AND sem.ende::date > NOW() - interval '4 months' - )"; - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($prestudent_id)) - { - $qry .= " AND prestudent.prestudent_id = ?"; - $params[] = $prestudent_id; - } - - if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz NOT IN ?"; - $params[] = $exkludierte_studiengang_kz; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - /** - * Studienplan should be valid in current Ausbildungssemester of prestudent. - * @param studiensemester_kurzbz string check is to be executed for certain Studiensemester - * @param studiengang_kz int if check is to be executed for certain Studiengang - * @param prestudent_id int if check is to be executed only for one prestudent - * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check - * @return success with prestudents or error - */ - public function getStudienplanUngueltig( - $studiensemester_kurzbz, - $studiengang_kz = null, - $prestudent_id = null, - $exkludierte_studiengang_kz = null - ) { - $params = array($studiensemester_kurzbz); - - $qry = " - SELECT - DISTINCT pre.person_id, pre.prestudent_id, - tbl_studienplan.bezeichnung AS studienplan, - status.status_kurzbz, - status.studiensemester_kurzbz, - status.ausbildungssemester, - stg.oe_kurzbz AS prestudent_stg_oe_kurzbz - FROM - public.tbl_prestudent pre - JOIN public.tbl_prestudentstatus status USING(prestudent_id) - JOIN public.tbl_person USING(person_id) - JOIN lehre.tbl_studienplan USING(studienplan_id) - JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz - WHERE - status_kurzbz in('Student', 'Interessent','Bewerber','Aufgenommener') - AND NOT EXISTS ( - SELECT - 1 - FROM - lehre.tbl_studienplan_semester - WHERE - studienplan_id=status.studienplan_id - AND tbl_studienplan_semester.semester = status.ausbildungssemester - AND tbl_studienplan_semester.studiensemester_kurzbz = status.studiensemester_kurzbz - ) - AND status.studiensemester_kurzbz=? - AND pre.bismelden - AND stg.melderelevant"; - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($prestudent_id)) - { - $qry .= " AND tbl_prestudent.prestudent_id = ?"; - $params[] = $prestudent_id; - } - - if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz NOT IN ?"; - $params[] = $exkludierte_studiengang_kz; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - /** - * Students with finished studies should have exactly one final exam. - * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester - * @param studiengang_kz int if check is to be executed for certain Studiengang - * @param prestudent_id int if check is to be executed only for one prestudent - * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check - * @return success with prestudents or error - */ - public function getFalscheAnzahlAbschlusspruefungen( - $studiensemester_kurzbz = null, - $studiengang_kz = null, - $prestudent_id = null, - $exkludierte_studiengang_kz = null - ) { - $params = array(); - - $qry = " - SELECT * FROM ( - SELECT - DISTINCT ON(pre.prestudent_id) pre.person_id, pre.prestudent_id, student_uid, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, - ( - SELECT COUNT(*) - FROM lehre.tbl_abschlusspruefung - WHERE student_uid = stud.student_uid - AND abschlussbeurteilung_kurzbz != 'nicht' - AND abschlussbeurteilung_kurzbz IS NOT NULL - ) AS anzahl_abschlusspruefungen - FROM - public.tbl_prestudent pre - JOIN public.tbl_student stud USING(prestudent_id) - JOIN public.tbl_prestudentstatus status USING(prestudent_id) - JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz - WHERE - status_kurzbz = 'Absolvent' - AND pre.bismelden - AND stg.melderelevant - AND NOT EXISTS ( /* exclude gs */ - SELECT 1 - FROM bis.tbl_mobilitaet - WHERE prestudent_id = pre.prestudent_id - AND studiensemester_kurzbz = status.studiensemester_kurzbz - )"; - - if (isset($studiensemester_kurzbz)) - { - $qry .= " AND status.studiensemester_kurzbz = ?"; - $params[] = $studiensemester_kurzbz; - } - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($prestudent_id)) - { - $qry .= " AND pre.prestudent_id = ?"; - $params[] = $prestudent_id; - } - - if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz NOT IN ?"; - $params[] = $exkludierte_studiengang_kz; - } - - $qry .= ") studenten - WHERE anzahl_abschlusspruefungen != 1"; - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - /** - * Date of final exam shouldn't be missing for Absolvent. - * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester - * @param studiengang_kz int if check is to be executed for certain Studiengang - * @param abschlusspruefung_id int if check is to be executed for a certain Abschlussprüfung - * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check - * @return success with prestudents or error - */ - public function getDatumAbschlusspruefungFehlt( - $studiensemester_kurzbz = null, - $studiengang_kz = null, - $abschlusspruefung_id = null, - $exkludierte_studiengang_kz = null - ) { - $results = array(); - - $pruefungenRes = $this->_getInvalidAbschlusspruefungen( - $studiensemester_kurzbz, - $studiengang_kz, - $abschlusspruefung_id, - $exkludierte_studiengang_kz - ); - - if (isError($pruefungenRes)) return $pruefungenRes; - - if (hasData($pruefungenRes)) - { - $pruefungen = getData($pruefungenRes); - - foreach ($pruefungen as $pruefung) - { - if (isEmptyString($pruefung->datum)) $results[] = $pruefung; - } - } - - return success($results); - } - - /** - * Date of sponsion shouldn't be missing for Absolvent. - * @param studiensemester_kurzbz string check is to be executed for certain Studiensemester - * @param studiengang_kz int if check is to be executed for certain Studiengang - * @param abschlusspruefung_id int if check is to be executed only for a certain Abschlussprüfung - * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check - * @return success with prestudents or error - */ - public function getDatumSponsionFehlt( - $studiensemester_kurzbz = null, - $studiengang_kz = null, - $abschlusspruefung_id = null, - $exkludierte_studiengang_kz = null - ) { - $results = array(); - - $pruefungenRes = $this->_getInvalidAbschlusspruefungen( - $studiensemester_kurzbz, - $studiengang_kz, - $abschlusspruefung_id, - $exkludierte_studiengang_kz - ); - - if (isError($pruefungenRes)) return $pruefungenRes; - - if (hasData($pruefungenRes)) - { - $pruefungen = getData($pruefungenRes); - - foreach ($pruefungen as $pruefung) - { - if (isEmptyString($pruefung->sponsion)) $results[] = $pruefung; - } - } - - return success($results); - } - - /** - * Bewerber should have participated in Reihungstest. - * @param studiensemester_kurzbz string check is to be executed for certain Studiensemester - * @param studiengang_kz int if check is to be executed for certain Studiengang - * @param prestudent_id int if check is to be executed only for one prestudent - * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check - * @return success with prestudents or error - */ - public function getBewerberNichtZumRtAngetreten( - $studiensemester_kurzbz, - $studiengang_kz = null, - $prestudent_id = null, - $exkludierte_studiengang_kz = null - ) { - $previousStudiensemesterRes = $this->_ci->StudiensemesterModel->getPreviousFrom($studiensemester_kurzbz); - - if (isError($previousStudiensemesterRes)) return $previousStudiensemesterRes; - - $params = array($studiensemester_kurzbz); - - $qry = " - SELECT - prestudent.person_id, prestudent.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, status.studiensemester_kurzbz - FROM - public.tbl_prestudent prestudent - JOIN public.tbl_prestudentstatus status ON(prestudent.prestudent_id=status.prestudent_id) - JOIN public.tbl_person USING(person_id) - LEFT JOIN bis.tbl_orgform USING(orgform_kurzbz) - JOIN public.tbl_studiengang stg USING(studiengang_kz) - WHERE - status_kurzbz='Bewerber' - AND reihungstestangetreten=false - AND stg.melderelevant - AND prestudent.bismelden"; - - if (hasData($previousStudiensemesterRes)) - { - $previousStudiensemester = getData($previousStudiensemesterRes)[0]->studiensemester_kurzbz; - $qry .= " AND (studiensemester_kurzbz=? OR studiensemester_kurzbz=?)"; - $params[] = $previousStudiensemester; - } - else - { - $qry .= " AND studiensemester_kurzbz=?"; - } - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($prestudent_id)) - { - $qry .= " AND prestudent.prestudent_id = ?"; - $params[] = $prestudent_id; - } - - if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz NOT IN ?"; - $params[] = $exkludierte_studiengang_kz; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - /** - * Current Ausbildungssemester shouldn't be 0. - * @param studiensemester_kurzbz string check is to be executed for certain Studiensemester - * @param studiengang_kz int if check is to be executed for certain Studiengang - * @param prestudent_id int if check is to be executed only for one prestudent - * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check - * @return success with prestudents or error - */ - public function getAktSemesterNull($studiensemester_kurzbz, $studiengang_kz = null, $prestudent_id = null, $exkludierte_studiengang_kz = null) - { - $params = array($studiensemester_kurzbz); - - $qry = " - SELECT - DISTINCT pre.person_id, pre.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, prestat.studiensemester_kurzbz - FROM - public.tbl_prestudent pre - JOIN public.tbl_prestudentstatus prestat USING(prestudent_id) - JOIN public.tbl_studiengang stg USING(studiengang_kz) - WHERE - prestat.status_kurzbz != 'Incoming' - AND prestat.studiensemester_kurzbz = ? - AND ausbildungssemester = 0 - AND stg.melderelevant - AND pre.bismelden"; - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($prestudent_id)) - { - $qry .= " AND pre.prestudent_id = ?"; - $params[] = $prestudent_id; - } - - if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz NOT IN ?"; - $params[] = $exkludierte_studiengang_kz; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - /** - * Prestudent should have a final status. - * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester - * @param studiengang_kz int if check is to be executed for certain Studiengang - * @param prestudent_id int if check is to be executed only for one prestudent - * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check - * @return success with prestudents or error - */ - public function getAbschlussstatusFehlt( - $studiensemester_kurzbz = null, - $studiengang_kz = null, - $prestudent_id = null, - $exkludierte_studiengang_kz = null - ) { - $params = array(); - - $qry = " - SELECT - DISTINCT ON (pre.prestudent_id) - pre.person_id, pre.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, status.studiensemester_kurzbz - FROM - public.tbl_prestudent pre - JOIN public.tbl_person USING(person_id) - JOIN public.tbl_prestudentstatus status USING(prestudent_id) - JOIN public.tbl_studiengang stg USING(studiengang_kz) - WHERE - NOT EXISTS( /*student does not study anymore*/ - SELECT - 1 - FROM - public.tbl_prestudentstatus ps - JOIN public.tbl_studiensemester USING(studiensemester_kurzbz) - WHERE - prestudent_id=pre.prestudent_id - /* 4 months: There might be Diplomanden, in summer months end status is often not entered yet */ - AND tbl_studiensemester.ende>now() - interval '4 months' - ) - /* check only valid begininng with 2018 */ - AND '2018-01-01'<(SELECT max(datum) FROM public.tbl_prestudentstatus WHERE prestudent_id=pre.prestudent_id) - AND NOT EXISTS( /* no end status */ - SELECT 1 - FROM public.tbl_prestudentstatus ps - WHERE - prestudent_id=pre.prestudent_id - AND status_kurzbz IN('Abbrecher','Abgewiesener','Absolvent','Incoming') - ) - AND stg.melderelevant - AND pre.bismelden"; - - if (isset($studiensemester_kurzbz)) - { - $prevStudiensemesterRes = $this->_ci->StudiensemesterModel->getPreviousFrom($studiensemester_kurzbz); - - if (isError($prevStudiensemesterRes)) return $prevStudiensemesterRes; - - if (hasData($prevStudiensemesterRes)) - { - // if Studiensemester given, check only if has status in current or previous semester - $prevStudiensemester = getData($prevStudiensemesterRes)[0]->studiensemester_kurzbz; - $qry .= " AND EXISTS ( - SELECT 1 - FROM public.tbl_prestudentstatus ps - WHERE studiensemester_kurzbz IN (?, ?) - AND ps.prestudent_id = pre.prestudent_id - )"; - $params[] = $prevStudiensemester; - $params[] = $studiensemester_kurzbz; - } - } - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($prestudent_id)) - { - $qry .= " AND pre.prestudent_id = ?"; - $params[] = $prestudent_id; - } - - if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz NOT IN ?"; - $params[] = $exkludierte_studiengang_kz; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - /** - * Student with active status should have been charged, i.e. have a Kontobuchung with a negative or zero value. - * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester - * @param studiengang_kz int if check is to be executed for certain Studiengang - * @param prestudent_id int if check is to be executed only for one prestudent - * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check - * @return success with prestudents or error - */ - public function getAktiverStudentstatusOhneKontobuchung( - $studiensemester_kurzbz, - $studiengang_kz = null, - $prestudent_id = null, - $exkludierte_studiengang_kz = null - ) { - $params = array($studiensemester_kurzbz); - - $qry = " - SELECT - DISTINCT ON (pre.prestudent_id) - pre.person_id, pre.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, status.studiensemester_kurzbz - FROM - public.tbl_prestudent pre - JOIN public.tbl_person pers USING(person_id) - JOIN public.tbl_prestudentstatus status USING(prestudent_id) - JOIN public.tbl_studiengang stg USING(studiengang_kz) - WHERE - status.studiensemester_kurzbz = ? - AND status.status_kurzbz IN ('Student', 'Incoming') - AND NOT EXISTS ( - SELECT 1 - FROM - public.tbl_konto - WHERE - person_id = pers.person_id - AND studiensemester_kurzbz = status.studiensemester_kurzbz - AND buchungsnr_verweis IS NULL - AND betrag <= 0 - ) - AND stg.melderelevant - AND pre.bismelden"; - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($prestudent_id)) - { - $qry .= " AND pre.prestudent_id = ?"; - $params[] = $prestudent_id; - } - - if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz NOT IN ?"; - $params[] = $exkludierte_studiengang_kz; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - //------------------------------------------------------------------------------------------------------------------ - // Person checks - - /** - * Birthdate is too long ago. - * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester - * @param studiengang_kz int if check is to be executed for certain Studiengang - * @param person_id int if check is to be executed only for one person - * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check - * @return success with prestudents or error - */ - public function getGbDatumWeitZurueck( - $studiensemester_kurzbz = null, - $studiengang_kz = null, - $person_id = null, - $exkludierte_studiengang_kz = null - ) { - $params = array(); - - $qry = " - SELECT - pers.person_id - FROM - public.tbl_person pers - WHERE - pers.gebdatum < '1920-01-01' - AND EXISTS ( - SELECT 1 - FROM public.tbl_prestudent - JOIN public.tbl_prestudentstatus status USING(prestudent_id) - JOIN public.tbl_studiengang stg USING(studiengang_kz) - WHERE person_id = pers.person_id"; - - if (isset($studiensemester_kurzbz)) - { - $qry .= " AND status.studiensemester_kurzbz = ?"; - $params[] = $studiensemester_kurzbz; - } - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - $qry .= ")"; - - if (isset($person_id)) - { - $qry .= " AND pers.person_id = ?"; - $params[] = $person_id; - } - - if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz NOT IN ?"; - $params[] = $exkludierte_studiengang_kz; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - /** - * Nation is not Austria, but address has austrian Gemeinde. - * @param studiengang_kz int if check is to be executed for certain Studiengang - * @param person_id int if check is to be executed only for one person - * @return success with prestudents or error - */ - public function getNationNichtOesterreichAberGemeinde($studiengang_kz = null, $person_id = null, $exkludierte_studiengang_kz = null) - { - $params = array(); - - $qry = "SELECT DISTINCT tbl_person.person_id, adr.gemeinde, adr.adresse_id - FROM - public.tbl_adresse adr - JOIN public.tbl_prestudent USING(person_id) - JOIN public.tbl_person USING(person_id) - JOIN public.tbl_student USING(prestudent_id) - JOIN public.tbl_benutzer ON(uid=student_uid) - JOIN public.tbl_studiengang stg ON tbl_prestudent.studiengang_kz = stg.studiengang_kz - WHERE - adr.nation!='A' - AND tbl_benutzer.aktiv - AND gemeinde NOT IN ('Münster') - AND EXISTS(SELECT 1 FROM bis.tbl_gemeinde WHERE name = adr.gemeinde)"; - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($person_id)) - { - $qry .= " AND tbl_person.person_id = ?"; - $params[] = $person_id; - } - - if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz NOT IN ?"; - $params[] = $exkludierte_studiengang_kz; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - /** - * Students should have exactly one home address. - * @param studiensemester_kurzbz string check is to be executed for certain Studiensemester - * @param studiengang_kz int if check is to be executed for certain Studiengang - * @param person_id int if check is to be executed only for one person - * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check - * @return success with prestudents or error - */ - public function getFalscheAnzahlHeimatadressen( - $studiensemester_kurzbz = null, - $studiengang_kz = null, - $person_id = null, - $exkludierte_studiengang_kz = null - ) { - $params = array(); - - $qry = " - SELECT - DISTINCT person_id - FROM - ( - SELECT person_id, COUNT(adresse_id) AS anzahl_adressen - FROM public.tbl_adresse addr - WHERE heimatadresse IS TRUE - GROUP BY person_id - ) adressen - JOIN public.tbl_person USING(person_id) - JOIN public.tbl_prestudent pre USING(person_id) - JOIN public.tbl_prestudentstatus status USING(prestudent_id) - JOIN public.tbl_student USING(prestudent_id) - JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz - WHERE - anzahl_adressen != 1 - AND stg.melderelevant - AND pre.bismelden"; - - if (isset($studiensemester_kurzbz)) - { - $qry .= " AND status.studiensemester_kurzbz = ?"; - $params[] = $studiensemester_kurzbz; - } - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($person_id)) - { - $qry .= " AND person_id = ?"; - $params[] = $person_id; - } - - if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz NOT IN ?"; - $params[] = $exkludierte_studiengang_kz; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - /** - * Students should have exactly one delivery address. - * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester - * @param studiengang_kz int if check is to be executed for certain Studiengang - * @param person_id int if check is to be executed only for one person - * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check - * @return success with prestudents or error - */ - public function getFalscheAnzahlZustelladressen( - $studiensemester_kurzbz = null, - $studiengang_kz = null, - $person_id = null, - $exkludierte_studiengang_kz = null - ) { - $params = array(); - - $qry = " - SELECT - DISTINCT person_id - FROM - ( - SELECT person_id, COUNT(adresse_id) AS anzahl_adressen - FROM public.tbl_adresse addr - WHERE zustelladresse IS TRUE - GROUP BY person_id - ) adressen - JOIN public.tbl_person USING(person_id) - JOIN public.tbl_prestudent pre USING(person_id) - JOIN public.tbl_prestudentstatus status USING(prestudent_id) - JOIN public.tbl_student USING(prestudent_id) - JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz - WHERE - anzahl_adressen != 1 - AND stg.melderelevant - AND pre.bismelden"; - - if (isset($studiensemester_kurzbz)) - { - $qry .= " AND status.studiensemester_kurzbz = ?"; - $params[] = $studiensemester_kurzbz; - } - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($person_id)) - { - $qry .= " AND person_id = ?"; - $params[] = $person_id; - } - - if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz NOT IN ?"; - $params[] = $exkludierte_studiengang_kz; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - //------------------------------------------------------------------------------------------------------------------ - // I/O checks - - /** - * Incoming shouldn't have austrian home address. - * @param studiensemester_kurzbz string check is to be executed for certain Studiensemester - * @param studiengang_kz int if check is to be executed for certain Studiengang - * @param person_id int if check is to be executed only for one person - * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check - * @return success with prestudents or error - */ - public function getIncomingHeimatNationOesterreich( - $studiensemester_kurzbz, - $studiengang_kz = null, - $person_id = null, - $exkludierte_studiengang_kz = null - ) { - $params = array($studiensemester_kurzbz); - - $qry = " - SELECT - DISTINCT pers.person_id, status.studiensemester_kurzbz - FROM - public.tbl_prestudent pre - JOIN public.tbl_prestudentstatus status USING(prestudent_id) - JOIN public.tbl_person pers USING(person_id) - JOIN public.tbl_adresse addr USING(person_id) - JOIN public.tbl_studiengang stg USING(studiengang_kz) - WHERE - status.status_kurzbz = 'Incoming' - AND addr.nation = 'A' - AND addr.heimatadresse - AND status.studiensemester_kurzbz = ? - AND stg.melderelevant - AND pre.bismelden"; - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($person_id)) - { - $qry .= " AND pers.person_id = ?"; - $params[] = $person_id; - } - - if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz NOT IN ?"; - $params[] = $exkludierte_studiengang_kz; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - /** - * Incoming should have IN/OUT data. - * @param studiengang_kz int if check is to be executed for certain Studiengang - * @param prestudent_id int if check is to be executed only for one prestudent - * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check - * @return success with prestudents or error - */ - public function getIncomingOhneIoDatensatz($studiengang_kz = null, $prestudent_id = null, $exkludierte_studiengang_kz = null) - { - $params = array(); - - $qry = " - SELECT - DISTINCT ON(student_uid, nachname, vorname) - tbl_person.person_id, - tbl_prestudent.prestudent_id, - stg.oe_kurzbz AS prestudent_stg_oe_kurzbz - FROM - public.tbl_student - JOIN public.tbl_benutzer ON(student_uid=uid) - JOIN public.tbl_person USING(person_id) - JOIN public.tbl_prestudent USING(prestudent_id) - JOIN public.tbl_prestudentstatus ON(tbl_prestudent.prestudent_id=tbl_prestudentstatus.prestudent_id) - JOIN public.tbl_studiengang stg ON(stg.studiengang_kz=tbl_student.studiengang_kz) - WHERE - bismelden=TRUE - AND status_kurzbz='Incoming' AND NOT EXISTS (SELECT 1 FROM bis.tbl_bisio WHERE student_uid=tbl_student.student_uid) - AND stg.melderelevant"; - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($prestudent_id)) - { - $qry .= " AND tbl_prestudent.prestudent_id = ?"; - $params[] = $prestudent_id; - } - - if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz NOT IN ?"; - $params[] = $exkludierte_studiengang_kz; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - /** - * Incoming or gemeinsame Studien students should not receive funding (not be förderrelevant). - * @param studiensemester_kurzbz string check is to be executed for certain Studiensemester - * @param studiengang_kz int if check is to be executed for certain Studiengang - * @param prestudent_id int if check is to be executed only for one prestudent - * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check - * @return object success or error - */ - public function getIncomingOrGsFoerderrelevant( - $studiensemester_kurzbz = null, - $studiengang_kz = null, - $prestudent_id = null, - $exkludierte_studiengang_kz = null - ) { - $params = array(); - - $qry = " - SELECT - DISTINCT ON(prestudent_id) - pers.person_id, - ps.prestudent_id, - stg.oe_kurzbz AS prestudent_stg_oe_kurzbz - FROM - public.tbl_student stud - JOIN public.tbl_benutzer ON(student_uid=uid) - JOIN public.tbl_person pers USING(person_id) - JOIN public.tbl_prestudent ps USING(prestudent_id) - JOIN public.tbl_prestudentstatus status USING(prestudent_id) - JOIN public.tbl_studiengang stg ON(stg.studiengang_kz=stud.studiengang_kz) - WHERE - ( - status.status_kurzbz = 'Incoming' - OR EXISTS ( - SELECT 1 - FROM - bis.tbl_mobilitaet - JOIN public.tbl_prestudent USING(prestudent_id) - WHERE - prestudent_id = ps.prestudent_id - AND gsstudientyp_kurzbz = 'Extern' - ) - ) - AND (ps.foerderrelevant <> FALSE OR ps.foerderrelevant IS NULL) - AND bismelden=TRUE - AND stg.melderelevant"; - - if (isset($studiensemester_kurzbz)) - { - $qry .= " AND status.studiensemester_kurzbz = ?"; - $params[] = $studiensemester_kurzbz; - } - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($prestudent_id)) - { - $qry .= " AND ps.prestudent_id = ?"; - $params[] = $prestudent_id; - } - - if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz NOT IN ?"; - $params[] = $exkludierte_studiengang_kz; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - //------------------------------------------------------------------------------------------------------------------ - // Private methods - - /** - * Get final exams in a semester which are invalid (e.g. missing data) - * @param studiensemester_kurzbz string if check is to be executed for certain Studiengang - * @param studiengang_kz int if check is to be executed for certain Studiengang - * @param abschlusspruefung_id int if check is to be executed for certain Abschlussprüfung - * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check - */ - private function _getInvalidAbschlusspruefungen( - $studiensemester_kurzbz = null, - $studiengang_kz = null, - $abschlusspruefung_id = null, - $exkludierte_studiengang_kz = null - ) { - $params = array(); - - $qry = " - SELECT - pre.person_id, pre.prestudent_id, - pruefung.sponsion, pruefung.datum, pruefung.abschlusspruefung_id, - stg.oe_kurzbz AS prestudent_stg_oe_kurzbz - FROM - public.tbl_prestudent pre - JOIN public.tbl_student stud USING(prestudent_id) - JOIN public.tbl_prestudentstatus prestatus USING(prestudent_id) - JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz - JOIN lehre.tbl_abschlusspruefung pruefung ON stud.student_uid = pruefung.student_uid - WHERE - status_kurzbz = 'Absolvent' - AND NOT EXISTS ( /* exclude gs */ - SELECT 1 - FROM bis.tbl_mobilitaet - WHERE prestudent_id = pre.prestudent_id - AND studiensemester_kurzbz = prestatus.studiensemester_kurzbz - ) - AND abschlussbeurteilung_kurzbz!='nicht' - AND abschlussbeurteilung_kurzbz IS NOT NULL - AND (pruefung.datum IS NULL OR pruefung.sponsion IS NULL) - AND pre.bismelden - AND stg.melderelevant"; - - if (isset($studiensemester_kurzbz)) - { - $qry .= " AND prestatus.studiensemester_kurzbz = ?"; - $params[] = $studiensemester_kurzbz; - } - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($abschlusspruefung_id)) - { - $qry .= " AND pruefung.abschlusspruefung_id = ?"; - $params[] = $abschlusspruefung_id; - } - - if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz NOT IN ?"; - $params[] = $exkludierte_studiengang_kz; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - /** - * Gets Bismeldedate from Studiensemester. - * @param studiensemester_kurzbz string - */ - private function _getBisdateFromSemester($studiensemester_kurzbz) - { - $semesterYear = substr($studiensemester_kurzbz, 2, 6); - $semesterType = substr($studiensemester_kurzbz, 0, 2); - - if ($semesterType == 'SS') - { - return date_format(date_create(($semesterYear - 1)."-11-15"), 'Y-m-d'); - } - - if ($semesterType == 'WS') - { - return date_format(date_create($semesterYear."-04-15"), 'Y-m-d'); - } - } -} diff --git a/application/libraries/issues/plausichecks/AbbrecherAktiv.php b/application/libraries/issues/plausichecks/AbbrecherAktiv.php index caa8dd91c..9eae389b5 100644 --- a/application/libraries/issues/plausichecks/AbbrecherAktiv.php +++ b/application/libraries/issues/plausichecks/AbbrecherAktiv.php @@ -20,7 +20,7 @@ class AbbrecherAktiv extends PlausiChecker $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; // get all students failing the plausicheck - $prestudentRes = $this->_ci->plausichecklib->getAbbrecherAktiv($studiengang_kz, null, $exkludierte_studiengang_kz); + $prestudentRes = $this->getAbbrecherAktiv($studiengang_kz, null, $exkludierte_studiengang_kz); if (isError($prestudentRes)) return $prestudentRes; @@ -43,4 +43,49 @@ class AbbrecherAktiv extends PlausiChecker // return the results return success($results); } + + /** + * Abbrecher cannot be active. + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param prestudent_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + public function getAbbrecherAktiv($studiengang_kz = null, $prestudent_id = null, $exkludierte_studiengang_kz = null) + { + $params = array(); + + $qry = " + SELECT + pre.person_id, pre.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz + FROM + public.tbl_prestudentstatus pre_status + JOIN public.tbl_prestudent pre USING(prestudent_id) + JOIN public.tbl_student student USING(prestudent_id) + JOIN public.tbl_benutzer benutzer on(benutzer.uid=student.student_uid) + JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz + WHERE + pre_status.status_kurzbz ='Abbrecher' + AND benutzer.aktiv=true"; + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND pre.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } } diff --git a/application/libraries/issues/plausichecks/AbschlussstatusFehlt.php b/application/libraries/issues/plausichecks/AbschlussstatusFehlt.php index e7894c7a8..3690e1331 100644 --- a/application/libraries/issues/plausichecks/AbschlussstatusFehlt.php +++ b/application/libraries/issues/plausichecks/AbschlussstatusFehlt.php @@ -21,7 +21,7 @@ class AbschlussstatusFehlt extends PlausiChecker $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; // get all students failing the plausicheck - $prestudentRes = $this->_ci->plausichecklib->getAbschlussstatusFehlt( + $prestudentRes = $this->getAbschlussstatusFehlt( $studiensemester_kurzbz, $studiengang_kz, null, @@ -49,4 +49,95 @@ class AbschlussstatusFehlt extends PlausiChecker // return the results return success($results); } + + /** + * Prestudent should have a final status. + * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param prestudent_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + public function getAbschlussstatusFehlt( + $studiensemester_kurzbz = null, + $studiengang_kz = null, + $prestudent_id = null, + $exkludierte_studiengang_kz = null + ) { + $params = array(); + + $qry = " + SELECT + DISTINCT ON (pre.prestudent_id) + pre.person_id, pre.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, status.studiensemester_kurzbz + FROM + public.tbl_prestudent pre + JOIN public.tbl_person USING(person_id) + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_studiengang stg USING(studiengang_kz) + WHERE + NOT EXISTS( /*student does not study anymore*/ + SELECT + 1 + FROM + public.tbl_prestudentstatus ps + JOIN public.tbl_studiensemester USING(studiensemester_kurzbz) + WHERE + prestudent_id=pre.prestudent_id + /* 4 months: There might be Diplomanden, in summer months end status is often not entered yet */ + AND tbl_studiensemester.ende>now() - interval '4 months' + ) + /* check only valid begininng with 2018 */ + AND '2018-01-01'<(SELECT max(datum) FROM public.tbl_prestudentstatus WHERE prestudent_id=pre.prestudent_id) + AND NOT EXISTS( /* no end status */ + SELECT 1 + FROM public.tbl_prestudentstatus ps + WHERE + prestudent_id=pre.prestudent_id + AND status_kurzbz IN('Abbrecher','Abgewiesener','Absolvent','Incoming') + ) + AND stg.melderelevant + AND pre.bismelden"; + + if (isset($studiensemester_kurzbz)) + { + $prevStudiensemesterRes = $this->_ci->StudiensemesterModel->getPreviousFrom($studiensemester_kurzbz); + + if (isError($prevStudiensemesterRes)) return $prevStudiensemesterRes; + + if (hasData($prevStudiensemesterRes)) + { + // if Studiensemester given, check only if has status in current or previous semester + $prevStudiensemester = getData($prevStudiensemesterRes)[0]->studiensemester_kurzbz; + $qry .= " AND EXISTS ( + SELECT 1 + FROM public.tbl_prestudentstatus ps + WHERE studiensemester_kurzbz IN (?, ?) + AND ps.prestudent_id = pre.prestudent_id + )"; + $params[] = $prevStudiensemester; + $params[] = $studiensemester_kurzbz; + } + } + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND pre.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } } diff --git a/application/libraries/issues/plausichecks/AktSemesterNull.php b/application/libraries/issues/plausichecks/AktSemesterNull.php index fa251a95e..1223a2720 100644 --- a/application/libraries/issues/plausichecks/AktSemesterNull.php +++ b/application/libraries/issues/plausichecks/AktSemesterNull.php @@ -21,7 +21,7 @@ class AktSemesterNull extends PlausiChecker $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; // get all students failing the plausicheck - $prestudentRes = $this->_ci->plausichecklib->getAktSemesterNull($studiensemester_kurzbz, $studiengang_kz, null, $exkludierte_studiengang_kz); + $prestudentRes = $this->getAktSemesterNull($studiensemester_kurzbz, $studiengang_kz, null, $exkludierte_studiengang_kz); if (isError($prestudentRes)) return $prestudentRes; @@ -50,4 +50,51 @@ class AktSemesterNull extends PlausiChecker // return the results return success($results); } + + /** + * Current Ausbildungssemester shouldn't be 0. + * @param studiensemester_kurzbz string check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param prestudent_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + public function getAktSemesterNull($studiensemester_kurzbz, $studiengang_kz = null, $prestudent_id = null, $exkludierte_studiengang_kz = null) + { + $params = array($studiensemester_kurzbz); + + $qry = " + SELECT + DISTINCT pre.person_id, pre.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, prestat.studiensemester_kurzbz + FROM + public.tbl_prestudent pre + JOIN public.tbl_prestudentstatus prestat USING(prestudent_id) + JOIN public.tbl_studiengang stg USING(studiengang_kz) + WHERE + prestat.status_kurzbz != 'Incoming' + AND prestat.studiensemester_kurzbz = ? + AND ausbildungssemester = 0 + AND stg.melderelevant + AND pre.bismelden"; + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND pre.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } } diff --git a/application/libraries/issues/plausichecks/AktiverStudentOhneStatus.php b/application/libraries/issues/plausichecks/AktiverStudentOhneStatus.php index 225c6242f..94fe5cc8d 100644 --- a/application/libraries/issues/plausichecks/AktiverStudentOhneStatus.php +++ b/application/libraries/issues/plausichecks/AktiverStudentOhneStatus.php @@ -20,7 +20,7 @@ class AktiverStudentOhneStatus extends PlausiChecker $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; // get all students failing the plausicheck - $prestudentRes = $this->_ci->plausichecklib->getAktiverStudentOhneStatus($studiengang_kz, null, $exkludierte_studiengang_kz); + $prestudentRes = $this->getAktiverStudentOhneStatus($studiengang_kz, null, $exkludierte_studiengang_kz); if (isError($prestudentRes)) return $prestudentRes; @@ -43,4 +43,57 @@ class AktiverStudentOhneStatus extends PlausiChecker // return the results return success($results); } + + /** + * Students with active Benutzer should have a status in the current semester. + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param prestudent_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + public function getAktiverStudentOhneStatus($studiengang_kz = null, $prestudent_id = null, $exkludierte_studiengang_kz = null) + { + $params = array(); + + $qry = " + SELECT + DISTINCT (student_uid), prestudent.person_id, prestudent.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz + FROM + public.tbl_student student + JOIN public.tbl_benutzer benutzer on (benutzer.uid = student.student_uid) + JOIN public.tbl_prestudent prestudent USING(prestudent_id) + JOIN public.tbl_studiengang stg ON prestudent.studiengang_kz = stg.studiengang_kz + WHERE + benutzer.aktiv=TRUE + AND stg.melderelevant + AND prestudent.bismelden + AND NOT EXISTS ( + SELECT 1 + FROM public.tbl_prestudentstatus + JOIN public.tbl_studiensemester sem USING (studiensemester_kurzbz) + WHERE prestudent_id = prestudent.prestudent_id + /* buffer of four months, as status are often entered later */ + AND sem.ende::date > NOW() - interval '4 months' + )"; + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND prestudent.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } } diff --git a/application/libraries/issues/plausichecks/AktiverStudentstatusOhneKontobuchung.php b/application/libraries/issues/plausichecks/AktiverStudentstatusOhneKontobuchung.php index a9b30a1d2..28684388f 100644 --- a/application/libraries/issues/plausichecks/AktiverStudentstatusOhneKontobuchung.php +++ b/application/libraries/issues/plausichecks/AktiverStudentstatusOhneKontobuchung.php @@ -21,7 +21,7 @@ class AktiverStudentstatusOhneKontobuchung extends PlausiChecker $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; // get all students failing the plausicheck - $prestudentRes = $this->_ci->plausichecklib->getAktiverStudentstatusOhneKontobuchung( + $prestudentRes = $this->getAktiverStudentstatusOhneKontobuchung( $studiensemester_kurzbz, $studiengang_kz, null, @@ -55,4 +55,66 @@ class AktiverStudentstatusOhneKontobuchung extends PlausiChecker // return the results return success($results); } + + /** + * Student with active status should have been charged, i.e. have a Kontobuchung with a negative or zero value. + * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param prestudent_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + public function getAktiverStudentstatusOhneKontobuchung( + $studiensemester_kurzbz, + $studiengang_kz = null, + $prestudent_id = null, + $exkludierte_studiengang_kz = null + ) { + $params = array($studiensemester_kurzbz); + + $qry = " + SELECT + DISTINCT ON (pre.prestudent_id) + pre.person_id, pre.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, status.studiensemester_kurzbz + FROM + public.tbl_prestudent pre + JOIN public.tbl_person pers USING(person_id) + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_studiengang stg USING(studiengang_kz) + WHERE + status.studiensemester_kurzbz = ? + AND status.status_kurzbz IN ('Student', 'Incoming') + AND NOT EXISTS ( + SELECT 1 + FROM + public.tbl_konto + WHERE + person_id = pers.person_id + AND studiensemester_kurzbz = status.studiensemester_kurzbz + AND buchungsnr_verweis IS NULL + AND betrag <= 0 + ) + AND stg.melderelevant + AND pre.bismelden"; + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND pre.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } } diff --git a/application/libraries/issues/plausichecks/AusbildungssemPrestudentUngleichAusbildungssemStatus.php b/application/libraries/issues/plausichecks/AusbildungssemPrestudentUngleichAusbildungssemStatus.php index 3462685ab..13d800a3f 100644 --- a/application/libraries/issues/plausichecks/AusbildungssemPrestudentUngleichAusbildungssemStatus.php +++ b/application/libraries/issues/plausichecks/AusbildungssemPrestudentUngleichAusbildungssemStatus.php @@ -21,7 +21,7 @@ class AusbildungssemPrestudentUngleichAusbildungssemStatus extends PlausiChecker $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; // get all students failing the plausicheck - $prestudentRes = $this->_ci->plausichecklib->getAusbildungssemPrestudentUngleichAusbildungssemStatus( + $prestudentRes = $this->getAusbildungssemPrestudentUngleichAusbildungssemStatus( $studiensemester_kurzbz, $studiengang_kz, null, @@ -58,4 +58,61 @@ class AusbildungssemPrestudentUngleichAusbildungssemStatus extends PlausiChecker // return the results return success($results); } + + /** + * Ausbildungssemester of prestudent (lehrverband) must be the same as Ausbildungssemester of prestudentstatus. + * @param studiensemester_kurzbz string check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param prestudent_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + public function getAusbildungssemPrestudentUngleichAusbildungssemStatus( + $studiensemester_kurzbz, + $studiengang_kz = null, + $prestudent_id = null, + $exkludierte_studiengang_kz = null + ) { + $params = array($studiensemester_kurzbz, $studiensemester_kurzbz, $studiensemester_kurzbz); + + $qry = " + SELECT + DISTINCT(student.student_uid), student.student_uid, prestudent.person_id, prestudent.prestudent_id, + status.ausbildungssemester AS status_ausbildungssemester, lv.semester AS student_ausbildungssemester, status.studiensemester_kurzbz, + stg.oe_kurzbz AS prestudent_stg_oe_kurzbz + FROM + public.tbl_student student + JOIN public.tbl_studentlehrverband lv USING(student_uid) + JOIN public.tbl_prestudent prestudent USING(prestudent_id) + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_studiengang stg ON prestudent.studiengang_kz = stg.studiengang_kz + WHERE + status.studiensemester_kurzbz = ? + AND lv.studiensemester_kurzbz = ? + AND status.status_kurzbz NOT IN ('Interessent','Bewerber','Aufgenommener','Wartender','Abgewiesener','Unterbrecher') + AND get_rolle_prestudent (prestudent_id, ?)='Student' + AND status.ausbildungssemester != lv.semester"; + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND prestudent.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } + + } diff --git a/application/libraries/issues/plausichecks/BewerberNichtZumRtAngetreten.php b/application/libraries/issues/plausichecks/BewerberNichtZumRtAngetreten.php index a1b1941dd..4a9655d13 100644 --- a/application/libraries/issues/plausichecks/BewerberNichtZumRtAngetreten.php +++ b/application/libraries/issues/plausichecks/BewerberNichtZumRtAngetreten.php @@ -21,7 +21,7 @@ class BewerberNichtZumRtAngetreten extends PlausiChecker $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; // get all students failing the plausicheck - $prestudentRes = $this->_ci->plausichecklib->getBewerberNichtZumRtAngetreten( + $prestudentRes = $this->getBewerberNichtZumRtAngetreten( $studiensemester_kurzbz, $studiengang_kz, null, @@ -52,4 +52,72 @@ class BewerberNichtZumRtAngetreten extends PlausiChecker // return the results return success($results); } + + /** + * Bewerber should have participated in Reihungstest. + * @param studiensemester_kurzbz string check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param prestudent_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + public function getBewerberNichtZumRtAngetreten( + $studiensemester_kurzbz, + $studiengang_kz = null, + $prestudent_id = null, + $exkludierte_studiengang_kz = null + ) { + $this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + $previousStudiensemesterRes = $this->_ci->StudiensemesterModel->getPreviousFrom($studiensemester_kurzbz); + + if (isError($previousStudiensemesterRes)) return $previousStudiensemesterRes; + + $params = array($studiensemester_kurzbz); + + $qry = " + SELECT + prestudent.person_id, prestudent.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, status.studiensemester_kurzbz + FROM + public.tbl_prestudent prestudent + JOIN public.tbl_prestudentstatus status ON(prestudent.prestudent_id=status.prestudent_id) + JOIN public.tbl_person USING(person_id) + LEFT JOIN bis.tbl_orgform USING(orgform_kurzbz) + JOIN public.tbl_studiengang stg USING(studiengang_kz) + WHERE + status_kurzbz='Bewerber' + AND reihungstestangetreten=false + AND stg.melderelevant + AND prestudent.bismelden"; + + if (hasData($previousStudiensemesterRes)) + { + $previousStudiensemester = getData($previousStudiensemesterRes)[0]->studiensemester_kurzbz; + $qry .= " AND (studiensemester_kurzbz=? OR studiensemester_kurzbz=?)"; + $params[] = $previousStudiensemester; + } + else + { + $qry .= " AND studiensemester_kurzbz=?"; + } + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND prestudent.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } } diff --git a/application/libraries/issues/plausichecks/DatumAbschlusspruefungFehlt.php b/application/libraries/issues/plausichecks/DatumAbschlusspruefungFehlt.php index 0d66324fb..985bc1f08 100644 --- a/application/libraries/issues/plausichecks/DatumAbschlusspruefungFehlt.php +++ b/application/libraries/issues/plausichecks/DatumAbschlusspruefungFehlt.php @@ -21,7 +21,7 @@ class DatumAbschlusspruefungFehlt extends PlausiChecker $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; // get all students failing the plausicheck - $prestudentRes = $this->_ci->plausichecklib->getDatumAbschlusspruefungFehlt( + $prestudentRes = $this->getDatumAbschlusspruefungFehlt( $studiensemester_kurzbz, $studiengang_kz, null, @@ -52,4 +52,110 @@ class DatumAbschlusspruefungFehlt extends PlausiChecker // return the results return success($results); } + + /** + * Date of final exam shouldn't be missing for Absolvent. + * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param abschlusspruefung_id int if check is to be executed for a certain Abschlussprüfung + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + public function getDatumAbschlusspruefungFehlt( + $studiensemester_kurzbz = null, + $studiengang_kz = null, + $abschlusspruefung_id = null, + $exkludierte_studiengang_kz = null + ) { + $params = array(); + + $qry = " + SELECT + pre.person_id, pre.prestudent_id, + pruefung.sponsion, pruefung.datum, pruefung.abschlusspruefung_id, + stg.oe_kurzbz AS prestudent_stg_oe_kurzbz + FROM + public.tbl_prestudent pre + JOIN public.tbl_student stud USING(prestudent_id) + JOIN public.tbl_prestudentstatus prestatus USING(prestudent_id) + JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz + JOIN lehre.tbl_abschlusspruefung pruefung ON stud.student_uid = pruefung.student_uid + WHERE + status_kurzbz = 'Absolvent' + AND NOT EXISTS ( /* exclude gs */ + SELECT 1 + FROM bis.tbl_mobilitaet + WHERE prestudent_id = pre.prestudent_id + AND studiensemester_kurzbz = prestatus.studiensemester_kurzbz + ) + AND abschlussbeurteilung_kurzbz!='nicht' + AND abschlussbeurteilung_kurzbz IS NOT NULL + AND pruefung.datum IS NULL + AND pre.bismelden + AND stg.melderelevant"; + + if (isset($studiensemester_kurzbz)) + { + $qry .= " AND prestatus.studiensemester_kurzbz = ?"; + $params[] = $studiensemester_kurzbz; + } + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($abschlusspruefung_id)) + { + $qry .= " AND pruefung.abschlusspruefung_id = ?"; + $params[] = $abschlusspruefung_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } + + /** + * Date of final exam shouldn't be missing for Absolvent. + * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param abschlusspruefung_id int if check is to be executed for a certain Abschlussprüfung + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + //~ public function getDatumAbschlusspruefungFehlt( + //~ $studiensemester_kurzbz = null, + //~ $studiengang_kz = null, + //~ $abschlusspruefung_id = null, + //~ $exkludierte_studiengang_kz = null + //~ ) { + //~ $results = array(); + + //~ $pruefungenRes = $this->_getInvalidAbschlusspruefungen( + //~ $studiensemester_kurzbz, + //~ $studiengang_kz, + //~ $abschlusspruefung_id, + //~ $exkludierte_studiengang_kz + //~ ); + + //~ if (isError($pruefungenRes)) return $pruefungenRes; + + //~ if (hasData($pruefungenRes)) + //~ { + //~ $pruefungen = getData($pruefungenRes); + + //~ foreach ($pruefungen as $pruefung) + //~ { + //~ if (isEmptyString($pruefung->datum)) $results[] = $pruefung; + //~ } + //~ } + + //~ return success($results); + //~ } } diff --git a/application/libraries/issues/plausichecks/DatumSponsionFehlt.php b/application/libraries/issues/plausichecks/DatumSponsionFehlt.php index 719afc2e2..a1f32ca2f 100644 --- a/application/libraries/issues/plausichecks/DatumSponsionFehlt.php +++ b/application/libraries/issues/plausichecks/DatumSponsionFehlt.php @@ -21,7 +21,7 @@ class DatumSponsionFehlt extends PlausiChecker $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; // get all students failing the plausicheck - $prestudentRes = $this->_ci->plausichecklib->getDatumSponsionFehlt( + $prestudentRes = $this->getDatumSponsionFehlt( $studiensemester_kurzbz, $studiengang_kz, null, @@ -52,4 +52,110 @@ class DatumSponsionFehlt extends PlausiChecker // return the results return success($results); } + + /** + * Date of sponsion shouldn't be missing for Absolvent. + * @param studiensemester_kurzbz string check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param abschlusspruefung_id int if check is to be executed only for a certain Abschlussprüfung + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + public function getDatumSponsionFehlt( + $studiensemester_kurzbz = null, + $studiengang_kz = null, + $abschlusspruefung_id = null, + $exkludierte_studiengang_kz = null + ) { + $params = array(); + + $qry = " + SELECT + pre.person_id, pre.prestudent_id, + pruefung.sponsion, pruefung.datum, pruefung.abschlusspruefung_id, + stg.oe_kurzbz AS prestudent_stg_oe_kurzbz + FROM + public.tbl_prestudent pre + JOIN public.tbl_student stud USING(prestudent_id) + JOIN public.tbl_prestudentstatus prestatus USING(prestudent_id) + JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz + JOIN lehre.tbl_abschlusspruefung pruefung ON stud.student_uid = pruefung.student_uid + WHERE + status_kurzbz = 'Absolvent' + AND NOT EXISTS ( /* exclude gs */ + SELECT 1 + FROM bis.tbl_mobilitaet + WHERE prestudent_id = pre.prestudent_id + AND studiensemester_kurzbz = prestatus.studiensemester_kurzbz + ) + AND abschlussbeurteilung_kurzbz!='nicht' + AND abschlussbeurteilung_kurzbz IS NOT NULL + AND pruefung.sponsion IS NULL + AND pre.bismelden + AND stg.melderelevant"; + + if (isset($studiensemester_kurzbz)) + { + $qry .= " AND prestatus.studiensemester_kurzbz = ?"; + $params[] = $studiensemester_kurzbz; + } + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($abschlusspruefung_id)) + { + $qry .= " AND pruefung.abschlusspruefung_id = ?"; + $params[] = $abschlusspruefung_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } + + /** + * Date of sponsion shouldn't be missing for Absolvent. + * @param studiensemester_kurzbz string check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param abschlusspruefung_id int if check is to be executed only for a certain Abschlussprüfung + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + //~ public function getDatumSponsionFehlt( + //~ $studiensemester_kurzbz = null, + //~ $studiengang_kz = null, + //~ $abschlusspruefung_id = null, + //~ $exkludierte_studiengang_kz = null + //~ ) { + //~ $results = array(); + + //~ $pruefungenRes = $this->_getInvalidAbschlusspruefungen( + //~ $studiensemester_kurzbz, + //~ $studiengang_kz, + //~ $abschlusspruefung_id, + //~ $exkludierte_studiengang_kz + //~ ); + + //~ if (isError($pruefungenRes)) return $pruefungenRes; + + //~ if (hasData($pruefungenRes)) + //~ { + //~ $pruefungen = getData($pruefungenRes); + + //~ foreach ($pruefungen as $pruefung) + //~ { + //~ if (isEmptyString($pruefung->sponsion)) $results[] = $pruefung; + //~ } + //~ } + + //~ return success($results); + //~ } } diff --git a/application/libraries/issues/plausichecks/DatumStudiensemesterFalscheReihenfolge.php b/application/libraries/issues/plausichecks/DatumStudiensemesterFalscheReihenfolge.php index e1f01f735..381bea7df 100644 --- a/application/libraries/issues/plausichecks/DatumStudiensemesterFalscheReihenfolge.php +++ b/application/libraries/issues/plausichecks/DatumStudiensemesterFalscheReihenfolge.php @@ -20,7 +20,7 @@ class DatumStudiensemesterFalscheReihenfolge extends PlausiChecker $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; // get all students failing the plausicheck - $prestudentRes = $this->_ci->plausichecklib->getDatumStudiensemesterFalscheReihenfolge($studiengang_kz, null, $exkludierte_studiengang_kz); + $prestudentRes = $this->getDatumStudiensemesterFalscheReihenfolge($studiengang_kz, null, $exkludierte_studiengang_kz); if (isError($prestudentRes)) return $prestudentRes; @@ -45,4 +45,64 @@ class DatumStudiensemesterFalscheReihenfolge extends PlausiChecker // return the results return success($results); } + + /** + * Status Dates and status studysemester dates should be in correct order. + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param prestudent_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if check is to be executed only for certain Studiengaenge + * @return success with prestudents or error + */ + public function getDatumStudiensemesterFalscheReihenfolge($studiengang_kz = null, $prestudent_id = null, $exkludierte_studiengang_kz = null) + { + $params = array(); + + // all active students with Status student in current semester + $qry = " + SELECT DISTINCT ON (prestudent_id) * + FROM ( + SELECT + prestudent.person_id, prestudent.prestudent_id, + stg.studiengang_kz, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, + ROW_NUMBER () OVER ( + PARTITION BY prestudent.prestudent_id + ORDER BY sem.start DESC, status.datum DESC, status.insertamum DESC, status.ext_id DESC + ) AS reihenfolge_semester, + ROW_NUMBER () OVER ( + PARTITION BY prestudent.prestudent_id + ORDER BY status.datum DESC, status.insertamum DESC, status.ext_id DESC + ) AS reihenfolge_datum + FROM + public.tbl_student student + JOIN public.tbl_benutzer benutzer on(student.student_uid = benutzer.uid) + JOIN public.tbl_prestudent prestudent USING(prestudent_id) + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_studiensemester sem USING(studiensemester_kurzbz) + JOIN public.tbl_studiengang stg ON prestudent.studiengang_kz = stg.studiengang_kz + WHERE + benutzer.aktiv=true + AND status.status_kurzbz='Student' + ) reihenfolge + WHERE reihenfolge_semester <> reihenfolge_datum"; + + if (isset($studiengang_kz)) + { + $qry .= " AND studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } } diff --git a/application/libraries/issues/plausichecks/FalscheAnzahlAbschlusspruefungen.php b/application/libraries/issues/plausichecks/FalscheAnzahlAbschlusspruefungen.php index 68b67ec29..1021fe85a 100644 --- a/application/libraries/issues/plausichecks/FalscheAnzahlAbschlusspruefungen.php +++ b/application/libraries/issues/plausichecks/FalscheAnzahlAbschlusspruefungen.php @@ -21,7 +21,7 @@ class FalscheAnzahlAbschlusspruefungen extends PlausiChecker $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; // get all students failing the plausicheck - $prestudentRes = $this->_ci->plausichecklib->getFalscheAnzahlAbschlusspruefungen( + $prestudentRes = $this->getFalscheAnzahlAbschlusspruefungen( $studiensemester_kurzbz, $studiengang_kz, null, @@ -49,4 +49,77 @@ class FalscheAnzahlAbschlusspruefungen extends PlausiChecker // return the results return success($results); } + + /** + * Students with finished studies should have exactly one final exam. + * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param prestudent_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + public function getFalscheAnzahlAbschlusspruefungen( + $studiensemester_kurzbz = null, + $studiengang_kz = null, + $prestudent_id = null, + $exkludierte_studiengang_kz = null + ) { + $params = array(); + + $qry = " + SELECT * FROM ( + SELECT + DISTINCT ON(pre.prestudent_id) pre.person_id, pre.prestudent_id, student_uid, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, + ( + SELECT COUNT(*) + FROM lehre.tbl_abschlusspruefung + WHERE student_uid = stud.student_uid + AND abschlussbeurteilung_kurzbz != 'nicht' + AND abschlussbeurteilung_kurzbz IS NOT NULL + ) AS anzahl_abschlusspruefungen + FROM + public.tbl_prestudent pre + JOIN public.tbl_student stud USING(prestudent_id) + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz + WHERE + status_kurzbz = 'Absolvent' + AND pre.bismelden + AND stg.melderelevant + AND NOT EXISTS ( /* exclude gs */ + SELECT 1 + FROM bis.tbl_mobilitaet + WHERE prestudent_id = pre.prestudent_id + AND studiensemester_kurzbz = status.studiensemester_kurzbz + )"; + + if (isset($studiensemester_kurzbz)) + { + $qry .= " AND status.studiensemester_kurzbz = ?"; + $params[] = $studiensemester_kurzbz; + } + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND pre.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + $qry .= ") studenten + WHERE anzahl_abschlusspruefungen != 1"; + + return $this->_db->execReadOnlyQuery($qry, $params); + } } diff --git a/application/libraries/issues/plausichecks/FalscheAnzahlHeimatadressen.php b/application/libraries/issues/plausichecks/FalscheAnzahlHeimatadressen.php index f3189eaa5..b3551904e 100644 --- a/application/libraries/issues/plausichecks/FalscheAnzahlHeimatadressen.php +++ b/application/libraries/issues/plausichecks/FalscheAnzahlHeimatadressen.php @@ -21,7 +21,7 @@ class FalscheAnzahlHeimatadressen extends PlausiChecker $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; // get all students failing the plausicheck - $personRes = $this->_ci->plausichecklib->getFalscheAnzahlHeimatadressen( + $personRes = $this->getFalscheAnzahlHeimatadressen( $studiensemester_kurzbz, $studiengang_kz, null, @@ -47,4 +47,67 @@ class FalscheAnzahlHeimatadressen extends PlausiChecker // return the results return success($results); } + + /** + * Students should have exactly one home address. + * @param studiensemester_kurzbz string check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param person_id int if check is to be executed only for one person + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + public function getFalscheAnzahlHeimatadressen( + $studiensemester_kurzbz = null, + $studiengang_kz = null, + $person_id = null, + $exkludierte_studiengang_kz = null + ) { + $params = array(); + + $qry = " + SELECT + DISTINCT person_id + FROM + ( + SELECT person_id, COUNT(adresse_id) AS anzahl_adressen + FROM public.tbl_adresse addr + WHERE heimatadresse IS TRUE + GROUP BY person_id + ) adressen + JOIN public.tbl_person USING(person_id) + JOIN public.tbl_prestudent pre USING(person_id) + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_student USING(prestudent_id) + JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz + WHERE + anzahl_adressen != 1 + AND stg.melderelevant + AND pre.bismelden"; + + if (isset($studiensemester_kurzbz)) + { + $qry .= " AND status.studiensemester_kurzbz = ?"; + $params[] = $studiensemester_kurzbz; + } + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($person_id)) + { + $qry .= " AND person_id = ?"; + $params[] = $person_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } } diff --git a/application/libraries/issues/plausichecks/FalscheAnzahlZustelladressen.php b/application/libraries/issues/plausichecks/FalscheAnzahlZustelladressen.php index 1fb974aa1..191b2a98e 100644 --- a/application/libraries/issues/plausichecks/FalscheAnzahlZustelladressen.php +++ b/application/libraries/issues/plausichecks/FalscheAnzahlZustelladressen.php @@ -21,7 +21,7 @@ class FalscheAnzahlZustelladressen extends PlausiChecker $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; // get all students failing the plausicheck - $personRes = $this->_ci->plausichecklib->getFalscheAnzahlZustelladressen( + $personRes = $this->getFalscheAnzahlZustelladressen( $studiensemester_kurzbz, $studiengang_kz, null, @@ -47,4 +47,69 @@ class FalscheAnzahlZustelladressen extends PlausiChecker // return the results return success($results); } + + /** + * Students should have exactly one delivery address. + * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param person_id int if check is to be executed only for one person + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + public function getFalscheAnzahlZustelladressen( + $studiensemester_kurzbz = null, + $studiengang_kz = null, + $person_id = null, + $exkludierte_studiengang_kz = null + ) { + $params = array(); + + $qry = " + SELECT + DISTINCT person_id + FROM + ( + SELECT person_id, COUNT(adresse_id) AS anzahl_adressen + FROM public.tbl_adresse addr + WHERE zustelladresse IS TRUE + GROUP BY person_id + ) adressen + JOIN public.tbl_person USING(person_id) + JOIN public.tbl_prestudent pre USING(person_id) + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_student USING(prestudent_id) + JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz + WHERE + anzahl_adressen != 1 + AND stg.melderelevant + AND pre.bismelden"; + + if (isset($studiensemester_kurzbz)) + { + $qry .= " AND status.studiensemester_kurzbz = ?"; + $params[] = $studiensemester_kurzbz; + } + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($person_id)) + { + $qry .= " AND person_id = ?"; + $params[] = $person_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } + + } diff --git a/application/libraries/issues/plausichecks/GbDatumWeitZurueck.php b/application/libraries/issues/plausichecks/GbDatumWeitZurueck.php index 5b7326986..70699b624 100644 --- a/application/libraries/issues/plausichecks/GbDatumWeitZurueck.php +++ b/application/libraries/issues/plausichecks/GbDatumWeitZurueck.php @@ -21,7 +21,7 @@ class GbDatumWeitZurueck extends PlausiChecker $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; // get all students failing the plausicheck - $personRes = $this->_ci->plausichecklib->getGbDatumWeitZurueck($studiensemester_kurzbz, $studiengang_kz, null, $exkludierte_studiengang_kz); + $personRes = $this->getGbDatumWeitZurueck($studiensemester_kurzbz, $studiengang_kz, null, $exkludierte_studiengang_kz); if (isError($personRes)) return $personRes; @@ -42,4 +42,65 @@ class GbDatumWeitZurueck extends PlausiChecker // return the results return success($results); } + + /** + * Birthdate is too long ago. + * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param person_id int if check is to be executed only for one person + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + public function getGbDatumWeitZurueck( + $studiensemester_kurzbz = null, + $studiengang_kz = null, + $person_id = null, + $exkludierte_studiengang_kz = null + ) { + $params = array(); + + $qry = " + SELECT + pers.person_id + FROM + public.tbl_person pers + WHERE + pers.gebdatum < '1920-01-01' + AND EXISTS ( + SELECT 1 + FROM public.tbl_prestudent + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_studiengang stg USING(studiengang_kz) + WHERE person_id = pers.person_id"; + + if (isset($studiensemester_kurzbz)) + { + $qry .= " AND status.studiensemester_kurzbz = ?"; + $params[] = $studiensemester_kurzbz; + } + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + $qry .= ")"; + + if (isset($person_id)) + { + $qry .= " AND pers.person_id = ?"; + $params[] = $person_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } + + } diff --git a/application/libraries/issues/plausichecks/InaktiverStudentAktiverStatus.php b/application/libraries/issues/plausichecks/InaktiverStudentAktiverStatus.php index 559d31263..dead2b1e7 100644 --- a/application/libraries/issues/plausichecks/InaktiverStudentAktiverStatus.php +++ b/application/libraries/issues/plausichecks/InaktiverStudentAktiverStatus.php @@ -21,7 +21,7 @@ class InaktiverStudentAktiverStatus extends PlausiChecker $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; // get all students failing the plausicheck - $prestudentRes = $this->_ci->plausichecklib->getInaktiverStudentAktiverStatus( + $prestudentRes = $this->getInaktiverStudentAktiverStatus( $studiensemester_kurzbz, $studiengang_kz, null, @@ -52,4 +52,62 @@ class InaktiverStudentAktiverStatus extends PlausiChecker // return the results return success($results); } + + /** + * Students with active status should have an active Benutzer. + * @param studiensemester_kurzbz string check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param prestudent_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + public function getInaktiverStudentAktiverStatus( + $studiensemester_kurzbz, + $studiengang_kz = null, + $prestudent_id = null, + $exkludierte_studiengang_kz = null + ) { + $aktStudiensemesterRes = $this->_ci->StudiensemesterModel->getAkt(); + + if (isError($aktStudiensemesterRes)) return $aktStudiensemesterRes; + + $studiensemester_kurzbz = hasData($aktStudiensemesterRes) ? getData($aktStudiensemesterRes)[0]->studiensemester_kurzbz : ''; + + $params = array($studiensemester_kurzbz); + + $qry = " + SELECT + DISTINCT(student.student_uid), prestudent.person_id, prestudent.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz + FROM + public.tbl_benutzer benutzer + JOIN public.tbl_student student on(benutzer.uid = student.student_uid) + JOIN public.tbl_prestudent prestudent USING(prestudent_id) + JOIN public.tbl_studiengang stg ON prestudent.studiengang_kz = stg.studiengang_kz + WHERE + benutzer.aktiv=false + AND EXISTS (SELECT 1 FROM public.tbl_prestudentstatus WHERE prestudent_id = prestudent.prestudent_id AND studiensemester_kurzbz = ?) + AND get_rolle_prestudent(prestudent_id, NULL) IN ('Student', 'Diplomand', 'Unterbrecher', 'Praktikant') + AND stg.melderelevant + AND prestudent.bismelden"; + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND prestudent.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } } diff --git a/application/libraries/issues/plausichecks/IncomingHeimatNationOesterreich.php b/application/libraries/issues/plausichecks/IncomingHeimatNationOesterreich.php index 113416486..d7ba7316c 100644 --- a/application/libraries/issues/plausichecks/IncomingHeimatNationOesterreich.php +++ b/application/libraries/issues/plausichecks/IncomingHeimatNationOesterreich.php @@ -21,7 +21,7 @@ class IncomingHeimatNationOesterreich extends PlausiChecker $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; // get all students failing the plausicheck - $personRes = $this->_ci->plausichecklib->getIncomingHeimatNationOesterreich( + $personRes = $this->getIncomingHeimatNationOesterreich( $studiensemester_kurzbz, $studiengang_kz, null, @@ -47,4 +47,60 @@ class IncomingHeimatNationOesterreich extends PlausiChecker // return the results return success($results); } + + /** + * Incoming shouldn't have austrian home address. + * @param studiensemester_kurzbz string check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param person_id int if check is to be executed only for one person + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + public function getIncomingHeimatNationOesterreich( + $studiensemester_kurzbz, + $studiengang_kz = null, + $person_id = null, + $exkludierte_studiengang_kz = null + ) { + $params = array($studiensemester_kurzbz); + + $qry = " + SELECT + DISTINCT pers.person_id, status.studiensemester_kurzbz + FROM + public.tbl_prestudent pre + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_person pers USING(person_id) + JOIN public.tbl_adresse addr USING(person_id) + JOIN public.tbl_studiengang stg USING(studiengang_kz) + WHERE + status.status_kurzbz = 'Incoming' + AND addr.nation = 'A' + AND addr.heimatadresse + AND status.studiensemester_kurzbz = ? + AND stg.melderelevant + AND pre.bismelden"; + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($person_id)) + { + $qry .= " AND pers.person_id = ?"; + $params[] = $person_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } + + } diff --git a/application/libraries/issues/plausichecks/IncomingOhneIoDatensatz.php b/application/libraries/issues/plausichecks/IncomingOhneIoDatensatz.php index 6eaa9db3f..e08280f83 100644 --- a/application/libraries/issues/plausichecks/IncomingOhneIoDatensatz.php +++ b/application/libraries/issues/plausichecks/IncomingOhneIoDatensatz.php @@ -20,7 +20,7 @@ class IncomingOhneIoDatensatz extends PlausiChecker $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; // get all students failing the plausicheck - $prestudentRes = $this->_ci->plausichecklib->getIncomingOhneIoDatensatz($studiengang_kz, null, $exkludierte_studiengang_kz); + $prestudentRes = $this->getIncomingOhneIoDatensatz($studiengang_kz, null, $exkludierte_studiengang_kz); if (isError($prestudentRes)) return $prestudentRes; @@ -43,4 +43,54 @@ class IncomingOhneIoDatensatz extends PlausiChecker // return the results return success($results); } + + /** + * Incoming should have IN/OUT data. + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param prestudent_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + public function getIncomingOhneIoDatensatz($studiengang_kz = null, $prestudent_id = null, $exkludierte_studiengang_kz = null) + { + $params = array(); + + $qry = " + SELECT + DISTINCT ON(student_uid, nachname, vorname) + tbl_person.person_id, + tbl_prestudent.prestudent_id, + stg.oe_kurzbz AS prestudent_stg_oe_kurzbz + FROM + public.tbl_student + JOIN public.tbl_benutzer ON(student_uid=uid) + JOIN public.tbl_person USING(person_id) + JOIN public.tbl_prestudent USING(prestudent_id) + JOIN public.tbl_prestudentstatus ON(tbl_prestudent.prestudent_id=tbl_prestudentstatus.prestudent_id) + JOIN public.tbl_studiengang stg ON(stg.studiengang_kz=tbl_student.studiengang_kz) + WHERE + bismelden=TRUE + AND status_kurzbz='Incoming' AND NOT EXISTS (SELECT 1 FROM bis.tbl_bisio WHERE student_uid=tbl_student.student_uid) + AND stg.melderelevant"; + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND tbl_prestudent.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } } diff --git a/application/libraries/issues/plausichecks/IncomingOrGsFoerderrelevant.php b/application/libraries/issues/plausichecks/IncomingOrGsFoerderrelevant.php index 23002b71b..4d789f71a 100644 --- a/application/libraries/issues/plausichecks/IncomingOrGsFoerderrelevant.php +++ b/application/libraries/issues/plausichecks/IncomingOrGsFoerderrelevant.php @@ -21,7 +21,7 @@ class IncomingOrGsFoerderrelevant extends PlausiChecker $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; // get all students failing the plausicheck - $prestudentRes = $this->_ci->plausichecklib->getIncomingOrGsFoerderrelevant( + $prestudentRes = $this->getIncomingOrGsFoerderrelevant( $studiensemester_kurzbz, $studiengang_kz, null, @@ -49,4 +49,77 @@ class IncomingOrGsFoerderrelevant extends PlausiChecker // return the results return success($results); } + + /** + * Incoming or gemeinsame Studien students should not receive funding (not be förderrelevant). + * @param studiensemester_kurzbz string check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param prestudent_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return object success or error + */ + public function getIncomingOrGsFoerderrelevant( + $studiensemester_kurzbz = null, + $studiengang_kz = null, + $prestudent_id = null, + $exkludierte_studiengang_kz = null + ) { + $params = array(); + + $qry = " + SELECT + DISTINCT ON(prestudent_id) + pers.person_id, + ps.prestudent_id, + stg.oe_kurzbz AS prestudent_stg_oe_kurzbz + FROM + public.tbl_student stud + JOIN public.tbl_benutzer ON(student_uid=uid) + JOIN public.tbl_person pers USING(person_id) + JOIN public.tbl_prestudent ps USING(prestudent_id) + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_studiengang stg ON(stg.studiengang_kz=stud.studiengang_kz) + WHERE + ( + status.status_kurzbz = 'Incoming' + OR EXISTS ( + SELECT 1 + FROM + bis.tbl_mobilitaet + JOIN public.tbl_prestudent USING(prestudent_id) + WHERE + prestudent_id = ps.prestudent_id + AND gsstudientyp_kurzbz = 'Extern' + ) + ) + AND (ps.foerderrelevant <> FALSE OR ps.foerderrelevant IS NULL) + AND bismelden=TRUE + AND stg.melderelevant"; + + if (isset($studiensemester_kurzbz)) + { + $qry .= " AND status.studiensemester_kurzbz = ?"; + $params[] = $studiensemester_kurzbz; + } + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND ps.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } } diff --git a/application/libraries/issues/plausichecks/InskriptionVorLetzerBismeldung.php b/application/libraries/issues/plausichecks/InskriptionVorLetzerBismeldung.php index d977b4124..871b3b3d4 100644 --- a/application/libraries/issues/plausichecks/InskriptionVorLetzerBismeldung.php +++ b/application/libraries/issues/plausichecks/InskriptionVorLetzerBismeldung.php @@ -21,7 +21,7 @@ class InskriptionVorLetzerBismeldung extends PlausiChecker $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; // get all students failing the plausicheck - $prestudentRes = $this->_ci->plausichecklib->getInskriptionVorLetzerBismeldung( + $prestudentRes = $this->getInskriptionVorLetzerBismeldung( $studiensemester_kurzbz, $studiengang_kz, null, @@ -56,4 +56,93 @@ class InskriptionVorLetzerBismeldung extends PlausiChecker // return the results return success($results); } + + /** + * Students of a semester shouldn't start studies before the date of Bismeldung. + * e.g. If student studies in WS2022 datum of status shouldn't be before 15.4.2020 + * e.g. If student studies in SS2022 datum of status shouldn't be before 15.11.2022 + * @param studiensemester_kurzbz string check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param prestudent_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + public function getInskriptionVorLetzerBismeldung( + $studiensemester_kurzbz, + $studiengang_kz = null, + $prestudent_id = null, + $exkludierte_studiengang_kz = null + ) { + // get Bismeldedatum + $datumBis = $this->_getBisdateFromSemester($studiensemester_kurzbz); + + $params = array($datumBis, $studiensemester_kurzbz, $datumBis); + + // get active students + $qry = " + SELECT + DISTINCT ON (student.student_uid) ? AS datum_bismeldung, + prestudent.person_id, prestudent.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, status.studiensemester_kurzbz + FROM + public.tbl_benutzer benutzer + JOIN public.tbl_student student on(benutzer.uid = student.student_uid) + JOIN public.tbl_prestudent prestudent USING(prestudent_id) + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_studiengang stg ON prestudent.studiengang_kz = stg.studiengang_kz + WHERE + benutzer.aktiv=true + AND status.studiensemester_kurzbz = ? + /* inscription date before date of first student status */ + AND ( + SELECT datum + FROM public.tbl_prestudentstatus + WHERE prestudent_id = prestudent.prestudent_id + AND studiensemester_kurzbz = status.studiensemester_kurzbz + AND status_kurzbz = 'Student' + ORDER BY datum, insertamum, ext_id + LIMIT 1 + ) < ? + AND stg.melderelevant + AND prestudent.bismelden"; + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND prestudent.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } + + /** + * Gets Bismeldedate from Studiensemester. + * @param studiensemester_kurzbz string + */ + private function _getBisdateFromSemester($studiensemester_kurzbz) + { + $semesterYear = substr($studiensemester_kurzbz, 2, 6); + $semesterType = substr($studiensemester_kurzbz, 0, 2); + + if ($semesterType == 'SS') + { + return date_format(date_create(($semesterYear - 1)."-11-15"), 'Y-m-d'); + } + + if ($semesterType == 'WS') + { + return date_format(date_create($semesterYear."-04-15"), 'Y-m-d'); + } + } } diff --git a/application/libraries/issues/plausichecks/NationNichtOesterreichAberGemeinde.php b/application/libraries/issues/plausichecks/NationNichtOesterreichAberGemeinde.php index 53bd59826..c04cd664c 100644 --- a/application/libraries/issues/plausichecks/NationNichtOesterreichAberGemeinde.php +++ b/application/libraries/issues/plausichecks/NationNichtOesterreichAberGemeinde.php @@ -20,7 +20,7 @@ class NationNichtOesterreichAberGemeinde extends PlausiChecker $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; // get all students failing the plausicheck - $personRes = $this->_ci->plausichecklib->getNationNichtOesterreichAberGemeinde( + $personRes = $this->getNationNichtOesterreichAberGemeinde( $studiengang_kz, null, $exkludierte_studiengang_kz @@ -46,4 +46,49 @@ class NationNichtOesterreichAberGemeinde extends PlausiChecker // return the results return success($results); } + + /** + * Nation is not Austria, but address has austrian Gemeinde. + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param person_id int if check is to be executed only for one person + * @return success with prestudents or error + */ + public function getNationNichtOesterreichAberGemeinde($studiengang_kz = null, $person_id = null, $exkludierte_studiengang_kz = null) + { + $params = array(); + + $qry = "SELECT DISTINCT tbl_person.person_id, adr.gemeinde, adr.adresse_id + FROM + public.tbl_adresse adr + JOIN public.tbl_prestudent USING(person_id) + JOIN public.tbl_person USING(person_id) + JOIN public.tbl_student USING(prestudent_id) + JOIN public.tbl_benutzer ON(uid=student_uid) + JOIN public.tbl_studiengang stg ON tbl_prestudent.studiengang_kz = stg.studiengang_kz + WHERE + adr.nation!='A' + AND tbl_benutzer.aktiv + AND gemeinde NOT IN ('Münster') + AND EXISTS(SELECT 1 FROM bis.tbl_gemeinde WHERE name = adr.gemeinde)"; + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($person_id)) + { + $qry .= " AND tbl_person.person_id = ?"; + $params[] = $person_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } } diff --git a/application/libraries/issues/plausichecks/OrgformStgUngleichOrgformPrestudent.php b/application/libraries/issues/plausichecks/OrgformStgUngleichOrgformPrestudent.php index d9515a777..316e81072 100644 --- a/application/libraries/issues/plausichecks/OrgformStgUngleichOrgformPrestudent.php +++ b/application/libraries/issues/plausichecks/OrgformStgUngleichOrgformPrestudent.php @@ -21,7 +21,7 @@ class OrgformStgUngleichOrgformPrestudent extends PlausiChecker $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; // get all students failing the plausicheck - $prestudentRes = $this->_ci->plausichecklib->getOrgformStgUngleichOrgformPrestudent( + $prestudentRes = $this->getOrgformStgUngleichOrgformPrestudent( $studiensemester_kurzbz, $studiengang_kz, null, @@ -57,4 +57,74 @@ class OrgformStgUngleichOrgformPrestudent extends PlausiChecker // return the results return success($results); } + + /** + * Orgform of a Studiengang in Studienplan should be the same as orgform of student. + * @param studiensemester_kurzbz string check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param prestudent_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + public function getOrgformStgUngleichOrgformPrestudent( + $studiensemester_kurzbz, + $studiengang_kz = null, + $prestudent_id = null, + $exkludierte_studiengang_kz = null + ) { + $params = array($studiensemester_kurzbz); + + $qry = " + SELECT + prestudent.person_id, prestudent.prestudent_id, status.studiensemester_kurzbz, + studiengang.orgform_kurzbz AS stg_orgform, status.orgform_kurzbz AS student_orgform, + prestudent.studiengang_kz AS student_studiengang, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz + FROM + public.tbl_studiengang studiengang + JOIN public.tbl_student student USING(studiengang_kz) + JOIN public.tbl_prestudent prestudent USING(prestudent_id) + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_benutzer benutzer on(benutzer.uid = student.student_uid) + JOIN public.tbl_studiengang stg ON prestudent.studiengang_kz = stg.studiengang_kz + LEFT JOIN lehre.tbl_studienplan stpl USING (studienplan_id) + WHERE + benutzer.aktiv = true + AND status.status_kurzbz IN ('Student', 'Unterbrecher', 'Abbrecher', 'Diplomand', 'Absolvent') + AND studiengang.studiengang_kz < 10000 + AND status.studiensemester_kurzbz = ? + AND NOT (status.orgform_kurzbz IS NULL AND studiengang.mischform = FALSE) + AND NOT EXISTS( + SELECT 1 + FROM + lehre.tbl_studienplan + JOIN + lehre.tbl_studienordnung USING(studienordnung_id) + WHERE + tbl_studienplan.studienplan_id = stpl.studienplan_id + AND tbl_studienordnung.studiengang_kz = prestudent.studiengang_kz + AND tbl_studienplan.orgform_kurzbz = status.orgform_kurzbz)"; + + if (isset($studiengang_kz)) + { + $qry .= " AND studiengang.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND prestudent.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + $qry .= " + ORDER BY student_uid"; + + return $this->_db->execReadOnlyQuery($qry, $params); + } } diff --git a/application/libraries/issues/plausichecks/PlausiChecker.php b/application/libraries/issues/plausichecks/PlausiChecker.php index 0d8da4007..086a44cc4 100644 --- a/application/libraries/issues/plausichecks/PlausiChecker.php +++ b/application/libraries/issues/plausichecks/PlausiChecker.php @@ -7,6 +7,7 @@ abstract class PlausiChecker { protected $_ci; // code igniter instance protected $_config; // configuration parameters for this plausicheck + protected $_db; // database for queries public function __construct($configurationParams = null) { @@ -15,8 +16,8 @@ abstract class PlausiChecker // set configuration $this->_config = $configurationParams; - // load libraries - $this->_ci->load->library('issues/PlausicheckLib'); // load plausicheck library + // get database for queries + $this->_db = new DB_Model(); } /** diff --git a/application/libraries/issues/plausichecks/PrestudentMischformOhneOrgform.php b/application/libraries/issues/plausichecks/PrestudentMischformOhneOrgform.php index e68d840d9..8e3926a12 100644 --- a/application/libraries/issues/plausichecks/PrestudentMischformOhneOrgform.php +++ b/application/libraries/issues/plausichecks/PrestudentMischformOhneOrgform.php @@ -21,7 +21,7 @@ class PrestudentMischformOhneOrgform extends PlausiChecker $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; // get all students failing the plausicheck - $prestudentRes = $this->_ci->plausichecklib->getPrestudentMischformOhneOrgform( + $prestudentRes = $this->getPrestudentMischformOhneOrgform( $studiensemester_kurzbz, $studiengang_kz, null, @@ -55,4 +55,57 @@ class PrestudentMischformOhneOrgform extends PlausiChecker // return the results return success($results); } + + /** + * Students in "mixed" Studiengang should have Orgform. + * @param studiensemester_kurzbz string check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param prestudent_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + public function getPrestudentMischformOhneOrgform( + $studiensemester_kurzbz, + $studiengang_kz = null, + $prestudent_id = null, + $exkludierte_studiengang_kz = null + ) { + $params = array($studiensemester_kurzbz); + + $qry = " + SELECT + pre.person_id, pre.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, status.studiensemester_kurzbz + FROM + public.tbl_prestudent pre + JOIN public.tbl_person USING(person_id) + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_studiengang stg USING(studiengang_kz) + WHERE + status.status_kurzbz IN ('Bewerber', 'Student') + AND stg.mischform + AND (status.orgform_kurzbz='' OR status.orgform_kurzbz IS NULL) + AND status.studiensemester_kurzbz=?"; + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND pre.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } + + } diff --git a/application/libraries/issues/plausichecks/StgPrestudentUngleichStgStudent.php b/application/libraries/issues/plausichecks/StgPrestudentUngleichStgStudent.php index 61737cc4d..700557c65 100644 --- a/application/libraries/issues/plausichecks/StgPrestudentUngleichStgStudent.php +++ b/application/libraries/issues/plausichecks/StgPrestudentUngleichStgStudent.php @@ -20,7 +20,7 @@ class StgPrestudentUngleichStgStudent extends PlausiChecker $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; // get all students failing the plausicheck - $prestudentRes = $this->_ci->plausichecklib->getStgPrestudentUngleichStgStudent($studiengang_kz, null, $exkludierte_studiengang_kz); + $prestudentRes = $this->getStgPrestudentUngleichStgStudent($studiengang_kz, null, $exkludierte_studiengang_kz); if (isError($prestudentRes)) return $prestudentRes; @@ -43,4 +43,50 @@ class StgPrestudentUngleichStgStudent extends PlausiChecker // return the results return success($results); } + + /** + * Studiengang should be the same for prestudent and student. + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param prestudent_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + public function getStgPrestudentUngleichStgStudent($studiengang_kz = null, $prestudent_id = null, $exkludierte_studiengang_kz = null) + { + $params = array(); + + $qry = " + SELECT + pre.person_id, pre.prestudent_id, stg.oe_kurzbz prestudent_stg_oe_kurzbz, student_stg.oe_kurzbz student_stg_oe_kurzbz + FROM + public.tbl_prestudent pre + JOIN public.tbl_student stud USING(prestudent_id) + JOIN public.tbl_person pers USING(person_id) + JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz + JOIN public.tbl_studiengang student_stg ON stud.studiengang_kz = student_stg.studiengang_kz + WHERE + stud.studiengang_kz != pre.studiengang_kz"; + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND pre.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } + + } diff --git a/application/libraries/issues/plausichecks/StgPrestudentUngleichStgStudienplan.php b/application/libraries/issues/plausichecks/StgPrestudentUngleichStgStudienplan.php index 0c9ce9300..f8e1d8691 100644 --- a/application/libraries/issues/plausichecks/StgPrestudentUngleichStgStudienplan.php +++ b/application/libraries/issues/plausichecks/StgPrestudentUngleichStgStudienplan.php @@ -20,7 +20,7 @@ class StgPrestudentUngleichStgStudienplan extends PlausiChecker $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; // get all students failing the plausicheck - $prestudentRes = $this->_ci->plausichecklib->getStgPrestudentUngleichStgStudienplan($studiengang_kz, null, null, $exkludierte_studiengang_kz); + $prestudentRes = $this->getStgPrestudentUngleichStgStudienplan($studiengang_kz, null, null, $exkludierte_studiengang_kz); if (isError($prestudentRes)) return $prestudentRes; @@ -43,4 +43,64 @@ class StgPrestudentUngleichStgStudienplan extends PlausiChecker // return the results return success($results); } + + /** + * Studiengang should be the same for prestudent and studienplan. + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param prestudent_id int if check is to be executed only for one prestudent + * @param studienordnung_id int if check is to be executed only for a certain studienordnung_id + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + public function getStgPrestudentUngleichStgStudienplan( + $studiengang_kz = null, + $prestudent_id = null, + $studienordnung_id = null, + $exkludierte_studiengang_kz = null + ) { + $params = array(); + + $qry = " + SELECT + DISTINCT ON (ps.prestudent_id) ps.person_id, ps.prestudent_id, stordnung.studienordnung_id, + stplan.bezeichnung AS studienplan, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz + FROM + public.tbl_prestudent ps + JOIN public.tbl_prestudentstatus USING(prestudent_id) + JOIN lehre.tbl_studienplan stplan USING(studienplan_id) + JOIN lehre.tbl_studienordnung stordnung USING(studienordnung_id) + JOIN public.tbl_person USING(person_id) + JOIN public.tbl_studiengang stg ON ps.studiengang_kz = stg.studiengang_kz + WHERE + ps.studiengang_kz<>stordnung.studiengang_kz + AND stg.melderelevant"; + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND ps.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($studienordnung_id)) + { + $qry .= " AND stordnung.studienordnung_id = ?"; + $params[] = $studienordnung_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } + + } diff --git a/application/libraries/issues/plausichecks/StudentstatusNachAbbrecher.php b/application/libraries/issues/plausichecks/StudentstatusNachAbbrecher.php index 47ca1fa2a..87bb51d7e 100644 --- a/application/libraries/issues/plausichecks/StudentstatusNachAbbrecher.php +++ b/application/libraries/issues/plausichecks/StudentstatusNachAbbrecher.php @@ -20,7 +20,7 @@ class StudentstatusNachAbbrecher extends PlausiChecker $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; // get all students failing the plausicheck - $prestudentRes = $this->_ci->plausichecklib->getStudentstatusNachAbbrecher($studiengang_kz, null, $exkludierte_studiengang_kz); + $prestudentRes = $this->getStudentstatusNachAbbrecher($studiengang_kz, null, $exkludierte_studiengang_kz); if (isError($prestudentRes)) return $prestudentRes; @@ -43,4 +43,48 @@ class StudentstatusNachAbbrecher extends PlausiChecker // return the results return success($results); } + + /** + * There shouldn't be any status after Abbrecher status. + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param prestudent_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + public function getStudentstatusNachAbbrecher($studiengang_kz = null, $prestudent_id = null, $exkludierte_studiengang_kz = null) + { + $params = array(); + + $qry = " + SELECT + prestudent.person_id, prestudent.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz + FROM + public.tbl_student student + JOIN public.tbl_prestudent prestudent USING(prestudent_id) + JOIN public.tbl_prestudentstatus prestatus USING(prestudent_id) + JOIN public.tbl_studiengang stg ON prestudent.studiengang_kz = stg.studiengang_kz + WHERE + prestatus.status_kurzbz = 'Abbrecher' + AND get_rolle_prestudent(prestudent.prestudent_id, prestatus.studiensemester_kurzbz) <> 'Abbrecher'"; + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND prestudent.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } } diff --git a/application/libraries/issues/plausichecks/StudienplanUngueltig.php b/application/libraries/issues/plausichecks/StudienplanUngueltig.php index 22924abd8..2f2de1e9c 100644 --- a/application/libraries/issues/plausichecks/StudienplanUngueltig.php +++ b/application/libraries/issues/plausichecks/StudienplanUngueltig.php @@ -21,7 +21,7 @@ class StudienplanUngueltig extends PlausiChecker $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; // get all students failing the plausicheck - $prestudentRes = $this->_ci->plausichecklib->getStudienplanUngueltig( + $prestudentRes = $this->getStudienplanUngueltig( $studiensemester_kurzbz, $studiengang_kz, null, @@ -56,4 +56,73 @@ class StudienplanUngueltig extends PlausiChecker // return the results return success($results); } + + /** + * Studienplan should be valid in current Ausbildungssemester of prestudent. + * @param studiensemester_kurzbz string check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param prestudent_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + public function getStudienplanUngueltig( + $studiensemester_kurzbz, + $studiengang_kz = null, + $prestudent_id = null, + $exkludierte_studiengang_kz = null + ) { + $params = array($studiensemester_kurzbz); + + $qry = " + SELECT + DISTINCT pre.person_id, pre.prestudent_id, + tbl_studienplan.bezeichnung AS studienplan, + status.status_kurzbz, + status.studiensemester_kurzbz, + status.ausbildungssemester, + stg.oe_kurzbz AS prestudent_stg_oe_kurzbz + FROM + public.tbl_prestudent pre + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_person USING(person_id) + JOIN lehre.tbl_studienplan USING(studienplan_id) + JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz + WHERE + status_kurzbz in('Student', 'Interessent','Bewerber','Aufgenommener') + AND NOT EXISTS ( + SELECT + 1 + FROM + lehre.tbl_studienplan_semester + WHERE + studienplan_id=status.studienplan_id + AND tbl_studienplan_semester.semester = status.ausbildungssemester + AND tbl_studienplan_semester.studiensemester_kurzbz = status.studiensemester_kurzbz + ) + AND status.studiensemester_kurzbz=? + AND pre.bismelden + AND stg.melderelevant"; + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND tbl_prestudent.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } + + } diff --git a/application/libraries/issues/resolvers/CORE_INOUT_0007.php b/application/libraries/issues/resolvers/CORE_INOUT_0007.php index 2d9c7a3f4..31ca79ffb 100644 --- a/application/libraries/issues/resolvers/CORE_INOUT_0007.php +++ b/application/libraries/issues/resolvers/CORE_INOUT_0007.php @@ -17,10 +17,10 @@ class CORE_INOUT_0007 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/IncomingHeimatNationOesterreich'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getIncomingHeimatNationOesterreich($params['studiensemester_kurzbz'], null, $params['issue_person_id']); + $checkRes = $this->_ci->incomingheimatnationoesterreich->getIncomingHeimatNationOesterreich($params['studiensemester_kurzbz'], null, $params['issue_person_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_INOUT_0008.php b/application/libraries/issues/resolvers/CORE_INOUT_0008.php index 30bbefdf1..4fa090c6a 100644 --- a/application/libraries/issues/resolvers/CORE_INOUT_0008.php +++ b/application/libraries/issues/resolvers/CORE_INOUT_0008.php @@ -14,10 +14,10 @@ class CORE_INOUT_0008 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/IncomingOhneIoDatensatz'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getIncomingOhneIoDatensatz(null, $params['prestudent_id']); + $checkRes = $this->_ci->incomingohneiodatensatz->getIncomingOhneIoDatensatz(null, $params['prestudent_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_INOUT_0009.php b/application/libraries/issues/resolvers/CORE_INOUT_0009.php index b56344042..c739d71c3 100644 --- a/application/libraries/issues/resolvers/CORE_INOUT_0009.php +++ b/application/libraries/issues/resolvers/CORE_INOUT_0009.php @@ -14,10 +14,10 @@ class CORE_INOUT_0009 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/IncomingOrGsFoerderrelevant'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getIncomingOrGsFoerderrelevant(null, null, $params['prestudent_id']); + $checkRes = $this->_ci->incomingorgsfoerderrelevant->getIncomingOrGsFoerderrelevant(null, null, $params['prestudent_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_PERSON_0001.php b/application/libraries/issues/resolvers/CORE_PERSON_0001.php index cf1560171..d0ac0d3ed 100644 --- a/application/libraries/issues/resolvers/CORE_PERSON_0001.php +++ b/application/libraries/issues/resolvers/CORE_PERSON_0001.php @@ -14,10 +14,10 @@ class CORE_PERSON_0001 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/GbDatumWeitZurueck'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getGbDatumWeitZurueck(null, null, $params['issue_person_id']); + $checkRes = $this->_ci->gbdatumweitzurueck->getGbDatumWeitZurueck(null, null, $params['issue_person_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_PERSON_0002.php b/application/libraries/issues/resolvers/CORE_PERSON_0002.php index 969b2a5b0..608dcf0ce 100644 --- a/application/libraries/issues/resolvers/CORE_PERSON_0002.php +++ b/application/libraries/issues/resolvers/CORE_PERSON_0002.php @@ -14,10 +14,10 @@ class CORE_PERSON_0002 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/NationNichtOesterreichAberGemeinde'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getNationNichtOesterreichAberGemeinde(null, $params['issue_person_id']); + $checkRes = $this->_ci->nationnichtoesterreichabergemeinde->getNationNichtOesterreichAberGemeinde(null, $params['issue_person_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_PERSON_0003.php b/application/libraries/issues/resolvers/CORE_PERSON_0003.php index 8f53d159c..23a81b660 100644 --- a/application/libraries/issues/resolvers/CORE_PERSON_0003.php +++ b/application/libraries/issues/resolvers/CORE_PERSON_0003.php @@ -14,10 +14,10 @@ class CORE_PERSON_0003 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/FalscheAnzahlHeimatadressen'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getFalscheAnzahlHeimatadressen(null, null, $params['issue_person_id']); + $checkRes = $this->_ci->falscheanzahlheimatadressen->getFalscheAnzahlHeimatadressen(null, null, $params['issue_person_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_PERSON_0004.php b/application/libraries/issues/resolvers/CORE_PERSON_0004.php index 9ce9b7b8a..ae3a855ec 100644 --- a/application/libraries/issues/resolvers/CORE_PERSON_0004.php +++ b/application/libraries/issues/resolvers/CORE_PERSON_0004.php @@ -14,10 +14,10 @@ class CORE_PERSON_0004 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/FalscheAnzahlZustelladressen'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getFalscheAnzahlZustelladressen(null, null, $params['issue_person_id']); + $checkRes = $this->_ci->falscheanzahlzustelladressen->getFalscheAnzahlZustelladressen(null, null, $params['issue_person_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_STG_0001.php b/application/libraries/issues/resolvers/CORE_STG_0001.php index aee3fe0d2..09c34be74 100644 --- a/application/libraries/issues/resolvers/CORE_STG_0001.php +++ b/application/libraries/issues/resolvers/CORE_STG_0001.php @@ -14,10 +14,10 @@ class CORE_STG_0001 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/StgPrestudentUngleichStgStudent'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getStgPrestudentUngleichStgStudent(null, $params['prestudent_id']); + $checkRes = $this->_ci->stgprestudentungleichstgstudent->getStgPrestudentUngleichStgStudent(null, $params['prestudent_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_STG_0002.php b/application/libraries/issues/resolvers/CORE_STG_0002.php index dd0e293d4..999958042 100644 --- a/application/libraries/issues/resolvers/CORE_STG_0002.php +++ b/application/libraries/issues/resolvers/CORE_STG_0002.php @@ -17,10 +17,10 @@ class CORE_STG_0002 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/OrgformStgUngleichOrgformPrestudent'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getOrgformStgUngleichOrgformPrestudent($params['studiensemester_kurzbz'], null, $params['prestudent_id']); + $checkRes = $this->_ci->orgformstgungleichorgformprestudent->getOrgformStgUngleichOrgformPrestudent($params['studiensemester_kurzbz'], null, $params['prestudent_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_STG_0003.php b/application/libraries/issues/resolvers/CORE_STG_0003.php index 9559cdfb5..22d6399be 100644 --- a/application/libraries/issues/resolvers/CORE_STG_0003.php +++ b/application/libraries/issues/resolvers/CORE_STG_0003.php @@ -17,10 +17,10 @@ class CORE_STG_0003 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/PrestudentMischformOhneOrgform'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getPrestudentMischformOhneOrgform($params['studiensemester_kurzbz'], null, $params['prestudent_id']); + $checkRes = $this->_ci->prestudentmischformohneorgform->getPrestudentMischformOhneOrgform($params['studiensemester_kurzbz'], null, $params['prestudent_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_STG_0004.php b/application/libraries/issues/resolvers/CORE_STG_0004.php index 6ecc80863..2eedfc7fe 100644 --- a/application/libraries/issues/resolvers/CORE_STG_0004.php +++ b/application/libraries/issues/resolvers/CORE_STG_0004.php @@ -17,10 +17,10 @@ class CORE_STG_0004 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/StgPrestudentUngleichStgStudienplan'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getStgPrestudentUngleichStgStudienplan(null, $params['prestudent_id'], $params['studienordnung_id']); + $checkRes = $this->_ci->stgprestudentungleichstgstudienplan->getStgPrestudentUngleichStgStudienplan(null, $params['prestudent_id'], $params['studienordnung_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0001.php b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0001.php index 1f9dea34d..c74cd38fb 100644 --- a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0001.php +++ b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0001.php @@ -14,10 +14,10 @@ class CORE_STUDENTSTATUS_0001 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/AbbrecherAktiv'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getAbbrecherAktiv(null, $params['prestudent_id']); + $checkRes = $this->_ci->abbrecheraktiv->getAbbrecherAktiv(null, $params['prestudent_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0002.php b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0002.php index 95da215c1..36827684c 100644 --- a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0002.php +++ b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0002.php @@ -14,10 +14,10 @@ class CORE_STUDENTSTATUS_0002 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/StudentstatusNachAbbrecher'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getStudentstatusNachAbbrecher(null, $params['prestudent_id']); + $checkRes = $this->_ci->studentstatusnachabbrecher->getStudentstatusNachAbbrecher(null, $params['prestudent_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0003.php b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0003.php index 12e7a8da6..f3b150d8d 100644 --- a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0003.php +++ b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0003.php @@ -17,10 +17,14 @@ class CORE_STUDENTSTATUS_0003 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/AusbildungssemPrestudentUngleichAusbildungssemStatus'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getAusbildungssemPrestudentUngleichAusbildungssemStatus($params['studiensemester_kurzbz'], null, $params['prestudent_id']); + $checkRes = $this->_ci->ausbildungssemprestudentungleichausbildungssemstatus->getAusbildungssemPrestudentUngleichAusbildungssemStatus( + $params['studiensemester_kurzbz'], + null, + $params['prestudent_id'] + ); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0004.php b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0004.php index 5cd8b7027..cbce2b01e 100644 --- a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0004.php +++ b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0004.php @@ -17,10 +17,14 @@ class CORE_STUDENTSTATUS_0004 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/InaktiverStudentAktiverStatus'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getInaktiverStudentAktiverStatus($params['studiensemester_kurzbz'], null, $params['prestudent_id']); + $checkRes = $this->_ci->inaktiverstudentaktiverstatus->getInaktiverStudentAktiverStatus( + $params['studiensemester_kurzbz'], + null, + $params['prestudent_id'] + ); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0005.php b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0005.php index 420021289..f5e265194 100644 --- a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0005.php +++ b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0005.php @@ -17,10 +17,10 @@ class CORE_STUDENTSTATUS_0005 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/InskriptionVorLetzerBismeldung'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getInskriptionVorLetzerBismeldung($params['studiensemester_kurzbz'], null, $params['prestudent_id']); + $checkRes = $this->_ci->inskriptionvorletzerbismeldung->getInskriptionVorLetzerBismeldung($params['studiensemester_kurzbz'], null, $params['prestudent_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0006.php b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0006.php index 64e28ddc8..94658ec9c 100644 --- a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0006.php +++ b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0006.php @@ -14,10 +14,10 @@ class CORE_STUDENTSTATUS_0006 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/DatumStudiensemesterFalscheReihenfolge'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getDatumStudiensemesterFalscheReihenfolge(null, $params['prestudent_id']); + $checkRes = $this->_ci->datumstudiensemesterfalschereihenfolge->getDatumStudiensemesterFalscheReihenfolge(null, $params['prestudent_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0007.php b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0007.php index 68523b53b..3a2575e53 100644 --- a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0007.php +++ b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0007.php @@ -14,10 +14,10 @@ class CORE_STUDENTSTATUS_0007 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/AktiverStudentOhneStatus'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getAktiverStudentOhneStatus(null, $params['prestudent_id']); + $checkRes = $this->_ci->aktiverstudentohnestatus->getAktiverStudentOhneStatus(null, $params['prestudent_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0008.php b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0008.php index 940cb9b4c..53bfd72a6 100644 --- a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0008.php +++ b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0008.php @@ -17,10 +17,10 @@ class CORE_STUDENTSTATUS_0008 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/StudienplanUngueltig'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getStudienplanUngueltig($params['studiensemester_kurzbz'], null, $params['prestudent_id']); + $checkRes = $this->_ci->studienplanungueltig->getStudienplanUngueltig($params['studiensemester_kurzbz'], null, $params['prestudent_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0009.php b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0009.php index c55e4a9cc..816b7e933 100644 --- a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0009.php +++ b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0009.php @@ -14,10 +14,10 @@ class CORE_STUDENTSTATUS_0009 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/FalscheAnzahlAbschlusspruefungen'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getFalscheAnzahlAbschlusspruefungen(null, null, $params['prestudent_id']); + $checkRes = $this->_ci->falscheanzahlabschlusspruefungen->getFalscheAnzahlAbschlusspruefungen(null, null, $params['prestudent_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0010.php b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0010.php index 8da8e9c1d..b31fb872a 100644 --- a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0010.php +++ b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0010.php @@ -14,10 +14,10 @@ class CORE_STUDENTSTATUS_0010 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/DatumAbschlusspruefungFehlt'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getDatumAbschlusspruefungFehlt(null, null, $params['abschlusspruefung_id']); + $checkRes = $this->_ci->datumabschlusspruefungfehlt->getDatumAbschlusspruefungFehlt(null, null, $params['abschlusspruefung_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0011.php b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0011.php index 6568d0b3e..9dff0181e 100644 --- a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0011.php +++ b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0011.php @@ -14,10 +14,10 @@ class CORE_STUDENTSTATUS_0011 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/DatumSponsionFehlt'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getDatumSponsionFehlt(null, null, $params['abschlusspruefung_id']); + $checkRes = $this->_ci->datumsponsionfehlt->getDatumSponsionFehlt(null, null, $params['abschlusspruefung_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0012.php b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0012.php index d331ef6a2..7fe5dbde4 100644 --- a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0012.php +++ b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0012.php @@ -17,10 +17,14 @@ class CORE_STUDENTSTATUS_0012 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/BewerberNichtZumRtAngetreten'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getBewerberNichtZumRtAngetreten($params['studiensemester_kurzbz'], null, $params['prestudent_id']); + $checkRes = $this->_ci->bewerbernichtzumrtangetreten->getBewerberNichtZumRtAngetreten( + $params['studiensemester_kurzbz'], + null, + $params['prestudent_id'] + ); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0013.php b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0013.php index e57b0aea0..86e8b75b1 100644 --- a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0013.php +++ b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0013.php @@ -17,10 +17,10 @@ class CORE_STUDENTSTATUS_0013 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/AktSemesterNull'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getAktSemesterNull($params['studiensemester_kurzbz'], null, $params['prestudent_id']); + $checkRes = $this->_ci->aktsemesternull->getAktSemesterNull($params['studiensemester_kurzbz'], null, $params['prestudent_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0014.php b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0014.php index b58736f66..4b542cf0a 100644 --- a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0014.php +++ b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0014.php @@ -14,10 +14,10 @@ class CORE_STUDENTSTATUS_0014 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/AbschlussstatusFehlt'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getAbschlussstatusFehlt(null, null, $params['prestudent_id']); + $checkRes = $this->_ci->abschlussstatusfehlt->getAbschlussstatusFehlt(null, null, $params['prestudent_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0015.php b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0015.php index aafee1124..37e42ec0a 100644 --- a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0015.php +++ b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0015.php @@ -17,10 +17,10 @@ class CORE_STUDENTSTATUS_0015 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/AktiverStudentstatusOhneKontobuchung'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getAktiverStudentstatusOhneKontobuchung( + $checkRes = $this->_ci->aktiverstudentstatusohnekontobuchung->getAktiverStudentstatusOhneKontobuchung( $params['studiensemester_kurzbz'], null, $params['prestudent_id'] From 7bc8e229065e953baf342c458d3c18b725df61ce Mon Sep 17 00:00:00 2001 From: KarpAlex Date: Mon, 12 Jun 2023 22:40:09 +0200 Subject: [PATCH 039/268] plausichecks: removed empty lines and unnecessary comments --- ...PrestudentUngleichAusbildungssemStatus.php | 2 - .../DatumAbschlusspruefungFehlt.php | 38 ------------------- .../plausichecks/DatumSponsionFehlt.php | 38 ------------------- .../FalscheAnzahlZustelladressen.php | 2 - .../plausichecks/GbDatumWeitZurueck.php | 2 - .../IncomingHeimatNationOesterreich.php | 2 - .../PrestudentMischformOhneOrgform.php | 2 - .../StgPrestudentUngleichStgStudent.php | 2 - .../StgPrestudentUngleichStgStudienplan.php | 2 - .../plausichecks/StudienplanUngueltig.php | 2 - 10 files changed, 92 deletions(-) diff --git a/application/libraries/issues/plausichecks/AusbildungssemPrestudentUngleichAusbildungssemStatus.php b/application/libraries/issues/plausichecks/AusbildungssemPrestudentUngleichAusbildungssemStatus.php index 13d800a3f..00ff16ae0 100644 --- a/application/libraries/issues/plausichecks/AusbildungssemPrestudentUngleichAusbildungssemStatus.php +++ b/application/libraries/issues/plausichecks/AusbildungssemPrestudentUngleichAusbildungssemStatus.php @@ -113,6 +113,4 @@ class AusbildungssemPrestudentUngleichAusbildungssemStatus extends PlausiChecker return $this->_db->execReadOnlyQuery($qry, $params); } - - } diff --git a/application/libraries/issues/plausichecks/DatumAbschlusspruefungFehlt.php b/application/libraries/issues/plausichecks/DatumAbschlusspruefungFehlt.php index 985bc1f08..f606e2c8c 100644 --- a/application/libraries/issues/plausichecks/DatumAbschlusspruefungFehlt.php +++ b/application/libraries/issues/plausichecks/DatumAbschlusspruefungFehlt.php @@ -120,42 +120,4 @@ class DatumAbschlusspruefungFehlt extends PlausiChecker return $this->_db->execReadOnlyQuery($qry, $params); } - - /** - * Date of final exam shouldn't be missing for Absolvent. - * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester - * @param studiengang_kz int if check is to be executed for certain Studiengang - * @param abschlusspruefung_id int if check is to be executed for a certain Abschlussprüfung - * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check - * @return success with prestudents or error - */ - //~ public function getDatumAbschlusspruefungFehlt( - //~ $studiensemester_kurzbz = null, - //~ $studiengang_kz = null, - //~ $abschlusspruefung_id = null, - //~ $exkludierte_studiengang_kz = null - //~ ) { - //~ $results = array(); - - //~ $pruefungenRes = $this->_getInvalidAbschlusspruefungen( - //~ $studiensemester_kurzbz, - //~ $studiengang_kz, - //~ $abschlusspruefung_id, - //~ $exkludierte_studiengang_kz - //~ ); - - //~ if (isError($pruefungenRes)) return $pruefungenRes; - - //~ if (hasData($pruefungenRes)) - //~ { - //~ $pruefungen = getData($pruefungenRes); - - //~ foreach ($pruefungen as $pruefung) - //~ { - //~ if (isEmptyString($pruefung->datum)) $results[] = $pruefung; - //~ } - //~ } - - //~ return success($results); - //~ } } diff --git a/application/libraries/issues/plausichecks/DatumSponsionFehlt.php b/application/libraries/issues/plausichecks/DatumSponsionFehlt.php index a1f32ca2f..210ae6f01 100644 --- a/application/libraries/issues/plausichecks/DatumSponsionFehlt.php +++ b/application/libraries/issues/plausichecks/DatumSponsionFehlt.php @@ -120,42 +120,4 @@ class DatumSponsionFehlt extends PlausiChecker return $this->_db->execReadOnlyQuery($qry, $params); } - - /** - * Date of sponsion shouldn't be missing for Absolvent. - * @param studiensemester_kurzbz string check is to be executed for certain Studiensemester - * @param studiengang_kz int if check is to be executed for certain Studiengang - * @param abschlusspruefung_id int if check is to be executed only for a certain Abschlussprüfung - * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check - * @return success with prestudents or error - */ - //~ public function getDatumSponsionFehlt( - //~ $studiensemester_kurzbz = null, - //~ $studiengang_kz = null, - //~ $abschlusspruefung_id = null, - //~ $exkludierte_studiengang_kz = null - //~ ) { - //~ $results = array(); - - //~ $pruefungenRes = $this->_getInvalidAbschlusspruefungen( - //~ $studiensemester_kurzbz, - //~ $studiengang_kz, - //~ $abschlusspruefung_id, - //~ $exkludierte_studiengang_kz - //~ ); - - //~ if (isError($pruefungenRes)) return $pruefungenRes; - - //~ if (hasData($pruefungenRes)) - //~ { - //~ $pruefungen = getData($pruefungenRes); - - //~ foreach ($pruefungen as $pruefung) - //~ { - //~ if (isEmptyString($pruefung->sponsion)) $results[] = $pruefung; - //~ } - //~ } - - //~ return success($results); - //~ } } diff --git a/application/libraries/issues/plausichecks/FalscheAnzahlZustelladressen.php b/application/libraries/issues/plausichecks/FalscheAnzahlZustelladressen.php index 191b2a98e..9d72b0236 100644 --- a/application/libraries/issues/plausichecks/FalscheAnzahlZustelladressen.php +++ b/application/libraries/issues/plausichecks/FalscheAnzahlZustelladressen.php @@ -110,6 +110,4 @@ class FalscheAnzahlZustelladressen extends PlausiChecker return $this->_db->execReadOnlyQuery($qry, $params); } - - } diff --git a/application/libraries/issues/plausichecks/GbDatumWeitZurueck.php b/application/libraries/issues/plausichecks/GbDatumWeitZurueck.php index 70699b624..a9e9f817a 100644 --- a/application/libraries/issues/plausichecks/GbDatumWeitZurueck.php +++ b/application/libraries/issues/plausichecks/GbDatumWeitZurueck.php @@ -101,6 +101,4 @@ class GbDatumWeitZurueck extends PlausiChecker return $this->_db->execReadOnlyQuery($qry, $params); } - - } diff --git a/application/libraries/issues/plausichecks/IncomingHeimatNationOesterreich.php b/application/libraries/issues/plausichecks/IncomingHeimatNationOesterreich.php index d7ba7316c..5276164dc 100644 --- a/application/libraries/issues/plausichecks/IncomingHeimatNationOesterreich.php +++ b/application/libraries/issues/plausichecks/IncomingHeimatNationOesterreich.php @@ -101,6 +101,4 @@ class IncomingHeimatNationOesterreich extends PlausiChecker return $this->_db->execReadOnlyQuery($qry, $params); } - - } diff --git a/application/libraries/issues/plausichecks/PrestudentMischformOhneOrgform.php b/application/libraries/issues/plausichecks/PrestudentMischformOhneOrgform.php index 8e3926a12..a4c3e2a4b 100644 --- a/application/libraries/issues/plausichecks/PrestudentMischformOhneOrgform.php +++ b/application/libraries/issues/plausichecks/PrestudentMischformOhneOrgform.php @@ -106,6 +106,4 @@ class PrestudentMischformOhneOrgform extends PlausiChecker return $this->_db->execReadOnlyQuery($qry, $params); } - - } diff --git a/application/libraries/issues/plausichecks/StgPrestudentUngleichStgStudent.php b/application/libraries/issues/plausichecks/StgPrestudentUngleichStgStudent.php index 700557c65..94bea2f35 100644 --- a/application/libraries/issues/plausichecks/StgPrestudentUngleichStgStudent.php +++ b/application/libraries/issues/plausichecks/StgPrestudentUngleichStgStudent.php @@ -87,6 +87,4 @@ class StgPrestudentUngleichStgStudent extends PlausiChecker return $this->_db->execReadOnlyQuery($qry, $params); } - - } diff --git a/application/libraries/issues/plausichecks/StgPrestudentUngleichStgStudienplan.php b/application/libraries/issues/plausichecks/StgPrestudentUngleichStgStudienplan.php index f8e1d8691..fc0f52f23 100644 --- a/application/libraries/issues/plausichecks/StgPrestudentUngleichStgStudienplan.php +++ b/application/libraries/issues/plausichecks/StgPrestudentUngleichStgStudienplan.php @@ -101,6 +101,4 @@ class StgPrestudentUngleichStgStudienplan extends PlausiChecker return $this->_db->execReadOnlyQuery($qry, $params); } - - } diff --git a/application/libraries/issues/plausichecks/StudienplanUngueltig.php b/application/libraries/issues/plausichecks/StudienplanUngueltig.php index 2f2de1e9c..9a306278e 100644 --- a/application/libraries/issues/plausichecks/StudienplanUngueltig.php +++ b/application/libraries/issues/plausichecks/StudienplanUngueltig.php @@ -123,6 +123,4 @@ class StudienplanUngueltig extends PlausiChecker return $this->_db->execReadOnlyQuery($qry, $params); } - - } From 4e22b1ac1c296cd61e9c33e14b811ad200a3d209 Mon Sep 17 00:00:00 2001 From: Cris Date: Mon, 19 Jun 2023 15:03:38 +0200 Subject: [PATCH 040/268] Added: New Job sendMailRecommendationRequests Send Sancho mail to LV-Leitung (fallback Lectors) that were requested for recommendation yesterday. --- .../controllers/jobs/AnrechnungJob.php | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/application/controllers/jobs/AnrechnungJob.php b/application/controllers/jobs/AnrechnungJob.php index 7aae80d54..48ee6d4ca 100644 --- a/application/controllers/jobs/AnrechnungJob.php +++ b/application/controllers/jobs/AnrechnungJob.php @@ -227,6 +227,74 @@ class AnrechnungJob extends JOB_Controller $this->logInfo('SUCCEDED: Sending emails to STGL about yesterdays new Anrechnungen succeded.'); } + // Send Sancho mail to LV-Leitung (fallback Lectors) that were requested for recommendation yesterday. + public function sendMailRecommendationRequests(){ + + $this->logInfo('Start AnrechnungJob sendMailRecommendationRequests to inform lecturers about yesterdays requests for recommendation.'); + + // Get Anrechnungen, für die gestern eine Empfehlung angefragt worden ist + $this->AnrechnungModel->addSelect('astat.anrechnung_id, astat.datum, astat.insertamum'); + $this->AnrechnungModel->addDistinct('astat.anrechnung_id'); + $this->AnrechnungModel->addJoin('lehre.tbl_anrechnung_anrechnungstatus astat', 'anrechnung_id'); + + $result = $this->AnrechnungModel->loadWhere(' + studiensemester_kurzbz = (SELECT studiensemester_kurzbz FROM tbl_studiensemester WHERE now()::date BETWEEN start AND ende) + AND genehmigt_von IS NULL + AND empfehlung_anrechnung IS NULL + AND status_kurzbz = '. $this->db->escape(self::ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR) .' -- in Bearbeitung durch Lektor + AND NOW()::date = (astat.datum + interval \'1 day\') -- nur gestrige Empfehlungsanfrage + ORDER BY astat.anrechnung_id, astat.datum DESC, astat.insertamum DESC -- nur letzten status dabei prüfen + '); + + // Exit, wenn es gestern keine Empfehlungsanfragen gab + if (!hasData($result)) + { + $this->logInfo('End AnrechnungJob sendMailRecommendationRequests, because no recommendations were requested yesterday.'); + exit; + } + + $anrechnung_id_arr = array_column(getData($result), 'anrechnung_id'); + + $arr_lvLector_arr = array(); + foreach ($anrechnung_id_arr as $anrechnung_id) + { + $arr_lvLector_arr[]= $this->anrechnunglib->getLectors($anrechnung_id); // Returns LV Leitung. If not present, then all lectors of LV. + } + + // Unique lector array to send only one mail per lector + $arr_lvLector_arr = array_unique($arr_lvLector_arr, SORT_REGULAR); + + // Link to 'Anrechnungen prüfen' dashboard + $url = + CIS_ROOT. 'cis/index.php?menu='. + CIS_ROOT. 'cis/menu.php?content_id=&content='. + CIS_ROOT. index_page(). self::REVIEW_ANRECHNUNG_URI; + + foreach ($arr_lvLector_arr as $lvLector_arr) + { + foreach ($lvLector_arr as $lector) + { + // Prepare mail content + $fields = array( + 'vorname' => $lector->vorname, + 'stgl_name' => 'Die Studiengangsleitung', + 'link' => anchor($url, 'Anrechnungsanträge Übersicht') + ); + + // Send mail + sendSanchoMail( + 'AnrechnungEmpfehlungAnfordern', + $fields, + $lector->uid. '@'. DOMAIN, + 'Deine Empfehlung wird benötigt zur Anerkennung nachgewiesener Kenntnisse' + ); + } + } + + $this->logInfo('SUCCEDED AnrechnungJob sendMailRecommendationRequests'); + + } + /** * Send Sancho mail to students, whose Anrechnungen were approved 24 hours ago. */ From 82019bb77ffeb4c0a1562f702b896bc9ccc5f4f2 Mon Sep 17 00:00:00 2001 From: Cris Date: Tue, 20 Jun 2023 10:45:38 +0200 Subject: [PATCH 041/268] Deactivated: einzelne Empehlungsanfrage-Mails an Lektoren deaktiviert --- .../anrechnung/ApproveAnrechnungDetail.php | 36 ++++++++----------- .../ApproveAnrechnungUebersicht.php | 15 +------- 2 files changed, 15 insertions(+), 36 deletions(-) diff --git a/application/controllers/lehre/anrechnung/ApproveAnrechnungDetail.php b/application/controllers/lehre/anrechnung/ApproveAnrechnungDetail.php index 8f71dc8d0..3a62ff7d9 100644 --- a/application/controllers/lehre/anrechnung/ApproveAnrechnungDetail.php +++ b/application/controllers/lehre/anrechnung/ApproveAnrechnungDetail.php @@ -242,7 +242,7 @@ class approveAnrechnungDetail extends Auth_Controller $empfehlungsanfrage_an = !isEmptyArray($result) ? implode(', ', array_column($result, 'fullname')) : ''; // Request Recommendation - if($this->anrechnunglib->requestRecommendation($anrechnung_id)) + if ($this->anrechnunglib->requestRecommendation($anrechnung_id)) { $retval[]= array( 'anrechnung_id' => $anrechnung_id, @@ -254,31 +254,23 @@ class approveAnrechnungDetail extends Auth_Controller ); } - /** - * Send mails to lectors - * NOTE: mails are sent at the end to ensure sending only ONE mail to each LV-Leitung or lector - * even if they are required for more recommendations - * */ - if (!isEmptyArray($retval)) - { - if ($this->config->item('send_mail') === TRUE) - { - $this->_sendSanchoMailToLectors($anrechnung_id); - } - - // Output json to ajax - return $this->outputJsonSuccess($retval); - } - // Output json to ajax + if ($empfehlungsanfrage_an == '') + { + $this->terminateWithJsonError( + "Empfehlung wurde nicht angefordert,\nDer LV sind keine LektorInnen zugeteilt." + ); + } + if (isEmptyArray($retval)) { - $this->terminateWithJsonError( - "Empfehlung wurde nicht angefordert,\nDer LV sind keine LektorInnen zugeteilt." - ); + $this->terminateWithJsonError("Empfehlung wurde nicht angefordert"); } - - $this->terminateWithJsonError($this->p->t('ui', 'errorNichtAusgefuehrt')); + else + { + // Output json to ajax + return $this->outputJsonSuccess($retval); + } } /** diff --git a/application/controllers/lehre/anrechnung/ApproveAnrechnungUebersicht.php b/application/controllers/lehre/anrechnung/ApproveAnrechnungUebersicht.php index f13814e66..b5a44b8f6 100644 --- a/application/controllers/lehre/anrechnung/ApproveAnrechnungUebersicht.php +++ b/application/controllers/lehre/anrechnung/ApproveAnrechnungUebersicht.php @@ -249,19 +249,6 @@ class approveAnrechnungUebersicht extends Auth_Controller } } - /** - * Send mails - * NOTE: mails are sent at the end to ensure sending only ONE mail to each LV-Leitung or lector - * even if they are required for more recommendations - * */ - if (!isEmptyArray($retval)) - { - if ($this->config->item('send_mail') === TRUE) - { - $this->_sendSanchoMail($retval); - } - } - // Output json to ajax if (isEmptyArray($retval)) { @@ -273,7 +260,7 @@ class approveAnrechnungUebersicht extends Auth_Controller $this->terminateWithJsonError('Es wurden keine Empfehlungen angefordert'); } - return $this->outputJsonSuccess($retval); + $this->outputJsonSuccess($retval); } /** From 17c2004a394f78a0f653e7fa91b7968572bfdcab Mon Sep 17 00:00:00 2001 From: Cris Date: Tue, 20 Jun 2023 13:36:42 +0200 Subject: [PATCH 042/268] Adapted: Check for config 'fbl' in Job to send Sammelmail only to LV-Leitung (no fallback to other lectors) --- application/controllers/jobs/AnrechnungJob.php | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/application/controllers/jobs/AnrechnungJob.php b/application/controllers/jobs/AnrechnungJob.php index 48ee6d4ca..b442c7e56 100644 --- a/application/controllers/jobs/AnrechnungJob.php +++ b/application/controllers/jobs/AnrechnungJob.php @@ -37,6 +37,9 @@ class AnrechnungJob extends JOB_Controller $this->load->helper('hlp_sancho_helper'); $this->load->library('AnrechnungLib'); + + // Load configs + $this->load->config('anrechnung'); } /** @@ -258,7 +261,15 @@ class AnrechnungJob extends JOB_Controller $arr_lvLector_arr = array(); foreach ($anrechnung_id_arr as $anrechnung_id) { - $arr_lvLector_arr[]= $this->anrechnunglib->getLectors($anrechnung_id); // Returns LV Leitung. If not present, then all lectors of LV. + // Get full name of Fachbereichsleitung or LV Leitung. + if($this->config->item('fbl') === TRUE) + { + $arr_lvLector_arr[] = $this->anrechnunglib->getLeitungOfLvOe($anrechnung_id); + } + else + { + $arr_lvLector_arr[] = $this->anrechnunglib->getLectors($anrechnung_id); // Returns LV Leitung. If not present, then all lectors of LV. + } } // Unique lector array to send only one mail per lector From ee011ef2018bbb188edb0f39bc0d5f3034e0fa8c Mon Sep 17 00:00:00 2001 From: Manfred Date: Wed, 21 Jun 2023 11:03:33 +0200 Subject: [PATCH 043/268] OE-Suche verbessert --- include/organisationseinheit.class.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/include/organisationseinheit.class.php b/include/organisationseinheit.class.php index 1a2e0ca16..78b0e40c3 100644 --- a/include/organisationseinheit.class.php +++ b/include/organisationseinheit.class.php @@ -650,11 +650,14 @@ class organisationseinheit extends basis_db LOWER(bezeichnung) LIKE LOWER(\'%'.$this->db_escape((implode(' ',$searchItem))).'%\') OR LOWER(organisationseinheittyp_kurzbz) LIKE LOWER(\'%'.$this->db_escape((implode(' ',$searchItem))).'%\') + OR + LOWER(organisationseinheittyp_kurzbz) LIKE LOWER(\'%'.$this->db_escape((implode(' ',$searchItem))).'%\') )'; foreach($searchItem as $value) { $qry.=' OR (LOWER(oe_kurzbz)=LOWER('.$this->db_add_param($value).')) - OR (LOWER(bezeichnung) LIKE LOWER(\'%'.$this->db_escape($value).'%\'))'; + OR (LOWER(bezeichnung) LIKE LOWER(\'%'.$this->db_escape($value).'%\')) + OR (LOWER(organisationseinheittyp_kurzbz||bezeichnung) LIKE LOWER(\'%'.$this->db_escape($value).'%\'))'; } $qry.= ' ORDER BY organisationseinheittyp_kurzbz, bezeichnung;'; From a81ceb51b8a6c6febc976d7c79f4cf4bcc489650 Mon Sep 17 00:00:00 2001 From: ma0048 Date: Thu, 22 Jun 2023 10:23:00 +0200 Subject: [PATCH 044/268] - rt sperre vor dem login moeglich --- cis/testtool/login.php | 3 ++ include/pruefling.class.php | 30 +++++++++--- vilesci/stammdaten/auswertung_fhtw.php | 67 +++++++++++++++----------- 3 files changed, 63 insertions(+), 37 deletions(-) diff --git a/cis/testtool/login.php b/cis/testtool/login.php index 0b114b8c5..0ff84f4a0 100644 --- a/cis/testtool/login.php +++ b/cis/testtool/login.php @@ -362,6 +362,8 @@ if ((isset($_SESSION['prestudent_id']) && !isset($_SESSION['pruefling_id']) && $pruefling->idnachweis = ''; $pruefling->registriert = date('Y-m-d H:i:s'); $pruefling->prestudent_id = $_SESSION['prestudent_id']; + $pruefling->gesperrt = $pruefling->isGesperrt(null, $_SESSION['prestudent_id']); + if ($pruefling->save()) { $_SESSION['pruefling_id']=$pruefling->pruefling_id; @@ -385,6 +387,7 @@ if (isset($_POST['save']) && isset($_SESSION['prestudent_id'])) $pruefling->registriert = date('Y-m-d H:i:s'); $pruefling->prestudent_id = $_SESSION['prestudent_id']; $pruefling->semester = $_POST['semester']; + $pruefling->gesperrt = $pruefling->isGesperrt(null, $_SESSION['prestudent_id']); if ($pruefling->save()) { $_SESSION['pruefling_id']=$pruefling->pruefling_id; diff --git a/include/pruefling.class.php b/include/pruefling.class.php index 2a482d793..efe660ca9 100644 --- a/include/pruefling.class.php +++ b/include/pruefling.class.php @@ -108,12 +108,13 @@ class pruefling extends basis_db if($this->new) //Wenn new true ist dann ein INSERT absetzen ansonsten ein UPDATE { - $qry = 'BEGIN;INSERT INTO testtool.tbl_pruefling (studiengang_kz, idnachweis, registriert, prestudent_id, semester) VALUES('. + $qry = 'BEGIN;INSERT INTO testtool.tbl_pruefling (studiengang_kz, idnachweis, registriert, prestudent_id, semester, gesperrt) VALUES('. $this->db_add_param($this->studiengang_kz).",". $this->db_add_param($this->idnachweis).",". $this->db_add_param($this->registriert).",". $this->db_add_param($this->prestudent_id).",". - $this->db_add_param($this->semester).");"; + $this->db_add_param($this->semester).",". + $this->db_add_param($this->gesperrt, FHC_BOOLEAN).");"; } else { @@ -122,7 +123,8 @@ class pruefling extends basis_db ' idnachweis='.$this->db_add_param($this->idnachweis).','. ' registriert='.$this->db_add_param($this->registriert).','. ' semester='.$this->db_add_param($this->semester).','. - ' prestudent_id='.$this->db_add_param($this->prestudent_id, FHC_INTEGER). + ' prestudent_id='.$this->db_add_param($this->prestudent_id, FHC_INTEGER).','. + ' gesperrt='.$this->db_add_param($this->gesperrt, FHC_BOOLEAN). " WHERE pruefling_id=".$this->db_add_param($this->pruefling_id, FHC_INTEGER, false).";"; } @@ -558,18 +560,30 @@ class pruefling extends basis_db } } - public function isGesperrt($pruefling_id) + public function isGesperrt($pruefling_id = null, $prestudent_id = null) { + if (is_null($pruefling_id) && is_null($prestudent_id)) + { + $this->errormsg = 'Falsche Parameterübergabe'; + return false; + } + $qry = "SELECT spruefling.gesperrt FROM testtool.tbl_pruefling - JOIN public.tbl_prestudent USING(prestudent_id) + RIGHT JOIN public.tbl_prestudent USING(prestudent_id) JOIN public.tbl_person USING (person_id) JOIN public.tbl_prestudent pss ON pss.person_id = tbl_person.person_id JOIN testtool.tbl_pruefling spruefling ON pss.prestudent_id = spruefling.prestudent_id - WHERE tbl_pruefling.pruefling_id = ".$this->db_add_param($pruefling_id, FHC_INTEGER)." - AND spruefling.gesperrt - LIMIT 1"; + WHERE spruefling.gesperrt"; + + if (!is_null($pruefling_id)) + $qry .= " AND tbl_pruefling.pruefling_id = ".$this->db_add_param($pruefling_id, FHC_INTEGER); + if (!is_null($prestudent_id)) + $qry .= " AND tbl_prestudent.prestudent_id = ".$this->db_add_param($prestudent_id, FHC_INTEGER); + + $qry .= " LIMIT 1"; + if($result = $this->db_query($qry)) { if ($this->db_num_rows($result) == 0) diff --git a/vilesci/stammdaten/auswertung_fhtw.php b/vilesci/stammdaten/auswertung_fhtw.php index e72c03bc5..92470ce84 100644 --- a/vilesci/stammdaten/auswertung_fhtw.php +++ b/vilesci/stammdaten/auswertung_fhtw.php @@ -501,46 +501,55 @@ if ($rtprueflingEntSperren) WHERE person_id = ". $db->db_add_param($_POST['person_id']) . " )"; - if ($result = $db->db_query($qry)) { - if ($db->db_num_rows($result) === 0) { - echo json_encode(array( - 'status' => 'warning', - 'msg' => 'Kein Pruefling gefunden!' - )); - exit(); + $ps = new prestudent(); + $ps->getPrestudenten($_POST['person_id']); + + $prestudent = new prestudent($ps->result[0]->prestudent_id); + $prestudent->getLastStatus($prestudent->prestudent_id); + + $pruefling = new pruefling(); + $pruefling->new = true; + $pruefling->studiengang_kz = $prestudent->studiengang_kz; + $pruefling->registriert = date('Y-m-d H:i:s'); + $pruefling->semester = $prestudent->ausbildungssemester; + $pruefling->prestudent_id = $prestudent->prestudent_id; + $pruefling->gesperrt = true; + + $resultSperre = $pruefling->save(); } else { $pruefling_ids = array(); + while ($row = $db->db_fetch_object($result)) - { $pruefling_ids[] = $row->pruefling_id; - } - - - $qry = "UPDATE testtool.tbl_pruefling SET gesperrt =" . $db->db_add_param($_POST['art'], 'BOOLEAN') . " + + $qry = "UPDATE testtool.tbl_pruefling + SET gesperrt =" . $db->db_add_param($_POST['art'], 'BOOLEAN') . " WHERE pruefling_id IN (" . $db->db_implode4SQL($pruefling_ids) . ")"; - - if ($result_update = $db->db_query($qry)) - { - $msg = $_POST['art'] === 'false' ? 'Pruefling wurde gesperrt' : 'Pruefling wurde freigeschaltet'; - echo json_encode(array( - 'status' => 'ok', - 'msg' => $msg)); - exit(); - } - else - { - echo json_encode(array( - 'status' => 'fehler', - 'msg' => 'Fehler beim speichern der Daten' - )); - exit(); - } + + $resultSperre = $db->db_query($qry); + } + + if ($resultSperre) + { + $msg = $_POST['art'] === 'false' ? 'Pruefling wurde gesperrt' : 'Pruefling wurde freigeschaltet'; + echo json_encode(array( + 'status' => 'ok', + 'msg' => $msg)); + exit(); + } + else + { + echo json_encode(array( + 'status' => 'fehler', + 'msg' => 'Fehler beim speichern der Daten' + )); + exit(); } } else From a54c7a3492ce5cca896883c7e031a02e93d19470 Mon Sep 17 00:00:00 2001 From: KarpAlex Date: Mon, 26 Jun 2023 19:15:27 +0200 Subject: [PATCH 045/268] UHSTAT1 data: added tables --- system/dbupdate_3.4.php | 1 + ...uhstat1_daten_ueber_das_bewerbungstool.php | 124 ++++++++++++++++++ 2 files changed, 125 insertions(+) create mode 100644 system/dbupdate_3.4/29835_uhstat1_erfassung_der_uhstat1_daten_ueber_das_bewerbungstool.php diff --git a/system/dbupdate_3.4.php b/system/dbupdate_3.4.php index 9fda09bba..5687d4ca3 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/29835_uhstat1_erfassung_der_uhstat1_daten_ueber_das_bewerbungstool.php'); // *** Pruefung und hinzufuegen der neuen Attribute und Tabellen echo '

Pruefe Tabellen und Attribute!

'; diff --git a/system/dbupdate_3.4/29835_uhstat1_erfassung_der_uhstat1_daten_ueber_das_bewerbungstool.php b/system/dbupdate_3.4/29835_uhstat1_erfassung_der_uhstat1_daten_ueber_das_bewerbungstool.php new file mode 100644 index 000000000..c27e068c6 --- /dev/null +++ b/system/dbupdate_3.4/29835_uhstat1_erfassung_der_uhstat1_daten_ueber_das_bewerbungstool.php @@ -0,0 +1,124 @@ +db_query('SELECT 1 FROM bis.tbl_abschluss LIMIT 1')) +{ + $qry = "CREATE TABLE bis.tbl_abschluss + ( + ausbildung_code integer NOT NULL, + abschluss_bez varchar(128), + bezeichnung character varying(128)[], + aktiv boolean NOT NULL DEFAULT true, + in_oesterreich boolean, + CONSTRAINT tbl_abschluss_pk PRIMARY KEY (ausbildung_code) + ); + + COMMENT ON TABLE bis.tbl_abschluss IS 'Key-Table of graduation'; + COMMENT ON COLUMN bis.tbl_abschluss.aktiv IS 'Shows wether graduation is still valid.'; + COMMENT ON COLUMN bis.tbl_abschluss.in_oesterreich IS 'Shows if graduation was obtained in Austria.'; + + GRANT SELECT ON bis.tbl_abschluss TO web; + GRANT SELECT, UPDATE, INSERT, DELETE ON bis.tbl_abschluss TO vilesci; + + -- prefill values + INSERT INTO bis.tbl_abschluss(ausbildung_code, abschluss_bez, bezeichnung) VALUES(110, 'Pflichtschule', '{\"Pflichtschule (mit/ohne Abschluss)\", \"Compulsory school (Completed/not completed)\"}'); + INSERT INTO bis.tbl_abschluss(ausbildung_code, abschluss_bez, bezeichnung) VALUES(121, 'Lehre', '{\"Lehre\", \"Apprenticeship\"}'); + INSERT INTO bis.tbl_abschluss(ausbildung_code, abschluss_bez, bezeichnung) VALUES(122, 'Mittlere Schule ohne Matura', '{\"Mittlere Schule ohne Matura (z.B. Handelsschule, Fachschule)\", \"School for intermediate vocational education (without university entrance qualification)\"}'); + INSERT INTO bis.tbl_abschluss(ausbildung_code, abschluss_bez, bezeichnung) VALUES(123, 'Meisterprüfung', '{\"Meisterprüfung\", \"Master craftsman\'s diploma\"}'); + INSERT INTO bis.tbl_abschluss(ausbildung_code, abschluss_bez, bezeichnung) VALUES(131, 'AHS', '{\"AHS (allgemein bildende höhere Schule)\", \"Academic secondary school\"}'); + INSERT INTO bis.tbl_abschluss(ausbildung_code, abschluss_bez, bezeichnung) VALUES(132, 'BHS', '{\"BHS (berufsbildende höhere Schule, z.B. HAK, HTL)\", \"College for higher vocational education\"}'); + INSERT INTO bis.tbl_abschluss(ausbildung_code, abschluss_bez, bezeichnung) VALUES(133, 'Sonstige Hochschulzugangsberechtigung', '{\"Sonstige Hochschulzugangsberechtigung (z.B. Berufsreifeprüfung)\", \"Other university entrance qualification (e.g. \'Berufsreifeprüfung\')\"}'); + INSERT INTO bis.tbl_abschluss(ausbildung_code, abschluss_bez, bezeichnung) VALUES(141, 'Akademie', '{\"Akademie (z.B. PÄDAK, SOZAK)\", \"Academy (for example PÄDAK, SOZAK)\"}'); + INSERT INTO bis.tbl_abschluss(ausbildung_code, abschluss_bez, bezeichnung) VALUES(142, 'Universität/Hochschule', '{\"Universität/Hochschule\", \"University/university of applied sciences/university college of teacher education\"}'); + INSERT INTO bis.tbl_abschluss(ausbildung_code, abschluss_bez, bezeichnung) VALUES(210, 'Pflichtschule', '{\"Pflichtschule (mit/ohne Abschluss)\", \"Compulsory school (Completed/not completed)\"}'); + INSERT INTO bis.tbl_abschluss(ausbildung_code, abschluss_bez, bezeichnung) VALUES(220, 'Ausbildung ohne Hochschulzugangsberechtigung', '{\"Lehre oder mittlere Schule ohne Matura/Ausbildung ohne Hochschulzugangsberechtigung\", \"Apprenticeship or school for intermediate vocational education (education without university entrance qualification)\"}'); + INSERT INTO bis.tbl_abschluss(ausbildung_code, abschluss_bez, bezeichnung) VALUES(230, 'Ausbildung mit Hochschulzugangsberechtigung', '{\"Höhere Schule mit Matura / Ausbildung mit Hochschulzugangsberechtigung (z.B. Abitur)\", \"Higher secondary school with university entrance qualification\"}'); + INSERT INTO bis.tbl_abschluss(ausbildung_code, abschluss_bez, bezeichnung) VALUES(240, 'Universität/Hochschule', '{\"Universität/Hochschule\", \"University/university of applied sciences/university college of teacher education\"}'); + INSERT INTO bis.tbl_abschluss(ausbildung_code, abschluss_bez, bezeichnung) VALUES(999, 'unbekannt', '{\"Ich weiß nicht, welchen Abschluss meine erziehungsberechtigte Person erlangt hat.\", \"I do not know what degree my legal guardian got.\"}'); + "; + + if(!$db->db_query($qry)) + echo 'bis.tbl_abschluss: '.$db->db_last_error().'
'; + else + echo ' bis.tbl_abschluss: Tabelle hinzugefuegt
'; +} + +if (!$result = @$db->db_query('SELECT 1 FROM bis.tbl_uhstat1daten LIMIT 1')) +{ + $qry = "CREATE SEQUENCE bis.tbl_uhstat1daten_uhstat1daten_id_seq + INCREMENT BY 1 + NO MAXVALUE + NO MINVALUE + START WITH 1 + CACHE 1 + NO CYCLE; + + CREATE TABLE bis.tbl_uhstat1daten + ( + uhstat1daten_id integer DEFAULT nextval('bis.tbl_uhstat1daten_uhstat1daten_id_seq'::regclass), + geburtsstaat varchar(3), + mutter_geburtsstaat varchar(3), + mutter_bildungsstaat varchar(3), + mutter_geburtsjahr smallint, + mutter_bildungmax integer, + vater_geburtsstaat varchar(3), + vater_bildungsstaat varchar(3), + vater_geburtsjahr smallint, + vater_bildungmax integer, + person_id integer NOT NULL + ); + + ALTER TABLE bis.tbl_uhstat1daten ADD CONSTRAINT fk_tbl_uhstat1daten_geburtsstaat FOREIGN KEY (geburtsstaat) + REFERENCES bis.tbl_nation (nation_code) MATCH SIMPLE + ON DELETE RESTRICT ON UPDATE CASCADE; + + ALTER TABLE bis.tbl_uhstat1daten ADD CONSTRAINT fk_tbl_uhstat1daten_mutter_geburtsstaat FOREIGN KEY (mutter_geburtsstaat) + REFERENCES bis.tbl_nation (nation_code) MATCH SIMPLE + ON DELETE RESTRICT ON UPDATE CASCADE; + + ALTER TABLE bis.tbl_uhstat1daten ADD CONSTRAINT fk_tbl_uhstat1daten_mutter_bildungsstaat FOREIGN KEY (mutter_bildungsstaat) + REFERENCES bis.tbl_nation (nation_code) MATCH SIMPLE + ON DELETE RESTRICT ON UPDATE CASCADE; + + ALTER TABLE bis.tbl_uhstat1daten ADD CONSTRAINT fk_tbl_uhstat1daten_mutter_bildungmax FOREIGN KEY (mutter_bildungmax) + REFERENCES bis.tbl_abschluss (ausbildung_code) MATCH SIMPLE + ON DELETE RESTRICT ON UPDATE CASCADE; + + ALTER TABLE bis.tbl_uhstat1daten ADD CONSTRAINT fk_tbl_uhstat1daten_vater_geburtsstaat FOREIGN KEY (vater_geburtsstaat) + REFERENCES bis.tbl_nation (nation_code) MATCH SIMPLE + ON DELETE RESTRICT ON UPDATE CASCADE; + + ALTER TABLE bis.tbl_uhstat1daten ADD CONSTRAINT fk_tbl_uhstat1daten_vater_bildungsstaat FOREIGN KEY (vater_bildungsstaat) + REFERENCES bis.tbl_nation (nation_code) MATCH SIMPLE + ON DELETE RESTRICT ON UPDATE CASCADE; + + ALTER TABLE bis.tbl_uhstat1daten ADD CONSTRAINT fk_tbl_uhstat1daten_vater_bildungmax FOREIGN KEY (vater_bildungmax) + REFERENCES bis.tbl_abschluss (ausbildung_code) MATCH SIMPLE + ON DELETE RESTRICT ON UPDATE CASCADE; + + ALTER TABLE bis.tbl_uhstat1daten ADD CONSTRAINT fk_tbl_uhstat1daten_person_id FOREIGN KEY (person_id) + REFERENCES public.tbl_person (person_id) MATCH SIMPLE + ON DELETE RESTRICT ON UPDATE CASCADE; + + COMMENT ON TABLE bis.tbl_uhstat1daten IS 'UHSTAT1 data for a person (statistical data)'; + COMMENT ON COLUMN bis.tbl_uhstat1daten.geburtsstaat IS 'Birthplace of person'; + COMMENT ON COLUMN bis.tbl_uhstat1daten.mutter_geburtsstaat IS 'Birth country of mother of person'; + COMMENT ON COLUMN bis.tbl_uhstat1daten.mutter_bildungsstaat IS 'Education country of mother of person'; + COMMENT ON COLUMN bis.tbl_uhstat1daten.mutter_geburtsjahr IS 'Birth year of mother of person'; + COMMENT ON COLUMN bis.tbl_uhstat1daten.mutter_bildungmax IS 'Highest completed level of education of mother (code)'; + COMMENT ON COLUMN bis.tbl_uhstat1daten.vater_geburtsstaat IS 'Birth country of father of person'; + COMMENT ON COLUMN bis.tbl_uhstat1daten.vater_bildungsstaat IS 'Education country of father of person'; + COMMENT ON COLUMN bis.tbl_uhstat1daten.vater_geburtsjahr IS 'Birth year of father of person'; + COMMENT ON COLUMN bis.tbl_uhstat1daten.vater_bildungmax IS 'Highest completed level of education of father (code)'; + + GRANT SELECT, UPDATE, INSERT, DELETE ON bis.tbl_uhstat1daten TO web; + GRANT SELECT, UPDATE, INSERT, DELETE ON bis.tbl_uhstat1daten TO vilesci; + "; + + if(!$db->db_query($qry)) + echo 'bis.tbl_uhstat1daten: '.$db->db_last_error().'
'; + else + echo ' bis.tbl_uhstat1daten: Tabelle hinzugefuegt
'; +} From d6cce60b8fe852ee7f2a6096adf02fa0f9736ea8 Mon Sep 17 00:00:00 2001 From: nkrondraf Date: Tue, 27 Jun 2023 08:25:14 +0200 Subject: [PATCH 046/268] add LDAP service ping configuration to second LDAP server --- config/cis.config-default.inc.php | 1 + config/system.config-default.inc.php | 1 + config/vilesci.config-default.inc.php | 1 + config/wawi.config-default.inc.php | 1 + 4 files changed, 4 insertions(+) diff --git a/config/cis.config-default.inc.php b/config/cis.config-default.inc.php index 5a7162765..ce1070fd3 100644 --- a/config/cis.config-default.inc.php +++ b/config/cis.config-default.inc.php @@ -106,6 +106,7 @@ define('LDAP2_BASE_DN','ou=Mitarbeiter,dc=example,dc=com'); define('LDAP2_BIND_USER','cn=fhcomplete,dc=example,dc=com'); define('LDAP2_BIND_PASSWORD','Pa55w0rd'); define('LDAP2_USER_SEARCH_FILTER','sAMAccountName'); +define('LDAP2_SERVICEPING',true); */ // LDAP MASTER SERVER fuer Passwort Aenderungen diff --git a/config/system.config-default.inc.php b/config/system.config-default.inc.php index 0d93b8eec..d3afea521 100644 --- a/config/system.config-default.inc.php +++ b/config/system.config-default.inc.php @@ -72,6 +72,7 @@ define('LDAP2_BIND_USER','cn=fhcomplete,dc=example,dc=com'); define('LDAP2_BIND_PASSWORD','Pa55w0rd'); define('LDAP2_USER_SEARCH_FILTER','sAMAccountName'); + define('LDAP2_SERVICEPING',true); */ ?> diff --git a/config/vilesci.config-default.inc.php b/config/vilesci.config-default.inc.php index 1d8e476c7..b0077e56a 100644 --- a/config/vilesci.config-default.inc.php +++ b/config/vilesci.config-default.inc.php @@ -95,6 +95,7 @@ define('LDAP2_BASE_DN', 'ou=Mitarbeiter,dc=example,dc=com'); define('LDAP2_BIND_USER', 'cn=fhcomplete,dc=example,dc=com'); define('LDAP2_BIND_PASSWORD', 'Pa55w0rd'); define('LDAP2_USER_SEARCH_FILTER', 'sAMAccountName'); +define('LDAP2_SERVICEPING',true); */ // LDAP MASTER SERVER fuer Passwort Aenderungen diff --git a/config/wawi.config-default.inc.php b/config/wawi.config-default.inc.php index a5adccf04..e1fbbb69c 100644 --- a/config/wawi.config-default.inc.php +++ b/config/wawi.config-default.inc.php @@ -73,6 +73,7 @@ define('LDAP2_BASE_DN','ou=Mitarbeiter,dc=example,dc=com'); define('LDAP2_BIND_USER','cn=fhcomplete,dc=example,dc=com'); define('LDAP2_BIND_PASSWORD','Pa55w0rd'); define('LDAP2_USER_SEARCH_FILTER','sAMAccountName'); +define('LDAP2_SERVICEPING',true); */ // Attribut fuer Zutrittskartennummer im LDAP From c89f375015e068eb3cc89e332c8d541395eb394c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20=C3=96sterreicher?= Date: Tue, 27 Jun 2023 09:33:23 +0200 Subject: [PATCH 047/268] Removed ServicePing Config for Second LDAP --- config/cis.config-default.inc.php | 3 +-- config/system.config-default.inc.php | 3 +-- config/vilesci.config-default.inc.php | 3 +-- config/wawi.config-default.inc.php | 3 +-- 4 files changed, 4 insertions(+), 8 deletions(-) diff --git a/config/cis.config-default.inc.php b/config/cis.config-default.inc.php index ce1070fd3..27e0a9a70 100644 --- a/config/cis.config-default.inc.php +++ b/config/cis.config-default.inc.php @@ -86,7 +86,7 @@ define("AUTH_NAME","FH-Complete"); * LDAP_BIND_USER: DN des Users falls eine Authentifizierung am LDAP noetig ist oder null * LDAP_BIND_PASSWORD: Passwort des Users falls eine Authentifizierung am LDAP noetig ist oder null * LDAP_USER_SEARCH_FILTER: LDAP Attribut in dem der Username steht nach dem gesucht wird (uid | sAMAccountName) - * LDAP_SERVICEPING: LDAP Service Ping verwenden (true | false) + * LDAP_SERVICEPING: LDAP Service Ping verwenden (true | false) - wirksam für alle LDAP Server */ define('LDAP_SERVER','ldap://ldap.example.com'); define('LDAP_PORT',389); @@ -106,7 +106,6 @@ define('LDAP2_BASE_DN','ou=Mitarbeiter,dc=example,dc=com'); define('LDAP2_BIND_USER','cn=fhcomplete,dc=example,dc=com'); define('LDAP2_BIND_PASSWORD','Pa55w0rd'); define('LDAP2_USER_SEARCH_FILTER','sAMAccountName'); -define('LDAP2_SERVICEPING',true); */ // LDAP MASTER SERVER fuer Passwort Aenderungen diff --git a/config/system.config-default.inc.php b/config/system.config-default.inc.php index d3afea521..a1f70086a 100644 --- a/config/system.config-default.inc.php +++ b/config/system.config-default.inc.php @@ -52,7 +52,7 @@ * LDAP_BIND_USER: DN des Users falls eine Authentifizierung am LDAP noetig ist oder null * LDAP_BIND_PASSWORD: Passwort des Users falls eine Authentifizierung am LDAP noetig ist oder null * LDAP_USER_SEARCH_FILTER: LDAP Attribut in dem der Username steht nach dem gesucht wird (uid | sAMAccountName) - * LDAP_SERVICEPING: LDAP Service Ping verwenden (true | false) + * LDAP_SERVICEPING: LDAP Service Ping verwenden (true | false) - wirksam für alle LDAP Server */ define('LDAP_SERVER','ldap://ldap.example.com'); define('LDAP_PORT',389); @@ -72,7 +72,6 @@ define('LDAP2_BIND_USER','cn=fhcomplete,dc=example,dc=com'); define('LDAP2_BIND_PASSWORD','Pa55w0rd'); define('LDAP2_USER_SEARCH_FILTER','sAMAccountName'); - define('LDAP2_SERVICEPING',true); */ ?> diff --git a/config/vilesci.config-default.inc.php b/config/vilesci.config-default.inc.php index b0077e56a..fdd971be0 100644 --- a/config/vilesci.config-default.inc.php +++ b/config/vilesci.config-default.inc.php @@ -75,7 +75,7 @@ define('AUTH_NAME', 'FH Complete'); * LDAP_BIND_USER: DN des Users falls eine Authentifizierung am LDAP noetig ist oder null * LDAP_BIND_PASSWORD: Passwort des Users falls eine Authentifizierung am LDAP noetig ist oder null * LDAP_USER_SEARCH_FILTER: LDAP Attribut in dem der Username steht nach dem gesucht wird (uid | sAMAccountName) - * LDAP_SERVICEPING: LDAP Service Ping verwenden (true | false) + * LDAP_SERVICEPING: LDAP Service Ping verwenden (true | false) - wirksam für alle LDAP Server */ define('LDAP_SERVER', 'ldap://ldap.example.com'); define('LDAP_PORT', 389); @@ -95,7 +95,6 @@ define('LDAP2_BASE_DN', 'ou=Mitarbeiter,dc=example,dc=com'); define('LDAP2_BIND_USER', 'cn=fhcomplete,dc=example,dc=com'); define('LDAP2_BIND_PASSWORD', 'Pa55w0rd'); define('LDAP2_USER_SEARCH_FILTER', 'sAMAccountName'); -define('LDAP2_SERVICEPING',true); */ // LDAP MASTER SERVER fuer Passwort Aenderungen diff --git a/config/wawi.config-default.inc.php b/config/wawi.config-default.inc.php index e1fbbb69c..0081c2420 100644 --- a/config/wawi.config-default.inc.php +++ b/config/wawi.config-default.inc.php @@ -53,7 +53,7 @@ define("AUTH_NAME","FHComplete"); * LDAP_BIND_USER: DN des Users falls eine Authentifizierung am LDAP noetig ist oder null * LDAP_BIND_PASSWORD: Passwort des Users falls eine Authentifizierung am LDAP noetig ist oder null * LDAP_USER_SEARCH_FILTER: LDAP Attribut in dem der Username steht nach dem gesucht wird (uid | sAMAccountName) - * LDAP_SERVICEPING: LDAP Service Ping verwenden (true | false) + * LDAP_SERVICEPING: LDAP Service Ping verwenden (true | false) - wirksam für alle LDAP Server */ define('LDAP_SERVER','ldap://ldap.example.com'); define('LDAP_PORT',389); @@ -73,7 +73,6 @@ define('LDAP2_BASE_DN','ou=Mitarbeiter,dc=example,dc=com'); define('LDAP2_BIND_USER','cn=fhcomplete,dc=example,dc=com'); define('LDAP2_BIND_PASSWORD','Pa55w0rd'); define('LDAP2_USER_SEARCH_FILTER','sAMAccountName'); -define('LDAP2_SERVICEPING',true); */ // Attribut fuer Zutrittskartennummer im LDAP From 0a961d8e95b33a5e300586d84d598bd7b10c0346 Mon Sep 17 00:00:00 2001 From: KarpAlex Date: Tue, 27 Jun 2023 11:00:13 +0200 Subject: [PATCH 048/268] UHSTAT1 bis.tbl_abschluss: added default values for in_oesterreich boolean --- ...uhstat1_daten_ueber_das_bewerbungstool.php | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/system/dbupdate_3.4/29835_uhstat1_erfassung_der_uhstat1_daten_ueber_das_bewerbungstool.php b/system/dbupdate_3.4/29835_uhstat1_erfassung_der_uhstat1_daten_ueber_das_bewerbungstool.php index c27e068c6..7395ac0bc 100644 --- a/system/dbupdate_3.4/29835_uhstat1_erfassung_der_uhstat1_daten_ueber_das_bewerbungstool.php +++ b/system/dbupdate_3.4/29835_uhstat1_erfassung_der_uhstat1_daten_ueber_das_bewerbungstool.php @@ -23,19 +23,19 @@ if (!$result = @$db->db_query('SELECT 1 FROM bis.tbl_abschluss LIMIT 1')) GRANT SELECT, UPDATE, INSERT, DELETE ON bis.tbl_abschluss TO vilesci; -- prefill values - INSERT INTO bis.tbl_abschluss(ausbildung_code, abschluss_bez, bezeichnung) VALUES(110, 'Pflichtschule', '{\"Pflichtschule (mit/ohne Abschluss)\", \"Compulsory school (Completed/not completed)\"}'); - INSERT INTO bis.tbl_abschluss(ausbildung_code, abschluss_bez, bezeichnung) VALUES(121, 'Lehre', '{\"Lehre\", \"Apprenticeship\"}'); - INSERT INTO bis.tbl_abschluss(ausbildung_code, abschluss_bez, bezeichnung) VALUES(122, 'Mittlere Schule ohne Matura', '{\"Mittlere Schule ohne Matura (z.B. Handelsschule, Fachschule)\", \"School for intermediate vocational education (without university entrance qualification)\"}'); - INSERT INTO bis.tbl_abschluss(ausbildung_code, abschluss_bez, bezeichnung) VALUES(123, 'Meisterprüfung', '{\"Meisterprüfung\", \"Master craftsman\'s diploma\"}'); - INSERT INTO bis.tbl_abschluss(ausbildung_code, abschluss_bez, bezeichnung) VALUES(131, 'AHS', '{\"AHS (allgemein bildende höhere Schule)\", \"Academic secondary school\"}'); - INSERT INTO bis.tbl_abschluss(ausbildung_code, abschluss_bez, bezeichnung) VALUES(132, 'BHS', '{\"BHS (berufsbildende höhere Schule, z.B. HAK, HTL)\", \"College for higher vocational education\"}'); - INSERT INTO bis.tbl_abschluss(ausbildung_code, abschluss_bez, bezeichnung) VALUES(133, 'Sonstige Hochschulzugangsberechtigung', '{\"Sonstige Hochschulzugangsberechtigung (z.B. Berufsreifeprüfung)\", \"Other university entrance qualification (e.g. \'Berufsreifeprüfung\')\"}'); - INSERT INTO bis.tbl_abschluss(ausbildung_code, abschluss_bez, bezeichnung) VALUES(141, 'Akademie', '{\"Akademie (z.B. PÄDAK, SOZAK)\", \"Academy (for example PÄDAK, SOZAK)\"}'); - INSERT INTO bis.tbl_abschluss(ausbildung_code, abschluss_bez, bezeichnung) VALUES(142, 'Universität/Hochschule', '{\"Universität/Hochschule\", \"University/university of applied sciences/university college of teacher education\"}'); - INSERT INTO bis.tbl_abschluss(ausbildung_code, abschluss_bez, bezeichnung) VALUES(210, 'Pflichtschule', '{\"Pflichtschule (mit/ohne Abschluss)\", \"Compulsory school (Completed/not completed)\"}'); - INSERT INTO bis.tbl_abschluss(ausbildung_code, abschluss_bez, bezeichnung) VALUES(220, 'Ausbildung ohne Hochschulzugangsberechtigung', '{\"Lehre oder mittlere Schule ohne Matura/Ausbildung ohne Hochschulzugangsberechtigung\", \"Apprenticeship or school for intermediate vocational education (education without university entrance qualification)\"}'); - INSERT INTO bis.tbl_abschluss(ausbildung_code, abschluss_bez, bezeichnung) VALUES(230, 'Ausbildung mit Hochschulzugangsberechtigung', '{\"Höhere Schule mit Matura / Ausbildung mit Hochschulzugangsberechtigung (z.B. Abitur)\", \"Higher secondary school with university entrance qualification\"}'); - INSERT INTO bis.tbl_abschluss(ausbildung_code, abschluss_bez, bezeichnung) VALUES(240, 'Universität/Hochschule', '{\"Universität/Hochschule\", \"University/university of applied sciences/university college of teacher education\"}'); + INSERT INTO bis.tbl_abschluss(ausbildung_code, abschluss_bez, bezeichnung, in_oesterreich) VALUES(110, 'Pflichtschule', '{\"Pflichtschule (mit/ohne Abschluss)\", \"Compulsory school (Completed/not completed)\"}', true); + INSERT INTO bis.tbl_abschluss(ausbildung_code, abschluss_bez, bezeichnung, in_oesterreich) VALUES(121, 'Lehre', '{\"Lehre\", \"Apprenticeship\"}', true); + INSERT INTO bis.tbl_abschluss(ausbildung_code, abschluss_bez, bezeichnung, in_oesterreich) VALUES(122, 'Mittlere Schule ohne Matura', '{\"Mittlere Schule ohne Matura (z.B. Handelsschule, Fachschule)\", \"School for intermediate vocational education (without university entrance qualification)\"}', true); + INSERT INTO bis.tbl_abschluss(ausbildung_code, abschluss_bez, bezeichnung, in_oesterreich) VALUES(123, 'Meisterprüfung', '{\"Meisterprüfung\", \"Master craftsman\'s diploma\"}', true); + INSERT INTO bis.tbl_abschluss(ausbildung_code, abschluss_bez, bezeichnung, in_oesterreich) VALUES(131, 'AHS', '{\"AHS (allgemein bildende höhere Schule)\", \"Academic secondary school\"}', true); + INSERT INTO bis.tbl_abschluss(ausbildung_code, abschluss_bez, bezeichnung, in_oesterreich) VALUES(132, 'BHS', '{\"BHS (berufsbildende höhere Schule, z.B. HAK, HTL)\", \"College for higher vocational education\"}', true); + INSERT INTO bis.tbl_abschluss(ausbildung_code, abschluss_bez, bezeichnung, in_oesterreich) VALUES(133, 'Sonstige Hochschulzugangsberechtigung', '{\"Sonstige Hochschulzugangsberechtigung (z.B. Berufsreifeprüfung)\", \"Other university entrance qualification (e.g. \'Berufsreifeprüfung\')\"}', true); + INSERT INTO bis.tbl_abschluss(ausbildung_code, abschluss_bez, bezeichnung, in_oesterreich) VALUES(141, 'Akademie', '{\"Akademie (z.B. PÄDAK, SOZAK)\", \"Academy (for example PÄDAK, SOZAK)\"}', true); + INSERT INTO bis.tbl_abschluss(ausbildung_code, abschluss_bez, bezeichnung, in_oesterreich) VALUES(142, 'Universität/Hochschule', '{\"Universität/Hochschule\", \"University/university of applied sciences/university college of teacher education\"}', true); + INSERT INTO bis.tbl_abschluss(ausbildung_code, abschluss_bez, bezeichnung, in_oesterreich) VALUES(210, 'Pflichtschule', '{\"Pflichtschule (mit/ohne Abschluss)\", \"Compulsory school (Completed/not completed)\"}', false); + INSERT INTO bis.tbl_abschluss(ausbildung_code, abschluss_bez, bezeichnung, in_oesterreich) VALUES(220, 'Ausbildung ohne Hochschulzugangsberechtigung', '{\"Lehre oder mittlere Schule ohne Matura/Ausbildung ohne Hochschulzugangsberechtigung\", \"Apprenticeship or school for intermediate vocational education (education without university entrance qualification)\"}', false); + INSERT INTO bis.tbl_abschluss(ausbildung_code, abschluss_bez, bezeichnung, in_oesterreich) VALUES(230, 'Ausbildung mit Hochschulzugangsberechtigung', '{\"Höhere Schule mit Matura / Ausbildung mit Hochschulzugangsberechtigung (z.B. Abitur)\", \"Higher secondary school with university entrance qualification\"}', false); + INSERT INTO bis.tbl_abschluss(ausbildung_code, abschluss_bez, bezeichnung, in_oesterreich) VALUES(240, 'Universität/Hochschule', '{\"Universität/Hochschule\", \"University/university of applied sciences/university college of teacher education\"}', false); INSERT INTO bis.tbl_abschluss(ausbildung_code, abschluss_bez, bezeichnung) VALUES(999, 'unbekannt', '{\"Ich weiß nicht, welchen Abschluss meine erziehungsberechtigte Person erlangt hat.\", \"I do not know what degree my legal guardian got.\"}'); "; From f49771ec7f433b15f9f17198564c26c392de4587 Mon Sep 17 00:00:00 2001 From: ma0048 Date: Thu, 29 Jun 2023 12:10:50 +0200 Subject: [PATCH 049/268] - berechtigungen fuer die sequence hinzugefuegt --- system/dbupdate_3.4.php | 1 + .../29529_infocenter_anpassungen.php | 34 +++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 system/dbupdate_3.4/29529_infocenter_anpassungen.php diff --git a/system/dbupdate_3.4.php b/system/dbupdate_3.4.php index 106e509a1..aa4221bf4 100644 --- a/system/dbupdate_3.4.php +++ b/system/dbupdate_3.4.php @@ -36,6 +36,7 @@ require_once('dbupdate_3.4/19154_beurteilungsformulare_pruefungssenat.php'); require_once('dbupdate_3.4/27949_infocenter_zurueckstellen_mit_grund.php'); 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/29529_infocenter_anpassungen.php'); // *** Pruefung und hinzufuegen der neuen Attribute und Tabellen echo '

Pruefe Tabellen und Attribute!

'; diff --git a/system/dbupdate_3.4/29529_infocenter_anpassungen.php b/system/dbupdate_3.4/29529_infocenter_anpassungen.php new file mode 100644 index 000000000..e11f3ed39 --- /dev/null +++ b/system/dbupdate_3.4/29529_infocenter_anpassungen.php @@ -0,0 +1,34 @@ +db_query("SELECT has_sequence_privilege('web', 'testtool.tbl_pruefling_pruefling_id_seq', 'UPDATE')")) +{ + + if($db->db_fetch_object($result)->has_sequence_privilege === "f") + { + $qry = "GRANT SELECT, UPDATE ON SEQUENCE testtool.tbl_pruefling_pruefling_id_seq to web;"; + + if(!$db->db_query($qry)) + echo 'testtool.tbl_pruefling Berechtigungen: '.$db->db_last_error().'
'; + else + echo '
Web User fuer testtool.tbl_pruefling berechtigt'; + } +} + +// Update Berechtigungen fuer vilesci User erteilen fuer tbl_pruefling_pruefling_id_seq +if($result = @$db->db_query("SELECT has_sequence_privilege('vilesci', 'testtool.tbl_pruefling_pruefling_id_seq', 'UPDATE')")) +{ + if($db->db_fetch_object($result)->has_sequence_privilege === "f") + { + $qry = "GRANT SELECT, UPDATE ON SEQUENCE testtool.tbl_pruefling_pruefling_id_seq to vilesci;"; + + if(!$db->db_query($qry)) + echo 'testtool.tbl_pruefling Berechtigungen: '.$db->db_last_error().'
'; + else + echo '
vilesci User fuer testtool.tbl_pruefling berechtigt'; + } +} + + From 64ce3d1f6af1ce5c1146845d1ab4aa7788c1902d Mon Sep 17 00:00:00 2001 From: cgfhtw Date: Tue, 4 Jul 2023 10:34:14 +0200 Subject: [PATCH 050/268] Cleaned up commit from 'feature-27351/Digitalisierung_Formulare_Abmeldung_Unterbrechung_Wiederholung' --- application/config/studierendenantrag.php | 152 ++ .../components/Antrag/Abmeldung.php | 201 ++ .../controllers/components/Antrag/Leitung.php | 358 ++++ .../components/Antrag/Unterbrechung.php | 230 +++ .../components/Antrag/Wiederholung.php | 369 ++++ .../controllers/components/Phrasen.php | 23 + application/controllers/jobs/AntragJob.php | 406 ++++ .../controllers/lehre/Antrag/Attachment.php | 82 + .../controllers/lehre/Antrag/Wiederholung.php | 49 + .../controllers/lehre/Studierendenantrag.php | 208 ++ application/helpers/hlp_common_helper.php | 16 + application/libraries/AntragLib.php | 1476 ++++++++++++++ application/libraries/DmsLib.php | 2 + application/libraries/PrestudentLib.php | 356 ++++ application/models/crm/Konto_model.php | 43 +- .../models/crm/Prestudentstatus_model.php | 90 + .../models/education/Pruefung_model.php | 139 +- .../education/Studierendenantrag_model.php | 229 +++ ...dierendenantraglehrveranstaltung_model.php | 79 + .../Studierendenantragstatus_model.php | 52 + .../models/education/Zeugnisnote_model.php | 81 +- .../models/organisation/Studiengang_model.php | 53 +- .../models/organisation/Studienplan_model.php | 34 +- .../organisation/Studiensemester_model.php | 30 + application/models/person/Person_model.php | 13 + application/views/lehre/Antrag/Create.php | 54 + .../views/lehre/Antrag/Leitung/List.php | 58 + .../views/lehre/Antrag/Student/List.php | 151 ++ .../lehre/Antrag/Wiederholung/Student.php | 43 + .../lehre/Antrag/Wiederholung/getLvs.rdf.php | 31 + .../lehre/Antrag/Wiederholung/moveLvs.rdf.php | 17 + application/views/templates/FHC-Common.php | 2 +- application/views/templates/FHC-Header.php | 3 + cis/private/pdfExport.php | 2 + cis/private/profile/dokumente.php | 22 + composer.json | 27 +- composer.lock | 463 ++++- content/fas.xul.php | 35 +- content/student/studentnotenoverlay.xul.php | 79 + content/student/studentoverlay.js.php | 320 ++- include/dokument_export.class.php | 4 + include/studierendenantrag.class.php | 147 ++ locale/de-AT/fas.dtd | 12 + public/css/Fhc.css | 79 + public/css/cis_bs5.css | 66 + public/js/apps/lehre/Antrag.js | 22 + public/js/apps/lehre/Antrag/Leitung.js | 8 + public/js/apps/lehre/Antrag/Lvzuweisung.js | 8 + public/js/apps/lehre/Antrag/Student.js | 8 + public/js/components/Bootstrap/Alert.js | 44 + public/js/components/Bootstrap/Confirm.js | 22 + public/js/components/Bootstrap/Modal.js | 109 + public/js/components/Bootstrap/Prompt.js | 37 + public/js/components/Fetch.js | 17 +- public/js/components/Loader.js | 62 + .../components/Studierendenantrag/Antrag.js | 60 + .../Studierendenantrag/Form/Abmeldung.js | 285 +++ .../Studierendenantrag/Form/Unterbrechung.js | 359 ++++ .../Studierendenantrag/Form/Wiederholung.js | 212 ++ .../Studierendenantrag/Infoblock.js | 19 + .../components/Studierendenantrag/Leitung.js | 312 +++ .../Studierendenantrag/Leitung/Actions.js | 87 + .../Leitung/Actions/Columns.js | 25 + .../Studierendenantrag/Leitung/Actions/New.js | 118 ++ .../Studierendenantrag/Leitung/GrundPopup.js | 62 + .../Studierendenantrag/Leitung/Header.js | 24 + .../Studierendenantrag/Leitung/LvPopup.js | 142 ++ .../Studierendenantrag/Leitung/Table.js | 388 ++++ .../Studierendenantrag/Lvzuweisung.js | 242 +++ .../components/Studierendenantrag/Status.js | 15 + public/js/components/vueDatepicker.js.php | 12 + public/js/mixins/Phrasen.js | 85 + public/js/tabulator/filters/Dates.js | 43 + rdf/AntragAbmeldung.xml.php | 68 + rdf/AntragUnterbrechung.xml.php | 71 + system/dbupdate_3.4.php | 1 + .../27351_digitalisierung_formulare.php | 289 +++ system/phrasesupdate.php | 1784 +++++++++++++++++ system/vorlage_zip/AntragAbmeldung.odt | Bin 0 -> 37277 bytes system/vorlage_zip/AntragUnterbrechung.odt | Bin 0 -> 34155 bytes system/xsl/AntragAbmeldung.xsl | 368 ++++ system/xsl/AntragUnterbrechung.xsl | 459 +++++ 82 files changed, 12192 insertions(+), 61 deletions(-) create mode 100644 application/config/studierendenantrag.php create mode 100644 application/controllers/components/Antrag/Abmeldung.php create mode 100644 application/controllers/components/Antrag/Leitung.php create mode 100644 application/controllers/components/Antrag/Unterbrechung.php create mode 100644 application/controllers/components/Antrag/Wiederholung.php create mode 100644 application/controllers/components/Phrasen.php create mode 100644 application/controllers/jobs/AntragJob.php create mode 100644 application/controllers/lehre/Antrag/Attachment.php create mode 100644 application/controllers/lehre/Antrag/Wiederholung.php create mode 100644 application/controllers/lehre/Studierendenantrag.php create mode 100644 application/libraries/AntragLib.php create mode 100644 application/libraries/PrestudentLib.php create mode 100644 application/models/education/Studierendenantrag_model.php create mode 100644 application/models/education/Studierendenantraglehrveranstaltung_model.php create mode 100644 application/models/education/Studierendenantragstatus_model.php create mode 100644 application/views/lehre/Antrag/Create.php create mode 100644 application/views/lehre/Antrag/Leitung/List.php create mode 100644 application/views/lehre/Antrag/Student/List.php create mode 100644 application/views/lehre/Antrag/Wiederholung/Student.php create mode 100644 application/views/lehre/Antrag/Wiederholung/getLvs.rdf.php create mode 100644 application/views/lehre/Antrag/Wiederholung/moveLvs.rdf.php create mode 100644 include/studierendenantrag.class.php create mode 100644 public/css/Fhc.css create mode 100644 public/css/cis_bs5.css create mode 100644 public/js/apps/lehre/Antrag.js create mode 100644 public/js/apps/lehre/Antrag/Leitung.js create mode 100644 public/js/apps/lehre/Antrag/Lvzuweisung.js create mode 100644 public/js/apps/lehre/Antrag/Student.js create mode 100644 public/js/components/Bootstrap/Alert.js create mode 100644 public/js/components/Bootstrap/Confirm.js create mode 100644 public/js/components/Bootstrap/Modal.js create mode 100644 public/js/components/Bootstrap/Prompt.js create mode 100644 public/js/components/Loader.js create mode 100644 public/js/components/Studierendenantrag/Antrag.js create mode 100644 public/js/components/Studierendenantrag/Form/Abmeldung.js create mode 100644 public/js/components/Studierendenantrag/Form/Unterbrechung.js create mode 100644 public/js/components/Studierendenantrag/Form/Wiederholung.js create mode 100644 public/js/components/Studierendenantrag/Infoblock.js create mode 100644 public/js/components/Studierendenantrag/Leitung.js create mode 100644 public/js/components/Studierendenantrag/Leitung/Actions.js create mode 100644 public/js/components/Studierendenantrag/Leitung/Actions/Columns.js create mode 100644 public/js/components/Studierendenantrag/Leitung/Actions/New.js create mode 100644 public/js/components/Studierendenantrag/Leitung/GrundPopup.js create mode 100644 public/js/components/Studierendenantrag/Leitung/Header.js create mode 100644 public/js/components/Studierendenantrag/Leitung/LvPopup.js create mode 100644 public/js/components/Studierendenantrag/Leitung/Table.js create mode 100644 public/js/components/Studierendenantrag/Lvzuweisung.js create mode 100644 public/js/components/Studierendenantrag/Status.js create mode 100644 public/js/components/vueDatepicker.js.php create mode 100644 public/js/mixins/Phrasen.js create mode 100644 public/js/tabulator/filters/Dates.js create mode 100644 rdf/AntragAbmeldung.xml.php create mode 100644 rdf/AntragUnterbrechung.xml.php create mode 100644 system/dbupdate_3.4/27351_digitalisierung_formulare.php create mode 100644 system/vorlage_zip/AntragAbmeldung.odt create mode 100644 system/vorlage_zip/AntragUnterbrechung.odt create mode 100644 system/xsl/AntragAbmeldung.xsl create mode 100644 system/xsl/AntragUnterbrechung.xsl diff --git a/application/config/studierendenantrag.php b/application/config/studierendenantrag.php new file mode 100644 index 000000000..85a3e1658 --- /dev/null +++ b/application/config/studierendenantrag.php @@ -0,0 +1,152 @@ + null, 'dokument_kurzbz' => null, 'kategorie_kurzbz' => null]; +$config['unterbrechung_dms'] = ['oe_kurzbz' => null, 'dokument_kurzbz' => null, 'kategorie_kurzbz' => 'Akte']; + +/** + * UPLOAD + */ + +/** + * Allowed filetypes for attachment upload in unterbrechung antrag + * + * @var array An array of fileextensions + */ +$config['unterbrechung_dms_filetypes'] = ['jpg', 'pdf']; + + +/** + * GRADES + */ + +/** + * On wiederholung the student must repeat certain lvs. + * This lvs will be graded with this id + * + * @var integer tbl_note.note + */ +$config['wiederholung_note_angerechnet'] = 19; + +/** + * On wiederholung the student can not attend certain lvs. + * Those lvs will be graded with this id + * + * @var integer tbl_note.note + */ +$config['wiederholung_note_nicht_zugelassen'] = 20; + + +/** + * JOBS + */ + +/** + * The Job will remind for every Unterbrecher who has a + * wiedereinstieg_datum between the date the Job is run + * and the modified date + * e.g.: If the Job is running on 2023-04-20 and the modifier + * is '+3 days' it will remind of everyone that + * has a wiedereinstiegs_datum between 2023-04-20 and 2023-04-23 + * + * @var string A string formated as PHP DateTime modifier + * @see https://www.php.net/manual/de/datetime.modify.php + */ +$config['unterbrechung_job_remind_wiedereinstieg_date_modifier'] = '+3 days'; + +/** + * The Job will sent a request to everyone who faild the 3rd committee exam + * and respecting the given conditions (not repeated yet, stg not in blacklist) + * to decide if he/she will repeat or not + * + * First request + * + * @var string A string formated as PHP DateTime modifier + * @see https://www.php.net/manual/de/datetime.modify.php + */ +$config['wiederholung_job_request_1_date_modifier'] = '+0 days'; + +/** + * Second request + * + * @var string A string formated as PHP DateTime modifier + * @see https://www.php.net/manual/de/datetime.modify.php + */ +$config['wiederholung_job_request_2_date_modifier'] = '+3 weeks'; + +/** + * Final deadline - after this the student will be abgemeldet if he hasn't chosen yet + * + * @var string A string formated as PHP DateTime modifier + * @see https://www.php.net/manual/de/datetime.modify.php + */ +$config['wiederholung_job_deadline_date_modifier'] = '+1 month'; + +/** + * Objection period - the student will be abgemeldet if he hasn't objected in this period + * + * @var string A string formated as PHP DateTime modifier + * @see https://www.php.net/manual/de/datetime.modify.php + */ +$config['abmeldung_job_deadline_date_modifier'] = '+3 weeks'; + + + +/** + * System User - uid of a user that is allowed to set prestudentstatus + * TODO(chris): DEBUG! CHANGE THIS! + * + * @var string + */ +$config['antrag_job_systemuser'] = 'ma0168'; + + +/** + * WHITELISTS + */ + +/** + * List of stati who entitle a prestudent to create an Antrag + * + * @var array Array of tbl_status.status_kurzbz's + */ +$config['antrag_prestudentstatus_whitelist'] = ['Student', 'Diplomand']; + + +/** + * BLACKLISTS + */ + +/** + * List of Statusgründe that prevent a prestudent from create an Wiederholungsantrag + * + * @var array An array of tbl_status_grund.statusgrund_id's + */ +$config['status_gruende_wiederholer'] = [16, 15]; + +/** + * Blacklisted for abmeldung anträge + * + * @var array An array of tbl_studiengang.studiengang_kz's + */ +$config['stgkz_blacklist_abmeldung'] = []; + +/** + * Blacklisted for unterbrechung anträge + * + * @var array An array of tbl_studiengang.studiengang_kz's + */ +$config['stgkz_blacklist_unterbrechung'] = []; + +/** + * Blacklisted for wiederholung anträge + * + * @var array An array of tbl_studiengang.studiengang_kz's + */ +$config['stgkz_blacklist_wiederholung'] = []; diff --git a/application/controllers/components/Antrag/Abmeldung.php b/application/controllers/components/Antrag/Abmeldung.php new file mode 100644 index 000000000..9130c1d7d --- /dev/null +++ b/application/controllers/components/Antrag/Abmeldung.php @@ -0,0 +1,201 @@ +load->library('AuthLib'); + $this->load->library('AntragLib'); + + // Load language phrases + $this->loadPhrases([ + 'studierendenantrag' + ]); + } + + //------------------------------------------------------------------------------------------------------------------ + // Public methods + + /** + * Retrieves data of the current studiengang for the current user + */ + + public function getDetailsForNewAntrag($prestudent_id) + { + if (!$this->antraglib->isEntitledToCreateAntragFor($prestudent_id, true)) { + $this->output->set_status_header(403); + return $this->outputJsonError('Forbidden'); + } + $result = $this->antraglib->getPrestudentAbmeldeBerechtigt($prestudent_id); + if (isError($result)) { + $this->output->set_status_header(500); + return $this->outputJsonError(getError($result)); + } + $result = $result->retval; + if (!$result) { + $this->output->set_status_header(403); + return $this->outputJsonError($this->p->t('studierendenantrag', 'error_no_student')); + } + elseif ($result == -3) + { + $this->output->set_status_header(403); + return $this->outputJsonError($this->p->t('studierendenantrag', 'error_stg_blacklist')); + } + elseif ($result == -1) + { + $result = $this->antraglib->getDetailsForLastAntrag($prestudent_id, Studierendenantrag_model::TYP_ABMELDUNG); + if (isError($result)) { + return $this->outputJsonError(getError($result)); + } + + $data = getData($result); + $data->canCancel = (boolean)$this->antraglib->isEntitledToCancelAntrag($data->studierendenantrag_id); + + return $this->outputJsonSuccess($data); + } + + $result = $this->antraglib->getDetailsForNewAntrag($prestudent_id); + if (isError($result)) { + return $this->outputJsonError(getError($result)); + } + + $this->outputJsonSuccess(getData($result)); + } + + public function createAntrag() + { + $this->load->library('form_validation'); + + $_POST = json_decode($this->input->raw_input_stream, true); + + $this->form_validation->set_rules('studiensemester', 'Studiensemester', 'required'); + $this->form_validation->set_rules('prestudent_id', 'Prestudent ID', 'required'); + $this->form_validation->set_rules('grund', 'Grund', 'required'); + + if ($this->form_validation->run() == false) + { + return $this->outputJsonError($this->form_validation->error_array()); + } + + $grund = $this->input->post('grund'); + $studiensemester = $this->input->post('studiensemester'); + $prestudent_id = $this->input->post('prestudent_id'); + + $result = $this->antraglib->getPrestudentAbmeldeBerechtigt($prestudent_id); + if (isError($result)) { + return $this->outputJsonError(['db' => getError($result)]); + } + $result = $result->retval; + if (!$result) + { + return $this->outputJsonError(['db' => $this->p->t('studierendenantrag', 'error_no_student')]); + } + elseif ($result == -3) + { + return $this->outputJsonError(['db' => $this->p->t('studierendenantrag', 'error_stg_blacklist')]); + } + elseif ($result < 0) + { + return $this->outputJsonError(['db' => $this->p->t('studierendenantrag', 'error_antrag_exists')]); + } + + $result = $this->antraglib->createAbmeldung($prestudent_id, $studiensemester, getAuthUID(), $grund); + if (isError($result)) + { + return $this->outputJsonError(['db' => getError($result)]); + } + + $result = $this->antraglib->getDetailsForAntrag(getData($result)); + if (!hasData($result)) + return $this->outputJsonSuccess(true); + + $data = getData($result); + $data->canCancel = (boolean)$this->antraglib->isEntitledToCancelAntrag($data->studierendenantrag_id); + + $this->outputJsonSuccess($data); + } + + public function cancelAntrag() + { + $this->load->library('form_validation'); + + $_POST = json_decode($this->input->raw_input_stream, true); + + $this->form_validation->set_rules('antrag_id', 'Antrag ID', 'required'); + + if ($this->form_validation->run() == false) + { + return $this->outputJsonError($this->form_validation->error_array()); + } + + $antrag_id = $this->input->post('antrag_id'); + if(!$this->antraglib->isEntitledToCancelAntrag($antrag_id)) + { + $this->output->set_status_header(403); + + return $this->outputJsonError('Forbidden'); + } + + $result = $this->antraglib->cancelAntrag($antrag_id, getAuthUID()); + if(isError($result)) + { + return $this->outputJsonError(['db' => getError($result)]); + } + + $result = $this->antraglib->getDetailsForAntrag($antrag_id); + + if (!hasData($result)) + return $this->outputJsonSuccess($antrag_id); + $this->outputJsonSuccess(getData($result)); + } + + public function getStudiengaengeAssistenz() + { + $this->load->library('PermissionLib'); + + $studiengaenge = $this->permissionlib->getSTG_isEntitledFor('student/studierendenantrag'); + + $result = $this->antraglib->getAbmeldeBerechtigtForStg($studiengaenge); + if (isError($result)) { + return $this->outputJsonError(getError($result)); + } + $result = getData($result); + if (!$result) { + return $this->outputJsonSuccess([]); + } + + $sortedStudents = []; + foreach ($result as $item) { + if (!isset($sortedStudents[$item->studiengang_kz])) + $sortedStudents[$item->studiengang_kz] = [ + 'bezeichnung' => $item->bezeichnung, + 'orgform' => $item->orgform, + 'studenten' => [] + ]; + $sortedStudents[$item->studiengang_kz]['studenten'][] = [ + 'semester' => $item->semester, + 'prestudent_id' => $item->prestudent_id, + 'name' => trim($item->vorname . ' ' . $item->nachname), + 'vorname' => $item->vorname, + 'nachname' => $item->nachname, + 'studiensemester_kurzbz' => $item->studiensemester_kurzbz + ]; + } + + $this->outputJsonSuccess($sortedStudents); + } +} diff --git a/application/controllers/components/Antrag/Leitung.php b/application/controllers/components/Antrag/Leitung.php new file mode 100644 index 000000000..90a677c31 --- /dev/null +++ b/application/controllers/components/Antrag/Leitung.php @@ -0,0 +1,358 @@ +load->library('AuthLib'); + $this->load->library('AntragLib'); + + // Load language phrases + $this->loadPhrases([ + 'studierendenantrag' + ]); + } + + + //------------------------------------------------------------------------------------------------------------------ + // Public methods + + public function getAntraege($studiengang = null) + { + + if($studiengang) + $studiengaenge = [$studiengang]; + else { + $studiengaenge =$this->permissionlib->getSTG_isEntitledFor('student/antragfreigabe'); + if(!is_array($studiengaenge)) + $studiengaenge = []; + + + $stgsNeuanlage = $this->permissionlib->getSTG_isEntitledFor('student/studierendenantrag'); + if(!is_array($stgsNeuanlage)) + $stgsNeuanlage = []; + + $studiengaenge = array_unique(array_merge($studiengaenge, $stgsNeuanlage)); + } + + + $antraege = []; + if ($studiengaenge) { + $result = $this->StudierendenantragModel->loadForStudiengaenge($studiengaenge); + if (isError($result)) { + $this->output->set_status_header(500); + return $this->outputJson('Internal Server Error'); + } + $antraege = getData($result); + } + + $this->outputJson($antraege); + } + + public function reopenAntrag() + { + $this->load->library('form_validation'); + + $_POST = json_decode($this->input->raw_input_stream, true); + + $this->form_validation->set_rules( + 'studierendenantrag_id', + 'Studierenden Antrag', + 'required|callback_isEntitledToReopenAntrag', + [ + 'isEntitledToReopenAntrag' => $this->p->t('studierendenantrag','error_no_right') + ] + ); + + if ($this->form_validation->run() == false) + { + return $this->outputJsonError($this->form_validation->error_array()); + } + + $studierendenantrag_id = $this->input->post('studierendenantrag_id'); + + $result = $this->antraglib->reopenWiederholung($studierendenantrag_id, getAuthUID()); + + if (isError($result)) + return $this->outputJsonError(['studierendenantrag_id' => getError($result)]); + + $this->outputJsonSuccess($studierendenantrag_id); + } + + public function objectAntrag() + { + $this->load->library('form_validation'); + + $_POST = json_decode($this->input->raw_input_stream, true); + + $this->form_validation->set_rules( + 'studierendenantrag_id', + 'Studierenden Antrag', + 'required|callback_isEntitledToObjectAntrag|callback_canBeObjected', + [ + 'isEntitledToObjectAntrag' => $this->p->t('studierendenantrag','error_no_right'), + 'canBeObjected' => $this->p->t('studierendenantrag','error_no_objection') + ] + ); + + if ($this->form_validation->run() == false) + { + return $this->outputJsonError($this->form_validation->error_array()); + } + + $studierendenantrag_id = $this->input->post('studierendenantrag_id'); + + $result = $this->antraglib->objectAbmeldung($studierendenantrag_id, getAuthUID()); + + if (isError($result)) + return $this->outputJsonError(['studierendenantrag_id' => getError($result)]); + + $this->outputJsonSuccess($studierendenantrag_id); + } + + public function objectionDeny() + { + $this->load->library('form_validation'); + + $_POST = json_decode($this->input->raw_input_stream, true); + + $this->form_validation->set_rules( + 'studierendenantrag_id', + 'Studierenden Antrag', + 'required|callback_isEntitledToObjectAntrag|callback_isObjected', + [ + 'isEntitledToObjectAntrag' => $this->p->t('studierendenantrag','error_no_right'), + 'isObjected' => $this->p->t('studierendenantrag','error_not_objected') + ] + ); + + if ($this->form_validation->run() == false) + { + return $this->outputJsonError($this->form_validation->error_array()); + } + + $studierendenantrag_id = $this->input->post('studierendenantrag_id'); + + $result = $this->antraglib->approveAbmeldung([$studierendenantrag_id], getAuthUID()); + + if (isError($result)) + return $this->outputJsonError(['studierendenantrag_id' => getError($result)]); + + $this->outputJsonSuccess($studierendenantrag_id); + } + + public function objectionApprove() + { + $this->load->library('form_validation'); + + $_POST = json_decode($this->input->raw_input_stream, true); + + $this->form_validation->set_rules( + 'studierendenantrag_id', + 'Studierenden Antrag', + 'required|callback_isEntitledToObjectAntrag|callback_isObjected', + [ + 'isEntitledToObjectAntrag' => $this->p->t('studierendenantrag','error_no_right'), + 'isObjected' => $this->p->t('studierendenantrag','error_not_objected') + ] + ); + + if ($this->form_validation->run() == false) + { + return $this->outputJsonError($this->form_validation->error_array()); + } + + $studierendenantrag_id = $this->input->post('studierendenantrag_id'); + + $result = $this->antraglib->cancelAntrag($studierendenantrag_id, getAuthUID()); + + if (isError($result)) + return $this->outputJsonError(['studierendenantrag_id' => getError($result)]); + + $this->outputJsonSuccess($studierendenantrag_id); + } + + public function isEntitledToReopenAntrag($studierendenantrag_id) + { + return $this->antraglib->isEntitledToReopenAntrag($studierendenantrag_id); + } + + public function isEntitledToObjectAntrag($studierendenantrag_id) + { + return $this->antraglib->isEntitledToObjectAntrag($studierendenantrag_id); + } + + public function isEntitledToRejectAntrag($studierendenantrag_id) + { + return $this->antraglib->isEntitledToRejectAntrag($studierendenantrag_id); + } + + public function canBeObjected($studierendenantrag_id) + { + return $this->antraglib->hasStatus($studierendenantrag_id, Studierendenantragstatus_model::STATUS_APPROVED_STGL); + } + + public function isObjected($studierendenantrag_id) + { + return $this->antraglib->hasStatus($studierendenantrag_id, Studierendenantragstatus_model::STATUS_OBJECTED); + } + + + public function approveAbmeldung() + { + $this->load->library('form_validation'); + + $_POST = json_decode($this->input->raw_input_stream, true); + + $this->form_validation->set_rules( + 'studierendenantrag_id', + 'Studierenden Antrag', + 'required|callback_isEntitledToApproveAntrag', + [ + 'isEntitledToApproveAntrag' => $this->p->t('studierendenantrag','error_no_right') + ] + ); + + if ($this->form_validation->run() == false) + { + return $this->outputJsonError($this->form_validation->error_array()); + } + + $studierendenantrag_id = $this->input->post('studierendenantrag_id'); + + $result = $this->antraglib->approveAbmeldung([$studierendenantrag_id], getAuthUID()); + if (isError($result)) + { + return $this->outputJsonError(['db' => getError($result)]); + } + + return $this->outputJsonSuccess($studierendenantrag_id); + } + + public function approveUnterbrechung() + { + $this->load->library('form_validation'); + + $_POST = json_decode($this->input->raw_input_stream, true); + + $this->form_validation->set_rules( + 'studierendenantrag_id', + 'Studierenden Antrag', + 'required|callback_isEntitledToApproveAntrag', + [ + 'isEntitledToApproveAntrag' => $this->p->t('studierendenantrag','error_no_right') + ] + ); + + if ($this->form_validation->run() == false) + { + return $this->outputJsonError($this->form_validation->error_array()); + } + + $studierendenantrag_id = $this->input->post('studierendenantrag_id'); + + $result = $this->antraglib->approveUnterbrechung([$studierendenantrag_id], getAuthUID()); + if (isError($result)) + { + return $this->outputJsonError(['db' => getError($result)]); + } + + return $this->outputJsonSuccess($studierendenantrag_id); + } + + public function rejectUnterbrechung() + { + $this->load->library('form_validation'); + + $_POST = json_decode($this->input->raw_input_stream, true); + + $this->form_validation->set_rules( + 'studierendenantrag_id', + 'Studierenden Antrag', + 'required|callback_isEntitledToRejectAntrag', + [ + 'isEntitledToRejectAntrag' => $this->p->t('studierendenantrag','error_no_right') + ] + ); + $this->form_validation->set_rules('grund', 'Grund', 'required'); + + if ($this->form_validation->run() == false) + { + return $this->outputJsonError($this->form_validation->error_array()); + } + + $studierendenantrag_id = $this->input->post('studierendenantrag_id'); + $grund = $this->input->post('grund'); + + $result = $this->antraglib->rejectUnterbrechung([$studierendenantrag_id], getAuthUID(), $grund); + if (isError($result)) + { + return $this->outputJsonError(['db' => getError($result)]); + } + + return $this->outputJsonSuccess($studierendenantrag_id); + } + + public function approveWiederholung() + { + $this->load->library('form_validation'); + + $_POST = json_decode($this->input->raw_input_stream, true); + + $this->form_validation->set_rules( + 'studierendenantrag_id', + 'Studierenden Antrag', + 'required|callback_isEntitledToApproveAntrag', + [ + 'isEntitledToApproveAntrag' => $this->p->t('studierendenantrag','error_no_right') + ] + ); + + if ($this->form_validation->run() == false) + { + return $this->outputJsonError($this->form_validation->error_array()); + } + + $studierendenantrag_id = $this->input->post('studierendenantrag_id'); + + $result = $this->antraglib->approveWiederholung($studierendenantrag_id, getAuthUID()); + if (isError($result)) + { + return $this->outputJsonError(['db' => getError($result)]); + } + + return $this->outputJsonSuccess($studierendenantrag_id); + } + + public function isEntitledToApproveAntrag($studierendenantrag_id) + { + return $this->antraglib->isEntitledToApproveAntrag($studierendenantrag_id); + } + + public function getHistory($studierendenantrag_id) + { + if (!$this->antraglib->isEntitledToSeeHistoryForAntrag($studierendenantrag_id)) { + $this->output->set_status_header(403); + return $this->outputJson('Forbidden'); + } + + $result = $this->antraglib->getAntragHistory($studierendenantrag_id); + if (isError($result)) { + return $this->outputJsonError(getError($result)); + } + + $this->outputJsonSuccess(getData($result) ?: []); + } +} diff --git a/application/controllers/components/Antrag/Unterbrechung.php b/application/controllers/components/Antrag/Unterbrechung.php new file mode 100644 index 000000000..78594fa65 --- /dev/null +++ b/application/controllers/components/Antrag/Unterbrechung.php @@ -0,0 +1,230 @@ +load->config('studierendenantrag'); + + // Libraries + $this->load->library('AuthLib'); + $this->load->library('AntragLib'); + + // Load language phrases + $this->loadPhrases([ + 'studierendenantrag' + ]); + } + + + //------------------------------------------------------------------------------------------------------------------ + // Public methods + + public function getDetailsForNewAntrag($prestudent_id) + { + if (!$this->antraglib->isEntitledToCreateAntragFor($prestudent_id, false)) { + $this->output->set_status_header(403); + return $this->outputJsonError('Forbidden'); + } + $result = $this->antraglib->getPrestudentUnterbrechungsBerechtigt($prestudent_id); + if (isError($result)) { + $this->output->set_status_header(500); + return $this->outputJsonError(getError($result)); + } + $result = $result->retval; + if (!$result) { + $this->output->set_status_header(403); + return $this->outputJsonError($this->p->t('studierendenantrag', 'error_no_student')); + } + elseif ($result == -1) + { + $result = $this->antraglib->getDetailsForLastAntrag($prestudent_id, Studierendenantrag_model::TYP_UNTERBRECHUNG); + if (isError($result)) { + return $this->outputJsonError(getError($result)); + } + + return $this->outputJsonSuccess(getData($result)); + } + elseif ($result == -2) + { + $result = $this->antraglib->getDetailsForLastAntrag($prestudent_id); + if (isError($result)) { + return $this->outputJsonError(getError($result)); + } + + $result = getData($result); + $this->output->set_status_header(400); + return $this->outputJsonError($this->p->t('studierendenantrag', 'error_antrag_pending', ['typ' => $this->p->t('studierendenantrag','antrag_typ_' . $result->typ)])); + } + elseif ($result == -3) + { + $this->output->set_status_header(403); + return $this->outputJsonError($this->p->t('studierendenantrag', 'error_stg_blacklist')); + } + $result = $this->antraglib->getDetailsForNewAntrag($prestudent_id); + if (isError($result)) { + return $this->outputJsonError(getError($result)); + } + + $data = getData($result); + + $data->studiensemester = $this->antraglib->getSemesterForUnterbrechung($data->studiengang_kz, $data->studiensemester_kurzbz, $data->semester); + + $this->outputJsonSuccess($data); + } + + public function getDetailsForAntrag($studierendenantrag_id) + { + if (!$this->antraglib->isEntitledToShowAntrag($studierendenantrag_id)) return show_404(); + + $result = $this->antraglib->getDetailsForAntrag($studierendenantrag_id); + if (isError($result)) { + return $this->outputJsonError(getError($result)); + } + + $data = getData($result); + + if ($data->typ !== Studierendenantrag_model::TYP_UNTERBRECHUNG) + return show_404(); + + $this->outputJsonSuccess($data); + } + + public function createAntrag() + { + $this->load->library('form_validation'); + + $this->form_validation->set_rules('studiensemester', 'Studiensemester', 'required'); + $this->form_validation->set_rules('prestudent_id', 'Prestudent ID', 'required'); + $this->form_validation->set_rules('grund', 'Grund', 'required'); + $this->form_validation->set_rules( + 'datum_wiedereinstieg', + 'Datum Wiedereinstieg', + 'required|callback_isValidDate|callback_isDateInFuture', + [ + 'isValidDate' => $this->p->t('ui', 'error_invalid_date'), + 'isDateInFuture' => $this->p->t('ui', 'error_invalid_date') + ] + ); + + if ($this->form_validation->run() == false) + { + return $this->outputJsonError($this->form_validation->error_array()); + } + + $grund = $this->input->post('grund'); + $studiensemester = $this->input->post('studiensemester'); + $prestudent_id = $this->input->post('prestudent_id'); + $datum_wiedereinstieg = $this->input->post('datum_wiedereinstieg'); + $dms_id = null; + + $result = $this->antraglib->getPrestudentUnterbrechungsBerechtigt($prestudent_id); + if (isError($result)) { + return $this->outputJsonError(['db' => getError($result)]); + } + $result = $result->retval; + if (!$result) + { + return $this->outputJsonError(['db' => $this->p->t('studierendenantrag', 'error_no_student')]); + } + elseif ($result == -3) + { + return $this->outputJsonError(['db' => $this->p->t('studierendenantrag', 'error_stg_blacklist')]); + } + elseif ($result < 0) + { + return $this->outputJsonError(['db' => $this->p->t('studierendenantrag', 'error_antrag_exists')]); + } + + if(isset($_FILES['attachment']) && (!isset($_FILES['attachment']['error']) || $_FILES['attachment']['error'] != UPLOAD_ERR_NO_FILE)) + { + $this->load->library('DmsLib'); + + $dms = $this->config->item('unterbrechung_dms'); + if (!count(array_filter($dms, function ($v) { + return $v !== null; + }))) + $dms = ['kategorie_kurzbz' => 'Akte']; + $dms['version'] = 0; + + $allowed_filetypes = $this->config->item('unterbrechung_dms_filetypes') ?: ['*']; + $result = $this->dmslib->upload($dms, 'attachment', $allowed_filetypes); + if(isError($result)) + { + return $this->outputJsonError(['db' => getError($result)]); + } + $dms_id = getData($result)['dms_id']; + } + + $result = $this->antraglib->createUnterbrechung($prestudent_id, $studiensemester, getAuthUID(), $grund, $datum_wiedereinstieg, $dms_id); + if(isError($result)) + { + return $this->outputJsonError(['db' => getError($result)]); + } + + $antragId = getData($result); + $result = $this->antraglib->getDetailsForAntrag($antragId); + + if(!hasData($result)) + return $this->outputJsonSuccess($antragId); + $this->outputJsonSuccess(getData($result)); + } + + public function cancelAntrag() + { + $this->load->library('form_validation'); + + $_POST = json_decode($this->input->raw_input_stream, true); + + $this->form_validation->set_rules('antrag_id', 'Antrag ID', 'required'); + + if ($this->form_validation->run() == false) + { + return $this->outputJsonError($this->form_validation->error_array()); + } + + $antrag_id = $this->input->post('antrag_id'); + + $result = $this->antraglib->cancelAntrag($antrag_id, getAuthUID()); + if (isError($result)) + { + return $this->outputJsonError(['db' => getError($result)]); + } + + $result = $this->antraglib->getDetailsForAntrag($antrag_id); + + if (!hasData($result)) + return $this->outputJsonSuccess($antrag_id); + $this->outputJsonSuccess(getData($result)); + } + + public function isValidDate($date) + { + try { + new DateTime($date); + } catch (Exception $e) { + return false; + } + return true; + } + + public function isDateInFuture($date) + { + return new DateTime() < new DateTime($date); + } +} diff --git a/application/controllers/components/Antrag/Wiederholung.php b/application/controllers/components/Antrag/Wiederholung.php new file mode 100644 index 000000000..7b5d8f887 --- /dev/null +++ b/application/controllers/components/Antrag/Wiederholung.php @@ -0,0 +1,369 @@ +load->config('studierendenantrag'); + + // Libraries + $this->load->library('AuthLib'); + $this->load->library('PermissionLib'); + $this->load->library('AntragLib'); + + $requiredPermissions = [ + 'saveLvs' => ['student/studierendenantrag:w'], + 'getLvsAsRdf' => ['student/studierendenantrag:r', 'student/noten:r'], + 'moveLvsToZeugnis' => ['student/studierendenantrag:w', 'student/noten:w'] + ]; + + if (isset($requiredPermissions[$this->router->method])) { + if (!$this->permissionlib->isEntitled($requiredPermissions, $this->router->method)) { + $this->output->set_status_header(REST_Controller::HTTP_FORBIDDEN); + $this->outputJson('Forbidden'); + exit; + } + } + + // Load language phrases + $this->loadPhrases([ + 'studierendenantrag' + ]); + } + + + //------------------------------------------------------------------------------------------------------------------ + // Public methods + + /** + * Retrieves data of the current studiengang for the current user + */ + + public function getDetailsForNewAntrag($prestudent_id) + { + if (!$this->antraglib->isEntitledToCreateAntragFor($prestudent_id, false)) { + $this->output->set_status_header(REST_Controller::HTTP_FORBIDDEN); + return $this->outputJsonError('Forbidden'); + } + $result = $this->antraglib->getPrestudentWiederholungsBerechtigt($prestudent_id); + if (isError($result)) { + $this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR); + return $this->outputJsonError(getError($result)); + } + $result = $result->retval; + if (!$result) { + // TODO(chris): ERROR Message + $this->output->set_status_header(REST_Controller::HTTP_FORBIDDEN); + return $this->outputJsonError($this->p->t('studierendenantrag','error_no_student_no_failed_exam')); + } + elseif ($result == -1) + { + $result = $this->antraglib->getDetailsForLastAntrag($prestudent_id, Studierendenantrag_model::TYP_WIEDERHOLUNG); + if (isError($result)) { + return $this->outputJsonError(getError($result)); + } + + $data = getData($result); + + $result = $this->antraglib->getFailedExamForPrestudent($prestudent_id); + // NOTE(chris): error handling for this function should already happenden in antraglib->getPrestudentWiederholungsBerechtigt() + $pruefungsdata = current(getData($result)); + + $data->studiensemester_kurzbz = $pruefungsdata->studiensemester_kurzbz; + $data->lvbezeichnung = $pruefungsdata->lvbezeichnung; + $data->pruefungsdatum = $pruefungsdata->datum; + + return $this->outputJsonSuccess($data); + } + elseif ($result == -2) + { + $result = $this->antraglib->getDetailsForLastAntrag($prestudent_id); + if (isError($result)) { + return $this->outputJsonError(getError($result)); + } + + $result = getData($result); + $this->output->set_status_header(REST_Controller::HTTP_BAD_REQUEST); + return $this->outputJsonError($this->p->t('studierendenantrag', 'error_antrag_pending', ['typ' => $this->p->t('studierendenantrag','antrag_typ_' . $result->typ)])); + } + elseif ($result == -3) + { + $this->output->set_status_header(REST_Controller::HTTP_BAD_REQUEST); + return $this->outputJsonError($this->p->t('studierendenantrag', 'error_stg_blacklist')); + } + + $result = $this->antraglib->getDetailsForNewAntrag($prestudent_id); + if (isError($result)) { + return $this->outputJsonError(getError($result)); + } + + $data = getData($result); + + $result = $this->antraglib->getFailedExamForPrestudent($prestudent_id); + // NOTE(chris): error handling for this function should already happenden in antraglib->getPrestudentWiederholungsBerechtigt() + $pruefungsdata = current(getData($result)); + + $data->studiensemester_kurzbz = $pruefungsdata->studiensemester_kurzbz; + $data->lvbezeichnung = $pruefungsdata->lvbezeichnung; + $data->pruefungsdatum = $pruefungsdata->datum; + + $this->outputJsonSuccess($data); + } + + public function createAntrag() + { + $this->createAntragWithStatus(true); + } + + public function cancelAntrag() + { + $this->createAntragWithStatus(false); + } + + protected function createAntragWithStatus($repeat) + { + $this->load->library('form_validation'); + + $_POST = json_decode($this->input->raw_input_stream, true); + + $this->form_validation->set_rules('prestudent_id', 'Prestudent ID', 'required'); + $this->form_validation->set_rules('studiensemester', 'Studiensemester', 'required'); + + if ($this->form_validation->run() == false) + { + return $this->outputJsonError($this->form_validation->error_array()); + } + + $prestudent_id = $this->input->post('prestudent_id'); + $studiensemester = $this->input->post('studiensemester'); + + $result = $this->antraglib->getPrestudentWiederholungsBerechtigt($prestudent_id); + if (isError($result)) { + return $this->outputJsonError(['db' => getError($result)]); + } + $result = $result->retval; + if (!$result) + { + // TODO(chris): ERROR Message + return $this->outputJsonError(['db' => $this->p->t('studierendenantrag', 'error_no_student')]); + } + elseif ($result == -2) + { + return $this->outputJsonError(['db' => $this->p->t('studierendenantrag', 'error_antrag_exists')]); + } + elseif ($result == -3) + { + return $this->outputJsonError(['db' => $this->p->t('studierendenantrag', 'error_stg_blacklist')]); + } + + $result = $this->antraglib->createWiederholung($prestudent_id, $studiensemester, getAuthUID(), $repeat); + if(isError($result)) + { + return $this->outputJsonError(['db' => getError($result)]); + } + + $antragId = getData($result); + $result = $this->antraglib->getDetailsForAntrag($antragId); + + if(!hasData($result)) + return $this->outputJsonSuccess(true); + + $data = getData($result); + + $result = $this->antraglib->getFailedExamForPrestudent($prestudent_id); + // NOTE(chris): error handling for this function should already happenden in antraglib->getPrestudentWiederholungsBerechtigt() + $pruefungsdata = current(getData($result)); + + $data->studiensemester_kurzbz = $pruefungsdata->studiensemester_kurzbz; + $data->lvbezeichnung = $pruefungsdata->lvbezeichnung; + $data->pruefungsdatum = $pruefungsdata->datum; + + $this->outputJsonSuccess($data); + } + + + public function getLvs($antrag_id) + { + $result = $this->antraglib->getLvsForAntrag($antrag_id); + if (isError($result)) { + $error = getError($result); + if ($error == 'Forbidden') + $this->output->set_status_header(REST_Controller::HTTP_FORBIDDEN); + return $this->outputJsonError(getError($result)); + } + $lvs = getData($result); + + $this->outputJsonSuccess($lvs); + } + + public function saveLvs() + { + $result = $this->getPostJSON(); + $antragsLvs = array_merge($result->forbiddenLvs, $result->mandatoryLvs); + + $insert = array_map(function ($lv) { + return [ + 'studierendenantrag_id' => $lv->studierendenantrag_id, + 'lehrveranstaltung_id' => $lv->lehrveranstaltung_id, + 'note' => $lv->zugelassen ? ($lv->zugelassen == 1 ? 0 : $this->config->item('wiederholung_note_angerechnet')) : $this->config->item('wiederholung_note_nicht_zugelassen'), + 'anmerkung' => $lv->anmerkung, + 'insertvon' => getAuthUID(), + 'studiensemester_kurzbz' => $lv->studiensemester_kurzbz + ]; + }, $antragsLvs); + + $antrag_ids = array_unique(array_map(function ($lv) { + return $lv['studierendenantrag_id']; + }, $insert)); + + foreach ($antrag_ids as $antrag_id) { + $result = $this->StudierendenantragModel->loadIdAndStatusWhere([ + 'studierendenantrag_id' => $antrag_id + ]); + if (isError($result)) + return $this->outputJsonError(getError($result)); + if (!hasData($result)) + return $this->outputJsonError($this->p->t('studierendenantrag', 'error_no_antrag_found', ['id' => $antrag_id])); + $antrag = current(getData($result)); + if ($antrag->status != Studierendenantragstatus_model::STATUS_CREATED && $antrag->status != Studierendenantragstatus_model::STATUS_LVSASSIGNED) + return $this->outputJsonError($this->p->t('studierendenantrag', 'error_antrag_locked')); + } + + if(!$antragsLvs) + return $this->outputJsonError($this->p->t('studierendenantrag', 'error_no_lv')); + + $result = $this->antraglib->saveLvs($insert); + + if (isError($result)) + return $this->outputJsonError(getError($result)); + + $this->outputJsonSuccess(getData($result)); + } + + public function getLvsAsRdf($prestudent_id) + { + // header für no cache + $this->output->set_header("Cache-Control: no-cache"); + $this->output->set_header("Cache-Control: post-check=0, pre-check=0", false); + $this->output->set_header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); + $this->output->set_header("Pragma: no-cache"); + $this->output->set_header("Content-type: application/xhtml+xml"); + + $this->load->library('VariableLib', ['uid' => getAuthUID()]); + $sem_akt = $this->variablelib->getVar('semester_aktuell'); + + + $result = $this->antraglib->getLvsForPrestudent($prestudent_id, $sem_akt); + if (isError($result)) { + return $this->outputJsonError(getError($result)); + } + + $lvs = getData($result) ?: []; + $rdf_url = 'http://www.technikum-wien.at/antragnote'; + + $this->load->view('lehre/Antrag/Wiederholung/getLvs.rdf.php', [ + 'url' => $rdf_url, + 'lvs' => $lvs + ]); + } + + public function moveLvsToZeugnis() + { + $anzahl = $this->input->post('anzahl'); + $student_uid = $this->input->post('student_uid'); + $this->load->model('education/Studierendenantraglehrveranstaltung_model', 'StudierendenantraglehrveranstaltungModel'); + $this->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel'); + + $errormsg = array(); + + for($i=0; $i<$anzahl; $i++) + { + $id = $this->input->post('studierendenantrag_lehrveranstaltung_id_' . $i); + $result =$this->StudierendenantraglehrveranstaltungModel->load($id); + if(isError($result)) + { + $errormsg[] = getError($result); + } + elseif(!hasData($result)) + { + $errormsg[] = $this->p->t('studierendenantrag', 'error_no_lv_in_application'); + } + else + { + $antragLv = getData($result)[0]; + $result= $this->ZeugnisnoteModel->load([ + 'lehrveranstaltung_id'=> $antragLv->lehrveranstaltung_id, + 'student_uid'=> $student_uid, + 'studiensemester_kurzbz' => $antragLv->studiensemester_kurzbz + ]); + if(isError($result)) + { + $errormsg[] = getError($result); + } + else + { + if (hasData($result)) + { + $result = $this->ZeugnisnoteModel->update( + [ + 'lehrveranstaltung_id'=> $antragLv->lehrveranstaltung_id, + 'student_uid'=> $student_uid, + 'studiensemester_kurzbz' => $antragLv->studiensemester_kurzbz + ], + [ + 'note'=> $antragLv->note, + 'uebernahmedatum' => date('c'), + 'benotungsdatum' => $antragLv->insertamum, + 'updateamum' => date('c'), + 'bemerkung'=>$antragLv->anmerkung, + 'updatevon'=>getAuthUID() + ] + ); + } + else + { + $result = $this->ZeugnisnoteModel->insert([ + 'lehrveranstaltung_id'=> $antragLv->lehrveranstaltung_id, + 'student_uid'=> $student_uid, + 'studiensemester_kurzbz' => $antragLv->studiensemester_kurzbz, + 'note'=> $antragLv->note, + 'uebernahmedatum' => date('c'), + 'benotungsdatum' => $antragLv->insertamum, + 'insertamum' => date('c'), + 'bemerkung'=>$antragLv->anmerkung, + 'insertvon'=>getAuthUID() + ]); + } + if(isError($result)) + { + $errormsg[] = getError($result); + } + } + } + } + + if($errormsg) + $return = false; + else + $return = true; + + $this->load->view('lehre/Antrag/Wiederholung/moveLvs.rdf.php', [ + 'return' => $return, + 'errormsg' => $errormsg + ]); + } +} diff --git a/application/controllers/components/Phrasen.php b/application/controllers/components/Phrasen.php new file mode 100644 index 000000000..52de719f7 --- /dev/null +++ b/application/controllers/components/Phrasen.php @@ -0,0 +1,23 @@ +load->library('PhrasesLib', [$module], 'pj'); + $this->outputJsonSuccess(json_decode($this->pj->getJSON())); + } + +} diff --git a/application/controllers/jobs/AntragJob.php b/application/controllers/jobs/AntragJob.php new file mode 100644 index 000000000..6b5b018e6 --- /dev/null +++ b/application/controllers/jobs/AntragJob.php @@ -0,0 +1,406 @@ +load->config('studierendenantrag'); + + // Loads SanchoHelper + $this->load->helper('hlp_sancho_helper'); + + //Load Model + $this->load->model('education/Studierendenantrag_model', 'StudierendenantragModel'); + $this->load->model('education/Studierendenantragstatus_model', 'StudierendenantragstatusModel'); + $this->load->model('education/Pruefung_model', 'PruefungModel'); + $this->load->model('person/Kontakt_model', 'KontaktModel'); + } + + /** + * Send reminder to Assistant for Wiedereinstieg Unterbrecher + * + */ + public function sendReminderWiedereinstieg() + { + $now = new DateTime(); + $modifier = $this->config->item('unterbrechung_job_remind_wiedereinstieg_date_modifier'); + if (!$modifier) + return $this->logError('Konnte Job nicht starten: Config "unterbrechung_job_remind_wiedereinstieg_date_modifiers" nicht gesetzt'); + + $end = new DateTime(); + $end->modify($modifier); + + $this->logInfo(sprintf( + 'Start Job sendReminderWiedereinstieg (Wiedereinstieg zwischen %s - %s)', + $now->format('Y-m-d'), + $end->format('Y-m-d') + )); + + $result = $this->StudierendenantragModel->getAntraegeWhereWiedereinstiegBetween($now, $end); + + if(isError($result)) + { + $this->logError(getError($result)); + $this->logInfo('Ende Job sendReminderWiedereinstieg'); + return; + } + + $antraege = getData($result) ?: []; + $count = 0; + foreach ($antraege as $antrag) + { + $datum = new DateTime($antrag->datum_wiedereinstieg); + $data = array( + 'prestudent' => $antrag->prestudent_id, + 'name' => trim($antrag->vorname . ' '. $antrag->nachname), + 'datum_wiedereinstieg' => $datum->format('d.m.Y') + ); + + if(sendSanchoMail('Sancho_Mail_Antrag_U_Reminder', $data, $antrag->email, 'Reminder: Unterbrechung Wiedereinstieg')) + { + $count++; + $this->StudierendenantragstatusModel->insert([ + 'studierendenantrag_id' => $antrag->studierendenantrag_id, + 'studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_REMINDERSENT, + 'insertvon' => 'AntragJob' + ]); + } + } + $this->logInfo($count . ' Reminder gesendet - Ende Job sendReminderWiedereinstieg'); + } + + /** + * Set Wiederholer after deadline to Abbrecher + * + */ + public function handleWiederholerDeadline() + { + $this->logInfo('Start Job handleWiederholerDeadline'); + + $this->load->library('PrestudentLib'); + + $insertvon = $this->config->item('antrag_job_systemuser'); + if (!$insertvon) { + $this->logError('Config "antrag_job_systemuser" nicht gesetzt'); + $this->logInfo('Ende Job handleWiederholerDeadline'); + return; + } + + $modifier_deadline = $this->config->item('wiederholung_job_deadline_date_modifier'); + if (!$modifier_deadline) { + $this->logError('Config "wiederholung_job_deadline_date_modifier" nicht gesetzt'); + $this->logInfo('Ende Job handleWiederholerDeadline'); + return; + } + + $dateDeadline = new DateTime(); + $dateDeadline->sub(DateInterval::createFromDateString($modifier_deadline)); + + $result = $this->PruefungModel->getAllPrestudentsWhereCommitteeExamFailed( + [ + null, + Studierendenantragstatus_model::STATUS_REQUESTSENT_1, + Studierendenantragstatus_model::STATUS_REQUESTSENT_2 + ], + $dateDeadline, + null + ); + + if(isError($result)) + { + $this->logError(getError($result)); + } + else + { + $prestudents = getData($result) ?: []; + $count = 0; + + $prestudents = $this->prestudentsGetUnique($prestudents); + + foreach ($prestudents as $prestudent) + { + // TODO(chris): DEBUG REMOVE! + if ($prestudent->studiensemester_kurzbz == 'WS2021') + var_dump([$prestudent->prestudent_id, $prestudent->studiensemester_kurzbz, $prestudent->lvbezeichnung]); + $result = success(); + // TODO(chris): find out how to filter old/wrong datasets!!! + #$result = $this->prestudentlib->setAbbrecher($prestudent->prestudent_id, $prestudent->studiensemester_kurzbz, $insertvon); + if (isError($result)) + $this->logError(getError($result)); + else + $count++; + } + $this->logInfo($count . " Students set to Abbrecher"); + } + + $this->logInfo('Ende Job handleWiederholerDeadline'); + + } + + /** + * Set Abmeldungen after deadline to Abbrecher + * + */ + public function handleAbmeldungenStglDeadline() + { + $this->logInfo('Start Job handleAbmeldungenStglDeadline'); + + $this->load->library('AntragLib'); + + $insertvon = $this->config->item('antrag_job_systemuser'); + if (!$insertvon) { + $this->logError('Config "antrag_job_systemuser" nicht gesetzt'); + $this->logInfo('Ende Job handleAbmeldungenStglDeadline'); + return; + } + + $modifier_deadline = $this->config->item('abmeldung_job_deadline_date_modifier'); + if (!$modifier_deadline) { + $this->logError('Config "abmeldung_job_deadline_date_modifier" nicht gesetzt'); + $this->logInfo('Ende Job handleAbmeldungenStglDeadline'); + return; + } + + $dateDeadline = new DateTime(); + $dateDeadline->sub(DateInterval::createFromDateString($modifier_deadline)); + + $result = $this->StudierendenantragModel->getWithLastStatusWhere( + [ + 'studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_APPROVED_STGL, + 's.insertamum <=' => $dateDeadline->format('c') + ] + ); + + if(isError($result)) + { + $this->logError(getError($result)); + } + else + { + $antraege = getData($result) ?: []; + $count = 0; + + foreach ($antraege as $antrag) + { + $result = $this->antraglib->approveAbmeldung([$antrag->studierendenantrag_id], $insertvon); + + if (isError($result)) + $this->logError(getError($result)); + else + $count++; + } + $this->logInfo($count . " Students set to Abbrecher"); + } + $this->logInfo('Ende Job handleAbmeldungenStglDeadline'); + } + + /** + * Send Request to Student do Decide between Wiederholung and Verzicht + * + */ + public function sendAufforderungWiederholer() + { + $this->logInfo('Start Job sendAufforderungWiederholer'); + + $modifier_request_1 = $this->config->item('wiederholung_job_request_1_date_modifier'); + $modifier_request_2 = $this->config->item('wiederholung_job_request_2_date_modifier'); + $modifier_deadline = $this->config->item('wiederholung_job_deadline_date_modifier'); + + if ($modifier_deadline) + { + $dateDeadline = new DateTime(); + $dateDeadline->sub(DateInterval::createFromDateString($modifier_deadline)); + } + else + $dateDeadline = null; + + //first request + if ($modifier_request_1) + $this->sendReminder( + 'Request1', + null, + Studierendenantragstatus_model::STATUS_REQUESTSENT_1, + $dateDeadline, + $modifier_request_1, + $modifier_deadline, + 'Aufforderung: Bekanntgabe Wiederholung' + ); + else + $this->logError('Config "wiederholung_job_request_1_date_modifier" nicht gesetzt'); + + //second request + if ($modifier_request_2) + $this->sendReminder( + 'Request2', + Studierendenantragstatus_model::STATUS_REQUESTSENT_1, + Studierendenantragstatus_model::STATUS_REQUESTSENT_2, + $dateDeadline, + $modifier_request_2, + $modifier_deadline, + 'Reminder Aufforderung: Bekanntgabe Wiederholung' + ); + else + $this->logError('Config "wiederholung_job_request_2_date_modifier" nicht gesetzt'); + + $this->logInfo('Ende Job sendAufforderungWiederholer'); + } + + protected function prestudentsGetUnique($prestudents) { + $result = []; + foreach ($prestudents as $prestudent) { + if (!isset($result[$prestudent->prestudent_id])) + $result[$prestudent->prestudent_id] = $prestudent; + else { + if ($result[$prestudent->prestudent_id]->datum > $prestudent->datum) + $result[$prestudent->prestudent_id] = $prestudent; + } + } + return $result; + } + + protected function sendReminder($name, $status_from, $status_to, $deadline, $date_modifier, $modifier_deadline, $subject) + { + $this->logInfo('Start Job sendAufforderungWiederholer ' . $name); + + $dateStichtag = new DateTime(); + $dateStichtag->sub(DateInterval::createFromDateString($date_modifier)); + + $result = $this->PruefungModel->getAllPrestudentsWhereCommitteeExamFailed($status_from, $dateStichtag, $deadline); + + if(isError($result)) + { + $this->logError(getError($result)); + } + else + { + $prestudents = getData($result) ?: []; + $count = 0; + + $prestudents = $this->prestudentsGetUnique($prestudents); + + foreach ($prestudents as $prestudent) + { + $stg_kz = $prestudent->studiengang_kz; + if (in_array($stg_kz, $this->config->item('stgkz_blacklist_wiederholung'))) + continue; + $url = site_url('lehre/Studierendenantrag/wiederholung/' . $prestudent->prestudent_id); + $email = $this->KontaktModel->getZustellKontakt($prestudent->person_id, ['email']); + if (isError($email)) { + $this->logError(getError($email)); + } else { + $email = getData($email); + + if (!$email) { + $this->logError('No email contact found for person_id: ' . $prestudent->person_id); + } + else + { + $email = current($email)->kontakt; + $fristende = new DateTime($prestudent->datum); + $fristende->add(DateInterval::createFromDateString($modifier_deadline)); + + $dataMail = array( + 'name'=> trim($prestudent->vorname . ' '. $prestudent->nachname), + 'pers_kz'=> $prestudent->matrikelnr, + 'studiengang' => $prestudent->bezeichnung, + 'lvbezeichnung' => $prestudent->lvbezeichnung, + 'datum_kp' => $prestudent->datum, + 'studiensemester'=> $prestudent->studiensemester_kurzbz, + 'orgform'=> $prestudent->orgform, + 'url' => $url, + 'fristablauf' => $fristende->format('d.m.Y') + ); + if(sendSanchoMail('Sancho_Mail_Antrag_W_' . $name, $dataMail, $email, $subject)) + { + $antrag_id = null; + $result = $this->StudierendenantragModel->loadWhere([ + 'prestudent_id' => $prestudent->prestudent_id, + 'typ' => Studierendenantrag_model::TYP_WIEDERHOLUNG + ]); + if (isError($result)) + $this->logError(getError($result)); + elseif (hasData($result)) + $antrag_id = current(getData($result) ?: []) -> studierendenantrag_id; + if ($antrag_id == null) + { + $result = $this->StudierendenantragModel->insert([ + 'prestudent_id' => $prestudent->prestudent_id, + 'studiensemester_kurzbz'=> $prestudent->studiensemester_kurzbz, + 'datum' => date('c'), + 'typ' => Studierendenantrag_model::TYP_WIEDERHOLUNG, + 'insertvon' => 'AntragJob' + ]); + if (isError($result)) + $this->logError(getError($result)); + else + $antrag_id = getData($result); + } + if ($antrag_id) + { + $result = $this->StudierendenantragstatusModel->insert([ + 'studierendenantrag_id' => $antrag_id, + 'studierendenantrag_statustyp_kurzbz' => $status_to, + 'insertvon' => 'AntragJob' + ]); + if (isError($result)) + $this->logError(getError($result)); + } + $count++; + } + } + } + } + $this->logInfo($count . " Mails '" . $subject . "' sent"); + } + $this->logInfo('Ende Job sendAufforderungWiederholer ' . $name); + } + + + + // TODO(chris): REMOVE DEBUG! + + /** + * Writes a cronjob info log + */ + protected function logInfo($response, $parameters = null) + { + echo $response . "\n"; + } + + /** + * Writes a cronjob debug log + */ + protected function logDebug($response, $parameters = null) + { + echo $response . "\n"; + } + + /** + * Writes a cronjob warning log + */ + protected function logWarning($response, $parameters = null) + { + echo $response . "\n"; + } + + /** + * Writes a cronjob error log + */ + protected function logError($response, $parameters = null) + { + echo $response . "\n"; + } + + +} diff --git a/application/controllers/lehre/Antrag/Attachment.php b/application/controllers/lehre/Antrag/Attachment.php new file mode 100644 index 000000000..073a03df0 --- /dev/null +++ b/application/controllers/lehre/Antrag/Attachment.php @@ -0,0 +1,82 @@ +load->model('education/Studierendenantrag_model', 'StudierendenantragModel'); + + $this->load->library('DmsLib'); + $this->load->library('AuthLib'); + $this->load->library('PermissionLib'); + } + + // ----------------------------------------------------------------------------------------------------------------- + // Public methods + + /** + * @param integer $dms_id + * + * @return void + */ + public function show($dms_id) + { + $result = $this->StudierendenantragModel->loadWhere(['dms_id' => $dms_id]); + if (!getData($result)) + return show_404(); + + if (!$this->permissionlib->isBerechtigt('student/antragfreigabe')) + { + $isSamePerson = false; + $antraege = getData($result); + $this->load->model('crm/Prestudent_model', 'PrestudentModel'); + foreach ($antraege as $antrag) + { + $prestudent = $this->PrestudentModel->load($antrag->prestudent_id); + if(hasData($prestudent)) + { + if(current(getData($prestudent))->person_id == getAuthPersonId()) + { + $isSamePerson = true; + break; + } + } + } + + if ($isSamePerson == false) + { + $this->output->set_status_header(REST_Controller::HTTP_FORBIDDEN); // set the HTTP header as unauthorized + + $this->load->library('EPrintfLib'); // loads the EPrintfLib to format the output + + // Prints the main error message + $this->eprintflib->printError('You are not allowed to access to this content'); + // Prints the called controller name + $this->eprintflib->printInfo('Controller name: '.$this->router->class); + // Prints the called controller method name + $this->eprintflib->printInfo('Method name: '.$this->router->method); + // Prints the required permissions needed to access to this method + $this->eprintflib->printInfo('Required permissions: student/antragfreigabe'); + + return show_error('You are not entitled to read this document'); + } + } + + $result = $this->dmslib->download($dms_id); + if (isError($result)) + return show_error(getError($result)); + + $this->outputFile(getData($result)); + } +} diff --git a/application/controllers/lehre/Antrag/Wiederholung.php b/application/controllers/lehre/Antrag/Wiederholung.php new file mode 100644 index 000000000..5b22641f7 --- /dev/null +++ b/application/controllers/lehre/Antrag/Wiederholung.php @@ -0,0 +1,49 @@ + 'student/studierendenantrag:w' + ]); + + $this->load->library('AntragLib'); + + // Load language phrases + $this->loadPhrases([ + 'studierendenantrag' + ]); + } + + // ----------------------------------------------------------------------------------------------------------------- + // Public methods + public function assistenz($antrag_id, $frame = false) + { + + $result = $this->antraglib->getDetailsForAntrag($antrag_id); + + if (isError($result)) + return show_error(getError($result)); + + if (!hasData($result)) + return show_404(); + + $this->load->view('lehre/Antrag/Wiederholung/Student', [ + 'antrag_id' => $antrag_id, + 'antrag' => getData($result), + 'frame' => $frame + ]); + } +} diff --git a/application/controllers/lehre/Studierendenantrag.php b/application/controllers/lehre/Studierendenantrag.php new file mode 100644 index 000000000..16b47d592 --- /dev/null +++ b/application/controllers/lehre/Studierendenantrag.php @@ -0,0 +1,208 @@ +load->library('AuthLib'); + $this->load->library('AntragLib'); + + // Load Models + $this->load->model('education/Studierendenantrag_model', 'StudierendenantragModel'); + + // Load language phrases + $this->loadPhrases([ + 'studierendenantrag' + ]); + + if (strtolower($this->router->method) === 'leitung') + $this->_isAllowed([ + 'leitung' => ['student/studierendenantrag:r', 'student/antragfreigabe:r'] + ]); + } + + // ----------------------------------------------------------------------------------------------------------------- + // Public methods + public function index() + { + $dataAntrag = $this->StudierendenantragModel->loadForPerson(getAuthPersonId()); + if (isError($dataAntrag)) + return show_error(getError($dataAntrag)); + $dataAntrag = (getData($dataAntrag) ? : []); + $prestudentenArr = array(); + + foreach ($dataAntrag as $antrag) + { + if (!isset($prestudentenArr[$antrag->prestudent_id])) + { + $prestudentenArr[$antrag->prestudent_id] = array( + 'allowedNewTypes' => array(), + 'antraege'=> array(), + 'bezeichnungStg' => $antrag->bezeichnung, + 'bezeichnungOrgform' => $antrag->orgform + ); + $result = $this->antraglib->getPrestudentAbmeldeBerechtigt($antrag->prestudent_id); + if (getData($result) == 1) + $prestudentenArr[$antrag->prestudent_id]['allowedNewTypes'][] = 'Abmeldung'; + + $result = $this->antraglib->getPrestudentUnterbrechungsBerechtigt($antrag->prestudent_id); + if (getData($result) == 1) + $prestudentenArr[$antrag->prestudent_id]['allowedNewTypes'][] = 'Unterbrechung'; + + $result = $this->antraglib->getPrestudentWiederholungsBerechtigt($antrag->prestudent_id); + if (getData($result) == 1) + $prestudentenArr[$antrag->prestudent_id]['allowedNewTypes'][] = 'Wiederholung'; + } + if ($antrag->studierendenantrag_id == null) + continue; + $prestudentenArr[$antrag->prestudent_id]['antraege'][] = $antrag; + } + + $this->load->view('lehre/Antrag/Student/List', [ + 'antraege' => $prestudentenArr + ]); + } + + public function leitung() + { + $studiengaenge = $this->permissionlib->getSTG_isEntitledFor('student/antragfreigabe'); + $stgsNeuanlage = $this->permissionlib->getSTG_isEntitledFor('student/studierendenantrag'); + + $stgL = []; + if ($studiengaenge) { + $result = $this->StudierendenantragModel->loadForStudiengaenge($studiengaenge); + if (isError($result)) + return show_error(getError($result)); + $antraege = getData($result) ?: []; + + foreach ($antraege as $antrag) { + if (!isset($stgL[$antrag->studiengang_kz])) { + $stgL[$antrag->studiengang_kz] = new stdClass(); + $stgL[$antrag->studiengang_kz]->bezeichnung = $antrag->bezeichnung; + $stgL[$antrag->studiengang_kz]->orgform = $antrag->orgform; + $stgL[$antrag->studiengang_kz]->studiengang_kz = $antrag->studiengang_kz; + } + } + } + + $stgA = []; + if ($stgsNeuanlage) { + $result = $this->StudierendenantragModel->loadForStudiengaenge($stgsNeuanlage); + if (isError($result)) + return show_error(getError($result)); + $antraege = getData($result) ?: []; + + foreach ($antraege as $antrag) { + if (!isset($stgA[$antrag->studiengang_kz])) { + $stgA[$antrag->studiengang_kz] = new stdClass(); + $stgA[$antrag->studiengang_kz]->bezeichnung = $antrag->bezeichnung; + $stgA[$antrag->studiengang_kz]->orgform = $antrag->orgform; + $stgA[$antrag->studiengang_kz]->studiengang_kz = $antrag->studiengang_kz; + } + } + } + + $this->load->view('lehre/Antrag/Leitung/List', [ + 'stgA' => $stgA, + 'stgL' => $stgL + ]); + } + + public function abmeldung($prestudent_id, $studierendenantrag_id = null) + { + $this->load->view('lehre/Antrag/Create', [ + 'prestudent_id' => $prestudent_id, + 'studierendenantrag_id' => $studierendenantrag_id, + 'antrag_type' => 'Abmeldung' + ]); + } + + public function unterbrechung($prestudent_id, $studierendenantrag_id = null) + { + $this->load->view('lehre/Antrag/Create', [ + 'prestudent_id' => $prestudent_id, + 'studierendenantrag_id' => $studierendenantrag_id, + 'antrag_type' => 'Unterbrechung' + ]); + } + + public function wiederholung($prestudent_id, $studierendenantrag_id = null) + { + $this->load->view('lehre/Antrag/Create', [ + 'prestudent_id' => $prestudent_id, + 'studierendenantrag_id' => $studierendenantrag_id, + 'antrag_type' => 'Wiederholung' + ]); + } + + /** + * Checks if the caller is allowed to access to this content with the given permissions + * If it is not allowed will set the HTTP header with code 401 + * Wrapper for permissionlib->isEntitled + */ + private function _isAllowed($requiredPermissions) + { + // Loads permission lib + $this->load->library('PermissionLib'); + + // Checks if this user is entitled to access to this content + if (!$this->permissionlib->isEntitled($requiredPermissions, $this->router->method)) + { + $this->output->set_status_header(REST_Controller::HTTP_UNAUTHORIZED); // set the HTTP header as unauthorized + + $this->load->library('EPrintfLib'); // loads the EPrintfLib to format the output + + // Prints the main error message + $this->eprintflib->printError('You are not allowed to access to this content'); + // Prints the called controller name + $this->eprintflib->printInfo('Controller name: '.$this->router->class); + // Prints the called controller method name + $this->eprintflib->printInfo('Method name: '.$this->router->method); + // Prints the required permissions needed to access to this method + $this->eprintflib->printInfo('Required permissions: '.$this->_rpsToString($requiredPermissions, $this->router->method)); + + exit; // immediately terminate the execution + } + } + + /** + * Converts an array of permissions to a string that contains them as a comma separated list + * Ex: ", , " + */ + private function _rpsToString($requiredPermissions, $method) + { + $strRequiredPermissions = ''; // string that contains all the required permissions needed to access to this method + + if (isset($requiredPermissions[$method])) // if the called method is present in the permissions array + { + // If it is NOT then convert it into an array + $rpsMethod = $requiredPermissions[$method]; + if (!is_array($rpsMethod)) + { + $rpsMethod = array($rpsMethod); + } + + // Copy all the permissions into $strRequiredPermissions separated by a comma + for ($i = 0; $i < count($rpsMethod); $i++) + { + $strRequiredPermissions .= $rpsMethod[$i].', '; + } + + $strRequiredPermissions = rtrim($strRequiredPermissions, ', '); + } + + return $strRequiredPermissions; + } +} diff --git a/application/helpers/hlp_common_helper.php b/application/helpers/hlp_common_helper.php index 913d29b54..707d055ea 100644 --- a/application/helpers/hlp_common_helper.php +++ b/application/helpers/hlp_common_helper.php @@ -18,6 +18,8 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); +use \DateTime as DateTime; + // ------------------------------------------------------------------------ // Collection of utility functions for general purpose // ------------------------------------------------------------------------ @@ -405,3 +407,17 @@ function findResource($path, $resource, $subdir = false, $extraDir = null) return null; } +/** + * check if String can be converted to a date + */ +function isValidDate($dateString) +{ + try + { + return (new DateTime($dateString)) !== false; + } + catch(Exception $e) + { + return false; + } +} diff --git a/application/libraries/AntragLib.php b/application/libraries/AntragLib.php new file mode 100644 index 000000000..38504772c --- /dev/null +++ b/application/libraries/AntragLib.php @@ -0,0 +1,1476 @@ +_ci =& get_instance(); + + // Configs + $this->_ci->load->config('studierendenantrag'); + + // Models + $this->_ci->load->model('education/Studierendenantrag_model', 'StudierendenantragModel'); + $this->_ci->load->model('education/Studierendenantragstatus_model', 'StudierendenantragstatusModel'); + $this->_ci->load->model('education/Studierendenantraglehrveranstaltung_model', 'StudierendenantraglehrveranstaltungModel'); + $this->_ci->load->model('organisation/Studiengang_model', 'StudiengangModel'); + $this->_ci->load->model('crm/Prestudent_model', 'PrestudentModel'); + $this->_ci->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel'); + $this->_ci->load->model('person/Person_model', 'PersonModel'); + $this->_ci->load->model('education/Pruefung_model', 'PruefungModel'); + + // Helper + $this->_ci->load->helper('hlp_sancho_helper'); + + // Libraries + $this->_ci->load->library('PermissionLib'); + $this->_ci->load->library('PrestudentLib'); + } + + /** + * @param integer $antrag_id + * @param string $insertvon + * + * @return stdClass + */ + public function cancelAntrag($antrag_id, $insertvon) + { + $result = $this->_ci->StudierendenantragstatusModel->insert([ + 'studierendenantrag_id' => $antrag_id, + 'studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_CANCELLED, + 'insertvon' => $insertvon + ]); + + return $result; + } + + /** + * NOTE(chris): permissions & verification must be handled outside + * + * @param integer $prestudent_id + * @param string $studiensemester_kurzbz + * @param string $insertvon + * @param string $grund + * + * @return stdClass + */ + public function createAbmeldung($prestudent_id, $studiensemester_kurzbz, $insertvon, $grund) + { + $result = $this->_ci->PrestudentModel->load($prestudent_id); + if (isError($result)) + return $result; + if(!hasData($result)) + return error("Kein Prestudent gefunden: " . $prestudent_id); + + $prestudent = getData($result)[0]; + if($prestudent->person_id == getAuthPersonId()) + $status = Studierendenantragstatus_model::STATUS_CREATED; + else + $status = Studierendenantragstatus_model::STATUS_CREATED_STGL; + + $result = $this->_ci->StudierendenantragModel->insert([ + 'prestudent_id' => $prestudent_id, + 'studiensemester_kurzbz'=> $studiensemester_kurzbz, + 'datum' => date('c'), + 'typ' => Studierendenantrag_model::TYP_ABMELDUNG, + 'insertvon' => $insertvon, + 'grund' => $grund + ]); + + if (isError($result)) + return $result; + + $antrag_id = getData($result); + + $result = $this->_ci->StudierendenantragstatusModel->insert([ + 'studierendenantrag_id' => $antrag_id, + 'studierendenantrag_statustyp_kurzbz' => $status, + 'insertvon' => $insertvon + ]); + + if (isError($result)) + return $result; + + return success($antrag_id); + } + + /** + * @param array $studierendenantrag_ids + * @param string $insertvon + * + * @return stdClass + */ + public function approveAbmeldung($studierendenantrag_ids, $insertvon) + { + $errors = []; + foreach ($studierendenantrag_ids as $studierendenantrag_id) { + + $result = $this->_ci->StudierendenantragModel->loadIdAndStatusWhere(['studierendenantrag_id' => $studierendenantrag_id]); + if (isError($result)) + { + $errors[] = getError($result); + continue; + } + if(!hasData($result)) + { + $errors[] = 'no Antrag found for '. $studierendenantrag_id; + continue; + } + $status = getData($result)[0]; + + if($status->status == Studierendenantragstatus_model::STATUS_CREATED_STGL) + { + $status_approved = Studierendenantragstatus_model::STATUS_APPROVED_STGL; + } + else + $status_approved = Studierendenantragstatus_model::STATUS_APPROVED; + + $result = $this->_ci->StudierendenantragstatusModel->insert([ + 'studierendenantrag_id' => $studierendenantrag_id, + 'studierendenantrag_statustyp_kurzbz' => $status_approved, + 'insertvon' => $insertvon + ]); + if (isError($result)) + $errors[] = getError($result); + else { + $resultPrestudent = $this->_ci->StudierendenantragModel->load($studierendenantrag_id); + if (isError($resultPrestudent)) + { + $errors[] = getError($resultPrestudent); + continue; + } + if ($status_approved == Studierendenantragstatus_model::STATUS_APPROVED) + { + $antrag = getData($resultPrestudent)[0]; + + $resultPrestudentStatus = $this->_ci->PrestudentstatusModel->getLastStatusWithStgEmail($antrag->prestudent_id); + if (isError($resultPrestudentStatus)) + $errors[] = getError($resultPrestudentStatus); + + else { + $prestudent_status = getData($resultPrestudentStatus)[0]; + + $vorlage ='Sancho_Mail_Antrag_A_Approve'; + $subject = 'Abmeldung freigegeben'; + + $result = $this->_ci->prestudentlib->setAbbrecher($antrag->prestudent_id, $antrag->studiensemester_kurzbz, $insertvon); + if (isError($result)) + { + $errors[] = getError($result); + return $errors; + } + + $result = $this->_ci->PersonModel->loadPrestudent($antrag->prestudent_id); + $data = [ + 'nameStudent' => 'Student*in' + ]; + if (hasData($result)) { + $person = current(getData($result)); + $data['nameStudent'] = trim($person->vorname . ' ' . $person->nachname); + } + // NOTE(chris): Sancho mail + sendSanchoMail($vorlage, $data, $prestudent_status->email, $subject); + } + } + } + } + + if (count($errors)) + return error(implode(',', $errors)); + + return success(); + } + + /** + * NOTE(chris): permissions & verification must be handled outside + * + * @param integer $prestudent_id + * @param string $studiensemester_kurzbz + * @param string $insertvon + * @param string $grund + * @param string $datum_wiedereinstieg + * + * @return stdClass + */ + public function createUnterbrechung($prestudent_id, $studiensemester_kurzbz, $insertvon, $grund, $datum_wiedereinstieg, $dms_id) + { + $datum_wiedereinstieg = new DateTime($datum_wiedereinstieg); + $datum_wiedereinstieg = $datum_wiedereinstieg->format("Y-m-d"); + $result = $this->_ci->StudierendenantragModel->insert([ + 'prestudent_id' => $prestudent_id, + 'studiensemester_kurzbz'=> $studiensemester_kurzbz, + 'datum' => date('c'), + 'typ' => Studierendenantrag_model::TYP_UNTERBRECHUNG, + 'insertvon' => $insertvon, + 'grund' => $grund, + 'datum_wiedereinstieg' => $datum_wiedereinstieg, + 'dms_id' => $dms_id + ]); + + if (isError($result)) + return $result; + + $antrag_id = getData($result); + + $result = $this->_ci->StudierendenantragstatusModel->insert([ + 'studierendenantrag_id' => $antrag_id, + 'studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_CREATED, + 'insertvon' => $insertvon + ]); + + if (isError($result)) + return $result; + + return success($antrag_id); + } + + + /** + * @param array $studierendenantrag_ids + * @param string $insertvon + * + * @return stdClass + */ + public function approveUnterbrechung($studierendenantrag_ids, $insertvon) + { + $this->_ci->load->model('person/Kontakt_model', 'KontaktModel'); + + $errors = []; + + foreach ($studierendenantrag_ids as $studierendenantrag_id) + { + $data = $this->getDataForUnterbrechung($studierendenantrag_id); + + if (isError($data)) { + $error_msg = getError($data); + if (is_array($error_msg) && isset($error_msg['message'])) + $error_msg = $error_msg['message']; + + $errors['failed_' . $studierendenantrag_id] = 'Could not approve Unterbrechung for studierendenantrag_id: ' . + $studierendenantrag_id . + '
Details:
' . + $error_msg; + } else { + $data = getData($data); + + $result = $this->_ci->StudierendenantragstatusModel->insert([ + 'studierendenantrag_id' => $studierendenantrag_id, + 'studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_APPROVED, + 'insertvon' => $insertvon + ]); + if (isError($result)) + { + $errors['failed_' . $studierendenantrag_id] = 'Could not approve Unterbrechung for studierendenantrag_id: ' . + $studierendenantrag_id . + '
Details:
' . + getError($result)['message']; + } + else + { + $resultAntrag = $this->_ci->StudierendenantragModel->load($studierendenantrag_id); + if (isError($resultAntrag)) + return $resultAntrag; + $resultAntrag = getData($resultAntrag); + if (!$resultAntrag) + return error('No antrag found with id: ' . $studierendenantrag_id); + $resultAntrag = current($resultAntrag); + + // Prestudentstatus und Unterbrechungsfolgeaktionen setzen + $result = $this->_ci->prestudentlib->setUnterbrecher($resultAntrag->prestudent_id, $resultAntrag->studiensemester_kurzbz, $studierendenantrag_id); + + //Mail + $subject = 'Unterbrechung freigegeben'; + $mail = []; + + if (isset($data['errors']['person_id'])) + { + //send assistenz mit id + $errors[] = 'Mail to student not sent and student name not found
Details:
' . $data['errors']['person_id']; + $mail['ass'] = 'Student/in (' . $data['antrag']->prestudent_id . ')'; + } + elseif (isset($data['errors']['email'])) + { + if (isset($data['errors']['person'])) + { + //send assistenz mit id + $errors[] = 'Mail to student not sent and student name not found
Details:
' . + $data['errors']['email'] . + '
' . + $data['errors']['person']; + $mail['ass'] = 'Student/in (' . $data['antrag']->prestudent_id . ')'; + } + else + { + //send assistenz mit name + $errors[] = 'Mail to student not sent
Details:
' . $data['errors']['email']; + $mail['ass'] = trim($data['person']->vorname . ' ' . $data['person']->nachname); + } + } + else + { + if (isset($data['errors']['person'])) + { + //send assistenz mit id & student mit "Student/in" + $errors[] = 'Student name not found
Details:
' . $data['errors']['person']; + $mail['ass'] = 'Student/in (' . $data['antrag']->prestudent_id . ')'; + $mail['stu'] = 'Student/in'; + } + else + { + //send normal + $mail['ass'] = $mail['stu'] = trim($data['person']->vorname . ' ' . $data['person']->nachname); + } + } + $mailVorlage = 'Sancho_Mail_Antrag_U_Approve'; + if ($data['studienbeitrag']) + $mailVorlage .= '_SB'; + if (isset($mail['ass'])) { + // NOTE(chris): Sancho mail + if (!sendSanchoMail( + $mailVorlage, + [ + 'name' => $mail['ass'] + ], + $data['prestudent_status']->email, + $subject + )) { + $errors[] = 'Failed to send email to ' . $data['prestudent_status']->email; + } + } + if (isset($mail['stu'])) { + // NOTE(chris): Sancho mail + if (!sendSanchoMail( + $mailVorlage, + [ + 'name' => $mail['stu'] + ], + $data['email'], + $subject + )) { + $errors[] = 'Failed to send email to ' . $data['email']; + } + } + } + } + } + + if (count($errors)) + return error($errors); + + return success(); + } + + /** + * @param array $studierendenantrag_ids + * @param string $insertvon + * @param string $grund + * + * @return stdClass + */ + public function rejectUnterbrechung($studierendenantrag_ids, $insertvon, $grund) + { + $this->_ci->load->model('person/Kontakt_model', 'KontaktModel'); + + $errors = []; + + foreach ($studierendenantrag_ids as $studierendenantrag_id) { + $data = $this->getDataForUnterbrechung($studierendenantrag_id); + + if (isError($data)) { + $error_msg = getError($data); + if (is_array($error_msg) && isset($error_msg['message'])) + $error_msg = $error_msg['message']; + + $errors['failed_' . $studierendenantrag_id] = 'Could not reject Unterbrechung for studierendenantrag_id: ' . + $studierendenantrag_id . + '
Details:
' . + $error_msg; + } else { + $data = getData($data); + + $result = $this->_ci->StudierendenantragstatusModel->insert([ + 'studierendenantrag_id' => $studierendenantrag_id, + 'studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_REJECTED, + 'insertvon' => $insertvon, + 'grund' => $grund + ]); + if (isError($result)) { + $errors['failed_' . $studierendenantrag_id] = 'Could not reject Unterbrechung for studierendenantrag_id: ' . + $studierendenantrag_id . + '
Details:
' . + getError($result)['message']; + } else { + $name = ''; + + if (isset($data['errors']['person_id']) || isset($data['errors']['email'])) { + $error_msg = []; + if (isset($data['errors']['person_id'])) + $error_msg[] = $data['errors']['person_id']; + if (isset($data['errors']['email'])) + $error_msg[] = $data['errors']['email']; + $error_msg = 'Mail to student not sent
Details:
' . implode('
', $error_msg); + $errors[] = $error_msg; + } else { + if (isset($data['errors']['person'])) { + //send student mit "Student/in" + $errors[] = 'Student name not found
Details:
' . $data['errors']['person']; + $name = 'Student/in'; + } else { + //send normal + $name = trim($data['person']->vorname . ' ' . $data['person']->nachname); + } + } + if ($name) + // NOTE(chris): Sancho mail + if (!sendSanchoMail( + 'Sancho_Mail_Antrag_U_Reject', + [ + 'name' => $name, + 'grund' => $grund, + 'abmeldungLink' => site_url('lehre/Studierendenantrag/abmeldung/' . $data['prestudent_status']->prestudent_id) + ], + $data['email'], + 'Unterbrechung abgelehnt' + )) + $errors[] = 'Failed to send email to ' . $data['email']; + } + } + } + + if (count($errors)) + return error($errors); + + return success(); + } + + /** + * @param integer $studierendenantrag_id + * + * @return array + */ + private function getDataForUnterbrechung($studierendenantrag_id) + { + $result = []; + $errors = []; + + $res = $this->_ci->StudierendenantragModel->load($studierendenantrag_id); + if (isError($res)) + return $res; + + $res = getData($res); + if (!$res) + return error('No Studierendenantrag found for studierendenantrag_id: ' . $studierendenantrag_id); + + $result['antrag'] = $antrag = current($res); + + + $res = $this->_ci->PrestudentstatusModel->getLastStatusWithStgEmail($antrag->prestudent_id); + if (isError($res)) + return $res; + + $res = getData($res); + if (!$res) + return error('No Prestudentstatus found for prestudent_id: ' . $antrag->prestudent_id); + + $result['prestudent_status'] = current($res); + + + $res = $this->_ci->PrestudentModel->load($antrag->prestudent_id); + + if (isError($res)) { + $errors['person_id'] = getError($res); + } else { + $res = getData($res); + if (!$res) { + $errors['person_id'] = 'No Prestudent found for prestudent_id: ' . $antrag->prestudent_id; + } else { + $person_id = current($res)->person_id; + + $res = $this->_ci->PersonModel->load($person_id); + if (isError($res)) { + $errors['person'] = getError($res); + } else { + $res = getData($res); + if (!$res) { + $errors['person'] = 'No Person found for person_id: ' . $person_id; + } else { + $result['person'] = current($res); + } + } + + $res = $this->_ci->KontaktModel->getZustellKontakt($person_id, ['email']); + if (isError($res)) { + $errors['email'] = getError($res); + } else { + $res = getData($res); + + if (!$res) { + $errors['email'] = 'No email contact found for person_id: ' . $person_id; + } else { + $result['email'] = current($res)->kontakt; + } + } + } + } + + $result['studienbeitrag'] = false; + if (!isset($errors['person_id'])) { + $date_target = new DateTime( + $this->_ci->config->item('frist_rueckzahlung_studiengebuer_' . substr($result['antrag']->studiensemester_kurzbz, 0, 2)) . + substr($result['antrag']->studiensemester_kurzbz, 2) + ); + $date_created = new DateTime($result['antrag']->datum); + if ($date_created < $date_target) { + $this->_ci->load->model('crm/Konto_model', 'KontoModel'); + $result['studienbeitrag'] = $this->_ci->KontoModel->checkStudienbeitragFromPerson($person_id, $result['antrag']->studiensemester_kurzbz); + } + } + + $result['errors'] = $errors; + + return success($result); + } + + /** + * @param integer $prestudent_id + * @param string $studiensemester_kurzbz + * @param string $insertvon + * @param boolean $repeat + * + * @return stdClass + */ + public function createWiederholung($prestudent_id, $studiensemester_kurzbz, $insertvon, $repeat) + { + $result = $this->_ci->StudierendenantragModel->loadIdAndStatusWhere([ + 'prestudent_id' => $prestudent_id, + 'studiensemester_kurzbz'=> $studiensemester_kurzbz, + 'typ' => Studierendenantrag_model::TYP_WIEDERHOLUNG + ]); + + $antrag_id = null; + if (hasData($result)) { + $antrag = current(getData($result)); + if ($antrag->status == Studierendenantragstatus_model::STATUS_REOPENED || + $antrag->status == Studierendenantragstatus_model::STATUS_REQUESTSENT_1 || + $antrag->status == Studierendenantragstatus_model::STATUS_REQUESTSENT_2) + { + $antrag_id = $antrag->studierendenantrag_id; + } + else + { + return error('Antrag bereits vorhanden!'); + } + } + + if ($antrag_id === null) { + $result = $this->_ci->StudierendenantragModel->insert([ + 'prestudent_id' => $prestudent_id, + 'studiensemester_kurzbz'=> $studiensemester_kurzbz, + 'datum' => date('c'), + 'typ' => Studierendenantrag_model::TYP_WIEDERHOLUNG, + 'insertvon' => $insertvon + ]); + + if (isError($result)) + return $result; + + $antrag_id = getData($result); + } + + $result = $this->_ci->StudierendenantragstatusModel->insert([ + 'studierendenantrag_id' => $antrag_id, + 'studierendenantrag_statustyp_kurzbz' => $repeat ? Studierendenantragstatus_model::STATUS_CREATED : Studierendenantragstatus_model::STATUS_PASS, + 'insertvon' => $insertvon + ]); + + if ($repeat) { + $res = $this->_ci->PrestudentstatusModel->getLastStatusWithStgEmail($prestudent_id); + if (isError($res)) + return $res; + $res = getData($res); + if (!$res) + return error('No Prestudentstatus found for prestudent_id: ' . $prestudent_id); + + $prestudent_status = current($res); + $email = $prestudent_status->email; + // NOTE(chris): Sancho mail + sendSanchoMail( + 'Sancho_Mail_Antrag_W_New', + [ + 'antrag_id' => $antrag_id, + 'lvzuweisungLink' => site_url('lehre/Antrag/Wiederholung/assistenz/' . $antrag_id) + ], + $email, + 'Neue*r Wiederholer*in' + ); + } + + if (isError($result)) + return $result; + + return success($antrag_id); + } + + /** + * @param integer $studierendenantrag_id + * @param string $insertvon + * + * @return stdClass + */ + public function reopenWiederholung($studierendenantrag_id, $insertvon) + { + $result = $this->_ci->StudierendenantragstatusModel->insert([ + 'studierendenantrag_id' => $studierendenantrag_id, + 'studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_REOPENED, + 'insertvon' => $insertvon + ]); + return $result; + } + + /** + * @param integer $studierendenantrag_id + * @param string $objectedvon + * + * @return stdClass + */ + public function objectAbmeldung($studierendenantrag_id, $objectedvon) + { + $result = $this->_ci->StudierendenantragstatusModel->insert([ + 'studierendenantrag_id' => $studierendenantrag_id, + 'studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_OBJECTED, + 'insertvon' => $objectedvon + ]); + return $result; + } + + public function getWiederholungsAntraege($status) + { + $studiengaenge = $this->_ci->permissionlib->getSTG_isEntitledFor('student/studierendenantrag'); + $result = $this->_ci->StudierendenantragModel->loadForStudiengaenge( + $studiengaenge, + Studierendenantrag_model::TYP_WIEDERHOLUNG, + $status + ); + if (!getData($result)) + return $result; + $result = getData($result); + $grouped = []; + + foreach ($result as $item) { + if (!isset($grouped[$item->studiengang_kz])) { + $grouped[$item->studiengang_kz] = [ + 'bezeichnung' => $item->bezeichnung, + 'bezeichnung_mehrsprachig' => $item->bezeichnung_mehrsprachig, + 'antraege' => [] + ]; + } + $grouped[$item->studiengang_kz]['antraege'][] = $item; + } + + return success($grouped); + } + + public function getLvsForAntrag($antrag_id) + { + $this->_ci->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel'); + $this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + $this->_ci->load->model('organisation/Studienplan_model', 'StudienplanModel'); + + $result = $this->_ci->StudierendenantragModel->load($antrag_id); + if (isError($result)) + return $result; + $result = getData($result); + if (!$result) + return error('No antrag found with id: ' . $antrag_id); + $antrag = current($result); + + + $result = $this->_ci->StudierendenantragModel->getStgAndSem($antrag_id); + if (isError($result)) + return $result; + $result = getData($result); + if (!$result) + return error('No studiengang and ausbildungssemester found for antrag with id: ' . $antrag_id); + $result = current($result); + $studiengang_kz = $result->studiengang_kz; + $orgform_kurzbz = $result->orgform_kurzbz; + $ausbildungssemester = $result->ausbildungssemester; + + // NOTE(chris): check permission + $allowedStgs = $this->_ci->permissionlib->getSTG_isEntitledFor('student/studierendenantrag') ?: []; + if (!in_array($studiengang_kz, $allowedStgs)) { + $allowedStgs = $this->_ci->permissionlib->getSTG_isEntitledFor('student/antragfreigabe') ?: []; + if (!in_array($studiengang_kz, $allowedStgs)) { + if(!$this->isOwnAntrag($antrag_id)) + return error('Forbidden'); + } + } + + + $result = $this->_ci->StudiensemesterModel->getNextFrom($antrag->studiensemester_kurzbz); + if (isError($result)) + return $result; + $result = getData($result); + if (!$result) + return error('No studiensemster found after: ' . $antrag->studiensemester_kurzbz); + $semA = current($result)->studiensemester_kurzbz; + + $result = $this->_ci->StudiensemesterModel->getNextFrom($semA); + if (isError($result)) + return $result; + $result = getData($result); + if (!$result) + return error('No studiensemster found after: ' . $semA); + $semB = current($result)->studiensemester_kurzbz; + + $result = $this->_ci->StudierendenantraglehrveranstaltungModel->loadWhere(['studierendenantrag_id' => $antrag_id]); + if (isError($result)) + return $result; + $result = getData($result) ?: []; + + $lvszugewiesen = array(); + foreach ($result as $lv) + { + $lvszugewiesen[$lv->lehrveranstaltung_id] = $lv; + } + + $result = $this->getLvsByStgStsemAndSem( + $studiengang_kz, + $orgform_kurzbz, + $semA, + $ausbildungssemester + 1, + $antrag->prestudent_id, + $antrag->studiensemester_kurzbz + ); + if (isError($result)) + return $result; + $lvsA = getData($result) ?: []; + foreach($lvsA as $lv) + { + if (isset($lvszugewiesen[$lv->lehrveranstaltung_id]) && + ($lvszugewiesen[$lv->lehrveranstaltung_id]->note == $this->_ci->config->item('wiederholung_note_nicht_zugelassen'))) + { + $lv->antrag_zugelassen = true; + $lv->antrag_anmerkung = $lvszugewiesen[$lv->lehrveranstaltung_id]->anmerkung; + } + } + + $result = $this->getLvsByStgStsemAndSem( + $studiengang_kz, + $orgform_kurzbz, + $semB, + $ausbildungssemester, + $antrag->prestudent_id, + $antrag->studiensemester_kurzbz + ); + if (isError($result)) + return $result; + $lvsB = getData($result) ?: []; + foreach($lvsB as $lv) + { + if(isset($lvszugewiesen[$lv->lehrveranstaltung_id]) && ($lvszugewiesen[$lv->lehrveranstaltung_id]->note == 0)) + { + $lv->antrag_anmerkung = $lvszugewiesen[$lv->lehrveranstaltung_id]->anmerkung; + $lv->antrag_zugelassen = true; + } + // TODO(manu): eventuelle Änderungen taggen + } + + return success([ + '1' . $semA => $lvsA ?: [], + '2' . $semB => $lvsB ?: [] + ]); + } + + public function getLvsByStgStsemAndSem( + $studiengang_kz, + $orgform_kurzbz, + $studiensemester_kurzbz, + $ausbildungssemester, + $prestudent_id, + $note_stsem + ) { + $this->_ci->load->model('organisation/Studienplan_model', 'StudienplanModel'); + + $result = $this->_ci->StudienplanModel->getStudienplaeneBySemester( + $studiengang_kz, + $studiensemester_kurzbz, + $ausbildungssemester, + $orgform_kurzbz + ); + if (isError($result)) + return $result; + $result = getData($result); + if (!$result) + return error('No studienplan found for stg: ' . + $studiengang_kz . + ', studiensemester: ' . + $studiensemester_kurzbz . + ', ausbildungssemester: ' . + ($ausbildungssemester)); + if (count($result) > 1) + return error('Multiple studienplaene found for stg: ' . + $studiengang_kz . + ', studiensemester: ' . + $studiensemester_kurzbz . + ', ausbildungssemester: ' . + $ausbildungssemester); + $studienplan = current($result); + + return $this->_ci->StudienplanModel->getStudienplanLehrveranstaltungForPrestudent( + $studienplan->studienplan_id, + $ausbildungssemester, + $prestudent_id, + $note_stsem + ); + } + + /** + * Checks if a prestudent can submit an Antrag for Abmeldung + * + * @param integer $prestudent_id + * + * @return \stdClass on success retval 0 means not a student; retval 1 means Berechtigt; retval -1 means has already an Antrag pending; retval -2 means other Antrag pending; retval -3 means in blacklist stg + */ + public function getPrestudentAbmeldeBerechtigt($prestudent_id) + { + $result = $this->_ci->PrestudentModel->load($prestudent_id); + if (isError($result)) + return $result; + if (!hasData($result)) + return success(0); + $result = current(getData($result)); + $stg_kz = $result->studiengang_kz; + if (in_array($stg_kz, $this->_ci->config->item('stgkz_blacklist_abmeldung'))) + return success(-3); + + $result = $this->_ci->PrestudentstatusModel->getLastStatus($prestudent_id); + if (isError($result)) + return $result; + if (!hasData($result)) + return success(0); + $result = current(getData($result)); + $datumStatus = $result->datum; + + if (!in_array($result->status_kurzbz, $this->_ci->config->item('antrag_prestudentstatus_whitelist'))) { + $result = $this->_ci->StudierendenantragModel->loadWithStatusWhere(['prestudent_id' => $prestudent_id, 'typ' => Studierendenantrag_model::TYP_ABMELDUNG, 'campus.get_status_studierendenantrag(studierendenantrag_id)' => Studierendenantragstatus_model::STATUS_APPROVED]); + if (isError($result)) + return $result; + if (hasData($result)) + return success(-1); + + return success(0); + } + + $result = $this->_ci->StudierendenantragModel->loadWithStatusWhere(['prestudent_id' => $prestudent_id]); + if (isError($result)) + return $result; + if (!hasData($result)) + return success(1); + $result= getData($result); + foreach ($result as $antrag) + { + if ($antrag->typ == Studierendenantrag_model::TYP_ABMELDUNG) + { + if ($antrag->status == Studierendenantragstatus_model::STATUS_CREATED || $antrag->status == Studierendenantragstatus_model::STATUS_CREATED_STGL) + return success(-1); + elseif ($antrag->status == Studierendenantragstatus_model::STATUS_APPROVED && $antrag->datum > $datumStatus) + return success(-1); + } + if ($antrag->typ == Studierendenantrag_model::TYP_WIEDERHOLUNG) + { + if($antrag->status == Studierendenantragstatus_model::STATUS_PASS) + return success(-2); + } + } + + return success(1); + } + + /** + * Checks if a prestudent can submit an Antrag for Unterbrechung + * + * @param integer $prestudent_id + * @param string $studiensemester_kurzbz (optional) + * + * @return \stdClass on success retval 0 means not a student; retval 1 means Berechtigt; retval -1 means has already an Antrag pending; retval -2 means other Antrag pending; retval -3 means in blacklist stg + */ + public function getPrestudentUnterbrechungsBerechtigt($prestudent_id, $studiensemester_kurzbz = null) + { + $result = $this->_ci->PrestudentModel->load($prestudent_id); + if (isError($result)) + return $result; + if (!hasData($result)) + return success(0); + $result = current(getData($result)); + $stg_kz = $result->studiengang_kz; + if (in_array($stg_kz, $this->_ci->config->item('stgkz_blacklist_unterbrechung'))) + return success(-3); + + $result = $this->_ci->PrestudentstatusModel->getLastStatus($prestudent_id); + if (isError($result)) + return $result; + if (!hasData($result)) + return success(0); + $result = current(getData($result)); + $datumStatus = $result->datum; + if (!in_array($result->status_kurzbz, $this->_ci->config->item('antrag_prestudentstatus_whitelist'))) { + $result = $this->_ci->StudierendenantragModel->loadWithStatusWhere(['prestudent_id' => $prestudent_id, 'typ' => Studierendenantrag_model::TYP_UNTERBRECHUNG, 'campus.get_status_studierendenantrag(studierendenantrag_id)' => Studierendenantragstatus_model::STATUS_APPROVED]); + if (isError($result)) + return $result; + if (hasData($result)) + return success(-1); + + return success(0); + } + $result = $this->_ci->StudierendenantragModel->loadWithStatusWhere(['prestudent_id' => $prestudent_id]); + if (isError($result)) + return $result; + if (!hasData($result)) + return success(1); + $result= getData($result); + foreach ($result as $antrag) + { + if ($antrag->typ == Studierendenantrag_model::TYP_ABMELDUNG) + { + if($antrag->status == Studierendenantragstatus_model::STATUS_CREATED || $antrag->status == Studierendenantragstatus_model::STATUS_CREATED_STGL) + return success(-2); + elseif($antrag->status == Studierendenantragstatus_model::STATUS_APPROVED && $antrag->datum > $datumStatus) + return success(-2); + } + if ($studiensemester_kurzbz && $antrag->typ == Studierendenantrag_model::TYP_UNTERBRECHUNG) + { + // NOTE(chris): check if this is an old or canceled one + if ($antrag->studiensemester_kurzbz == $studiensemester_kurzbz && $antrag->status != Studierendenantragstatus_model::STATUS_CANCELLED) + return success(-1); + } + if ($antrag->typ == Studierendenantrag_model::TYP_WIEDERHOLUNG) + { + if($antrag->status == Studierendenantragstatus_model::STATUS_PASS) + return success(-2); + } + } + + return success(1); + } + + /** + * Checks if a prestudent can submit an Antrag for Wiederholung + * + * @param integer $prestudent_id + * + * @return \stdClass on success retval 0 means not a student; retval 1 means Berechtigt; retval -1 means has already an Antrag pending; retval -2 means other Antrag pending; retval -3 means in blacklist stg + */ + public function getPrestudentWiederholungsBerechtigt($prestudent_id) + { + $result = $this->_ci->PrestudentModel->load($prestudent_id); + if (isError($result)) + return $result; + if (!hasData($result)) + return success(0); + $result = current(getData($result)); + $stg_kz = $result->studiengang_kz; + if (in_array($stg_kz, $this->_ci->config->item('stgkz_blacklist_wiederholung'))) + return success(-3); + + $result = $this->getFailedExamForPrestudent($prestudent_id); + if (isError($result)) + return $result; + if (!hasData($result)) + return success(0); + + $result = $this->_ci->PrestudentstatusModel->getLastStatus($prestudent_id); + if (isError($result)) + return $result; + if (!hasData($result)) + return success(0); + + $result = current(getData($result)); + $datumStatus = $result->datum; + if (!in_array($result->status_kurzbz, $this->_ci->config->item('antrag_prestudentstatus_whitelist'))) { + $result = $this->_ci->StudierendenantragModel->loadWithStatusWhere(['prestudent_id' => $prestudent_id, 'typ' => Studierendenantrag_model::TYP_WIEDERHOLUNG, 'campus.get_status_studierendenantrag(studierendenantrag_id)' => Studierendenantragstatus_model::STATUS_APPROVED]); + if (isError($result)) + return $result; + if (hasData($result)) + return success(-1); + + return success(0); + } + $result = $this->_ci->StudierendenantragModel->loadWithStatusWhere(['prestudent_id' => $prestudent_id]); + if (isError($result)) + return $result; + if (!hasData($result)) + return success(1); + $result= getData($result); + foreach ($result as $antrag) + { + if ($antrag->typ == Studierendenantrag_model::TYP_ABMELDUNG) + { + if($antrag->status == Studierendenantragstatus_model::STATUS_CREATED || $antrag->status == Studierendenantragstatus_model::STATUS_CREATED_STGL) + return success(-2); + elseif($antrag->status == Studierendenantragstatus_model::STATUS_APPROVED && $antrag->datum > $datumStatus) + return success(-2); + } + if ($antrag->typ == Studierendenantrag_model::TYP_WIEDERHOLUNG) + { + return success(-1); + } + } + + return success(1); + } + + /** + * Gets details for a new Antrag + * + * @param integer $prestudent_id + * + * @return \stdClass + */ + public function getDetailsForNewAntrag($prestudent_id) + { + $result = $this->_ci->PrestudentstatusModel->loadLastWithStgDetails($prestudent_id); + if (isError($result)) + return $result; + if (!hasData($result)) + return error('No Studentstatus found for: ' . $prestudent_id); + $result = current(getData($result)); + return success($result); + } + + public function getDetailsForLastAntrag($prestudent_id, $typ = null) + { + $result = $this->_ci->PrestudentstatusModel->loadLastWithStgDetails($prestudent_id); + if (isError($result)) + return $result; + if (!hasData($result)) + return error('No Studentstatus found for: ' . $prestudent_id); + $resultDetails = current(getData($result)); + + $where = [ + 'prestudent_id' => $prestudent_id + ]; + if ($typ) + $where['typ'] = $typ; + $result = $this->_ci->StudierendenantragModel->loadWithStatusWhere($where); + if (isError($result)) + return $result; + + $antraege = getData($result) ?: []; + $resultAntrag = null; + foreach ($antraege as $antrag) { + if ($antrag->status != Studierendenantragstatus_model::STATUS_CANCELLED) { + $resultAntrag = $antrag; + break; + } + } + if (!$resultAntrag) + return error('No Antrag ' . trim(($typ ?: '') . ' ') . 'found for: ' . $prestudent_id); + + $resultDetails->status = $resultAntrag->status; + $resultDetails->statustyp = $resultAntrag->statustyp; + $resultDetails->grund = $resultAntrag->grund; + $resultDetails->studierendenantrag_id = $resultAntrag->studierendenantrag_id; + $resultDetails->typ = $resultAntrag->typ; + + return success($resultDetails); + } + + public function getDetailsForAntrag($studierendenantrag_id) + { + $where = [ + 'studierendenantrag_id' => $studierendenantrag_id + ]; + + $result = $this->_ci->StudierendenantragModel->loadWithStatusWhere($where); + if (isError($result)) + return $result; + + if (!hasData($result)) + return error("No Antrag found with id: " . $studierendenantrag_id); + $resultAntrag = current(getData($result)); + + $result = $this->_ci->PrestudentstatusModel->loadLastWithStgDetails($resultAntrag->prestudent_id, $resultAntrag->studiensemester_kurzbz); + if (isError($result)) + return $result; + if (!hasData($result)) { + $result = $this->_ci->PrestudentstatusModel->loadLastWithStgDetails($resultAntrag->prestudent_id); + if (isError($result)) + return $result; + if (!hasData($result)) + return error('No Studentstatus found for: ' . $resultAntrag->prestudent_id); + } + $resultDetails = current(getData($result)); + + $resultDetails->status = $resultAntrag->status; + $resultDetails->statustyp = $resultAntrag->statustyp; + $resultDetails->grund = $resultAntrag->grund; + $resultDetails->studierendenantrag_id = $resultAntrag->studierendenantrag_id; + $resultDetails->typ = $resultAntrag->typ; + $resultDetails->dms_id = $resultAntrag->dms_id; + $resultDetails->datum_wiedereinstieg = $resultAntrag->datum_wiedereinstieg; + + return success($resultDetails); + } + + public function getSemesterForUnterbrechung($studiengang_kz, $studiensemester_kurzbz, $ausbildungssemester) + { + $this->_ci->load->model('organisation/Studienplan_model', 'StudienplanModel'); + $this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + + $result = $this->_ci->StudienplanModel->getStudienplaeneBySemester($studiengang_kz, $studiensemester_kurzbz, $ausbildungssemester); + if (!hasData($result)) + return []; + + $studienplaene = getData($result); + $studienplan_ids = array_map(function ($studienplan) { + return $studienplan->studienplan_id; + }, $studienplaene); + + $result = $this->_ci->StudiensemesterModel->getFollowingSemester($studienplan_ids, $studiensemester_kurzbz, $ausbildungssemester); + if (!hasData($result)) + return []; + + $stsems = getData($result); + + $result = $this->_ci->StudiensemesterModel->loadWhere(); + if (!hasData($result)) + return []; + $result = getData($result); + usort($result, function($a, $b) { + return $a->start > $b->start ? 1 : -1; + }); + foreach ($stsems as $stsem) { + $stsem->wiedereinstieg = array_filter($result, function ($sem) use ($stsem) { + return $sem->start > $stsem->ende; + }); + } + + return $stsems; + } + + public function getAbmeldeBerechtigtForStg($studiengaenge) + { + $blacklist = $this->_ci->config->item('stgkz_blacklist_abmeldung'); + $studiengaenge = array_diff($studiengaenge, $blacklist); + return $this->_ci->StudiengangModel->getAktivePrestudenten($studiengaenge, [ + Studierendenantrag_model::TYP_ABMELDUNG + ]); + } + + public function getFailedExamForPrestudent($prestudent_id) + { + return $this->_ci->PruefungModel->loadWhereCommitteeExamFailedForPrestudent($prestudent_id); + } + + public function saveLvs($lvArray) + { + $result = $this->_ci->StudierendenantraglehrveranstaltungModel->deleteWhere(['studierendenantrag_id' => $lvArray[0]['studierendenantrag_id']]); + if (isError($result)) + return $result; + + $result = $this->_ci->StudierendenantraglehrveranstaltungModel->insertBatch($lvArray); + if (isError($result)) + return $result; + + $result = $this->_ci->StudierendenantragstatusModel->insert([ + 'studierendenantrag_id' => $lvArray[0]['studierendenantrag_id'], + 'studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_LVSASSIGNED, + 'insertvon' => $lvArray[0]['insertvon'] + ]); + if (isError($result)) + return $result; + + $antrag_status_id = getData($result); + $result = $this->_ci->StudierendenantragstatusModel->loadWithTyp($antrag_status_id); + + return $result; + } + + public function approveWiederholung($antrag_id, $insertvon) + { + $result = $this->_ci->StudierendenantragstatusModel->insert([ + 'studierendenantrag_id' => $antrag_id, + 'studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_APPROVED, + 'insertvon' => $insertvon + ]); + + if (isError($result)) { + return $result; + } + + $result = $this->_ci->StudierendenantragModel->getStgEmail($antrag_id); + if (isError($result)) + return $result; + $result = getData($result); + if (!$result) + return error('No studiengang email found for: ' . $antrag_id); + + $email = current($result)->email; + + $result = $this->_ci->StudierendenantragModel->getStgAndSem($antrag_id); + if (isError($result)) + return $result; + $result = getData($result); + if (!$result) + return error('No studiengang found for: ' . $antrag_id); + + $result = current($result); + $studiengang_kz = $result->studiengang_kz; + $semester = $result->ausbildungssemester; + + $result = $this->_ci->StudiengangModel->load($studiengang_kz); + if (isError($result)) + return $result; + $result = getData($result); + if (!$result) + return error('No studiengang found for: ' . $antrag_id); + + $stg = current($result); + + $result = $this->_ci->StudierendenantragModel->load($antrag_id); + if (isError($result)) + return $result; + if (!hasData($result)) + return error('No Antrag found for: ' . $antrag_id); + $result = current(getData($result)); + $prestudent_id = $result->prestudent_id; + + $result = $this->_ci->PersonModel->loadPrestudent($prestudent_id); + if (isError($result)) + return $result; + if (!hasData($result)) + return error('No Person found for prestudent: ' . $prestudent_id); + $result = current(getData($result)); + $student = trim($result->vorname . ' ' . $result->nachname); + + $result = $this->_ci->PersonModel->getFullName($insertvon); + if (isError($result)) + return $result; + $mitarbeiter = $insertvon; + if (hasData($result)) { + $mitarbeiter = getData($result); + } + + + // NOTE(chris): Sancho mail + if (!sendSanchoMail( + 'Sancho_Mail_Antrag_W_Approve', + [ + 'antrag_id' => $antrag_id, + 'stg' => $stg->bezeichnung, + 'sem' => $semester, + 'student' => $student, + 'mitarbeiter' => $mitarbeiter + ], + $email, + 'Wiederholung von Stgleitung freigegeben' + )) + return error('Email konnte nicht versendet werden an '. $email); + + return success(); + } + + public function getAntragHistory($antrag_id) + { + $result = $this->_ci->StudierendenantragstatusModel->loadWithTypWhere([ + 'studierendenantrag_id' => $antrag_id + ]); + return $result; + } + + + /** + * @param integer $studierendenantrag_id + * + * @return boolean + */ + protected function isOwnAntrag($studierendenantrag_id) + { + if ($studierendenantrag_id == null) + return false; + $result = $this->_ci->StudierendenantragModel->loadForPerson(getAuthPersonId()); + if (!hasData($result)) + return false; + $antraege = array_map(function ($antrag) { + return $antrag->studierendenantrag_id; + }, getData($result)); + + return in_array($studierendenantrag_id, $antraege); + } + + /** + * @param integer $studierendenantrag_id + * @param string $permission either 'student/antragfreigabe' or 'student/studierendenantrag' + * + * @return boolean + */ + protected function hasAccessToAntrag($studierendenantrag_id, $permission) + { + $studiengaenge = $this->_ci->permissionlib->getSTG_isEntitledFor($permission); + if (!$studiengaenge) + return false; + $result = $this->_ci->StudierendenantragModel->isInStudiengang($studierendenantrag_id, $studiengaenge); + return (boolean)getData($result); + } + + /** + * @param integer $antrag_id + * + * @return boolean + */ + public function isEntitledToShowAntrag($antrag_id) + { + return + ( + $this->isOwnAntrag($antrag_id) || + $this->hasAccessToAntrag($antrag_id, 'student/antragfreigabe') || + $this->hasAccessToAntrag($antrag_id, 'student/studierendenantrag') + ); + } + + /** + * @param integer $antrag_id + * + * @return boolean + */ + public function isEntitledToSeeHistoryForAntrag($antrag_id) + { + return + ( + $this->isOwnAntrag($antrag_id) || + $this->hasAccessToAntrag($antrag_id, 'student/antragfreigabe') || + $this->hasAccessToAntrag($antrag_id, 'student/studierendenantrag') + ); + } + + /** + * @param integer $prestudent_id + * @param boolean $checkAssistencePermission + * + * @return boolean + */ + public function isEntitledToCreateAntragFor($prestudent_id, $checkAssistencePermission = false) + { + $result = $this->_ci->PrestudentModel->load($prestudent_id); + if (!hasData($result)) + return false; + + $result = getData($result)[0]; + $person_id = $result->person_id; + + if (getAuthPersonId() == $person_id) + return true; + + if ($checkAssistencePermission) + { + $studiengaenge = $this->_ci->permissionlib->getSTG_isEntitledFor('student/studierendenantrag'); + if (in_array($result->studiengang_kz, $studiengaenge ?: [])) + return true; + } + + return false; + } + + /** + * @param integer $antrag_id + * + * @return boolean + */ + public function isEntitledToCancelAntrag($antrag_id) + { + return $this->isOwnAntrag($antrag_id); + } + + /** + * @param integer $antrag_id + * + * @return boolean + */ + public function isEntitledToReopenAntrag($antrag_id) + { + return $this->hasAccessToAntrag($antrag_id, 'student/studierendenantrag'); + } + + /** + * @param integer $antrag_id + * + * @return boolean + */ + public function isEntitledToObjectAntrag($antrag_id) + { + return ($this->hasAccessToAntrag($antrag_id, 'student/antragfreigabe') || $this->hasAccessToAntrag($antrag_id, 'student/studierendenantrag')); + } + + /** + * @param integer $antrag_id + * + * @return boolean + */ + public function isEntitledToApproveAntrag($antrag_id) + { + return $this->hasAccessToAntrag($antrag_id, 'student/antragfreigabe'); + } + + /** + * @param integer $antrag_id + * + * @return boolean + */ + public function isEntitledToRejectAntrag($antrag_id) + { + return $this->hasAccessToAntrag($antrag_id, 'student/antragfreigabe'); + } + + /** + * @param integer $antrag_id + * @param string|array $status + * + * @return boolean + */ + public function hasStatus($antrag_id, $status) + { + $result = $this->_ci->StudierendenantragModel->getWithLastStatusWhere(['s.studierendenantrag_id' => $antrag_id]); + if (!hasData($result)) + return false; + $lastStatus = getData($result)[0]; + + if (!is_array($status)) + $status = [$status]; + + return in_array($lastStatus->studierendenantrag_statustyp_kurzbz, $status); + } + + + /** + * @param integer $antrag_id + * + * @return boolean + */ + public function getLvsForPrestudent($prestudent_id, $studiensemester_kurzbz) + { + $result = $this->_ci->StudierendenantraglehrveranstaltungModel->getLvsForPrestudent($prestudent_id, $studiensemester_kurzbz); + return $result; + } +} diff --git a/application/libraries/DmsLib.php b/application/libraries/DmsLib.php index fccfe503b..774ebdc79 100644 --- a/application/libraries/DmsLib.php +++ b/application/libraries/DmsLib.php @@ -595,6 +595,8 @@ class DmsLib if (isError($insDmsResult)) return $insDmsResult; $upload_data['dms_id'] = getData($insDmsResult); + if(isset($upload_data['file_type']) && !isset($dms['mimetype'])) + $dms['mimetype'] = $upload_data['file_type']; // Insert DMS version $insVersionResult = $this->_ci->DmsVersionModel->insert( diff --git a/application/libraries/PrestudentLib.php b/application/libraries/PrestudentLib.php new file mode 100644 index 000000000..6dff4e812 --- /dev/null +++ b/application/libraries/PrestudentLib.php @@ -0,0 +1,356 @@ +_ci =& get_instance(); + + // // Configs + // $this->_ci->load->config('studierendenantrag'); + + // // Models + $this->_ci->load->model('crm/Prestudent_model', 'PrestudentModel'); + $this->_ci->load->model('crm/Student_model', 'StudentModel'); + $this->_ci->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel'); + $this->_ci->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel'); + $this->_ci->load->model('organisation/Lehrverband_model', 'LehrverbandModel'); + $this->_ci->load->model('education/Studentlehrverband_model', 'StudentlehrverbandModel'); + $this->_ci->load->model('person/Benutzer_model', 'BenutzerModel'); + + } + + public function setAbbrecher($prestudent_id, $studiensemester_kurzbz, $insertvon = null) + { + if (!$insertvon) + $insertvon = getAuthUID(); + + $result = $this->_ci->PrestudentstatusModel->getLastStatus($prestudent_id, $studiensemester_kurzbz); + if (isError($result)) + return $result; + $result = getData($result); + if (!$result) + return error('Kein Prestudent in diesem Studiensemester gefunden'); + + $prestudent_status = current($result); + + $result = $this->_ci->StudentModel->loadWhere(['prestudent_id' => $prestudent_id]); + + if (isError($result)) + return $result; + $result = getData($result); + if (!$result) + return error('No student found for ' . $prestudent_id); + + $student = current($result); + + //Status updaten + $result = $this->_ci->PrestudentstatusModel->insert([ + 'prestudent_id' => $prestudent_id, + 'status_kurzbz' => Prestudentstatus_model::STATUS_ABBRECHER, + 'studiensemester_kurzbz' => $studiensemester_kurzbz, + 'ausbildungssemester' => $prestudent_status->ausbildungssemester, + 'datum' => date('c'), + 'insertvon' => $insertvon, + 'insertamum' => date('c'), + 'orgform_kurzbz'=> $prestudent_status->orgform_kurzbz, + 'studienplan_id'=> $prestudent_status->studienplan_id, + 'bestaetigtvon' => $insertvon, + 'bestaetigtam' => date('c') + ]); + + if (isError($result)) + return $result; + + //Verband anlegen + $result = $this->_ci->LehrverbandModel->load([ + 'studiengang_kz' => $student->studiengang_kz, + 'semester' => 0, + 'verband' => 'A', + 'gruppe' => '' + ]); + + if (isError($result)) + return $result; + $result = getData($result); + if (!$result) + { + $result = $this->_ci->LehrverbandModel->load([ + 'studiengang_kz' => $student->studiengang_kz, + 'semester' => 0, + 'verband' => '', + 'gruppe' => '' + ]); + if (isError($result)) + return $result; + $result = getData($result); + + if(!$result) + { + $this->_ci->LehrverbandModel->insert([ + 'studiengang_kz' => $student->studiengang_kz, + 'semester' => 0, + 'verband' => '', + 'gruppe' => '', + 'bezeichnung' => 'Ab-Unterbrecher', + 'aktiv' => true, + ]); + } + + $this->_ci->LehrverbandModel->insert([ + 'studiengang_kz' => $student->studiengang_kz, + 'semester' => 0, + 'verband' => 'A', + 'gruppe' => '', + 'bezeichnung' => 'Abbrecher', + 'aktiv' => true + ]); + } + + //noch nicht eingetragene Zeugnisnoten auf 9 setzen + $result = $this->_ci->ZeugnisnoteModel->getZeugnisnoten($student->student_uid, $studiensemester_kurzbz); + if (isError($result)) + return $result; + $result = getData($result) ?: []; + + foreach ($result as $lv) + { + if (!$lv->note) + { + $result = $this->_ci->ZeugnisnoteModel->insert([ + 'note' => 9, + 'studiensemester_kurzbz' => $lv->studiensemester_kurzbz, + 'student_uid' => $lv->uid, + 'lehrveranstaltung_id' => $lv->lehrveranstaltung_id + ]); + if (isError($result)) { + $result = $this->_ci->ZeugnisnoteModel->update([ + 'studiensemester_kurzbz' => $lv->studiensemester_kurzbz, + 'student_uid' => $lv->uid, + 'lehrveranstaltung_id' => $lv->lehrveranstaltung_id + ],[ + 'note' => 9 + ]); + + if (isError($result)) + return $result; + } + } + } + + + //Update Aktionen + + //StudentModel updaten + $this->_ci->StudentModel->update([ + 'student_uid' => $student->student_uid + ], [ + 'verband' => 'A', + 'gruppe' => '', + 'semester' => 0, + 'updatevon' => $insertvon, + 'updateamum' => date('c') + ]); + + //Studentlehrverband setzen + $this->_ci->StudentlehrverbandModel->update([ + 'studiensemester_kurzbz' => $studiensemester_kurzbz, + 'student_uid' => $student->student_uid + ],[ + 'studiengang_kz' => $student->studiengang_kz, + 'semester' => 0, + 'verband' => 'A', + 'gruppe' => '', + 'updateamum' => date('c'), + 'updatevon' => $insertvon + ]); + + //Benutzer inaktiv setzen + $this->_ci->BenutzerModel->update([ + 'uid' => $student->student_uid + ],[ + 'aktiv' => false, + 'updateaktivvon' => $insertvon, + 'updateaktivam' => date('c'), + 'updatevon' => $insertvon, + 'updateamum' => date('c') + ]); + + return success(); + } + + public function setUnterbrecher($prestudent_id, $studiensemester_kurzbz, $studierendenantrag_id, $insertvon = null) + { + if (!$insertvon) + $insertvon = getAuthUID(); + + $result = $this->_ci->PrestudentstatusModel->getLastStatus($prestudent_id, $studiensemester_kurzbz); + if (isError($result)) + return $result; + $result = getData($result); + if (!$result) + return error('Kein Prestudent in diesem Studiensemester gefunden'); + + $prestudent_status = current($result); + + $result = $this->_ci->StudentModel->loadWhere(['prestudent_id' => $prestudent_id]); + + if (isError($result)) + return $result; + $result = getData($result); + if (!$result) + return error('No student found for ' . $prestudent_id); + + $student = current($result); + + $resultAntrag = $this->_ci->StudierendenantragModel->load($studierendenantrag_id); + if (isError($resultAntrag)) + return $resultAntrag; + $resultAntrag = getData($resultAntrag); + if (!$resultAntrag) + return error('No antrag found with id: ' . $studierendenantrag_id); + + $antrag = current($resultAntrag); + + //Status updaten + $result = $this->_ci->PrestudentstatusModel->insert([ + 'prestudent_id' => $prestudent_id, + 'status_kurzbz' => Prestudentstatus_model::STATUS_UNTERBRECHER, + 'studiensemester_kurzbz' => $studiensemester_kurzbz, + 'ausbildungssemester' => $prestudent_status->ausbildungssemester, + 'datum' => date('c'), + 'insertvon' => $insertvon, + 'insertamum' => date('c'), + 'orgform_kurzbz'=> $prestudent_status->orgform_kurzbz, + 'studienplan_id'=> $prestudent_status->studienplan_id, + 'bestaetigtvon' => $insertvon, + 'bestaetigtam' => date('c'), + 'anmerkung'=> 'Wiedereinstieg ' . $antrag->datum_wiedereinstieg + ]); + + //error try manu + if (isError($result)) + return $result; + + //Verband anlegen + $result = $this->_ci->LehrverbandModel->load([ + 'studiengang_kz' => $student->studiengang_kz, + 'semester' => 0, + 'verband' => 'B', + 'gruppe' => '' + ]); + + if (isError($result)) + return $result; + $result = getData($result); + if (!$result) + { + $result = $this->_ci->LehrverbandModel->load([ + 'studiengang_kz' => $student->studiengang_kz, + 'semester' => 0, + 'verband' => '', + 'gruppe' => '' + ]); + if (isError($result)) + return $result; + $result = getData($result); + + if(!$result) + { + $this->_ci->LehrverbandModel->insert([ + 'studiengang_kz' => $student->studiengang_kz, + 'semester' => 0, + 'verband' => '', + 'gruppe' => '', + 'bezeichnung' => 'Ab-Unterbrecher', + 'aktiv' => true, + ]); + } + + $this->_ci->LehrverbandModel->insert([ + 'studiengang_kz' => $student->studiengang_kz, + 'semester' => 0, + 'verband' => 'B', + 'gruppe' => '', + 'bezeichnung' => 'Unterbrecher', + 'aktiv' => true + ]); + } + + //noch nicht eingetragene Zeugnisnoten auf 9 setzen + $result = $this->_ci->ZeugnisnoteModel->getZeugnisnoten($student->student_uid, $studiensemester_kurzbz); + if (isError($result)) + return $result; + $result = getData($result) ?: []; + + foreach ($result as $lv) + { + if (!$lv->note) + { + $result = $this->_ci->ZeugnisnoteModel->insert([ + 'note' => 9, + 'studiensemester_kurzbz' => $lv->studiensemester_kurzbz, + 'student_uid' => $lv->uid, + 'lehrveranstaltung_id' => $lv->lehrveranstaltung_id + ]); + if (isError($result)) { + $result = $this->_ci->ZeugnisnoteModel->update([ + 'studiensemester_kurzbz' => $lv->studiensemester_kurzbz, + 'student_uid' => $lv->uid, + 'lehrveranstaltung_id' => $lv->lehrveranstaltung_id + ],[ + 'note' => 9 + ]); + + if (isError($result)) + return $result; + } + } + } + + + //Update Aktionen + + //StudentModel updaten + $this->_ci->StudentModel->update([ + 'student_uid' => $student->student_uid + ], [ + 'verband' => 'B', + 'gruppe' => '', + 'semester' => 0, + 'updatevon' => $insertvon, + 'updateamum' => date('c') + ]); + + //Studentlehrverband setzen + $this->_ci->StudentlehrverbandModel->update([ + 'studiensemester_kurzbz' => $studiensemester_kurzbz, + 'student_uid' => $student->student_uid + ],[ + 'studiengang_kz' => $student->studiengang_kz, + 'semester' => 0, + 'verband' => 'B', + 'gruppe' => '', + 'updateamum' => date('c'), + 'updatevon' => $insertvon + ]); + + return success(); + } + +} diff --git a/application/models/crm/Konto_model.php b/application/models/crm/Konto_model.php index 4b2a259c9..e76ed9e7a 100644 --- a/application/models/crm/Konto_model.php +++ b/application/models/crm/Konto_model.php @@ -100,8 +100,8 @@ class Konto_model extends DB_Model public function checkStudienbeitrag($uid, $stsem, $buchungstypen) { - $query = 'SELECT tbl_konto.buchungsnr, - tbl_konto.buchungsdatum + $query = 'SELECT tbl_konto.buchungsnr, + tbl_konto.buchungsdatum FROM public.tbl_konto, public.tbl_benutzer, public.tbl_student @@ -117,10 +117,47 @@ class Konto_model extends DB_Model FROM public.tbl_konto skonto WHERE skonto.buchungsnr = tbl_konto.buchungsnr_verweis OR skonto.buchungsnr_verweis = tbl_konto.buchungsnr_verweis - ) + ) ORDER BY buchungsnr DESC LIMIT 1 '; return $this->execQuery($query); } + + /** + * check if student has paid studienbeitrag for certain semester + * + * @param $person_id person_id + * @param $stsem stsem + * + * @return boolean + */ + public function checkStudienbeitragFromPerson($person_id, $stsem) + { + $this->addOrder('buchungsnr'); + $this->addLimit(1); + $result = $this->loadWhere([ + 'person_id'=>$person_id, + 'studiensemester_kurzbz' => $stsem, + 'buchungstyp_kurzbz' => 'Studiengebuehr' + ]); + + if (!getData($result)) + return false; + + $data = getData($result)[0]; + + $this->resetQuery(); + + $this->addSelect('sum(betrag) as differenz'); + $this->db->or_where('buchungsnr', $data->buchungsnr); + $this->db->or_where('buchungsnr_verweis', $data->buchungsnr); + + $result = $this->load(); + if (!getData($result)) + return false; + + $data = getData($result)[0]; + return $data->differenz >= 0; + } } diff --git a/application/models/crm/Prestudentstatus_model.php b/application/models/crm/Prestudentstatus_model.php index f39a41fda..620b897e6 100644 --- a/application/models/crm/Prestudentstatus_model.php +++ b/application/models/crm/Prestudentstatus_model.php @@ -2,6 +2,10 @@ class Prestudentstatus_model extends DB_Model { + + const STATUS_ABBRECHER = 'Abbrecher'; + const STATUS_UNTERBRECHER = 'Unterbrecher'; + /** * Constructor */ @@ -226,4 +230,90 @@ class Prestudentstatus_model extends DB_Model return $this->execQuery($query, $parametersArray); } + + /** + * get Email of relevant Studiengang of prestudent + */ + public function getLastStatusWithStgEmail($prestudent_id, $studiensemester_kurzbz = '', $status_kurzbz = '') + { + $this->addSelect('tbl_prestudentstatus.*, + tbl_studienplan.bezeichnung AS studienplan_bezeichnung, + tbl_studienplan.orgform_kurzbz AS orgform, + tbl_studienplan.sprache, + tbl_orgform.bezeichnung_mehrsprachig AS bezeichnung_orgform, + tbl_status.bezeichnung_mehrsprachig, + tbl_status_grund.bezeichnung_mehrsprachig AS bezeichnung_statusgrund, + tbl_studiengang.email'); + $this->addJoin('lehre.tbl_studienplan', 'studienplan_id', 'LEFT'); + $this->addJoin('lehre.tbl_studienordnung', 'studienordnung_id', 'LEFT'); + $this->addJoin('public.tbl_studiengang', 'studiengang_kz', 'LEFT'); + $this->addJoin('public.tbl_status', 'tbl_status.status_kurzbz = tbl_prestudentstatus.status_kurzbz'); + $this->addJoin('public.tbl_status_grund', 'statusgrund_id', 'LEFT'); + $this->addJoin('bis.tbl_orgform', 'tbl_studienplan.orgform_kurzbz = tbl_orgform.orgform_kurzbz', 'LEFT'); + $this->db->where('tbl_status.status_kurzbz = tbl_prestudentstatus.status_kurzbz'); + + $where = array('prestudent_id' => $prestudent_id); + if ($studiensemester_kurzbz) + $where['studiensemester_kurzbz'] = $studiensemester_kurzbz; + if ($status_kurzbz) + $where['tbl_prestudentstatus.status_kurzbz'] = $status_kurzbz; + + $this->addOrder('datum', 'DESC'); + $this->addOrder('insertamum', 'DESC'); + $this->addOrder('ext_id', 'DESC'); + $this->addLimit(1); + + return $this->loadWhere($where); + } + + public function loadLastWithStgDetails($prestudent_id, $studiensemester_kurzbz = null) + { + $this->load->config('studierendenantrag'); + + $lang = getUserLanguage(); + + $this->addSelect($this->dbTable . '.prestudent_id'); + $this->addSelect($this->dbTable . '.ausbildungssemester AS semester'); + $this->addSelect($this->dbTable . '.studiensemester_kurzbz'); + $this->addSelect('s.matrikelnr'); + $this->addSelect('ss.studienjahr_kurzbz'); + $this->addSelect('pers.vorname'); + $this->addSelect('pers.nachname'); + $this->addSelect('TRIM(CONCAT(pers.vorname, \' \', pers.nachname)) AS name'); + $this->addSelect('pers.person_id'); + $this->addSelect('g.studiengang_kz'); + $this->addSelect('g.bezeichnung'); + $this->addSelect('o.orgform_kurzbz'); + $this->addSelect( + 'o.bezeichnung_mehrsprachig[(SELECT index FROM public.tbl_sprache WHERE sprache=\'' . $lang . '\')] AS orgform_bezeichnung', + false + ); + + $this->addJoin('public.tbl_student s', 'prestudent_id'); + $this->addJoin('public.tbl_prestudent p', 'prestudent_id'); + $this->addJoin('public.tbl_studiensemester ss', 'studiensemester_kurzbz'); + $this->addJoin('public.tbl_person pers', 'person_id'); + $this->addJoin('public.tbl_studiengang g', 'p.studiengang_kz=g.studiengang_kz'); + $this->addJoin('bis.tbl_orgform o', 'g.orgform_kurzbz=o.orgform_kurzbz'); + + $this->addOrder($this->dbTable . '.datum', 'DESC'); + $this->addOrder($this->dbTable . '.insertamum', 'DESC'); + $this->addOrder($this->dbTable . '.ext_id', 'DESC'); + + $this->addLimit(1); + + $this->db->where_in($this->dbTable . '.status_kurzbz', $this->config->item('antrag_prestudentstatus_whitelist')); + + $whereArr = [ + $this->dbTable . '.prestudent_id' => $prestudent_id, + 'g.aktiv' => true + ]; + + if ($studiensemester_kurzbz !== null) + { + $whereArr[$this->dbTable. '.studiensemester_kurzbz'] = $studiensemester_kurzbz; + } + + return $this->loadWhere($whereArr); + } } diff --git a/application/models/education/Pruefung_model.php b/application/models/education/Pruefung_model.php index e3776c4ad..4236a5c6a 100644 --- a/application/models/education/Pruefung_model.php +++ b/application/models/education/Pruefung_model.php @@ -29,11 +29,148 @@ class Pruefung_model extends DB_Model JOIN lehre.tbl_pruefung prfg USING (student_uid) JOIN lehre.tbl_lehreinheit le USING (lehreinheit_id) JOIN lehre.tbl_lehrveranstaltung lv USING (lehrveranstaltung_id) - JOIN public.tbl_studiengang stg ON prst.studiengang_kz = stg.studiengang_kz + JOIN public.tbl_studiengang stg ON prst.studiengang_kz = stg.studiengang_kz WHERE pers.person_id = ? AND le.studiensemester_kurzbz = ? ORDER BY prfg.datum, pruefung_id'; return $this->execQuery($qry, array($person_id, $studiensemester_kurzbz)); } + + /** + * @param integer $prestudent_id student_uid + * + * @return stdClass + */ + public function loadWhereCommitteeExamFailedForPrestudent($prestudent_id) + { + $this->load->config('studierendenantrag'); + + $this->dbTable = 'lehre.tbl_pruefung p'; + + $this->addSelect('p.datum'); + $this->addSelect('pers.vorname'); + $this->addSelect('pers.nachname'); + $this->addSelect('s.matrikelnr'); + $this->addSelect('g.bezeichnung'); + $this->addSelect('g.studiengang_kz'); + $this->addSelect('o.bezeichnung_mehrsprachig'); + $this->addSelect('ps.prestudent_id'); + $this->addSelect('lv.bezeichnung as lvbezeichnung'); + $this->addSelect('le.studiensemester_kurzbz'); + $this->addSelect('a.typ'); + $this->addSelect('campus.get_status_studierendenantrag(a.studierendenantrag_id) status'); + + $this->addJoin('lehre.tbl_note n', 'note'); + $this->addJoin('lehre.tbl_lehreinheit le', 'lehreinheit_id'); + $this->addJoin('lehre.tbl_lehrveranstaltung lv', 'lehrveranstaltung_id'); + $this->addJoin('public.tbl_student s', 'student_uid'); + $this->addJoin('public.tbl_prestudent ps', 'prestudent_id'); + $this->addJoin('public.tbl_person pers', 'person_id'); + $this->addJoin('public.tbl_studiengang g', 'ps.studiengang_kz=g.studiengang_kz'); + $this->addJoin('bis.tbl_orgform o', 'g.orgform_kurzbz=o.orgform_kurzbz'); + $this->addJoin('campus.tbl_studierendenantrag a', 'ps.prestudent_id=a.prestudent_id', 'LEFT'); + + $this->db->where("n.positiv", false); + $this->db->where("p.pruefungstyp_kurzbz", 'kommPruef'); + $this->db->where("ps.prestudent_id", $prestudent_id); + $this->db->where_in("get_rolle_prestudent(ps.prestudent_id, NULL)", $this->config->item('antrag_prestudentstatus_whitelist')); + $this->db->where("g.aktiv", true); + + $this->db->where('lv.studiengang_kz not in( + SELECT ps.studiengang_kz + FROM + public.tbl_student s + JOIN public.tbl_prestudent ps USING (prestudent_id) + JOIN public.tbl_prestudentstatus pss USING (prestudent_id) + WHERE pss.statusgrund_id in ? + and ps.prestudent_id = ?)', null, false); + + $sql = $this->db->get_compiled_select($this->dbTable); + + return $this->execQuery($sql, [$this->config->item('status_gruende_wiederholer'), $prestudent_id]); + } + + public function getAllPrestudentsWhereCommitteeExamFailed($status, $maxDate, $minDate) + { + $this->load->config('studierendenantrag'); + $this->load->model('education/Studierendenantrag_model', 'StudierendenantragModel'); + + $this->dbTable = 'lehre.tbl_pruefung p'; + + $sprache_index = "SELECT index FROM public.tbl_sprache WHERE sprache='" . getUserLanguage() . "' LIMIT 1"; + + $this->addSelect('p.datum'); + $this->addSelect('pers.vorname'); + $this->addSelect('pers.nachname'); + $this->addSelect('pers.person_id'); + $this->addSelect('s.matrikelnr'); + $this->addSelect('g.bezeichnung'); + $this->addSelect('g.studiengang_kz'); + $this->addSelect('o.bezeichnung_mehrsprachig[(' . $sprache_index . ')] AS orgform', false); + $this->addSelect('ps.prestudent_id'); + $this->addSelect('lv.bezeichnung as lvbezeichnung'); + $this->addSelect('le.studiensemester_kurzbz'); + $this->addSelect('a.typ'); + $this->addSelect('campus.get_status_studierendenantrag(a.studierendenantrag_id) status'); + + $this->addJoin('lehre.tbl_note n', 'note'); + $this->addJoin('lehre.tbl_lehreinheit le', 'lehreinheit_id'); + $this->addJoin('lehre.tbl_lehrveranstaltung lv', 'lehrveranstaltung_id'); + $this->addJoin('public.tbl_student s', 'student_uid'); + $this->addJoin('public.tbl_prestudent ps', 'prestudent_id'); + $this->addJoin('public.tbl_person pers', 'person_id'); + $this->addJoin('public.tbl_benutzer b', 's.student_uid=b.uid'); + $this->addJoin('public.tbl_studiengang g', 'ps.studiengang_kz=g.studiengang_kz'); + $this->addJoin('bis.tbl_orgform o', 'g.orgform_kurzbz=o.orgform_kurzbz'); + $this->db->join('campus.tbl_studierendenantrag a', 'ps.prestudent_id=a.prestudent_id and a.typ = ?', 'LEFT', false); + + $this->db->where("n.positiv", false); + $this->db->where("p.pruefungstyp_kurzbz", 'kommPruef'); + $this->db->where_in("get_rolle_prestudent(ps.prestudent_id, null)", $this->config->item('antrag_prestudentstatus_whitelist')); + + if ($maxDate) + $this->db->where("p.datum < ", $maxDate->format('c')); + if ($minDate) + $this->db->where("p.datum > ", $minDate->format('c')); + $this->db->where("g.aktiv", true); + $this->db->where("b.aktiv", true); + + $this->db->where('lv.studiengang_kz not in( + SELECT ps.studiengang_kz + FROM + public.tbl_prestudent ps1 + JOIN public.tbl_prestudentstatus pss USING (prestudent_id) + WHERE pss.statusgrund_id in ? + AND ps.prestudent_id = ps1.prestudent_id)', null, false); + + // NOTE(chris): is Wiederholer without set statusgrund (legacy?) + $this->db->where('(SELECT COUNT(*) FROM (SELECT DISTINCT studiensemester_kurzbz FROM tbl_prestudentstatus _s WHERE ausbildungssemester=get_absem_prestudent(ps.prestudent_id, le.studiensemester_kurzbz) AND prestudent_id=ps.prestudent_id) a) = 1', null, false); + + if (is_array($status)) { + if (in_array(null, $status)) { + $status = array_filter($status); + if (count($status)) { + $this->db->group_start(); + $this->db->where_in('campus.get_status_studierendenantrag(a.studierendenantrag_id)', $status); + $this->db->or_where('campus.get_status_studierendenantrag(a.studierendenantrag_id)', null); + $this->db->group_end(); + } else { + $this->db->where('campus.get_status_studierendenantrag(a.studierendenantrag_id)', null); + } + } else { + $this->db->where_in('campus.get_status_studierendenantrag(a.studierendenantrag_id)', $status); + } + } else { + $this->db->where('campus.get_status_studierendenantrag(a.studierendenantrag_id)', $status); + } + + $sql = $this->db->get_compiled_select($this->dbTable); + + $statusgruende = $this->config->item('status_gruende_wiederholer'); + if (!is_array($statusgruende)) + $statusgruende = []; + + return $this->execQuery($sql, [Studierendenantrag_model::TYP_WIEDERHOLUNG, $statusgruende]); + } } diff --git a/application/models/education/Studierendenantrag_model.php b/application/models/education/Studierendenantrag_model.php new file mode 100644 index 000000000..bf993ca67 --- /dev/null +++ b/application/models/education/Studierendenantrag_model.php @@ -0,0 +1,229 @@ +dbTable = 'campus.tbl_studierendenantrag'; + $this->pk = 'studierendenantrag_id'; + + $this->load->config('studierendenantrag'); + + $this->load->model('education/Studierendenantragstatus_model', 'StudierendenantragstatusModel'); + } + + public function loadCreatedForStudiengaenge($studiengaenge, $typ) + { + return $this->loadForStudiengaenge($studiengaenge, $typ, $this->StudierendenantragstatusModel::STATUS_CREATED); + } + + public function loadForStudiengaenge($studiengaenge, $typ = null, $status = null) + { + $sql = "SELECT index FROM public.tbl_sprache WHERE sprache='" . getUserLanguage() . "' LIMIT 1"; + + $this->addSelect('stg.bezeichnung'); + $this->addSelect('bezeichnung_mehrsprachig[(' . $sql . ')] AS orgform', false); + $this->addSelect('s.studierendenantrag_id'); + $this->addSelect('matrikelnr'); + $this->addSelect('studienjahr_kurzbz'); + $this->addSelect('vorname'); + $this->addSelect('nachname'); + $this->addSelect('prestudent_id'); + $this->addSelect('p.studiengang_kz'); + $this->addSelect('semester'); + $this->addSelect($this->dbTable . '.grund'); + $this->addSelect('datum'); + $this->addSelect('datum_wiedereinstieg'); + $this->addSelect($this->dbTable . '.typ'); + $this->addSelect('st.studierendenantrag_statustyp_kurzbz as status'); + $this->addSelect('dms_id'); + $this->addSelect('st.bezeichnung[(' . $sql . ')] as statustyp'); + + $this->addJoin('public.tbl_prestudent p', 'prestudent_id'); + $this->addJoin('public.tbl_student', 'prestudent_id'); + $this->addJoin('public.tbl_person', 'person_id'); + $this->addJoin('public.tbl_studiengang stg', 'p.studiengang_kz=stg.studiengang_kz'); + $this->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz'); + $this->addJoin('bis.tbl_orgform', 'orgform_kurzbz'); + $this->addJoin('campus.tbl_studierendenantrag_status as s','campus.get_status_id_studierendenantrag('.$this->dbTable .'.studierendenantrag_id) = studierendenantrag_status_id' ); + $this->addJoin('campus.tbl_studierendenantrag_statustyp as st','studierendenantrag_statustyp_kurzbz' ); + + $this->db->where_in('p.studiengang_kz', $studiengaenge); + + $where = []; + if ($status !== null) + $where['st.studierendenantrag_statustyp_kurzbz'] = $status; + if ($typ !== null) + $where[$this->dbTable . '.typ'] = $typ; + + return $this->loadWhere($where); + } + + public function isInStudiengang($studierendenantrag_id, $studiengaenge) + { + $this->addJoin('public.tbl_prestudent', 'prestudent_id'); + + $this->db->where_in('studiengang_kz', $studiengaenge); + + return $this->load($studierendenantrag_id); + } + + public function loadIdAndStatusWhere($where) + { + $this->addSelect('studierendenantrag_id'); + $this->addSelect('campus.get_status_studierendenantrag(studierendenantrag_id) status'); + return $this->loadWhere($where); + } + + public function loadWithStatusWhere($where) + { + $lang = 'SELECT index FROM public.tbl_sprache WHERE sprache=' . $this->escape(getUserLanguage()); + + $this->addSelect('*'); + $this->addSelect('campus.get_status_studierendenantrag(studierendenantrag_id) status'); + $this->addSelect('t.bezeichnung[(' . $lang . ')] statustyp'); + + $this->addJoin( + 'campus.tbl_studierendenantrag_statustyp t', + 'campus.get_status_studierendenantrag(studierendenantrag_id)=t.studierendenantrag_statustyp_kurzbz' + ); + + $this->addOrder('datum', 'DESC'); + + return $this->loadWhere($where); + } + + /** + * Get the studiengang and ausbildungssemester the student was in + * for the studiensemester the antrag was committed for + * + * @param integer $antrag_id + * + * @return stdClass + */ + public function getStgAndSem($antrag_id) + { + $this->addSelect('p.studiengang_kz'); + $this->addSelect('s.ausbildungssemester'); + $this->addSelect('s.orgform_kurzbz'); + + $this->addJoin( + 'public.tbl_prestudentstatus s', + $this->dbTable . '.prestudent_id=s.prestudent_id AND ' . $this->dbTable . '.studiensemester_kurzbz=s.studiensemester_kurzbz' + ); + $this->addJoin('public.tbl_prestudent p', $this->dbTable . '.prestudent_id=p.prestudent_id'); + + $this->addOrder('s.datum', 'DESC'); + $this->addOrder('s.insertamum', 'DESC'); + $this->addOrder('s.ext_id', 'DESC'); + + $this->addLimit(1); + + $this->db->where_in('s.status_kurzbz', $this->config->item('antrag_prestudentstatus_whitelist')); + + return $this->loadWhere([ + $this->pk => $antrag_id + ]); + } + + /** + * Get the studiengang the student is in + * + * @param integer $antrag_id + * + * @return stdClass + */ + public function getStg($antrag_id) + { + $this->addSelect('p.studiengang_kz'); + $this->addJoin('public.tbl_prestudent p', 'prestudent_id'); + + $this->addLimit(1); + + return $this->load( + $antrag_id + ); + } + + public function getStgEmail($antrag_id) + { + $this->addJoin('public.tbl_prestudent p', 'prestudent_id'); + $this->addJoin('public.tbl_studiengang sg', 'studiengang_kz'); + $this->addSelect('sg.email'); + + return $this->load($antrag_id); + } + + public function loadForPerson($person_id) + { + $lang = 'SELECT index FROM public.tbl_sprache WHERE sprache=' . $this->escape(getUserLanguage()); + $this->addSelect('stg.bezeichnung'); + $this->addSelect('bezeichnung_mehrsprachig[(' . $lang . ')] as orgform'); + $this->addSelect('p.studiengang_kz'); + $this->addSelect('st.studierendenantrag_statustyp_kurzbz as status'); + $this->addSelect('st.bezeichnung[(' . $lang . ')] as status_bezeichnung'); + $this->addSelect('p.prestudent_id'); + $this->addSelect($this->dbTable . '.studierendenantrag_id'); + $this->addSelect($this->dbTable . '.studiensemester_kurzbz'); + $this->addSelect($this->dbTable . '.datum'); + $this->addSelect($this->dbTable . '.typ'); + $this->addSelect($this->dbTable . '.insertamum'); + $this->addSelect($this->dbTable . '.insertvon'); + $this->addSelect($this->dbTable . '.datum_wiedereinstieg'); + $this->addSelect($this->dbTable . '.grund'); + $this->addSelect($this->dbTable . '.dms_id'); + + $this->addJoin('public.tbl_prestudent p', 'prestudent_id', 'RIGHT'); + $this->addJoin('public.tbl_studiengang stg', 'p.studiengang_kz=stg.studiengang_kz'); + $this->addJoin('bis.tbl_orgform', 'orgform_kurzbz'); + $this->addJoin('campus.tbl_studierendenantrag_statustyp st', 'campus.get_status_studierendenantrag(studierendenantrag_id)=st.studierendenantrag_statustyp_kurzbz','LEFT'); + + $this->db->where_in('public.get_rolle_prestudent(p.prestudent_id, null)', $this->config->item('antrag_prestudentstatus_whitelist')); + + return $this->loadWhere([ + 'p.person_id' => $person_id + ]); + } + + public function getAntraegeWhereWiedereinstiegBetween($start, $end) + { + $this->addSelect('sg.email'); + $this->addSelect('vorname'); + $this->addSelect('nachname'); + $this->addSelect($this->dbTable.'.*'); + + $this->addJoin( + 'campus.tbl_studierendenantrag_status s', + 'campus.get_status_id_studierendenantrag(' . $this->dbTable . '.studierendenantrag_id)=s.studierendenantrag_status_id' + ); + $this->addJoin('public.tbl_prestudent p', 'prestudent_id'); + $this->addJoin('public.tbl_person', 'person_id'); + $this->addJoin('public.tbl_studiengang sg', 'studiengang_kz'); + + $this->db->where('datum_wiedereinstieg >=', $start->format('Y-m-d')); + $this->db->where('datum_wiedereinstieg <=', $end->format('Y-m-d')); + + return $this->loadWhere([ + 's.studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_APPROVED, + $this->dbTable.'.typ' => self::TYP_UNTERBRECHUNG, + ]); + } + + public function getWithLastStatusWhere($where) + { + $this->addJoin( + 'campus.tbl_studierendenantrag_status s', + 'campus.get_status_id_studierendenantrag(' . $this->dbTable . '.studierendenantrag_id)=s.studierendenantrag_status_id' + ); + + return $this->loadWhere($where); + } +} diff --git a/application/models/education/Studierendenantraglehrveranstaltung_model.php b/application/models/education/Studierendenantraglehrveranstaltung_model.php new file mode 100644 index 000000000..88d591053 --- /dev/null +++ b/application/models/education/Studierendenantraglehrveranstaltung_model.php @@ -0,0 +1,79 @@ +dbTable = 'campus.tbl_studierendenantrag_lehrveranstaltung'; + $this->pk = 'studierendenantrag_lehrveranstaltung_id'; + } + + public function insertBatch($data) + { + // Check class properties + if (is_null($this->dbTable)) return error('The given database table name is not valid', EXIT_MODEL); + + // DB-INSERT + $insert = $this->db->insert_batch($this->dbTable, $data); + + if ($insert) + { + return success(); + } + else + { + return error($this->db->error(), EXIT_DATABASE); + } + } + + public function deleteWhere($where) + { + if (is_null($this->dbTable)) return error('The given database table name is not valid', EXIT_MODEL); + + $delete = $this->db->delete($this->dbTable, $where); + + if ($delete) + { + return success(); + } + else + { + return error($this->db->error(), EXIT_DATABASE); + } + } + + public function getLvsForPrestudent($prestudent_id, $studiensemester_kurzbz) + { + $this->addSelect($this->dbTable . '.*'); + $this->addSelect('a.prestudent_id'); + $this->addSelect('lv.bezeichnung as lv_bezeichnung'); + $this->addSelect('stat.insertamum as freigabedatum'); + $this->addSelect('n.bezeichnung as note_bezeichnung'); + $this->addSelect('stg.bezeichnung as stg_bezeichnung'); + + $this->addJoin('campus.tbl_studierendenantrag a', 'studierendenantrag_id'); + $this->addJoin('lehre.tbl_note n', 'note'); + $this->addJoin('lehre.tbl_lehrveranstaltung lv', 'lehrveranstaltung_id'); + $this->addJoin('public.tbl_prestudent ps', 'prestudent_id'); + $this->addJoin('public.tbl_studiengang stg', 'ps.studiengang_kz = stg.studiengang_kz'); + $this->addJoin( + 'campus.tbl_studierendenantrag_status stat', + 'stat.studierendenantrag_status_id = campus.get_status_id_studierendenantrag(a.studierendenantrag_id)' + ); + $this->addJoin('public.tbl_student s', 'prestudent_id'); + $this->addJoin('lehre.tbl_zeugnisnote z', 'z.lehrveranstaltung_id=lv.lehrveranstaltung_id AND z.student_uid=s.student_uid AND z.studiensemester_kurzbz=a.studiensemester_kurzbz', 'LEFT'); + + return $this->loadWhere([ + 'ps.prestudent_id' => $prestudent_id, + 'a.typ' => Studierendenantrag_model::TYP_WIEDERHOLUNG, + 'stat.studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_APPROVED, + 'n.note <> ' => 0, + $this->dbTable . '.studiensemester_kurzbz' => $studiensemester_kurzbz, + '(n.note<>19 OR z.note IS NOT NULL)' => null + ]); + } +} diff --git a/application/models/education/Studierendenantragstatus_model.php b/application/models/education/Studierendenantragstatus_model.php new file mode 100644 index 000000000..6994c4624 --- /dev/null +++ b/application/models/education/Studierendenantragstatus_model.php @@ -0,0 +1,52 @@ +dbTable = 'campus.tbl_studierendenantrag_status'; + $this->pk = 'studierendenantrag_status_id'; + } + + public function loadWithTyp($studierendenantrag_status_id) + { + $lang = 'SELECT index FROM public.tbl_sprache WHERE sprache=' . $this->escape(getUserLanguage()); + + $this->addSelect($this->dbTable . '.*'); + $this->addSelect('bezeichnung[(' . $lang . ')] AS typ'); + + $this->addJoin('campus.tbl_studierendenantrag_statustyp', 'studierendenantrag_statustyp_kurzbz'); + + return $this->load($studierendenantrag_status_id); + } + + public function loadWithTypWhere($where) + { + $lang = 'SELECT index FROM public.tbl_sprache WHERE sprache=' . $this->escape(getUserLanguage()); + + $this->addSelect($this->dbTable . '.*'); + $this->addSelect('bezeichnung[(' . $lang . ')] AS typ'); + + $this->addJoin('campus.tbl_studierendenantrag_statustyp', 'studierendenantrag_statustyp_kurzbz'); + + return $this->loadWhere($where); + } +} diff --git a/application/models/education/Zeugnisnote_model.php b/application/models/education/Zeugnisnote_model.php index a4185a7f4..b4d909e37 100644 --- a/application/models/education/Zeugnisnote_model.php +++ b/application/models/education/Zeugnisnote_model.php @@ -102,7 +102,7 @@ class Zeugnisnote_model extends DB_Model JOIN lehre.tbl_zeugnisnote zgnisnote USING (student_uid) JOIN lehre.tbl_note note ON zgnisnote.note = note.note JOIN lehre.tbl_lehrveranstaltung lv USING (lehrveranstaltung_id) - JOIN public.tbl_studiengang stg ON prst.studiengang_kz = stg.studiengang_kz + JOIN public.tbl_studiengang stg ON prst.studiengang_kz = stg.studiengang_kz WHERE pers.person_id = ? AND zgnisnote.studiensemester_kurzbz = ?"; @@ -140,4 +140,83 @@ class Zeugnisnote_model extends DB_Model return $this->execQuery($qry, $params); } + + /** + * Gets courses (Zeugnisnoten) for a student. + * @param string $student_uid, + * @param string $studiensemester_kurzbz + * + * @return object + */ + public function getZeugnisnoten($student_uid, $studiensemester_kurzbz) + { + $params = array(); + $where=''; + + if ($student_uid != null) + { + $where .= " AND uid=?"; + $params[] = $student_uid; + } + if ($studiensemester_kurzbz !=null) + { + $where.=" AND vw_student_lehrveranstaltung.studiensemester_kurzbz= ?"; + $params[] = $studiensemester_kurzbz; + } + + $where2=''; + + if ($student_uid != null) + { + $where2 .= " AND student_uid=?"; + $params[] = $student_uid; + } + if ($studiensemester_kurzbz !=null) + { + $where2 .= " AND studiensemester_kurzbz= ?"; + $params[] = $studiensemester_kurzbz; + } + + $qry = "SELECT vw_student_lehrveranstaltung.lehrveranstaltung_id, uid, + vw_student_lehrveranstaltung.studiensemester_kurzbz, note, punkte, uebernahmedatum, benotungsdatum, + vw_student_lehrveranstaltung.ects, vw_student_lehrveranstaltung.semesterstunden, + tbl_zeugnisnote.updateamum, tbl_zeugnisnote.updatevon, tbl_zeugnisnote.insertamum, + tbl_zeugnisnote.insertvon, tbl_zeugnisnote.ext_id, + vw_student_lehrveranstaltung.bezeichnung as lehrveranstaltung_bezeichnung, + vw_student_lehrveranstaltung.bezeichnung_english as lehrveranstaltung_bezeichnung_english, + tbl_note.bezeichnung as note_bezeichnung, + tbl_note.positiv as note_positiv, + tbl_zeugnisnote.bemerkung as bemerkung, + vw_student_lehrveranstaltung.sort, + vw_student_lehrveranstaltung.zeugnis, + vw_student_lehrveranstaltung.studiengang_kz, + vw_student_lehrveranstaltung.lv_lehrform_kurzbz, + tbl_lehrveranstaltung.sws + FROM + ( + campus.vw_student_lehrveranstaltung LEFT JOIN lehre.tbl_zeugnisnote + ON(uid=student_uid + AND vw_student_lehrveranstaltung.studiensemester_kurzbz=tbl_zeugnisnote.studiensemester_kurzbz + AND vw_student_lehrveranstaltung.lehrveranstaltung_id=tbl_zeugnisnote.lehrveranstaltung_id + ) + ) LEFT JOIN lehre.tbl_note USING(note) + JOIN lehre.tbl_lehrveranstaltung ON(vw_student_lehrveranstaltung.lehrveranstaltung_id=tbl_lehrveranstaltung.lehrveranstaltung_id) + WHERE true $where + + UNION + SELECT lehre.tbl_lehrveranstaltung.lehrveranstaltung_id,student_uid AS uid,studiensemester_kurzbz, note, punkte, + uebernahmedatum, benotungsdatum,lehre.tbl_lehrveranstaltung.ects,lehre.tbl_lehrveranstaltung.semesterstunden, tbl_zeugnisnote.updateamum, tbl_zeugnisnote.updatevon, tbl_zeugnisnote.insertamum, + tbl_zeugnisnote.insertvon, tbl_zeugnisnote.ext_id, lehre.tbl_lehrveranstaltung.bezeichnung as lehrveranstaltung_bezeichnung, lehre.tbl_lehrveranstaltung.bezeichnung_english as lehrveranstaltung_bezeichnung_english, + tbl_note.bezeichnung as note_bezeichnung, tbl_note.positiv as note_positiv, tbl_zeugnisnote.bemerkung as bemerkung, tbl_lehrveranstaltung.sort, tbl_lehrveranstaltung.zeugnis, tbl_lehrveranstaltung.studiengang_kz, + tbl_lehrveranstaltung.lehrform_kurzbz as lv_lehrform_kurzbz, tbl_lehrveranstaltung.sws + FROM + lehre.tbl_zeugnisnote + JOIN lehre.tbl_lehrveranstaltung USING (lehrveranstaltung_id) + JOIN lehre.tbl_note USING(note) + WHERE true $where2 + + ORDER BY sort"; + + return $this->execQuery($qry, $params); + } } diff --git a/application/models/organisation/Studiengang_model.php b/application/models/organisation/Studiengang_model.php index f4f8b3c9e..ea9e5857e 100644 --- a/application/models/organisation/Studiengang_model.php +++ b/application/models/organisation/Studiengang_model.php @@ -511,10 +511,10 @@ class Studiengang_model extends DB_Model public function getStudiengangTyp($studiengang_kz, $typ = null) { $query = "SELECT DISTINCT(sgt.*) - FROM tbl_studiengangstyp sgt JOIN tbl_studiengang sg on sgt.typ = sg.typ + FROM tbl_studiengangstyp sgt JOIN tbl_studiengang sg on sgt.typ = sg.typ WHERE studiengang_kz IN ?"; - $params[] = $studiengang_kz; + $params = [$studiengang_kz]; if (!is_null($typ)) { @@ -524,4 +524,53 @@ class Studiengang_model extends DB_Model return $this->execQuery($query, $params); } + + /** + * @param array $studiengang_kzs + * @param array $not_antrag_typ (optional) If the prestudent has an antrag with one of the specified types it will be excluded from the result + * @param array $prestudent_stati (optional) + * + * @return stdClass + */ + public function getAktivePrestudenten($studiengang_kzs, $not_antrag_typ = null) + { + $this->load->config('studierendenantrag'); + + $sql = "SELECT index FROM public.tbl_sprache WHERE sprache='" . getUserLanguage() . "' LIMIT 1"; + + $this->addSelect($this->dbTable . '.studiengang_kz'); + $this->addSelect($this->dbTable . '.bezeichnung'); + $this->addSelect('o.orgform_kurzbz'); + $this->addSelect('o.bezeichnung_mehrsprachig[(' . $sql . ')] AS orgform', false); + $this->addSelect('ps.ausbildungssemester AS semester'); + $this->addSelect('ps.studiensemester_kurzbz'); + $this->addSelect('p.prestudent_id'); + $this->addSelect('pers.vorname'); + $this->addSelect('pers.nachname'); + + $this->addJoin('public.tbl_prestudent p', 'studiengang_kz'); + $this->addJoin( + 'public.tbl_prestudentstatus ps', + 'ps.prestudent_id=p.prestudent_id + AND ps.studiensemester_kurzbz=get_stdsem_prestudent(p.prestudent_id, NULL) + AND ps.ausbildungssemester=get_absem_prestudent(p.prestudent_id, NULL) + AND ps.status_kurzbz=get_rolle_prestudent(p.prestudent_id, NULL)' + ); + $this->addJoin('bis.tbl_orgform o', $this->dbTable . '.orgform_kurzbz=o.orgform_kurzbz'); + $this->addJoin('public.tbl_person pers', 'person_id'); + + $this->db->where_in($this->dbTable . '.studiengang_kz', $studiengang_kzs); + $this->db->where_in('ps.status_kurzbz', $this->config->item('antrag_prestudentstatus_whitelist')); + $this->db->where($this->dbTable . ".aktiv", true); + + if ($not_antrag_typ !== null && is_array($not_antrag_typ)) { + $this->addJoin('campus.tbl_studierendenantrag a', 'a.prestudent_id=p.prestudent_id', 'LEFT'); + $this->db->group_start(); + $this->db->where_not_in('a.typ', $not_antrag_typ); + $this->db->or_where('a.typ IS NULL'); + $this->db->group_end(); + } + + return $this->load(); + } } diff --git a/application/models/organisation/Studienplan_model.php b/application/models/organisation/Studienplan_model.php index 0cc23b85d..66ec06ba8 100644 --- a/application/models/organisation/Studienplan_model.php +++ b/application/models/organisation/Studienplan_model.php @@ -45,7 +45,7 @@ class Studienplan_model extends DB_Model $whereArray["tbl_studienplan.sprache"] = $sprache; } - return $this->StudienplanModel->loadWhere($whereArray); + return $this->loadWhere($whereArray); } public function getStudienplanLehrveranstaltung($studienplan_id, $semester) @@ -53,6 +53,38 @@ class Studienplan_model extends DB_Model $this->addJoin('lehre.tbl_studienplan_lehrveranstaltung', 'studienplan_id'); $this->addJoin('lehre.tbl_lehrveranstaltung', 'lehrveranstaltung_id'); $this->addOrder('tbl_lehrveranstaltung.sort'); + + return $this->loadWhere(array( + 'studienplan_id' => $studienplan_id, + 'tbl_studienplan_lehrveranstaltung.semester' => $semester + )); + } + + public function getStudienplanLehrveranstaltungForPrestudent($studienplan_id, $semester, $prestudent_id, $note_stsem) + { + $lang = 'SELECT index FROM public.tbl_sprache WHERE sprache=' . $this->escape(getUserLanguage()); + $sql = 'SELECT student_uid FROM public.tbl_student WHERE prestudent_id=' . $this->escape($prestudent_id); + + $this->addSelect($this->dbTable . '.*'); + $this->addSelect('lv.*'); + $this->addSelect('COALESCE(n.bezeichnung_mehrsprachig[(' . $lang . ')], NULL) AS note'); + $this->addSelect('n.positiv'); + $this->addSelect('lehre.tbl_studienplan_lehrveranstaltung.studienplan_lehrveranstaltung_id'); + $this->addSelect('lehre.tbl_studienplan_lehrveranstaltung.sort plan_sort'); + $this->addSelect('lehre.tbl_studienplan_lehrveranstaltung.studienplan_lehrveranstaltung_id_parent'); + + $this->addJoin('lehre.tbl_studienplan_lehrveranstaltung', 'studienplan_id'); + $this->addJoin('lehre.tbl_lehrveranstaltung lv', 'lehrveranstaltung_id'); + $this->addJoin( + 'lehre.tbl_zeugnisnote zn', + 'zn.lehrveranstaltung_id=lv.lehrveranstaltung_id AND zn.student_uid=(' . $sql . ') AND zn.studiensemester_kurzbz=' . $this->escape($note_stsem), + 'LEFT' + ); + $this->addJoin('lehre.tbl_note n', 'n.note=zn.note', 'LEFT'); + + $this->addOrder('lehre.tbl_studienplan_lehrveranstaltung.sort'); + $this->addOrder('lv.sort'); + return $this->loadWhere(array( 'studienplan_id' => $studienplan_id, 'tbl_studienplan_lehrveranstaltung.semester' => $semester diff --git a/application/models/organisation/Studiensemester_model.php b/application/models/organisation/Studiensemester_model.php index bb9b94c92..6daa76b59 100644 --- a/application/models/organisation/Studiensemester_model.php +++ b/application/models/organisation/Studiensemester_model.php @@ -204,4 +204,34 @@ class Studiensemester_model extends DB_Model return $this->execQuery($query, array($studiensemester_kurzbz)); } + + public function getFollowingSemester($studienplan_ids, $studiensemester_kurzbz, $ausbildungssemester) + { + $query = ' + WITH RECURSIVE following(studiensemester_kurzbz, semester, start) AS ( + SELECT studiensemester_kurzbz, ?, start + FROM public.tbl_studiensemester + WHERE studiensemester_kurzbz=? + UNION ALL + SELECT * FROM ( + SELECT s.studiensemester_kurzbz, s.semester, ss.start + FROM lehre.tbl_studienplan_semester s + JOIN public.tbl_studiensemester ss USING(studiensemester_kurzbz) + INNER JOIN following a ON(s.semester=a.semester+1 AND ss.start > a.start) + WHERE studienplan_id IN ? + ORDER BY start ASC + LIMIT 1 + ) wrapper + ) + SELECT sem.*, following.semester + FROM following + LEFT JOIN ' . $this->dbTable . ' sem USING(studiensemester_kurzbz) + ORDER BY start'; + + return $this->execQuery($query, [ + $ausbildungssemester, + $studiensemester_kurzbz, + $studienplan_ids + ]); + } } diff --git a/application/models/person/Person_model.php b/application/models/person/Person_model.php index 8875fd4c5..b946ad11f 100644 --- a/application/models/person/Person_model.php +++ b/application/models/person/Person_model.php @@ -335,4 +335,17 @@ class Person_model extends DB_Model return $this->execQuery($qry, array($person_id, $person_id, $person_id)); } + + public function loadPrestudent($prestudent_id) + { + $this->addSelect($this->dbTable . '.*'); + + $this->addJoin('public.tbl_prestudent p', 'person_id'); + + $this->addLimit(1); + + return $this->loadWhere([ + 'prestudent_id' => $prestudent_id + ]); + } } diff --git a/application/views/lehre/Antrag/Create.php b/application/views/lehre/Antrag/Create.php new file mode 100644 index 000000000..87c9c3af6 --- /dev/null +++ b/application/views/lehre/Antrag/Create.php @@ -0,0 +1,54 @@ + 'Antrag auf Änderung des Studierendenstatus', + 'cis' => true, + 'vue3' => true, + 'axios027' => true, + 'bootstrap5' => true, + 'fontawesome6' => true, + 'phrases' => array( + ), + 'customJSModules' => array('public/js/apps/lehre/Antrag.js'), + 'customCSSs' => array( + 'public/css/Fhc.css', + 'vendor/vuepic/vue-datepicker-css/main.css' + ), + 'customJSs' => array( + ) +); + +$this->load->view( + 'templates/FHC-Header', + $sitesettings +); +?> + +
+
+

p->t('studierendenantrag', 'antrag_header'); ?>

+
+ +
+
+ + +
+
+ + +
+
+
+ +load->view( + 'templates/FHC-Footer', + $sitesettings +); diff --git a/application/views/lehre/Antrag/Leitung/List.php b/application/views/lehre/Antrag/Leitung/List.php new file mode 100644 index 000000000..a0c6cdab0 --- /dev/null +++ b/application/views/lehre/Antrag/Leitung/List.php @@ -0,0 +1,58 @@ + 'Anträge auf Änderung des Studierendenstatus', + 'cis' => true, + 'vue3' => true, + 'axios027' => true, + 'bootstrap5' => true, + 'tabulator5' => true, + 'fontawesome6' => true, + 'primevue3' => true, + 'phrases' => array( + 'global', + 'studierendenantrag', + 'lehre', + 'person', + ), + 'customJSModules' => array('public/js/apps/lehre/Antrag/Leitung.js'), + 'customCSSs' => array( + 'public/css/Fhc.css' + ), + 'customJSs' => array( + ) +); + +$this->load->view( + 'templates/FHC-Header', + $sitesettings +); +?> + +
+
+

p->t('studierendenantrag', 'antraege_header'); ?>

+
+ +
+
+ + + + +
+
+
+
+
+ +load->view( + 'templates/FHC-Footer', + $sitesettings +); diff --git a/application/views/lehre/Antrag/Student/List.php b/application/views/lehre/Antrag/Student/List.php new file mode 100644 index 000000000..26b0ec3f1 --- /dev/null +++ b/application/views/lehre/Antrag/Student/List.php @@ -0,0 +1,151 @@ + 'Antrag auf Änderung des Studierendenstatus', + 'cis' => true, + 'vue3' => true, + 'axios027' => true, + 'bootstrap5' => true, + 'fontawesome6' => true, + 'phrases' => array( + ), + 'customJSModules' => array('public/js/apps/lehre/Antrag/Student.js'), + 'customCSSs' => array( + 'public/css/Fhc.css' + ), + 'customJSs' => array( + ) +); + +$this->load->view( + 'templates/FHC-Header', + $sitesettings +); +?> + +
+ +
+

p->t('studierendenantrag', 'antraege_header'); ?>

+
+ +
+
+ + $array){ ?> +

()

+ + + + p->t('studierendenantrag', 'btn_new'); ?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#p->t('studierendenantrag', 'antrag_typ'); ?>p->t('studierendenantrag', 'antrag_status'); ?>p->t('studierendenantrag', 'antrag_studiensemester'); ?>p->t('studierendenantrag', 'antrag_erstelldatum'); ?>p->t('studierendenantrag', 'antrag_datum_wiedereinstieg'); ?>p->t('studierendenantrag', 'antrag_grund'); ?>p->t('studierendenantrag', 'antrag_dateianhaenge'); ?> 
studierendenantrag_id; ?>p->t('studierendenantrag', 'antrag_typ_' . $antrag->typ); ?>status_bezeichnung; ?>studiensemester_kurzbz; ?>datum))->format('d.m.Y'); ?>datum_wiedereinstieg ? (new DateTime($antrag->datum_wiedereinstieg))->format('d.m.Y') : ''; ?> + grund){ ?> + + p->t('studierendenantrag', 'antrag_grund'); ?> + + + + + + + dms_id) {?> + + p->t('studierendenantrag', 'antrag_anhang'); ?> + + + + + typ != Studierendenantrag_model::TYP_WIEDERHOLUNG && $antrag->status == Studierendenantragstatus_model::STATUS_APPROVED) { ?> + + + typ == Studierendenantrag_model::TYP_WIEDERHOLUNG && $antrag->status == Studierendenantragstatus_model::STATUS_APPROVED) { ?> + + p->t('studierendenantrag', 'btn_show_lvs'); ?> + + + p->t('studierendenantrag', 'my_lvs'); ?> + + +
+ + + + +
+
+
+
+
+ +load->view( + 'templates/FHC-Footer', + $sitesettings +); diff --git a/application/views/lehre/Antrag/Wiederholung/Student.php b/application/views/lehre/Antrag/Wiederholung/Student.php new file mode 100644 index 000000000..1aa72ee69 --- /dev/null +++ b/application/views/lehre/Antrag/Wiederholung/Student.php @@ -0,0 +1,43 @@ + 'Antrag Wiederholung vom Studium', + 'cis' => true, + 'vue3' => true, + 'axios027' => true, + 'bootstrap5' => true, + 'fontawesome6' => true, + 'tabulator5' => true, + 'phrases' => array( + 'ui', + 'lehre', + 'global' + ), + 'customJSModules' => array('public/js/apps/lehre/Antrag/Lvzuweisung.js'), + 'customCSSs' => array( + ), + 'customJSs' => array( + ) +); + +$this->load->view( + 'templates/FHC-Header', + $sitesettings +); +?> + +
+ +
+

p->t('studierendenantrag', 'title_lvzuweisen', ['name' => $antrag->name]);?>

+
+ +
+ status != Studierendenantragstatus_model::STATUS_CREATED && $antrag->status != Studierendenantragstatus_model::STATUS_LVSASSIGNED) ? ' disabled' : ''; ?>> +
+
+ +load->view( + 'templates/FHC-Footer', + $sitesettings +); diff --git a/application/views/lehre/Antrag/Wiederholung/getLvs.rdf.php b/application/views/lehre/Antrag/Wiederholung/getLvs.rdf.php new file mode 100644 index 000000000..24eb1e23f --- /dev/null +++ b/application/views/lehre/Antrag/Wiederholung/getLvs.rdf.php @@ -0,0 +1,31 @@ + + + + + + freigabedatum); ?> + insertamum); ?> + + + studierendenantrag_lehrveranstaltung_id; ?>]]> + lehrveranstaltung_id; ?>]]> + prestudent_id; ?>]]> + insertvon; ?>]]> + studiensemester_kurzbz; ?>]]> + note; ?>]]> + format('c'); ?>]]> + format('d.m.Y'); ?>]]> + format('c'); ?>]]> + format('d.m.Y'); ?>]]> + note_bezeichnung; ?>]]> + lv_bezeichnung; ?>]]> + stg_bezeichnung; ?>]]> + + + + + + diff --git a/application/views/lehre/Antrag/Wiederholung/moveLvs.rdf.php b/application/views/lehre/Antrag/Wiederholung/moveLvs.rdf.php new file mode 100644 index 000000000..4ed31218d --- /dev/null +++ b/application/views/lehre/Antrag/Wiederholung/moveLvs.rdf.php @@ -0,0 +1,17 @@ + + + + + + + ]]> + + + + + + diff --git a/application/views/templates/FHC-Common.php b/application/views/templates/FHC-Common.php index dd1d8ae1c..0928f516a 100644 --- a/application/views/templates/FHC-Common.php +++ b/application/views/templates/FHC-Common.php @@ -34,6 +34,7 @@ // Internal resources $ajaxlib = isset($ajaxlib) ? $ajaxlib : false; $bootstrapper = isset($bootstrapper) ? $bootstrapper : false; + $cis = isset($cis) ? $cis : false; $dialoglib = isset($dialoglib) ? $dialoglib : false; $filtercomponent = isset($filtercomponent) ? $filtercomponent : false; $filterwidget = isset($filterwidget) ? $filterwidget : false; @@ -43,4 +44,3 @@ $tablewidget = isset($tablewidget) ? $tablewidget : false; $udfs = isset($udfs) ? $udfs : false; $widgets = isset($widgets) ? $widgets : false; - diff --git a/application/views/templates/FHC-Header.php b/application/views/templates/FHC-Header.php index aa63541c5..b87a6e6d0 100644 --- a/application/views/templates/FHC-Header.php +++ b/application/views/templates/FHC-Header.php @@ -118,6 +118,9 @@ // HTML Widget CSS if ($widgets === true) generateCSSsInclude('public/css/Widgets.css'); + // CIS + if ($cis === true) generateCSSsInclude('public/css/cis_bs5.css'); + // Eventually required CSS generateCSSsInclude($customCSSs); // Eventually required CSS ?> diff --git a/cis/private/pdfExport.php b/cis/private/pdfExport.php index 4535ff74d..6db6f885a 100644 --- a/cis/private/pdfExport.php +++ b/cis/private/pdfExport.php @@ -144,6 +144,8 @@ if (isset($_GET['projektarbeit_id'])) $params .= '&projektarbeit_id='. $_GET['projektarbeit_id']; if (isset($_GET['betreuerart_kurzbz'])) $params .= '&betreuerart_kurzbz='. $_GET['betreuerart_kurzbz']; +if (isset($_GET['id'])) + $params .= '&id='. $_GET['id']; // Logeintrag bei Download von Zahlungsbestaetigungen diff --git a/cis/private/profile/dokumente.php b/cis/private/profile/dokumente.php index f75529561..16fc9a085 100644 --- a/cis/private/profile/dokumente.php +++ b/cis/private/profile/dokumente.php @@ -31,6 +31,7 @@ require_once('../../../include/akte.class.php'); require_once('../../../include/datum.class.php'); require_once('../../../include/benutzerberechtigung.class.php'); require_once('../../../include/webservicelog.class.php'); +require_once('../../../include/studierendenantrag.class.php'); $sprache = getSprache(); $p = new phrasen($sprache); @@ -228,6 +229,27 @@ echo '

'; // Wenn es für das übergebene Studiensemester keinen PreStudentStatus gibt, werden nur Abschlussdokumente angezeigt if (in_array($stsem, $stsem_arr)) { + $studierendenantrag = new studierendenantrag(); + if ($studierendenantrag->loadUserAntrag($student_studiengang->prestudent_id, $stsem) && $studierendenantrag->result) { + // TODO(chris): Phrasen! + echo '

' . $p->t('tools/studierendenantrag') . '

'; + echo ' + + + + + + + '; + foreach ($studierendenantrag->result as $antrag) { + $path = "../pdfExport.php?xsl=Antrag" . $antrag->typ . "&xml=Antrag" . $antrag->typ . ".xml.php&uid=" . $uid . "&id=" . $antrag->studierendenantrag_id; + echo ''; + echo ''; + } + echo '
'.$p->t('global/name').'
' . $p->t('tools/studierendenantrag_' . $antrag->typ) . '
'; + } + + $konto = new konto(); $buchungstypen = array(); diff --git a/composer.json b/composer.json index 825ed5625..739ee4492 100644 --- a/composer.json +++ b/composer.json @@ -26,6 +26,28 @@ "wiki": "https://wiki.fhcomplete.info/doku.php" }, "repositories": [ + { + "type": "package", + "package": { + "name": "vuepic/vue-datepicker-js", + "version": "4.0.0", + "dist": { + "url": "https://unpkg.com/@vuepic/vue-datepicker@4.0.0/dist/vue-datepicker.iife.js", + "type": "file" + } + } + }, + { + "type": "package", + "package": { + "name": "vuepic/vue-datepicker-css", + "version": "4.0.0", + "dist": { + "url": "https://unpkg.com/@vuepic/vue-datepicker@4.0.0/dist/main.css", + "type": "file" + } + } + }, { "type": "package", "package": { @@ -420,7 +442,9 @@ "twbs/bootstrap5": "5.1.*", "vuejs/vuejs3": "3.2.33", - "vuejs/vuerouter4": "4.1.3" + "vuejs/vuerouter4": "4.1.3", + "vuepic/vue-datepicker-js": "4.*", + "vuepic/vue-datepicker-css": "4.*" }, "config": { "bin-dir": "vendor/bin" @@ -432,4 +456,3 @@ "sebastian/phpcpd": "3.*" } } - diff --git a/composer.lock b/composer.lock index 72f13c76f..30d011aae 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": "d530cc4d7bd81812535eb64e87ba04f4", + "content-hash": "03cfe5f5e33ab66a5009b6ffcb2c5fa0", "packages": [ { "name": "afarkas/html5shiv", @@ -35,6 +35,10 @@ ], "description": "Defacto way to enable use of HTML5 sectioning elements in legacy Internet Explorer.", "homepage": "http://paulirish.com/2011/the-history-of-the-html5-shiv/", + "support": { + "issues": "https://github.com/aFarkas/html5shiv/issues", + "source": "https://github.com/aFarkas/html5shiv/tree/3.7.3" + }, "time": "2015-07-20T20:04:00+00:00" }, { @@ -130,6 +134,16 @@ "keywords": [ "qr code" ], + "support": { + "issues": "https://github.com/chillerlan/php-qrcode/issues", + "source": "https://github.com/chillerlan/php-qrcode/tree/v2.0.x" + }, + "funding": [ + { + "url": "https://ko-fi.com/codemasher", + "type": "ko_fi" + } + ], "time": "2020-04-12T07:38:35+00:00" }, { @@ -178,6 +192,10 @@ "helper", "trait" ], + "support": { + "issues": "https://github.com/chillerlan/php-traits/issues", + "source": "https://github.com/chillerlan/php-traits" + }, "abandoned": true, "time": "2018-06-22T00:30:47+00:00" }, @@ -218,6 +236,10 @@ ], "description": "REST Server for the CodeIgniter framework", "homepage": "https://github.com/chriskacerguis/codeigniter-restserver", + "support": { + "issues": "https://github.com/chriskacerguis/codeigniter-restserver/issues", + "source": "https://github.com/chriskacerguis/codeigniter-restserver" + }, "time": "2017-09-23T16:44:55+00:00" }, { @@ -236,6 +258,10 @@ }, "type": "library", "notification-url": "https://packagist.org/downloads/", + "support": { + "issues": "https://github.com/akiyatkin/tablesorter/issues", + "source": "https://github.com/akiyatkin/tablesorter/tree/master" + }, "time": "2016-09-02T11:31:54+00:00" }, { @@ -269,6 +295,13 @@ ], "description": "The CodeIgniter framework", "homepage": "https://codeigniter.com", + "support": { + "forum": "http://forum.codeigniter.com/", + "issues": "https://github.com/bcit-ci/CodeIgniter/issues", + "slack": "https://codeigniterchat.slack.com", + "source": "https://github.com/bcit-ci/CodeIgniter", + "wiki": "https://github.com/bcit-ci/CodeIgniter/wiki" + }, "time": "2022-03-03T13:21:49+00:00" }, { @@ -573,6 +606,10 @@ ], "description": "Shim repository for Angular.js", "homepage": "http://angularjs.org", + "support": { + "issues": "https://github.com/components/angular.js/issues", + "source": "https://github.com/components/angular.js/tree/master" + }, "time": "2015-06-07T20:10:38+00:00" }, { @@ -615,6 +652,13 @@ ], "description": "jQuery JavaScript Library", "homepage": "http://jquery.com", + "support": { + "forum": "http://forum.jquery.com", + "irc": "irc://irc.freenode.org/jquery", + "issues": "https://github.com/jquery/jquery/issues", + "source": "https://github.com/jquery/jquery", + "wiki": "http://docs.jquery.com/" + }, "time": "2021-03-20T19:13:42+00:00" }, { @@ -700,6 +744,10 @@ } ], "description": "jQuery UI is a curated set of user interface interactions, effects, widgets, and themes built on top of the jQuery JavaScript Library. Whether you're building highly interactive web applications or you just need to add a date picker to a form control, jQuery UI is the perfect choice.", + "support": { + "issues": "https://github.com/components/jqueryui/issues", + "source": "https://github.com/components/jqueryui/tree/master" + }, "time": "2016-09-16T05:47:55+00:00" }, { @@ -749,6 +797,10 @@ "captcha", "security" ], + "support": { + "issues": "https://github.com/dapphp/securimage/issues", + "source": "https://github.com/dapphp/securimage/tree/master" + }, "abandoned": true, "time": "2018-03-09T06:07:41+00:00" }, @@ -812,6 +864,12 @@ "rdfa", "sparql" ], + "support": { + "forum": "http://groups.google.com/group/easyrdf/", + "irc": "irc://chat.freenode.net/easyrdf", + "issues": "http://github.com/njh/easyrdf/issues", + "source": "https://github.com/easyrdf/easyrdf/tree/0.9.1" + }, "time": "2015-02-27T09:45:49+00:00" }, { @@ -890,6 +948,10 @@ "faker", "fixtures" ], + "support": { + "issues": "https://github.com/fzaninotto/Faker/issues", + "source": "https://github.com/fzaninotto/Faker/tree/v1.9.2" + }, "abandoned": true, "time": "2020-12-11T09:56:16+00:00" }, @@ -1012,6 +1074,10 @@ "json", "schema" ], + "support": { + "issues": "https://github.com/justinrainbow/json-schema/issues", + "source": "https://github.com/justinrainbow/json-schema/tree/master" + }, "time": "2014-08-25T02:48:14+00:00" }, { @@ -1046,6 +1112,10 @@ } ], "description": "A framework-agnostic PHP Implementation for generating simple forms based on json-schema", + "support": { + "issues": "https://github.com/kingsquare/json-schema-form/issues", + "source": "https://github.com/kingsquare/json-schema-form/tree/master" + }, "time": "2014-07-10T12:27:19+00:00" }, { @@ -1106,6 +1176,10 @@ "keywords": [ "markdown" ], + "support": { + "issues": "https://github.com/michelf/php-markdown/issues", + "source": "https://github.com/michelf/php-markdown/tree/lib" + }, "time": "2015-03-01T12:03:08+00:00" }, { @@ -1153,20 +1227,24 @@ "uri", "url" ], + "support": { + "issues": "https://github.com/lanthaler/IRI/issues", + "source": "https://github.com/lanthaler/IRI/tree/master" + }, "time": "2014-01-21T13:43:39+00:00" }, { "name": "ml/json-ld", - "version": "1.2.0", + "version": "1.2.1", "source": { "type": "git", "url": "https://github.com/lanthaler/JsonLD.git", - "reference": "c74a1aed5979ed1cfb1be35a55a305fd30e30b93" + "reference": "537e68e87a6bce23e57c575cd5dcac1f67ce25d8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/lanthaler/JsonLD/zipball/c74a1aed5979ed1cfb1be35a55a305fd30e30b93", - "reference": "c74a1aed5979ed1cfb1be35a55a305fd30e30b93", + "url": "https://api.github.com/repos/lanthaler/JsonLD/zipball/537e68e87a6bce23e57c575cd5dcac1f67ce25d8", + "reference": "537e68e87a6bce23e57c575cd5dcac1f67ce25d8", "shasum": "" }, "require": { @@ -1202,7 +1280,11 @@ "JSON-LD", "jsonld" ], - "time": "2020-06-16T17:45:06+00:00" + "support": { + "issues": "https://github.com/lanthaler/JsonLD/issues", + "source": "https://github.com/lanthaler/JsonLD/tree/1.2.1" + }, + "time": "2022-09-29T08:45:17+00:00" }, { "name": "moment/momentjs", @@ -1262,6 +1344,14 @@ "sorting", "table" ], + "support": { + "docs": "https://mottie.github.io/tablesorter/docs/index.html", + "email": "wowmotty@gmail.com", + "irc": "irc://irc.freenode.org/tablesorter", + "issues": "https://github.com/Mottie/tablesorter/issues", + "source": "https://github.com/Mottie/tablesorter", + "wiki": "https://github.com/Mottie/tablesorter/wiki" + }, "time": "2020-03-03T13:46:03+00:00" }, { @@ -1312,6 +1402,10 @@ "rest", "restful" ], + "support": { + "issues": "https://github.com/nategood/httpful/issues", + "source": "https://github.com/nategood/httpful/tree/v0.2.20" + }, "time": "2015-10-26T16:11:30+00:00" }, { @@ -1365,6 +1459,12 @@ "plaintext", "textile" ], + "support": { + "irc": "irc://irc.freenode.net/textile", + "issues": "https://github.com/textile/php-textile/issues", + "source": "https://github.com/textile/php-textile", + "wiki": "https://github.com/textile/php-textile/wiki" + }, "time": "2022-05-01T17:05:16+00:00" }, { @@ -1390,10 +1490,10 @@ }, { "name": "npm-asset/primevue", - "version": "3.15.0", + "version": "3.29.2", "dist": { "type": "tar", - "url": "https://registry.npmjs.org/primevue/-/primevue-3.15.0.tgz" + "url": "https://registry.npmjs.org/primevue/-/primevue-3.29.2.tgz" }, "type": "npm-asset", "license": [ @@ -1420,16 +1520,16 @@ }, { "name": "phpseclib/phpseclib", - "version": "2.0.37", + "version": "2.0.44", "source": { "type": "git", "url": "https://github.com/phpseclib/phpseclib.git", - "reference": "c812fbb4d6b4d7f30235ab7298a12f09ba13b37c" + "reference": "149f608243f8133c61926aae26ce67d2b22b37e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/c812fbb4d6b4d7f30235ab7298a12f09ba13b37c", - "reference": "c812fbb4d6b4d7f30235ab7298a12f09ba13b37c", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/149f608243f8133c61926aae26ce67d2b22b37e5", + "reference": "149f608243f8133c61926aae26ce67d2b22b37e5", "shasum": "" }, "require": { @@ -1444,7 +1544,8 @@ "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.", "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.", "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.", - "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations." + "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations.", + "ext-xml": "Install the XML extension to load XML formatted public keys." }, "type": "library", "autoload": { @@ -1507,7 +1608,34 @@ "x.509", "x509" ], - "time": "2022-04-04T04:57:45+00:00" + "support": { + "issues": "https://github.com/phpseclib/phpseclib/issues", + "source": "https://github.com/phpseclib/phpseclib/tree/2.0.44" + }, + "funding": [ + { + "url": "https://github.com/terrafrost", + "type": "github" + }, + { + "url": "https://www.patreon.com/phpseclib", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpseclib/phpseclib", + "type": "tidelift" + } + ], + "time": "2023-06-13T08:41:47+00:00" + }, + { + "name": "popperjs/core", + "version": "2.10.2", + "dist": { + "type": "file", + "url": "https://cdn.jsdelivr.net/npm/@popperjs/core@2.10.2/dist/umd/popper.min.js" + }, + "type": "library" }, { "name": "rmariuzzo/jquery-checkboxes", @@ -1587,6 +1715,23 @@ "polyfill", "portable" ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.19.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2020-10-23T09:01:57+00:00" }, { @@ -1706,6 +1851,10 @@ "keywords": [ "templating" ], + "support": { + "issues": "https://github.com/twigphp/Twig/issues", + "source": "https://github.com/twigphp/Twig/tree/1.x" + }, "time": "2020-02-11T05:59:23+00:00" }, { @@ -1725,6 +1874,24 @@ "url": "https://unpkg.com/vue-router@4.1.3/dist/vue-router.global.js" }, "type": "library" + }, + { + "name": "vuepic/vue-datepicker-css", + "version": "4.0.0", + "dist": { + "type": "file", + "url": "https://unpkg.com/@vuepic/vue-datepicker@4.0.0/dist/main.css" + }, + "type": "library" + }, + { + "name": "vuepic/vue-datepicker-js", + "version": "4.0.0", + "dist": { + "type": "file", + "url": "https://unpkg.com/@vuepic/vue-datepicker@4.0.0/dist/vue-datepicker.iife.js" + }, + "type": "library" } ], "packages-dev": [ @@ -1779,6 +1946,24 @@ "regex", "regular expression" ], + "support": { + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/1.0.1" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], "time": "2022-01-21T20:24:37+00:00" }, { @@ -1826,20 +2011,39 @@ "Xdebug", "performance" ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/xdebug-handler/issues", + "source": "https://github.com/composer/xdebug-handler/tree/2.0.5" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], "time": "2022-02-24T20:20:32+00:00" }, { "name": "nikic/php-parser", - "version": "v4.14.0", + "version": "v4.16.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1" + "reference": "19526a33fb561ef417e822e85f08a00db4059c17" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/34bea19b6e03d8153165d8f30bba4c3be86184c1", - "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/19526a33fb561ef417e822e85f08a00db4059c17", + "reference": "19526a33fb561ef417e822e85f08a00db4059c17", "shasum": "" }, "require": { @@ -1878,20 +2082,24 @@ "parser", "php" ], - "time": "2022-05-31T20:59:12+00:00" + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v4.16.0" + }, + "time": "2023-06-25T14:52:30+00:00" }, { "name": "pdepend/pdepend", - "version": "2.10.3", + "version": "2.14.0", "source": { "type": "git", "url": "https://github.com/pdepend/pdepend.git", - "reference": "da3166a06b4a89915920a42444f707122a1584c9" + "reference": "1121d4b04af06e33e9659bac3a6741b91cab1de1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pdepend/pdepend/zipball/da3166a06b4a89915920a42444f707122a1584c9", - "reference": "da3166a06b4a89915920a42444f707122a1584c9", + "url": "https://api.github.com/repos/pdepend/pdepend/zipball/1121d4b04af06e33e9659bac3a6741b91cab1de1", + "reference": "1121d4b04af06e33e9659bac3a6741b91cab1de1", "shasum": "" }, "require": { @@ -1925,26 +2133,42 @@ "BSD-3-Clause" ], "description": "Official version of pdepend to be handled with Composer", - "time": "2022-02-23T07:53:09+00:00" + "keywords": [ + "PHP Depend", + "PHP_Depend", + "dev", + "pdepend" + ], + "support": { + "issues": "https://github.com/pdepend/pdepend/issues", + "source": "https://github.com/pdepend/pdepend/tree/2.14.0" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/pdepend/pdepend", + "type": "tidelift" + } + ], + "time": "2023-05-26T13:15:18+00:00" }, { "name": "phpmd/phpmd", - "version": "2.12.0", + "version": "2.13.0", "source": { "type": "git", "url": "https://github.com/phpmd/phpmd.git", - "reference": "c0b678ba71902f539c27c14332aa0ddcf14388ec" + "reference": "dad0228156856b3ad959992f9748514fa943f3e3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpmd/phpmd/zipball/c0b678ba71902f539c27c14332aa0ddcf14388ec", - "reference": "c0b678ba71902f539c27c14332aa0ddcf14388ec", + "url": "https://api.github.com/repos/phpmd/phpmd/zipball/dad0228156856b3ad959992f9748514fa943f3e3", + "reference": "dad0228156856b3ad959992f9748514fa943f3e3", "shasum": "" }, "require": { "composer/xdebug-handler": "^1.0 || ^2.0 || ^3.0", "ext-xml": "*", - "pdepend/pdepend": "^2.10.3", + "pdepend/pdepend": "^2.12.1", "php": ">=5.3.9" }, "require-dev": { @@ -1997,20 +2221,31 @@ "phpmd", "pmd" ], - "time": "2022-03-24T13:33:01+00:00" + "support": { + "irc": "irc://irc.freenode.org/phpmd", + "issues": "https://github.com/phpmd/phpmd/issues", + "source": "https://github.com/phpmd/phpmd/tree/2.13.0" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/phpmd/phpmd", + "type": "tidelift" + } + ], + "time": "2022-09-10T08:44:15+00:00" }, { "name": "phpmetrics/phpmetrics", - "version": "v2.8.1", + "version": "v2.8.2", "source": { "type": "git", "url": "https://github.com/phpmetrics/PhpMetrics.git", - "reference": "e279f7317390f642339941b693359e9a181817a7" + "reference": "4b77140a11452e63c7a9b98e0648320bf6710090" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpmetrics/PhpMetrics/zipball/e279f7317390f642339941b693359e9a181817a7", - "reference": "e279f7317390f642339941b693359e9a181817a7", + "url": "https://api.github.com/repos/phpmetrics/PhpMetrics/zipball/4b77140a11452e63c7a9b98e0648320bf6710090", + "reference": "4b77140a11452e63c7a9b98e0648320bf6710090", "shasum": "" }, "require": { @@ -2061,7 +2296,11 @@ "quality", "testing" ], - "time": "2022-03-24T10:19:51+00:00" + "support": { + "issues": "https://github.com/PhpMetrics/PhpMetrics/issues", + "source": "https://github.com/phpmetrics/PhpMetrics/tree/v2.8.2" + }, + "time": "2023-03-08T15:03:36+00:00" }, { "name": "phpunit/php-timer", @@ -2110,6 +2349,10 @@ "keywords": [ "timer" ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/master" + }, "time": "2017-02-26T11:10:40+00:00" }, { @@ -2159,6 +2402,10 @@ "container-interop", "psr" ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/master" + }, "time": "2017-02-14T16:28:37+00:00" }, { @@ -2206,6 +2453,9 @@ "psr", "psr-3" ], + "support": { + "source": "https://github.com/php-fig/log/tree/1.1.4" + }, "time": "2021-05-03T11:20:27+00:00" }, { @@ -2245,6 +2495,10 @@ ], "description": "FinderFacade is a convenience wrapper for Symfony's Finder component.", "homepage": "https://github.com/sebastianbergmann/finder-facade", + "support": { + "issues": "https://github.com/sebastianbergmann/finder-facade/issues", + "source": "https://github.com/sebastianbergmann/finder-facade/tree/master" + }, "abandoned": true, "time": "2017-11-18T17:31:49+00:00" }, @@ -2296,6 +2550,11 @@ ], "description": "Copy/Paste Detector (CPD) for PHP code.", "homepage": "https://github.com/sebastianbergmann/phpcpd", + "support": { + "issues": "https://github.com/sebastianbergmann/phpcpd/issues", + "source": "https://github.com/sebastianbergmann/phpcpd/tree/master" + }, + "abandoned": true, "time": "2017-11-16T08:49:28+00:00" }, { @@ -2339,6 +2598,10 @@ ], "description": "Library that helps with managing the version number of Git-hosted PHP projects", "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "source": "https://github.com/sebastianbergmann/version/tree/master" + }, "time": "2016-10-03T07:35:21+00:00" }, { @@ -2390,6 +2653,11 @@ "phpcs", "standards" ], + "support": { + "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues", + "source": "https://github.com/squizlabs/PHP_CodeSniffer", + "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki" + }, "time": "2021-12-12T21:44:58+00:00" }, { @@ -2449,6 +2717,23 @@ ], "description": "Symfony Config Component", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/config/tree/v3.4.47" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2020-10-24T10:57:07+00:00" }, { @@ -2516,6 +2801,23 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/console/tree/v3.4.47" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2020-10-24T10:57:07+00:00" }, { @@ -2567,6 +2869,23 @@ ], "description": "Symfony Debug Component", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/debug/tree/v3.4.47" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "abandoned": "symfony/error-handler", "time": "2020-10-24T10:57:07+00:00" }, @@ -2634,6 +2953,23 @@ ], "description": "Symfony DependencyInjection Component", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/dependency-injection/tree/v3.4.47" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2020-10-24T10:57:07+00:00" }, { @@ -2679,6 +3015,23 @@ ], "description": "Symfony Filesystem Component", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/filesystem/tree/v3.4.47" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2020-10-24T10:57:07+00:00" }, { @@ -2723,6 +3076,23 @@ ], "description": "Symfony Finder Component", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v3.4.47" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2020-11-16T17:02:08+00:00" }, { @@ -2786,6 +3156,23 @@ "portable", "shim" ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.19.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2020-10-23T09:01:57+00:00" }, { @@ -2829,6 +3216,10 @@ ], "description": "The classes contained within this repository extend the standard DOM to use exceptions at all occasions of errors instead of PHP warnings or notices. They also add various custom methods and shortcuts for convenience and to simplify the usage of DOM.", "homepage": "https://github.com/theseer/fDOMDocument", + "support": { + "issues": "https://github.com/theseer/fDOMDocument/issues", + "source": "https://github.com/theseer/fDOMDocument/tree/1.6.7" + }, "abandoned": true, "time": "2022-01-25T23:10:35+00:00" } @@ -2842,5 +3233,5 @@ "php": ">=5.6.40" }, "platform-dev": [], - "plugin-api-version": "2.3.0" + "plugin-api-version": "2.2.0" } diff --git a/content/fas.xul.php b/content/fas.xul.php index 80efdb2f9..abe7f613e 100644 --- a/content/fas.xul.php +++ b/content/fas.xul.php @@ -140,6 +140,8 @@ foreach($addon_obj->result as $addon) + + @@ -507,19 +509,38 @@ foreach($addon_obj->result as $addon) label = "&menu-dokumente-zutrittskarte.label;" command = "menu-dokumente-zutrittskarte:command" accesskey = "&menu-dokumente-zutrittskarte.accesskey;"/> + + + + + + - + + accesskey = "&menu-dokumente-inskriptionsbestaetigungeng.accesskey;" + /> + + + + + + ` +} diff --git a/public/js/components/Bootstrap/Prompt.js b/public/js/components/Bootstrap/Prompt.js new file mode 100644 index 000000000..74e5c8b3f --- /dev/null +++ b/public/js/components/Bootstrap/Prompt.js @@ -0,0 +1,37 @@ + +import BsAlert from './Alert'; + +export default { + mixins: [ + BsAlert + ], + props: { + placeholder: String, + default: String + }, + data: () => ({ + value: '', + result: false + }), + created() { + if (this.default) + this.value = this.default; + }, + popup(msg, options) { + if (typeof options === 'string') + options = { default: options }; + return BsAlert.popup.bind(this)(msg, options); + }, + template: ` + + + ` +} diff --git a/public/js/components/Fetch.js b/public/js/components/Fetch.js index 32d5616d0..9a34e1a3f 100644 --- a/public/js/components/Fetch.js +++ b/public/js/components/Fetch.js @@ -53,7 +53,9 @@ export const CoreFetchCmpt = { * */ fetchData: function() { - this.loading = true; // loader started + this.loading = true; // loader started + this.error = false; + this.errorMessage = null; // Checks if the apifunction is a callable function if (typeof this.apiFunction == "function") @@ -91,13 +93,16 @@ export const CoreFetchCmpt = { * */ successHandler: function(response) { - this.$emit('dataFetched', response.data); // trigger the event dataFetched + this.$emit('dataFetched', response ? response.data : undefined); // trigger the event dataFetched }, /** * */ errorHandler: function(error) { - this.setError(error.message); + if (error.response.data.retval) + this.setError(error.response.data.retval); + else + this.setError(error.message); }, /** * @@ -107,12 +112,12 @@ export const CoreFetchCmpt = { } }, template: ` - +
Loading...
- +
{{ errorMessage }}
+ ` }; - diff --git a/public/js/components/Loader.js b/public/js/components/Loader.js new file mode 100644 index 000000000..ce4dee638 --- /dev/null +++ b/public/js/components/Loader.js @@ -0,0 +1,62 @@ +import BsModal from './Bootstrap/Modal.js'; + +export default { + components: { + BsModal + }, + props: { + timeout: { + type: Number, + default: 300 + } + }, + data() { + return { + t: null, + state: 0 + } + }, + methods: { + show() { + switch (this.state) { + case 0: + if (this.timeout) { + this.state = 1; + this.t = window.setTimeout(() => this.$refs.modal.show(), this.timeout); + return; + } else + return this.$refs.modal.show(); + case 4: + return window.setTimeout(() => this.show(), 1); + } + }, + hide() { + switch (this.state) { + case 1: + return window.clearTimeout(this.t); + case 2: + return window.setTimeout(() => this.hide(), 1); + case 3: + this.$refs.modal.hide(); + } + } + }, + mounted() { + this.$refs.modal.$refs.modal.addEventListener('show.bs.modal', () => { + this.state = 2; + }); + this.$refs.modal.$refs.modal.addEventListener('shown.bs.modal', () => { + this.state = 3; + }); + this.$refs.modal.$refs.modal.addEventListener('hide.bs.modal', () => { + this.state = 4; + }); + this.$refs.modal.$refs.modal.addEventListener('hidden.bs.modal', () => { + this.state = 0; + }); + }, + template: ` + + Loading... + ` +} \ No newline at end of file diff --git a/public/js/components/Studierendenantrag/Antrag.js b/public/js/components/Studierendenantrag/Antrag.js new file mode 100644 index 000000000..6619b74e7 --- /dev/null +++ b/public/js/components/Studierendenantrag/Antrag.js @@ -0,0 +1,60 @@ +import StudierendenantragAbmeldung from './Form/Abmeldung.js'; +import StudierendenantragUnterbrechung from './Form/Unterbrechung.js'; +import StudierendenantragWiederholung from './Form/Wiederholung.js'; +import Phrasen from '../../mixins/Phrasen.js'; + +export default { + components: { + StudierendenantragAbmeldung, + StudierendenantragUnterbrechung, + StudierendenantragWiederholung + }, + mixins: [ + Phrasen + ], + emits: [ + 'update:infoArray', + 'update:statusMsg', + 'update:statusSeverity' + ], + props: { + antragType: String, + prestudentId: Number, + studierendenantragId: Number, + infoArray: Array, + statusMsg: String, + statusSeverity: String + }, + data() { + return { + status: '' + }; + }, + computed: { + typeComponent() { + return 'Studierendenantrag' + this.antragType; + }, + infoText() { + return this.p.t('studierendenantrag/info_' + this.antragType + '_' + this.status); + } + }, + template: ` +
+
+ {{p.t('studierendenantrag', 'title_' + antragType)}} +
+ + + +
+ ` +} diff --git a/public/js/components/Studierendenantrag/Form/Abmeldung.js b/public/js/components/Studierendenantrag/Form/Abmeldung.js new file mode 100644 index 000000000..0de6e3d16 --- /dev/null +++ b/public/js/components/Studierendenantrag/Form/Abmeldung.js @@ -0,0 +1,285 @@ +import {CoreFetchCmpt} from '../../Fetch.js'; +import Phrasen from '../../../mixins/Phrasen.js'; + +var _uuid = 0; + +export default { + components: { + CoreFetchCmpt + }, + mixins: [ + Phrasen + ], + emits: [ + 'setInfos', + 'setStatus' + ], + props: { + prestudentId: Number + }, + data() { + return { + data: null, + saving: false, + errors: { + grund: [], + default: [] + } + } + }, + computed: { + statusSeverity() { + switch (this.data.status) + { + case 'Erstellt': return 'info'; + case 'Genehmigt': return 'success'; + default: return 'info'; + } + } + }, + methods: { + load() { + return axios.get( + FHC_JS_DATA_STORAGE_OBJECT.app_root + + FHC_JS_DATA_STORAGE_OBJECT.ci_router + + '/components/Antrag/Abmeldung/getDetailsForNewAntrag/' + + this.prestudentId + ).then( + result => { + this.data = result.data.retval; + if (this.data.status) { + this.$emit("setStatus", { + msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.data.statustyp}), + severity: this.statusSeverity + }); + } + return result; + } + ); + }, + createAntrag() { + bootstrap.Modal.getOrCreateInstance(this.$refs.modal).hide(); + this.$emit('setStatus', { + msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t('studierendenantrag', 'status_saving')}), + severity: 'warning' + }); + this.saving = true; + for(var k in this.errors) + this.errors[k] = []; + axios.post( + FHC_JS_DATA_STORAGE_OBJECT.app_root + + FHC_JS_DATA_STORAGE_OBJECT.ci_router + + '/components/Antrag/Abmeldung/createAntrag/', { + studiensemester: this.data.studiensemester_kurzbz, + prestudent_id: this.data.prestudent_id, + grund: this.$refs.grund.value + } + ).then( + result => { + if (result.data.error) + { + for (var k in result.data.retval) + { + if (this.errors[k] !== undefined) + this.errors[k].push(result.data.retval[k]); + else + this.errors.default.push(result.data.retval[k]); + } + this.$emit('setStatus', { + msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t('studierendenantrag', 'status_error')}), + severity: 'danger' + }); + } + else + { + if (result.data.retval === true) + document.location += ""; + this.data = result.data.retval; + if (this.data.status) { + this.$emit("setStatus", { + msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.data.statustyp}), + severity: this.statusSeverity + }); + } + else + this.$emit('setStatus', { + msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t('studierendenantrag', 'status_open')}), + severity:'success' + }); + } + this.saving = false; + } + ); + }, + cancelAntrag() { + this.$emit('setStatus', { + msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t('studierendenantrag', 'status_cancelling')}), + severity: 'warning' + }); + this.saving = true; + for(var k in this.errors) + this.errors[k] = []; + axios.post( + FHC_JS_DATA_STORAGE_OBJECT.app_root + + FHC_JS_DATA_STORAGE_OBJECT.ci_router + + '/components/Antrag/Abmeldung/cancelAntrag/', { + antrag_id: this.data.studierendenantrag_id + } + ).then( + result => { + if (result.data.error) + { + for (var k in result.data.retval) + { + if (this.errors[k] !== undefined) + this.errors[k].push(result.data.retval[k]); + else + this.errors.default.push(result.data.retval[k]); + } + this.$emit('setStatus', { + msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t('studierendenantrag', 'status_error')}), + severity:'danger' + }); + } + else + { + if (Number.isInteger(result.data.retval)) { + document.location = document.location.replace(/abmeldung\/([0-9]*)\/[0-9]*[\/]?$/, 'abmeldung/$1') + "/" + result.data.retval; + } + this.data = result.data.retval; + if (this.data.status) { + this.$emit("setStatus", { + msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.data.statustyp}), + severity: this.statusSeverity + }); + } + else + this.$emit('setStatus', { + msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t('studierendenantrag', 'status_cancelled')}), + severity: 'danger' + }); + } + this.saving = false; + } + ); + } + }, + created() { + this.uuid = _uuid++; + }, + template: ` +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
{{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}}
+
+
+ + +
+ {{errors.grund.join(".")}} +
+
+
+ + + + +
+
+ +
+
+ ` +} diff --git a/public/js/components/Studierendenantrag/Form/Unterbrechung.js b/public/js/components/Studierendenantrag/Form/Unterbrechung.js new file mode 100644 index 000000000..2034361bc --- /dev/null +++ b/public/js/components/Studierendenantrag/Form/Unterbrechung.js @@ -0,0 +1,359 @@ +import {CoreFetchCmpt} from '../../Fetch.js'; +import VueDatepicker from '../../vueDatepicker.js.php'; +import Phrasen from '../../../mixins/Phrasen.js'; + +var _uuid = 0; + +export default { + components: { + CoreFetchCmpt, + VueDatepicker + }, + mixins: [ + Phrasen + ], + emits: [ + 'setInfos', + 'setStatus' + ], + props: { + prestudentId: Number, + studierendenantragId: Number + }, + data() { + return { + data: null, + saving: false, + errors: { + grund: [], + studiensemester: [], + datum_wiedereinstieg: [], + default: [] + }, + stsem: null, + siteUrl: FHC_JS_DATA_STORAGE_OBJECT.app_root + + FHC_JS_DATA_STORAGE_OBJECT.ci_router + } + }, + computed: { + statusSeverity() { + switch (this.data.status) + { + case 'Erstellt': return 'info'; + case 'Genehmigt': return 'success'; + case 'Zurückgezogen': return 'danger'; + default: return 'info'; + } + }, + loadUrl() { + if (this.studierendenantragId) + return '/components/Antrag/Unterbrechung/getDetailsForAntrag/'+ + this.studierendenantragId; + return '/components/Antrag/Unterbrechung/getDetailsForNewAntrag/' + + this.prestudentId; + }, + datumWsFormatted() { + if(!this.data.datum_wiedereinstieg) + return ''; + let datum = new Date(this.data.datum_wiedereinstieg); + return datum.toLocaleDateString(); + } + }, + methods: { + load() { + return axios.get( + FHC_JS_DATA_STORAGE_OBJECT.app_root + + FHC_JS_DATA_STORAGE_OBJECT.ci_router + + this.loadUrl + ).then( + result => { + this.data = result.data.retval; + if (this.data.status) { + this.$emit("setStatus", { + msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.data.statustyp}), + severity: this.statusSeverity + }); + } + return result; + } + ); + }, + createAntrag() { + this.$emit('setStatus', { + msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t('studierendenantrag', 'status_saving')}), + severity: 'warning' + }); + this.saving = true; + for(var k in this.errors) + this.errors[k] = []; + + var formData = new FormData(); + var attachment = this.$refs.attachment; + formData.append("attachment", attachment.files[0]); + formData.append("studiensemester", this.stsem !== null && this.data.studiensemester[this.stsem].studiensemester_kurzbz); + formData.append("prestudent_id", this.data.prestudent_id); + formData.append("grund", this.$refs.grund.value); + formData.append("datum_wiedereinstieg", this.$refs.datum_wiedereinstieg && this.$refs.datum_wiedereinstieg.value); + + axios.post( + FHC_JS_DATA_STORAGE_OBJECT.app_root + + FHC_JS_DATA_STORAGE_OBJECT.ci_router + + '/components/Antrag/Unterbrechung/createAntrag/', + formData, + { + headers: { + 'Content-Type': 'multipart/form-data' + } + } + ).then( + result => { + if (result.data.error) + { + for (var k in result.data.retval) + { + if (this.errors[k] !== undefined) + this.errors[k].push(result.data.retval[k]); + else + this.errors.default.push(result.data.retval[k]); + } + this.$emit('setStatus', { + msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t('studierendenantrag', 'status_error')}), + severity: 'danger' + }); + } + else + { + if (Number.isInteger(result.data.retval)) + document.location += "/" + result.data.retval; + this.data = result.data.retval; + if (this.data.status) { + this.$emit("setStatus", { + msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.data.statustyp}), + severity: this.statusSeverity + }); + } + else + this.$emit('setStatus', { + msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t('studierendenantrag', 'status_created')}), + severity: 'info' + }); + } + this.saving = false; + } + ); + }, + cancelAntrag() { + this.$emit('setStatus', { + msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t('studierendenantrag', 'status_cancelling')}), + severity: 'warning' + }); + this.saving = true; + for(var k in this.errors) + this.errors[k] = []; + axios.post( + FHC_JS_DATA_STORAGE_OBJECT.app_root + + FHC_JS_DATA_STORAGE_OBJECT.ci_router + + '/components/Antrag/Unterbrechung/cancelAntrag/', { + antrag_id: this.data.studierendenantrag_id + } + ).then( + result => { + if (result.data.error) + { + for (var k in result.data.retval) + { + if (this.errors[k] !== undefined) + this.errors[k].push(result.data.retval[k]); + else + this.errors.default.push(result.data.retval[k]); + } + this.$emit('setStatus', { + msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t('studierendenantrag', 'status_error')}), + severity: 'danger' + }); + } + else + { + if (Number.isInteger(result.data.retval)) { + document.location = document.location.replace(/unterbrechung\/([0-9]*)\/[0-9]*[\/]?$/, 'unterbrechung/$1') + "/" + result.data.retval; + } + this.data = result.data.retval; + if (this.data.status) { + this.$emit("setStatus", { + msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.data.statustyp}), + severity: this.statusSeverity + }); + } + else + this.$emit('setStatus', { + msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t('studierendenantrag', 'status_cancelled')}), + severity: 'danger' + }); + } + this.saving = false; + } + ); + } + }, + created() { + this.uuid = _uuid++; + }, + template: ` +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{{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}}{{stsem === null ? '' : data.studiensemester[stsem].studienjahr_kurzbz}}
{{p.t('lehre', 'semester')}}{{data.semester}}{{stsem === null ? '' : data.studiensemester[stsem].semester}}
+
+ +
+ +
+ {{data.studiensemester_kurzbz}} +
+
+ +
+ {{errors.studiensemester.join(".")}} +
+
+
+
+ + +
+ {{datumWsFormatted}} +
+
+ + +
+ +
+ {{errors.datum_wiedereinstieg.join(".")}} +
+
+
+
{{p.t('studierendenantrag', 'antrag_grund')}}:
+
{{data.grund}}
+
+
+ + +
+ {{errors.grund.join(".")}} +
+
+
+ +
+ {{p.t('studierendenantrag', 'antrag_dateianhaenge')}} + {{p.t('studierendenantrag', 'no_attachments')}} +
+
+ + +
+
+
+ + +
+
+ +
+
+ ` +} diff --git a/public/js/components/Studierendenantrag/Form/Wiederholung.js b/public/js/components/Studierendenantrag/Form/Wiederholung.js new file mode 100644 index 000000000..4cbc32d88 --- /dev/null +++ b/public/js/components/Studierendenantrag/Form/Wiederholung.js @@ -0,0 +1,212 @@ +import {CoreFetchCmpt} from '../../Fetch.js'; +import VueDatepicker from '../../vueDatepicker.js.php'; +import Phrasen from '../../../mixins/Phrasen.js'; + +var _uuid = 0; + +export default { + components: { + CoreFetchCmpt, + VueDatepicker + }, + mixins: [ + Phrasen + ], + emits: [ + 'setInfos', + 'setStatus', + 'update:status' + ], + props: { + status: String, + prestudentId: Number, + studierendenantragId: Number + }, + data() { + return { + data: null, + saving: false, + errors: { + grund: [], + default: [] + }, + siteUrl: FHC_JS_DATA_STORAGE_OBJECT.app_root + + FHC_JS_DATA_STORAGE_OBJECT.ci_router, + infos: [] + } + }, + computed: { + statusSeverity() { + switch (this.data.status) + { + case 'Erstellt': return 'info'; + case 'Genehmigt': return 'success'; + case 'Verzichtet': return 'danger'; + default: return 'info'; + } + }, + loadUrl() { + return '/components/Antrag/Wiederholung/getDetailsForNewAntrag/' + + this.prestudentId; + }, + datumPruefungFormatted() { + if(!this.data.pruefungsdatum) + return ''; + let datum = new Date(this.data.pruefungsdatum); + return datum.toLocaleDateString(); + } + }, + methods: { + load() { + return axios.get( + FHC_JS_DATA_STORAGE_OBJECT.app_root + + FHC_JS_DATA_STORAGE_OBJECT.ci_router + + this.loadUrl + ).then( + result => { + this.data = result.data.retval; + if (!this.data.status || this.data.status == 'ErsteAufforderungVersandt' || this.data.status == 'ZweiteAufforderungVersandt') + this.data.status = 'Offen'; + this.$emit('update:status', this.data.status); + this.$emit("setStatus", { + msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.data.statustyp}), + severity: this.statusSeverity + }); + return result; + } + ); + }, + createAntrag() { + this.createAntragWithStatus(true); + }, + cancelAntrag() { + this.createAntragWithStatus(false); + }, + createAntragWithStatus(repeat) { + let func = repeat ? 'createAntrag' : 'cancelAntrag'; + let nextState = repeat ? 'Erstellt' : 'Verzichtet'; + + this.$emit('setStatus', { + msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t_ref('studierendenantrag', 'status_saving')}), + severity: 'warning' + }); + this.saving = true; + for(var k in this.errors) + this.errors[k] = []; + + axios.post( + FHC_JS_DATA_STORAGE_OBJECT.app_root + + FHC_JS_DATA_STORAGE_OBJECT.ci_router + + '/components/Antrag/Wiederholung/' + func + '/', + { + prestudent_id: this.data.prestudent_id, + studiensemester: this.data.studiensemester_kurzbz + } + ).then( + result => { + if (result.data.error) + { + for (var k in result.data.retval) + { + if (this.errors[k] !== undefined) + this.errors[k].push(result.data.retval[k]); + else + this.errors.default.push(result.data.retval[k]); + } + this.$emit('setStatus', { + msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t_ref('studierendenantrag', 'status_error')}), + severity: 'danger' + }); + } + else + { + if (result.data.retval === true) + document.location += ""; + this.data = result.data.retval; + if (!this.data.status) + this.data.status = nextState; + this.$emit('update:status', this.data.status); + this.$emit("setStatus", { + msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.data.statustyp}), + severity: this.statusSeverity + }); + } + this.saving = false; + } + ); + } + }, + created() { + this.uuid = _uuid++; + }, + mounted() { + this.infos = [...Array(5).keys()].map(n => ({ + body: this.p.t_ref('studierendenantrag', 'infotext_Wiederholung_' + n) + })); + this.$emit('setInfos', this.infos); + }, + template: ` +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
{{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('studierendenantrag', 'antrag_Wiederholung_pruefung')}}{{data.lvbezeichnung}}
{{p.t('studierendenantrag', 'antrag_Wiederholung_pruefung_date')}}{{datumPruefungFormatted}}
+
+ +
+ + +
+
+ +
+
+ ` +} diff --git a/public/js/components/Studierendenantrag/Infoblock.js b/public/js/components/Studierendenantrag/Infoblock.js new file mode 100644 index 000000000..59e3cce96 --- /dev/null +++ b/public/js/components/Studierendenantrag/Infoblock.js @@ -0,0 +1,19 @@ +export default { + props: { + infos: Array, + }, + template: ` +
+ +
+ ` +} diff --git a/public/js/components/Studierendenantrag/Leitung.js b/public/js/components/Studierendenantrag/Leitung.js new file mode 100644 index 000000000..f08da3879 --- /dev/null +++ b/public/js/components/Studierendenantrag/Leitung.js @@ -0,0 +1,312 @@ +import LeitungHeader from './Leitung/Header.js'; +import LeitungActions from './Leitung/Actions.js'; +import LeitungTable from './Leitung/Table.js'; +import GrundPopup from './Leitung/GrundPopup.js'; +import LvPopup from './Leitung/LvPopup.js'; +import BsAlert from '../Bootstrap/Alert.js'; +import FhcLoader from '../Loader.js'; +import Phrasen from '../../mixins/Phrasen.js'; + +export default { + components: { + LeitungHeader, + LeitungTable, + LeitungActions, + FhcLoader + }, + mixins: [Phrasen], + props: { + stgL: Array, + stgA: Array + }, + data() { + return { + filter: undefined, + selectedData: [], + columns: [] + } + }, + computed: { + stgs(){ + if(!this.stgL || !this.stgA) + return[]; + let undesiredOutput = [...this.stgL, ...this.stgA]; + let desiredOutput = undesiredOutput.reduce( + (accumulator, currentValue)=> + { + accumulator[currentValue.studiengang_kz] = currentValue; + return accumulator; + }, + {} + ); + return Object.values(desiredOutput); + + }, + stgkzL() + { + if (!this.stgL) + return []; + return this.stgL.map(stg => stg.studiengang_kz); + }, + stgkzA() + { + if (!this.stgA) + return []; + return this.stgA.map(stg => stg.studiengang_kz); + } + }, + methods: { + changeFilter(evt) { + this.filter = evt.target.value || undefined; + this.reload(); + }, + reload() { + this.$refs.table.reload(this.filter); + }, + download() { + this.$refs.table.download(); + }, + actionApprove(evt, oks) { + var antraege = evt || [...this.selectedData]; + + if (!oks) { + oks = []; + } + var currentAntrag = antraege.shift(); + if (currentAntrag) { + if (currentAntrag.typ != 'Wiederholung') + { + oks.push(currentAntrag); + this.actionApprove(antraege, oks); + } + else + { + let countAntrage = 0; + LvPopup + .popup(this.p.t('studierendenantrag','title_show_lvs', currentAntrag), { + antragId: currentAntrag.studierendenantrag_id, + footer: true, + dialogClass: 'modal-lg', + countRemaining : antraege.filter(antrag => antrag.typ == 'Wiederholung').length + }) + .then(result => { + if (result[0]) { + oks.push(currentAntrag); + if (result[1]) + while (antraege.length) + oks.push(antraege.pop()); + } else if (result[1]) { + while (antraege.length) { + currentAntrag = antraege.pop(); + if (currentAntrag.typ != 'Wiederholung') + oks.push(currentAntrag); + } + } + this.actionApprove(antraege, oks); + }) + .catch(() => {}); + } + } else { + this.$refs.loader.show(); + axios + .all( + oks.map( + antrag => axios.post( + FHC_JS_DATA_STORAGE_OBJECT.app_root + + FHC_JS_DATA_STORAGE_OBJECT.ci_router + + '/components/Antrag/Leitung/approve' + antrag.typ, + { + studierendenantrag_id: antrag.studierendenantrag_id + } + ) + ) + ) + .then(this.showValidation) + .catch(this.showError); + } + }, + actionReject(evt, gruende) { + var antraege = evt || this.selectedData; + if(!gruende) + { + gruende = []; + } + var currentAntrag = antraege.pop(); + if(currentAntrag) + GrundPopup.popup(this.p.t('studierendenantrag', 'title_grund', {id: currentAntrag.studierendenantrag_id})).then(result => + { + currentAntrag.grund = result[0]; + gruende.push(currentAntrag); + if(result[1]) + { + while (antraege.length) + { + currentAntrag = antraege.pop(); + currentAntrag.grund = result[0]; + gruende.push(currentAntrag); + } + } + this.actionReject(antraege, gruende); + }) + .catch(() => {}); + else + { + this.$refs.loader.show(); + axios + .all( + gruende.map( + antrag => axios.post( + FHC_JS_DATA_STORAGE_OBJECT.app_root + + FHC_JS_DATA_STORAGE_OBJECT.ci_router + + '/components/Antrag/Leitung/reject' + antrag.typ, + { + studierendenantrag_id: antrag.studierendenantrag_id, + grund: antrag.grund + } + ) + ) + ) + .then(this.showValidation) + .catch(this.showError); + } + }, + actionReopen(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/Leitung/reopenAntrag/', + { + studierendenantrag_id: antrag.studierendenantrag_id + } + ) + ) + ) + .then(this.showValidation) + .catch(this.showError); + }, + actionObject(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/Leitung/objectAntrag/', + { + studierendenantrag_id: antrag.studierendenantrag_id + } + ) + ) + ) + .then(this.showValidation) + .catch(this.showError); + }, + actionoObjectionDeny(evt, gruende) { + 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/Leitung/objectionDeny/', + { + studierendenantrag_id: antrag.studierendenantrag_id + } + ) + ) + ) + .then(this.showValidation) + .catch(this.showError); + }, + actionObjectionApprove(evt, gruende) { + 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/Leitung/objectionApprove/', + { + studierendenantrag_id: antrag.studierendenantrag_id + } + ) + ) + ) + .then(this.showValidation) + .catch(this.showError); + }, + showValidation(results) { + var errors = results.filter(res => res.data.error); + this.$refs.loader.hide(); + if (errors.length) { + let errorMsg = errors.map( + error => + 'Antrag ' + + JSON.parse(error.config.data).studierendenantrag_id + + '\n' + + Object.values(error.data.retval).join('\n') + ).join('\n'); + + BsAlert.popup(errorMsg, {dialogClass: 'alert alert-danger'}); + } + this.reload(); + }, + showError(error) { + this.$refs.loader.hide(); + let msg = error.response.data; + if (msg.replace(/^\s+/, '').substr(0, 9) == ' + + + + + + + + + + + + ` +} diff --git a/public/js/components/Studierendenantrag/Leitung/Actions.js b/public/js/components/Studierendenantrag/Leitung/Actions.js new file mode 100644 index 000000000..71ada5c20 --- /dev/null +++ b/public/js/components/Studierendenantrag/Leitung/Actions.js @@ -0,0 +1,87 @@ +import ActionsNew from './Actions/New.js'; +import ActionsColumns from './Actions/Columns.js'; +import Phrasen from '../../../mixins/Phrasen.js'; + +export default { + components: { + ActionsNew, + ActionsColumns + }, + mixins: [Phrasen], + props: { + selectedData: Array, + columns: Array, + stgL: Array, + stgA: Array + }, + emits: [ + 'reload', + 'download', + 'action:approve', + 'action:reject', + 'action:reopen' + ], + data() { + return { + currentStudent: '' + } + }, + computed: { + selectedCanBeApproved() { + if (!this.selectedData.length) + return false; + if (!this.selectedData.every(val => this.stgL.includes(val.studiengang_kz))) + return false; + return this.selectedData.filter(row => { + return (row.typ == 'Wiederholung' && row.status == 'Lvszugewiesen') || (row.typ != 'Wiederholung' && (row.status == 'Erstellt' || row.status == 'ErstelltStgl')); + }).length == this.selectedData.length; + }, + selectedCanBeRejected() { + if (!this.selectedData.length) + return false; + if (!this.selectedData.every(val => this.stgL.includes(val.studiengang_kz))) + return false; + return this.selectedData.filter(row => { + return (row.typ == 'Unterbrechung' && row.status == 'Erstellt'); + }).length == this.selectedData.length; + }, + selectedCanBeReopened() { + if (!this.selectedData.length) + return false; + if (!this.selectedData.every(val => this.stgA.includes(val.studiengang_kz))) + return false; + return this.selectedData.filter(row => { + return (row.typ == 'Wiederholung' && row.status == 'Verzichtet'); + }).length == this.selectedData.length; + }, + newUrl() { + return FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + this.currentStudent; + } + }, + methods: { + hideModal() { + bootstrap.Modal.getInstance(this.$refs.modal).hide(); + } + }, + template: ` +
+
+ + + {{p.t('table', 'with_selected', {count: selectedData.length})}} + + + +
+
+ + +
+
+ +
+
+ ` +} diff --git a/public/js/components/Studierendenantrag/Leitung/Actions/Columns.js b/public/js/components/Studierendenantrag/Leitung/Actions/Columns.js new file mode 100644 index 000000000..df2b2a0de --- /dev/null +++ b/public/js/components/Studierendenantrag/Leitung/Actions/Columns.js @@ -0,0 +1,25 @@ +export default { + props: { + columns: Array + }, + methods: { + toggleColumn(col) { + col.visible = !col.visible; + col.original.toggle() + }, + show() { + + } + }, + template: ` + + ` +} \ No newline at end of file diff --git a/public/js/components/Studierendenantrag/Leitung/Actions/New.js b/public/js/components/Studierendenantrag/Leitung/Actions/New.js new file mode 100644 index 000000000..8a98a6aa5 --- /dev/null +++ b/public/js/components/Studierendenantrag/Leitung/Actions/New.js @@ -0,0 +1,118 @@ +import BsAlert from '../../../Bootstrap/Alert.js'; +import BsModal from '../../../Bootstrap/Modal.js'; +import Phrasen from '../../../../mixins/Phrasen.js'; + +export default { + components: { + BsModal + }, + mixins: [ + Phrasen + ], + emits: [ + 'reload' + ], + data() { + return { + data: [], + student: '', + stg: '' + } + }, + computed: { + newUrl() { + 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( + (a, b) => a.nachname == b.nachname ? + a.vorname > b.vorname : + a.nachname > b.nachname + ); + }, + hasNoData() { + return !Object.values(this.data).length; + } + }, + methods: { + openForm() { + bootstrap.Modal.getInstance(this.$refs.modal).hide(); + BsModal.popup(Vue.h('iframe', { + src: this.newUrl, + class: 'position-absolute top-0 start-0 w-100 h-100' + }), { + dialogClass: 'modal-fullscreen' + }, this.p.t('studierendenantrag', 'antrag_header')).then(() => { + this.loadSelects(); + this.$emit('reload'); + }); + }, + loadSelects() { + return axios.get( + FHC_JS_DATA_STORAGE_OBJECT.app_root + + FHC_JS_DATA_STORAGE_OBJECT.ci_router + + '/components/Antrag/Abmeldung/getStudiengaengeAssistenz/' + ).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: ` +
+ + +
+ ` +} diff --git a/public/js/components/Studierendenantrag/Leitung/GrundPopup.js b/public/js/components/Studierendenantrag/Leitung/GrundPopup.js new file mode 100644 index 000000000..d560dfb00 --- /dev/null +++ b/public/js/components/Studierendenantrag/Leitung/GrundPopup.js @@ -0,0 +1,62 @@ + +import BsAlert from '../../Bootstrap/Alert.js'; +import Phrasen from '../../../mixins/Phrasen.js'; + +export default { + mixins: [ + BsAlert, + Phrasen + ], + props: { + placeholder: String, + default: String + }, + data: () => ({ + value: '', + result: false, + check: false, + isInvalid: false + }), + methods: { + submit(){ + if(!this.value) { + this.isInvalid = true; + } + else { + this.result = [this.value, this.check]; + this.hide(); + } + return + } + }, + created() { + if (this.default) + this.value = this.default; + }, + popup(msg, options) { + if (typeof options === 'string') + options = { default: options }; + return BsAlert.popup.bind(this)(msg, options); + }, + template: ` + + + + ` +} diff --git a/public/js/components/Studierendenantrag/Leitung/Header.js b/public/js/components/Studierendenantrag/Leitung/Header.js new file mode 100644 index 000000000..388a93b7d --- /dev/null +++ b/public/js/components/Studierendenantrag/Leitung/Header.js @@ -0,0 +1,24 @@ +import Phrasen from '../../../mixins/Phrasen.js'; + +export default { + mixins: [Phrasen], + props: { + stgs: Array + }, + emits: [ + 'input' + ], + template: ` +
+

{{p.t('studierendenantrag', 'studierendenantraege')}}

+
+ +
+
+ ` +} diff --git a/public/js/components/Studierendenantrag/Leitung/LvPopup.js b/public/js/components/Studierendenantrag/Leitung/LvPopup.js new file mode 100644 index 000000000..045e98729 --- /dev/null +++ b/public/js/components/Studierendenantrag/Leitung/LvPopup.js @@ -0,0 +1,142 @@ +import BsAlert from '../../Bootstrap/Alert.js'; +import {CoreFetchCmpt} from "../../Fetch.js"; +import Phrasen from '../../../mixins/Phrasen.js'; + +export default { + components: { + CoreFetchCmpt + }, + mixins: [ + BsAlert, + Phrasen + ], + props: { + footer: Boolean, + antragId: Number, + countRemaining: Number + }, + data: () => ({ + lvs: null, + refresh: true, + result: false, + check: false + }), + computed: { + lvzugelassen() { + let zwischen = {}; + for (let k in this.lvs){ + zwischen[k] = this.lvs[k].filter(lv=>lv.antrag_zugelassen); + } + return zwischen; + }, + lvzugelassenLength() { + return Object.values(this.lvzugelassen).reduce((result, current) => result + current.length, 0); + } + }, + methods: { + setlvs(param) { + if(param.error) + { + this.$refs.fetchCompt.error = true; + this.$refs.fetchCompt.errorMessage = param.retval; + } + else + this.lvs = param.retval; + }, + loadlvs() { + if (!this.antragId) + return new Promise(() => {}); + return axios.get(FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + '/components/Antrag/Wiederholung/getLvs/' + this.antragId); + }, + submit(result) { + this.result = [result, this.check]; + this.hide(); + } + }, + watch: { + antragId() { + Vue.nextTick(() => { + this.refresh = !this.refresh; + }); + } + }, + popup(msg, options) { + if (typeof options === 'string') + options = { default: options }; + return BsAlert.popup.bind(this)(msg, options); + }, + template: ` + + + + ` +} diff --git a/public/js/components/Studierendenantrag/Leitung/Table.js b/public/js/components/Studierendenantrag/Leitung/Table.js new file mode 100644 index 000000000..309678ae1 --- /dev/null +++ b/public/js/components/Studierendenantrag/Leitung/Table.js @@ -0,0 +1,388 @@ +import BsModal from '../../Bootstrap/Modal.js'; +import {CoreFetchCmpt} from '../../Fetch.js'; +import LvPopup from './LvPopup.js'; +import Phrasen from '../../../mixins/Phrasen.js'; +import { dateFilter } from '../../../tabulator/filters/Dates.js'; + +export default { + components: { + BsModal, + CoreFetchCmpt, + LvPopup + }, + mixins: [Phrasen], + props: { + selectedData: Array, + columnData: Array, + stgL: Array, + stgA: Array + }, + emits: [ + 'update:columnData', + 'update:selectedData', + 'action:approve', + 'action:reject', + 'action:reopen', + 'action:object', + 'action:objectionDeny', + 'action:objectionApprove' + ], + data() { + return { + ajaxUrl: FHC_JS_DATA_STORAGE_OBJECT.app_root + + FHC_JS_DATA_STORAGE_OBJECT.ci_router + + '/components/Antrag/Leitung/getAntraege/', + table: null, + lastHistoryClickedId: null, + historyData: [], + lvsData: null + } + }, + methods: { + reload(stg) { + this.table.replaceData(this.ajaxUrl + (stg || '')); + }, + download() { + this.table.download("csv", "data.csv"); + }, + getHistory() { + if (this.lastHistoryClickedId === null) + return null; + return axios.get( + FHC_JS_DATA_STORAGE_OBJECT.app_root + + FHC_JS_DATA_STORAGE_OBJECT.ci_router + + '/components/Antrag/Leitung/getHistory/' + + this.lastHistoryClickedId + ).then(res => { + this.historyData = res.data.retval.sort((a, b) => a.insertamum > b.insertamum); + }); + }, + showHistoryGrund(grund) { + this.$refs.modalGrund.$el.addEventListener( + 'hidden.bs.modal', + this.$refs.history.show, + { + once: true + } + ); + this.$refs.modalGrundPre.innerHTML = grund; + }, + showLVs(data) { + this.lvsData = data; + this.$refs.lvList.show(); + } + }, + mounted() { + function dateFormatter (cell) { + let val = cell.getValue(); + if (!val) + return ''; + let date = new Date(val); + return date.toLocaleDateString(); + } + + this.table = new Tabulator(this.$refs.table, { + placeholder:"Keine zu bearbeitenden Datensätze", + movableColumns: true, + maxHeight: '50vh', + layout: "fitDataStretch", // TODO(chris): wont work when changed + ajaxURL: this.ajaxUrl, + persistence: { // NOTE(chris): do not store column titles + sort: true, //persist column sorting + filter: true, //persist filters + headerFilter: true, //persist header filters + group: true, //persist row grouping + page: true, //persist page + columns: ["width", "visible"], //persist columns + }, + persistenceID: 'studierendenantrag_leitung', + columns: [ + { + formatter: 'rowSelection', + titleFormatter: 'rowSelection', + titleFormatterParams: { + rowRange: 'active' + }, + hozAlign: 'center', + headerSort: false + }, + { + field: 'studierendenantrag_id', + title: '#' + }, + { + field: 'bezeichnung', + title: this.p.t('lehre', 'studiengang'), + headerFilter: 'list', + headerFilterParams: { + valuesLookup: true, + clearable: true, + autocomplete: true, + } + }, + { + field: 'orgform', + title: this.p.t('lehre', 'organisationsform'), + headerFilter: 'list', + headerFilterParams: { + valuesLookup: true, + clearable: true, + autocomplete: true, + } + }, + { + field: 'typ', + title: this.p.t('studierendenantrag', 'antrag_typ'), + headerFilter: 'list', + headerFilterParams: { + valuesLookup: true, + clearable: true, + autocomplete: true, + }, + formatter: (cell, formatterParams, onRendered) => { + return this.p.t('studierendenantrag','antrag_typ_' + cell.getValue()); + } + }, + { + field: 'statustyp', + title: this.p.t('studierendenantrag', 'antrag_status'), + headerFilter: 'list', + headerFilterParams: { + valuesLookup: true, + clearable: true, + autocomplete: true, + } + }, + { + field: 'matrikelnr', + title: this.p.t('person', 'personenkennzeichen'), + headerFilter: 'input' + }, + { + field: 'prestudent_id', + title: this.p.t('lehre', 'prestudent'), + headerFilter: 'input' + }, + { + field: 'name', + title: this.p.t('global', 'name'), + mutator: (value, data) => (data.vorname + ' ' + data.nachname).replace(/^\s*(.*)\s*$/, '$1'), + headerFilter: 'input' + }, + { + field: 'datum', + title: this.p.t('global', 'datum'), + formatter: dateFormatter, + headerFilterFunc: 'dates', + headerFilter: dateFilter + }, + { + field: 'datum_wiedereinstieg', + title: this.p.t('studierendenantrag', 'antrag_datum_wiedereinstieg'), + formatter: dateFormatter, + headerFilterFunc: 'dates', + headerFilter: dateFilter + }, + { + field: 'grund', + title: this.p.t('studierendenantrag', 'antrag_grund'), + formatter: (cell, formatterParams, onRendered) => { + let link = document.createElement('a'), + val = cell.getValue(); + link.href = "#modal-grund"; + link.setAttribute('data-bs-toggle', 'modal'); + link.innerHTML = this.p.t('studierendenantrag', 'antrag_grund'); + link.addEventListener('click', () => { + this.$refs.modalGrundPre.innerHTML = val; + }); + + return val ? link : ''; + } + }, + { + field: 'dms_id', + title: this.p.t('studierendenantrag', 'antrag_dateianhaenge'), + formatter: (cell, formatterParams, onRendered) => { + let val = cell.getValue(); + if (!val) + return ''; + return ' ' + this.p.t('studierendenantrag', 'antrag_anhang') + ''; + } + }, + { + field: 'actions', + formatter: (cell, formatterParams, onRendered) => { + let container = document.createElement('div'), + data = cell.getData(); + + container.className = "d-flex gap-2"; + + if((data.typ == 'Abmeldung' || data.typ == 'Unterbrechung') && (data.status == 'Genehmigt')) + { + // NOTE(chris): Download PDF + let button = document.createElement('a'); + button.innerHTML = ''; + button.className = "btn btn-outline-secondary"; + button.target = "_blank"; + button.href = FHC_JS_DATA_STORAGE_OBJECT.app_root + + 'content/pdfExport.php?xml=Antrag' + data.typ + '.xml.php&xsl=Antrag' + data.typ + '&id='+ data.studierendenantrag_id +'&output=pdf'; + container.append(button); + } + if(data.typ == 'Abmeldung' && data.status == 'GenehmigtStgl') + { + // NOTE(chris): Object + let button = document.createElement('button'); + button.innerHTML = this.p.t('studierendenantrag', 'btn_object'); + button.className = "btn btn-outline-secondary"; + button.addEventListener('click',() => this.$emit('action:object', [cell.getData()])); + container.append(button); + } + + if(data.typ == 'Abmeldung' && data.status == 'Beeinsprucht') + { + // NOTE(chris): Deny Objection + let button = document.createElement('button'); + button.innerHTML = this.p.t('studierendenantrag', 'btn_objection_deny'); + button.className = "btn btn-outline-secondary"; + button.addEventListener('click',() => this.$emit('action:objectionDeny', [cell.getData()])); + container.append(button); + + // NOTE(chris): Approve Objection + button = document.createElement('button'); + button.innerHTML = this.p.t('studierendenantrag', 'btn_objection_approve'); + button.className = "btn btn-outline-secondary"; + button.addEventListener('click',() => this.$emit('action:objectionApprove', [cell.getData()])); + container.append(button); + } + + if (this.stgA.includes(data.studiengang_kz)) + { + // NOTE(chris): Reopen + if (data.typ == 'Wiederholung' && data.status == 'Verzichtet') { + let button = document.createElement('button'); + button.innerHTML = this.p.t('studierendenantrag', 'btn_reopen'); + button.className = "btn btn-outline-secondary"; + button.addEventListener('click',() => this.$emit('action:reopen', [cell.getData()])); + container.append(button); + } + // NOTE(chris): Lv Zuweisen + if (data.typ == 'Wiederholung' && (data.status == 'Erstellt' || data.status == 'Lvszugewiesen')) { + let button = document.createElement('a'); + button.innerHTML = this.p.t('studierendenantrag', 'btn_lvzuweisen'); + button.className = "btn btn-outline-secondary"; + button.href = FHC_JS_DATA_STORAGE_OBJECT.app_root + + FHC_JS_DATA_STORAGE_OBJECT.ci_router + + '/lehre/Antrag/Wiederholung/assistenz/' + + cell.getData().studierendenantrag_id + '/frame'; + button.onclick = e => { + e.preventDefault(); + BsModal.popup(Vue.h('iframe', { + src: button.href, + class: 'position-absolute top-0 start-0 w-100 h-100' + }), { + dialogClass: 'modal-fullscreen' + }, this.p.t('studierendenantrag', 'title_lvzuweisen', cell.getData())).then(() => { + this.$emit('reload'); + }); + }; + container.append(button); + } + } + + if (this.stgL.includes(data.studiengang_kz)) + { + // NOTE(chris): Approve + if ((data.typ == 'Wiederholung' && data.status == 'Lvszugewiesen') || (data.typ != 'Wiederholung' && (data.status == 'Erstellt' || data.status == 'ErstelltStgl'))) { + let button = document.createElement('button'); + button.innerHTML = this.p.t('studierendenantrag', 'btn_approve'); + button.className = "btn btn-outline-secondary"; + button.addEventListener('click', () => this.$emit('action:approve', [cell.getData()])); + container.append(button); + } + // NOTE(chris): Reject (Unterbrechung braucht grund) + if (data.status == 'Erstellt' && data.typ == 'Unterbrechung') { + let button = document.createElement('button'); + button.innerHTML = this.p.t('studierendenantrag', 'btn_reject'); + button.className = "btn btn-outline-secondary"; + button.addEventListener('click', () => this.$emit('action:reject', [cell.getData()])); + container.append(button); + } + } + + // NOTE(chris): Show LVs + if (data.typ == 'Wiederholung' && (data.status == 'Lvszugewiesen' || data.status == 'Genehmigt')) { + let button = document.createElement('button'); + button.innerHTML = this.p.t('studierendenantrag', 'btn_show_lvs'); + button.className = "btn btn-outline-secondary"; + button.addEventListener('click', () => this.showLVs(cell.getData())); + container.append(button); + } + + // TODO(chris): not yet perfect + onRendered(() => { + cell.getColumn().setWidth(true); + }); + + return container; + } + } + ] + }); + this.table.on("tableBuilt", () => { + let columns = this.table.getColumns(); + let columnData = []; + for (let col of columns) { + let def = col.getDefinition(); + if (def.title) { + columnData.push({ + title: def.title, + visible: col.isVisible(), + original: col + }); + } + } + this.$emit('update:columnData', columnData); + }); + this.table.on("rowSelectionChanged", data => { + this.$emit('update:selectedData', data); + }); + this.table.on("cellClick", (e, cell) => { + if (cell.getColumn().getField() == 'statustyp') { + this.lastHistoryClickedId = cell.getData().studierendenantrag_id; + this.$refs.historyLoader.fetchData(); + this.$refs.history.show(); + } + }); + }, + template: ` +
+
+ + +

+		
+ + + + + + + + + + +
{{(new Date(status.insertamum)).toLocaleString()}}{{status.insertvon}}{{status.typ}} + + {{p.t('studierendenantrag', 'antrag_grund')}} + +
+
+
+ + {{p.t('studierendenantrag', 'title_show_lvs', lvsData ? lvsData : {name: ''}) }} + +
+ ` +} diff --git a/public/js/components/Studierendenantrag/Lvzuweisung.js b/public/js/components/Studierendenantrag/Lvzuweisung.js new file mode 100644 index 000000000..cbc97b79e --- /dev/null +++ b/public/js/components/Studierendenantrag/Lvzuweisung.js @@ -0,0 +1,242 @@ +import StudierendenantragStatus from './Status.js'; +import Phrasen from '../../mixins/Phrasen.js'; + +export default { + components: { + StudierendenantragStatus + }, + mixins: [Phrasen], + props: { + antragId: Number, + initialStatusCode: String, + initialStatusMsg: String, + disabled: Boolean + }, + data() { + return { + lvs: [], + isloading: false, + statusCode: '', + statusMsg: '' + } + }, + computed: { + lvs1() { + return this.lvs[Object.keys(this.lvs).filter(key => key.substr(0, 1) == 1)] || []; + }, + lvs2() { + return this.lvs[Object.keys(this.lvs).filter(key => key.substr(0, 1) == 2)] || []; + }, + lvs1sem(){ + return (Object.keys(this.lvs).filter(key => key.substr(0, 1) == 1).pop() || "1").substr(1); + }, + lvs2sem(){ + return (Object.keys(this.lvs).filter(key => key.substr(0, 1) == 2).pop() || "2").substr(1); + }, + statusSeverity() { + switch (this.statusCode) { + case 0: return 'danger'; + default: return 'info'; + } + } + }, + methods: { + save() { + this.isloading = true; + const forbiddenLvs = this.lvs1.filter(lv => lv.antrag_zugelassen && !lv._children).map(lv => ({ + studierendenantrag_id: this.antragId, + lehrveranstaltung_id: lv.lehrveranstaltung_id, + zugelassen: 0, + anmerkung: lv.antrag_anmerkung || "", + studiensemester_kurzbz: this.lvs1sem + })); + const mandatoryLvs = this.lvs2.filter(lv => !lv._children).map(lv => ({ + studierendenantrag_id: this.antragId, + lehrveranstaltung_id: lv.lehrveranstaltung_id, + zugelassen:lv.antrag_zugelassen ? 1 : 2, + anmerkung: lv.antrag_anmerkung || "", + studiensemester_kurzbz: this.lvs2sem + })); + axios.post(FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + '/components/Antrag/Wiederholung/saveLvs/', {forbiddenLvs, mandatoryLvs}) + .then(response => { + if(!response.data.error) { + this.addAlert('Speichern erfolgreich', 'alert-success'); + this.statusCode = response.data.retval[0].studierendenantrag_statustyp_kurzbz; + this.statusMsg = response.data.retval[0].typ; + } else { + this.addAlert(response.data.retval, 'alert-danger'); + this.statusCode = 0; + this.statusMsg = 'Error'; + } + this.isloading = false; + }).catch(error => { + this.addAlert(error.message, 'alert-danger'); + this.statusCode = 0; + this.statusMsg = 'Error'; + this.isloading = false; + }).finally(() => { + window.scrollTo(0, 0); + }); + }, + addAlert(text, type) { + const para = document.createElement("p"); + para.innerText = text; + para.className = "alert " + type + " alert-dismissible fade show"; + const btn = document.createElement("button"); + btn.className = "btn-close"; + btn.type = "button"; + btn.setAttribute("aria-label", "Close"); + btn.setAttribute("data-bs-dismiss", "alert"); + para.appendChild(btn); + + this.$refs.alertbox.appendChild(para); + } + }, + created() { + this.statusCode = this.initialStatusCode; + this.statusMsg = this.initialStatusMsg; + }, + mounted() { + axios.get(FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + '/components/Antrag/Wiederholung/getLvs/' + this.antragId).then( + result => { + if(result.data.error) + { + this.addAlert(result.data.retval, 'alert-danger'); + this.isloading = true; + } + else + { + let res = {}; + for (var k in result.data.retval) { + let lvs = result.data.retval[k].reduce((obj,lv) => { + obj[lv.studienplan_lehrveranstaltung_id] = lv; + return obj; + }, {}); + for (var lv of Object.values(lvs)) { + if (!lv.studienplan_lehrveranstaltung_id_parent) + continue; + if (!lvs[lv.studienplan_lehrveranstaltung_id_parent]) + console.error('parent not available'); + else { + if (!lvs[lv.studienplan_lehrveranstaltung_id_parent]._children) + lvs[lv.studienplan_lehrveranstaltung_id_parent]._children = []; + lvs[lv.studienplan_lehrveranstaltung_id_parent]._children.push(lv); + } + } + res[k] = Object.values(lvs).filter(lv => !lv.studienplan_lehrveranstaltung_id_parent); + let current = res[k]; + let index = k.substr(0,1); + var table = new Tabulator(this.$refs["lvtable" + k.substr(0,1)], { + data: current, + dataTree: true, + dataTreeStartExpanded:true, //start with an expanded tree + dataTreeChildIndent:15, + columns: [ + {title: this.p.t('ui','bezeichnung'), field: "bezeichnung"}, + {title: this.p.t('lehre','lehrform'), field: "lehrform_kurzbz"}, + {title: "ECTS", field: "ects"}, + {title: this.p.t('lehre','note'), field: "note", formatter:(cell, formatterParams, onRendered)=>cell.getValue() || "---"}, + {title: (index==1) ? this.p.t('studierendenantrag','lv_nicht_zulassen') : this.p.t('studierendenantrag','lv_wiederholen'), field: "antrag_zugelassen", formatter: (cell, formatterParams, onRendered) => { + let data = cell.getData(); + if(data._children || !data.zeugnis) + return ""; + let input = document.createElement('input'); + input.className = "form-check-input"; + input.type = "checkbox"; + input.role = "switch"; + input.checked = cell.getValue(); + input.addEventListener('input', () => { + lvs[data.studienplan_lehrveranstaltung_id].antrag_zugelassen = input.checked; + cell.getRow().reformat(); + }); + if (this.disabled) { + input.disabled = true; + } + + let div = document.createElement('div'); + div.className = 'form-check form-switch'; + div.append(input); + + return div; + }}, + { + title: this.p.t('global','anmerkung'), + field: "antrag_anmerkung", + headerSort:false, + titleFormatter:(cell, formatterParams, onRendered)=>{ + let link = document.createElement('a'); + link.addEventListener('click', (e) => { + e.preventDefault(); + }); + + link.href ="#"; + link.title = this.p.t('studierendenantrag','anmerkung_tooltip'); + new bootstrap.Tooltip(link); + let tooltip = document.createElement('span'); + tooltip.innerHTML = this.p.t('global','anmerkung') + " "; + tooltip.append(link); + + let icon = document.createElement('i'); + link.append(icon); + icon.className = "fa fa-info-circle"; + icon.setAttribute("aria-hidden", "true"); + icon.style.minWidth = '1em'; + + return tooltip; + + }, + formatter: (cell, formatterParams, onRendered) => { + if (this.disabled) { + return cell.getValue() || ""; + } + var data = cell.getData(); + if (lvs[data.studienplan_lehrveranstaltung_id].antrag_zugelassen) + { + let input = document.createElement('input'); + input.className = "form-control"; + input.type = "text"; + input.value = cell.getValue() || ""; + input.addEventListener('input', () => { + lvs[data.studienplan_lehrveranstaltung_id].antrag_zugelassen = input.value; + }); + return input; + } + else + { + return ""; + } + } + } + ] + }); + } + this.lvs = result.data.retval; + } + } + ); + }, + template: ` +
+
+ + + {{p.t('studierendenantrag', 'title_lv_nicht_zugelassen')}} + {{lvs1sem}} + +
+
+ + + {{p.t('studierendenantrag', 'title_lv_wiederholen')}} + {{lvs2sem}} + +
+
+ + +
+
+ +
+ ` +} diff --git a/public/js/components/Studierendenantrag/Status.js b/public/js/components/Studierendenantrag/Status.js new file mode 100644 index 000000000..7449fd376 --- /dev/null +++ b/public/js/components/Studierendenantrag/Status.js @@ -0,0 +1,15 @@ +export default { + props: { + msg: String, + severity: String + }, + computed: { + severityClass() { + return 'alert-' + this.severity; + } + }, + template: ` + + ` +} diff --git a/public/js/components/vueDatepicker.js.php b/public/js/components/vueDatepicker.js.php new file mode 100644 index 000000000..e0814ac53 --- /dev/null +++ b/public/js/components/vueDatepicker.js.php @@ -0,0 +1,12 @@ + e.category == category).reduce((res, elem) => { + if (!res[elem.phrase]) + res[elem.phrase] = elem.text; + return res; + }, {}); +} +function reloadRefs(category) { + while (loadingModules[category].length) { + var v = loadingModules[category].pop(); + v[0].value = getValueForLoadedPhrase(category, v[1], v[2]); + Vue.triggerRef(v[0]); + /*Vue.unref(v);*/ + } +} +function loadLazy(category, val, phrase, params) { + // NOTE(chris): load module if it's not loaded yet + if (loadingModules[category]) { + loadingModules[category].push([val, phrase, params]); + if (categories[category]) // NOTE(chris): this is for safety in case the loading finished the moment before the val was pushed into the array + reloadRefs(category); + return; + } + loadingModules[category] = [[val, phrase, params]]; + + axios.get(FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + '/components/Phrasen/loadModule/' + category).then(res => { + if (res.data.retval) + categories[category] = extractCategory(res.data.retval, category); + else + categories[category] = {}; + + reloadRefs(category); + }).catch(err => console.error(err)); +} +function getValueForLoadedPhrase(category, phrase, params) { + let result = categories[category][phrase]; + if (!result) + return '<< PHRASE ' + phrase + '>>'; + if (params) + result = result.replace(/\{([^}]*)\}/g, (match, p1) => params[p1] === undefined ? match : params[p1]); + return result; +} + +const phrasen = { + t_ref(category, phrase, params) { + if (params === undefined && ( + (Array.isArray(category) && category.length == 2) || + (category.split && category.split('/').length == 2)) + ) { + params = phrase; + [category, phrase] = category.split ? category.split('/') : category; + } + if (phrase === undefined) { + console.error('invalid input'); + return ''; + } + if (!categories[category]) { + if (window.FHC_JS_PHRASES_STORAGE_OBJECT !== undefined) + categories[category] = extractCategory(FHC_JS_PHRASES_STORAGE_OBJECT, category); + + if (!categories[category] || Object.keys(categories[category]).length === 0) { + categories[category] = undefined; + let val = Vue.ref(''); + loadLazy(category, val, phrase, params); + return val; + } + } + var result = getValueForLoadedPhrase(category, phrase, params); + return Vue.ref(result); + }, + t(category, phrase, params) { + return Vue.unref(this.t_ref(category, phrase, params)); + } +}; + +export default { + data: () => { + return { + p: phrasen + } + } +} diff --git a/public/js/tabulator/filters/Dates.js b/public/js/tabulator/filters/Dates.js new file mode 100644 index 000000000..7c9f268f0 --- /dev/null +++ b/public/js/tabulator/filters/Dates.js @@ -0,0 +1,43 @@ +if (!primevue) { + console.error('PrimeVue not loaded!'); +} + +// NOTE(chris): Click on clear button gives an error. This is a bug in primevue => fixed in current version +Tabulator.extendModule('filter', 'filters', { + "dates": (headerValue, rowValue) => { + if (!headerValue) + return true; + let v = new Date(rowValue); + if (Array.isArray(headerValue)) { + if (headerValue[1]) { + return v >= headerValue[0] && v <= headerValue[1].setHours(23, 59, 59, 999); + } + return v.toDateString() == headerValue[0].toDateString(); + } + return v.toDateString() == headerValue.toDateString(); + } +}); +function dateFilter(cell, onRendered, success) { + let div = document.createElement('div'); + + Vue.createApp({ + components: { + PrimevueCalendar: primevue.calendar + }, + data() { + return { + val: null + } + }, + watch: { + val(n) { + success(n); + } + }, + template: `` + }).use(primevue.config.default).mount(div); + + return div; +} + +export { dateFilter as 'dateFilter' }; diff --git a/rdf/AntragAbmeldung.xml.php b/rdf/AntragAbmeldung.xml.php new file mode 100644 index 000000000..b89fa51df --- /dev/null +++ b/rdf/AntragAbmeldung.xml.php @@ -0,0 +1,68 @@ +db_add_param($id) . " + AND campus.tbl_studierendenantrag.typ = 'Abmeldung' AND campus.get_status_studierendenantrag(campus.tbl_studierendenantrag.studierendenantrag_id) = 'Genehmigt';"; + $not_found_error = 'Studierendenantrag not found'. $id; + } elseif(isset($_GET['uid']) && isset($_GET['prestudent_id'])) { + $uid = $_GET['uid']; + $uid = explode(';', $uid); + $uid = (array_filter($uid, 'strlen')); + + $prestudent_id = $_GET['prestudent_id']; + $prestudent_id = explode(';', $prestudent_id); + $prestudent_id = (array_filter($prestudent_id, 'strlen')); + + $where = " WHERE campus.tbl_studierendenantrag.prestudent_id in (" . $db->db_implode4SQL($prestudent_id) . ") + AND campus.tbl_studierendenantrag.typ = 'Abmeldung' AND campus.get_status_studierendenantrag(campus.tbl_studierendenantrag.studierendenantrag_id) = 'Genehmigt';"; + $not_found_error = 'Studierendenantrag not found for: ' . implode(',', $uid); + } else + die('wrong parameters'); +} +else + die('Format not supported'); + + +// TODO(chris): mehrsprachig +$query = " + SELECT tbl_studiengang.bezeichnung, bezeichnung_mehrsprachig[1], studierendenantrag_id, matrikelnr, studienjahr_kurzbz, vorname, nachname, studiengang_kz, semester, tbl_studierendenantrag.grund + FROM + campus.tbl_studierendenantrag + JOIN public.tbl_student USING (prestudent_id) + JOIN public.tbl_benutzer ON tbl_student.student_uid=uid + JOIN public.tbl_person USING (person_id) + JOIN public.tbl_studiengang USING (studiengang_kz) + JOIN public.tbl_studiensemester USING (studiensemester_kurzbz) + JOIN bis.tbl_orgform ON (tbl_orgform.orgform_kurzbz = tbl_studiengang.orgform_kurzbz)" . $where; + + +if (!$db->db_query($query) || !$db->db_num_rows()) + die('' . $not_found_error . ''); + +?> + + + db_fetch_object()) { ?> + + bezeichnung;?> + bezeichnung_mehrsprachig;?> + vorname. " " . $row->nachname);?> + matrikelnr;?> + studienjahr_kurzbz;?> + semester;?> + grund;?> + + + diff --git a/rdf/AntragUnterbrechung.xml.php b/rdf/AntragUnterbrechung.xml.php new file mode 100644 index 000000000..50c9f4c6a --- /dev/null +++ b/rdf/AntragUnterbrechung.xml.php @@ -0,0 +1,71 @@ +db_add_param($id) . " + AND campus.tbl_studierendenantrag.typ = 'Unterbrechung' AND campus.get_status_studierendenantrag(campus.tbl_studierendenantrag.studierendenantrag_id) = 'Genehmigt';"; + $not_found_error = 'Studierendenantrag not found'. $id; + } elseif(isset($_GET['uid']) && isset($_GET['prestudent_id'])) { + $uid = $_GET['uid']; + $uid = explode(';', $uid); + $uid = (array_filter($uid, 'strlen')); + + $prestudent_id = $_GET['prestudent_id']; + $prestudent_id = explode(';', $prestudent_id); + $prestudent_id = (array_filter($prestudent_id, 'strlen')); + + $where = " WHERE campus.tbl_studierendenantrag.prestudent_id in (" . $db->db_implode4SQL($prestudent_id) . ") + AND campus.tbl_studierendenantrag.typ = 'Unterbrechung' AND campus.get_status_studierendenantrag(campus.tbl_studierendenantrag.studierendenantrag_id) = 'Genehmigt';"; + $not_found_error = 'Studierendenantrag not found for: ' . implode(',', $uid); + } else + die('wrong parameters'); +} +else + die('Format not supported'); + + +// TODO(chris): mehrsprachig +$query = " + SELECT tbl_studiengang.bezeichnung, bezeichnung_mehrsprachig[1], studierendenantrag_id, matrikelnr, studienjahr_kurzbz, vorname, nachname, studiengang_kz, semester, tbl_studierendenantrag.grund, datum_wiedereinstieg, datum + FROM + campus.tbl_studierendenantrag + JOIN public.tbl_student USING (prestudent_id) + JOIN public.tbl_benutzer ON tbl_student.student_uid=uid + JOIN public.tbl_person USING (person_id) + JOIN public.tbl_studiengang USING (studiengang_kz) + JOIN public.tbl_studiensemester USING (studiensemester_kurzbz) + JOIN bis.tbl_orgform ON (tbl_orgform.orgform_kurzbz = tbl_studiengang.orgform_kurzbz)" . $where; + + +if (!$db->db_query($query) || !$db->db_num_rows()) + die('' . $not_found_error . ''); + +?> + + + db_fetch_object()) { ?> + + bezeichnung;?> + bezeichnung_mehrsprachig;?> + vorname. " " . $row->nachname);?> + matrikelnr;?> + studienjahr_kurzbz;?> + semester;?> + grund;?> + datum_wiedereinstieg))->format('d.m.Y');?> + datum))->format('d.m.Y');?> + + + diff --git a/system/dbupdate_3.4.php b/system/dbupdate_3.4.php index 9fda09bba..013972154 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/27351_digitalisierung_formulare.php'); // *** Pruefung und hinzufuegen der neuen Attribute und Tabellen echo '

Pruefe Tabellen und Attribute!

'; diff --git a/system/dbupdate_3.4/27351_digitalisierung_formulare.php b/system/dbupdate_3.4/27351_digitalisierung_formulare.php new file mode 100644 index 000000000..a40b457e2 --- /dev/null +++ b/system/dbupdate_3.4/27351_digitalisierung_formulare.php @@ -0,0 +1,289 @@ +db_query("SELECT 1 FROM campus.tbl_studierendenantrag_statustyp LIMIT 1")) +{ + $qry = "CREATE TABLE campus.tbl_studierendenantrag_statustyp ( + studierendenantrag_statustyp_kurzbz VARCHAR(32) NOT NULL, + bezeichnung VARCHAR(128)[] NOT NULL, + CONSTRAINT tbl_studierendenantrag_statustyp_pk PRIMARY KEY(studierendenantrag_statustyp_kurzbz) + ); + + GRANT SELECT, INSERT ON campus.tbl_studierendenantrag_statustyp TO vilesci; + GRANT SELECT ON campus.tbl_studierendenantrag_statustyp TO web;"; + + if(!$db->db_query($qry)) + echo 'campus.tbl_studierendenantrag_statustyp: '.$db->db_last_error().'
'; + else + echo '
campus.tbl_studierendenantrag_statustyp: table created'; +} + +if($result = @$db->db_query("SELECT 1 FROM campus.tbl_studierendenantrag_statustyp WHERE studierendenantrag_statustyp_kurzbz = 'Erstellt' ")) +{ + if($db->db_num_rows($result) == 0) + { + $qry = "INSERT INTO campus.tbl_studierendenantrag_statustyp + (studierendenantrag_statustyp_kurzbz, bezeichnung) + VALUES + ('Erstellt', '{\"Erstellt\",\"Created\"}'), + ('ErstelltStgl', '{\"Erstellt\",\"Created\"}'), + ('Genehmigt', '{\"Genehmigt\",\"Approved\"}'), + ('GenehmigtStgl', '{\"Vorläufig Genehmigt\",\"Provisionally Approved\"}'), + ('Beeinsprucht', '{\"Beeinsprucht\",\"Objected\"}'), + ('Abgelehnt', '{\"Abgelehnt\",\"Rejected\"}'), + ('Verzichtet', '{\"Verzichtet\",\"Pass\"}'), + ('Offen', '{\"Offen\",\"Reopened\"}'), + ('Zurückgezogen', '{\"Zurückgezogen\",\"Cancelled\"}'), + ('EmailVersandt', '{\"Email Versandt\",\"Reminder Sent\"}'), + ('ErsteAufforderungVersandt', '{\"1.Aufforderung Versandt\",\"1st Request Sent\"}'), + ('ZweiteAufforderungVersandt', '{\"2.Aufforderung Versandt\",\"2nd Request Sent\"}'), + ('Lvszugewiesen', '{\"Lvszugewiesen\",\"Lvsassigned\"}'); + "; + if (!$db->db_query($qry)) + echo 'campus.tbl_studierendenantrag_statustyp (insert): '.$db->db_last_error().'
'; + else + echo '
campus.tbl_studierendenantrag_statustyp: table prefilled'; + } +} + +if(!$result = @$db->db_query("SELECT 1 FROM campus.tbl_studierendenantrag LIMIT 1")) +{ + $qry = "CREATE TABLE campus.tbl_studierendenantrag ( + studierendenantrag_id INTEGER NOT NULL, + prestudent_id INTEGER NOT NULL, + studiensemester_kurzbz VARCHAR(32) NOT NULL, + datum TIMESTAMP NULL, + typ VARCHAR(32) NOT NULL, + insertamum TIMESTAMP DEFAULT NOW(), + insertvon VARCHAR(32) NOT NULL, + datum_wiedereinstieg TIMESTAMP NULL, + grund TEXT NULL, + dms_id INTEGER NULL, + CONSTRAINT tbl_studierendenantrag_pk PRIMARY KEY(studierendenantrag_id) + ); + CREATE SEQUENCE campus.tbl_studierendenantrag_studierendenantrag_id_seq + INCREMENT BY 1 + NO MAXVALUE + NO MINVALUE + CACHE 1; + ALTER TABLE campus.tbl_studierendenantrag ALTER COLUMN studierendenantrag_id SET DEFAULT nextval('campus.tbl_studierendenantrag_studierendenantrag_id_seq'); + + GRANT SELECT, INSERT ON campus.tbl_studierendenantrag TO vilesci; + GRANT SELECT, INSERT ON campus.tbl_studierendenantrag TO web; + GRANT SELECT, UPDATE ON campus.tbl_studierendenantrag_studierendenantrag_id_seq TO vilesci; + GRANT SELECT, UPDATE ON campus.tbl_studierendenantrag_studierendenantrag_id_seq TO web;"; + + if(!$db->db_query($qry)) + echo 'campus.tbl_studierendenantrag: '.$db->db_last_error().'
'; + else + echo '
campus.tbl_studierendenantrag: table created'; +} + +if(!$result = @$db->db_query("SELECT 1 FROM campus.tbl_studierendenantrag_status LIMIT 1")) +{ + $qry = "CREATE TABLE campus.tbl_studierendenantrag_status ( + studierendenantrag_status_id INTEGER NOT NULL, + studierendenantrag_id INTEGER NOT NULL, + studierendenantrag_statustyp_kurzbz VARCHAR(32) NOT NULL, + insertamum TIMESTAMP DEFAULT NOW(), + insertvon VARCHAR(32) NOT NULL, + grund TEXT NULL, + CONSTRAINT tbl_studierendenantrag_status_pk PRIMARY KEY(studierendenantrag_status_id), + CONSTRAINT tbl_studierendenantrag_fk FOREIGN KEY (studierendenantrag_id) REFERENCES campus.tbl_studierendenantrag(studierendenantrag_id) ON UPDATE CASCADE ON DELETE RESTRICT, + CONSTRAINT tbl_studierendenantrag_statustyp_fk FOREIGN KEY (studierendenantrag_statustyp_kurzbz) REFERENCES campus.tbl_studierendenantrag_statustyp(studierendenantrag_statustyp_kurzbz) ON UPDATE CASCADE ON DELETE RESTRICT + ); + CREATE SEQUENCE campus.tbl_studierendenantrag_status_studierendenantrag_status_id_seq + INCREMENT BY 1 + NO MAXVALUE + NO MINVALUE + 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, 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;"; + + if(!$db->db_query($qry)) + echo 'campus.tbl_studierendenantrag_status: '.$db->db_last_error().'
'; + else + echo '
campus.tbl_studierendenantrag_status: table created'; +} + +if(!$result = @$db->db_query("SELECT 1 FROM campus.tbl_studierendenantrag_lehrveranstaltung LIMIT 1")) +{ + $qry = "CREATE TABLE campus.tbl_studierendenantrag_lehrveranstaltung ( + studierendenantrag_lehrveranstaltung_id INTEGER NOT NULL, + studierendenantrag_id INTEGER NOT NULL, + lehrveranstaltung_id INTEGER NOT NULL, + studiensemester_kurzbz VARCHAR(16) NOT NULL, + note SMALLINT NOT NULL, + anmerkung TEXT NULL, + insertamum TIMESTAMP DEFAULT NOW(), + insertvon VARCHAR(32) NOT NULL, + CONSTRAINT tbl_studierendenantrag_lehrveranstaltung_pk PRIMARY KEY(studierendenantrag_lehrveranstaltung_id), + CONSTRAINT tbl_studiensemester_fk FOREIGN KEY (studiensemester_kurzbz) REFERENCES public.tbl_studiensemester(studiensemester_kurzbz) ON UPDATE CASCADE ON DELETE RESTRICT, + CONSTRAINT tbl_note_fk FOREIGN KEY (note) REFERENCES lehre.tbl_note(note) ON UPDATE CASCADE ON DELETE RESTRICT, + CONSTRAINT tbl_studierendenantrag_fk FOREIGN KEY (studierendenantrag_id) REFERENCES campus.tbl_studierendenantrag(studierendenantrag_id) ON UPDATE CASCADE ON DELETE RESTRICT + ); + CREATE SEQUENCE campus.tbl_studierendenantrag_lehrveranstaltung_studierendenantrag_lehrveranstaltung_id_seq + INCREMENT BY 1 + NO MAXVALUE + NO MINVALUE + CACHE 1; + ALTER TABLE campus.tbl_studierendenantrag_lehrveranstaltung ALTER COLUMN studierendenantrag_lehrveranstaltung_id SET DEFAULT nextval('campus.tbl_studierendenantrag_lehrveranstaltung_studierendenantrag_lehrveranstaltung_id_seq'); + + GRANT SELECT, INSERT, DELETE ON campus.tbl_studierendenantrag_lehrveranstaltung TO vilesci; + GRANT SELECT, INSERT ON campus.tbl_studierendenantrag_lehrveranstaltung TO web; + GRANT SELECT, UPDATE ON campus.tbl_studierendenantrag_lehrveranstaltung_studierendenantrag_lehrveranstaltung_id_seq TO vilesci; + GRANT SELECT, UPDATE ON campus.tbl_studierendenantrag_lehrveranstaltung_studierendenantrag_lehrveranstaltung_id_seq TO web;"; + + if(!$db->db_query($qry)) + echo 'campus.tbl_studierendenantrag_lehrveranstaltung: '.$db->db_last_error().'
'; + else + echo '
campus.tbl_studierendenantrag_lehrveranstaltung: table created'; +} + +if($result = @$db->db_query("SELECT 1 FROM system.tbl_berechtigung WHERE berechtigung_kurzbz = 'student/studierendenantrag';")) +{ + if($db->db_num_rows($result) == 0) + { + $qry = "INSERT INTO system.tbl_berechtigung(berechtigung_kurzbz, beschreibung) VALUES('student/studierendenantrag', 'Berechtigung für Bearbeiten Studierendenanträge');"; + + if(!$db->db_query($qry)) + echo 'system.tbl_berechtigung '.$db->db_last_error().'
'; + else + echo ' system.tbl_berechtigung: Added permission for student/studierendenantrag
'; + } +} + +if($result = @$db->db_query("SELECT 1 FROM system.tbl_berechtigung WHERE berechtigung_kurzbz = 'student/antragfreigabe';")) +{ + if($db->db_num_rows($result) == 0) + { + $qry = "INSERT INTO system.tbl_berechtigung(berechtigung_kurzbz, beschreibung) VALUES('student/antragfreigabe', 'Berechtigung für Freigabe der Studierendenanträge');"; + + if(!$db->db_query($qry)) + echo 'system.tbl_berechtigung '.$db->db_last_error().'
'; + else + echo ' system.tbl_berechtigung: Added permission for student/antragfreigabe
'; + } +} + +if (!$result = @$db->db_query("SELECT campus.get_status_studierendenantrag(0)")) { + $qry = 'CREATE FUNCTION campus.get_status_studierendenantrag(integer) RETURNS character varying + LANGUAGE plpgsql + AS $_$ + DECLARE i_studierendenantrag_id ALIAS FOR $1; + DECLARE rec RECORD; + BEGIN + SELECT INTO rec studierendenantrag_statustyp_kurzbz + FROM campus.tbl_studierendenantrag_status + WHERE studierendenantrag_id=i_studierendenantrag_id + ORDER BY insertamum desc + LIMIT 1; + + RETURN rec.studierendenantrag_statustyp_kurzbz; + END; + $_$; + + ALTER FUNCTION campus.get_status_studierendenantrag(integer) OWNER TO fhcomplete;'; + + if(!$db->db_query($qry)) + echo 'campus.get_status_studierendenantrag(integer): '.$db->db_last_error().'
'; + else + echo '
campus.get_status_studierendenantrag(integer): function created'; +} + +if (!$result = @$db->db_query("SELECT campus.get_status_id_studierendenantrag(0)")) { + $qry = 'CREATE FUNCTION campus.get_status_id_studierendenantrag(integer) RETURNS integer + LANGUAGE plpgsql + AS $_$ + DECLARE i_studierendenantrag_id ALIAS FOR $1; + DECLARE rec RECORD; + BEGIN + SELECT INTO rec studierendenantrag_status_id + FROM campus.tbl_studierendenantrag_status + WHERE studierendenantrag_id=i_studierendenantrag_id + ORDER BY insertamum desc + LIMIT 1; + + RETURN rec.studierendenantrag_status_id; + END; + $_$; + + ALTER FUNCTION campus.get_status_id_studierendenantrag(integer) OWNER TO fhcomplete;'; + + if(!$db->db_query($qry)) + echo 'campus.get_status_id_studierendenantrag(integer): '.$db->db_last_error().'
'; + else + echo '
campus.get_status_id_studierendenantrag(integer): function created'; +} + +if (!$result = @$db->db_query("SELECT public.get_absem_prestudent(0, null)")) { + $qry = 'CREATE FUNCTION public.get_absem_prestudent(integer, character varying) RETURNS integer + LANGUAGE plpgsql + AS $_$ + DECLARE i_prestudent_id ALIAS FOR $1; + DECLARE cv_studiensemester_kurzbz ALIAS FOR $2; + DECLARE rec RECORD; + BEGIN + IF (cv_studiensemester_kurzbz IS NULL) THEN + SELECT INTO rec ausbildungssemester + FROM public.tbl_prestudentstatus + WHERE prestudent_id=i_prestudent_id + ORDER BY datum desc,insertamum desc, ext_id desc + LIMIT 1; + ELSE + SELECT INTO rec ausbildungssemester + FROM tbl_prestudentstatus + WHERE prestudent_id=i_prestudent_id AND studiensemester_kurzbz=cv_studiensemester_kurzbz + ORDER BY datum desc,insertamum desc, ext_id desc + LIMIT 1; + END IF; + + RETURN rec.ausbildungssemester; + END; + $_$; + + ALTER FUNCTION public.get_absem_prestudent(integer, character varying) OWNER TO fhcomplete;'; + + if(!$db->db_query($qry)) + echo 'public.get_absem_prestudent(integer, character varying): '.$db->db_last_error().'
'; + else + echo '
public.get_absem_prestudent(integer, character varying): function created'; +} +if (!$result = @$db->db_query("SELECT public.get_stdsem_prestudent(0, null)")) { + $qry = 'CREATE FUNCTION public.get_stdsem_prestudent(integer, character varying) RETURNS character varying + LANGUAGE plpgsql + AS $_$ + DECLARE i_prestudent_id ALIAS FOR $1; + DECLARE cv_studiensemester_kurzbz ALIAS FOR $2; + DECLARE rec RECORD; + BEGIN + IF (cv_studiensemester_kurzbz IS NULL) THEN + SELECT INTO rec studiensemester_kurzbz + FROM public.tbl_prestudentstatus + WHERE prestudent_id=i_prestudent_id + ORDER BY datum desc,insertamum desc, ext_id desc + LIMIT 1; + ELSE + SELECT INTO rec studiensemester_kurzbz + FROM tbl_prestudentstatus + WHERE prestudent_id=i_prestudent_id AND studiensemester_kurzbz=cv_studiensemester_kurzbz + ORDER BY datum desc,insertamum desc, ext_id desc + LIMIT 1; + END IF; + + RETURN rec.studiensemester_kurzbz; + END; + $_$; + + ALTER FUNCTION public.get_stdsem_prestudent(integer, character varying) OWNER TO fhcomplete;'; + + if(!$db->db_query($qry)) + echo 'public.get_stdsem_prestudent(integer, character varying): '.$db->db_last_error().'
'; + else + echo '
public.get_stdsem_prestudent(integer, character varying): function created'; +} diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php index 0bc748c80..f6df3afad 100644 --- a/system/phrasesupdate.php +++ b/system/phrasesupdate.php @@ -5774,6 +5774,26 @@ When on hold, the date is only a reminder.', ) ) ), + array( + 'app' => 'core', + 'category' => 'ui', + 'phrase' => 'error_invalid_date', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Das Datumsformat ist ungültig oder liegt außerhalb des gültigen Bereichs.', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'The date format is invalid or out of range.', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), array( 'app' => 'core', 'category' => 'ui', @@ -14446,6 +14466,26 @@ array( ) ) ), + array( + 'app' => 'core', + 'category' => 'ui', + 'phrase' => 'schliessen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => "Schließen", + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => "Close", + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), array( 'app' => 'core', 'category' => 'global', @@ -18123,6 +18163,1750 @@ array( ) ) ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'infotext_Wiederholung_0', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Gemäß § 16 Abs. 1 FHG steht Studierenden einmalig das Recht auf Wiederholung eines Studienjahres in Folge einer negativ beurteilten kommissionellen Prüfung zu.', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'According to § 16 paragraph 1 FHG, students have the right to repeat an academic year as a result of a negative examination before a committee.', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'infotext_Wiederholung_1', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Die Wiederholung ist bei der Studiengangsleitung binnen eines Monats ab Mitteilung des negativen Prüfungsergebnisses bekannt zu geben.', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'The head of the degree program must be notified of the repetition within one month of notification of the negative examination result.', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'infotext_Wiederholung_2', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Infolge der Weiterentwicklung der Qualität des Studienganges kann es zu Änderungen der Studienbedingungen im Zuge der Wiederholung eines Studienjahres kommen (z.B. Studienplan, Prüfungsordnung etc.).', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'As a result of the further development of the quality of the course, there may be changes to the study conditions in the course of repeating an academic year (e.g. study plan, examination regulations, etc.).', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'infotext_Wiederholung_3', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Die Studiengangsleitung legt Prüfungen und Lehrveranstaltungen für die Wiederholung des Studienjahres fest.', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'The head of the degree program determines examinations and courses for the repetition of the academic year.', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'infotext_Wiederholung_4', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Nicht bestandene Prüfungen und Lehrveranstaltungen sind jedenfalls, bestandene Prüfungen und Lehrveranstaltungen nur, sofern es der Zweck des Studiums erforderlich macht, zu wiederholen oder erneut zu besuchen. Wird eine Lehrveranstaltung nach der letzten Wiederholungsmöglichkeit negativ beurteilt, darf dieder Studierende an keiner kommissionellen Wiederholungsprüfung im Semester der negativ beurteilen Lehrveranstaltung und im Folgesemester mehr teilnehmen (nicht-kommissionelle Wiederholungsprüfungen können wahrgenommen werden)', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'In any case, failed examinations and courses are to be repeated or attended again only if the purpose of the course makes it necessary. If a course is assessed negatively after the last opportunity to repeat it, the student may no longer take part in a board re-examination in the semester in which the course was assessed as negative and in the following semester (non-board re-examinations can be taken).', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'info_Wiederholung_Erstellt', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Info für Wiederholung Erstellt', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Info for Wiederholung Erstellt', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'antrag_Wiederholung_pruefung', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Negativ beurteilte kommissionelle Prüfung', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Negative assessment by a committee', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'antrag_Wiederholung_pruefung_date', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Datum der Beurteilung', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'date of assessment', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'antrag_Wiederholung_button_yes', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Ich gebe hiermit die Wiederholung des Studienjahres bekannt', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'I hereby announce the repetition of the academic year', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'antrag_Wiederholung_button_no', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Ich werde das Studienjahr nicht wiederholen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'I will not repeat the academic year', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + 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', + 'phrase' => 'antrag_header', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Antrag auf Änderung des Studierendenstatus', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Request for changing the Studierendenstatus', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'btn_new', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Neu Anlegen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Create new', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'ui', + 'phrase' => 'cancel', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Abbrechen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Cancel', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'ui', + 'phrase' => 'ok', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Ok', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Ok', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'btn_create', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Anlegen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Create', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'btn_create_Abmeldung', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Vom Studium abmelden', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Deregister from your studies', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'btn_create_Unterbrechung', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Das Studium unterbrechen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Interrupt your studies', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'btn_cancel', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Antrag zurückziehen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Cancel Application', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'warning_Abmeldung', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Ihr CIS-Account ist noch 21 Tage aktiv. Wir bitten Sie, alle benötigten Dateien (Zeugnisse, Studienerfolgsbestätigungen, Studienbestätigungen, etc.) innerhalb dieses Zeitraums herunterzuladen. Für die Ausstellung von Duplikaten fallen nach Inaktivsetzung des CIS-Accounts Kosten an.' . "
\n" . + 'Bitte retournieren Sie baldmöglichst entlehnte Bücher an die Bibliothek.', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Your CIS account is still active for 21 days. We ask you to download all required files (certificates, confirmations of academic success, confirmation of studies, etc.) within this period. There is a charge for issuing duplicates after the CIS account has been deactivated.' . "
\n" . + 'Please return borrowed books to the library as soon as possible.', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'title_Abmeldung', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Abmeldung', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'De-registration', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'title_Unterbrechung', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Unterbrechung', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Interruption', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'title_Wiederholung', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Wiederholung', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Repetition', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'title_new_Abmeldung', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Neue Abmeldung', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'New de-registration', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'antrag_typ', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Typ', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Type', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'antrag_status', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Status', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Status', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'antrag_studiensemester', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Studiensemester', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Semester', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'antrag_erstelldatum', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Erstelldatum', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Createdate', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'studierendenantraege', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Studierendenanträge', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Applications', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'antrag_datum_wiedereinstieg', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Datum Wiedereinstieg', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Date of return', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'antrag_grund', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Grund', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Reason', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'antrag_dateianhaenge', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Dateianhänge', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Attachments', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'antrag_anhang', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Anhang', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Attachment', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'antrag_typ_Abmeldung', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Abmeldung', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Deregistration', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'antrag_typ_Unterbrechung', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Unterbrechung', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Break', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'antrag_typ_Wiederholung', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Wiederholung', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Repetition', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'btn_show_lvs', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'LVs anzeigen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Show LVs', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'btn_edit', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Bearbeiten', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Edit', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'btn_reopen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Erneut Freischalten', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Reopen', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'btn_object', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Beeinspruchen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Object', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'btn_objection_deny', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Einspruch abgelehnt', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Objection rejected', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'btn_objection_approve', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Einspruch stattgegeben', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Objection granted', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'btn_lvzuweisen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'LVs zuweisen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Assign Lvs', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'btn_approve', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Genehmigen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Approve', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'btn_reject', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Ablehnen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Reject', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'ui', + 'phrase' => 'skip', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Überspringen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Skip', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'ui', + 'phrase' => 'select_studiensemester', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Studiensemester auswählen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Select a semester', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'btn_save_lvs', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Zuweisungen speichern', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Save assignments', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'btn_download_antrag', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'PDF herunterladen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Download PDF', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'table', + 'phrase' => 'download', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Download', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Download', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'table', + 'phrase' => 'reload', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Tabelle neu laden', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Reload table', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'error_no_student', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Sie sind derzeit in keinem Studium', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'You are currently not enrolled', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'error_no_student_no_failed_exam', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Sie sind derzeit in keinem Studium oder haben keine negativ beurteilte kommissionelle Prüfung', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'You are not currently studying or have not passed a board examination with negative reasons', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'no_attachments', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Keine Dateianhänge', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'No Attachments', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'lehre', + 'phrase' => 'prestudent', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Prestudent', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Prestudent', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'lehre', + 'phrase' => 'studienjahr', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Studienjahr', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Academic year', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'title_lvzuweisen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Lehrveranstaltungen zuweisen für {name}', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Assign Courses for {name}', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'title_lv_nicht_zugelassen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Angabe aller Lehrveranstaltungen, zu denen die Person nicht zugelassen ist', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Details of all courses to which the person is not admitted', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'title_lv_wiederholen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Angabe aller zu wiederholenden bzw. erneut zu besuchenden Lehrveranstaltungen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Specification of all courses to be repeated or attended again', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'title_show_lvs', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Lehrveranstaltungen für {name}', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Courses for {name}', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'my_lvs', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Meine Lehrveranstaltungen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'My Courses', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'table', + 'phrase' => 'with_selected', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Mit {count} ausgewählten: ', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'With {count} selected: ', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'lv_nicht_zulassen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Nicht zulassen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Don\'t allow ', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'lv_wiederholen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Wiederholen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Repeat', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'title_history', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Statusverlauf für Antrag #{id} ', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'History for Application #{id}', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'anmerkung_tooltip', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Die Spalte Anmerkung kann verwendet werden, um Besonderheiten z.B. bei einem Studienplanwechsel zu dokumentieren (Änderung von LV-Titel, ECTS…) ', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'The Comment column can be used to document special features, e.g. when changing the curriculum (change of course title, ECTS...)', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'fuer_alle_uebernehmen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'für alle übernehmen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'apply for all', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'fuer_x_uebernehmen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Auswahl für {count} weitere(n) Wiederholungsanträge übernehmen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Adopt selection for {count} further repeat applications', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'title_grund', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Grund für Ablehnung von Antrag #{id}', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Reason for rejection of Application #{id}', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'error_no_lvs', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Keine Lehrveranstaltungen zugewiesen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'No courses assigned', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'status_x', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Status: {status}', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Status: {status}', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'status_saving', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Daten werden gespeichert...', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Saving...', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'status_error', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Fehler', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Error', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'status_open', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Offen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Open', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'status_created', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Erstellt', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Created', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'status_cancelling', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Zurückziehen...', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Cancelling...', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'status_cancelled', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Zurückgezogen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Cancelled', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'error_stg_blacklist', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Für diesen Studiengang sind keine Anträge möglich', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'No applications are accepted for this course', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'error_antrag_exists', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Es gibt bereits einen bestehenden Antrag', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'There is already an existing application', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'error_antrag_pending', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Es gibt bereits einen bestehenden Antrag vom Typ {typ}' , + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'There is already an existing application of type {typ}', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'error_no_antrag_found', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Kein Antrag mit AntragsId {id} gefunden' , + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'No application found with ApplicationId {id}', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'error_antrag_locked', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Dieser Antrag ist gesperrt' , + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'This request is locked', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'error_no_lv', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Keine Lehrveranstaltung ausgewählt' , + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'No course selected', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'error_no_lv_in_application', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Keine Lehrveranstaltung im Antrag gefunden' , + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'No course found in application', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'error_no_right', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Keine Berechtigung, den Antrag zu bearbeiten', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'No authorization to edit the application', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'error_no_objection', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Keine Berechtigung, den Antrag zu beeinspruchen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'No authorization to object the application', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'error_not_objected', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Antrag ist nicht beeinsprucht', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Application is not objected', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + ); diff --git a/system/vorlage_zip/AntragAbmeldung.odt b/system/vorlage_zip/AntragAbmeldung.odt new file mode 100644 index 0000000000000000000000000000000000000000..2e11ca60ae49eb67a843672bf6e2c87e5d31517c GIT binary patch literal 37277 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 literal 0 HcmV?d00001 diff --git a/system/vorlage_zip/AntragUnterbrechung.odt b/system/vorlage_zip/AntragUnterbrechung.odt new file mode 100644 index 0000000000000000000000000000000000000000..aeaa82105e7a130979d9a86f82ee5d622b610b7c GIT binary patch literal 34155 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

VY%NO_G+4oZkl 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Studiengang: + + + + + + Organisationsform: + + + + + + + + Abmeldung vom Studium durch Studierende + + + + + + + Name der*des Studierenden + + + + + + + + + + + Personenkennzeichen + + + + + + + + + + Studienjahr + + + + + + + + + + Semester + + + + + + + + + + Grund der Abmeldung: + + + + + + + + + + + + + + + Wir weisen Sie darauf hin, dass Ihr FHTW Account noch 21 Tage aktiv ist. Wir bitten Sie, alle benötigte Dateien (Zeugnisse, Studienerfolgsbestätigungen, Studienbestätigungen, etc.) innerhalb dieses Zeitraums herunterzuladen. Für die Ausstellung von Duplikaten fallen nach Inaktivsetzung des CIS-Accounts Kosten an. + + + Sie sind gem. Ausbildungsvertrag verpflichtet, unverzüglich alle zur Verfügung gestellten Gerätschaften, Bücher, Schlüssel und sonstige Materialien zurückzugeben. + + Bei Abmeldung vor dem 01.09. bzw. 15.02. und bereits eingezahltem Studienbeitrag für das kommende Semester: Wir informieren Sie darüber, dass der Studienbeitrag für das kommende Semester von Ihnen zurückgefordert werden kann. Bitte geben Sie uns dafür innerhalb von 14 Tagen Ihre Bankdaten an folgende E-Mail-Adresse bekannt: billing@technikum-wien.at. + + + + + + + + \ No newline at end of file diff --git a/system/xsl/AntragUnterbrechung.xsl b/system/xsl/AntragUnterbrechung.xsl new file mode 100644 index 000000000..f1ab10d91 --- /dev/null +++ b/system/xsl/AntragUnterbrechung.xsl @@ -0,0 +1,459 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Studiengang: + + + + + + + + Organisationsform: + + + + + + + + + Antrag auf Unterbrechung des Studiums + + + + + + + + Name der*des Studierenden + + + + + + + + + + + + + + Personenkennzeichen + + + + + + + + + + + + + + Studienjahr + + + + + + + + + + + + + + Aktuelles Semester + + + + + + + + + + + + Grund der Unterbrechung: + + + + + + + + + + + + + Wiedereinstieg am + + + + + + + + + + + + + + + + + + + + Datum: + + + + + + + + + + + + + + + + Infolge der Weiterentwicklung der Qualität des Studienganges kann es zu Änderungen der Studienbedingungen beim Wiedereinstieg kommen (z. B. Studienplan, Prüfungsordnung etc.) + + + Falls Sie das Studium im Wintersemester vor dem 15.10. bzw. im Sommersemester vor dem 15.3. beenden, wird Ihnen der Studienbeitrag für das aktuelle Semester rückerstattet. Bitte geben Sie uns innerhalb von 14 Tagen Ihre Bankdaten an folgende E-Mail-Adresse bekannt: + + + billing@technikum-wien.at + + + . + + + + + + \ No newline at end of file From b39fa7667e4f36d4db15a95007631bc0bc9c46c5 Mon Sep 17 00:00:00 2001 From: cgfhtw Date: Tue, 4 Jul 2023 11:09:55 +0200 Subject: [PATCH 051/268] Remove TODO --- application/controllers/components/Antrag/Wiederholung.php | 1 - 1 file changed, 1 deletion(-) diff --git a/application/controllers/components/Antrag/Wiederholung.php b/application/controllers/components/Antrag/Wiederholung.php index 7b5d8f887..941d6e51a 100644 --- a/application/controllers/components/Antrag/Wiederholung.php +++ b/application/controllers/components/Antrag/Wiederholung.php @@ -66,7 +66,6 @@ class Wiederholung extends FHC_Controller } $result = $result->retval; if (!$result) { - // TODO(chris): ERROR Message $this->output->set_status_header(REST_Controller::HTTP_FORBIDDEN); return $this->outputJsonError($this->p->t('studierendenantrag','error_no_student_no_failed_exam')); } From ff93cb26fe07985fcc0b29263c419c7b75b5d759 Mon Sep 17 00:00:00 2001 From: cgfhtw Date: Tue, 4 Jul 2023 11:10:26 +0200 Subject: [PATCH 052/268] Bug: status --- .../Studierendenantrag/Form/Wiederholung.js | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/public/js/components/Studierendenantrag/Form/Wiederholung.js b/public/js/components/Studierendenantrag/Form/Wiederholung.js index 4cbc32d88..ff37540bb 100644 --- a/public/js/components/Studierendenantrag/Form/Wiederholung.js +++ b/public/js/components/Studierendenantrag/Form/Wiederholung.js @@ -65,13 +65,15 @@ export default { ).then( result => { this.data = result.data.retval; - if (!this.data.status || this.data.status == 'ErsteAufforderungVersandt' || this.data.status == 'ZweiteAufforderungVersandt') + if (!this.data.status || this.data.status == 'ErsteAufforderungVersandt' || this.data.status == 'ZweiteAufforderungVersandt') { this.data.status = 'Offen'; + this.data.statustyp = this.p.t('studierendenantrag', 'status_open'); + } this.$emit('update:status', this.data.status); this.$emit("setStatus", { - msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.data.statustyp}), - severity: this.statusSeverity - }); + msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.data.statustyp}), + severity: this.statusSeverity + }); return result; } ); @@ -87,7 +89,7 @@ export default { let nextState = repeat ? 'Erstellt' : 'Verzichtet'; this.$emit('setStatus', { - msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t_ref('studierendenantrag', 'status_saving')}), + msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t('studierendenantrag', 'status_saving')}), severity: 'warning' }); this.saving = true; @@ -114,7 +116,7 @@ export default { this.errors.default.push(result.data.retval[k]); } this.$emit('setStatus', { - msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t_ref('studierendenantrag', 'status_error')}), + msg: this.p.t_ref('studierendenantrag', 'status_x', {status: this.p.t('studierendenantrag', 'status_error')}), severity: 'danger' }); } From 7eed07a68295d8b83db19e915983140282123ddb Mon Sep 17 00:00:00 2001 From: cgfhtw Date: Tue, 4 Jul 2023 13:37:54 +0200 Subject: [PATCH 053/268] LV zuweisung & anzeige: handle semester above max_semester & anmerkung bug --- application/libraries/AntragLib.php | 30 ++++++--- .../Studierendenantrag/Leitung/LvPopup.js | 63 ++++++++++--------- .../Studierendenantrag/Lvzuweisung.js | 15 ++++- system/phrasesupdate.php | 20 ++++++ 4 files changed, 87 insertions(+), 41 deletions(-) diff --git a/application/libraries/AntragLib.php b/application/libraries/AntragLib.php index 38504772c..f1a757bc2 100644 --- a/application/libraries/AntragLib.php +++ b/application/libraries/AntragLib.php @@ -765,14 +765,16 @@ class AntragLib ); if (isError($result)) return $result; - $lvsA = getData($result) ?: []; - foreach($lvsA as $lv) - { - if (isset($lvszugewiesen[$lv->lehrveranstaltung_id]) && - ($lvszugewiesen[$lv->lehrveranstaltung_id]->note == $this->_ci->config->item('wiederholung_note_nicht_zugelassen'))) + $lvsA = $result->retval; // NOTE(chris): don't use getData() because we want to differenciate [] and null + if ($lvsA) { + foreach($lvsA as $lv) { - $lv->antrag_zugelassen = true; - $lv->antrag_anmerkung = $lvszugewiesen[$lv->lehrveranstaltung_id]->anmerkung; + if (isset($lvszugewiesen[$lv->lehrveranstaltung_id]) && + ($lvszugewiesen[$lv->lehrveranstaltung_id]->note == $this->_ci->config->item('wiederholung_note_nicht_zugelassen'))) + { + $lv->antrag_zugelassen = true; + $lv->antrag_anmerkung = $lvszugewiesen[$lv->lehrveranstaltung_id]->anmerkung; + } } } @@ -798,7 +800,7 @@ class AntragLib } return success([ - '1' . $semA => $lvsA ?: [], + '1' . $semA => $lvsA, '2' . $semB => $lvsB ?: [] ]); } @@ -822,13 +824,23 @@ class AntragLib if (isError($result)) return $result; $result = getData($result); - if (!$result) + if (!$result) { + $result = $this->_ci->StudiengangModel->load($studiengang_kz); + if (isError($result)) + return $result; + if (!hasData($result)) + return error('No Studiengang found with studiengang_kz: ' . $studiengang_kz); + $stg = current(getData($result)); + + if ($ausbildungssemester > $stg->max_semester) + return success(); return error('No studienplan found for stg: ' . $studiengang_kz . ', studiensemester: ' . $studiensemester_kurzbz . ', ausbildungssemester: ' . ($ausbildungssemester)); + } if (count($result) > 1) return error('Multiple studienplaene found for stg: ' . $studiengang_kz . diff --git a/public/js/components/Studierendenantrag/Leitung/LvPopup.js b/public/js/components/Studierendenantrag/Leitung/LvPopup.js index 045e98729..c3f2aa118 100644 --- a/public/js/components/Studierendenantrag/Leitung/LvPopup.js +++ b/public/js/components/Studierendenantrag/Leitung/LvPopup.js @@ -25,12 +25,12 @@ export default { lvzugelassen() { let zwischen = {}; for (let k in this.lvs){ - zwischen[k] = this.lvs[k].filter(lv=>lv.antrag_zugelassen); + zwischen[k] = this.lvs[k] ? this.lvs[k].filter(lv=>lv.antrag_zugelassen) : null; } return zwischen; }, lvzugelassenLength() { - return Object.values(this.lvzugelassen).reduce((result, current) => result + current.length, 0); + return Object.values(this.lvzugelassen).reduce((result, current) => result + (current ? current.length : 0), 0); } }, methods: { @@ -86,7 +86,7 @@ export default { {{sem.substr(1)}} -

{{p.t('ui','bezeichnung')}} {{p.t('lehre','lehrform')}}
- - -
- {{lv.lehrform_kurzbz}} -
-
-
- {{lv.ects}} -
-
-
- {{lv.note || '---'}} -
-
-
- {{lv.antrag_anmerkung}} -
-
{{p.t('studierendenantrag/error_stg_last_semester')}}
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 054/268] =?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 61856473eaf40242128fd170c23d156bc0b3c0ba Mon Sep 17 00:00:00 2001 From: cgfhtw Date: Wed, 5 Jul 2023 08:30:33 +0200 Subject: [PATCH 055/268] 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 057/268] 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 058/268] 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 059/268] 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 060/268] 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 078/268] =?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 079/268] - 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 f8da119ad78917de274dc7e11e12131592b02874 Mon Sep 17 00:00:00 2001 From: cgfhtw Date: Thu, 13 Jul 2023 11:48:25 +0200 Subject: [PATCH 080/268] Abmeldung: Einspruch Abgelehnt handling --- .../controllers/components/Antrag/Leitung.php | 2 +- application/controllers/jobs/AntragJob.php | 1 - application/libraries/AntragLib.php | 77 ++++++++++++++++++- .../Studierendenantragstatus_model.php | 1 + .../27351_digitalisierung_formulare.php | 5 +- system/phrasesupdate.php | 40 ++++++++++ 6 files changed, 121 insertions(+), 5 deletions(-) diff --git a/application/controllers/components/Antrag/Leitung.php b/application/controllers/components/Antrag/Leitung.php index 9df8fdb75..c107fbb63 100644 --- a/application/controllers/components/Antrag/Leitung.php +++ b/application/controllers/components/Antrag/Leitung.php @@ -145,7 +145,7 @@ class Leitung extends FHC_Controller $studierendenantrag_id = $this->input->post('studierendenantrag_id'); - $result = $this->antraglib->approveAbmeldung([$studierendenantrag_id], getAuthUID()); + $result = $this->antraglib->denyObjectionAbmeldung($studierendenantrag_id, getAuthUID()); if (isError($result)) return $this->outputJsonError(['studierendenantrag_id' => getError($result)]); diff --git a/application/controllers/jobs/AntragJob.php b/application/controllers/jobs/AntragJob.php index 39c2519af..ca4f06690 100644 --- a/application/controllers/jobs/AntragJob.php +++ b/application/controllers/jobs/AntragJob.php @@ -200,7 +200,6 @@ class AntragJob extends JOB_Controller foreach ($antraege as $antrag) { - $result = $this->prestudentlib->setAbbrecher($antrag->prestudent_id, $antrag->studiensemester_kurzbz, $insertvon, 'abbrecherStgl', $antrag->insertamum); if (isError($result)) $this->logError(getError($result)); diff --git a/application/libraries/AntragLib.php b/application/libraries/AntragLib.php index d02ce9012..c725c6ea9 100644 --- a/application/libraries/AntragLib.php +++ b/application/libraries/AntragLib.php @@ -145,7 +145,7 @@ class AntragLib 'studierendenantrag_id' => $studierendenantrag_id, 'studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_APPROVED, 'insertvon' => $insertvon, - 'insertam' => $insertam + 'insertamum' => $insertam ]); if (isError($result)) $errors[] = getError($result); @@ -244,6 +244,81 @@ class AntragLib return success(); } + /** + * @param integer $studierendenantrag_id + * @param string $insertvon + * + * @return stdClass + */ + public function denyObjectionAbmeldung($studierendenantrag_id, $insertvon) + { + $result = $this->_ci->StudierendenantragModel->load($studierendenantrag_id); + if (isError($result)) + { + return $result; + } + if(!hasData($result)) + { + return error($this->_ci->p->t('studierendenantrag', 'error_no_antrag_found', ['id' => $studierendenantrag_id])); + } + $antrag = getData($result)[0]; + + $result = $this->_ci->StudierendenantragstatusModel->loadWhere([ + 'studierendenantrag_id' => $studierendenantrag_id, + 'studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_APPROVED + ]); + if (isError($result)) + return $result; + if (!hasData($result)) + return error($this->_ci->p->t('studierendenantrag', 'error_not_approved')); + + $status = current(getData($result)); + + $result = $this->_ci->StudierendenantragstatusModel->insert([ + 'studierendenantrag_id' => $studierendenantrag_id, + 'studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_OBJECTION_DENIED, + 'insertvon' => $insertvon + ]); + if (isError($result)) + return $result; + else { + $result = $this->_ci->prestudentlib->setAbbrecher($antrag->prestudent_id, $antrag->studiensemester_kurzbz, $insertvon, 'abbrecherStgl', $status->insertamum); + + if (isError($result)) + return $result; + + $res = $this->_ci->PrestudentModel->load($antrag->prestudent_id); + + if (hasData($res)) { + $prestudent = current(getData($res)); + $res = $this->_ci->PersonModel->load($prestudent->person_id); + if (hasData($res)) { + $person = current(getData($res)); + $name = trim($person->vorname . ' ' . $person->nachname); + } else { + $name = $this->_ci->p->t('person', 'studentIn'); + } + $res = $this->_ci->KontaktModel->getZustellKontakt($prestudent->person_id, ['email']); + if (hasData($res)) { + $kontakt = current(getData($res)); + $email = $kontakt->kontakt; + sendSanchoMail( + // TODO(chris): Vorlage erstellen + 'Sancho_Mail_Antrag_A_ObjectionDenied', + [ + 'name' => $name, + 'grund' => $antrag->grund + ], + $email, + $this->_ci->p->t('studierendenantrag', 'mail_subject_A_ObjectionDenied') + ); + } + } + } + + return success(); + } + /** * NOTE(chris): permissions & verification must be handled outside * diff --git a/application/models/education/Studierendenantragstatus_model.php b/application/models/education/Studierendenantragstatus_model.php index 8f737f458..5355ecdba 100644 --- a/application/models/education/Studierendenantragstatus_model.php +++ b/application/models/education/Studierendenantragstatus_model.php @@ -13,6 +13,7 @@ class Studierendenantragstatus_model extends DB_Model const STATUS_REQUESTSENT_1 = 'ErsteAufforderungVersandt'; const STATUS_REQUESTSENT_2 = 'ZweiteAufforderungVersandt'; const STATUS_OBJECTED = 'Beeinsprucht'; + const STATUS_OBJECTION_DENIED = 'EinspruchAbgelehnt'; /** * Constructor diff --git a/system/dbupdate_3.4/27351_digitalisierung_formulare.php b/system/dbupdate_3.4/27351_digitalisierung_formulare.php index 5041b86f5..341b34b67 100644 --- a/system/dbupdate_3.4/27351_digitalisierung_formulare.php +++ b/system/dbupdate_3.4/27351_digitalisierung_formulare.php @@ -28,15 +28,16 @@ if($result = @$db->db_query("SELECT 1 FROM campus.tbl_studierendenantrag_statust VALUES ('Erstellt', '{\"Erstellt\",\"Created\"}'), ('Genehmigt', '{\"Genehmigt\",\"Approved\"}'), - ('Beeinsprucht', '{\"Beeinsprucht\",\"Objected\"}'), ('Abgelehnt', '{\"Abgelehnt\",\"Rejected\"}'), ('Verzichtet', '{\"Verzichtet\",\"Pass\"}'), ('Offen', '{\"Offen\",\"Reopened\"}'), ('Zurückgezogen', '{\"Zurückgezogen\",\"Cancelled\"}'), + ('Lvszugewiesen', '{\"Lvszugewiesen\",\"Lvsassigned\"}'), ('EmailVersandt', '{\"Email Versandt\",\"Reminder Sent\"}'), ('ErsteAufforderungVersandt', '{\"1.Aufforderung Versandt\",\"1st Request Sent\"}'), ('ZweiteAufforderungVersandt', '{\"2.Aufforderung Versandt\",\"2nd Request Sent\"}'), - ('Lvszugewiesen', '{\"Lvszugewiesen\",\"Lvsassigned\"}'); + ('Beeinsprucht', '{\"Beeinsprucht\",\"Objected\"}'), + ('EinspruchAbgelehnt', '{\"Einspruch abgelehnt\",\"Objection denied\"}'); "; if (!$db->db_query($qry)) echo 'campus.tbl_studierendenantrag_statustyp (insert): '.$db->db_last_error().'
'; diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php index 155ef3217..18a61f1d1 100644 --- a/system/phrasesupdate.php +++ b/system/phrasesupdate.php @@ -20106,6 +20106,26 @@ array( ) ) ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'error_not_approved', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Antrag ist nicht bestätigt worden', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Application is not approved', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), array( 'app' => 'core', 'category' => 'studierendenantrag', @@ -20426,6 +20446,26 @@ array( ) ) ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'mail_subject_A_ObjectionDenied', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Ihr Einspruch wurde Abgelehnt', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Your objection was denied', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), array( 'app' => 'core', 'category' => 'studierendenantrag', From c8fc6c747ffea3803de12716469e593378c925ae Mon Sep 17 00:00:00 2001 From: cgfhtw Date: Thu, 13 Jul 2023 13:57:17 +0200 Subject: [PATCH 081/268] Table height & Bug: Allowed/Shown Stgs in Component --- .../controllers/components/Antrag/Leitung.php | 44 +++++++++++++++++++ .../controllers/lehre/Studierendenantrag.php | 4 +- .../models/organisation/Studiengang_model.php | 14 ++++++ .../components/Studierendenantrag/Leitung.js | 39 ++++++++-------- .../Studierendenantrag/Leitung/Table.js | 2 +- 5 files changed, 80 insertions(+), 23 deletions(-) diff --git a/application/controllers/components/Antrag/Leitung.php b/application/controllers/components/Antrag/Leitung.php index c107fbb63..54e5b65e6 100644 --- a/application/controllers/components/Antrag/Leitung.php +++ b/application/controllers/components/Antrag/Leitung.php @@ -29,6 +29,50 @@ class Leitung extends FHC_Controller //------------------------------------------------------------------------------------------------------------------ // Public methods + public function getActiveStgs() + { + $studiengaenge = $this->permissionlib->getSTG_isEntitledFor('student/antragfreigabe'); + $stgsNeuanlage = $this->permissionlib->getSTG_isEntitledFor('student/studierendenantrag'); + + $stgs = []; + + if ($studiengaenge) { + $result = $this->StudierendenantragModel->loadForStudiengaenge($studiengaenge); + + if (isError($result)) + return $this->outputJson($result); + $antraege = getData($result) ?: []; + + foreach ($antraege as $antrag) { + if (!isset($stgs[$antrag->studiengang_kz])) { + $stgs[$antrag->studiengang_kz] = new stdClass(); + $stgs[$antrag->studiengang_kz]->bezeichnung = $antrag->bezeichnung; + $stgs[$antrag->studiengang_kz]->orgform = $antrag->orgform; + $stgs[$antrag->studiengang_kz]->studiengang_kz = $antrag->studiengang_kz; + } + } + } + + if ($stgsNeuanlage) { + $result = $this->StudierendenantragModel->loadForStudiengaenge($stgsNeuanlage); + + if (isError($result)) + return $this->outputJson($result); + $antraege = getData($result) ?: []; + + foreach ($antraege as $antrag) { + if (!isset($stgs[$antrag->studiengang_kz])) { + $stgs[$antrag->studiengang_kz] = new stdClass(); + $stgs[$antrag->studiengang_kz]->bezeichnung = $antrag->bezeichnung; + $stgs[$antrag->studiengang_kz]->orgform = $antrag->orgform; + $stgs[$antrag->studiengang_kz]->studiengang_kz = $antrag->studiengang_kz; + } + } + } + + $this->outputJsonSuccess($stgs); + } + public function getAntraege($studiengang = null) { diff --git a/application/controllers/lehre/Studierendenantrag.php b/application/controllers/lehre/Studierendenantrag.php index f27350e9a..c0ac284b3 100644 --- a/application/controllers/lehre/Studierendenantrag.php +++ b/application/controllers/lehre/Studierendenantrag.php @@ -82,7 +82,7 @@ class Studierendenantrag extends FHC_Controller $stgL = []; if ($studiengaenge) { - $result = $this->StudierendenantragModel->loadForStudiengaenge($studiengaenge); + $result = $this->StudiengangModel->loadWithOrgform($studiengaenge); if (isError($result)) return show_error(getError($result)); $antraege = getData($result) ?: []; @@ -99,7 +99,7 @@ class Studierendenantrag extends FHC_Controller $stgA = []; if ($stgsNeuanlage) { - $result = $this->StudierendenantragModel->loadForStudiengaenge($stgsNeuanlage); + $result = $this->StudiengangModel->loadWithOrgform($stgsNeuanlage); if (isError($result)) return show_error(getError($result)); $antraege = getData($result) ?: []; diff --git a/application/models/organisation/Studiengang_model.php b/application/models/organisation/Studiengang_model.php index 0d2328b14..1fb733d04 100644 --- a/application/models/organisation/Studiengang_model.php +++ b/application/models/organisation/Studiengang_model.php @@ -525,6 +525,20 @@ class Studiengang_model extends DB_Model return $this->execQuery($query, $params); } + public function loadWithOrgform($studiengang_kzs) + { + $sql = "SELECT index FROM public.tbl_sprache WHERE sprache='" . getUserLanguage() . "' LIMIT 1"; + + $this->addSelect($this->dbTable . '.*'); + $this->addSelect('o.bezeichnung_mehrsprachig[(' . $sql . ')] AS orgform'); + + $this->addJoin('bis.tbl_orgform o', 'orgform_kurzbz'); + + $this->db->where_in($this->dbTable . '.studiengang_kz', $studiengang_kzs); + + return $this->load(); + } + /** * @param array $studiengang_kzs * @param array $not_antrag_typ (optional) If the prestudent has an antrag with one of the specified types it will be excluded from the result diff --git a/public/js/components/Studierendenantrag/Leitung.js b/public/js/components/Studierendenantrag/Leitung.js index f08da3879..ba7af0a2c 100644 --- a/public/js/components/Studierendenantrag/Leitung.js +++ b/public/js/components/Studierendenantrag/Leitung.js @@ -23,45 +23,41 @@ export default { return { filter: undefined, selectedData: [], - columns: [] + columns: [], + stgs: [] } }, computed: { - stgs(){ - if(!this.stgL || !this.stgA) - return[]; - let undesiredOutput = [...this.stgL, ...this.stgA]; - let desiredOutput = undesiredOutput.reduce( - (accumulator, currentValue)=> - { - accumulator[currentValue.studiengang_kz] = currentValue; - return accumulator; - }, - {} - ); - return Object.values(desiredOutput); - - }, - stgkzL() - { + stgkzL() { if (!this.stgL) return []; return this.stgL.map(stg => stg.studiengang_kz); }, - stgkzA() - { + stgkzA() { if (!this.stgA) return []; return this.stgA.map(stg => stg.studiengang_kz); } }, methods: { + loadFilter() { + axios.get( + FHC_JS_DATA_STORAGE_OBJECT.app_root + + FHC_JS_DATA_STORAGE_OBJECT.ci_router + + '/components/Antrag/Leitung/getActiveStgs' + ).then(result => { + this.stgs = Object.values(result.data.retval).sort((a,b) => a.bezeichnung == b.bezeichnung ? (a.orgform == b.orgform ? 0 : (a.orgform > b.orgform ? 1 : -1)) : (a.bezeichnung > b.bezeichnung ? 1 : -1)); + }).catch(error => { + console.error(error); + }); + }, changeFilter(evt) { this.filter = evt.target.value || undefined; this.reload(); }, reload() { this.$refs.table.reload(this.filter); + this.loadFilter(); }, download() { this.$refs.table.download(); @@ -270,6 +266,9 @@ export default { BsAlert.popup(msg, {dialogClass: 'alert alert-danger'}); } }, + created() { + this.loadFilter(); + }, template: `
Date: Thu, 13 Jul 2023 14:44:51 +0200 Subject: [PATCH 082/268] Bug: Studierenden-Ansicht: Abmeldung bearbeiten bei mehrfachen Abmeldungen --- .../controllers/components/Antrag/Abmeldung.php | 10 +++++++--- application/libraries/AntragLib.php | 8 ++++++-- .../components/Studierendenantrag/Form/Abmeldung.js | 13 ++++++++++--- 3 files changed, 23 insertions(+), 8 deletions(-) diff --git a/application/controllers/components/Antrag/Abmeldung.php b/application/controllers/components/Antrag/Abmeldung.php index 8c728c804..55435c1f6 100644 --- a/application/controllers/components/Antrag/Abmeldung.php +++ b/application/controllers/components/Antrag/Abmeldung.php @@ -57,13 +57,17 @@ class Abmeldung extends FHC_Controller } elseif ($result == -1) { - $result = $this->antraglib->getDetailsForLastAntrag($prestudent_id, Studierendenantrag_model::TYP_ABMELDUNG); + $result = $this->antraglib->getDetailsForLastAntrag($prestudent_id, [Studierendenantrag_model::TYP_ABMELDUNG, Studierendenantrag_model::TYP_ABMELDUNG_STGL]); if (isError($result)) { return $this->outputJsonError(getError($result)); } $data = getData($result); - $data->canCancel = (boolean)$this->antraglib->isEntitledToCancelAntrag($data->studierendenantrag_id); + + $data->canCancel = ( + $data->status == Studierendenantragstatus_model::STATUS_CREATED && + $this->antraglib->isEntitledToCancelAntrag($data->studierendenantrag_id) + ); return $this->outputJsonSuccess($data); } @@ -87,7 +91,7 @@ class Abmeldung extends FHC_Controller $data = getData($result); - if ($data->typ !== Studierendenantrag_model::TYP_ABMELDUNG_STGL) + if ($data->typ !== Studierendenantrag_model::TYP_ABMELDUNG_STGL && $data->typ !== Studierendenantrag_model::TYP_ABMELDUNG) return show_404(); $this->outputJsonSuccess($data); diff --git a/application/libraries/AntragLib.php b/application/libraries/AntragLib.php index c725c6ea9..bda165e0f 100644 --- a/application/libraries/AntragLib.php +++ b/application/libraries/AntragLib.php @@ -1204,8 +1204,12 @@ class AntragLib $where = [ 'prestudent_id' => $prestudent_id ]; - if ($typ) - $where['typ'] = $typ; + if ($typ) { + if (is_array($typ)) + $this->_ci->StudierendenantragModel->db->where_in('typ', $typ); + else + $where['typ'] = $typ; + } $result = $this->_ci->StudierendenantragModel->loadWithStatusWhere($where); if (isError($result)) return $result; diff --git a/public/js/components/Studierendenantrag/Form/Abmeldung.js b/public/js/components/Studierendenantrag/Form/Abmeldung.js index 0de6e3d16..7018237fb 100644 --- a/public/js/components/Studierendenantrag/Form/Abmeldung.js +++ b/public/js/components/Studierendenantrag/Form/Abmeldung.js @@ -15,7 +15,8 @@ export default { 'setStatus' ], props: { - prestudentId: Number + prestudentId: Number, + studierendenantragId: Number }, data() { return { @@ -35,6 +36,13 @@ export default { case 'Genehmigt': return 'success'; default: return 'info'; } + }, + loadUrl() { + if (this.studierendenantragId) + return '/components/Antrag/Abmeldung/getDetailsForAntrag/'+ + this.studierendenantragId; + return '/components/Antrag/Abmeldung/getDetailsForNewAntrag/' + + this.prestudentId; } }, methods: { @@ -42,8 +50,7 @@ export default { return axios.get( FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + - '/components/Antrag/Abmeldung/getDetailsForNewAntrag/' + - this.prestudentId + this.loadUrl ).then( result => { this.data = result.data.retval; From b04aefc105bc922c219099052f976ec0fc8a1765 Mon Sep 17 00:00:00 2001 From: cgfhtw Date: Thu, 13 Jul 2023 16:13:40 +0200 Subject: [PATCH 083/268] =?UTF-8?q?Unterbrechung=20nur=20f=C3=BCr=20das=20?= =?UTF-8?q?Aktuelle=20und=20kommende=20Semester?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- application/libraries/AntragLib.php | 45 ++++++++++--------- .../organisation/Studiensemester_model.php | 30 ------------- .../Studierendenantrag/Form/Unterbrechung.js | 37 ++++++++------- 3 files changed, 42 insertions(+), 70 deletions(-) diff --git a/application/libraries/AntragLib.php b/application/libraries/AntragLib.php index bda165e0f..6e05380a5 100644 --- a/application/libraries/AntragLib.php +++ b/application/libraries/AntragLib.php @@ -1279,35 +1279,38 @@ class AntragLib $this->_ci->load->model('organisation/Studienplan_model', 'StudienplanModel'); $this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + $semester = []; + $result = $this->_ci->StudienplanModel->getStudienplaeneBySemester($studiengang_kz, $studiensemester_kurzbz, $ausbildungssemester); if (!hasData($result)) - return []; + return $semester; - $studienplaene = getData($result); - $studienplan_ids = array_map(function ($studienplan) { - return $studienplan->studienplan_id; - }, $studienplaene); - - $result = $this->_ci->StudiensemesterModel->getFollowingSemester($studienplan_ids, $studiensemester_kurzbz, $ausbildungssemester); + $result = $this->_ci->StudiensemesterModel->getNextFrom($studiensemester_kurzbz); if (!hasData($result)) - return []; + return $semester; + $nextSem = current(getData($result)); - $stsems = getData($result); + $semester[] = [ + 'studiensemester_kurzbz' => $studiensemester_kurzbz, + 'wiedereinstieg' => $nextSem->start + ]; - $result = $this->_ci->StudiensemesterModel->loadWhere(); + $result = $this->_ci->StudienplanModel->getStudienplaeneBySemester($studiengang_kz, $nextSem->studiensemester_kurzbz, $ausbildungssemester+1); if (!hasData($result)) - return []; - $result = getData($result); - usort($result, function($a, $b) { - return $a->start > $b->start ? 1 : -1; - }); - foreach ($stsems as $stsem) { - $stsem->wiedereinstieg = array_filter($result, function ($sem) use ($stsem) { - return $sem->start > $stsem->ende; - }); - } + return $semester; - return $stsems; + $result = $this->_ci->StudiensemesterModel->getNextFrom($nextSem->studiensemester_kurzbz); + if (!hasData($result)) + return $semester; + + $semAfterNext = current(getData($result)); + + $semester[] = [ + 'studiensemester_kurzbz' => $nextSem->studiensemester_kurzbz, + 'wiedereinstieg' => $semAfterNext->start + ]; + + return $semester; } public function getAktivePrestudentenInStgs($studiengaenge, $query) diff --git a/application/models/organisation/Studiensemester_model.php b/application/models/organisation/Studiensemester_model.php index 6daa76b59..bb9b94c92 100644 --- a/application/models/organisation/Studiensemester_model.php +++ b/application/models/organisation/Studiensemester_model.php @@ -204,34 +204,4 @@ class Studiensemester_model extends DB_Model return $this->execQuery($query, array($studiensemester_kurzbz)); } - - public function getFollowingSemester($studienplan_ids, $studiensemester_kurzbz, $ausbildungssemester) - { - $query = ' - WITH RECURSIVE following(studiensemester_kurzbz, semester, start) AS ( - SELECT studiensemester_kurzbz, ?, start - FROM public.tbl_studiensemester - WHERE studiensemester_kurzbz=? - UNION ALL - SELECT * FROM ( - SELECT s.studiensemester_kurzbz, s.semester, ss.start - FROM lehre.tbl_studienplan_semester s - JOIN public.tbl_studiensemester ss USING(studiensemester_kurzbz) - INNER JOIN following a ON(s.semester=a.semester+1 AND ss.start > a.start) - WHERE studienplan_id IN ? - ORDER BY start ASC - LIMIT 1 - ) wrapper - ) - SELECT sem.*, following.semester - FROM following - LEFT JOIN ' . $this->dbTable . ' sem USING(studiensemester_kurzbz) - ORDER BY start'; - - return $this->execQuery($query, [ - $ausbildungssemester, - $studiensemester_kurzbz, - $studienplan_ids - ]); - } } diff --git a/public/js/components/Studierendenantrag/Form/Unterbrechung.js b/public/js/components/Studierendenantrag/Form/Unterbrechung.js index 2034361bc..e1322067f 100644 --- a/public/js/components/Studierendenantrag/Form/Unterbrechung.js +++ b/public/js/components/Studierendenantrag/Form/Unterbrechung.js @@ -53,9 +53,18 @@ export default { this.prestudentId; }, datumWsFormatted() { - if(!this.data.datum_wiedereinstieg) - return ''; - let datum = new Date(this.data.datum_wiedereinstieg); + let datumUnformatted = ''; + + if (this.studierendenantragId) { + if (this.data.datum_wiedereinstieg) + datumUnformatted = this.data.datum_wiedereinstieg; + } else { + if (this.stsem !== null && this.data.studiensemester[this.stsem].wiedereinstieg) + datumUnformatted = this.data.studiensemester[this.stsem].wiedereinstieg; + } + if (datumUnformatted === '') + return datumUnformatted; + let datum = new Date(datumUnformatted); return datum.toLocaleDateString(); } }, @@ -93,7 +102,7 @@ export default { formData.append("studiensemester", this.stsem !== null && this.data.studiensemester[this.stsem].studiensemester_kurzbz); formData.append("prestudent_id", this.data.prestudent_id); formData.append("grund", this.$refs.grund.value); - formData.append("datum_wiedereinstieg", this.$refs.datum_wiedereinstieg && this.$refs.datum_wiedereinstieg.value); + formData.append("datum_wiedereinstieg", this.stsem !== null && this.data.studiensemester[this.stsem].wiedereinstieg); axios.post( FHC_JS_DATA_STORAGE_OBJECT.app_root + @@ -267,21 +276,11 @@ export default {
{{datumWsFormatted}}
-
- - +
+ {{p.t('ui/select_studiensemester')}} +
+
+ {{datumWsFormatted}}
From a53ca81784deea0b6b63e5f051cccf3486d24cff Mon Sep 17 00:00:00 2001 From: cgfhtw Date: Thu, 13 Jul 2023 16:51:14 +0200 Subject: [PATCH 084/268] =?UTF-8?q?Wording=20=C3=84nderung=20bei=20Studier?= =?UTF-8?q?endenansicht=20Wiederholung?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- system/phrasesupdate.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php index 18a61f1d1..e3bee6643 100644 --- a/system/phrasesupdate.php +++ b/system/phrasesupdate.php @@ -18351,13 +18351,13 @@ array( 'phrases' => array( array( 'sprache' => 'German', - 'text' => 'Ich werde das Studienjahr nicht wiederholen', + 'text' => 'Ich werde das Studienjahr nicht wiederholen und Abbrechen', 'description' => '', 'insertvon' => 'system' ), array( 'sprache' => 'English', - 'text' => 'I will not repeat the academic year', + 'text' => 'I will not repeat the academic year and will drop out', 'description' => '', 'insertvon' => 'system' ) From a96d99bcd15f8f085675dd439a64cb867ca3aba3 Mon Sep 17 00:00:00 2001 From: cgfhtw Date: Thu, 13 Jul 2023 16:51:54 +0200 Subject: [PATCH 085/268] Sammelmails: draft --- application/controllers/jobs/AntragJob.php | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/application/controllers/jobs/AntragJob.php b/application/controllers/jobs/AntragJob.php index ca4f06690..61c3a2eaa 100644 --- a/application/controllers/jobs/AntragJob.php +++ b/application/controllers/jobs/AntragJob.php @@ -28,6 +28,18 @@ class AntragJob extends JOB_Controller $this->load->model('crm/Student_model', 'StudentModel'); } + /** + * Send infomail to Stgl + */ + public function sendStglSammelmail() + { + // TODO(chris): get all Abmeldung:Created, Unterbrechung:Created, Wiederholung:LvZugeordnet + // TODO(chris): get stgs for all these + // TODO(chris): get stgls for all these + // TODO(chris): sort antraege in stgls + // TODO(chris): send email + } + /** * Send reminder to Assistant for Wiedereinstieg Unterbrecher * From 68fbc13a691c6f791f72faa711f128d9682e2204 Mon Sep 17 00:00:00 2001 From: KarpAlex Date: Sat, 15 Jul 2023 19:57:51 +0200 Subject: [PATCH 086/268] added first version of uhstat1 form, added unique constraint for person_id in uhstat1daten table, added permissions for uhstat1daten sequence --- application/controllers/codex/UHSTAT1.php | 301 ++++++++++++++++++ application/models/codex/Abschluss_model.php | 28 ++ .../models/codex/Uhstat1daten_model.php | 14 + application/views/codex/uhstat1.php | 217 +++++++++++++ ...uhstat1_daten_ueber_das_bewerbungstool.php | 6 +- 5 files changed, 565 insertions(+), 1 deletion(-) create mode 100644 application/controllers/codex/UHSTAT1.php create mode 100644 application/models/codex/Abschluss_model.php create mode 100644 application/models/codex/Uhstat1daten_model.php create mode 100644 application/views/codex/uhstat1.php diff --git a/application/controllers/codex/UHSTAT1.php b/application/controllers/codex/UHSTAT1.php new file mode 100644 index 000000000..071368aae --- /dev/null +++ b/application/controllers/codex/UHSTAT1.php @@ -0,0 +1,301 @@ + 'admin:r', + 'saveUHSTAT1Data' => 'admin:rw' + ) + ); + + // load ci libs + $this->load->library('form_validation'); + + // load ci helpers + $this->load->helper(array('form', 'url')); + + // load models + $this->load->model('codex/Oehbeitrag_model', 'OehbeitragModel'); + $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + $this->load->model('system/Sprache_model', 'SpracheModel'); + $this->load->model('codex/Abschluss_model', 'AbschlussModel'); + $this->load->model('codex/Uhstat1daten_model', 'Uhstat1datenModel'); + + $this->loadPhrases( + array( + 'ui', + 'uhstat' + ) + ); + } + + public function index() + { + $formData = $this->_getFormData(); + + if (!hasData($formData)) show_error("No form data could be loaded"); + + $this->load->view("codex/uhstat1.php", array('formData' => getData($formData))); + } + + /** + * Add or update UHSTAT1 data + */ + public function saveUHSTAT1Data() + { + $person_id = $this->input->get('person_id'); + + if (!isset($person_id) || !is_numeric($person_id)) show_error("Person Id missing"); + + $this->form_validation->set_error_delimiters('', ''); + + // check required fields + $this->form_validation->set_rules('geburtsstaat', 'Geburtsstaat', 'required', array('required' => $this->p->t('uhstat', 'feldFehlt'))); + $this->form_validation->set_rules( + 'mutter_geburtsstaat', + 'Geburtsstaat Mutter', + 'required', + array('required' => $this->p->t('uhstat', 'feldFehlt')) + ); + $this->form_validation->set_rules( + 'mutter_bildungsstaat', + 'Bildungsstaat Mutter', + 'required', + array('required' => $this->p->t('uhstat', 'feldFehlt')) + ); + $this->form_validation->set_rules( + 'mutter_geburtsjahr', + 'Geburtsjahr Mutter', + 'required', + array('required' => $this->p->t('uhstat', 'feldFehlt')) + ); + $this->form_validation->set_rules( + 'mutter_bildungmax', + 'Höchste Ausbildung Mutter', + 'required|callback_bildungsstaat_bildungmax_check[m]', + array( + 'required' => $this->p->t('uhstat', 'feldFehlt'), + 'bildungsstaat_bildungmax_check' => $this->p->t('uhstat', 'ausbildungBildungsstaatUebereinstimmung') + //'Land der höchsten Ausbildung muss mit Bildungsstaat übereinstimmen' + // Bildungsstaat should correspond to state of bildung max + ) + ); + $this->form_validation->set_rules( + 'vater_geburtsstaat', + 'Geburtsstaat Vater', + 'required', + array('required' => $this->p->t('uhstat', 'feldFehlt')) + ); + $this->form_validation->set_rules( + 'vater_bildungsstaat', + 'Bildungsstaat Vater', + 'required', + array('required' => $this->p->t('uhstat', 'feldFehlt')) + ); + $this->form_validation->set_rules( + 'vater_geburtsjahr', + 'Geburtsjahr Vater', + 'required', + array('required' => $this->p->t('uhstat', 'feldFehlt')) + ); + $this->form_validation->set_rules( + 'vater_bildungmax', + 'Höchste Ausbildung Vater', + 'required|callback_bildungsstaat_bildungmax_check[v]', + array( + 'required' => $this->p->t('uhstat', 'feldFehlt'), + 'bildungsstaat_bildungmax_check' => $this->p->t('uhstat', 'ausbildungBildungsstaatUebereinstimmung') + ) + ); + + $uhstat1datenRes = null; + if ($this->form_validation->run()) // if valid + { + // get post fields + $geburtsstaat = $this->input->post('geburtsstaat'); + $mutter_geburtsstaat = $this->input->post('mutter_geburtsstaat'); + $mutter_geburtsjahr = $this->input->post('mutter_geburtsjahr'); + $mutter_bildungsstaat = $this->input->post('mutter_bildungsstaat'); + $mutter_bildungmax = $this->input->post('mutter_bildungmax'); + $vater_geburtsstaat = $this->input->post('vater_geburtsstaat'); + $vater_geburtsjahr = $this->input->post('vater_geburtsjahr'); + $vater_bildungsstaat = $this->input->post('vater_bildungsstaat'); + $vater_bildungmax = $this->input->post('vater_bildungmax'); + + $uhstat1datenloadRes = $this->Uhstat1datenModel->loadWhere(array('person_id' => $person_id)); + + if (hasData($uhstat1datenloadRes)) + { + $uhstat1datenRes = $this->Uhstat1datenModel->update( + array('person_id' => $person_id), + array( + 'geburtsstaat' => $geburtsstaat, + 'mutter_geburtsstaat' => $mutter_geburtsstaat, + 'mutter_geburtsjahr' => $mutter_geburtsjahr, + 'mutter_bildungsstaat' => $mutter_bildungsstaat, + 'mutter_bildungmax' => $mutter_bildungmax, + 'vater_geburtsstaat' => $vater_geburtsstaat, + 'vater_geburtsjahr' => $vater_geburtsjahr, + 'vater_bildungsstaat' => $vater_bildungsstaat, + 'vater_bildungmax' => $vater_bildungmax + ) + ); + } + else + { + $uhstat1datenRes = $this->Uhstat1datenModel->insert( + array( + 'geburtsstaat' => $geburtsstaat, + 'mutter_geburtsstaat' => $mutter_geburtsstaat, + 'mutter_geburtsjahr' => $mutter_geburtsjahr, + 'mutter_bildungsstaat' => $mutter_bildungsstaat, + 'mutter_bildungmax' => $mutter_bildungmax, + 'vater_geburtsstaat' => $vater_geburtsstaat, + 'vater_geburtsjahr' => $vater_geburtsjahr, + 'vater_bildungsstaat' => $vater_bildungsstaat, + 'vater_bildungmax' => $vater_bildungmax, + 'person_id' =>$person_id + ) + ); + } + } + + $formData = $this->_getFormData(); + + if (!hasData($formData)) show_error("No data found"); + + // pass success/error messages to view + $successMessage = isset($uhstat1datenRes) && isSuccess($uhstat1datenRes) ? $this->p->t('uhstat', 'erfolgreichGespeichert') : ''; + $errorMessage = isset($uhstat1datenRes) && isError($uhstat1datenRes) ? $this->p->t('uhstat', 'fehlerBeimSpeichern') : ''; + + // load view with form data + $this->load->view("codex/uhstat1.php", array( + 'formData' => getData($formData), + 'successMessage' => $successMessage, + 'errorMessage' => $errorMessage + )); + } + + /** + * Check callback for Bildungsstaat - if Bildungsstaat is Austria, a highest education should be in Austria. + * @param $bildungmax + * @param $bildungsstaat_typ - mother (m) or father (v) + * @return bool true if valid, false otherwise + */ + public function bildungsstaat_bildungmax_check($bildungmax, $bildungsstaat_typ) + { + // valid if no type passed + if (!isset($bildungsstaat_typ)) return true; + + // get correct input + if ($bildungsstaat_typ == 'm') // mutter + $bildungsstaat = $this->input->post('mutter_bildungsstaat'); + elseif ($bildungsstaat_typ == 'v') // vater + $bildungsstaat = $this->input->post('vater_bildungsstaat'); + else + return true; + + if (!isset($bildungsstaat)) return true; + + // find out if abschluss is in Austria + $this->AbschlussModel->addSelect("in_oesterreich"); + $abschlussRes = $this->AbschlussModel->load($bildungmax); + + if (hasData($abschlussRes)) + { + $in_oesterreich = getData($abschlussRes)[0]->in_oesterreich; + // invalid if abschluss in Austria, but not Bildungsstaat, or abschluss not in Austria, but Bildungsstaat in Austria + return ($in_oesterreich && $bildungsstaat == self::CODEX_OESTERREICH) || (!$in_oesterreich && $bildungsstaat != self::CODEX_OESTERREICH); + } + + return false; + } + + /** + * Gets initial data needed to display UHSTAT1 form. + */ + private function _getFormData() + { + $person_id = $this->input->get('person_id'); + + if (!isset($person_id) || !is_numeric($person_id)) return error("Person Id missing"); + + $formData = 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'; + + // get nation list + $this->load->model('codex/Nation_model', 'NationModel'); + + $this->NationModel->addSelect("nation_code, $nationTextFieldName AS nation_text"); + $this->NationModel->addOrder("nation_text"); + $nationRes = $this->NationModel->load(); + + if (isError($nationRes)) return $nationRes; + + if (hasData($nationRes)) $formData['nation'] = getData($nationRes); + + // get abschluss list + $abschlussRes = $this->AbschlussModel->getActiveAbschluesse(); + + if (isError($abschlussRes)) return $abschlussRes; + + $abschlussData = getData($abschlussRes); + + if (hasData($abschlussRes)) + { + foreach (getData($abschlussRes) as $abschluss) + { + if ($abschluss->in_oesterreich === true) + $formData['abschluss_oesterreich'][] = $abschluss; + elseif ($abschluss->in_oesterreich === false) + $formData['abschluss_nicht_oesterreich'][] = $abschluss; + else + { + $formData['abschluss_oesterreich'][] = $abschluss; + $formData['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); + + return success($formData); + } + + /** + * Gets language index of currently logged in user. + * @return int (the index, start at 1) + */ + private function _getLanguageIndex() + { + $idx = 1; + $this->SpracheModel->addSelect('index'); + $langRes = $this->SpracheModel->loadWhere(array('sprache' => getUserLanguage())); + + if (hasData($langRes)) + { + $idx = getData($langRes)[0]->index; + } + + return $idx; + } +} diff --git a/application/models/codex/Abschluss_model.php b/application/models/codex/Abschluss_model.php new file mode 100644 index 000000000..93b940ed2 --- /dev/null +++ b/application/models/codex/Abschluss_model.php @@ -0,0 +1,28 @@ +dbTable = 'bis.tbl_abschluss'; + $this->pk = 'ausbildung_code'; + } + + public function getActiveAbschluesse() + { + return $this->execQuery( + ' + SELECT + ausbildung_code, bezeichnung, in_oesterreich + FROM + bis.tbl_abschluss + WHERE + aktiv + ORDER BY CASE WHEN in_oesterreich THEN 0 ELSE 1 END, ausbildung_code' + ); + } +} diff --git a/application/models/codex/Uhstat1daten_model.php b/application/models/codex/Uhstat1daten_model.php new file mode 100644 index 000000000..9bca44b58 --- /dev/null +++ b/application/models/codex/Uhstat1daten_model.php @@ -0,0 +1,14 @@ +dbTable = 'bis.tbl_uhstat1daten'; + $this->pk = 'uhstat1daten_id'; + } +} diff --git a/application/views/codex/uhstat1.php b/application/views/codex/uhstat1.php new file mode 100644 index 000000000..48397a387 --- /dev/null +++ b/application/views/codex/uhstat1.php @@ -0,0 +1,217 @@ +load->view( + 'templates/FHC-Header', + array( + 'title' => 'UHSTAT1Formular', + 'jquery3' => true, + 'bootstrap3' => true, + 'fontawesome4' => true, + 'dialoglib' => true, + 'phrases' => array( + 'ui' => array('speichern') + ) + ) +); +?> + +
+
+

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

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

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

+
+ +
+ + +
+
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+ +
+ + +
+
+

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

+
+ +
+ + +
+
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+
+ + + + + + + +
+ +
+ +
+ +load->view('templates/FHC-Footer'); ?> diff --git a/system/dbupdate_3.4/29835_uhstat1_erfassung_der_uhstat1_daten_ueber_das_bewerbungstool.php b/system/dbupdate_3.4/29835_uhstat1_erfassung_der_uhstat1_daten_ueber_das_bewerbungstool.php index 7395ac0bc..bbd168073 100644 --- a/system/dbupdate_3.4/29835_uhstat1_erfassung_der_uhstat1_daten_ueber_das_bewerbungstool.php +++ b/system/dbupdate_3.4/29835_uhstat1_erfassung_der_uhstat1_daten_ueber_das_bewerbungstool.php @@ -12,7 +12,7 @@ if (!$result = @$db->db_query('SELECT 1 FROM bis.tbl_abschluss LIMIT 1')) bezeichnung character varying(128)[], aktiv boolean NOT NULL DEFAULT true, in_oesterreich boolean, - CONSTRAINT tbl_abschluss_pk PRIMARY KEY (ausbildung_code) + CONSTRAINT pk_tbl_abschluss PRIMARY KEY (ausbildung_code) ); COMMENT ON TABLE bis.tbl_abschluss IS 'Key-Table of graduation'; @@ -102,6 +102,8 @@ if (!$result = @$db->db_query('SELECT 1 FROM bis.tbl_uhstat1daten LIMIT 1')) REFERENCES public.tbl_person (person_id) MATCH SIMPLE ON DELETE RESTRICT ON UPDATE CASCADE; + ALTER TABLE bis.tbl_uhstat1daten ADD CONSTRAINT uk_uhstat1daten_person_id UNIQUE(person_id); + COMMENT ON TABLE bis.tbl_uhstat1daten IS 'UHSTAT1 data for a person (statistical data)'; COMMENT ON COLUMN bis.tbl_uhstat1daten.geburtsstaat IS 'Birthplace of person'; COMMENT ON COLUMN bis.tbl_uhstat1daten.mutter_geburtsstaat IS 'Birth country of mother of person'; @@ -115,6 +117,8 @@ if (!$result = @$db->db_query('SELECT 1 FROM bis.tbl_uhstat1daten LIMIT 1')) GRANT SELECT, UPDATE, INSERT, DELETE ON bis.tbl_uhstat1daten TO web; GRANT SELECT, UPDATE, INSERT, DELETE ON bis.tbl_uhstat1daten TO vilesci; + GRANT SELECT, UPDATE ON bis.tbl_uhstat1daten_uhstat1daten_id_seq TO vilesci; + GRANT SELECT, UPDATE ON bis.tbl_uhstat1daten_uhstat1daten_id_seq TO web; "; if(!$db->db_query($qry)) From 5f096b58b7739e43eecb2dfeff84c9ed22d9088f Mon Sep 17 00:00:00 2001 From: ma0048 Date: Mon, 17 Jul 2023 13:52:06 +0200 Subject: [PATCH 087/268] - STG beim nicht vorhanden Master RT anzeigen --- include/reihungstest.class.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/include/reihungstest.class.php b/include/reihungstest.class.php index 633ddf1da..8cc9495fd 100644 --- a/include/reihungstest.class.php +++ b/include/reihungstest.class.php @@ -688,8 +688,8 @@ class reihungstest extends basis_db tbl_reihungstest.aufnahmegruppe_kurzbz, tbl_studiengang.typ, UPPER(typ::varchar(1) || kurzbz) AS stg_kuerzel, - so.studiengangbezeichnung as bezeichnung, - so.studiengangbezeichnung_englisch as english + so.studiengangbezeichnung, + so.studiengangbezeichnung_englisch FROM public.tbl_rt_person JOIN public.tbl_reihungstest ON (rt_id=reihungstest_id) @@ -736,8 +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; + $obj->studiengangbezeichnung = $row->studiengangbezeichnung; + $obj->studiengangbezeichnung_englisch = $row->studiengangbezeichnung_englisch; $this->result[] = $obj; } From 5e6262da56208a7d300078ea051d026e1a05aca6 Mon Sep 17 00:00:00 2001 From: ma0068 Date: Mon, 17 Jul 2023 16:29:03 +0200 Subject: [PATCH 088/268] =?UTF-8?q?Config=20f=C3=BCr=20Datum=20Start=20Dig?= =?UTF-8?q?italisierung,=20finish=20handleWiederholerDeadline,=20start=20S?= =?UTF-8?q?ammelmail=20an=20Stgl?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- application/config/studierendenantrag.php | 11 ++ application/controllers/jobs/AntragJob.php | 156 ++++++++++++---- .../models/education/Pruefung_model.php | 172 ++++++++---------- 3 files changed, 210 insertions(+), 129 deletions(-) diff --git a/application/config/studierendenantrag.php b/application/config/studierendenantrag.php index 85a3e1658..89b066d33 100644 --- a/application/config/studierendenantrag.php +++ b/application/config/studierendenantrag.php @@ -88,6 +88,17 @@ $config['wiederholung_job_request_2_date_modifier'] = '+3 weeks'; */ $config['wiederholung_job_deadline_date_modifier'] = '+1 month'; +/** + * before this exam dates for Wiederholer will be ignored + * + * @var string A string formated as Date + * + */ +$config['digitalization_start'] = '2022-07-01'; + + + + /** * Objection period - the student will be abgemeldet if he hasn't objected in this period * diff --git a/application/controllers/jobs/AntragJob.php b/application/controllers/jobs/AntragJob.php index 61c3a2eaa..e0c88ac3a 100644 --- a/application/controllers/jobs/AntragJob.php +++ b/application/controllers/jobs/AntragJob.php @@ -3,11 +3,12 @@ if (!defined("BASEPATH")) exit("No direct script access allowed"); use \DateTime as DateTime; -// TODO(chris): Achtung not working class AntragJob extends JOB_Controller { - /** + private $allPrestudentsWhereCommitteeExamFailed; + + /** * API constructor */ public function __construct() @@ -33,11 +34,102 @@ class AntragJob extends JOB_Controller */ public function sendStglSammelmail() { - // TODO(chris): get all Abmeldung:Created, Unterbrechung:Created, Wiederholung:LvZugeordnet - // TODO(chris): get stgs for all these - // TODO(chris): get stgls for all these - // TODO(chris): sort antraege in stgls - // TODO(chris): send email + $this->logInfo('Start Job sendStglSammelmail'); + + // TODO(chris): get all Abmeldung:Created, Unterbrechung:Created, Wiederholung:LvZugeordnet + $this->load->model('organisation/Studiengang_model', 'StudiengangModel'); + + $this->StudierendenantragModel->addJoin('public.tbl_prestudent','prestudent_id'); + $this->db->group_start(); + $this->db->where('typ', Studierendenantrag_model::TYP_ABMELDUNG); + $this->db->where('campus.get_status_studierendenantrag(studierendenantrag_id)', Studierendenantragstatus_model::STATUS_CREATED); + $this->db->group_end(); + + $this->db->or_group_start(); + $this->db->where('typ', Studierendenantrag_model::TYP_ABMELDUNG_STGL); + $this->db->where('campus.get_status_studierendenantrag(studierendenantrag_id)', Studierendenantragstatus_model::STATUS_CREATED); + $this->db->group_end(); + + $this->db->or_group_start(); + $this->db->where('typ', Studierendenantrag_model::TYP_UNTERBRECHUNG); + $this->db->where('campus.get_status_studierendenantrag(studierendenantrag_id)', Studierendenantragstatus_model::STATUS_CREATED); + $this->db->group_end(); + + $this->db->or_group_start(); + $this->db->where('typ', Studierendenantrag_model::TYP_WIEDERHOLUNG); + $this->db->where('campus.get_status_studierendenantrag(studierendenantrag_id)', Studierendenantragstatus_model::STATUS_LVSASSIGNED); + $this->db->group_end(); + + $result = $this->StudierendenantragModel->load(); + if(isError($result)) + return $this->logError(getError($result)); + + if(!hasData($result)) + return $this->logInfo('End Job sendStglSammelmail: 0 Mails sent'); + + $antraege = getData($result); + + $stgs = array(); + $stgLeitungen = array(); + + foreach($antraege as $antrag) + { + if(!isset($stgs[$antrag->studiengang_kz])) + { + $result = $this->StudiengangModel->getLeitung($antrag->studiengang_kz); + if(isError($result)) + { + $this->logError(getError($result)); + continue; + } + if(!hasData($result)) + { + $this->logError('Keine Leitung für Studiengang ' . $antrag->studiengang_kz . ' gefunden!'); + continue; + } + + $leitung = current(getData($result)); + if(!isset($stgLeitungen[$leitung->uid])) + { + $stgLeitungen[$leitung->uid] = [ 'Details' => $leitung, 'stgs' => [] ]; + } + $stgLeitungen[$leitung->uid] ['stgs'][] = $antrag->studiengang_kz; + + $result = $this->StudiengangModel->load($antrag->studiengang_kz); + if(isError($result)) + { + $this->logError(getError($result)); + continue; + } + if(!hasData($result)) + { + $this->logError('Keine Details für Studiengang ' . $antrag->studiengang_kz . ' gefunden!'); + continue; + } + $details = current(getData($result)); + + $stgs[$antrag->studiengang_kz] = [ 'Abmeldung' => [], 'Unterbrechung' => [], 'Wiederholung' => [], 'Details' => $details ]; + } + $stgs[$antrag->studiengang_kz] [$antrag->typ] = $antrag; + } + +/* var_dump($stgs); + var_dump($stgLeitungen);*/ + + $count = 0; + foreach($stgLeitungen as $leitung) + { + $data = array(); + if(sendSanchoMail("Sancho_Mail_Antrag_Stgl",$data,$leitung['Details']->email, 'Anträge - Aktion(en) erforderlich')) + $count++; + } + + $this->logInfo($count . " Emails erfolgreich versandt"); + + // TODO(chris): Emailadresse stg + // TODO(chris): data Fertig + + $this->logInfo('End Job sendStglSammelmail'); } /** @@ -118,19 +210,22 @@ class AntragJob extends JOB_Controller return; } + $digi_start= $this->config->item('digitalization_start'); + if($digi_start) + $digi_start = new DateTime($digi_start); + $dateDeadline = new DateTime(); $dateDeadline->sub(DateInterval::createFromDateString($modifier_deadline)); - $result = $this->PruefungModel->getAllPrestudentsWhereCommitteeExamFailed( - [ - null, - Studierendenantragstatus_model::STATUS_REQUESTSENT_1, - Studierendenantragstatus_model::STATUS_REQUESTSENT_2 - ], - $dateDeadline, - null - ); - + $result = $this->PruefungModel->getAllPrestudentsWhereCommitteeExamFailed( + [ + null, + Studierendenantragstatus_model::STATUS_REQUESTSENT_1, + Studierendenantragstatus_model::STATUS_REQUESTSENT_2 + ], + $dateDeadline, + $digi_start + ); if(isError($result)) { $this->logError(getError($result)); @@ -142,24 +237,19 @@ class AntragJob extends JOB_Controller $prestudents = $this->prestudentsGetUnique($prestudents); - foreach ($prestudents as $prestudent) - { - // TODO(chris): DEBUG REMOVE! - if ($prestudent->studiensemester_kurzbz == 'WS2021') - var_dump([$prestudent->prestudent_id, $prestudent->studiensemester_kurzbz, $prestudent->lvbezeichnung]); - $result = success(); - // TODO(chris): find out how to filter old/wrong datasets!!! - #$result = $this->prestudentlib->setAbbrecher($prestudent->prestudent_id, $prestudent->studiensemester_kurzbz, $insertvon); - if (isError($result)) - $this->logError(getError($result)); - else - $count++; - } - $this->logInfo($count . " Students set to Abbrecher"); - } - $this->logInfo('Ende Job handleWiederholerDeadline'); + foreach ($prestudents as $prestudent) + { + $result = $this->prestudentlib->setAbbrecher($prestudent->prestudent_id, $prestudent->studiensemester_kurzbz, $insertvon); + if (isError($result)) + $this->logError(getError($result)); + else + $count++; + } + $this->logInfo($count . " Students set to Abbrecher"); + } + $this->logInfo('Ende Job handleWiederholerDeadline'); } /** diff --git a/application/models/education/Pruefung_model.php b/application/models/education/Pruefung_model.php index 4236a5c6a..047cac02f 100644 --- a/application/models/education/Pruefung_model.php +++ b/application/models/education/Pruefung_model.php @@ -37,106 +37,52 @@ class Pruefung_model extends DB_Model return $this->execQuery($qry, array($person_id, $studiensemester_kurzbz)); } - /** - * @param integer $prestudent_id student_uid - * - * @return stdClass - */ - public function loadWhereCommitteeExamFailedForPrestudent($prestudent_id) - { - $this->load->config('studierendenantrag'); - $this->dbTable = 'lehre.tbl_pruefung p'; + /** + * @return string + */ + protected function loadWhereThreeExamsFailed() + { + $this->load->config('studierendenantrag'); - $this->addSelect('p.datum'); - $this->addSelect('pers.vorname'); - $this->addSelect('pers.nachname'); - $this->addSelect('s.matrikelnr'); - $this->addSelect('g.bezeichnung'); - $this->addSelect('g.studiengang_kz'); - $this->addSelect('o.bezeichnung_mehrsprachig'); - $this->addSelect('ps.prestudent_id'); - $this->addSelect('lv.bezeichnung as lvbezeichnung'); - $this->addSelect('le.studiensemester_kurzbz'); - $this->addSelect('a.typ'); - $this->addSelect('campus.get_status_studierendenantrag(a.studierendenantrag_id) status'); + $this->dbTable = 'lehre.tbl_pruefung p'; - $this->addJoin('lehre.tbl_note n', 'note'); - $this->addJoin('lehre.tbl_lehreinheit le', 'lehreinheit_id'); - $this->addJoin('lehre.tbl_lehrveranstaltung lv', 'lehrveranstaltung_id'); - $this->addJoin('public.tbl_student s', 'student_uid'); - $this->addJoin('public.tbl_prestudent ps', 'prestudent_id'); - $this->addJoin('public.tbl_person pers', 'person_id'); - $this->addJoin('public.tbl_studiengang g', 'ps.studiengang_kz=g.studiengang_kz'); - $this->addJoin('bis.tbl_orgform o', 'g.orgform_kurzbz=o.orgform_kurzbz'); - $this->addJoin('campus.tbl_studierendenantrag a', 'ps.prestudent_id=a.prestudent_id', 'LEFT'); + $sprache_index = "SELECT index FROM public.tbl_sprache WHERE sprache='" . getUserLanguage() . "' LIMIT 1"; - $this->db->where("n.positiv", false); - $this->db->where("p.pruefungstyp_kurzbz", 'kommPruef'); - $this->db->where("ps.prestudent_id", $prestudent_id); - $this->db->where_in("get_rolle_prestudent(ps.prestudent_id, NULL)", $this->config->item('antrag_prestudentstatus_whitelist')); - $this->db->where("g.aktiv", true); + $this->addSelect('max(p.datum) as datum'); + $this->addSelect('pers.vorname'); + $this->addSelect('pers.nachname'); + $this->addSelect('pers.person_id'); + $this->addSelect('s.matrikelnr'); + $this->addSelect('g.bezeichnung'); + $this->addSelect('g.studiengang_kz'); + $this->addSelect('o.bezeichnung_mehrsprachig[(' . $sprache_index . ')] AS orgform', false); + $this->addSelect('ps.prestudent_id'); + $this->addSelect('lv.bezeichnung as lvbezeichnung'); + $this->addSelect('le.studiensemester_kurzbz'); + $this->addSelect('a.typ'); + $this->addSelect('campus.get_status_studierendenantrag(a.studierendenantrag_id) status'); + $this->addSelect('count(1) as count'); - $this->db->where('lv.studiengang_kz not in( - SELECT ps.studiengang_kz - FROM - public.tbl_student s - JOIN public.tbl_prestudent ps USING (prestudent_id) - JOIN public.tbl_prestudentstatus pss USING (prestudent_id) - WHERE pss.statusgrund_id in ? - and ps.prestudent_id = ?)', null, false); + $this->addGroupBy(['pers.vorname','pers.nachname','pers.person_id', 's.matrikelnr','g.bezeichnung', 'g.studiengang_kz','o.bezeichnung_mehrsprachig','ps.prestudent_id', 'lv.bezeichnung', 'le.studiensemester_kurzbz', 'a.typ', 'a.studierendenantrag_id']); + $this->addJoin('lehre.tbl_note n', 'note'); + $this->addJoin('lehre.tbl_lehreinheit le', 'lehreinheit_id'); + $this->addJoin('lehre.tbl_lehrveranstaltung lv', 'lehrveranstaltung_id'); + $this->addJoin('public.tbl_student s', 'student_uid'); + $this->addJoin('public.tbl_prestudent ps', 'prestudent_id'); + $this->addJoin('public.tbl_person pers', 'person_id'); + $this->addJoin('public.tbl_benutzer b', 's.student_uid=b.uid'); + $this->addJoin('public.tbl_studiengang g', 'ps.studiengang_kz=g.studiengang_kz'); + $this->addJoin('bis.tbl_orgform o', 'g.orgform_kurzbz=o.orgform_kurzbz'); + $this->db->join('campus.tbl_studierendenantrag a', 'ps.prestudent_id=a.prestudent_id and a.typ = ?', 'LEFT', false); - $sql = $this->db->get_compiled_select($this->dbTable); + $this->db->where("n.positiv", false); + /* $this->db->where_in("p.pruefungstyp_kurzbz1", ['kommPruef','zusKommPruef']);*/ + $this->db->where_in("get_rolle_prestudent(ps.prestudent_id, null)", $this->config->item('antrag_prestudentstatus_whitelist')); - return $this->execQuery($sql, [$this->config->item('status_gruende_wiederholer'), $prestudent_id]); - } + $this->db->where("g.aktiv", true); - public function getAllPrestudentsWhereCommitteeExamFailed($status, $maxDate, $minDate) - { - $this->load->config('studierendenantrag'); - $this->load->model('education/Studierendenantrag_model', 'StudierendenantragModel'); - - $this->dbTable = 'lehre.tbl_pruefung p'; - - $sprache_index = "SELECT index FROM public.tbl_sprache WHERE sprache='" . getUserLanguage() . "' LIMIT 1"; - - $this->addSelect('p.datum'); - $this->addSelect('pers.vorname'); - $this->addSelect('pers.nachname'); - $this->addSelect('pers.person_id'); - $this->addSelect('s.matrikelnr'); - $this->addSelect('g.bezeichnung'); - $this->addSelect('g.studiengang_kz'); - $this->addSelect('o.bezeichnung_mehrsprachig[(' . $sprache_index . ')] AS orgform', false); - $this->addSelect('ps.prestudent_id'); - $this->addSelect('lv.bezeichnung as lvbezeichnung'); - $this->addSelect('le.studiensemester_kurzbz'); - $this->addSelect('a.typ'); - $this->addSelect('campus.get_status_studierendenantrag(a.studierendenantrag_id) status'); - - $this->addJoin('lehre.tbl_note n', 'note'); - $this->addJoin('lehre.tbl_lehreinheit le', 'lehreinheit_id'); - $this->addJoin('lehre.tbl_lehrveranstaltung lv', 'lehrveranstaltung_id'); - $this->addJoin('public.tbl_student s', 'student_uid'); - $this->addJoin('public.tbl_prestudent ps', 'prestudent_id'); - $this->addJoin('public.tbl_person pers', 'person_id'); - $this->addJoin('public.tbl_benutzer b', 's.student_uid=b.uid'); - $this->addJoin('public.tbl_studiengang g', 'ps.studiengang_kz=g.studiengang_kz'); - $this->addJoin('bis.tbl_orgform o', 'g.orgform_kurzbz=o.orgform_kurzbz'); - $this->db->join('campus.tbl_studierendenantrag a', 'ps.prestudent_id=a.prestudent_id and a.typ = ?', 'LEFT', false); - - $this->db->where("n.positiv", false); - $this->db->where("p.pruefungstyp_kurzbz", 'kommPruef'); - $this->db->where_in("get_rolle_prestudent(ps.prestudent_id, null)", $this->config->item('antrag_prestudentstatus_whitelist')); - - if ($maxDate) - $this->db->where("p.datum < ", $maxDate->format('c')); - if ($minDate) - $this->db->where("p.datum > ", $minDate->format('c')); - $this->db->where("g.aktiv", true); - $this->db->where("b.aktiv", true); - - $this->db->where('lv.studiengang_kz not in( + $this->db->where('lv.studiengang_kz not in( SELECT ps.studiengang_kz FROM public.tbl_prestudent ps1 @@ -144,8 +90,42 @@ class Pruefung_model extends DB_Model WHERE pss.statusgrund_id in ? AND ps.prestudent_id = ps1.prestudent_id)', null, false); - // NOTE(chris): is Wiederholer without set statusgrund (legacy?) - $this->db->where('(SELECT COUNT(*) FROM (SELECT DISTINCT studiensemester_kurzbz FROM tbl_prestudentstatus _s WHERE ausbildungssemester=get_absem_prestudent(ps.prestudent_id, le.studiensemester_kurzbz) AND prestudent_id=ps.prestudent_id) a) = 1', null, false); + // NOTE(chris): is Wiederholer without set statusgrund (legacy?) + $this->db->where('(SELECT COUNT(*) FROM (SELECT DISTINCT studiensemester_kurzbz FROM tbl_prestudentstatus _s WHERE ausbildungssemester=get_absem_prestudent(ps.prestudent_id, le.studiensemester_kurzbz) AND prestudent_id=ps.prestudent_id) a) = 1', null, false); + + return $this->db->get_compiled_select($this->dbTable); + } + + + + + /** + * @param integer $prestudent_id student_uid + * + * @return stdClass + */ + public function loadWhereCommitteeExamFailedForPrestudent($prestudent_id) + { + + $sql = $this->loadWhereThreeExamsFailed(); + + $statusgruende = $this->config->item('status_gruende_wiederholer'); + if (!is_array($statusgruende)) + $statusgruende = []; + + return $this->execQuery('select * from ( ' . $sql . ') temp where count >= 3 AND prestudent_id = ?' , [Studierendenantrag_model::TYP_WIEDERHOLUNG, $statusgruende, $prestudent_id]); + } + + public function getAllPrestudentsWhereCommitteeExamFailed($status, $maxDate, $minDate) + { + $this->load->model('education/Studierendenantrag_model', 'StudierendenantragModel'); + + if ($maxDate) + $this->db->where("p.datum < ", $maxDate->format('c')); + if ($minDate) + $this->db->where("p.datum > ", $minDate->format('c')); + + $this->db->where("b.aktiv", true); if (is_array($status)) { if (in_array(null, $status)) { @@ -165,12 +145,12 @@ class Pruefung_model extends DB_Model $this->db->where('campus.get_status_studierendenantrag(a.studierendenantrag_id)', $status); } - $sql = $this->db->get_compiled_select($this->dbTable); + $sql = $this->loadWhereThreeExamsFailed(); $statusgruende = $this->config->item('status_gruende_wiederholer'); if (!is_array($statusgruende)) $statusgruende = []; - return $this->execQuery($sql, [Studierendenantrag_model::TYP_WIEDERHOLUNG, $statusgruende]); + return $this->execQuery('select * from ( ' . $sql . ') temp where count >= 3', [Studierendenantrag_model::TYP_WIEDERHOLUNG, $statusgruende]); } } From 8bb3b6d53c4b0ff03759acab4d30d94236895a60 Mon Sep 17 00:00:00 2001 From: Cris Date: Thu, 20 Jul 2023 10:48:03 +0200 Subject: [PATCH 089/268] DB Update: added 2 attributes to tbl_anrechnung - begruendung_ects (text) - begruendung_lvinhalt (text) --- system/dbupdate_3.4.php | 3 +- ...chnung_neue_attribute_fuer_begruendung.php | 28 +++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 system/dbupdate_3.4/30181_tabelle_anrechnung_neue_attribute_fuer_begruendung.php diff --git a/system/dbupdate_3.4.php b/system/dbupdate_3.4.php index ed60aeddf..5c6a3d5d1 100644 --- a/system/dbupdate_3.4.php +++ b/system/dbupdate_3.4.php @@ -40,6 +40,7 @@ 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'); +require_once('dbupdate_3.4/30181_tabelle_anrechnung_neue_attribute_fuer_begruendung.php'); // *** Pruefung und hinzufuegen der neuen Attribute und Tabellen echo '

Pruefe Tabellen und Attribute!

'; @@ -150,7 +151,7 @@ $tabellen=array( "lehre.tbl_abschlusspruefung" => array("abschlusspruefung_id","student_uid","vorsitz","pruefer1","pruefer2","pruefer3","abschlussbeurteilung_kurzbz","akadgrad_id","pruefungstyp_kurzbz","datum","uhrzeit","sponsion","anmerkung","updateamum","updatevon","insertamum","insertvon","ext_id","note","protokoll","endezeit","pruefungsantritt_kurzbz","freigabedatum"), "lehre.tbl_abschlusspruefung_antritt" => array("pruefungsantritt_kurzbz","bezeichnung","bezeichnung_english","sort"), "lehre.tbl_akadgrad" => array("akadgrad_id","akadgrad_kurzbz","studiengang_kz","titel","geschlecht"), - "lehre.tbl_anrechnung" => array("anrechnung_id","prestudent_id","lehrveranstaltung_id","begruendung_id","lehrveranstaltung_id_kompatibel","genehmigt_von","insertamum","insertvon","updateamum","updatevon","ext_id", "dms_id", "studiensemester_kurzbz", "anmerkung_student", "empfehlung_anrechnung"), + "lehre.tbl_anrechnung" => array("anrechnung_id","prestudent_id","lehrveranstaltung_id","begruendung_id","lehrveranstaltung_id_kompatibel","genehmigt_von","insertamum","insertvon","updateamum","updatevon","ext_id", "dms_id", "studiensemester_kurzbz", "anmerkung_student", "empfehlung_anrechnung", "begruendung_ects", "begruendung_lvinhalt"), "lehre.tbl_anrechnungstatus" => array("status_kurzbz", "bezeichnung_mehrsprachig"), "lehre.tbl_anrechnung_anrechnungstatus" => array("anrechnungstatus_id", "anrechnung_id", "status_kurzbz", "datum", "insertamum", "insertvon"), "lehre.tbl_anrechnung_begruendung" => array("begruendung_id","bezeichnung"), diff --git a/system/dbupdate_3.4/30181_tabelle_anrechnung_neue_attribute_fuer_begruendung.php b/system/dbupdate_3.4/30181_tabelle_anrechnung_neue_attribute_fuer_begruendung.php new file mode 100644 index 000000000..922920071 --- /dev/null +++ b/system/dbupdate_3.4/30181_tabelle_anrechnung_neue_attribute_fuer_begruendung.php @@ -0,0 +1,28 @@ +db_query("SELECT begruendung_ects FROM lehre.tbl_anrechnung LIMIT 1")) +{ + $qry = "ALTER TABLE lehre.tbl_anrechnung ADD COLUMN begruendung_ects text; + COMMENT ON COLUMN lehre.tbl_anrechnung.begruendung_ects IS 'Begruendung gleichwertiger ECTS'; + "; + + if(!$db->db_query($qry)) + echo 'lehre.tbl_anrechnung '.$db->db_last_error().'
'; + else + echo '
Spalte begruendung_ects zu Tabelle lehre.tbl_anrechnung hinzugefügt'; +} + +//Add column begruendung_lvinhalt to lehre.tbl_anrechnung +if(!@$db->db_query("SELECT begruendung_lvinhalt FROM lehre.tbl_anrechnung LIMIT 1")) +{ + $qry = "ALTER TABLE lehre.tbl_anrechnung ADD COLUMN begruendung_lvinhalt text; + COMMENT ON COLUMN lehre.tbl_anrechnung.begruendung_lvinhalt IS 'Begruendung gleichwertiger LV-Inhalte'; + "; + + if(!$db->db_query($qry)) + echo 'lehre.tbl_anrechnung '.$db->db_last_error().'
'; + else + echo '
Spalte begruendung_lvinhalt zu Tabelle lehre.tbl_anrechnung hinzugefügt'; +} \ No newline at end of file From 54d819e1eaf1dc8d96b5f2ccfb22307d36b7c67b Mon Sep 17 00:00:00 2001 From: Cris Date: Thu, 20 Jul 2023 13:38:52 +0200 Subject: [PATCH 090/268] Adapted GUI to display and save begruendung_ects and begruendung_lvinhalt --- .../lehre/anrechnung/requestAnrechnung.php | 49 +++++++++++++++++-- .../js/lehre/anrechnung/requestAnrechnung.js | 25 ++++++++-- 2 files changed, 66 insertions(+), 8 deletions(-) diff --git a/application/views/lehre/anrechnung/requestAnrechnung.php b/application/views/lehre/anrechnung/requestAnrechnung.php index cfd9058f5..839e659a8 100644 --- a/application/views/lehre/anrechnung/requestAnrechnung.php +++ b/application/views/lehre/anrechnung/requestAnrechnung.php @@ -1,5 +1,7 @@ load->view( 'templates/FHC-Header', @@ -197,6 +199,47 @@ $this->load->view(
+ +
+
+
+
+ p->t('anrechnung', 'begruendungEcts'); ?>  + + + + ECTS Berechnung Referenzbeispiele +
+
+ + p->t('ui', 'maxZeichen'); ?> : +
+
+
+
+ +
+
+
+
+ p->t('anrechnung', 'begruendungLvinhalt'); ?>  + + + +
+
+ +  / p->t('ui', 'maxZeichen'); ?> : + p->t('ui', 'fehlendeMinZeichen'); ?> : +
+
+
+
@@ -242,8 +285,8 @@ $this->load->view(
- p->t('ui', 'maxZeichen'); ?> : + maxlength="" required>anmerkung; ?> + p->t('ui', 'maxZeichen'); ?> :
diff --git a/public/js/lehre/anrechnung/requestAnrechnung.js b/public/js/lehre/anrechnung/requestAnrechnung.js index 5edb4e162..01453f52d 100644 --- a/public/js/lehre/anrechnung/requestAnrechnung.js +++ b/public/js/lehre/anrechnung/requestAnrechnung.js @@ -1,6 +1,8 @@ const ANRECHNUNGSTATUS_APPROVED = 'approved'; const ANRECHNUNGSTATUS_REJECTED = 'rejected'; -const HERKUNFT_DER_KENNTNISSE_MAX_LENGTH = 125; +const CHAR_LENGTH125 = 125; +const CHAR_LENGTH500 = 500; +const CHAR_LENGTH1500 = 1500; const COLOR_DANGER = '#f2dede'; @@ -25,7 +27,7 @@ $(function(){ // Alert message inside Begruendungsbox, if maximum ECTS exceeded requestAnrechnung.alertIfMaxEctsExceededInsideBegruendungsbox(); - // Set chars counter for textarea 'Herkunft der Kenntnisse' + // Set chars counter for textareas requestAnrechnung.setCharsCounter(); // If Sperregrund exists: display Sperre panel, hide Status panel and disable all form elements @@ -98,6 +100,8 @@ $(function(){ begruendung: this.begruendung.value, lv_id: this.lv_id.value, studiensemester: this.studiensemester.value, + begruendung_ects: this.begruendung_ects.value, + begruendung_lvinhalt: this.begruendung_lvinhalt.value, bestaetigung: this.bestaetigung.value, uploadfile: this.uploadfile.files }, @@ -207,11 +211,22 @@ var requestAnrechnung = { }, setCharsCounter: function(){ $('#requestAnrechnung-herkunftDerKenntnisse').keyup(function() { - - let length = HERKUNFT_DER_KENNTNISSE_MAX_LENGTH - $(this).val().length; - + let length = CHAR_LENGTH125 - $(this).val().length; $('#requestAnrechnung-herkunftDerKenntnisse-charCounter').text(length); }); + + $('#requestAnrechnung-begruendungEcts').keyup(function() { + let length = CHAR_LENGTH125 - $(this).val().length; + $('#requestAnrechnung-begruendungEcts-charCounter').text(length); + }); + + $('#requestAnrechnung-begruendungLvinhalt').keyup(function() { + let maxlength = CHAR_LENGTH1500 - $(this).val().length; + $('#requestAnrechnung-begruendungLvinhalt-charCounterMax').text(maxlength); + + let minlength = CHAR_LENGTH500 - $(this).val().length; + $('#requestAnrechnung-begruendungLvinhalt-charCounterMin').text(minlength); + }); }, formatAnrechnungIsApplied: function (antragdatum, dms_id, filename){ $('#requestAnrechnung-antragdatum').text(antragdatum); From 110d6bace3637d2783f83be301ac86991b3d83b2 Mon Sep 17 00:00:00 2001 From: Cris Date: Thu, 20 Jul 2023 13:42:53 +0200 Subject: [PATCH 091/268] Adapted backend logic to save/retrieve begruendung_ects and begruendung_lvinhalt --- .../controllers/lehre/anrechnung/RequestAnrechnung.php | 10 ++++++++-- application/libraries/AnrechnungLib.php | 4 ++++ application/models/education/Anrechnung_model.php | 4 +++- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/application/controllers/lehre/anrechnung/RequestAnrechnung.php b/application/controllers/lehre/anrechnung/RequestAnrechnung.php index e9059720b..1922bacda 100644 --- a/application/controllers/lehre/anrechnung/RequestAnrechnung.php +++ b/application/controllers/lehre/anrechnung/RequestAnrechnung.php @@ -111,6 +111,8 @@ class requestAnrechnung extends Auth_Controller $lehrveranstaltung_id = $this->input->post('lv_id'); $studiensemester_kurzbz = $this->input->post('studiensemester'); $bestaetigung = $this->input->post('bestaetigung'); + $begruendung_ects = $this->input->post('begruendung_ects'); + $begruendung_lvinhalt = $this->input->post('begruendung_lvinhalt'); // Validate data if (empty($_FILES['uploadfile']['name'])) @@ -121,7 +123,9 @@ class requestAnrechnung extends Auth_Controller if (isEmptyString($begruendung_id) || isEmptyString($anmerkung) || isEmptyString($lehrveranstaltung_id) || - isEmptyString($studiensemester_kurzbz)) + isEmptyString($studiensemester_kurzbz) || + isEmptyString($begruendung_ects) || + isEmptyString($begruendung_lvinhalt)) { return $this->outputJsonError($this->p->t('ui', 'errorFelderFehlen')); } @@ -172,7 +176,9 @@ class requestAnrechnung extends Auth_Controller $lehrveranstaltung_id, $begruendung_id, $lastInsert_dms_id, - $anmerkung + $anmerkung, + $begruendung_ects, + $begruendung_lvinhalt ); if (isError($result)) diff --git a/application/libraries/AnrechnungLib.php b/application/libraries/AnrechnungLib.php index d8c4b1fd3..8ee1891b5 100644 --- a/application/libraries/AnrechnungLib.php +++ b/application/libraries/AnrechnungLib.php @@ -174,6 +174,8 @@ class AnrechnungLib $anrechnung_data->insertvon = ''; $anrechnung_data->studiensemester_kurzbz = ''; $anrechnung_data->empfehlung = ''; + $anrechnung_data->begruendung_ects = ''; + $anrechnung_data->begruendung_lvinhalt = ''; $anrechnung_data->status_kurzbz = ''; $anrechnung_data->status = getUserLanguage() == 'German' ? 'neu' : 'new'; $anrechnung_data->dokumentname = ''; @@ -894,6 +896,8 @@ class AnrechnungLib $anrechnung_data->insertvon= $anrechnung->insertvon; $anrechnung_data->studiensemester_kurzbz= $anrechnung->studiensemester_kurzbz; $anrechnung_data->empfehlung= $anrechnung->empfehlung_anrechnung; + $anrechnung_data->begruendung_ects = $anrechnung->begruendung_ects; + $anrechnung_data->begruendung_lvinhalt = $anrechnung->begruendung_lvinhalt; // Get last status_kurzbz $result = $this->ci->AnrechnungModel->getLastAnrechnungstatus($anrechnung->anrechnung_id); diff --git a/application/models/education/Anrechnung_model.php b/application/models/education/Anrechnung_model.php index ebecf4118..cbfdb6607 100644 --- a/application/models/education/Anrechnung_model.php +++ b/application/models/education/Anrechnung_model.php @@ -30,7 +30,7 @@ class Anrechnung_model extends DB_Model */ public function createAnrechnungsantrag( $prestudent_id, $studiensemester_kurzbz, $lehrveranstaltung_id, - $begruendung_id, $dms_id, $anmerkung_student = null + $begruendung_id, $dms_id, $anmerkung_student = null, $begruendung_ects = null, $begruendung_lvinhalt = null ) { // Start DB transaction @@ -44,6 +44,8 @@ class Anrechnung_model extends DB_Model 'dms_id' => $dms_id, 'studiensemester_kurzbz' => $studiensemester_kurzbz, 'anmerkung_student' => $anmerkung_student, + 'begruendung_ects' => $begruendung_ects, + 'begruendung_lvinhalt' => $begruendung_lvinhalt, 'insertvon' => $this->_uid )); From 35d01b042eaaa97aa769554c6a35e37672434cda Mon Sep 17 00:00:00 2001 From: cgfhtw Date: Thu, 20 Jul 2023 15:00:42 +0200 Subject: [PATCH 092/268] Bug canCancel in abmeldung->edit missing --- application/controllers/components/Antrag/Abmeldung.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/application/controllers/components/Antrag/Abmeldung.php b/application/controllers/components/Antrag/Abmeldung.php index 55435c1f6..c55820437 100644 --- a/application/controllers/components/Antrag/Abmeldung.php +++ b/application/controllers/components/Antrag/Abmeldung.php @@ -94,6 +94,11 @@ class Abmeldung extends FHC_Controller if ($data->typ !== Studierendenantrag_model::TYP_ABMELDUNG_STGL && $data->typ !== Studierendenantrag_model::TYP_ABMELDUNG) return show_404(); + $data->canCancel = ( + $data->status == Studierendenantragstatus_model::STATUS_CREATED && + $this->antraglib->isEntitledToCancelAntrag($data->studierendenantrag_id) + ); + $this->outputJsonSuccess($data); } From 5670bac3f682376582be954e826d3722f1bde20f Mon Sep 17 00:00:00 2001 From: cgfhtw Date: Thu, 20 Jul 2023 15:04:18 +0200 Subject: [PATCH 093/268] Don't allow canceling of Stg Abmeldungen --- application/libraries/AntragLib.php | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/application/libraries/AntragLib.php b/application/libraries/AntragLib.php index 6e05380a5..c1cab664f 100644 --- a/application/libraries/AntragLib.php +++ b/application/libraries/AntragLib.php @@ -1545,7 +1545,16 @@ class AntragLib */ public function isEntitledToCancelAntrag($antrag_id) { - return $this->isOwnAntrag($antrag_id); + $result = $this->_ci->StudierendenantragModel->load($antrag_id); + if (!hasData($result)) + return false; + $antrag = current(getData($result)); + + 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; } /** From 8923a099cc257544aba56fdc2fb0c16703350f6d Mon Sep 17 00:00:00 2001 From: cgfhtw Date: Thu, 20 Jul 2023 15:04:49 +0200 Subject: [PATCH 094/268] Sammelmail Stgl & Calltoactions in Student view --- application/controllers/jobs/AntragJob.php | 245 ++++++++++-------- .../views/lehre/Antrag/Student/List.php | 31 +-- system/phrasesupdate.php | 140 ++++++++++ 3 files changed, 289 insertions(+), 127 deletions(-) diff --git a/application/controllers/jobs/AntragJob.php b/application/controllers/jobs/AntragJob.php index e0c88ac3a..8130f8a95 100644 --- a/application/controllers/jobs/AntragJob.php +++ b/application/controllers/jobs/AntragJob.php @@ -6,9 +6,9 @@ use \DateTime as DateTime; class AntragJob extends JOB_Controller { - private $allPrestudentsWhereCommitteeExamFailed; + private $allPrestudentsWhereCommitteeExamFailed; - /** + /** * API constructor */ public function __construct() @@ -21,7 +21,7 @@ class AntragJob extends JOB_Controller // Loads SanchoHelper $this->load->helper('hlp_sancho_helper'); - //Load Model + // Load Model $this->load->model('education/Studierendenantrag_model', 'StudierendenantragModel'); $this->load->model('education/Studierendenantragstatus_model', 'StudierendenantragstatusModel'); $this->load->model('education/Pruefung_model', 'PruefungModel'); @@ -34,102 +34,139 @@ class AntragJob extends JOB_Controller */ public function sendStglSammelmail() { - $this->logInfo('Start Job sendStglSammelmail'); + $this->load->model('person/Person_model', 'PersonModel'); - // TODO(chris): get all Abmeldung:Created, Unterbrechung:Created, Wiederholung:LvZugeordnet - $this->load->model('organisation/Studiengang_model', 'StudiengangModel'); + $this->logInfo('Start Job sendStglSammelmail'); - $this->StudierendenantragModel->addJoin('public.tbl_prestudent','prestudent_id'); - $this->db->group_start(); - $this->db->where('typ', Studierendenantrag_model::TYP_ABMELDUNG); - $this->db->where('campus.get_status_studierendenantrag(studierendenantrag_id)', Studierendenantragstatus_model::STATUS_CREATED); - $this->db->group_end(); + $this->load->model('organisation/Studiengang_model', 'StudiengangModel'); - $this->db->or_group_start(); - $this->db->where('typ', Studierendenantrag_model::TYP_ABMELDUNG_STGL); - $this->db->where('campus.get_status_studierendenantrag(studierendenantrag_id)', Studierendenantragstatus_model::STATUS_CREATED); - $this->db->group_end(); + $this->StudierendenantragModel->addJoin('public.tbl_prestudent','prestudent_id'); + $this->db->group_start(); + $this->db->where('typ', Studierendenantrag_model::TYP_ABMELDUNG); + $this->db->where('campus.get_status_studierendenantrag(studierendenantrag_id)', Studierendenantragstatus_model::STATUS_CREATED); + $this->db->group_end(); - $this->db->or_group_start(); - $this->db->where('typ', Studierendenantrag_model::TYP_UNTERBRECHUNG); - $this->db->where('campus.get_status_studierendenantrag(studierendenantrag_id)', Studierendenantragstatus_model::STATUS_CREATED); - $this->db->group_end(); + $this->db->or_group_start(); + $this->db->where('typ', Studierendenantrag_model::TYP_ABMELDUNG_STGL); + $this->db->where('campus.get_status_studierendenantrag(studierendenantrag_id)', Studierendenantragstatus_model::STATUS_CREATED); + $this->db->group_end(); - $this->db->or_group_start(); - $this->db->where('typ', Studierendenantrag_model::TYP_WIEDERHOLUNG); - $this->db->where('campus.get_status_studierendenantrag(studierendenantrag_id)', Studierendenantragstatus_model::STATUS_LVSASSIGNED); - $this->db->group_end(); + $this->db->or_group_start(); + $this->db->where('typ', Studierendenantrag_model::TYP_UNTERBRECHUNG); + $this->db->where('campus.get_status_studierendenantrag(studierendenantrag_id)', Studierendenantragstatus_model::STATUS_CREATED); + $this->db->group_end(); - $result = $this->StudierendenantragModel->load(); - if(isError($result)) - return $this->logError(getError($result)); + $this->db->or_group_start(); + $this->db->where('typ', Studierendenantrag_model::TYP_WIEDERHOLUNG); + $this->db->where('campus.get_status_studierendenantrag(studierendenantrag_id)', Studierendenantragstatus_model::STATUS_LVSASSIGNED); + $this->db->group_end(); - if(!hasData($result)) - return $this->logInfo('End Job sendStglSammelmail: 0 Mails sent'); + $result = $this->StudierendenantragModel->load(); + if(isError($result)) + return $this->logError(getError($result)); - $antraege = getData($result); + if(!hasData($result)) + return $this->logInfo('End Job sendStglSammelmail: 0 Mails sent'); - $stgs = array(); - $stgLeitungen = array(); + $antraege = getData($result); - foreach($antraege as $antrag) - { - if(!isset($stgs[$antrag->studiengang_kz])) - { - $result = $this->StudiengangModel->getLeitung($antrag->studiengang_kz); - if(isError($result)) - { - $this->logError(getError($result)); - continue; - } - if(!hasData($result)) - { - $this->logError('Keine Leitung für Studiengang ' . $antrag->studiengang_kz . ' gefunden!'); - continue; - } + $stgs = array(); + $stgLeitungen = array(); - $leitung = current(getData($result)); - if(!isset($stgLeitungen[$leitung->uid])) - { - $stgLeitungen[$leitung->uid] = [ 'Details' => $leitung, 'stgs' => [] ]; - } - $stgLeitungen[$leitung->uid] ['stgs'][] = $antrag->studiengang_kz; + foreach ($antraege as $antrag) + { + if (!isset($stgs[$antrag->studiengang_kz])) + { + $result = $this->StudiengangModel->getLeitung($antrag->studiengang_kz); + if (isError($result)) + { + $this->logError(getError($result)); + continue; + } + if (!hasData($result)) + { + $this->logError('Keine Leitung für Studiengang ' . $antrag->studiengang_kz . ' gefunden!'); + continue; + } - $result = $this->StudiengangModel->load($antrag->studiengang_kz); - if(isError($result)) - { - $this->logError(getError($result)); - continue; - } - if(!hasData($result)) - { - $this->logError('Keine Details für Studiengang ' . $antrag->studiengang_kz . ' gefunden!'); - continue; - } - $details = current(getData($result)); + $leitung = current(getData($result)); + if (!isset($stgLeitungen[$leitung->uid])) + { + $stgLeitungen[$leitung->uid] = [ 'Details' => $leitung, 'stgs' => [] ]; + } + $stgLeitungen[$leitung->uid]['stgs'][] = $antrag->studiengang_kz; - $stgs[$antrag->studiengang_kz] = [ 'Abmeldung' => [], 'Unterbrechung' => [], 'Wiederholung' => [], 'Details' => $details ]; - } - $stgs[$antrag->studiengang_kz] [$antrag->typ] = $antrag; - } + $result = $this->StudiengangModel->load($antrag->studiengang_kz); + if (isError($result)) + { + $this->logError(getError($result)); + continue; + } + if (!hasData($result)) + { + $this->logError('Keine Details für Studiengang ' . $antrag->studiengang_kz . ' gefunden!'); + continue; + } + $details = current(getData($result)); -/* var_dump($stgs); - var_dump($stgLeitungen);*/ + $stgs[$antrag->studiengang_kz] = [ + 'Abmeldung' => [], + 'Unterbrechung' => [], + 'Wiederholung' => [], + 'Details' => $details + ]; + } + $stgs[$antrag->studiengang_kz][str_replace('Stgl', '', $antrag->typ)] = $antrag; + } - $count = 0; - foreach($stgLeitungen as $leitung) - { - $data = array(); - if(sendSanchoMail("Sancho_Mail_Antrag_Stgl",$data,$leitung['Details']->email, 'Anträge - Aktion(en) erforderlich')) - $count++; - } + $this->load->model('system/Sprache_model', 'SpracheModel'); + $result = $this->SpracheModel->loadWhere(['content' => true]); + if (isError($result)) { + $this->logError(getError($result)); + $languages = [DEFAULT_LANGUAGE]; + } else if (!hasData($result)) { + $languages = [DEFAULT_LANGUAGE]; + } else { + $languages = array_map(function ($row) { + return $row->sprache; + }, getData($result)); + } - $this->logInfo($count . " Emails erfolgreich versandt"); + $count = 0; + foreach ($stgLeitungen as $leitung) + { + $data = [ + 'name' => trim($leitung['Details']->vorname . ' ' . $leitung['Details']->nachname) + ]; - // TODO(chris): Emailadresse stg - // TODO(chris): data Fertig + foreach ($languages as $lang) { + unset($this->p); + $this->loadPhrases(['studierendenantrag'], $lang); - $this->logInfo('End Job sendStglSammelmail'); + $table = ''; + foreach ($leitung['stgs'] as $studiengang_kz) { + $rows = ''; + $stg = $stgs[$studiengang_kz]; + foreach (['Abmeldung', 'Unterbrechung', 'Wiederholung'] as $typ) { + $c = count($stg[$typ]); + if ($c) { + $rows .= $this->p->t('studierendenantrag', 'mail_part_x_new_' . $typ, ['count' => $c]); + } + } + $table .= $this->p->t('studierendenantrag', 'mail_part_table', ['stg_bezeichnung' => $stg['Details']->bezeichnung, 'stg_orgform_kurzbz' => $stg['Details']->orgform_kurzbz, 'rows' => $rows]); + } + $data['table_' . $lang] = $table; + } + + $data['table'] = $data['table_' . DEFAULT_LANGUAGE]; + + if (sendSanchoMail("Sancho_Mail_Antrag_Stgl", $data, $leitung['Details']->uid . '@' . DOMAIN, 'Anträge - Aktion(en) erforderlich')) + $count++; + } + + $this->logInfo($count . " Emails erfolgreich versandt"); + + $this->logInfo('End Job sendStglSammelmail'); } /** @@ -210,22 +247,22 @@ class AntragJob extends JOB_Controller return; } - $digi_start= $this->config->item('digitalization_start'); - if($digi_start) - $digi_start = new DateTime($digi_start); + $digi_start= $this->config->item('digitalization_start'); + if($digi_start) + $digi_start = new DateTime($digi_start); $dateDeadline = new DateTime(); $dateDeadline->sub(DateInterval::createFromDateString($modifier_deadline)); - $result = $this->PruefungModel->getAllPrestudentsWhereCommitteeExamFailed( - [ - null, - Studierendenantragstatus_model::STATUS_REQUESTSENT_1, - Studierendenantragstatus_model::STATUS_REQUESTSENT_2 - ], - $dateDeadline, - $digi_start - ); + $result = $this->PruefungModel->getAllPrestudentsWhereCommitteeExamFailed( + [ + null, + Studierendenantragstatus_model::STATUS_REQUESTSENT_1, + Studierendenantragstatus_model::STATUS_REQUESTSENT_2 + ], + $dateDeadline, + $digi_start + ); if(isError($result)) { $this->logError(getError($result)); @@ -238,18 +275,18 @@ class AntragJob extends JOB_Controller $prestudents = $this->prestudentsGetUnique($prestudents); - foreach ($prestudents as $prestudent) - { - $result = $this->prestudentlib->setAbbrecher($prestudent->prestudent_id, $prestudent->studiensemester_kurzbz, $insertvon); - if (isError($result)) - $this->logError(getError($result)); - else - $count++; - } - $this->logInfo($count . " Students set to Abbrecher"); - } + foreach ($prestudents as $prestudent) + { + $result = $this->prestudentlib->setAbbrecher($prestudent->prestudent_id, $prestudent->studiensemester_kurzbz, $insertvon); + if (isError($result)) + $this->logError(getError($result)); + else + $count++; + } + $this->logInfo($count . " Students set to Abbrecher"); + } - $this->logInfo('Ende Job handleWiederholerDeadline'); + $this->logInfo('Ende Job handleWiederholerDeadline'); } /** diff --git a/application/views/lehre/Antrag/Student/List.php b/application/views/lehre/Antrag/Student/List.php index b1ec9e061..52242d7d6 100644 --- a/application/views/lehre/Antrag/Student/List.php +++ b/application/views/lehre/Antrag/Student/List.php @@ -33,29 +33,14 @@ $this->load->view( $array){ ?>

()

- - - - p->t('studierendenantrag', 'btn_new'); ?> - -