From 5b4e632526be93c8aa86a5a4aeb21df3d903be0b Mon Sep 17 00:00:00 2001 From: Alexei Karpenko Date: Wed, 25 Mar 2026 11:44:36 +0100 Subject: [PATCH] issues, plausichecks: added producer for some core issues, producer lib: fehler with no config mappings are just ignored, plausicheck page optimizations (sorting etc) --- application/config/fehler.php | 70 +++++----- .../system/issues/Plausichecks.php | 44 +++--- .../issues/PlausicheckProducerLib.php | 12 +- .../FalscherIncomingZweckPlausi.php | 121 +++++++++++++++++ .../plausichecks/GeburtsnationFehlt.php | 108 +++++++++++++++ .../KeinAufenthaltszweckPlausi.php | 116 ++++++++++++++++ .../OutgoingAngerechneteEctsFehlenPlausi.php | 119 +++++++++++++++++ ...utgoingAufenthaltfoerderungfehltPlausi.php | 119 +++++++++++++++++ .../OutgoingErworbeneEctsFehlenPlausi.php | 119 +++++++++++++++++ .../UhstatPersonkennungFehltCore.php | 113 ++++++++++++++++ .../issues/plausichecks/ZgvDatumInZukunft.php | 126 ++++++++++++++++++ .../plausichecks/ZgvDatumVorGeburtsdatum.php | 109 +++++++++++++++ .../plausichecks/ZgvMasterDatumInZukunft.php | 109 +++++++++++++++ .../ZgvMasterDatumVorGeburtsdatum.php | 109 +++++++++++++++ .../ZgvMasterDatumVorZgvdatum.php | 109 +++++++++++++++ .../ZuVieleZweckeIncomingPlausi.php | 121 +++++++++++++++++ .../issues/resolvers/CORE_INOUT_0005.php | 2 +- system/dbupdate_3.4.php | 1 + 18 files changed, 1568 insertions(+), 59 deletions(-) create mode 100644 application/libraries/issues/plausichecks/FalscherIncomingZweckPlausi.php create mode 100644 application/libraries/issues/plausichecks/GeburtsnationFehlt.php create mode 100644 application/libraries/issues/plausichecks/KeinAufenthaltszweckPlausi.php create mode 100644 application/libraries/issues/plausichecks/OutgoingAngerechneteEctsFehlenPlausi.php create mode 100644 application/libraries/issues/plausichecks/OutgoingAufenthaltfoerderungfehltPlausi.php create mode 100644 application/libraries/issues/plausichecks/OutgoingErworbeneEctsFehlenPlausi.php create mode 100644 application/libraries/issues/plausichecks/UhstatPersonkennungFehltCore.php create mode 100644 application/libraries/issues/plausichecks/ZgvDatumInZukunft.php create mode 100644 application/libraries/issues/plausichecks/ZgvDatumVorGeburtsdatum.php create mode 100644 application/libraries/issues/plausichecks/ZgvMasterDatumInZukunft.php create mode 100644 application/libraries/issues/plausichecks/ZgvMasterDatumVorGeburtsdatum.php create mode 100644 application/libraries/issues/plausichecks/ZgvMasterDatumVorZgvdatum.php create mode 100644 application/libraries/issues/plausichecks/ZuVieleZweckeIncomingPlausi.php diff --git a/application/config/fehler.php b/application/config/fehler.php index 7c006c970..32b1e82e7 100644 --- a/application/config/fehler.php +++ b/application/config/fehler.php @@ -10,7 +10,7 @@ $config['fehler'] = array( 'fehlertext' => 'ZGV Datum in Zukunft', 'fehlertyp_kurzbz' => 'error', 'app' => array('core'), - 'producerLibName' => null, + 'producerLibName' => 'ZgvDatumInZukunft', 'resolverLibName' => 'CORE_ZGV_0001', 'producerIsResolver' => false ), @@ -21,7 +21,7 @@ $config['fehler'] = array( 'fehlertext' => 'ZGV Datum vor Geburtsdatum', 'fehlertyp_kurzbz' => 'error', 'app' => 'core', - 'producerLibName' => null, + 'producerLibName' => 'ZgvDatumVorGeburtsdatum', 'resolverLibName' => 'CORE_ZGV_0002', 'producerIsResolver' => false ), @@ -32,7 +32,7 @@ $config['fehler'] = array( 'fehlertext' => 'ZGV Masterdatum in Zukunft', 'fehlertyp_kurzbz' => 'error', 'app' => 'core', - 'producerLibName' => null, + 'producerLibName' => 'ZgvMasterDatumInZukunft', 'resolverLibName' => 'CORE_ZGV_0003', 'producerIsResolver' => false ), @@ -43,7 +43,7 @@ $config['fehler'] = array( 'fehlertext' => 'ZGV Masterdatum vor Zgvdatum', 'fehlertyp_kurzbz' => 'error', 'app' => 'core', - 'producerLibName' => null, + 'producerLibName' => 'ZgvMasterDatumVorZgvdatum', 'resolverLibName' => 'CORE_ZGV_0004', 'producerIsResolver' => false ), @@ -54,7 +54,7 @@ $config['fehler'] = array( 'fehlertext' => 'ZGV Masterdatum vor Geburtsdatum', 'fehlertyp_kurzbz' => 'error', 'app' => 'core', - 'producerLibName' => null, + 'producerLibName' => 'ZgvMasterDatumVorGeburtsdatum', 'resolverLibName' => 'CORE_ZGV_0005', 'producerIsResolver' => false ), @@ -65,7 +65,7 @@ $config['fehler'] = array( 'fehlertext' => 'Kein Aufenthaltszweck gefunden', 'fehlertyp_kurzbz' => 'error', 'app' => 'core', - 'producerLibName' => null, + 'producerLibName' => 'KeinAufenthaltszweckPlausi', 'resolverLibName' => 'CORE_INOUT_0001', 'producerIsResolver' => false ), @@ -76,7 +76,7 @@ $config['fehler'] = array( 'fehlertext' => 'Es sind %s Aufenthaltszwecke eingetragen (max. 1 Zweck für Incomings)', 'fehlertyp_kurzbz' => 'error', 'app' => 'core', - 'producerLibName' => null, + 'producerLibName' => 'ZuVieleZweckeIncomingPlausi', 'resolverLibName' => 'CORE_INOUT_0002', 'producerIsResolver' => false ), @@ -87,7 +87,7 @@ $config['fehler'] = array( 'fehlertext' => 'Aufenthaltszweckcode ist %s (für Incomings ist nur Zweck 1, 2, 3 erlaubt)', 'fehlertyp_kurzbz' => 'error', 'app' => 'core', - 'producerLibName' => null, + 'producerLibName' => 'FalscherIncomingZweckPlausi', 'resolverLibName' => 'CORE_INOUT_0003', 'producerIsResolver' => false ), @@ -98,7 +98,7 @@ $config['fehler'] = array( 'fehlertext' => 'Keine Aufenthaltsfoerderung angegeben (bei Outgoings >= 29 Tage Monat im Ausland muss mind. 1 gemeldet werden)', 'fehlertyp_kurzbz' => 'error', 'app' => 'core', - 'producerLibName' => null, + 'producerLibName' => 'OutgoingAufenthaltfoerderungfehltPlausi', 'resolverLibName' => 'CORE_INOUT_0004', 'producerIsResolver' => false ), @@ -109,7 +109,7 @@ $config['fehler'] = array( 'fehlertext' => 'Angerechnete ECTS fehlen (Meldepflicht bei Outgoings >= 29 Tage Monat im Ausland)', 'fehlertyp_kurzbz' => 'error', 'app' => 'core', - 'producerLibName' => null, + 'producerLibName' => 'OutgoingAngerechneteEctsFehlenPlausi', 'resolverLibName' => 'CORE_INOUT_0005', 'producerIsResolver' => false ), @@ -120,7 +120,7 @@ $config['fehler'] = array( 'fehlertext' => 'Erworbene ECTS fehlen (Meldepflicht bei Outgoings >= 29 Tage Monat im Ausland)', 'fehlertyp_kurzbz' => 'error', 'app' => 'core', - 'producerLibName' => null, + 'producerLibName' => 'OutgoingErworbeneEctsFehlenPlausi', 'resolverLibName' => 'CORE_INOUT_0006', 'producerIsResolver' => false ), @@ -280,17 +280,17 @@ $config['fehler'] = array( 'resolverLibName' => 'CORE_STUDENTSTATUS_0007', 'producerIsResolver' => false ), - array( - 'fehlercode' => 'CORE_STUDENTSTATUS_0008', - 'fehler_kurzbz' => 'StudienplanUngueltig', - 'fehlercode_extern' => null, - 'fehlertext' => 'Studienplan %s ist im Ausbildungssemester %s nicht gültig (prestudent_id %s)', - 'fehlertyp_kurzbz' => 'error', - 'app' => 'core', - 'producerLibName' => 'StudienplanUngueltig', - 'resolverLibName' => 'CORE_STUDENTSTATUS_0008', - 'producerIsResolver' => false - ), + //~ array( + //~ 'fehlercode' => 'CORE_STUDENTSTATUS_0008', + //~ 'fehler_kurzbz' => 'StudienplanUngueltig', + //~ 'fehlercode_extern' => null, + //~ 'fehlertext' => 'Studienplan %s ist im Ausbildungssemester %s nicht gültig (prestudent_id %s)', + //~ 'fehlertyp_kurzbz' => 'error', + //~ 'app' => 'core', + //~ 'producerLibName' => 'StudienplanUngueltig', + //~ 'resolverLibName' => 'CORE_STUDENTSTATUS_0008', + //~ 'producerIsResolver' => false + //~ ), array( 'fehlercode' => 'CORE_STUDENTSTATUS_0009', 'fehler_kurzbz' => 'FalscheAnzahlAbschlusspruefungen', @@ -324,17 +324,17 @@ $config['fehler'] = array( 'resolverLibName' => 'CORE_STUDENTSTATUS_0011', 'producerIsResolver' => false ), - array( - 'fehlercode' => 'CORE_STUDENTSTATUS_0012', - 'fehler_kurzbz' => 'BewerberNichtZumRtAngetreten', - 'fehlercode_extern' => null, - 'fehlertext' => 'Bewerber nicht zum Reihungstest angetreten (prestudent_id %s)', - 'fehlertyp_kurzbz' => 'warning', - 'app' => 'core', - 'producerLibName' => 'BewerberNichtZumRtAngetreten', - 'resolverLibName' => 'CORE_STUDENTSTATUS_0012', - 'producerIsResolver' => false - ), + //~ array( + //~ 'fehlercode' => 'CORE_STUDENTSTATUS_0012', + //~ 'fehler_kurzbz' => 'BewerberNichtZumRtAngetreten', + //~ 'fehlercode_extern' => null, + //~ 'fehlertext' => 'Bewerber nicht zum Reihungstest angetreten (prestudent_id %s)', + //~ 'fehlertyp_kurzbz' => 'warning', + //~ 'app' => 'core', + //~ 'producerLibName' => 'BewerberNichtZumRtAngetreten', + //~ 'resolverLibName' => 'CORE_STUDENTSTATUS_0012', + //~ 'producerIsResolver' => false + //~ ), array( 'fehlercode' => 'CORE_STUDENTSTATUS_0013', 'fehler_kurzbz' => 'AktSemesterNull', @@ -430,7 +430,7 @@ $config['fehler'] = array( 'fehlertext' => 'Geburtsnation nicht vorhanden', 'fehlertyp_kurzbz' => 'error', 'app' => 'core', - 'producerLibName' => null, + 'producerLibName' => 'GeburtsnationFehlt', 'resolverLibName' => 'CORE_PERSON_0005', 'producerIsResolver' => false ), @@ -441,7 +441,7 @@ $config['fehler'] = array( 'fehlertext' => 'Personkennung fehlt (vBpk AS, vBpk BF oder Ersatzkennzeichen fehlt)', 'fehlertyp_kurzbz' => 'error', 'app' => 'core', - 'producerLibName' => null, + 'producerLibName' => 'UhstatPersonkennungFehltCore', 'resolverLibName' => 'CORE_PERSON_0006', 'producerIsResolver' => false ) diff --git a/application/controllers/system/issues/Plausichecks.php b/application/controllers/system/issues/Plausichecks.php index eb0d01e9e..69b9afc15 100644 --- a/application/controllers/system/issues/Plausichecks.php +++ b/application/controllers/system/issues/Plausichecks.php @@ -5,6 +5,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); class Plausichecks extends Auth_Controller { const GENERIC_ISSUE_OCCURED_TEXT = 'Issue aufgetreten'; + const APPS = ['core']; public function __construct() { @@ -16,7 +17,7 @@ class Plausichecks extends Auth_Controller ); // Load libraries - $this->load->library('issues/PlausicheckProducerLib', array('apps' => 'core')); + $this->load->library('issues/PlausicheckProducerLib', array('apps' => self::APPS)); $this->load->library('issues/PlausicheckDefinitionLib'); $this->load->library('WidgetLib'); @@ -47,33 +48,30 @@ class Plausichecks extends Auth_Controller // issues array for passing issue texts $allIssues = array(); - // all fehler kurzbz which are going to be checked - $fehlerKurzbz = !isEmptyString($fehler_kurzbz) ? array($fehler_kurzbz) : $this->plausicheckdefinitionlib->getFehlerKurzbz(); + $fehler_kurzbz_arr = isEmptyString($fehler_kurzbz) ? array_keys($this->plausicheckproducerlib->getFehlerMappings()) : [$fehler_kurzbz]; + + $this->FehlerModel->addOrder('fehler_kurzbz, fehlercode'); + $this->FehlerModel->db->where_in('fehler_kurzbz', $fehler_kurzbz_arr); + $fehlerRes = $this->FehlerModel->load(); + + if (isError($fehlerRes)) $this->terminateWithJsonError(getError($fehlerRes)); + if (!hasData($fehlerRes)) return $this->outputJsonSuccess([]); + + // all fehler which are going to be checked + $fehlerArr = getData($fehlerRes); // set Studiengang to null if not passed if (isEmptyString($studiengang_kz)) $studiengang_kz = null; // get the data returned by Plausicheck - foreach ($fehlerKurzbz as $fehler_kurzbz) + foreach ($fehlerArr as $fehler) { - // get Text and fehlercode of the Fehler - $this->FehlerModel->addSelect('fehlercode, fehlertext, fehlertyp_kurzbz'); - $fehlerRes = $this->FehlerModel->loadWhere(array('fehler_kurzbz' => $fehler_kurzbz)); - - if (isError($fehlerRes)) $this->terminateWithJsonError(getError($fehlerRes)); - - // do not check error if no data - if (!hasData($fehlerRes)) continue; - - // get the error data - $fehler = getData($fehlerRes)[0]; - // initialize issue array - $allIssues[$fehler_kurzbz] = array('fehlercode' => $fehler->fehlercode, 'data' => array()); + $allIssues[$fehler->fehler_kurzbz] = array('fehlercode' => $fehler->fehlercode, 'data' => array()); // execute the check $plausicheckRes = $this->plausicheckproducerlib->producePlausicheckIssue( - $fehler_kurzbz, + $fehler->fehler_kurzbz, array( 'studiensemester_kurzbz' => $studiensemester_kurzbz, 'studiengang_kz' => $studiengang_kz @@ -104,7 +102,7 @@ class Plausichecks extends Auth_Controller { // replace placeholder with params, if present if (count($fehlertext_params) != substr_count($fehlerText, '%s')) - $this->terminateWithJsonError('Wrong number of parameters for Fehlertext, fehler_kurzbz ' . $fehler_kurzbz); + $this->terminateWithJsonError('Wrong number of parameters for Fehlertext, fehler_kurzbz ' . $fehler->fehler_kurzbz); $fehlerText = vsprintf($fehlerText, $fehlertext_params); } @@ -115,7 +113,7 @@ class Plausichecks extends Auth_Controller $issueObj = new StdClass(); $issueObj->fehlertext = $fehlerText; $issueObj->type = $fehlerTyp; - $allIssues[$fehler_kurzbz]['data'][] = $issueObj; + $allIssues[$fehler->fehler_kurzbz]['data'][] = $issueObj; } else // if no issue text found, use generic text { @@ -154,7 +152,7 @@ class Plausichecks extends Auth_Controller if (isError($studiengaengeRes)) show_error(getError($studiengaengeRes)); - $fehlerKurzbz = $this->plausicheckdefinitionlib->getFehlerKurzbz(); + $fehlerKurzbz = array_keys($this->plausicheckproducerlib->getFehlerMappings()); $db = new DB_Model(); @@ -165,7 +163,9 @@ class Plausichecks extends Auth_Controller FROM system.tbl_fehler WHERE - fehler_kurzbz IN ?', + fehler_kurzbz IN ? + ORDER BY + fehler_kurzbz, fehlercode', array($fehlerKurzbz) ); diff --git a/application/libraries/issues/PlausicheckProducerLib.php b/application/libraries/issues/PlausicheckProducerLib.php index bcab8ac56..02cdaa582 100644 --- a/application/libraries/issues/PlausicheckProducerLib.php +++ b/application/libraries/issues/PlausicheckProducerLib.php @@ -193,7 +193,8 @@ class PlausicheckProducerLib */ public function producePlausicheckIssue($fehler_kurzbz, $params) { - if (!isset($this->_fehlerLibMappings[$fehler_kurzbz])) return error("Mapping for Fehler " . $fehler_kurzbz . " was not found"); + //if (!isset($this->_fehlerLibMappings[$fehler_kurzbz])) return error("Mapping for Fehler " . $fehler_kurzbz . " was not found"); + if (!isset($this->_fehlerLibMappings[$fehler_kurzbz])) return success(null); $mapping = $this->_fehlerLibMappings[$fehler_kurzbz]; @@ -233,4 +234,13 @@ class PlausicheckProducerLib // call the function for checking for issue production return $this->_ci->{$lowercaseLibName}->{self::EXECUTE_PLAUSI_CHECK_METHOD_NAME}($params); } + + /** + * Get fehler kurzbz -> library mappings. + * @return array with fehler kurzbz as key and fehlerinfo as values + */ + public function getFehlerMappings() + { + return $this->_fehlerLibMappings; + } } diff --git a/application/libraries/issues/plausichecks/FalscherIncomingZweckPlausi.php b/application/libraries/issues/plausichecks/FalscherIncomingZweckPlausi.php new file mode 100644 index 000000000..91b888c7f --- /dev/null +++ b/application/libraries/issues/plausichecks/FalscherIncomingZweckPlausi.php @@ -0,0 +1,121 @@ +_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null; + + // pass parameters needed for plausicheck + $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; + $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; + $bisio_id = isset($params['bisio_id']) ? $params['bisio_id'] : null; + + // get all students failing the plausicheck + $prestudentRes = $this->_getFalscherIncomingZweck( + $studiensemester_kurzbz, + $studiengang_kz, + $bisio_id, + $exkludierte_studiengang_kz + ); + + if (isError($prestudentRes)) return $prestudentRes; + + if (hasData($prestudentRes)) + { + $prestudents = getData($prestudentRes); + + // populate results with data necessary for writing issues + foreach ($prestudents as $prestudent) + { + $results[] = array( + 'person_id' => $prestudent->person_id, + 'oe_kurzbz' => $prestudent->prestudent_stg_oe_kurzbz, + //'fehlertext_params' => array('bisio_id' => $prestudent->bisio_id), + 'resolution_params' => array('bisio_id' => $prestudent->bisio_id) + ); + } + } + + // return the results + return success($results); + } + + /** + * Prestudent should have a final status. + * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param bisio_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + private function _getFalscherIncomingZweck( + $studiensemester_kurzbz = null, + $studiengang_kz = null, + $bisio_id = null, + $exkludierte_studiengang_kz = null + ) { + + $params = array(); + $studiensemester_clause = ''; + + if (isset($studiensemester_kurzbz)) + { + $studiensemester_clause = "AND status.studiensemester_kurzbz = ?"; + $params[] = $studiensemester_kurzbz; + } + + $qry = " + SELECT * FROM ( + SELECT + DISTINCT ON (bisio_id) prestudent_id, person_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, zw.zweck_code, stg.studiengang_kz, + bisio.bisio_id, COUNT(zw.zweck_code) OVER (PARTITION BY bisio_id) AS anzahl + FROM + public.tbl_prestudent pre + JOIN public.tbl_student stud USING (prestudent_id) + JOIN public.tbl_person USING(person_id) + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_studiensemester sem ON status.studiensemester_kurzbz = sem.studiensemester_kurzbz + JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz + JOIN bis.tbl_bisio bisio ON stud.student_uid = bisio.student_uid + JOIN bis.tbl_bisio_zweck zw USING (bisio_id) + WHERE + stg.melderelevant + AND pre.bismelden + AND status.status_kurzbz = 'Incoming' + AND bisio.von::date < sem.ende AND bisio.bis::date > sem.start + {$studiensemester_clause} + ) zwecke + WHERE anzahl = 1 AND zweck_code NOT IN ('1', '2', '3')"; + + if (isset($studiengang_kz)) + { + $qry .= " AND zwecke.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($bisio_id)) + { + $qry .= " AND zwecke.bisio_id = ?"; + $params[] = $bisio_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND zwecke.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } +} diff --git a/application/libraries/issues/plausichecks/GeburtsnationFehlt.php b/application/libraries/issues/plausichecks/GeburtsnationFehlt.php new file mode 100644 index 000000000..7249ee416 --- /dev/null +++ b/application/libraries/issues/plausichecks/GeburtsnationFehlt.php @@ -0,0 +1,108 @@ +_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null; + + // pass parameters needed for plausicheck + $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; + $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; + $person_id = isset($params['person_id']) ? $params['person_id'] : null; + + // get all students failing the plausicheck + $personRes = $this->_getGeburtsnationFehlt( + $studiensemester_kurzbz, + $studiengang_kz, + $person_id, + $exkludierte_studiengang_kz + ); + + if (isError($personRes)) return $personRes; + + if (hasData($personRes)) + { + $persons = getData($personRes); + + // populate results with data necessary for writing issues + foreach ($persons as $person) + { + $results[] = array( + 'person_id' => $person->person_id, + 'fehlertext_params' => array(), + 'resolution_params' => array() + ); + } + } + + // return the results + return success($results); + } + + /** + * Prestudent should have a final status. + * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param prestudent_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + private function _getGeburtsnationFehlt( + $studiensemester_kurzbz = null, + $studiengang_kz = null, + $prestudent_id = null, + $exkludierte_studiengang_kz = null + ) { + $params = array(); + + $qry = " + SELECT + DISTINCT person_id + FROM + public.tbl_prestudent pre + JOIN public.tbl_person USING(person_id) + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz + WHERE + (geburtsnation IS NULL OR geburtsnation = '') + AND stg.melderelevant + AND pre.bismelden"; + + if (isset($studiensemester_kurzbz)) + { + $qry .= " AND status.studiensemester_kurzbz = ?"; + $params[] = $studiensemester_kurzbz; + } + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND pre.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } +} diff --git a/application/libraries/issues/plausichecks/KeinAufenthaltszweckPlausi.php b/application/libraries/issues/plausichecks/KeinAufenthaltszweckPlausi.php new file mode 100644 index 000000000..de1d94664 --- /dev/null +++ b/application/libraries/issues/plausichecks/KeinAufenthaltszweckPlausi.php @@ -0,0 +1,116 @@ +_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null; + + // pass parameters needed for plausicheck + $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; + $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; + $bisio_id = isset($params['bisio_id']) ? $params['bisio_id'] : null; + + // get all students failing the plausicheck + $prestudentRes = $this->_getKeinAufenthaltszweck( + $studiensemester_kurzbz, + $studiengang_kz, + $bisio_id, + $exkludierte_studiengang_kz + ); + + if (isError($prestudentRes)) return $prestudentRes; + + if (hasData($prestudentRes)) + { + $prestudents = getData($prestudentRes); + + // populate results with data necessary for writing issues + foreach ($prestudents as $prestudent) + { + $results[] = array( + 'person_id' => $prestudent->person_id, + 'oe_kurzbz' => $prestudent->prestudent_stg_oe_kurzbz, + //'fehlertext_params' => array('bisio_id' => $prestudent->bisio_id), + 'resolution_params' => array('bisio_id' => $prestudent->bisio_id) + ); + } + } + + // return the results + return success($results); + } + + /** + * Prestudent should have a final status. + * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param bisio_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + private function _getKeinAufenthaltszweck( + $studiensemester_kurzbz = null, + $studiengang_kz = null, + $bisio_id = null, + $exkludierte_studiengang_kz = null + ) { + + $params = array(); + + $qry = " + SELECT + DISTINCT ON (bisio_id) prestudent_id, person_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, + zw.zweck_code, stg.studiengang_kz, bisio.bisio_id + FROM + public.tbl_prestudent pre + JOIN public.tbl_student stud USING (prestudent_id) + JOIN public.tbl_person USING(person_id) + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_studiensemester sem ON status.studiensemester_kurzbz = sem.studiensemester_kurzbz + JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz + JOIN bis.tbl_bisio bisio ON stud.student_uid = bisio.student_uid + LEFT JOIN bis.tbl_bisio_zweck zw USING (bisio_id) + WHERE + (zw.zweck_code IS NULL OR zw.zweck_code = '') + AND bisio.von::date < sem.ende AND bisio.bis::date > sem.start + AND stg.melderelevant + AND pre.bismelden"; + + if (isset($studiensemester_kurzbz)) + { + $qry .= " AND status.studiensemester_kurzbz = ?"; + $params[] = $studiensemester_kurzbz; + } + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($bisio_id)) + { + $qry .= " AND bisio.bisio_id = ?"; + $params[] = $bisio_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } +} diff --git a/application/libraries/issues/plausichecks/OutgoingAngerechneteEctsFehlenPlausi.php b/application/libraries/issues/plausichecks/OutgoingAngerechneteEctsFehlenPlausi.php new file mode 100644 index 000000000..458e33ba2 --- /dev/null +++ b/application/libraries/issues/plausichecks/OutgoingAngerechneteEctsFehlenPlausi.php @@ -0,0 +1,119 @@ +_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null; + + // pass parameters needed for plausicheck + $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; + $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; + $bisio_id = isset($params['bisio_id']) ? $params['bisio_id'] : null; + + // get all students failing the plausicheck + $prestudentRes = $this->_getAngerechneteEctsFehlen( + $studiensemester_kurzbz, + $studiengang_kz, + $bisio_id, + $exkludierte_studiengang_kz + ); + + if (isError($prestudentRes)) return $prestudentRes; + + if (hasData($prestudentRes)) + { + $prestudents = getData($prestudentRes); + + // populate results with data necessary for writing issues + foreach ($prestudents as $prestudent) + { + $results[] = array( + 'person_id' => $prestudent->person_id, + 'oe_kurzbz' => $prestudent->prestudent_stg_oe_kurzbz, + //'fehlertext_params' => array('bisio_id' => $prestudent->bisio_id), + 'resolution_params' => array('bisio_id' => $prestudent->bisio_id) + ); + } + } + + // return the results + return success($results); + } + + /** + * Prestudent should have a final status. + * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param bisio_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + private function _getAngerechneteEctsFehlen( + $studiensemester_kurzbz = null, + $studiengang_kz = null, + $bisio_id = null, + $exkludierte_studiengang_kz = null + ) { + + $params = array(); + + $qry = " + SELECT + DISTINCT ON (bisio_id) prestudent_id, person_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, + stg.studiengang_kz, bisio.bisio_id + FROM + public.tbl_prestudent pre + JOIN public.tbl_student stud USING (prestudent_id) + JOIN public.tbl_person USING(person_id) + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_studiensemester sem ON status.studiensemester_kurzbz = sem.studiensemester_kurzbz + JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz + JOIN bis.tbl_bisio bisio ON stud.student_uid = bisio.student_uid + WHERE + bisio.bis IS NOT NULL + AND bisio.bis::date <= NOW() + AND bisio.bis::date - bisio.von::date >= 29 + AND bisio.ects_angerechnet IS NULL + AND NOT EXISTS (SELECT 1 FROM public.tbl_prestudentstatus WHERE status_kurzbz = 'Incoming' AND prestudent_id = pre.prestudent_id) + AND bisio.von::date < sem.ende AND bisio.bis::date > sem.start + AND stg.melderelevant + AND pre.bismelden"; + + if (isset($studiensemester_kurzbz)) + { + $qry .= " AND status.studiensemester_kurzbz = ?"; + $params[] = $studiensemester_kurzbz; + } + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($bisio_id)) + { + $qry .= " AND bisio.bisio_id = ?"; + $params[] = $bisio_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } +} diff --git a/application/libraries/issues/plausichecks/OutgoingAufenthaltfoerderungfehltPlausi.php b/application/libraries/issues/plausichecks/OutgoingAufenthaltfoerderungfehltPlausi.php new file mode 100644 index 000000000..dcffd7e05 --- /dev/null +++ b/application/libraries/issues/plausichecks/OutgoingAufenthaltfoerderungfehltPlausi.php @@ -0,0 +1,119 @@ +_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null; + + // pass parameters needed for plausicheck + $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; + $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; + $bisio_id = isset($params['bisio_id']) ? $params['bisio_id'] : null; + + // get all students failing the plausicheck + $prestudentRes = $this->_getAufenthaltsfoerderungFehlt( + $studiensemester_kurzbz, + $studiengang_kz, + $bisio_id, + $exkludierte_studiengang_kz + ); + + if (isError($prestudentRes)) return $prestudentRes; + + if (hasData($prestudentRes)) + { + $prestudents = getData($prestudentRes); + + // populate results with data necessary for writing issues + foreach ($prestudents as $prestudent) + { + $results[] = array( + 'person_id' => $prestudent->person_id, + 'oe_kurzbz' => $prestudent->prestudent_stg_oe_kurzbz, + //'fehlertext_params' => array('bisio_id' => $prestudent->bisio_id), + 'resolution_params' => array('bisio_id' => $prestudent->bisio_id) + ); + } + } + + // return the results + return success($results); + } + + /** + * Prestudent should have a final status. + * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param bisio_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + private function _getAufenthaltsfoerderungFehlt( + $studiensemester_kurzbz = null, + $studiengang_kz = null, + $bisio_id = null, + $exkludierte_studiengang_kz = null + ) { + + $params = array(); + + $qry = " + SELECT + DISTINCT ON (bisio_id) prestudent_id, person_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, + stg.studiengang_kz, bisio.bisio_id + FROM + public.tbl_prestudent pre + JOIN public.tbl_student stud USING (prestudent_id) + JOIN public.tbl_person USING(person_id) + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_studiensemester sem ON status.studiensemester_kurzbz = sem.studiensemester_kurzbz + JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz + JOIN bis.tbl_bisio bisio ON stud.student_uid = bisio.student_uid + LEFT JOIN bis.tbl_bisio_aufenthaltfoerderung foerd USING (bisio_id) + WHERE + bisio.bis IS NOT NULL + AND bisio.bis::date - bisio.von::date >= 29 + AND foerd.aufenthaltfoerderung_code IS NULL + AND NOT EXISTS (SELECT 1 FROM public.tbl_prestudentstatus WHERE status_kurzbz = 'Incoming' AND prestudent_id = pre.prestudent_id) + AND bisio.von::date < sem.ende AND bisio.bis::date > sem.start + AND stg.melderelevant + AND pre.bismelden"; + + if (isset($studiensemester_kurzbz)) + { + $qry .= " AND status.studiensemester_kurzbz = ?"; + $params[] = $studiensemester_kurzbz; + } + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($bisio_id)) + { + $qry .= " AND bisio.bisio_id = ?"; + $params[] = $bisio_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } +} diff --git a/application/libraries/issues/plausichecks/OutgoingErworbeneEctsFehlenPlausi.php b/application/libraries/issues/plausichecks/OutgoingErworbeneEctsFehlenPlausi.php new file mode 100644 index 000000000..9471b3b40 --- /dev/null +++ b/application/libraries/issues/plausichecks/OutgoingErworbeneEctsFehlenPlausi.php @@ -0,0 +1,119 @@ +_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null; + + // pass parameters needed for plausicheck + $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; + $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; + $bisio_id = isset($params['bisio_id']) ? $params['bisio_id'] : null; + + // get all students failing the plausicheck + $prestudentRes = $this->_getAngerechneteEctsFehlen( + $studiensemester_kurzbz, + $studiengang_kz, + $bisio_id, + $exkludierte_studiengang_kz + ); + + if (isError($prestudentRes)) return $prestudentRes; + + if (hasData($prestudentRes)) + { + $prestudents = getData($prestudentRes); + + // populate results with data necessary for writing issues + foreach ($prestudents as $prestudent) + { + $results[] = array( + 'person_id' => $prestudent->person_id, + 'oe_kurzbz' => $prestudent->prestudent_stg_oe_kurzbz, + //'fehlertext_params' => array('bisio_id' => $prestudent->bisio_id), + 'resolution_params' => array('bisio_id' => $prestudent->bisio_id) + ); + } + } + + // return the results + return success($results); + } + + /** + * Prestudent should have a final status. + * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param bisio_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + private function _getAngerechneteEctsFehlen( + $studiensemester_kurzbz = null, + $studiengang_kz = null, + $bisio_id = null, + $exkludierte_studiengang_kz = null + ) { + + $params = array(); + + $qry = " + SELECT + DISTINCT ON (bisio_id) prestudent_id, person_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, + stg.studiengang_kz, bisio.bisio_id + FROM + public.tbl_prestudent pre + JOIN public.tbl_student stud USING (prestudent_id) + JOIN public.tbl_person USING(person_id) + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_studiensemester sem ON status.studiensemester_kurzbz = sem.studiensemester_kurzbz + JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz + JOIN bis.tbl_bisio bisio ON stud.student_uid = bisio.student_uid + WHERE + bisio.bis IS NOT NULL + AND bisio.bis::date <= NOW() + AND bisio.bis::date - bisio.von::date >= 29 + AND bisio.ects_erworben IS NULL + AND NOT EXISTS (SELECT 1 FROM public.tbl_prestudentstatus WHERE status_kurzbz = 'Incoming' AND prestudent_id = pre.prestudent_id) + AND bisio.von::date < sem.ende AND bisio.bis::date > sem.start + AND stg.melderelevant + AND pre.bismelden"; + + if (isset($studiensemester_kurzbz)) + { + $qry .= " AND status.studiensemester_kurzbz = ?"; + $params[] = $studiensemester_kurzbz; + } + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($bisio_id)) + { + $qry .= " AND bisio.bisio_id = ?"; + $params[] = $bisio_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } +} diff --git a/application/libraries/issues/plausichecks/UhstatPersonkennungFehltCore.php b/application/libraries/issues/plausichecks/UhstatPersonkennungFehltCore.php new file mode 100644 index 000000000..68c5bb5f8 --- /dev/null +++ b/application/libraries/issues/plausichecks/UhstatPersonkennungFehltCore.php @@ -0,0 +1,113 @@ +_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null; + + // pass parameters needed for plausicheck + $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; + $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; + $person_id = isset($params['person_id']) ? $params['person_id'] : null; + + // get all students failing the plausicheck + $prestudentRes = $this->_getUhstatPersonkennungFehlt( + $studiensemester_kurzbz, + $studiengang_kz, + $person_id, + $exkludierte_studiengang_kz + ); + + if (isError($prestudentRes)) return $prestudentRes; + + if (hasData($prestudentRes)) + { + $prestudents = getData($prestudentRes); + + // populate results with data necessary for writing issues + foreach ($prestudents as $prestudent) + { + $results[] = array( + 'person_id' => $prestudent->person_id, + 'oe_kurzbz' => $prestudent->prestudent_stg_oe_kurzbz + //'fehlertext_params' => array('person_id' => $prestudent->person_id), + //'resolution_params' => array('person_id' => $prestudent->person_id) + ); + } + } + + // return the results + return success($results); + } + + /** + * Prestudent should have a final status. + * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param prestudent_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + private function _getUhstatPersonkennungFehlt( + $studiensemester_kurzbz = null, + $studiengang_kz = null, + $person_id = null, + $exkludierte_studiengang_kz = null + ) { + $params = array(); + + $qry = " + SELECT + DISTINCT ON (person_id) prestudent_id, person_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz + FROM + public.tbl_prestudent pre + JOIN public.tbl_person pers USING(person_id) + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz + WHERE + stg.melderelevant + AND pre.bismelden + AND EXISTS (SELECT 1 FROM bis.tbl_uhstat1daten WHERE person_id = pers.person_id) + AND (SELECT COUNT (DISTINCT kennzeichentyp_kurzbz) FROM public.tbl_kennzeichen WHERE person_id = pers.person_id AND kennzeichentyp_kurzbz IN ('vbpkAs', 'vbpkBf')) < 2 + AND pers.ersatzkennzeichen IS NULL"; + + if (isset($studiensemester_kurzbz)) + { + $qry .= " AND status.studiensemester_kurzbz = ?"; + $params[] = $studiensemester_kurzbz; + } + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($person_id)) + { + $qry .= " AND pre.person_id = ?"; + $params[] = $person_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } +} diff --git a/application/libraries/issues/plausichecks/ZgvDatumInZukunft.php b/application/libraries/issues/plausichecks/ZgvDatumInZukunft.php new file mode 100644 index 000000000..4ee91186c --- /dev/null +++ b/application/libraries/issues/plausichecks/ZgvDatumInZukunft.php @@ -0,0 +1,126 @@ +_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null; + + // pass parameters needed for plausicheck + $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; + $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; + $prestudent_id = isset($params['prestudent_id']) ? $params['prestudent_id'] : null; + + // get all students failing the plausicheck + $prestudentRes = $this->_getZgvDatumInZukunft( + $studiensemester_kurzbz, + $studiengang_kz, + $prestudent_id, + $exkludierte_studiengang_kz + ); + + if (isError($prestudentRes)) return $prestudentRes; + + if (hasData($prestudentRes)) + { + $prestudents = getData($prestudentRes); + + // populate results with data necessary for writing issues + foreach ($prestudents as $prestudent) + { + $results[] = array( + 'person_id' => $prestudent->person_id, + 'oe_kurzbz' => $prestudent->prestudent_stg_oe_kurzbz, + //'fehlertext_params' => array('prestudent_id' => $prestudent->prestudent_id), + 'resolution_params' => array('prestudent_id' => $prestudent->prestudent_id) + ); + } + } + + // return the results + return success($results); + } + + /** + * Prestudent should have a final status. + * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param prestudent_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + private function _getZgvDatumInZukunft( + $studiensemester_kurzbz = null, + $studiengang_kz = null, + $prestudent_id = null, + $exkludierte_studiengang_kz = null + ) { + $params = array(); + + $qry = " + SELECT + DISTINCT ON (prestudent_id) prestudent_id, person_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz + FROM + public.tbl_prestudent pre + JOIN public.tbl_person USING(person_id) + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz + WHERE + pre.zgvdatum::date > NOW() + AND stg.melderelevant + AND pre.bismelden"; + + if (isset($studiensemester_kurzbz)) + { + $qry .= " AND status.studiensemester_kurzbz = ?"; + $params[] = $studiensemester_kurzbz; + //~ $prevStudiensemesterRes = $this->_ci->StudiensemesterModel->getPreviousFrom($studiensemester_kurzbz); + + //~ if (isError($prevStudiensemesterRes)) return $prevStudiensemesterRes; + + //~ if (hasData($prevStudiensemesterRes)) + //~ { + //~ // if Studiensemester given, check only if has status in current or previous semester + //~ $prevStudiensemester = getData($prevStudiensemesterRes)[0]->studiensemester_kurzbz; + //~ $qry .= " AND EXISTS ( + //~ SELECT 1 + //~ FROM public.tbl_prestudentstatus ps + //~ WHERE studiensemester_kurzbz IN (?, ?) + //~ AND ps.prestudent_id = pre.prestudent_id + //~ )"; + //~ $params[] = $prevStudiensemester; + //~ $params[] = $studiensemester_kurzbz; + //~ } + } + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND pre.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } +} diff --git a/application/libraries/issues/plausichecks/ZgvDatumVorGeburtsdatum.php b/application/libraries/issues/plausichecks/ZgvDatumVorGeburtsdatum.php new file mode 100644 index 000000000..55c70758e --- /dev/null +++ b/application/libraries/issues/plausichecks/ZgvDatumVorGeburtsdatum.php @@ -0,0 +1,109 @@ +_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null; + + // pass parameters needed for plausicheck + $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; + $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; + $prestudent_id = isset($params['prestudent_id']) ? $params['prestudent_id'] : null; + + // get all students failing the plausicheck + $prestudentRes = $this->_getZgvDatumVorGeburtsdatum( + $studiensemester_kurzbz, + $studiengang_kz, + $prestudent_id, + $exkludierte_studiengang_kz + ); + + if (isError($prestudentRes)) return $prestudentRes; + + if (hasData($prestudentRes)) + { + $prestudents = getData($prestudentRes); + + // populate results with data necessary for writing issues + foreach ($prestudents as $prestudent) + { + $results[] = array( + 'person_id' => $prestudent->person_id, + 'oe_kurzbz' => $prestudent->prestudent_stg_oe_kurzbz, + //'fehlertext_params' => array('prestudent_id' => $prestudent->prestudent_id), + 'resolution_params' => array('prestudent_id' => $prestudent->prestudent_id) + ); + } + } + + // return the results + return success($results); + } + + /** + * Prestudent should have a final status. + * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param prestudent_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + private function _getZgvDatumVorGeburtsdatum( + $studiensemester_kurzbz = null, + $studiengang_kz = null, + $prestudent_id = null, + $exkludierte_studiengang_kz = null + ) { + $params = array(); + + $qry = " + SELECT + DISTINCT ON (prestudent_id) prestudent_id, person_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz + FROM + public.tbl_prestudent pre + JOIN public.tbl_person pers USING(person_id) + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz + WHERE + pre.zgvdatum::date < pers.gebdatum + AND stg.melderelevant + AND pre.bismelden"; + + if (isset($studiensemester_kurzbz)) + { + $qry .= " AND status.studiensemester_kurzbz = ?"; + $params[] = $studiensemester_kurzbz; + } + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND pre.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } +} diff --git a/application/libraries/issues/plausichecks/ZgvMasterDatumInZukunft.php b/application/libraries/issues/plausichecks/ZgvMasterDatumInZukunft.php new file mode 100644 index 000000000..1dc123c78 --- /dev/null +++ b/application/libraries/issues/plausichecks/ZgvMasterDatumInZukunft.php @@ -0,0 +1,109 @@ +_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null; + + // pass parameters needed for plausicheck + $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; + $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; + $prestudent_id = isset($params['prestudent_id']) ? $params['prestudent_id'] : null; + + // get all students failing the plausicheck + $prestudentRes = $this->_getZgvMasterDatumInZukunft( + $studiensemester_kurzbz, + $studiengang_kz, + $prestudent_id, + $exkludierte_studiengang_kz + ); + + if (isError($prestudentRes)) return $prestudentRes; + + if (hasData($prestudentRes)) + { + $prestudents = getData($prestudentRes); + + // populate results with data necessary for writing issues + foreach ($prestudents as $prestudent) + { + $results[] = array( + 'person_id' => $prestudent->person_id, + 'oe_kurzbz' => $prestudent->prestudent_stg_oe_kurzbz, + //'fehlertext_params' => array('prestudent_id' => $prestudent->prestudent_id), + 'resolution_params' => array('prestudent_id' => $prestudent->prestudent_id) + ); + } + } + + // return the results + return success($results); + } + + /** + * Prestudent should have a final status. + * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param prestudent_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + private function _getZgvMasterDatumInZukunft( + $studiensemester_kurzbz = null, + $studiengang_kz = null, + $prestudent_id = null, + $exkludierte_studiengang_kz = null + ) { + $params = array(); + + $qry = " + SELECT + DISTINCT ON (prestudent_id) prestudent_id, person_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz + FROM + public.tbl_prestudent pre + JOIN public.tbl_person USING(person_id) + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz + WHERE + pre.zgvmadatum::date > NOW() + AND stg.melderelevant + AND pre.bismelden"; + + if (isset($studiensemester_kurzbz)) + { + $qry .= " AND status.studiensemester_kurzbz = ?"; + $params[] = $studiensemester_kurzbz; + } + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND pre.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } +} diff --git a/application/libraries/issues/plausichecks/ZgvMasterDatumVorGeburtsdatum.php b/application/libraries/issues/plausichecks/ZgvMasterDatumVorGeburtsdatum.php new file mode 100644 index 000000000..00b3fff4a --- /dev/null +++ b/application/libraries/issues/plausichecks/ZgvMasterDatumVorGeburtsdatum.php @@ -0,0 +1,109 @@ +_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null; + + // pass parameters needed for plausicheck + $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; + $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; + $prestudent_id = isset($params['prestudent_id']) ? $params['prestudent_id'] : null; + + // get all students failing the plausicheck + $prestudentRes = $this->_getZgvMasterDatumVorGeburtsdatum( + $studiensemester_kurzbz, + $studiengang_kz, + $prestudent_id, + $exkludierte_studiengang_kz + ); + + if (isError($prestudentRes)) return $prestudentRes; + + if (hasData($prestudentRes)) + { + $prestudents = getData($prestudentRes); + + // populate results with data necessary for writing issues + foreach ($prestudents as $prestudent) + { + $results[] = array( + 'person_id' => $prestudent->person_id, + 'oe_kurzbz' => $prestudent->prestudent_stg_oe_kurzbz, + //'fehlertext_params' => array('prestudent_id' => $prestudent->prestudent_id), + 'resolution_params' => array('prestudent_id' => $prestudent->prestudent_id) + ); + } + } + + // return the results + return success($results); + } + + /** + * Prestudent should have a final status. + * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param prestudent_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + private function _getZgvMasterDatumVorGeburtsdatum( + $studiensemester_kurzbz = null, + $studiengang_kz = null, + $prestudent_id = null, + $exkludierte_studiengang_kz = null + ) { + $params = array(); + + $qry = " + SELECT + DISTINCT ON (prestudent_id) prestudent_id, person_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz + FROM + public.tbl_prestudent pre + JOIN public.tbl_person pers USING(person_id) + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz + WHERE + pre.zgvmadatum::date < pers.gebdatum + AND stg.melderelevant + AND pre.bismelden"; + + if (isset($studiensemester_kurzbz)) + { + $qry .= " AND status.studiensemester_kurzbz = ?"; + $params[] = $studiensemester_kurzbz; + } + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND pre.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } +} diff --git a/application/libraries/issues/plausichecks/ZgvMasterDatumVorZgvdatum.php b/application/libraries/issues/plausichecks/ZgvMasterDatumVorZgvdatum.php new file mode 100644 index 000000000..0d16e56b7 --- /dev/null +++ b/application/libraries/issues/plausichecks/ZgvMasterDatumVorZgvdatum.php @@ -0,0 +1,109 @@ +_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null; + + // pass parameters needed for plausicheck + $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; + $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; + $prestudent_id = isset($params['prestudent_id']) ? $params['prestudent_id'] : null; + + // get all students failing the plausicheck + $prestudentRes = $this->_getZgvMasterDatumVorZgvDatum( + $studiensemester_kurzbz, + $studiengang_kz, + $prestudent_id, + $exkludierte_studiengang_kz + ); + + if (isError($prestudentRes)) return $prestudentRes; + + if (hasData($prestudentRes)) + { + $prestudents = getData($prestudentRes); + + // populate results with data necessary for writing issues + foreach ($prestudents as $prestudent) + { + $results[] = array( + 'person_id' => $prestudent->person_id, + 'oe_kurzbz' => $prestudent->prestudent_stg_oe_kurzbz, + //'fehlertext_params' => array('prestudent_id' => $prestudent->prestudent_id), + 'resolution_params' => array('prestudent_id' => $prestudent->prestudent_id) + ); + } + } + + // return the results + return success($results); + } + + /** + * Prestudent should have a final status. + * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param prestudent_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + private function _getZgvMasterDatumVorZgvDatum( + $studiensemester_kurzbz = null, + $studiengang_kz = null, + $prestudent_id = null, + $exkludierte_studiengang_kz = null + ) { + $params = array(); + + $qry = " + SELECT + DISTINCT ON (prestudent_id) prestudent_id, person_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz + FROM + public.tbl_prestudent pre + JOIN public.tbl_person USING(person_id) + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz + WHERE + pre.zgvmadatum::date < pre.zgvdatum::date + AND stg.melderelevant + AND pre.bismelden"; + + if (isset($studiensemester_kurzbz)) + { + $qry .= " AND status.studiensemester_kurzbz = ?"; + $params[] = $studiensemester_kurzbz; + } + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND pre.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } +} diff --git a/application/libraries/issues/plausichecks/ZuVieleZweckeIncomingPlausi.php b/application/libraries/issues/plausichecks/ZuVieleZweckeIncomingPlausi.php new file mode 100644 index 000000000..ab39c880f --- /dev/null +++ b/application/libraries/issues/plausichecks/ZuVieleZweckeIncomingPlausi.php @@ -0,0 +1,121 @@ +_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null; + + // pass parameters needed for plausicheck + $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; + $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; + $bisio_id = isset($params['bisio_id']) ? $params['bisio_id'] : null; + + // get all students failing the plausicheck + $prestudentRes = $this->_getFalscherIncomingZweck( + $studiensemester_kurzbz, + $studiengang_kz, + $bisio_id, + $exkludierte_studiengang_kz + ); + + if (isError($prestudentRes)) return $prestudentRes; + + if (hasData($prestudentRes)) + { + $prestudents = getData($prestudentRes); + + // populate results with data necessary for writing issues + foreach ($prestudents as $prestudent) + { + $results[] = array( + 'person_id' => $prestudent->person_id, + 'oe_kurzbz' => $prestudent->prestudent_stg_oe_kurzbz, + //'fehlertext_params' => array('bisio_id' => $prestudent->bisio_id), + 'resolution_params' => array('bisio_id' => $prestudent->bisio_id) + ); + } + } + + // return the results + return success($results); + } + + /** + * Prestudent should have a final status. + * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param bisio_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + private function _getFalscherIncomingZweck( + $studiensemester_kurzbz = null, + $studiengang_kz = null, + $bisio_id = null, + $exkludierte_studiengang_kz = null + ) { + + $params = array(); + $studiensemester_clause = ''; + + if (isset($studiensemester_kurzbz)) + { + $studiensemester_clause = "AND status.studiensemester_kurzbz = ?"; + $params[] = $studiensemester_kurzbz; + } + + $qry = " + SELECT * FROM ( + SELECT + DISTINCT ON (bisio_id) prestudent_id, person_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, zw.zweck_code, stg.studiengang_kz, + bisio.bisio_id, COUNT(zw.zweck_code) OVER (PARTITION BY bisio_id) AS anzahl + FROM + public.tbl_prestudent pre + JOIN public.tbl_student stud USING (prestudent_id) + JOIN public.tbl_person USING(person_id) + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_studiensemester sem ON status.studiensemester_kurzbz = sem.studiensemester_kurzbz + JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz + JOIN bis.tbl_bisio bisio ON stud.student_uid = bisio.student_uid + JOIN bis.tbl_bisio_zweck zw USING (bisio_id) + WHERE + stg.melderelevant + AND pre.bismelden + AND status.status_kurzbz = 'Incoming' + AND bisio.von::date < sem.ende AND bisio.bis::date > sem.start + {$studiensemester_clause} + ) zwecke + WHERE anzahl > 1"; + + if (isset($studiengang_kz)) + { + $qry .= " AND zwecke.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($bisio_id)) + { + $qry .= " AND zwecke.bisio_id = ?"; + $params[] = $bisio_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND zwecke.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } +} diff --git a/application/libraries/issues/resolvers/CORE_INOUT_0005.php b/application/libraries/issues/resolvers/CORE_INOUT_0005.php index e655d2e36..ee6b7b5b7 100644 --- a/application/libraries/issues/resolvers/CORE_INOUT_0005.php +++ b/application/libraries/issues/resolvers/CORE_INOUT_0005.php @@ -16,7 +16,7 @@ class CORE_INOUT_0005 implements IIssueResolvedChecker $this->_ci->load->model('codex/Bisio_model', 'BisioModel'); - // get all Zwecke + // get bisio $this->_ci->BisioModel->addSelect('ects_angerechnet'); $bisioRes = $this->_ci->BisioModel->loadWhere(array('bisio_id' => $params['bisio_id'])); diff --git a/system/dbupdate_3.4.php b/system/dbupdate_3.4.php index e6d897be1..26acc7371 100644 --- a/system/dbupdate_3.4.php +++ b/system/dbupdate_3.4.php @@ -414,6 +414,7 @@ $tabellen=array( "system.tbl_extensions" => array("extension_id","name","version","description","license","url","core_version","dependencies","enabled"), "system.tbl_fehler" => array("fehlercode","fehler_kurzbz","fehlercode_extern","fehlertext","fehlertyp_kurzbz","app","insertamum","insertvon","updateamum","updatevon"), "system.tbl_fehlertyp" => array("fehlertyp_kurzbz","bezeichnung_mehrsprachig"), + "system.tbl_fehler_app" => array("fehlercode","app","insertamum","insertvon"), "system.tbl_fehler_konfiguration" => array("konfigurationstyp_kurzbz","fehlercode","konfiguration","insertamum","insertvon","updateamum","updatevon"), "system.tbl_fehler_konfigurationsdatentyp" => array("konfigurationsdatentyp"), "system.tbl_fehler_konfigurationstyp" => array("konfigurationstyp_kurzbz","beschreibung","konfigurationsdatentyp","app"),