Merge branch 'feature-19020/Checks_bei_Statusaenderungen'

This commit is contained in:
Andreas Österreicher
2022-06-09 14:56:27 +02:00
2 changed files with 235 additions and 7 deletions
+221 -7
View File
@@ -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())
{
+14
View File
@@ -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 '<strong>system.tbl_berechtigung '.$db->db_last_error().'</strong><br>';
else
echo 'system.tbl_berechtigung: Added permission for student/keine_studstatuspruefung<br>';
}
}
// *** Pruefung und hinzufuegen der neuen Attribute und Tabellen
echo '<H2>Pruefe Tabellen und Attribute!</H2>';