From e78598900adb9fc1f2f558e05a0c67843921016e Mon Sep 17 00:00:00 2001 From: Alexei Karpenko Date: Wed, 19 Jun 2024 20:42:14 +0200 Subject: [PATCH] Studierendenverwaltung: added new prestudenstatus checks, created PrestudentstatusCheckLib --- .../api/frontend/v1/stv/Status.php | 36 ++- .../libraries/PrestudentstatusCheckLib.php | 301 ++++++++++++++++++ .../models/crm/Prestudentstatus_model.php | 216 ++----------- .../organisation/Studiensemester_model.php | 74 +++-- system/phrasesupdate.php | 68 +++- 5 files changed, 459 insertions(+), 236 deletions(-) create mode 100644 application/libraries/PrestudentstatusCheckLib.php diff --git a/application/controllers/api/frontend/v1/stv/Status.php b/application/controllers/api/frontend/v1/stv/Status.php index 1c627745e..710f4b648 100644 --- a/application/controllers/api/frontend/v1/stv/Status.php +++ b/application/controllers/api/frontend/v1/stv/Status.php @@ -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); diff --git a/application/libraries/PrestudentstatusCheckLib.php b/application/libraries/PrestudentstatusCheckLib.php new file mode 100644 index 000000000..4e1075736 --- /dev/null +++ b/application/libraries/PrestudentstatusCheckLib.php @@ -0,0 +1,301 @@ +_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; + } +} diff --git a/application/models/crm/Prestudentstatus_model.php b/application/models/crm/Prestudentstatus_model.php index 706cd82ba..73e2bdaee 100644 --- a/application/models/crm/Prestudentstatus_model.php +++ b/application/models/crm/Prestudentstatus_model.php @@ -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)); } - - } diff --git a/application/models/organisation/Studiensemester_model.php b/application/models/organisation/Studiensemester_model.php index caa385128..c59c9d343 100644 --- a/application/models/organisation/Studiensemester_model.php +++ b/application/models/organisation/Studiensemester_model.php @@ -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; + } } diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php index 4b7c2852b..bcb4e24a1 100644 --- a/system/phrasesupdate.php +++ b/system/phrasesupdate.php @@ -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' + ) + ) + ) );