mirror of
https://github.com/FH-Complete/FHC-Core.git
synced 2026-06-01 20:29:29 +00:00
Studierendenverwaltung: added new prestudenstatus checks, created PrestudentstatusCheckLib
This commit is contained in:
@@ -23,6 +23,7 @@ class Status extends FHCAPI_Controller
|
||||
|
||||
// Load Libraries
|
||||
$this->load->library('VariableLib', ['uid' => getAuthUID()]);
|
||||
$this->load->library('PrestudentstatusCheckLib');
|
||||
|
||||
// Load language phrases
|
||||
$this->loadPhrases([
|
||||
@@ -126,6 +127,7 @@ class Status extends FHCAPI_Controller
|
||||
$datum = $this->input->post('datum');
|
||||
$bestaetigtam = $this->input->post('bestaetigtam');
|
||||
$bewerbung_abgeschicktamum = $this->input->post('bewerbung_abgeschicktamum');
|
||||
$studienplan_id = $this->input->post('studienplan_id');
|
||||
$studiensemester_kurzbz = $this->input->post('studiensemester_kurzbz');
|
||||
$anmerkung = $this->input->post('anmerkung');
|
||||
$statusgrund_id = $this->input->post('statusgrund_id');
|
||||
@@ -165,7 +167,8 @@ class Status extends FHCAPI_Controller
|
||||
{
|
||||
return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
if($result->retval == '1')
|
||||
|
||||
if(getData($result) == '1')
|
||||
{
|
||||
return $this->terminateWithError($name . ": " . $this->p->t('lehre','error_rolleBereitsVorhanden'), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
@@ -249,21 +252,17 @@ class Status extends FHCAPI_Controller
|
||||
if(!$isBerechtigtNoStudstatusCheck)
|
||||
{
|
||||
//Block STATUSCHECKS
|
||||
$new_status_datum = isset($datum) ? $datum : date('Y-m-d');
|
||||
$result = $this->PrestudentstatusModel->checkDatumNewStatus($new_status_datum);
|
||||
if (isError($result))
|
||||
{
|
||||
return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
$new_status_datum = isset($datum) ? $datum : date('Y-m-d');
|
||||
|
||||
$result = $this->PrestudentstatusModel->checkIfValidStatusHistory(
|
||||
$result = $this->prestudentstatuschecklib->checkStatusAdd(
|
||||
$prestudent_id,
|
||||
$name,
|
||||
$status_kurzbz,
|
||||
$studiensemester_kurzbz,
|
||||
$new_status_datum,
|
||||
$ausbildungssemester
|
||||
$ausbildungssemester,
|
||||
$studienplan_id
|
||||
);
|
||||
|
||||
if (isError($result))
|
||||
{
|
||||
return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
|
||||
@@ -545,9 +544,9 @@ class Status extends FHCAPI_Controller
|
||||
|
||||
$sqlundo =
|
||||
"
|
||||
INSERT INTO public.tbl_prestudentstatus(prestudent_id, status_kurzbz, studiensemester_kurzbz, ausbildungssemester,
|
||||
datum, insertamum, insertvon, updateamum, updatevon, ext_id, orgform_kurzbz, bestaetigtam, bestaetigtvon,
|
||||
anmerkung, bewerbung_abgeschicktamum, studienplan_id, rt_stufe, statusgrund_id)
|
||||
INSERT INTO public.tbl_prestudentstatus(prestudent_id, status_kurzbz, studiensemester_kurzbz, ausbildungssemester,
|
||||
datum, insertamum, insertvon, updateamum, updatevon, ext_id, orgform_kurzbz, bestaetigtam, bestaetigtvon,
|
||||
anmerkung, bewerbung_abgeschicktamum, studienplan_id, rt_stufe, statusgrund_id)
|
||||
VALUES('" . $prestudent_id . "','" . $status_kurzbz . "','" . $studiensemester_kurzbz . "','" . $ausbildungssemester . "',"
|
||||
. $quotes_datum . $datum . $quotes_datum . ","
|
||||
. $quotes_insertamum . $insertamum . $quotes_insertamum . ","
|
||||
@@ -795,7 +794,7 @@ class Status extends FHCAPI_Controller
|
||||
aufnahmeschluessel, facheinschlberuf, anmeldungreihungstest, reihungstestangetreten, reihungstest_id,
|
||||
rt_gesamtpunkte, rt_punkte1, rt_punkte2, rt_punkte3, bismelden, person_id, anmerkung, mentor, ext_id,
|
||||
dual, ausstellungsstaat, zgvdoktor_code, zgvdoktorort, zgvdoktordatum, zgvdoktornation,
|
||||
gsstudientyp_kurzbz, aufnahmegruppe_kurzbz, priorisierung, zgvdoktor_erfuellt)
|
||||
gsstudientyp_kurzbz, aufnahmegruppe_kurzbz, priorisierung, zgvdoktor_erfuellt)
|
||||
VALUES('" . $prestudent_id . "',"
|
||||
. $quotes_aufmerksamdurch_kurzbz . $aufmerksamdurch_kurzbz . $quotes_aufmerksamdurch_kurzbz . ","
|
||||
. $quotes_studiengang_kz . $studiengang_kz . $quotes_studiengang_kz . ","
|
||||
@@ -974,14 +973,17 @@ class Status extends FHCAPI_Controller
|
||||
{
|
||||
//Block STATUSCHECKS
|
||||
|
||||
$result = $this->PrestudentstatusModel->checkIfValidStatusHistory(
|
||||
$result = $this->prestudentstatuschecklib->checkStatusUpdate(
|
||||
$prestudent_id,
|
||||
'',
|
||||
$status_kurzbz,
|
||||
$studiensemester_kurzbz,
|
||||
$datum,
|
||||
$ausbildungssemester
|
||||
$ausbildungssemester,
|
||||
$studienplan_id,
|
||||
$key_studiensemester_kurzbz,
|
||||
$key_ausbildungssemester
|
||||
);
|
||||
|
||||
if (isError($result))
|
||||
{
|
||||
return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
|
||||
|
||||
@@ -0,0 +1,301 @@
|
||||
<?php
|
||||
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
class PrestudentstatusCheckLib
|
||||
{
|
||||
const INTERESSENT_STATUS = 'Interessent';
|
||||
const BEWERBER_STATUS = 'Bewerber';
|
||||
const AUFGENOMMENER_STATUS = 'Aufgenommener';
|
||||
const UNTERBRECHER_STATUS = 'Unterbrecher';
|
||||
const STUDENT_STATUS = 'Student';
|
||||
const DIPLOMAND_STATUS = 'Diplomand';
|
||||
const ABSOLVENT_STATUS = 'Absolvent';
|
||||
const ABBRECHER_STATUS = 'Abbrecher';
|
||||
|
||||
private $_ci;
|
||||
private $_statusAbfolgeVorStudent = [self::INTERESSENT_STATUS, self::BEWERBER_STATUS, self::AUFGENOMMENER_STATUS];
|
||||
private $_endStatusArr = [self::ABSOLVENT_STATUS, self::ABBRECHER_STATUS];
|
||||
|
||||
/**
|
||||
* Object initialization
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
$this->_ci =& get_instance();
|
||||
|
||||
$this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
|
||||
$this->_ci->load->model('person/Person_model', 'PersonModel');
|
||||
$this->_ci->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel');
|
||||
$this->_ci->load->model('organisation/Studienplan_model', 'StudienplanModel');
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if a status add is valid.
|
||||
* @return object error if invalid
|
||||
*/
|
||||
public function checkStatusAdd(
|
||||
$prestudent_id,
|
||||
$status_kurzbz,
|
||||
$new_status_studiensemester_kurzbz,
|
||||
$new_status_datum,
|
||||
$new_status_ausbildungssemester,
|
||||
$new_studienplan_id
|
||||
) {
|
||||
$studentName = '';
|
||||
|
||||
$nameRes = $this->_ci->PersonModel->loadPrestudent($prestudent_id);
|
||||
|
||||
if (hasData($nameRes))
|
||||
{
|
||||
$nameData = getData($nameRes)[0];
|
||||
$studentName = $nameData->vorname.' '.$nameData->nachname;
|
||||
}
|
||||
|
||||
// Datum des neuen Status darf nicht in Vergangenheit liegen, sonst Probleme wenn neues Datum < Bismeldedatum
|
||||
if (new DateTime($new_status_datum) < new DateTime('today'))
|
||||
return error($studentName . $this->_ci->p->t('lehre', 'error_entryInPast'));
|
||||
|
||||
return $this->_checkIfValidStatusHistory(
|
||||
$prestudent_id,
|
||||
$status_kurzbz,
|
||||
$new_status_studiensemester_kurzbz,
|
||||
$new_status_datum,
|
||||
$new_status_ausbildungssemester,
|
||||
$new_studienplan_id
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if a status update is valid.
|
||||
* @return error if invalid
|
||||
*/
|
||||
public function checkStatusUpdate(
|
||||
$prestudent_id,
|
||||
$status_kurzbz,
|
||||
$new_status_studiensemester_kurzbz,
|
||||
$new_status_datum,
|
||||
$new_status_ausbildungssemester,
|
||||
$new_studienplan_id,
|
||||
$old_status_studiensemester,
|
||||
$old_status_ausbildungssemester
|
||||
) {
|
||||
|
||||
return $this->_checkIfValidStatusHistory(
|
||||
$prestudent_id,
|
||||
$status_kurzbz,
|
||||
$new_status_studiensemester_kurzbz,
|
||||
$new_status_datum,
|
||||
$new_status_ausbildungssemester,
|
||||
$new_studienplan_id,
|
||||
$old_status_studiensemester,
|
||||
$old_status_ausbildungssemester
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if History of StatusData is valid
|
||||
* @param integer $prestudent_id
|
||||
* @return error if not valid, array StatusArr if valid
|
||||
*/
|
||||
private function _checkIfValidStatusHistory(
|
||||
$prestudent_id,
|
||||
$status_kurzbz,
|
||||
$new_status_studiensemester_kurzbz,
|
||||
$new_status_datum,
|
||||
$new_status_ausbildungssemester,
|
||||
$new_studienplan_id,
|
||||
$old_status_studiensemester = null,
|
||||
$old_status_ausbildungssemester = null
|
||||
) {
|
||||
//get start studiensemester
|
||||
$semResult = $this->_ci->StudiensemesterModel->load([
|
||||
'studiensemester_kurzbz' => $new_status_studiensemester_kurzbz
|
||||
]);
|
||||
|
||||
if (isError($semResult))
|
||||
{
|
||||
$this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR);
|
||||
return $this->outputJson(getError($semResult));
|
||||
}
|
||||
|
||||
if (!hasData($semResult)) {
|
||||
return error($this->_ci->p->t('lehre', 'error_noStudiensemester') . $new_status_studiensemester_kurzbz);
|
||||
}
|
||||
|
||||
$studiensemester = getData($semResult)[0];
|
||||
$new_status_semesterstart = $studiensemester->start;
|
||||
|
||||
// get studienplan orgform
|
||||
$new_studienplan_orgform_kurzbz = '';
|
||||
$this->_ci->StudienplanModel->addSelect('orgform_kurzbz');
|
||||
$stplResult = $this->_ci->StudienplanModel->load([
|
||||
'studienplan_id' => $new_studienplan_id
|
||||
]);
|
||||
|
||||
if (isError($stplResult))
|
||||
{
|
||||
$this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR);
|
||||
return $this->outputJson(getError($stplResult));
|
||||
}
|
||||
|
||||
if (hasData($stplResult)) $new_studienplan_orgform_kurzbz = getData($stplResult)[0]->orgform_kurzbz;
|
||||
|
||||
|
||||
//get all prestudentstati
|
||||
$resultPs = $this->_ci->PrestudentstatusModel->getAllPrestudentstatiWithStudiensemester($prestudent_id);
|
||||
|
||||
if (isError($resultPs)) return $resultPs;
|
||||
|
||||
$resultArr = hasData($resultPs) ? getData($resultPs) : [];
|
||||
$statusArr = [];
|
||||
|
||||
$newStatusInserted = false;
|
||||
$new_status_datum_form = new DateTime($new_status_datum);
|
||||
$new_status_semesterstart_form = new DateTime($new_status_semesterstart);
|
||||
|
||||
$neuer_status = new stdClass();
|
||||
$neuer_status->status_kurzbz = $status_kurzbz;
|
||||
$neuer_status->studiensemester_kurzbz = $new_status_studiensemester_kurzbz;
|
||||
$neuer_status->datum = $new_status_datum;
|
||||
$neuer_status->ausbildungssemester = $new_status_ausbildungssemester;
|
||||
$neuer_status->studienplan_orgform_kurzbz = $new_studienplan_orgform_kurzbz;
|
||||
|
||||
foreach ($resultArr as $row)
|
||||
{
|
||||
// gerade bearbeiteten Status überspringen
|
||||
if (isset($old_status_studiensemester)
|
||||
&& isset($old_status_ausbildungssemester)
|
||||
&& $row->status_kurzbz == $status_kurzbz
|
||||
&& $row->studiensemester_kurzbz == $old_status_studiensemester
|
||||
&& $row->ausbildungssemester == $old_status_ausbildungssemester)
|
||||
continue;
|
||||
|
||||
$studiensemester_start = new DateTime($row->studiensemester_start);
|
||||
$status_datum = new DateTime($row->datum);
|
||||
|
||||
if ($new_status_datum_form >= $status_datum && $new_status_semesterstart_form >= $studiensemester_start)
|
||||
{
|
||||
if (!$newStatusInserted)
|
||||
{
|
||||
// neuer Status erstmals größer als Datum eines bestehenden Status -> neuen Status EINMALIG einfügen für spätere Statusprüfung
|
||||
$neuer_status = new stdClass();
|
||||
$neuer_status->status_kurzbz = $status_kurzbz;
|
||||
$neuer_status->studiensemester_kurzbz = $new_status_studiensemester_kurzbz;
|
||||
$neuer_status->datum = $new_status_datum;
|
||||
$neuer_status->ausbildungssemester = $new_status_ausbildungssemester;
|
||||
$neuer_status->studienplan_orgform_kurzbz = $new_studienplan_orgform_kurzbz;
|
||||
$neuer_status->matrikelnr = $row->matrikelnr;
|
||||
$neuer_status->vorname = $row->vorname;
|
||||
$neuer_status->nachname = $row->nachname;
|
||||
$statusArr[] = $neuer_status;
|
||||
$newStatusInserted = true;
|
||||
}
|
||||
$statusArr[] = $row;
|
||||
}
|
||||
elseif ($new_status_datum_form <= $status_datum && $new_status_semesterstart_form <= $studiensemester_start)
|
||||
{
|
||||
$statusArr[] = $row;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Zeitabfolge ungültig, Fehler
|
||||
return error($this->_ci->p->t('lehre', 'error_statuseintrag_zeitabfolge'));
|
||||
}
|
||||
}
|
||||
|
||||
// erster Studentstatus
|
||||
$ersterStudent = null;
|
||||
|
||||
// Ü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;
|
||||
|
||||
$studentName = $curr_status->vorname . ' ' . $curr_status->nachname;
|
||||
|
||||
if ($curr_status_kurzbz == self::STUDENT_STATUS) $ersterStudent = $curr_status;
|
||||
|
||||
// Abbrecher- oder Absolventenstatus muss Endstatus sein
|
||||
if (isset($next_status) && in_array($curr_status_kurzbz, $this->_endStatusArr))
|
||||
{
|
||||
return error($studentName . ' ' . $this->_ci->p->t('lehre', 'error_endstatus'));
|
||||
}
|
||||
|
||||
// wenn Unterbrecher auf Unterbrecher folgt, muss Ausbildungssemester gleich sein
|
||||
if
|
||||
($curr_status_kurzbz == self::UNTERBRECHER_STATUS && isset($next_status) && $next_status->status_kurzbz == self::UNTERBRECHER_STATUS
|
||||
&& $curr_status_ausbildungssemester != $next_status->ausbildungssemester)
|
||||
{
|
||||
return error($studentName . ' ' . $this->_ci->p->t('lehre', 'error_consecutiveUnterbrecher'));
|
||||
}
|
||||
|
||||
// wenn Abbrecher auf Unterbrecher folgt, muss Ausbildungssemester gleich sein
|
||||
if (isset($next_status)
|
||||
&& $curr_status_kurzbz == self::UNTERBRECHER_STATUS
|
||||
&& $next_status->status_kurzbz == self::ABBRECHER_STATUS && $curr_status_ausbildungssemester != $next_status->ausbildungssemester)
|
||||
{
|
||||
return error($studentName . ' ' . $this->_ci->p->t('lehre', 'error_consecutiveUnterbrecherAbbrecher'));
|
||||
}
|
||||
|
||||
if (isset($next_status) && $next_status->status_kurzbz == self::STUDENT_STATUS)
|
||||
{
|
||||
$restliche_status_obj = array_slice($statusArr, $i);
|
||||
$restliche_status = array_unique(array_column($restliche_status_obj, 'status_kurzbz'));
|
||||
$status_intersected = array_intersect($restliche_status, $this->_statusAbfolgeVorStudent);
|
||||
|
||||
// Vor Studentstatus darf kein Diplomand Status vorhanden sein
|
||||
if (in_array(self::DIPLOMAND_STATUS, $restliche_status))
|
||||
{
|
||||
return error($studentName . ' ' . $this->_ci->p->t('lehre', 'error_consecutiveDiplomandStudent'));
|
||||
}
|
||||
|
||||
// Vor Studentstatus müssen bestimmte Status vorhanden sein
|
||||
if (array_values($status_intersected) != array_values(array_reverse($this->_statusAbfolgeVorStudent)))
|
||||
{
|
||||
return error(
|
||||
$studentName . ' '
|
||||
. $this->_ci->p->t('lehre', 'error_wrongStatusOrderBeforeStudent', array(implode(', ', $this->_statusAbfolgeVorStudent)))
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($ersterStudent))
|
||||
{
|
||||
$studentName = $ersterStudent->vorname . ' ' . $ersterStudent->nachname;
|
||||
|
||||
// wenn erster Studentstatus, checken ob Personenkennzeichen passt
|
||||
$studienjahrNumber = $this->_ci->StudiensemesterModel->getStudienjahrNumberFromStudiensemester($ersterStudent->studiensemester_kurzbz);
|
||||
|
||||
if ($studienjahrNumber != mb_substr($ersterStudent->matrikelnr, 0, 2))
|
||||
{
|
||||
return error($studentName . ' ' . $this->_ci->p->t('lehre', 'error_personenkennzeichenPasstNichtZuStudiensemester'));
|
||||
}
|
||||
|
||||
// wenn erster Studentstatus, checken ob Orgform des Bewerbers mit Studenten übereinstimmt
|
||||
if (!isEmptyArray(
|
||||
array_filter(
|
||||
$restliche_status_obj,
|
||||
function ($s) use ($ersterStudent) {
|
||||
return
|
||||
$s->status_kurzbz == self::BEWERBER_STATUS
|
||||
&& (
|
||||
$s->studienplan_orgform_kurzbz != $ersterStudent->studienplan_orgform_kurzbz
|
||||
);
|
||||
}
|
||||
)
|
||||
)
|
||||
)
|
||||
{
|
||||
return error($studentName . ' ' . $this->_ci->p->t('lehre', 'error_bewerberOrgformUngleichStudentOrgform'));
|
||||
}
|
||||
}
|
||||
|
||||
return $resultPs;
|
||||
}
|
||||
}
|
||||
@@ -365,11 +365,11 @@ class Prestudentstatus_model extends DB_Model
|
||||
{
|
||||
$qry = "SELECT
|
||||
*
|
||||
FROM
|
||||
FROM
|
||||
public.tbl_prestudentstatus
|
||||
WHERE
|
||||
prestudent_id = ?
|
||||
AND
|
||||
prestudent_id = ?
|
||||
AND
|
||||
status_kurzbz = ?
|
||||
AND
|
||||
studiensemester_kurzbz = ?
|
||||
@@ -401,11 +401,11 @@ class Prestudentstatus_model extends DB_Model
|
||||
{
|
||||
$qry = "SELECT
|
||||
*
|
||||
FROM
|
||||
FROM
|
||||
public.tbl_prestudentstatus
|
||||
WHERE
|
||||
prestudent_id = ?
|
||||
AND
|
||||
prestudent_id = ?
|
||||
AND
|
||||
status_kurzbz = 'Bewerber'";
|
||||
|
||||
$result = $this->execQuery($qry, array($prestudent_id));
|
||||
@@ -434,7 +434,7 @@ class Prestudentstatus_model extends DB_Model
|
||||
{
|
||||
$qry = "SELECT
|
||||
COUNT(*) as anzahl
|
||||
FROM
|
||||
FROM
|
||||
public.tbl_prestudentstatus
|
||||
WHERE
|
||||
prestudent_id = ?
|
||||
@@ -471,186 +471,34 @@ class Prestudentstatus_model extends DB_Model
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if Datum New Status is in the Past
|
||||
* @param integer $prestudent_id
|
||||
* @return error if in past
|
||||
*/
|
||||
public function checkDatumNewStatus($new_status_datum)
|
||||
public function getAllPrestudentstatiWithStudiensemester($prestudent_id)
|
||||
{
|
||||
$today = new DateTime('today');
|
||||
$new_status_datum = new DateTime($new_status_datum);
|
||||
|
||||
if($new_status_datum < $today)
|
||||
{
|
||||
return error($this->p->t('lehre','error_entryInPast'));
|
||||
}
|
||||
else
|
||||
{
|
||||
return success();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if History of StatusData is valid
|
||||
* @param integer $prestudent_id
|
||||
* @return error if not valid, array StatusArr if valid
|
||||
*/
|
||||
public function checkIfValidStatusHistory($prestudent_id, $nameStud, $status_kurzbz, $new_status_studiensemester_kurzbz, $new_status_datum, $new_status_ausbildungssemester, $old_status_studiensemester_kurzbz = '', $old_status_ausbildungssemester = '')
|
||||
{
|
||||
$name = ($nameStud != '') ? $nameStud . ": " : '';
|
||||
//$isNewStatus = $this->checkIfNewStatus($prestudent_id, $status_kurzbz);
|
||||
$isNewStatus = $old_status_studiensemester_kurzbz == '' && $old_status_ausbildungssemester == '';
|
||||
|
||||
//get start studiensemester
|
||||
$result = $this->StudiensemesterModel->load([
|
||||
'studiensemester_kurzbz' => $new_status_studiensemester_kurzbz
|
||||
]);
|
||||
if(isError($result))
|
||||
{
|
||||
$this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR);
|
||||
return $this->outputJson(getError($result));
|
||||
}
|
||||
elseif(!hasData($result)) {
|
||||
return error($this->p->t('lehre','error_noStudiensemester') . $new_status_studiensemester_kurzbz);
|
||||
}
|
||||
|
||||
$studiensemester = current($result->retval);
|
||||
$new_status_semesterstart = $studiensemester->start;
|
||||
|
||||
//get all prestudentstati
|
||||
//TODO(manu) check errorlogic
|
||||
$resultPs = $this->getAllPrestudentstatiWithStudiensemester($prestudent_id);
|
||||
if (isError($resultPs))
|
||||
{
|
||||
$resultArr = [];
|
||||
}
|
||||
if(!hasData($resultPs))
|
||||
{
|
||||
$resultArr = [];
|
||||
}
|
||||
else
|
||||
$resultArr = $resultPs->retval;
|
||||
|
||||
$statusArr = array();
|
||||
|
||||
$newStatusInserted = false;
|
||||
$new_status_datum_form = new DateTime($new_status_datum);
|
||||
$new_status_semesterstart_form = new DateTime($new_status_semesterstart);
|
||||
|
||||
|
||||
foreach ($resultArr as $row)
|
||||
{
|
||||
$studiensemester_start = new DateTime($row->studiensemester_start);
|
||||
$status_datum = new DateTime ($row->datum);
|
||||
|
||||
|
||||
if ($new_status_datum_form >= $status_datum && $new_status_semesterstart_form >= $studiensemester_start)
|
||||
{
|
||||
if (!$newStatusInserted)
|
||||
{
|
||||
// neuer Status erstmals größer als Datum eines bestehenden Status -> neuen Status EINMALIG einfügen für spätere Statusprüfung
|
||||
$neuer_status = new stdClass();
|
||||
$neuer_status->status_kurzbz = $status_kurzbz;
|
||||
$neuer_status->studiensemester_kurzbz = $new_status_studiensemester_kurzbz;
|
||||
$neuer_status->datum = $new_status_datum;
|
||||
$neuer_status->ausbildungssemester = $new_status_ausbildungssemester;
|
||||
$statusArr[] = $neuer_status;
|
||||
$newStatusInserted = true;
|
||||
}
|
||||
$statusArr[] = $row;
|
||||
}
|
||||
elseif($new_status_datum_form <= $status_datum && $new_status_semesterstart_form <= $studiensemester_start)
|
||||
{
|
||||
$statusArr[] = $row;
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
return error($this->p->t('lehre','error_statuseintrag'));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
$endstatusArr = array('Absolvent', 'Abbrecher');
|
||||
// Ü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 error($name . $this->p->t('lehre','error_endstatus'));
|
||||
}
|
||||
|
||||
// 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 error($name . $this->p->t('lehre','error_consecutiveUnterbrecher'));
|
||||
}
|
||||
|
||||
// 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 error($name . $this->p->t('lehre','error_consecutiveUnterbrecherAbbrecher'));
|
||||
}
|
||||
|
||||
// keine Studenten nach Diplomand Status
|
||||
if (
|
||||
isset($next_status) && $curr_status_kurzbz == 'Diplomand' && $next_status->status_kurzbz == 'Student'
|
||||
)
|
||||
{
|
||||
return error($name . $this->p->t('lehre','error_consecutiveDiplomandStudent'));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return $resultPs;
|
||||
}
|
||||
|
||||
public function getAllPrestudentstatiWithStudiensemester($prestudent_id, $old_status_studiensemester_kurzbz = '', $old_status_ausbildungssemester = '')
|
||||
{
|
||||
|
||||
//Todo(manu) check isNewStatus
|
||||
$isNewStatus = $old_status_studiensemester_kurzbz == '' && $old_status_ausbildungssemester == '';
|
||||
|
||||
$qry = "
|
||||
SELECT public.tbl_prestudentstatus.status_kurzbz,
|
||||
public.tbl_prestudentstatus.studiensemester_kurzbz,
|
||||
public.tbl_prestudentstatus.ausbildungssemester,
|
||||
public.tbl_prestudentstatus.datum,
|
||||
s.start AS studiensemester_start
|
||||
FROM public.tbl_prestudentstatus
|
||||
JOIN public.tbl_studiensemester s USING (studiensemester_kurzbz)
|
||||
WHERE prestudent_id = ?
|
||||
ORDER BY public.tbl_prestudentstatus.datum DESC,
|
||||
public.tbl_prestudentstatus.insertamum DESC,
|
||||
public.tbl_prestudentstatus.ext_id DESC
|
||||
SELECT
|
||||
tbl_prestudentstatus.status_kurzbz,
|
||||
tbl_prestudentstatus.studiensemester_kurzbz,
|
||||
tbl_prestudentstatus.ausbildungssemester,
|
||||
tbl_prestudentstatus.datum,
|
||||
s.start AS studiensemester_start,
|
||||
pl.orgform_kurzbz AS studienplan_orgform_kurzbz,
|
||||
stud.matrikelnr,
|
||||
pers.vorname,
|
||||
pers.nachname
|
||||
FROM
|
||||
public.tbl_prestudentstatus
|
||||
JOIN public.tbl_studiensemester s USING (studiensemester_kurzbz)
|
||||
JOIN public.tbl_prestudent USING (prestudent_id)
|
||||
JOIN public.tbl_person pers USING (person_id)
|
||||
LEFT JOIN public.tbl_student stud USING (prestudent_id)
|
||||
LEFT JOIN lehre.tbl_studienplan pl USING (studienplan_id)
|
||||
WHERE
|
||||
prestudent_id = ?
|
||||
ORDER BY
|
||||
public.tbl_prestudentstatus.datum DESC,
|
||||
public.tbl_prestudentstatus.insertamum DESC,
|
||||
public.tbl_prestudentstatus.ext_id DESC
|
||||
";
|
||||
|
||||
$result = $this->execQuery($qry, array($prestudent_id));
|
||||
|
||||
if (isError($result))
|
||||
{
|
||||
return error($result);
|
||||
}
|
||||
if (!hasData($result)) {
|
||||
return success("0", $this->p->t('lehre','error_noStatusFound'));
|
||||
}
|
||||
|
||||
return $result;
|
||||
|
||||
return $this->execQuery($qry, array($prestudent_id));
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -13,35 +13,35 @@ class Studiensemester_model extends DB_Model
|
||||
$this->hasSequence = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get actual Studiensemester.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getAkt()
|
||||
{
|
||||
return $this->loadWhere(array(
|
||||
'start <= ' => 'NOW()',
|
||||
'ende >= ' => 'NOW()'
|
||||
)
|
||||
);
|
||||
}
|
||||
/**
|
||||
* Get actual Studiensemester.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getAkt()
|
||||
{
|
||||
return $this->loadWhere(array(
|
||||
'start <= ' => 'NOW()',
|
||||
'ende >= ' => 'NOW()'
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
// Get next study semester
|
||||
public function getNext()
|
||||
{
|
||||
$query = '
|
||||
SELECT *
|
||||
FROM
|
||||
public.tbl_studiensemester
|
||||
WHERE
|
||||
start > now()
|
||||
ORDER BY start
|
||||
LIMIT 1;
|
||||
';
|
||||
{
|
||||
$query = '
|
||||
SELECT *
|
||||
FROM
|
||||
public.tbl_studiensemester
|
||||
WHERE
|
||||
start > now()
|
||||
ORDER BY start
|
||||
LIMIT 1;
|
||||
';
|
||||
|
||||
return $this->execQuery($query);
|
||||
}
|
||||
return $this->execQuery($query);
|
||||
}
|
||||
|
||||
/**
|
||||
* getLastOrAktSemester
|
||||
@@ -182,10 +182,10 @@ class Studiensemester_model extends DB_Model
|
||||
return success(array());
|
||||
|
||||
$query = "
|
||||
SELECT *
|
||||
FROM public.tbl_studiensemester
|
||||
WHERE ( ?::date < ende AND ?::date > start )
|
||||
ORDER BY start DESC";
|
||||
SELECT *
|
||||
FROM public.tbl_studiensemester
|
||||
WHERE ( ?::date < ende AND ?::date > start )
|
||||
ORDER BY start DESC";
|
||||
|
||||
return $this->execQuery($query, array($from, $to));
|
||||
}
|
||||
@@ -200,7 +200,7 @@ class Studiensemester_model extends DB_Model
|
||||
{
|
||||
$query = "SELECT studiensemester_kurzbz, start, ende FROM public.vw_studiensemester
|
||||
WHERE studiensemester_kurzbz <> ?
|
||||
ORDER BY delta, start LIMIT 1";
|
||||
ORDER BY delta, start LIMIT 1";
|
||||
|
||||
return $this->execQuery($query, array($studiensemester_kurzbz));
|
||||
}
|
||||
@@ -211,7 +211,7 @@ class Studiensemester_model extends DB_Model
|
||||
FROM public.tbl_studiensemester
|
||||
WHERE start >= NOW() OR (start <= NOW() AND ende >= NOW())
|
||||
ORDER BY start';
|
||||
|
||||
|
||||
return $this->execQuery($query);
|
||||
}
|
||||
|
||||
@@ -241,4 +241,16 @@ class Studiensemester_model extends DB_Model
|
||||
|
||||
$this->db->where_in($this->pk, '(' . $plus . ') UNION (' . $minus . ')', false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Holt letzen zwei Ziffern des Studienjahres von Studiensemester, 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') (int)$studienjahrNumber -= 1;
|
||||
return $studienjahrNumber;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24832,7 +24832,7 @@ array(
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
),
|
||||
// Personalverwaltung end
|
||||
array(
|
||||
'app' => 'core',
|
||||
@@ -27885,18 +27885,18 @@ array(
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'lehre',
|
||||
'phrase' => 'error_statuseintrag',
|
||||
'phrase' => 'error_statuseintrag_zeitabfolge',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'Datum des Statuseintrags muss nach dem Statusdatum, das Semesterstartdatum nach Semesterstartdatum des vorherigen Statuseintrags sein',
|
||||
'text' => 'Ungültige Zeitabfolge der Statuseinträge (Statusdatum oder Semester)',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => 'Error: Date of the status entry must be after the start date, the semester start date after the semester start date of the previous status entry',
|
||||
'text' => 'Error: Invalid date order of statuses (date or semester)',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
@@ -28202,6 +28202,66 @@ array(
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'lehre',
|
||||
'phrase' => 'error_wrongStatusOrderBeforeStudent',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'Vor dem Studentenstatus müssen folgende Status eingetragen werden: {0}',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => 'Error: Following status should be present before student status: {0}',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'lehre',
|
||||
'phrase' => 'error_personenkennzeichenPasstNichtZuStudiensemester',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'Personenkennzeichen passt nicht zu Studiensemester des ersten Studentstatus',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => 'Error: Personenkennzeichen does not fit with semester of first student status',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'lehre',
|
||||
'phrase' => 'error_bewerberOrgformUngleichStudentOrgform',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'Erster Studentstatus muss gleiche Organisationsform haben wie Bewerberstatus (Studienplan Orgform)',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => 'Error: first student status should have same organisational form as bewerber status (Studienplan)',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
)
|
||||
);
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user