diff --git a/application/libraries/PrestudentLib.php b/application/libraries/PrestudentLib.php index f84874cda..a5da7b161 100644 --- a/application/libraries/PrestudentLib.php +++ b/application/libraries/PrestudentLib.php @@ -687,10 +687,9 @@ class PrestudentLib $now = date('c'); $today = date('Y-m-d'); - // Genererate Personenkennzeichen + // Generate Personenkennzeichen $personenkennzeichen = $this->_ci->StudentModel->generatePersonenkennzeichen( $student_data->studiengang_kz, - $studiensemester_kurzbz, $today, $student_data->typ ); diff --git a/application/models/codex/Bismeldestichtag_model.php b/application/models/codex/Bismeldestichtag_model.php index f9b412e7a..e16b526f0 100644 --- a/application/models/codex/Bismeldestichtag_model.php +++ b/application/models/codex/Bismeldestichtag_model.php @@ -130,4 +130,27 @@ class Bismeldestichtag_model extends DB_Model return $this->execQuery($query, array($studiensemester_kurzbz)); } + + /** + * Gets first Bismeldestichtag after a certain date. + * @param $beginndatum + * @return object success or error + */ + public function getByDate($beginndatum) + { + $query = ' + SELECT + meldestichtag, studiensemester_kurzbz, studienjahr_kurzbz + FROM + bis.tbl_bismeldestichtag + JOIN public.tbl_studiensemester USING (studiensemester_kurzbz) + LEFT JOIN public.tbl_studienjahr USING (studienjahr_kurzbz) + WHERE + ?::date <= meldestichtag + ORDER BY + meldestichtag + LIMIT 1'; + + return $this->execQuery($query, array($beginndatum)); + } } diff --git a/application/models/crm/Student_model.php b/application/models/crm/Student_model.php index fcdf4c38a..6ad015782 100644 --- a/application/models/crm/Student_model.php +++ b/application/models/crm/Student_model.php @@ -75,6 +75,7 @@ class Student_model extends DB_Model return $matrikelnummer.sprintf("%03d", $max); } + /** * Generiert die Matrikelnummer * FORMAT: 0710254001 @@ -88,15 +89,35 @@ class Student_model extends DB_Model * TODO(chris): replace function above with this? * * @param integer $studiengang_kz - * @param string $studiensemester_kurzbz * @param string $beginndatum * @param string $typ * * @return stdClass */ - public function generatePersonenkennzeichen($studiengang_kz, $studiensemester_kurzbz, $beginndatum, $typ = null) + public function generatePersonenkennzeichen($studiengang_kz, $beginndatum, $typ = null) { $personenkennzeichen = false; + $studiensemester_kurzbz = null; + + // Validierung der Eingabewerte + if (!is_valid_date($beginndatum)) return error("Ungültiges Beginndatum."); + + // get studiensemester from datum + $meldestichtagRes = $this->BismeldestichtagModel->getByDate($beginndatum); + + if (isError($meldestichtagRes)) return $meldestichtagRes; + + if (hasData($meldestichtagRes)) + $studiensemester_kurzbz = getData($meldestichtagRes)[0]->studiensemester_kurzbz; + else + { + $studiensemesterRes = $this->StudiensemesterModel->getByDate($beginndatum); + if (isError($studiensemesterRes)) return $studiensemesterRes; + + if (!hasData($studiensemesterRes)) return error("Kein Studiensemester gefunden."); + + $studiensemester_kurzbz = getData($studiensemesterRes)[0]->studiensemester_kurzbz; + } Events::trigger( 'generate_personenkennzeichen', @@ -111,11 +132,6 @@ class Student_model extends DB_Model if ($personenkennzeichen !== false) return success($personenkennzeichen); - // Validierung der Eingabewerte - if (strlen($studiensemester_kurzbz) < 6) { - throw new InvalidArgumentException("Ungültiges studiensemester_kurzbz Format."); - } - $jahr = mb_substr($studiensemester_kurzbz, 4); $art = substr($studiensemester_kurzbz, 0, 2); @@ -153,21 +169,7 @@ class Student_model extends DB_Model } } - // get Bismeldestichtag for the semester - $meldestichtagRes = $this->BismeldestichtagModel->getByStudiensemester($studiensemester_kurzbz); - - if (isError($meldestichtagRes)) - return $meldestichtagRes; - - // if start of study is after Bismeldestichtag, Studienjahr of next semester is used, so 1 doesn't need to be subtracted for SS - $afterMeldeStichtag = false; - if (hasData($meldestichtagRes)) - { - $meldestichtag = getData($meldestichtagRes)[0]->meldestichtag; - $afterMeldeStichtag = isset($beginndatum) && new DateTime($beginndatum) > new DateTime($meldestichtag); - } - - if (($art=='2' || $art=='4') && !$afterMeldeStichtag) + if ($art=='2' || $art=='4') $jahr = $jahr-1; //FH-Burgenland - weil leider die AO Studiengänge aufgeteilt sind