Prestudentstatus checks: order, Diplomand, orgform..., exceptionBisValidation: pass as boolean

This commit is contained in:
KarpAlex
2024-06-08 00:32:03 +02:00
parent c9db3bbc1f
commit 13a27d7e6f
4 changed files with 139 additions and 45 deletions
+104 -20
View File
@@ -390,15 +390,23 @@ function isBuchungAllowedToChange($buchung_obj)
* @return array mit error = true und Fehlerbeschreibung wenn ungültig, andernfalls error = false
*/
function checkStatusaenderung(
$prestudent_id, $status_kurzbz, $new_status_studiensemester, $new_status_datum, $new_status_ausbildungssemester,
$prestudent_id, $status_kurzbz,
$new_status_studiensemester, $new_status_datum, $new_status_ausbildungssemester, $new_status_orgform_kurzbz, $new_studienplan_id,
$old_status_studiensemester = '', $old_status_ausbildungssemester = ''
)
{
global $db;
// load stuidenplan orgform
$new_studienplan_orgform_kurzbz = '';
$studienplan = new studienplan();
if ($studienplan->loadStudienplan($new_studienplan_id))
{
$new_studienplan_orgform_kurzbz = $studienplan->orgform_kurzbz;
}
// 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);
@@ -422,10 +430,16 @@ function checkStatusaenderung(
$new_status_semesterstart = new DateTime($studiensemester->start);
// Alle 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);
$qry = "SELECT
status_kurzbz, studiensemester_kurzbz, ausbildungssemester, datum, sem.start AS studiensemester_start,
pss.orgform_kurzbz, pl.orgform_kurzbz AS studienplan_orgform_kurzbz, stud.matrikelnr
FROM
public.tbl_prestudentstatus pss
JOIN public.tbl_studiensemester sem USING (studiensemester_kurzbz)
JOIN public.tbl_student stud USING (prestudent_id)
JOIN lehre.tbl_studienplan pl USING (studienplan_id)
WHERE
prestudent_id=".$db->db_add_param($prestudent_id, FHC_INTEGER);
// zu ändernden Status rausfiltern wenn Status bearbeitet wird
if (!$isNewStatus)
@@ -461,6 +475,9 @@ function checkStatusaenderung(
$new_status->studiensemester_kurzbz = $new_status_studiensemester;
$new_status->datum = $new_status_datum;
$new_status->ausbildungssemester = $new_status_ausbildungssemester;
$new_status->orgform_kurzbz = $new_status_orgform_kurzbz;
$new_status->studienplan_orgform_kurzbz = $new_studienplan_orgform_kurzbz;
$new_status->matrikelnr = $row->matrikelnr;
$statusArr[] = $new_status;
$newStatusInserted = true;
}
@@ -484,16 +501,28 @@ function checkStatusaenderung(
}
}
// status_kurzbz für Endstatus
$endstatusArr = array('Absolvent', 'Abbrecher');
// status_kurzbz Abfolge vor dem Studentstatus
$statusAbfolge = array('Interessent', 'Bewerber', 'Aufgenommener');
// erster Studentstatus
$ersterStudent = null;
// Prüfungen den Prestudentstatus betreffend
// Über alle gespeicherten Status gehen und Statusabfolge prüfen
for ($i = 0; $i < count($statusArr); $i++)
{
$next_idx = $i - 1; //absteigend sortiert, nächster Status ist vorheriger Eintrag
$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;
if ($curr_status_kurzbz == 'Student') $ersterStudent = $curr_status;
// Abbrecher- oder Absolventenstatus muss Endstatus sein
if (isset($next_status) && in_array($curr_status_kurzbz, $endstatusArr))
{
@@ -511,7 +540,7 @@ function checkStatusaenderung(
{
return array(
'error' => true,
'errormsg' => 'Aufeinanderfolgende Unterbrecher müssen gleiches Ausbildungssemester haben'
'errormsg' => 'Aufeinanderfolgende Unterbrecherstatus müssen gleiches Ausbildungssemester haben'
);
}
@@ -523,18 +552,69 @@ function checkStatusaenderung(
{
return array(
'error' => true,
'errormsg' => 'Unterbrecher und folgender Abbrecher müssen gleiches Ausbildungssemester haben'
'errormsg' => 'Unterbrecherstatus und folgender Abbrecherstatus müssen gleiches Ausbildungssemester haben'
);
}
// keine Studenten nach Diplomand Status
if (
isset($next_status) && $curr_status_kurzbz == 'Diplomand' && $next_status->status_kurzbz == 'Student'
)
// Vor Studentstatus müssen bestimmte Status vorhanden sein
if (isset($next_status) && $next_status->status_kurzbz == 'Student')
{
$restliche_status_obj = array_slice($statusArr, $i);
$restliche_status = array_unique(array_column($restliche_status_obj, 'status_kurzbz'));
$status_intersected = array_intersect($restliche_status, $statusAbfolge);
if ($curr_status_kurzbz == 'Diplomand')
{
return array(
'error' => true,
'errormsg' => 'Nach Diplomantenstatus darf kein Studentenstatus mehr eingetragen werden'
);
}
if (array_values($status_intersected) != array_values(array_reverse($statusAbfolge)))
{
return array(
'error' => true,
'errormsg' => 'Vor dem Studentenstatus müssen folgende Status eingetragen werden: '.implode(', ', $statusAbfolge)
);
}
}
}
// wenn erster Studentstatus, checken ob Personenkennzeichen passt
if (isset($ersterStudent))
{
$studiensemester = new studiensemester();
$studienjahrNumber = $studiensemester->getStudienjahrNumberFromStudiensemester($ersterStudent->studiensemester_kurzbz);
if ($studienjahrNumber != mb_substr($ersterStudent->matrikelnr, 0, 2))
{
return array(
'error' => true,
'errormsg' => 'Nach Diplomantenstatus darf kein Studentenstatus mehr eingetragen werden'
'errormsg' => 'Personenkennzeichen passt nicht zu Studiensemester des ersten Studentstatus'
);
}
if (!empty(
array_filter(
$restliche_status_obj,
function($s) use($ersterStudent)
{
return
$s->status_kurzbz == 'Bewerber'
&& (
$s->orgform_kurzbz != $ersterStudent->orgform_kurzbz
|| $s->studienplan_orgform_kurzbz != $ersterStudent->studienplan_orgform_kurzbz
);
}
)
)
) {
return array(
'error' => true,
'errormsg' => 'Erster Studentstatus muss gleiche Organisationsform haben wie Bewerberstatus (Status oder Studienplan Orgform)'
);
}
}
@@ -1005,7 +1085,7 @@ if(!$error)
{
$return = false;
$error = true;
$errormsg .= 'Studentstatus mit Datum oder Semesterende vor erreichtem Meldestichtag können nicht hinzugefügt werden.';
$errormsg .= 'Studentstatus mit Datum vor erreichtem Meldestichtag können nicht hinzugefügt werden.';
$anzahl_fehler++;
}
@@ -1014,7 +1094,9 @@ if(!$error)
$_POST['status_kurzbz'],
$studiensemester,
$new_status_datum,
$sem
$sem,
$_POST['orgform_kurzbz'],
$_POST['studienplan_id']
);
if (isset($check_statusaenderung_result['error']) && $check_statusaenderung_result['error'] === true)
@@ -1240,7 +1322,7 @@ if(!$error)
elseif ($meldestichtag_erreicht && !$erweiterteBerechtigungen && !$rtaufsichtUndStatusAbgewiesen)
{
$return = false;
$errormsg = 'Studentstatus mit Datum oder Semesterende vor erreichtem Meldestichtag können nicht gelöscht werden.';
$errormsg = 'Studentstatus mit Datum vor erreichtem Meldestichtag können nicht gelöscht werden.';
}
else
{
@@ -1551,6 +1633,8 @@ if(!$error)
$_POST['studiensemester_kurzbz'],
$_POST['datum'],
$_POST['ausbildungssemester'],
$_POST['orgform_kurzbz'],
$_POST['studienplan_id'],
$_POST['studiensemester_old'],
$_POST['ausbildungssemester_old']
);
@@ -1566,11 +1650,11 @@ if(!$error)
$bismeldestichtag = new bismeldestichtag();
$meldestichtag_erreicht = $bismeldestichtag->checkMeldestichtagErreicht($_POST['datum']);
if ($meldestichtag_erreicht === true && !($_POST['exceptionValidationBismeldung']))
if ($meldestichtag_erreicht === true && !($_POST['exceptionValidationBismeldung'] == 'true'))
{
$return = false;
$error = true;
$errormsg = 'Studentstatus mit Datum oder Semesterende vor erreichtem Meldestichtag können nicht hinzugefügt werden.';
$errormsg = 'Studentstatus mit Datum vor erreichtem Meldestichtag können nicht bearbeitet werden.';
}
}
+2 -2
View File
@@ -2273,7 +2273,7 @@ function StudentRolleSpeichern(dialog, studiensemester_old, ausbildungssemester_
rt_stufe = dialog.getElementById('student-rolle-menulist-stufe').value;
statusgrund_id = dialog.getElementById('student-rolle-menulist-statusgrund').value;
bewerbung_abgeschicktamum = dialog.getElementById('student-rolle-datum-bewerbung_abgeschicktamum').value;
exceptionValidationBismeldung = dialog.getElementById('student-rolle-bis-exception').value;
exceptionValidationBismeldung = dialog.getElementById('student-rolle-bis-exception').checked;
if(!CheckDatum(datum))
{
@@ -4785,7 +4785,7 @@ function StudentNotenMoveFromAntrag()
var uid = document.getElementById('student-detail-textbox-uid').value;
req.add('student_uid', uid);
var txt = "?";
for(var q in req.parms) {
txt = txt+'&'+req.parms[q].name+'='+encodeURIComponent(req.parms[q].value);
+21 -23
View File
@@ -86,19 +86,19 @@ if($prestudent_id!='')
$disabled = $bismeldestichtag->checkMeldestichtagErreicht($datum) && !$rechte->isBerechtigt('student/keine_studstatuspruefung', null, 'suid')
? ' disabled="true"'
: '';
$isStatusBeforeStudent = in_array($status_kurzbz, array('Student','Diplomand','Absovlent','Incoming','Abbrecher','Unterbrecher'))
? false
: true;
$disabledStudent = $isStatusBeforeStudent
$isStatusBeforeStudent = in_array($status_kurzbz, array('Student','Diplomand','Absovlent','Incoming','Abbrecher','Unterbrecher'))
? false
: true;
$disabledStudent = $isStatusBeforeStudent
? ' '
: ' disabled="true"';
}
?>
<window id="student-rolle-dialog" title="Status"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
onload="StudentRolleInit(<?php echo "'$prestudent_id','$status_kurzbz','$studiensemester_kurzbz','$ausbildungssemester'";?>)"
>
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
onload="StudentRolleInit(<?php echo "'$prestudent_id','$status_kurzbz','$studiensemester_kurzbz','$ausbildungssemester'";?>)"
>
<script type="application/x-javascript" src="<?php echo APP_ROOT; ?>content/student/studentrolledialog.js.php" />
<script type="application/x-javascript" src="<?php echo APP_ROOT; ?>content/functions.js.php" />
@@ -110,7 +110,7 @@ if($prestudent_id!='')
<label class="warning">Meldestichtag erreicht - ausschließlich Bearbeiten Statusgrund möglich</label>
<?php endif; ?>
<?php if ($disabled && $isStatusBeforeStudent): ?>
<label class="warning">Meldestichtag erreicht - Bearbeiten Ausbildungssemester und Statusgrund möglich</label>
<label class="warning">Meldestichtag erreicht - Bearbeiten Ausbildungssemester und Statusgrund möglich</label>
<?php endif; ?>
<caption label="Details<?php echo ($nachname!=''?" $nachname $vorname":'');?>"/>
<grid id="student-rolle-grid-detail" style="margin:4px;" flex="1">
@@ -140,13 +140,13 @@ if($prestudent_id!='')
<row>
<label value="Studiensemester" control="student-rolle-menulist-studiensemester"/>
<menulist id="student-rolle-menulist-studiensemester"
datasources="<?php echo APP_ROOT ?>rdf/studiensemester.rdf.php?order=desc" flex="1"
ref="http://www.technikum-wien.at/studiensemester/liste"<?php echo $disabled ?> >
datasources="<?php echo APP_ROOT ?>rdf/studiensemester.rdf.php?order=desc" flex="1"
ref="http://www.technikum-wien.at/studiensemester/liste"<?php echo $disabled ?> >
<template>
<menupopup>
<menuitem value="rdf:http://www.technikum-wien.at/studiensemester/rdf#kurzbz"
label="rdf:http://www.technikum-wien.at/studiensemester/rdf#kurzbz"
uri="rdf:*"/>
label="rdf:http://www.technikum-wien.at/studiensemester/rdf#kurzbz"
uri="rdf:*"/>
</menupopup>
</template>
</menulist>
@@ -262,28 +262,26 @@ if($prestudent_id!='')
<row>
<label value="Grund"/>
<menulist id="student-rolle-menulist-statusgrund"
datasources="rdf:null" flex="1"
ref="http://www.technikum-wien.at/statusgrund">
datasources="rdf:null" flex="1"
ref="http://www.technikum-wien.at/statusgrund">
<template>
<menupopup>
<menuitem value="rdf:http://www.technikum-wien.at/statusgrund/rdf#statusgrund_id"
label="rdf:http://www.technikum-wien.at/statusgrund/rdf#bezeichnung_mehrsprachig"
uri="rdf:*"/>
label="rdf:http://www.technikum-wien.at/statusgrund/rdf#bezeichnung_mehrsprachig"
uri="rdf:*"/>
</menupopup>
</template>
</menulist>
</row>
<?php if ($disabled): ?>
<row hidden="true">
<label value="exceptionBisValidation" control="student-rolle-bis-exception"/>
<checkbox id="student-rolle-bis-exception" checked="true"/>
</row>
<?php endif; ?>
<row hidden="true">
<label value="exceptionBisValidation" control="student-rolle-bis-exception"/>
<checkbox id="student-rolle-bis-exception" checked="<?php echo ($disabled) ? 'true' : 'false' ?>"/>
</row>
</rows>
</grid>
<hbox>
<spacer flex="1" />
<button id="student-rolle-button-speichern" oncommand="StudentRolleSpeichern()" label="Speichern"/>
<button id="student-rolle-button-speichern" oncommand="StudentRolleSpeichern()" label="Speichern"/>
</hbox>
</groupbox>
+12
View File
@@ -1157,5 +1157,17 @@ class studiensemester extends basis_db
return false;
}
}
/**
* Holt Studienjahr von Studiensemester (letzte zwei Ziffern), z.B. 24 für WS2024 und SS2025
* @param studiensemester_kurzbz
* @return string Studienjahr Nummer
*/
public function getStudienjahrNumberFromStudiensemester($studiensemester_kurzbz)
{
$studienjahrNumber = mb_substr($studiensemester_kurzbz,4,2);
if (is_numeric($studienjahrNumber) && mb_substr($studiensemester_kurzbz,0,2)=='SS') $studienjahrNumber -= 1;
return $studienjahrNumber;
}
}
?>