diff --git a/content/student/studentDBDML.php b/content/student/studentDBDML.php index 4a4b64201..e9c657635 100644 --- a/content/student/studentDBDML.php +++ b/content/student/studentDBDML.php @@ -95,6 +95,7 @@ if(!$rechte->isBerechtigt('admin') && !$rechte->isBerechtigt('assistenz') && !$r $data = ''; $error = true; } +$check_statusaenderung_berechtigung = 'student/keine_studstatuspruefung'; // *** FUNKTIONEN *** @@ -372,6 +373,175 @@ function isBuchungAllowedToChange($buchung_obj) return true; } +/** + * + * Prüft für einen Prestudenten, ob eine bestimmte Statusänderung valide ist. + * @param $prestudent_id + * @param $status_kurzbz des neuen/bearbeiteten Status + * @param $new_status_studiensemester Studiensemester des neuen/zu ändernen Status + * @param $new_status_datum Datum des neuen/zu ändernen Status + * @param $new_status_ausbildungssemester Ausbildungssemester des neuen/zu ändernen Status + * @param $old_status_studiensemester Studiensemester des alten Status, leer wenn neuer Status + * @param $old_status_ausbildungssemester Ausbildungssemester des alten Status, leer wenn neuer Status + * @return array + */ +function checkStatusaenderung( + $prestudent_id, $status_kurzbz, $new_status_studiensemester, $new_status_datum, $new_status_ausbildungssemester, + $old_status_studiensemester = '', $old_status_ausbildungssemester = '' +) +{ + global $db; + // Es ist ein neuer Status wenn es kein altes Semester gibt + $isNewStatus = $old_status_studiensemester == '' && $old_status_ausbildungssemester == ''; + // status_kurzbz für Endstatus + $endstatusArr = array('Absolvent', 'Abbrecher'); + // Datum des neuen Status setzen + $new_status_datum = new DateTime($new_status_datum); + + // Wenn neuer Status + if ($isNewStatus) + { + // Datum des neuen Status darf nicht in Vergangenheit liegen, sonst Probleme wenn neues Datum < Bismeldedatum + $current_date = new DateTime('today'); + if ($new_status_datum < $current_date) + { + return array( + 'error' => true, + 'errormsg' => 'Datum eines neuen Statuseintrags darf nicht in der Vergangenheit liegen' + ); + } + } + + // start des Studiensemesters holen + $studiensemester = new studiensemester(); + $studiensemester->load($new_status_studiensemester); + $new_status_semesterstart = new DateTime($studiensemester->start); + + // Alle bisherigen prestudentstatus nach Datum sortiert + $qry = "SELECT status_kurzbz, studiensemester_kurzbz, ausbildungssemester, datum, sem.start AS studiensemester_start + FROM public.tbl_prestudentstatus pss + JOIN public.tbl_studiensemester sem USING (studiensemester_kurzbz) + WHERE prestudent_id=".$db->db_add_param($prestudent_id, FHC_INTEGER); + + // zu ändernden Status rausfiltern wenn Status bearbeitet wird + if (!$isNewStatus) + { + $qry .= " AND NOT ( + status_kurzbz=".$db->db_add_param($status_kurzbz) + ." AND studiensemester_kurzbz=".$db->db_add_param($old_status_studiensemester) + ." AND ausbildungssemester=".$db->db_add_param($old_status_ausbildungssemester, FHC_INTEGER)." + )"; + } + + $qry .= " ORDER BY datum DESC, pss.insertamum DESC, pss.ext_id DESC"; + + $statusArr = array(); + if ($result = $db->db_query($qry)) + { + $newStatusInserted = false; + + // für jeden Status + while ($row = $db->db_fetch_object($result)) + { + $studiensemester_start = new DateTime($row->studiensemester_start); + $status_datum = new DateTime($row->datum); + + // Neuer/editierter Statuseintrag nach bestehendem Statuseintrag + if ($new_status_datum >= $status_datum && $new_status_semesterstart >= $studiensemester_start) + { + if (!$newStatusInserted) + { + // neuer Status erstmals größer als Datum eines bestehenden Status -> neuen Status einfügen + $new_status = new stdClass(); + $new_status->status_kurzbz = $status_kurzbz; + $new_status->studiensemester_kurzbz = $new_status_studiensemester; + $new_status->datum = $new_status_datum; + $new_status->ausbildungssemester = $new_status_ausbildungssemester; + $statusArr[] = $new_status; + $newStatusInserted = true; + } + + // Gültige Zeitabfolge, bestehenden Status hinzufügen + $statusArr[] = $row; + } + // oder Neuer/editierter Statuseintrag nach bestehendem Statuseintrag + elseif ($new_status_datum <= $status_datum && $new_status_semesterstart <= $studiensemester_start) + { + // Gültige Zeitabfolge, bestehenden Status hinzufügen + $statusArr[] = $row; + } + else + { + // Zeitabfolge ungültig, Fehler + return array( + 'error' => true, + 'errormsg' => 'Datum des Statuseintrags muss nach dem Statusdatum,' + .' Semesterstartdatum nach Semesterstartdatum des vorherigen Statuseintrags sein' + ); + } + } + + // Prüfungen den Prestudentstatus betreffend + // Über alle gespeicherten Status gehen und Statusabfolge prüfen + for ($i = 0; $i < count($statusArr); $i++) + { + $curr_status = $statusArr[$i]; + $curr_status_kurzbz = $curr_status->status_kurzbz; + $curr_status_ausbildungssemester = $curr_status->ausbildungssemester; + $next_idx = $i - 1; //absteigend sortiert, nächster Status ist vorheriger Eintrag + $next_status = isset($statusArr[$next_idx]) ? $statusArr[$next_idx] : null; + + // Abbrecher- oder Absolventenstatus muss Endstatus sein + if (isset($next_status) && in_array($curr_status_kurzbz, $endstatusArr)) + { + return array( + 'error' => true, + 'errormsg' => 'Nach Abbrecher- und Absolventenstatus darf kein anderer Status mehr eingetragen werden' + ); + } + + // wenn Unterbrecher auf Unterbrecher folgt, muss Ausbildungssemester gleich sein + if ( + $curr_status_kurzbz == 'Unterbrecher' && isset($next_status) && $next_status->status_kurzbz == 'Unterbrecher' + && $curr_status_ausbildungssemester != $next_status->ausbildungssemester + ) + { + return array( + 'error' => true, + 'errormsg' => 'Aufeinanderfolgende Unterbrecher müssen gleiches Ausbildungssemester haben' + ); + } + + // wenn Abbrecher auf Unterbrecher folgt, muss Ausbildungssemester gleich sein + if ( + isset($next_status) && $curr_status_kurzbz == 'Unterbrecher' + && $next_status->status_kurzbz == 'Abbrecher' && $curr_status_ausbildungssemester != $next_status->ausbildungssemester + ) + { + return array( + 'error' => true, + 'errormsg' => 'Unterbrecher und folgender Abbrecher müssen gleiches Ausbildungssemester haben' + ); + } + + // keine Studenten nach Diplomand Status + if ( + isset($next_status) && $curr_status_kurzbz == 'Diplomand' && $next_status->status_kurzbz == 'Student' + ) + { + return array( + 'error' => true, + 'errormsg' => 'Nach Diplomantenstatus darf kein Studentenstatus mehr eingetragen werden' + ); + } + } + } + else + return array('error' => true, 'errormsg' => 'Fehler bei Statusänderungcheck'); + + return array('error' => false, 'errormsg' => ''); +} + if(!$error) { @@ -403,7 +573,7 @@ if(!$error) $return = false; $errormsg = 'Geburtsdatum ist nicht korrekt.'; $error = true; - } + } if(!$error) { @@ -648,12 +818,12 @@ if(!$error) $prestudent->zgvort = $_POST['zgvort']; $prestudent->zgvdatum = $_POST['zgvdatum']; $prestudent->zgvnation = $_POST['zgvnation']; - $prestudent->zgv_erfuellt = $_POST['zgv_erfuellt']; + $prestudent->zgv_erfuellt = $_POST['zgv_erfuellt']; $prestudent->zgvmas_code = $_POST['zgvmas_code']; $prestudent->zgvmaort = $_POST['zgvmaort']; $prestudent->zgvmadatum = $_POST['zgvmadatum']; $prestudent->zgvmanation = $_POST['zgvmanation']; - $prestudent->zgvmas_erfuellt = $_POST['zgvmas_erfuellt']; + $prestudent->zgvmas_erfuellt = $_POST['zgvmas_erfuellt']; $prestudent->zgvdoktor_code = $_POST['zgvdoktor_code']; $prestudent->zgvdoktorort = $_POST['zgvdoktorort']; $prestudent->zgvdoktordatum = $_POST['zgvdoktordatum']; @@ -808,6 +978,28 @@ if(!$error) } } + // wenn keine spezielle Berechtiung zur Umgebung, Statusänderung Checks durchführen + if (!$rechte->isBerechtigt($check_statusaenderung_berechtigung)) + { + $new_status_datum = isset($_POST['datum']) ? $_POST['datum'] : date('Y-m-d'); + + $check_statusaenderung_result = checkStatusaenderung( + $prestudent_id, + $_POST['status_kurzbz'], + $studiensemester, + $new_status_datum, + $sem + ); + + if (isset($check_statusaenderung_result['error']) && $check_statusaenderung_result['error'] === true) + { + $return = false; + $error = true; + $errormsg .= isset($check_statusaenderung_result['errormsg']) ? $check_statusaenderung_result['errormsg'] : ''; + $anzahl_fehler++; + } + } + if(!$error) { $prestd_neu = new prestudent(); @@ -1003,7 +1195,7 @@ if(!$error) isset($_POST['prestudent_id']) && is_numeric($_POST['prestudent_id']) && isset($_POST['ausbildungssemester']) && is_numeric($_POST['ausbildungssemester'])) { - if($_POST['status_kurzbz']=='Student' && !$rechte->isBerechtigt('admin', null, 'suid')) + if($_POST['status_kurzbz']=='Student' && !$rechte->isBerechtigt('admin', null, 'suid') && !$rechte->isBerechtigt('student/keine_studstatuspruefung', null, 'suid')) { $return = false; $errormsg = 'Studentenrolle kann nur durch den Administrator geloescht werden'; @@ -1019,7 +1211,7 @@ if(!$error) if($row->anzahl<=1) { $deletePrestudent = true; - if (!$rechte->isBerechtigt('admin', null, 'suid')) + if (!$rechte->isBerechtigt('admin', null, 'suid') && !$rechte->isBerechtigt('student/keine_studstatuspruefung', null, 'suid')) { $return = false; $errormsg = 'Die letzte Rolle kann nur durch den Administrator geloescht werden'; @@ -1307,6 +1499,28 @@ if(!$error) $rolle->new = false; } + // Statuschecks durchführen wenn keine spezielle Berechtigung zur Umgehung + if (!$rechte->isBerechtigt($check_statusaenderung_berechtigung)) + { + // allgemeine Prüfung bei Änderung oder Hinzufügen eines Status, inkludiert alle Status + $check_statusaenderung_result = checkStatusaenderung( + $_POST['prestudent_id'], + $_POST['status_kurzbz'], + $_POST['studiensemester_kurzbz'], + $_POST['datum'], + $_POST['ausbildungssemester'], + $_POST['studiensemester_old'], + $_POST['ausbildungssemester_old'] + ); + + if (isset($check_statusaenderung_result['error']) && $check_statusaenderung_result['error'] === true) + { + $return = false; + $error = true; + $errormsg = isset($check_statusaenderung_result['errormsg']) ? $check_statusaenderung_result['errormsg'] : ''; + } + } + if(!$error) { // Bei Studenten wird der Studentlehrverband Eintrag angelegt/korrigiert @@ -2361,7 +2575,7 @@ if(!$error) { if ($dokument_kurzbz === 'Sonst' && $sonst !== 0) continue; - + if($dokument_kurzbz!='') { $dok = new dokument(); @@ -2374,7 +2588,7 @@ if(!$error) $dok->new = true; if ($dokument_kurzbz === 'Sonst') $sonst++; - + if(!$dok->save()) { diff --git a/system/dbupdate_3.3.php b/system/dbupdate_3.3.php index b8c55c2d1..df42e3a23 100644 --- a/system/dbupdate_3.3.php +++ b/system/dbupdate_3.3.php @@ -6176,6 +6176,20 @@ if($result = @$db->db_query("SELECT 1 FROM system.tbl_berechtigung WHERE berecht } } +// Add permission for avoiding checks when saving prestudentstatus +if($result = @$db->db_query("SELECT 1 FROM system.tbl_berechtigung WHERE berechtigung_kurzbz = 'student/keine_studstatuspruefung';")) +{ + if($db->db_num_rows($result) == 0) + { + $qry = "INSERT INTO system.tbl_berechtigung(berechtigung_kurzbz, beschreibung) VALUES('student/keine_studstatuspruefung', 'Ermöglicht Umgehen der Checks beim Speichern der Presstudentstatus');"; + + if(!$db->db_query($qry)) + echo 'system.tbl_berechtigung '.$db->db_last_error().'
'; + else + echo 'system.tbl_berechtigung: Added permission for student/keine_studstatuspruefung
'; + } +} + // *** Pruefung und hinzufuegen der neuen Attribute und Tabellen echo '

Pruefe Tabellen und Attribute!

';