diff --git a/application/config/fehler.php b/application/config/fehler.php new file mode 100644 index 000000000..7f546c840 --- /dev/null +++ b/application/config/fehler.php @@ -0,0 +1,448 @@ + 'CORE_ZGV_0001', + 'fehler_kurzbz' => 'zgvDatumInZukunft', + 'fehlercode_extern' => null, + 'fehlertext' => 'ZGV Datum in Zukunft', + 'fehlertyp_kurzbz' => 'error', + 'app' => array('core'), + 'producerLibName' => 'ZgvDatumInZukunft', + 'resolverLibName' => 'CORE_ZGV_0001', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_ZGV_0002', + 'fehler_kurzbz' => 'zgvDatumVorGeburtsdatum', + 'fehlercode_extern' => null, + 'fehlertext' => 'ZGV Datum vor Geburtsdatum', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => 'ZgvDatumVorGeburtsdatum', + 'resolverLibName' => 'CORE_ZGV_0002', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_ZGV_0003', + 'fehler_kurzbz' => 'zgvMasterDatumInZukunft', + 'fehlercode_extern' => null, + 'fehlertext' => 'ZGV Masterdatum in Zukunft', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => 'ZgvMasterDatumInZukunft', + 'resolverLibName' => 'CORE_ZGV_0003', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_ZGV_0004', + 'fehler_kurzbz' => 'zgvMasterDatumVorZgvdatum', + 'fehlercode_extern' => null, + 'fehlertext' => 'ZGV Masterdatum vor Zgvdatum', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => 'ZgvMasterDatumVorZgvdatum', + 'resolverLibName' => 'CORE_ZGV_0004', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_ZGV_0005', + 'fehler_kurzbz' => 'zgvMasterDatumVorGeburtsdatum', + 'fehlercode_extern' => null, + 'fehlertext' => 'ZGV Masterdatum vor Geburtsdatum', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => 'ZgvMasterDatumVorGeburtsdatum', + 'resolverLibName' => 'CORE_ZGV_0005', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_INOUT_0001', + 'fehler_kurzbz' => 'keinAufenthaltszweckPlausi', + 'fehlercode_extern' => null, + 'fehlertext' => 'Kein Aufenthaltszweck gefunden', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => 'KeinAufenthaltszweckPlausi', + 'resolverLibName' => 'CORE_INOUT_0001', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_INOUT_0002', + 'fehler_kurzbz' => 'zuVieleZweckeIncomingPlausi', + 'fehlercode_extern' => null, + 'fehlertext' => 'Es sind %s Aufenthaltszwecke eingetragen (max. 1 Zweck für Incomings)', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => 'ZuVieleZweckeIncomingPlausi', + 'resolverLibName' => 'CORE_INOUT_0002', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_INOUT_0003', + 'fehler_kurzbz' => 'falscherIncomingZweckPlausi', + 'fehlercode_extern' => null, + 'fehlertext' => 'Aufenthaltszweckcode ist %s (für Incomings ist nur Zweck 1, 2, 3 erlaubt)', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => 'FalscherIncomingZweckPlausi', + 'resolverLibName' => 'CORE_INOUT_0003', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_INOUT_0004', + 'fehler_kurzbz' => 'outgoingAufenthaltfoerderungfehltPlausi', + 'fehlercode_extern' => null, + 'fehlertext' => 'Keine Aufenthaltsfoerderung angegeben (bei Outgoings >= 29 Tage Monat im Ausland muss mind. 1 gemeldet werden)', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => 'OutgoingAufenthaltfoerderungfehltPlausi', + 'resolverLibName' => 'CORE_INOUT_0004', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_INOUT_0005', + 'fehler_kurzbz' => 'outgoingAngerechneteEctsFehlenPlausi', + 'fehlercode_extern' => null, + 'fehlertext' => 'Angerechnete ECTS fehlen (Meldepflicht bei Outgoings >= 29 Tage Monat im Ausland)', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => 'OutgoingAngerechneteEctsFehlenPlausi', + 'resolverLibName' => 'CORE_INOUT_0005', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_INOUT_0006', + 'fehler_kurzbz' => 'outgoingErworbeneEctsFehlenPlausi', + 'fehlercode_extern' => null, + 'fehlertext' => 'Erworbene ECTS fehlen (Meldepflicht bei Outgoings >= 29 Tage Monat im Ausland)', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => 'OutgoingErworbeneEctsFehlenPlausi', + 'resolverLibName' => 'CORE_INOUT_0006', + 'producerIsResolver' => false + ), + + /** Plausichecks **/ + array( + 'fehlercode' => 'CORE_INOUT_0007', + 'fehler_kurzbz' => 'IncomingHeimatNationOesterreich', + 'fehlercode_extern' => null, + 'fehlertext' => 'Heimatnation bei Incoming Österreich', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => 'IncomingHeimatNationOesterreich', + 'resolverLibName' => 'CORE_INOUT_0007', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_INOUT_0008', + 'fehler_kurzbz' => 'IncomingOhneIoDatensatz', + 'fehlercode_extern' => null, + 'fehlertext' => 'Incoming hat keinen IO Datensatz (prestudent_id %s)', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => 'IncomingOhneIoDatensatz', + 'resolverLibName' => 'CORE_INOUT_0008', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_INOUT_0009', + 'fehler_kurzbz' => 'IncomingOrGsFoerderrelevant', + 'fehlercode_extern' => null, + 'fehlertext' => 'Incoming oder gemeinsames Studium ist nicht als nicht förderrelevant markiert. (prestudent_id %s)', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => 'IncomingOrGsFoerderrelevant', + 'resolverLibName' => 'CORE_INOUT_0009', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_STG_0001', + 'fehler_kurzbz' => 'StgPrestudentUngleichStgStudent', + 'fehlercode_extern' => null, + 'fehlertext' => 'Studiengang des Prestudenten ist ungleich dem Studiengang des Studenten. (prestudent_id %s)', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => 'StgPrestudentUngleichStgStudent', + 'resolverLibName' => 'CORE_STG_0001', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_STG_0002', + 'fehler_kurzbz' => 'OrgformStgUngleichOrgformPrestudent', + 'fehlercode_extern' => null, + 'fehlertext' => 'Es ist kein Studienplan mit Studiengang (%s) und Organisationsform (%s) des Studenten zugewiesen. (prestudent_id %s, Studiensemester %s)', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => 'OrgformStgUngleichOrgformPrestudent', + 'resolverLibName' => 'CORE_STG_0002', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_STG_0003', + 'fehler_kurzbz' => 'PrestudentMischformOhneOrgform', + 'fehlercode_extern' => null, + 'fehlertext' => 'Organisationsform ist für Studierenden/BewerberIn in Mischformstudiengang nicht eingetragen. (prestudent_id %s, Studiensemester %s)', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => 'PrestudentMischformOhneOrgform', + 'resolverLibName' => 'CORE_STG_0003', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_STG_0004', + 'fehler_kurzbz' => 'StgPrestudentUngleichStgStudienplan', + 'fehlercode_extern' => null, + 'fehlertext' => 'Studiengang des Prestudenten passt nicht zu Studiengang des Studienplans. (prestudent_id %s, Studienplan %s)', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => 'StgPrestudentUngleichStgStudienplan', + 'resolverLibName' => 'CORE_STG_0004', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_STUDENTSTATUS_0001', + 'fehler_kurzbz' => 'AbbrecherAktiv', + 'fehlercode_extern' => null, + 'fehlertext' => 'AbbrecherIn hat aktiven Benutzer. (prestudent_id %s)', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => 'AbbrecherAktiv', + 'resolverLibName' => null, + 'producerIsResolver' => true + ), + array( + 'fehlercode' => 'CORE_STUDENTSTATUS_0002', + 'fehler_kurzbz' => 'StudentstatusNachAbbrecher', + 'fehlercode_extern' => null, + 'fehlertext' => 'Aktiver Status nach Abbrecher Status. (prestudent_id %s)', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => 'StudentstatusNachAbbrecher', + 'resolverLibName' => 'CORE_STUDENTSTATUS_0002', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_STUDENTSTATUS_0003', + 'fehler_kurzbz' => 'AusbildungssemPrestudentUngleichAusbildungssemStatus', + 'fehlercode_extern' => null, + 'fehlertext' => 'Ausbildungssemester %s des aktuellen Status stimmt nicht mit Ausbildungssemester %s bei StudentIn (Lehrverband) überein. (student_uid %s, prestudent_id %s, Studiensemester %s)', + 'fehlertyp_kurzbz' => 'warning', + 'app' => 'core', + 'producerLibName' => 'AusbildungssemPrestudentUngleichAusbildungssemStatus', + 'resolverLibName' => 'CORE_STUDENTSTATUS_0003', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_STUDENTSTATUS_0004', + 'fehler_kurzbz' => 'InaktiverStudentAktiverStatus', + 'fehlercode_extern' => null, + 'fehlertext' => 'Inaktiver Benutzer hat aktiven Status. (prestudent_id %s)', + 'fehlertyp_kurzbz' => 'warning', + 'app' => 'core', + 'producerLibName' => 'InaktiverStudentAktiverStatus', + 'resolverLibName' => 'CORE_STUDENTSTATUS_0004', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_STUDENTSTATUS_0005', + 'fehler_kurzbz' => 'InskriptionVorLetzerBismeldung', + 'fehlercode_extern' => null, + 'fehlertext' => 'Datum der Inskription liegt vor dem Datum der letzten BIS-Meldung %s. (prestudent_id %s, Studiensemester %s)', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => 'InskriptionVorLetzerBismeldung', + 'resolverLibName' => 'CORE_STUDENTSTATUS_0005', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_STUDENTSTATUS_0006', + 'fehler_kurzbz' => 'DatumStudiensemesterFalscheReihenfolge', + 'fehlercode_extern' => null, + 'fehlertext' => 'Datum und Studiensemester sind bei den Status in falscher Reihenfolge. (prestudent_id %s)', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => 'DatumStudiensemesterFalscheReihenfolge', + 'resolverLibName' => 'CORE_STUDENTSTATUS_0006', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_STUDENTSTATUS_0007', + 'fehler_kurzbz' => 'AktiverStudentOhneStatus', + 'fehlercode_extern' => null, + 'fehlertext' => 'Aktive/r StudentIn ohne aktuellen Status (prestudent_id %s)', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => 'AktiverStudentOhneStatus', + '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_0009', + 'fehler_kurzbz' => 'FalscheAnzahlAbschlusspruefungen', + 'fehlercode_extern' => null, + 'fehlertext' => 'Mehrere oder keine bestandenen Abschlussprüfungen (prestudent_id %s)', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => 'FalscheAnzahlAbschlusspruefungen', + 'resolverLibName' => 'CORE_STUDENTSTATUS_0009', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_STUDENTSTATUS_0010', + 'fehler_kurzbz' => 'DatumAbschlusspruefungFehlt', + 'fehlercode_extern' => null, + 'fehlertext' => 'Kein Abschlussprüfung Datum (prestudent_id %s, abschlusspruefung_id %s)', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => 'DatumAbschlusspruefungFehlt', + 'resolverLibName' => 'CORE_STUDENTSTATUS_0010', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_STUDENTSTATUS_0011', + 'fehler_kurzbz' => 'DatumSponsionFehlt', + 'fehlercode_extern' => null, + 'fehlertext' => 'Kein Sponsionsdatum (prestudent_id %s, abschlusspruefung_id %s)', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => 'DatumSponsionFehlt', + '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_0013', + 'fehler_kurzbz' => 'AktSemesterNull', + 'fehlercode_extern' => null, + 'fehlertext' => 'Aktuelles Ausbildungssemester ist 0 (prestudent_id %s, Studiensemester %s)', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => 'AktSemesterNull', + 'resolverLibName' => 'CORE_STUDENTSTATUS_0013', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_STUDENTSTATUS_0014', + 'fehler_kurzbz' => 'AbschlussstatusFehlt', + 'fehlercode_extern' => null, + 'fehlertext' => 'Kein Abschlussstatus (prestudent_id %s)', + 'fehlertyp_kurzbz' => 'warning', + 'app' => 'core', + 'producerLibName' => 'AbschlussstatusFehlt', + 'resolverLibName' => 'CORE_STUDENTSTATUS_0014', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_STUDENTSTATUS_0015', + 'fehler_kurzbz' => 'AktiverStudentstatusOhneKontobuchung', + 'fehlercode_extern' => null, + 'fehlertext' => 'Keine Kontobuchung bei aktivem Studentstatus (prestudent_id %s, Studiensemester %s)', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => 'AktiverStudentstatusOhneKontobuchung', + 'resolverLibName' => 'CORE_STUDENTSTATUS_0015', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_STUDENTSTATUS_0016', + 'fehler_kurzbz' => 'DualesStudiumOhneMarkierung', + 'fehlercode_extern' => null, + 'fehlertext' => 'StudentIn in dualem Studiengang nicht als dual markiert (prestudent_id %s, Studienplan %s)', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => 'DualesStudiumOhneMarkierung', + 'resolverLibName' => 'CORE_STUDENTSTATUS_0016', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_PERSON_0001', + 'fehler_kurzbz' => 'GbDatumWeitZurueck', + 'fehlercode_extern' => null, + 'fehlertext' => 'Geburtsdatum vor dem 01.01.1920', + 'fehlertyp_kurzbz' => 'warning', + 'app' => 'core', + 'producerLibName' => 'GbDatumWeitZurueck', + 'resolverLibName' => 'CORE_PERSON_0001', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_PERSON_0002', + 'fehler_kurzbz' => 'NationNichtOesterreichAberGemeinde', + 'fehlercode_extern' => null, + 'fehlertext' => 'Nation der Adresse ist ungleich Österreich, es ist aber eine österreichische Gemeinde (%s) angegeben (adresse_id %s)', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => 'NationNichtOesterreichAberGemeinde', + 'resolverLibName' => 'CORE_PERSON_0002', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_PERSON_0003', + 'fehler_kurzbz' => 'FalscheAnzahlHeimatadressen', + 'fehlercode_extern' => null, + 'fehlertext' => 'Es sind mehrere oder keine Heimatadressen eingetragen', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => 'FalscheAnzahlHeimatadressen', + 'resolverLibName' => 'CORE_PERSON_0003', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_PERSON_0004', + 'fehler_kurzbz' => 'FalscheAnzahlZustelladressen', + 'fehlercode_extern' => null, + 'fehlertext' => 'Es sind mehrere oder keine Zustelladressen eingetragen', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => 'FalscheAnzahlZustelladressen', + 'resolverLibName' => 'CORE_PERSON_0004', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_PERSON_0005', + 'fehler_kurzbz' => 'geburtsnationFehlt', + 'fehlercode_extern' => null, + 'fehlertext' => 'Geburtsnation nicht vorhanden', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => 'GeburtsnationFehlt', + 'resolverLibName' => null, + 'producerIsResolver' => true + ), + array( + 'fehlercode' => 'CORE_PERSON_0006', + 'fehler_kurzbz' => 'uhstatPersonkennungFehltCore', + 'fehlercode_extern' => null, + 'fehlertext' => 'Personkennung fehlt (vBpk AS, vBpk BF oder Ersatzkennzeichen fehlt)', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => 'UhstatPersonkennungFehltCore', + 'resolverLibName' => 'CORE_PERSON_0006', + 'producerIsResolver' => false + ) +); diff --git a/application/controllers/api/frontend/v1/issues/IssueChecker.php b/application/controllers/api/frontend/v1/issues/IssueChecker.php new file mode 100644 index 000000000..6cb3497f2 --- /dev/null +++ b/application/controllers/api/frontend/v1/issues/IssueChecker.php @@ -0,0 +1,200 @@ + self::DEFAULT_PERMISSION, + 'countPersonOpenIssues' => self::DEFAULT_PERMISSION + ]; + + if(!is_array($permissions)) + { + $this->terminateWithError("Issue Checker: permissions must be an array"); + } + + $merged_permissions = array_merge($default_permissions, $permissions); + + parent::__construct($merged_permissions); + + $this->load->model('system/Issue_model', 'IssueModel'); + $this->load->model('system/Fehler_model', 'FehlerModel'); + $this->load->model('person/Person_model', 'PersonModel'); + + $producerArgs = []; + $resolverArgs = []; + + // get fehler kurzbz from fehlercodes, if fehlercodes provided + if (!isEmptyArray($this->_fehlercodes)) + { + $this->FehlerModel->addSelect('fehlercode, fehler_kurzbz'); + $this->FehlerModel->db->where_in('tbl_fehler.fehlercode', $this->_fehlercodes); + $fehlerKurzbzRes = $this->FehlerModel->load(); + + if (isError($fehlerKurzbzRes)) $this->terminateWithError(getError($fehlerKurzbzRes), self::ERROR_TYPE_GENERAL); + if (hasData($fehlerKurzbzRes)) + { + $producerArgs['fehlerKurzbz'] = array_column(getData($fehlerKurzbzRes), 'fehler_kurzbz'); + $resolverArgs['fehlercode'] = array_column(getData($fehlerKurzbzRes), 'fehlercode'); + } + } + elseif (!isEmptyArray($this->_apps)) // if apps are provided + { + // get fehlercodes for the apps + $fehlerRes = $this->FehlerModel->getByApps($this->_apps); + if (hasData($fehlerRes)) $this->_fehlercodes = array_column(getData($fehlerRes), 'fehlercode'); + + $producerArgs['apps'] = $this->_apps; + $resolverArgs['apps'] = $this->_apps; + } + + // load producer and checker libraries with fehler kurbz and fehlercode list + $this->load->library( + 'issues/PlausicheckProducerLib', + $producerArgs, + 'PlausicheckProducerLib' + ); + + $this->load->library( + 'issues/PlausicheckResolverLib', + $resolverArgs, + 'PlausicheckResolverLib' + ); + + $this->load->library('PhrasesLib'); + + $this->loadPhrases( + array( + 'ui' + ) + ); + } + + public function checkPerson() + { + $person_id = $this->input->post('person_id', true); + $hauptzustaendig = filter_var($this->input->post('hauptzustaendig', true), FILTER_VALIDATE_BOOLEAN); + + if (!is_numeric($person_id)) $this->terminateWithError($this->p->t('ui', 'error_invalidId', ['id'=> 'Person ID']), self::ERROR_TYPE_GENERAL); + + $this->person_id = intval($person_id); + $this->hauptzustaendig = $hauptzustaendig; + + $persRes = $this->PersonModel->load($this->person_id); + if (!hasData($persRes)) $this->terminateWithError('Person with id ' . $this->person_id . ' not found.', self::ERROR_TYPE_GENERAL); + + $this->_produceIssues(); + $this->_resolveIssues(); + $this->_produceIssues(); + + $openIssueCountRes = $this->_countOpenIssues(); + if (isError($openIssueCountRes)) $this->terminateWithError(getError($openIssueCountRes), self::ERROR_TYPE_GENERAL); + + $data = array( + 'person_id' => $this->person_id, + 'openissues' => hasData($openIssueCountRes) ? getData($openIssueCountRes) : 0 + ); + + $this->addMeta('errors', $this->errors); + $this->addMeta('infos', $this->infos); + + $this->terminateWithSuccess($data); + } + + public function countPersonOpenIssues() + { + $person_id = $this->input->get('person_id', true); + $hauptzustaendig = filter_var($this->input->get('hauptzustaendig', true), FILTER_VALIDATE_BOOLEAN); + + if (!is_numeric($person_id)) $this->terminateWithError($this->p->t('ui', 'error_invalidId', ['id'=> 'Person ID']), self::ERROR_TYPE_GENERAL); + + $this->person_id = intval($person_id); + $this->hauptzustaendig = $hauptzustaendig; + + $persRes = $this->PersonModel->load($this->person_id); + + if (!hasData($persRes)) $this->terminateWithError('Person with id ' . $this->person_id . ' not found.', self::ERROR_TYPE_GENERAL); + + $openIssueCountRes = $this->_countOpenIssues(); + if (isError($openIssueCountRes)) $this->terminateWithError(getError($openIssueCountRes), self::ERROR_TYPE_GENERAL); + + $data = array( + 'person_id' => $this->person_id, + 'openissues' => hasData($openIssueCountRes) ? getData($openIssueCountRes) : 0 + ); + + $this->addMeta('errors', $this->errors); + $this->addMeta('infos', $this->infos); + + $this->terminateWithSuccess($data); + } + + protected function _countOpenIssues() + { + if (isEmptyArray($this->_fehlercodes)) return success([]); + + // load open issues with given errorcodes + $openIssuesRes = $this->IssueModel->getOpenIssues( + $this->_fehlercodes, + $this->person_id, + $oe_kurzbz = null, + $fehlercode_extern = null, + $this->hauptzustaendig + ); + + // log error if occured + if (isError($openIssuesRes)) return $openIssuesRes; + + $issues = hasData($openIssuesRes) ? getData($openIssuesRes) : []; + $issuescount = is_array($issues) || $issues instanceof Countable ? count($issues) : 0; + + return success($issuescount); + } + + protected function _produceIssues() + { + $result = $this->PlausicheckProducerLib->producePlausicheckIssues( + array('person_id' => $this->person_id) + ); + + // log if error, or log info if inserted new issue + if (isset($result->errors)) + $this->errors = array_merge($this->errors, $result->errors); + if (isset($result->infos)) + $this->infos = array_merge($this->infos, $result->infos); + } + + protected function _resolveIssues() + { + // load open issues with given errorcodes + $openIssuesRes = $this->IssueModel->getOpenIssues( + $this->_fehlercodes, + $this->person_id + ); + + if (hasData($openIssuesRes)) + { + $openIssues = getData($openIssuesRes); + + $result = $this->PlausicheckResolverLib->resolvePlausicheckIssues($openIssues); + + // log if error, or log info if inserted new issue + if (isset($result->errors)) + $this->errors = array_merge($this->errors, $result->errors); + if (isset($result->infos)) + $this->infos = array_merge($this->infos, $result->infos); + } + } +} diff --git a/application/controllers/api/frontend/v1/issues/Issues.php b/application/controllers/api/frontend/v1/issues/Issues.php new file mode 100644 index 000000000..89a166ce3 --- /dev/null +++ b/application/controllers/api/frontend/v1/issues/Issues.php @@ -0,0 +1,104 @@ + Self::DEFAULT_PERMISSION, + 'getPersonenMitOffenenIssues' => Self::DEFAULT_PERMISSION + ) + ); + + // Loads authentication library and starts authenticationfetc + $this->load->library('AuthLib'); + + $this->load->model('extensions/FHC-Core-Personalverwaltung/Api_model','ApiModel'); + $this->load->model('person/Person_model','PersonModel'); + $this->load->model('system/Fehler_model','FehlerModel'); + $this->load->model('system/Issue_model', 'IssueModel'); + $this->load->model('person/Benutzer_model', 'BenutzerModel'); + } + + public function getOpenIssuesByProperties() + { + $person_id = $this->input->get('person_id', true); + $oe_kurzbz = $this->input->get('oe_kurzbz', true); + $fehlertyp_kurzbz = $this->input->get('fehlertyp_kurzbz', true); + $apps = $this->input->get('apps', true); + $behebung_parameter = $this->input->get('behebung_parameter', true); + $hauptzustaendig = filter_var($this->input->get('hauptzustaendig', true), FILTER_VALIDATE_BOOLEAN); + + if (isset($person_id) && !is_numeric($person_id)) + $this->terminateWithError('person id is not numeric!'); + + if (isset($behebung_parameter) && !is_array($behebung_parameter)) + $this->terminateWithError('Behebung parameter invalid'); + + $issueRes = $this->IssueModel->getOpenIssuesByProperties( + $person_id, + $oe_kurzbz, + $fehlertyp_kurzbz, + $apps, + $behebung_parameter, + $hauptzustaendig + ); + + if (isError($issueRes)) + { + $this->terminateWithError(getError($issueRes)); + } + + $this->terminateWithSuccess(hasData($issueRes) ? getData($issueRes) : []); + } + + public function getPersonenMitOffenenIssues() + { + + $sql = <<=now()) + ) aktiv +FROM + system.tbl_issue +JOIN + system.tbl_fehler USING (fehlercode) +JOIN + public.tbl_person USING (person_id) +JOIN + public.tbl_benutzer USING (person_id) +JOIN + public.tbl_mitarbeiter ON uid = mitarbeiter_uid +WHERE + app = 'personalverwaltung' AND verarbeitetamum IS NULL +GROUP BY + person_id, uid, vorname, nachname +HAVING + count(*) > 0 +ORDER BY + count(*) DESC; + +EOSQL; + + $personenmitissues = $this->IssueModel->execReadOnlyQuery($sql); + if( hasData($personenmitissues) ) + { + $this->terminateWithSuccess(getData($personenmitissues)); + } + else + { + $this->terminateWithSuccess(array()); + } + } +} \ No newline at end of file diff --git a/application/controllers/api/frontend/v1/issues/StudentIssueChecker.php b/application/controllers/api/frontend/v1/issues/StudentIssueChecker.php new file mode 100644 index 000000000..83f8e8b30 --- /dev/null +++ b/application/controllers/api/frontend/v1/issues/StudentIssueChecker.php @@ -0,0 +1,17 @@ + class (library) name for resolving in "resolvers" folder - $this->_codeLibMappings = array( - 'CORE_ZGV_0001' => 'CORE_ZGV_0001', - 'CORE_ZGV_0002' => 'CORE_ZGV_0002', - 'CORE_ZGV_0003' => 'CORE_ZGV_0003', - 'CORE_ZGV_0004' => 'CORE_ZGV_0004', - 'CORE_ZGV_0005' => 'CORE_ZGV_0005', - 'CORE_INOUT_0001' => 'CORE_INOUT_0001', - 'CORE_INOUT_0002' => 'CORE_INOUT_0002', - 'CORE_INOUT_0003' => 'CORE_INOUT_0003', - 'CORE_INOUT_0004' => 'CORE_INOUT_0004', - 'CORE_INOUT_0005' => 'CORE_INOUT_0005', - 'CORE_INOUT_0006' => 'CORE_INOUT_0006', - 'CORE_INOUT_0007' => 'CORE_INOUT_0007', - 'CORE_INOUT_0008' => 'CORE_INOUT_0008', - 'CORE_INOUT_0009' => 'CORE_INOUT_0009', - 'CORE_STG_0001' => 'CORE_STG_0001', - 'CORE_STG_0002' => 'CORE_STG_0002', - 'CORE_STG_0003' => 'CORE_STG_0003', - 'CORE_STG_0004' => 'CORE_STG_0004', - 'CORE_STUDENTSTATUS_0002' => 'CORE_STUDENTSTATUS_0002', - 'CORE_STUDENTSTATUS_0003' => 'CORE_STUDENTSTATUS_0003', - 'CORE_STUDENTSTATUS_0004' => 'CORE_STUDENTSTATUS_0004', - 'CORE_STUDENTSTATUS_0005' => 'CORE_STUDENTSTATUS_0005', - 'CORE_STUDENTSTATUS_0006' => 'CORE_STUDENTSTATUS_0006', - 'CORE_STUDENTSTATUS_0007' => 'CORE_STUDENTSTATUS_0007', - 'CORE_STUDENTSTATUS_0008' => 'CORE_STUDENTSTATUS_0008', - 'CORE_STUDENTSTATUS_0009' => 'CORE_STUDENTSTATUS_0009', - 'CORE_STUDENTSTATUS_0010' => 'CORE_STUDENTSTATUS_0010', - 'CORE_STUDENTSTATUS_0011' => 'CORE_STUDENTSTATUS_0011', - 'CORE_STUDENTSTATUS_0012' => 'CORE_STUDENTSTATUS_0012', - 'CORE_STUDENTSTATUS_0013' => 'CORE_STUDENTSTATUS_0013', - 'CORE_STUDENTSTATUS_0014' => 'CORE_STUDENTSTATUS_0014', - 'CORE_STUDENTSTATUS_0015' => 'CORE_STUDENTSTATUS_0015', - 'CORE_STUDENTSTATUS_0016' => 'CORE_STUDENTSTATUS_0016', - 'CORE_PERSON_0001' => 'CORE_PERSON_0001', - 'CORE_PERSON_0002' => 'CORE_PERSON_0002', - 'CORE_PERSON_0003' => 'CORE_PERSON_0003', - 'CORE_PERSON_0004' => 'CORE_PERSON_0004', - 'CORE_PERSON_0005' => 'CORE_PERSON_0005', - 'CORE_PERSON_0006' => 'CORE_PERSON_0006' - ); - - // fehler which are resolved by the job the same way as they are produced - // structure: fehlercode => class (library) name for resolving in "plausichecks" folder - $this->_codeProducerLibMappings = array( - 'CORE_STUDENTSTATUS_0001' => 'AbbrecherAktiv', - 'CORE_STUDENTSTATUS_0017' => 'BeginndatumVorBismeldung', - 'CORE_STUDENTSTATUS_0018' => 'StudentstatusNachDiplomand', - 'CORE_STUDENTSTATUS_0019' => 'OrgformBewerberUngleichOrgformStudent', - 'CORE_STUDENTSTATUS_0020' => 'StartsemesterUngleichPersonenkennzeichen', - 'CORE_STUDENTSTATUS_0021' => 'AbschlusspruefungOderAbsolventFehlt', - 'CORE_STUDENTSTATUS_0022' => 'FalscheStatusabfolgeVorStudentstatus' - ); - } + protected $_fehlercodes = array( + 'CORE_ZGV_0001', + 'CORE_ZGV_0002', + 'CORE_ZGV_0003', + 'CORE_ZGV_0004', + 'CORE_ZGV_0005', + 'CORE_INOUT_0001', + 'CORE_INOUT_0002', + 'CORE_INOUT_0003', + 'CORE_INOUT_0004', + 'CORE_INOUT_0005', + 'CORE_INOUT_0006', + 'CORE_INOUT_0007', + 'CORE_INOUT_0008', + 'CORE_INOUT_0009', + 'CORE_STG_0001', + 'CORE_STG_0002', + 'CORE_STG_0003', + 'CORE_STG_0004', + 'CORE_STUDENTSTATUS_0001', + 'CORE_STUDENTSTATUS_0002', + 'CORE_STUDENTSTATUS_0003', + 'CORE_STUDENTSTATUS_0004', + 'CORE_STUDENTSTATUS_0005', + 'CORE_STUDENTSTATUS_0006', + 'CORE_STUDENTSTATUS_0007', + 'CORE_STUDENTSTATUS_0008', + 'CORE_STUDENTSTATUS_0009', + 'CORE_STUDENTSTATUS_0010', + 'CORE_STUDENTSTATUS_0011', + 'CORE_STUDENTSTATUS_0012', + 'CORE_STUDENTSTATUS_0013', + 'CORE_STUDENTSTATUS_0014', + 'CORE_STUDENTSTATUS_0015', + 'CORE_STUDENTSTATUS_0016', + 'CORE_PERSON_0001', + 'CORE_PERSON_0002', + 'CORE_PERSON_0003', + 'CORE_PERSON_0004', + 'CORE_PERSON_0005', + 'CORE_PERSON_0006' + ); } diff --git a/application/controllers/jobs/PlausiIssueProducer.php b/application/controllers/jobs/PlausiIssueProducer.php index b667e835d..e41b887c5 100644 --- a/application/controllers/jobs/PlausiIssueProducer.php +++ b/application/controllers/jobs/PlausiIssueProducer.php @@ -6,7 +6,7 @@ class PlausiIssueProducer extends PlausiIssueProducer_Controller { private $_currentStudiensemester; - protected $_app = 'core'; + protected $_apps = 'core'; public function __construct() { @@ -18,12 +18,12 @@ class PlausiIssueProducer extends PlausiIssueProducer_Controller $this->load->model('organisation/studiensemester_model', 'StudiensemesterModel'); // get current Studiensemester - $studiensemesterRes = $this->StudiensemesterModel->getAkt(); + $studiensemesterRes = $this->StudiensemesterModel->getAktOrNextSemester(62); if (hasData($studiensemesterRes)) $this->_currentStudiensemester = getData($studiensemesterRes)[0]->studiensemester_kurzbz; // set fehler which can be produced by the job // structure: fehler_kurzbz => class (library) name for resolving - $this->_fehlerLibMappings = $this->plausicheckdefinitionlib->getFehlerLibMappings(); + $this->_fehlerKurzbz = $this->plausicheckdefinitionlib->getFehlerKurzbz(); } /** diff --git a/application/controllers/system/fehler/CLI_Manager.php b/application/controllers/system/fehler/CLI_Manager.php new file mode 100644 index 000000000..af3655233 --- /dev/null +++ b/application/controllers/system/fehler/CLI_Manager.php @@ -0,0 +1,57 @@ +. + */ + +if (!defined("BASEPATH")) exit("No direct script access allowed"); + +class CLI_Manager extends CLI_Controller +{ + /** + * + */ + public function __construct() + { + parent::__construct(); + + // Load libraries + $this->load->library('FehlerUpdateLib'); + } + + /** + * + */ + public function installAll() + { + $this->fehlerupdatelib->installAll(); + } + + /** + * + */ + public function installFromCore() + { + $this->fehlerupdatelib->installFromCore(); + } + + /** + * + */ + public function installFrom($extensionName) + { + $this->fehlerupdatelib->installFrom(urldecode($extensionName)); + } +} \ No newline at end of file diff --git a/application/controllers/system/fehler/Manager.php b/application/controllers/system/fehler/Manager.php new file mode 100644 index 000000000..832108dcf --- /dev/null +++ b/application/controllers/system/fehler/Manager.php @@ -0,0 +1,46 @@ + 'admin:rw', + 'installFromCore' => 'admin:rw' + ) + ); + + // Load libraries + $this->load->library('FehlerUpdateLib'); + } + + /** + * + */ + public function installAll() + { + $this->fehlerupdatelib->installAll(); + } + + /** + * + */ + public function installFromCore() + { + $this->fehlerupdatelib->installFromCore(); + } + + /** + * + */ + public function installFrom($fehlerConfigDirectory) + { + $this->fehlerupdatelib->installFrom($fehlerConfigDirectory); + } +} \ No newline at end of file diff --git a/application/controllers/system/issues/IssuesKonfiguration.php b/application/controllers/system/issues/IssuesKonfiguration.php index a19a2a93b..abd314dbd 100644 --- a/application/controllers/system/issues/IssuesKonfiguration.php +++ b/application/controllers/system/issues/IssuesKonfiguration.php @@ -88,9 +88,11 @@ class IssuesKonfiguration extends Auth_Controller // get all Fehler, optionally filtered by app $params = array('fehlercode_extern' => null); + $this->FehlerModel->addDistinct(); $this->FehlerModel->addSelect('fehlercode, fehler_kurzbz, fehlertyp_kurzbz, fehlertext'); + $this->FehlerModel->addJoin('system.tbl_fehler_app', 'fehlercode'); $this->FehlerModel->addOrder('fehlercode'); - if (!isEmptyString($app)) $params['app'] = $app; + if (!isEmptyString($app)) $params['tbl_fehler_app.app'] = $app; $fehlerRes = $this->FehlerModel->loadWhere($params); if (isError($fehlerRes)) $this->terminateWithJsonError($this->p->t('fehlermonitoring', 'fehlerFehlerLaden')); diff --git a/application/controllers/system/issues/IssuesZustaendigkeiten.php b/application/controllers/system/issues/IssuesZustaendigkeiten.php index d7bf9836e..cf343084d 100644 --- a/application/controllers/system/issues/IssuesZustaendigkeiten.php +++ b/application/controllers/system/issues/IssuesZustaendigkeiten.php @@ -69,10 +69,7 @@ class IssuesZustaendigkeiten extends Auth_Controller { $app = $this->input->get('app'); - $this->FehlerModel->addSelect('fehlercode, fehler_kurzbz, fehlertext, fehlertyp_kurzbz, app'); - $this->FehlerModel->addOrder('fehlercode'); - - $fehlerRes = isset($app) ? $this->FehlerModel->loadWhere(array('app' => $app)) : $this->FehlerModel->load(); + $fehlerRes = $this->FehlerModel->getByApps($app); $this->outputJson($fehlerRes); } diff --git a/application/controllers/system/issues/Plausichecks.php b/application/controllers/system/issues/Plausichecks.php index 1ee1869ce..b010d7bef 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', 'dvuh', 'bis']; public function __construct() { @@ -16,8 +17,7 @@ class Plausichecks extends Auth_Controller ); // Load libraries - $this->load->library('issues/PlausicheckProducerLib', array('app' => 'core')); - $this->load->library('issues/PlausicheckDefinitionLib'); + $this->load->library('issues/PlausicheckProducerLib', array('apps' => self::APPS)); $this->load->library('WidgetLib'); // Load models @@ -46,37 +46,31 @@ 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(); - $fehlerLibMappings = $this->plausicheckdefinitionlib->getFehlerLibMappings(); + + $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()); - - // get library name for producing issue - $libName = $fehlerLibMappings[$fehler_kurzbz]; + $allIssues[$fehler->fehler_kurzbz] = array('fehlercode' => $fehler->fehlercode, 'data' => array()); // execute the check $plausicheckRes = $this->plausicheckproducerlib->producePlausicheckIssue( - $libName, - $fehler_kurzbz, + $fehler->fehler_kurzbz, array( 'studiensemester_kurzbz' => $studiensemester_kurzbz, 'studiengang_kz' => $studiengang_kz @@ -107,7 +101,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); } @@ -118,7 +112,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 { @@ -157,7 +151,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(); @@ -168,7 +162,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/core/IssueResolver_Controller.php b/application/core/IssueResolver_Controller.php index ea278ddb0..6d7a8a197 100755 --- a/application/core/IssueResolver_Controller.php +++ b/application/core/IssueResolver_Controller.php @@ -5,11 +5,8 @@ */ abstract class IssueResolver_Controller extends JOB_Controller { - // mappings in form fehlercode -> resolverlibrary name, fehler which have explicit resolver class defined - protected $_codeLibMappings = []; - - // mappings in form fehlercode -> producer library name, fehler which are resolved the same way they are produced - protected $_codeProducerLibMappings = []; + // codes of fehler to be resolved + protected $_fehlercodes = []; public function __construct() { @@ -24,25 +21,18 @@ abstract class IssueResolver_Controller extends JOB_Controller */ public function run() { + // initialize librariy with provided fehlercodes $this->load->library( 'issues/PlausicheckResolverLib', [ - 'extensionName' => $this->_extensionName ?? null, - 'codeLibMappings' => $this->_codeLibMappings, - 'codeProducerLibMappings' => $this->_codeProducerLibMappings + 'fehlercodes' => $this->_fehlercodes ] ); $this->logInfo("Issue resolve job started"); - // load open issues with given errorcodes - $openIssuesRes = $this->IssueModel->getOpenIssues( - array_merge(array_keys($this->_codeLibMappings), array_keys($this->_codeProducerLibMappings)) - ); - - $openIssues = hasData($openIssuesRes) ? getData($openIssuesRes) : []; - - $result = $this->plausicheckresolverlib->resolvePlausicheckIssues($openIssues); + // resolve the issues + $result = $this->plausicheckresolverlib->resolvePlausicheckIssues(); // log if error, or log info if inserted new issue foreach ($result->errors as $error) $this->logError($error); diff --git a/application/core/PlausiIssueProducer_Controller.php b/application/core/PlausiIssueProducer_Controller.php index 5216d284c..41fc5aa76 100644 --- a/application/core/PlausiIssueProducer_Controller.php +++ b/application/core/PlausiIssueProducer_Controller.php @@ -5,14 +5,23 @@ */ abstract class PlausiIssueProducer_Controller extends JOB_Controller { - protected $_fehlerLibMappings = []; - protected $_app; + protected $_fehlerKurzbz = []; + protected $_apps = []; + + /** + * Runs issue production job. + */ + public function run() + { + // producing issues + $this->producePlausicheckIssues(array()); + } protected function producePlausicheckIssues($params) { $this->load->library( 'issues/PlausicheckProducerLib', - ['extensionName' => $this->_extensionName ?? null, 'app' => $this->_app, 'fehlerLibMappings' => $this->_fehlerLibMappings] + ['apps' => $this->_apps, 'fehlerKurzbz' => $this->_fehlerKurzbz] ); $this->logInfo("Plausicheck issue producer job started"); diff --git a/application/libraries/FehlerUpdateLib.php b/application/libraries/FehlerUpdateLib.php new file mode 100644 index 000000000..d8ae2ef68 --- /dev/null +++ b/application/libraries/FehlerUpdateLib.php @@ -0,0 +1,382 @@ +. + */ + +if (! defined('BASEPATH')) exit('No direct script access allowed'); + +class FehlerUpdateLib +{ + // Who adds phrases into the database + const UPSERT_BY = 'FehlerUpdate'; + + const CONFIG_DIRECTORY = 'config'; + const CONFIG_FEHLER_NAME = 'fehler'; + const CONFIG_FEHLER_INDEX = 'fehler'; + + const TYPE_STRING = 'string'; + const TYPE_ARRAY = 'array'; + + //~ // Array elements names + const FEHLERCODE = 'fehlercode'; + const FEHLER_KURZBZ = 'fehler_kurzbz'; + const FEHLERTEXT = 'fehlertext'; + const FEHLERTYP_KURZBZ = 'fehlertyp_kurzbz'; + const APP = 'app'; + const FEHLERCODE_EXTERN = 'fehlercode_extern'; + + // structure of a fehler + // type default: string + const FEHLER_ATTRIBUTES = [ + self::FEHLERCODE => ['required' => true], + self::FEHLER_KURZBZ => ['required' => false], + self::FEHLERTEXT => ['required' => true, 'updateable' => false], + self::FEHLERTYP_KURZBZ => ['required' => false, 'updateable' => true], + self::APP => ['required' => true, 'types' => [self::TYPE_STRING, self::TYPE_ARRAY]], + self::FEHLERCODE_EXTERN => ['required' => false] + ]; + + private $_ci; // Code igniter instance + private $_updateHistory = []; + + /** + * Loads parser library + */ + public function __construct() + { + $this->_ci =& get_instance(); + + // Loads EPrintfLib + $this->_ci->load->library('EPrintfLib'); + + // Loads the Models + $this->_ci->load->model('system/Fehler_model', 'FehlerModel'); + $this->_ci->load->model('system/App_model', 'AppModel'); + + // Loads extensions lib + $this->_ci->load->library('ExtensionsLib'); + } + + // ----------------------------------------------------------------------------------------------------------------- + // Public methods + + + /** + * Install all possible fehler, from core and extensions + */ + public function installAll() + { + $this->installFromCore(); + + // load fehler entries of extensions + $extensions = $this->_ci->extensionslib->getInstalledExtensions(); + + if (hasData($extensions)) + { + $extensionArray = array(); + + $extensionsData = getData($extensions); + + foreach ($extensionsData as $ext) + { + $this->installFrom($ext->name); + } + } + } + + /** + * Install fehler from the core + */ + public function installFromCore() + { + $this->_installFehler(); + } + + /** + * Install fehler from the given path + */ + public function installFrom($extensionName) + { + if (!isset($extensionName)) + { + $this->_ci->eprintflib->printError('Extension name missing!'); + return; + } + + $this->_installFehler(ExtensionsLib::EXTENSIONS_DIR_NAME.'/'.$extensionName.'/'.FehlerUpdateLib::CONFIG_FEHLER_NAME); + + } + + // ----------------------------------------------------------------------------------------------------------------- + // Private methods + + /** + * Install fehler from the given directory + */ + private function _installFehler($fehlerConfigDirectory = null) + { + // check that fehler config file exists + $configDir = isset($fehlerConfigDirectory) ? $fehlerConfigDirectory : self::CONFIG_FEHLER_NAME; + + $configFilename = APPPATH.self::CONFIG_DIRECTORY.'/'.$configDir.'.php'; + + if (!file_exists($configFilename)) + { + return; + } + + // Load Fehler Entries + $this->_ci->load->config($configDir); + $configArray = $this->_ci->config->item(self::CONFIG_FEHLER_INDEX); + + if (!isset($configArray) || !is_array($configArray)) // check if fehler config entries could be loaded + { + $this->_ci->eprintflib->printError( + 'Fehler config array could not be loaded, directory '.$configDir.' index '.self::CONFIG_FEHLER_INDEX + ); + return; + } + + $this->_ci->eprintflib->printInfo('------------------------------------------------------------------------------------------'); + $this->_ci->eprintflib->printInfo('Fehler installation started, directory '.$configDir); + + foreach ($configArray as $idx => $configEntry) + { + // create fehler from config entry + $createFehlerResult = $this->_createFehlerFromEntry($configEntry); + + // write error if creation failed + if (isError($createFehlerResult)) + { + $this->_ci->eprintflib->printError( + getError($createFehlerResult).', directory '.$configDir.', index '.$idx + ); + } + elseif (hasData($createFehlerResult)) + { + // add fehler to db + $addFehlerResult = $this->_updateFehler(getData($createFehlerResult)); + + if (isError($addFehlerResult)) + { + $this->_ci->eprintflib->printError( + getError($addFehlerResult).', directory'.$configDir.', index '.$idx + ); + } + } + } + + $this->_ci->eprintflib->printInfo('Fehler installation ended'); + $this->_ci->eprintflib->printInfo('------------------------------------------------------------------------------------------'); + } + + /** + * Add a new fehler to the database + */ + private function _updateFehler($fehler) + { + $fehlerReferences = $fehler['references']; + $fehler = $fehler['fehler']; + + // Checks if the fehler already exists in the database + $this->_ci->FehlerModel->db->where(self::FEHLERCODE.' = ', $fehler[self::FEHLERCODE]); + if (isset($fehler[self::FEHLER_KURZBZ]) && !isEmptyString($fehler[self::FEHLER_KURZBZ])) + $this->_ci->FehlerModel->db->or_where(self::FEHLER_KURZBZ.' = ', $fehler[self::FEHLER_KURZBZ]); + $fehlerResult = $this->_ci->FehlerModel->load(); + + // If an error occurred then return the error itself + if (isError($fehlerResult)) return $fehlerResult; + + $updateRes = null; + + // if fehler has been found + if (hasData($fehlerResult)) + { + $foundFehler = getData($fehlerResult)[0]; + + // check if fehlercode - fehler kurzbz combination is correct + if ($foundFehler->{self::FEHLERCODE} != $fehler[self::FEHLERCODE] + || $foundFehler->{self::FEHLER_KURZBZ} != ($fehler[self::FEHLER_KURZBZ] ?? null) + ) { + return error("Wrong fehlercode - fehler kurzbz combination: ".$fehler[self::FEHLERCODE].", ".$fehler[self::FEHLER_KURZBZ]); + } + + $this->_ci->eprintflib->printMessage( + "Fehler ".$fehler[self::FEHLERCODE] + .(isset($fehler[self::FEHLER_KURZBZ]) ? " (".$fehler[self::FEHLER_KURZBZ].")" : "") + ." already exists in database" + ); + + $updateArr = []; + + // update fehler, if needed + foreach (self::FEHLER_ATTRIBUTES as $attributeName => $attributeInfo) + { + // set attributes to be updated + if (isset($attributeInfo['updateable']) && $attributeInfo['updateable'] && $foundFehler->{$attributeName} != $fehler[$attributeName]) + { + $updateArr[$attributeName] = $fehler[$attributeName]; + + if (isset($this->_updateHistory[$foundFehler->{self::FEHLERCODE}][$attributeName]) + && $this->_updateHistory[$foundFehler->{self::FEHLERCODE}][$attributeName] != $fehler[$attributeName] + ) { + return error("Conflicting update values for attribute ".$attributeName.", fehler ".$foundFehler->{self::FEHLERCODE}); + } + $this->_updateHistory[$foundFehler->{self::FEHLERCODE}][$attributeName] = $fehler[$attributeName]; + } + } + + if (!isEmptyArray($updateArr)) + { + $updateRes = $this->_ci->FehlerModel->update( + [self::FEHLERCODE => $foundFehler->{self::FEHLERCODE}], + array_merge($updateArr, ['updateamum' => 'NOW()', 'updatevon' => self::UPSERT_BY]) + ); + if (isError($updateRes)) return $updateRes; + + $this->_ci->eprintflib->printMessage( + "Fehler ".$fehler[self::FEHLERCODE].(isset($fehler[self::FEHLER_KURZBZ]) ? " (".$fehler[self::FEHLER_KURZBZ].")" : "")." updated" + ); + } + } + else + { + // no fehler has been found + + // then add the fehler to the database + $updateRes = $this->_ci->FehlerModel->insert( + array_merge($fehler, ['insertamum' => 'NOW()', 'insertvon' => self::UPSERT_BY]) + ); + + // If an error occurred then return the error itself + if (isError($updateRes)) return $updateRes; + + // Prints info about the new added fehler + $this->_ci->eprintflib->printMessage( + sprintf( + 'A new fehler has been added into the database: '. + 'fehlercode => %s | fehler_kurzbz => %s | fehlertyp => %s', + $fehler[self::FEHLERCODE], + $fehler[self::FEHLER_KURZBZ], + $fehler[self::FEHLERTYP_KURZBZ] + ) + ); + } + + // handle references + if (isset($fehlerReferences[self::APP])) + { + $this->_ci->load->model('system/FehlerApp_model', 'FehlerAppModel'); + $apps = $fehlerReferences[self::APP]; + + // load all assigned apps + $this->_ci->FehlerAppModel->addSelect(self::APP); + $fehlerAppRes = $this->_ci->FehlerAppModel->loadWhere([self::FEHLERCODE => $fehler[self::FEHLERCODE]]); + + $fehlerApps = hasData($fehlerAppRes) ? array_column(getData($fehlerAppRes), self::APP) : []; + + $appsToInsert = array_diff($apps, $fehlerApps); + + foreach ($appsToInsert as $app) + { + // check if app exists in db + $fehlerAppsInsertRes = $this->_ci->FehlerAppModel->insert( + [self::FEHLERCODE => $fehler[self::FEHLERCODE], self::APP => $app, 'insertamum' => 'NOW()', 'insertvon' => self::UPSERT_BY] + ); + + if (isError($fehlerAppsInsertRes)) return $fehlerAppsInsertRes; + + $this->_ci->eprintflib->printMessage( + "Added app ".$app." to fehler ".$fehler[self::FEHLERCODE] + ); + } + } + + // If here then no blocking errors occurred + return success(); + } + + /** + * Create an array with fehler data from config entry + */ + private function _createFehlerFromEntry($configEntry) + { + $fehler = ['fehler' => [], 'references' => []]; + foreach (self::FEHLER_ATTRIBUTES as $attributeName => $attributeInfo) + { + $required = isset($attributeInfo['required']) && $attributeInfo['required']; + if (!isset($configEntry[$attributeName])) + { + if ($required) return error('attribute'.$attributeName.' is missing'); + continue; + } + + $attributeValue = $configEntry[$attributeName]; + $validType = false; + if (isset($attributeInfo['types']) && is_array($attributeInfo['types'])) + { + foreach ($attributeInfo['types'] as $type) + { + switch ($type) + { + case self::TYPE_STRING: + if (is_string($attributeValue) || is_null($attributeValue)) $validType = true; + break; + case self::TYPE_ARRAY: + if (is_array($attributeValue) && !($required && isEmptyArray($attributeValue))) $validType = true; + break; + //~ default: + //~ if (is_string($configEntry[$attributeName]) || is_null($configEntry[$attributeName])) $validType = true; + } + } + } + else + { + $validType = is_string($attributeValue) || is_null($attributeValue); + } + + if (!$validType) + { + return error('attribute'.$attributeName.' has invalid type'); + } + + if ($attributeName == self::APP) + { + if (is_string($attributeValue)) $attributeValue = [$attributeValue]; + + foreach ($attributeValue as $app) + { + // check if app exists in db + $this->_ci->AppModel->addSelect('1'); + $appRes = $this->_ci->AppModel->loadWhere(['app' => $app]); + + if (!hasData($appRes)) return error("App ".$app." does not exist"); + } + } + + if (isset($attributeInfo['types']) && is_array($attributeInfo['types']) && in_array(self::TYPE_ARRAY, $attributeInfo['types'])) + { + $fehler['references'][$attributeName] = $attributeValue; + } + else + { + $fehler['fehler'][$attributeName] = $attributeValue; + } + + } + return success($fehler); + } +} diff --git a/application/libraries/IssuesLib.php b/application/libraries/IssuesLib.php index f38303b3c..8e505bd83 100644 --- a/application/libraries/IssuesLib.php +++ b/application/libraries/IssuesLib.php @@ -20,6 +20,10 @@ class IssuesLib const ERRORTYPE_CODE = 'error'; const WARNINGTYPE_CODE = 'warning'; + const STATUS_KURZBZ = 'status_kurzbz'; + const VERARBEITET_AMUM = 'verarbeitetamum'; + const VERARBEITET_VON = 'verarbeitetvon'; + public function __construct($params = null) { $this->_ci =& get_instance(); @@ -91,12 +95,16 @@ class IssuesLib return error("fehlercode_extern missing"); // get external fehlercode (unique for each app) - $this->_ci->FehlerModel->addSelect('fehlercode'); - $fehlerRes = $this->_ci->FehlerModel->loadWhere( - array( - 'fehlercode_extern' => $fehlercode_extern, - 'app' => $this->_app - ) + $fehlerRes = $this->_ci->FehlerModel->execReadOnlyQuery( + ' + SELECT + fehlercode + FROM + system.tbl_fehler fe + WHERE + fehlercode_extern = ? + AND EXISTS (SELECT 1 FROM system.tbl_fehler_app WHERE fehlercode = fe.fehlercode AND app = ?)', + [$fehlercode_extern, $this->_app] ); if (isError($fehlerRes)) @@ -105,8 +113,10 @@ class IssuesLib // check if there is a predefined custom error for the external issue if (hasData($fehlerRes)) { - $fehlerData = getData($fehlerRes)[0]; // if found, use the code + $fehlerData = getData($fehlerRes); + if (count($fehlerData) > 1) return error("Multiple fehlercode_extern ".$fehlercode_extern. " for app ".$this->_app); + $fehlerData = getData($fehlerRes)[0]; $fehlercode = $fehlerData->fehlercode; } else @@ -128,9 +138,9 @@ class IssuesLib public function setBehoben($issue_id, $user) { $data = array( - 'status_kurzbz' => self::STATUS_BEHOBEN, - 'verarbeitetvon' => $user, - 'verarbeitetamum' => date('Y-m-d H:i:s') + self::STATUS_KURZBZ => self::STATUS_BEHOBEN, + self::VERARBEITET_VON => $user, + self::VERARBEITET_AMUM => date('Y-m-d H:i:s') ); return $this->_changeIssueStatus($issue_id, $data, $user); @@ -145,8 +155,8 @@ class IssuesLib public function setInBearbeitung($issue_id, $user) { $data = array( - 'status_kurzbz' => self::STATUS_IN_BEARBEITUNG, - 'verarbeitetvon' => $user + self::STATUS_KURZBZ => self::STATUS_IN_BEARBEITUNG, + self::VERARBEITET_VON => $user ); return $this->_changeIssueStatus($issue_id, $data, $user); @@ -161,9 +171,9 @@ class IssuesLib public function setNeu($issue_id, $user) { $data = array( - 'status_kurzbz' => self::STATUS_NEU, - 'verarbeitetvon' => null, - 'verarbeitetamum' => null + self::STATUS_KURZBZ => self::STATUS_NEU, + self::VERARBEITET_VON => null, + self::VERARBEITET_AMUM => null ); return $this->_changeIssueStatus($issue_id, $data, $user); @@ -185,13 +195,18 @@ class IssuesLib return error("Issue Id must be set correctly."); // check if given status is same as existing - $this->_ci->IssueModel->addSelect('status_kurzbz'); + $this->_ci->IssueModel->addSelect(self::STATUS_KURZBZ.', '.self::VERARBEITET_AMUM); $currStatus = $this->_ci->IssueModel->load($issue_id); if (hasData($currStatus)) { - if (getData($currStatus)[0]->status_kurzbz == $data['status_kurzbz']) + $currStatusData = getData($currStatus)[0]; + // if same status set, and verarbeitet amum is not being newly set + if ($currStatusData->{self::STATUS_KURZBZ} == $data[self::STATUS_KURZBZ] + && !(isset($data[self::VERARBEITET_AMUM]) && !isset($currStatusData->{self::VERARBEITET_AMUM})) + ) { return success("Same status already set"); + } } else return error("Error when getting status"); @@ -228,10 +243,10 @@ class IssuesLib $inhalt_extern = null ) { if (isEmptyString($person_id) && isEmptyString($oe_kurzbz)) - return error("Person_id or oe_kurzbz must be set."); + return error("Person_id or oe_kurzbz must be set, fehlercode: $fehlercode"); // get fehlertextVorlage and replace it with params - $fehlerRes = $this->_ci->FehlerModel->load($fehlercode); + $fehlerRes = $this->_ci->FehlerModel->loadWhere(['fehlercode' => $fehlercode]); if (hasData($fehlerRes)) { @@ -241,7 +256,7 @@ class IssuesLib if (!isEmptyArray($fehlertext_params)) { if (count($fehlertext_params) != substr_count($fehlertextVorlage, '%s')) - return error('Wrong number of parameters for Fehlertext, fehler_kurzbz ' . $fehlercode); + return error('Wrong number of parameters for Fehlertext, fehlercode ' . $fehlercode); $fehlertext = vsprintf($fehlertextVorlage, $fehlertext_params); } diff --git a/application/libraries/issues/PlausicheckDefinitionLib.php b/application/libraries/issues/PlausicheckDefinitionLib.php index 327659e11..24c7a50c2 100644 --- a/application/libraries/issues/PlausicheckDefinitionLib.php +++ b/application/libraries/issues/PlausicheckDefinitionLib.php @@ -9,53 +9,45 @@ class PlausicheckDefinitionLib { // set fehler for core plausichecks // structure: fehler_kurzbz => class (library) name for resolving - private $_fehlerLibMappings = array( - 'AbbrecherAktiv' => 'AbbrecherAktiv', - 'AbschlussstatusFehlt' => 'AbschlussstatusFehlt', - 'AbschlusspruefungOderAbsolventFehlt' => 'AbschlusspruefungOderAbsolventFehlt', - 'AktSemesterNull' => 'AktSemesterNull', - 'AktiverStudentOhneStatus' => 'AktiverStudentOhneStatus', - 'AusbildungssemPrestudentUngleichAusbildungssemStatus' => 'AusbildungssemPrestudentUngleichAusbildungssemStatus', - 'DatumAbschlusspruefungFehlt' => 'DatumAbschlusspruefungFehlt', - 'DatumSponsionFehlt' => 'DatumSponsionFehlt', - 'DatumStudiensemesterFalscheReihenfolge' => 'DatumStudiensemesterFalscheReihenfolge', - 'DualesStudiumOhneMarkierung' => 'DualesStudiumOhneMarkierung', - 'FalscheAnzahlAbschlusspruefungen' => 'FalscheAnzahlAbschlusspruefungen', - 'FalscheAnzahlHeimatadressen' => 'FalscheAnzahlHeimatadressen', - 'FalscheAnzahlZustelladressen' => 'FalscheAnzahlZustelladressen', - 'FalscheStatusabfolgeVorStudentstatus' => 'FalscheStatusabfolgeVorStudentstatus', - 'GbDatumWeitZurueck' => 'GbDatumWeitZurueck', - 'InaktiverStudentAktiverStatus' => 'InaktiverStudentAktiverStatus', - 'IncomingHeimatNationOesterreich' => 'IncomingHeimatNationOesterreich', - 'IncomingOhneIoDatensatz' => 'IncomingOhneIoDatensatz', - 'IncomingOrGsFoerderrelevant' => 'IncomingOrGsFoerderrelevant', - 'InskriptionVorLetzerBismeldung' => 'InskriptionVorLetzerBismeldung', - 'NationNichtOesterreichAberGemeinde' => 'NationNichtOesterreichAberGemeinde', - 'OrgformBewerberUngleichOrgformStudent' => 'OrgformBewerberUngleichOrgformStudent', - 'OrgformStgUngleichOrgformPrestudent' => 'OrgformStgUngleichOrgformPrestudent', - 'PrestudentMischformOhneOrgform' => 'PrestudentMischformOhneOrgform', - 'StartsemesterUngleichPersonenkennzeichen' => 'StartsemesterUngleichPersonenkennzeichen', - 'StgPrestudentUngleichStgStudienplan' => 'StgPrestudentUngleichStgStudienplan', - 'StgPrestudentUngleichStgStudent' => 'StgPrestudentUngleichStgStudent', - 'StudentstatusNachDiplomand' => 'StudentstatusNachDiplomand', - 'StudentstatusNachAbbrecher' => 'StudentstatusNachAbbrecher' - //'StudienplanUngueltig' => 'StudienplanUngueltig' - //'BewerberNichtZumRtAngetreten' => 'BewerberNichtZumRtAngetreten' + private $_fehlerKurzbz = array( + 'AbbrecherAktiv', + 'AbschlussstatusFehlt', + 'AbschlusspruefungOderAbsolventFehlt', + 'AktSemesterNull', + 'AktiverStudentOhneStatus', + 'AusbildungssemPrestudentUngleichAusbildungssemStatus', + 'DatumAbschlusspruefungFehlt', + 'DatumSponsionFehlt', + 'DatumStudiensemesterFalscheReihenfolge', + 'FalscheAnzahlAbschlusspruefungen', + 'FalscheAnzahlHeimatadressen', + 'FalscheAnzahlZustelladressen', + 'FalscheStatusabfolgeVorStudentstatus', + 'GbDatumWeitZurueck', + 'InaktiverStudentAktiverStatus', + 'IncomingHeimatNationOesterreich', + 'IncomingOhneIoDatensatz', + 'IncomingOrGsFoerderrelevant', + 'InskriptionVorLetzerBismeldung', + 'NationNichtOesterreichAberGemeinde', + 'OrgformBewerberUngleichOrgformStudent', + 'OrgformStgUngleichOrgformPrestudent', + 'PrestudentMischformOhneOrgform', + 'StartsemesterUngleichPersonenkennzeichen', + 'StgPrestudentUngleichStgStudienplan', + 'StgPrestudentUngleichStgStudent', + 'StudentstatusNachDiplomand', + 'StudentstatusNachAbbrecher', + 'DualesStudiumOhneMarkierung' + //'StudienplanUngueltig' + //'BewerberNichtZumRtAngetreten' ); - /** - * Gets all fehler_kurzbz-library mappings for fehler which need to be checked. - */ - public function getFehlerLibMappings() - { - return $this->_fehlerLibMappings; - } - /** * Gets all fehler_kurzbz for fehler which need to be checked. */ public function getFehlerKurzbz() { - return array_keys($this->_fehlerLibMappings); + return $this->_fehlerKurzbz; } } diff --git a/application/libraries/issues/PlausicheckProducerLib.php b/application/libraries/issues/PlausicheckProducerLib.php index cea9967fb..02cdaa582 100644 --- a/application/libraries/issues/PlausicheckProducerLib.php +++ b/application/libraries/issues/PlausicheckProducerLib.php @@ -6,36 +6,43 @@ class PlausicheckProducerLib { const CI_PATH = 'application'; const CI_LIBRARY_FOLDER = 'libraries'; - const EXTENSIONS_FOLDER = 'extensions'; const PLAUSI_ISSUES_FOLDER = 'issues/plausichecks'; const EXECUTE_PLAUSI_CHECK_METHOD_NAME = 'executePlausiCheck'; + const CONFIG_FEHLER_NAME = 'fehler'; + const CONFIG_FEHLER_INDEX = 'fehler'; + const FEHLER_KURZBZ_NAME = 'fehler_kurzbz'; + const PRODUCER_LIB_NAME = 'producerLibName'; + const EXTENSION_NAME = 'extensionName'; private $_ci; // ci instance - private $_extensionName; // name of extension private $_konfiguration = []; // configuration parameters + private $_fehlerKurzbz = []; // fehler to produce private $_fehlerLibMappings = []; // mappings of fehler and libraries for producing them - private $_isForResolutionCheck = false; // mappings of fehler and libraries for producing them + private $_apps = []; // apps of fehler to produce public function __construct($params = null) { - // set extension name if called from extension - if (isset($params['extensionName'])) $this->_extensionName = $params['extensionName']; - if (isset($params['fehlerLibMappings'])) $this->_fehlerLibMappings = $params['fehlerLibMappings']; - if (isset($params['isForResolutionCheck'])) $this->_isForResolutionCheck = $params['isForResolutionCheck']; - - // set application - $app = isset($params['app']) ? $params['app'] : null; + // set application(s)) + if (isset($params['apps'])) + { + if (is_string($params['apps'])) $params['apps'] = [$params['apps']]; + if (is_array($params['apps'])) $this->_apps = $params['apps']; + } $this->_ci =& get_instance(); // get ci instance // load libraries $this->_ci->load->library('IssuesLib'); + $this->_ci->load->library('ExtensionsLib'); // load models + $this->_ci->load->model('system/Fehler_model', 'FehlerModel'); $this->_ci->load->model('system/Fehlerkonfiguration_model', 'FehlerkonfigurationModel'); - // get all configuration parameters for the application - $fehlerkonfigurationRes = $this->_ci->FehlerkonfigurationModel->getKonfiguration($app); + $this->_ci->load->config(self::CONFIG_FEHLER_NAME); + + // get all configuration parameters for the application(s)) + $fehlerkonfigurationRes = $this->_ci->FehlerkonfigurationModel->getKonfiguration($this->_apps); if (hasData($fehlerkonfigurationRes)) { @@ -46,10 +53,88 @@ class PlausicheckProducerLib $this->_konfiguration[$fk->fehler_kurzbz][$fk->konfigurationstyp_kurzbz] = $fk->konfiguration; } } + + // get all fehler to be produced (by kurzbz array or app) + if (isset($params['fehlerKurzbz']) && !isEmptyArray($params['fehlerKurzbz'])) + { + $this->_fehlerKurzbz = $params['fehlerKurzbz']; + } + else + { + // get fehler by apps + $fehlerRes = $this->_ci->FehlerModel->getByApps($this->_apps); + + if (hasData($fehlerRes)) $this->_fehlerKurzbz = array_column(getData($fehlerRes), 'fehler_kurzbz'); + } + + // get producer file paths for the fehler + + // Load Fehler Entries of Core + $configArray = $this->_ci->config->item(self::CONFIG_FEHLER_INDEX); + + if (isset($configArray) && is_array($configArray)) + { + foreach ($configArray as $coreEntry) + { + if (!isset($coreEntry[self::FEHLER_KURZBZ_NAME]) + || !isset($coreEntry[self::PRODUCER_LIB_NAME]) + || !in_array($coreEntry[self::FEHLER_KURZBZ_NAME], $this->_fehlerKurzbz) + ) { + continue; + } + + $this->_fehlerLibMappings[$coreEntry[self::FEHLER_KURZBZ_NAME]][self::PRODUCER_LIB_NAME] = $coreEntry[self::PRODUCER_LIB_NAME]; + } + } + + // load fehler entries of extensions + $extensions = $this->_ci->extensionslib->getInstalledExtensions(); + + if (hasData($extensions)) + { + $extensionArray = array(); + + $extensionsData = getData($extensions); + + foreach ($extensionsData as $ext) + { + $configFilePath = ExtensionsLib::EXTENSIONS_DIR_NAME.'/'.$ext->name.'/'.self::CONFIG_FEHLER_NAME.'.php'; + $configFilename = APPPATH.'config/'.$configFilePath; + + // if fehler config file exists in extension + if (file_exists($configFilename)) + { + $config = array(); // default value + + // include the config file + include($configFilename); + + if (isset($config[self::CONFIG_FEHLER_NAME]) && is_array($config[self::CONFIG_FEHLER_NAME])) + { + foreach ($config[self::CONFIG_FEHLER_NAME] as $extensionEntry) + { + if ( + !isset($extensionEntry[self::FEHLER_KURZBZ_NAME]) + || !isset($extensionEntry[self::PRODUCER_LIB_NAME]) + || !in_array($extensionEntry[self::FEHLER_KURZBZ_NAME], $this->_fehlerKurzbz) + ) { + continue; + } + + // add extension config data to fehler lib mappings + $fehler_kurzbz = $extensionEntry[self::FEHLER_KURZBZ_NAME]; + + $this->_fehlerLibMappings[$fehler_kurzbz][self::PRODUCER_LIB_NAME] = $extensionEntry[self::PRODUCER_LIB_NAME]; + $this->_fehlerLibMappings[$fehler_kurzbz][self::EXTENSION_NAME] = $ext->name; + } + } + } + } + } } /** - * Produces multiple plausicheck issues at once and saved them to db. + * Produces multiple plausicheck issues at once, and saves them in the database. * @param array $params passed to each plausicheck * @return result object with occured error and info */ @@ -59,10 +144,17 @@ class PlausicheckProducerLib $result->errors = []; $result->infos = []; - foreach ($this->_fehlerLibMappings as $fehler_kurzbz => $libName) + $mappingFehlerKurbz = array_keys($this->_fehlerLibMappings); + + // check if all issues to produce could be found in database + //~ $notFoundFehlerKurzbz = array_diff($this->_fehlerKurzbz, $mappingFehlerKurbz); + + //~ if (!isEmptyArray($notFoundFehlerKurzbz)) + //~ $result->errors[] = error('Fehler to produce not defined in config: '.implode(', ', $notFoundFehlerKurzbz)); + + foreach ($mappingFehlerKurbz as $fehler_kurzbz) { $plausicheckRes = $this->producePlausicheckIssue( - $libName, $fehler_kurzbz, $params ); @@ -96,14 +188,23 @@ class PlausicheckProducerLib /** * Executes plausicheck using a given library, returns the result. - * @param $libName string name of library producing the issue * @param $fehler_kurzbz string unique short name of fehler, for which issue is produced * @param $params parameters passed to issue production method */ - public function producePlausicheckIssue($libName, $fehler_kurzbz, $params) + 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 success(null); + + $mapping = $this->_fehlerLibMappings[$fehler_kurzbz]; + + if (!isset($mapping[self::PRODUCER_LIB_NAME]) || isEmptyString($mapping[self::PRODUCER_LIB_NAME])) + return error("No producer lib name set for Fehler " . $fehler_kurzbz); + + $libName = $mapping[self::PRODUCER_LIB_NAME]; + // if called from extension (extension name set), path includes extension names - $libRootPath = isset($this->_extensionName) ? self::EXTENSIONS_FOLDER . '/' . $this->_extensionName . '/' : ''; + $libRootPath = isset($mapping[self::EXTENSION_NAME]) ? ExtensionsLib::EXTENSIONS_DIR_NAME . '/' . $mapping[self::EXTENSION_NAME] . '/' : ''; // path for loading issue library $issuesLibPath = $libRootPath . self::PLAUSI_ISSUES_FOLDER . '/'; @@ -121,7 +222,7 @@ class PlausicheckProducerLib // load library connected to fehlercode $this->_ci->load->library( $issuesLibPath . $libName, - ['configurationParams' => $config, 'isForResolutionCheck' => $this->_isForResolutionCheck] + ['configurationParams' => $config] ); $lowercaseLibName = mb_strtolower($libName); @@ -133,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/PlausicheckResolverLib.php b/application/libraries/issues/PlausicheckResolverLib.php index 2b20a7d93..af7d58c8f 100644 --- a/application/libraries/issues/PlausicheckResolverLib.php +++ b/application/libraries/issues/PlausicheckResolverLib.php @@ -9,43 +9,177 @@ class PlausicheckResolverLib const EXTENSIONS_FOLDER = 'extensions'; const ISSUE_RESOLVERS_FOLDER = 'issues/resolvers'; const CHECK_ISSUE_RESOLVED_METHOD_NAME = 'checkIfIssueIsResolved'; + const CONFIG_FEHLER_NAME = 'fehler'; + const FEHLERCODE_NAME = 'fehlercode'; + const FEHLER_KURZBZ_NAME = 'fehler_kurzbz'; + const RESOLVER_LIB_NAME = 'resolverLibName'; + const PRODUCER_IS_RESOLVER_NAME = 'producerIsResolver'; + const EXTENSION_NAME = 'extensionName'; + private $_ci; // ci instance private $_extensionName; // name of extension + private $_fehlercodes = []; // fehlercodes to resolve + private $_apps = []; // apps for which issues should be resolved private $_codeLibMappings = []; // mappings for issues which explicitly defined resolver - private $_codeProducerLibMappings = []; // mappings for issues which are resolved with the same check as they are produced + private $_defaultIssueParams = ['issue_id' => 'issue_id', 'issue_person_id' => 'person_id', 'issue_oe_kurzbz' => 'oe_kurzbz']; public function __construct($params = null) { - // set extension name if called from extension - if (isset($params['extensionName'])) $this->_extensionName = $params['extensionName']; - if (isset($params['codeLibMappings'])) $this->_codeLibMappings = $params['codeLibMappings']; - if (isset($params['codeProducerLibMappings'])) $this->_codeProducerLibMappings = $params['codeProducerLibMappings']; + // set application(s)) + if (isset($params['apps'])) + { + if (is_string($params['apps'])) $params['apps'] = [$params['apps']]; + if (is_array($params['apps'])) $this->_apps = $params['apps']; + } $this->_ci =& get_instance(); // get ci instance + // get all fehler to be produced (by kurzbz array or app) + if (isset($params['fehlercodes']) && !isEmptyArray($params['fehlercodes'])) + { + $this->_fehlercodes = $params['fehlercodes']; + } + elseif (isset($params['apps']) && !isEmptyArray($params['apps'])) + { + $this->_ci->load->model('system/Fehler_model', 'FehlerModel'); + $fehlerRes = $this->_ci->FehlerModel->getByApps($this->_apps); + + if (hasData($fehlerRes)) + { + $this->_fehlercodes = array_column(getData($fehlerRes), 'fehlercode'); + } + } + $this->_ci->load->library('IssuesLib'); - $this->_ci->load->library('issues/PlausicheckProducerLib', ['extensionName' => $this->_extensionName, 'isForResolutionCheck' => true]); + $this->_ci->load->library('ExtensionsLib'); + + $this->_ci->load->config('fehler'); + + // Load Fehler Entries of Core + $configArray = $this->_ci->config->item(self::CONFIG_FEHLER_NAME); + + foreach ($configArray as $coreEntry) + { + // each entry must have fehlercode + if (!isset($coreEntry[self::FEHLERCODE_NAME]) + || !in_array($coreEntry[self::FEHLERCODE_NAME], $this->_fehlercodes) + ) { + continue; + } + + // fill code lib mappings with needed values + $fehlercode = $coreEntry[self::FEHLERCODE_NAME]; + + if (isset($coreEntry[self::FEHLER_KURZBZ_NAME])) + $this->_codeLibMappings[$fehlercode][self::FEHLER_KURZBZ_NAME] = $coreEntry[self::FEHLER_KURZBZ_NAME]; + + $this->_codeLibMappings[$fehlercode][self::RESOLVER_LIB_NAME] = $coreEntry[self::RESOLVER_LIB_NAME] ?? null; + $this->_codeLibMappings[$fehlercode][self::PRODUCER_IS_RESOLVER_NAME] + = $coreEntry[self::PRODUCER_IS_RESOLVER_NAME] ?? false; + } + + // load fehler entries of extensions + $extensions = $this->_ci->extensionslib->getInstalledExtensions(); + + if (hasData($extensions)) + { + $extensionArray = array(); + + $extensionsData = getData($extensions); + + foreach ($extensionsData as $ext) + { + $configFilename = APPPATH.'config/'.ExtensionsLib::EXTENSIONS_DIR_NAME.'/'.$ext->name.'/'.self::CONFIG_FEHLER_NAME.'.php'; + + // if fehler config file exists in teh extension + if (file_exists($configFilename)) + { + $config = array(); // default value + + // include config data + include($configFilename); + + if (isset($config[self::CONFIG_FEHLER_NAME]) && is_array($config[self::CONFIG_FEHLER_NAME])) + { + foreach ($config[self::CONFIG_FEHLER_NAME] as $extensionEntry) + { + if ( + !isset($extensionEntry[self::FEHLERCODE_NAME]) + || !in_array($extensionEntry[self::FEHLERCODE_NAME], $this->_fehlercodes) + ) { + continue; + } + + // add extension config data to fehlercode lib mappings + $fehlercode = $extensionEntry[self::FEHLERCODE_NAME]; + if (isset($extensionEntry[self::FEHLER_KURZBZ_NAME])) + $this->_codeLibMappings[$fehlercode][self::FEHLER_KURZBZ_NAME] = $extensionEntry[self::FEHLER_KURZBZ_NAME]; + + $this->_codeLibMappings[$fehlercode][self::RESOLVER_LIB_NAME] + = $extensionEntry[self::RESOLVER_LIB_NAME] ?? null; + $this->_codeLibMappings[$fehlercode][self::EXTENSION_NAME] = $ext->name; + $this->_codeLibMappings[$fehlercode][self::PRODUCER_IS_RESOLVER_NAME] + = $extensionEntry[self::PRODUCER_IS_RESOLVER_NAME] ?? false; + } + } + } + } + } } /** * Reseolves multiple plausicheck issues at once. - * @param array $codeLibMappings contains fehler type to check and library responsible for check (fehlercode => libName) - * @param array $openIssues passed issues to resolve + * @param array $openIssues passed issues to resolve. If null, issues with fehlercodes in _fehlercodes property are loaded * @return result object with occured error and info */ - public function resolvePlausicheckIssues($openIssues) + public function resolvePlausicheckIssues($openIssues = null) { + // loading producer lib with fehler kurzbz of provided code mappings, for "self resolving" issues + $this->_ci->load->library( + 'issues/PlausicheckProducerLib', + ['fehlerKurzbz' => array_column($this->_codeLibMappings, self::FEHLER_KURZBZ_NAME)], 'PlausicheckResolverProducerLib' + ); + + if (!isset($openIssues)) + { + if (!isEmptyArray($this->_fehlercodes)) + { + $this->_ci->load->model('system/Issue_model', 'IssueModel'); + + // load open issues with given errorcodes + $openIssuesRes = $this->_ci->IssueModel->getOpenIssues( + $this->_fehlercodes + ); + + $openIssues = hasData($openIssuesRes) ? getData($openIssuesRes) : []; + } + } + + $result = new StdClass(); $result->errors = []; $result->infos = []; + // check if all issues to resolve could be found in database + //~ $mappingFehlerCodes = array_keys($this->_codeLibMappings); + //~ $notFoundFehlerCodes = array_diff($this->_fehlercodes, $mappingFehlerCodes); + + //~ if (!isEmptyArray($notFoundFehlerCodes)) + //~ $result->errors[] = error('Fehler to resolve not defined in config: '.implode(', ', $notFoundFehlerCodes)); + foreach ($openIssues as $issue) { + $params = []; + foreach ($this->_defaultIssueParams as $index => $propertyName) + { + $params[$index] = $issue->{$propertyName}; + } + // add person id and oe kurzbz automatically as params, merge it with additional params // decode bewerbung_parameter into assoc array $params = array_merge( - array('issue_id' => $issue->issue_id, 'issue_person_id' => $issue->person_id, 'issue_oe_kurzbz' => $issue->oe_kurzbz), + $params, isset($issue->behebung_parameter) ? json_decode($issue->behebung_parameter, true) : array() ); @@ -54,69 +188,72 @@ class PlausicheckResolverLib // ignore if Fehlercode is not in libmappings (shouldn't be checked) if (isset($this->_codeLibMappings[$issue->fehlercode])) { - $libName = $this->_codeLibMappings[$issue->fehlercode]; + $codeLibMapping = $this->_codeLibMappings[$issue->fehlercode]; + $libName = $codeLibMapping[self::RESOLVER_LIB_NAME] ?? null; + $extensionName = $codeLibMapping[self::EXTENSION_NAME] ?? null; + $producerIsResolver = $codeLibMapping[self::PRODUCER_IS_RESOLVER_NAME] ?? false; - // if called from extension (extension name set), path includes extension names - $libRootPath = isset($this->_extensionName) ? self::EXTENSIONS_FOLDER . '/' . $this->_extensionName . '/' : ''; - - // path for loading issue library - $issuesLibPath = $libRootPath . self::ISSUE_RESOLVERS_FOLDER . '/'; - - // file path of library for check if file exists - $issuesLibFilePath = DOC_ROOT . self::CI_PATH - . '/' . $libRootPath . self::CI_LIBRARY_FOLDER . '/' . self::ISSUE_RESOLVERS_FOLDER . '/' . $libName . '.php'; - - // check if library file exists - if (!file_exists($issuesLibFilePath)) + if ($producerIsResolver) { - // log error and continue with next issue if not - $result->errors[] = "Issue library file " . $issuesLibFilePath . " does not exist"; - continue; - } + // execute same check as used for issue production + $issueResolvedRes = $this->_ci->PlausicheckResolverProducerLib->producePlausicheckIssue( + $issue->fehler_kurzbz, + $params + ); - // load library connected to fehlercode - $this->_ci->load->library($issuesLibPath . $libName); - - $lowercaseLibName = mb_strtolower($libName); - - // check if method is defined in library class - if (!is_callable(array($this->_ci->{$lowercaseLibName}, self::CHECK_ISSUE_RESOLVED_METHOD_NAME))) - { - // log error and continue with next issue if not - $result->errors[] = "Method " . self::CHECK_ISSUE_RESOLVED_METHOD_NAME . " is not defined in library $lowercaseLibName"; - continue; - } - - // call the function for checking for issue resolution - $issueResolvedRes = $this->_ci->{$lowercaseLibName}->{self::CHECK_ISSUE_RESOLVED_METHOD_NAME}($params); - - if (isError($issueResolvedRes)) - { - $result->errors[] = getError($issueResolvedRes); + if (isError($issueResolvedRes)) + { + $result->errors[] = getError($issueResolvedRes); + } + else + { + $issueResolved = !hasData($issueResolvedRes); + } } else { - $issueResolved = getData($issueResolvedRes) === true; - } - } - elseif (isset($this->_codeProducerLibMappings[$issue->fehlercode])) // check if it is an issue without explicit resolver, "self-resolving" - { - $libName = $this->_codeProducerLibMappings[$issue->fehlercode]; + // if called from extension (extension name set), path includes extension names + $libRootPath = isset($extensionName) ? self::EXTENSIONS_FOLDER . '/' . $extensionName . '/' : ''; - // execute same check as used for issue production - $issueResolvedRes = $this->_ci->plausicheckproducerlib->producePlausicheckIssue( - $libName, - $issue->fehler_kurzbz, - $params - ); + // path for loading issue library + $issuesLibPath = $libRootPath . self::ISSUE_RESOLVERS_FOLDER . '/'; - if (isError($issueResolvedRes)) - { - $result->errors[] = getError($issueResolvedRes); - } - else - { - $issueResolved = !hasData($issueResolvedRes); + // file path of library for check if file exists + $issuesLibFilePath = DOC_ROOT . self::CI_PATH + . '/' . $libRootPath . self::CI_LIBRARY_FOLDER . '/' . self::ISSUE_RESOLVERS_FOLDER . '/' . $libName . '.php'; + + // check if library file exists + if (!file_exists($issuesLibFilePath)) + { + // log error and continue with next issue if not + $result->errors[] = "Issue library file " . $issuesLibFilePath . " does not exist"; + continue; + } + + // load library connected to fehlercode + $this->_ci->load->library($issuesLibPath . $libName); + + $lowercaseLibName = mb_strtolower($libName); + + // check if method is defined in library class + if (!is_callable(array($this->_ci->{$lowercaseLibName}, self::CHECK_ISSUE_RESOLVED_METHOD_NAME))) + { + // log error and continue with next issue if not + $result->errors[] = "Method " . self::CHECK_ISSUE_RESOLVED_METHOD_NAME . " is not defined in library $lowercaseLibName"; + continue; + } + + // call the function for checking for issue resolution + $issueResolvedRes = $this->_ci->{$lowercaseLibName}->{self::CHECK_ISSUE_RESOLVED_METHOD_NAME}($params); + + if (isError($issueResolvedRes)) + { + $result->errors[] = getError($issueResolvedRes); + } + else + { + $issueResolved = getData($issueResolvedRes) === true; + } } } diff --git a/application/libraries/issues/plausichecks/AbbrecherAktiv.php b/application/libraries/issues/plausichecks/AbbrecherAktiv.php index 464b77a30..dea7aae9b 100644 --- a/application/libraries/issues/plausichecks/AbbrecherAktiv.php +++ b/application/libraries/issues/plausichecks/AbbrecherAktiv.php @@ -23,7 +23,11 @@ class AbbrecherAktiv extends PlausiChecker AND benutzer.aktiv=true"; protected $_config_params = ['exkludierteStudiengaenge' => " AND stg.studiengang_kz NOT IN ?"]; - protected $_params_for_checking = ['studiengang_kz' => " AND stg.studiengang_kz = ?", 'prestudent_id' => " AND pre.prestudent_id = ?"]; + protected $_params_for_checking = [ + 'studiengang_kz' => " AND stg.studiengang_kz = ?", + 'prestudent_id' => " AND pre.prestudent_id = ?", + 'person_id' => " AND pre.person_id = ?" + ]; protected $_fehlertext_params = ['prestudent_id']; protected $_resolution_params = ['prestudent_id']; } diff --git a/application/libraries/issues/plausichecks/AbschlussstatusFehlt.php b/application/libraries/issues/plausichecks/AbschlussstatusFehlt.php index 3890e91c7..de27a8659 100644 --- a/application/libraries/issues/plausichecks/AbschlussstatusFehlt.php +++ b/application/libraries/issues/plausichecks/AbschlussstatusFehlt.php @@ -19,12 +19,14 @@ class AbschlussstatusFehlt extends PlausiChecker // 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->getAbschlussstatusFehlt( $studiensemester_kurzbz, $studiengang_kz, null, + $person_id, $exkludierte_studiengang_kz ); @@ -55,6 +57,7 @@ class AbschlussstatusFehlt extends PlausiChecker * @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 person_id int if check is to be executed only for one person * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check * @return success with prestudents or error */ @@ -62,6 +65,7 @@ class AbschlussstatusFehlt extends PlausiChecker $studiensemester_kurzbz = null, $studiengang_kz = null, $prestudent_id = null, + $person_id = null, $exkludierte_studiengang_kz = null ) { $params = array(); @@ -135,6 +139,12 @@ class AbschlussstatusFehlt extends PlausiChecker $params[] = $prestudent_id; } + 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 ?"; diff --git a/application/libraries/issues/plausichecks/AktSemesterNull.php b/application/libraries/issues/plausichecks/AktSemesterNull.php index 1223a2720..48d97c62b 100644 --- a/application/libraries/issues/plausichecks/AktSemesterNull.php +++ b/application/libraries/issues/plausichecks/AktSemesterNull.php @@ -19,9 +19,10 @@ class AktSemesterNull extends PlausiChecker // 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->getAktSemesterNull($studiensemester_kurzbz, $studiengang_kz, null, $exkludierte_studiengang_kz); + $prestudentRes = $this->getAktSemesterNull($studiensemester_kurzbz, $studiengang_kz, null, $person_id, $exkludierte_studiengang_kz); if (isError($prestudentRes)) return $prestudentRes; @@ -56,11 +57,17 @@ class AktSemesterNull extends PlausiChecker * @param studiensemester_kurzbz string 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 person_id int if check is to be executed only for one person * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check * @return success with prestudents or error */ - public function getAktSemesterNull($studiensemester_kurzbz, $studiengang_kz = null, $prestudent_id = null, $exkludierte_studiengang_kz = null) - { + public function getAktSemesterNull( + $studiensemester_kurzbz, + $studiengang_kz = null, + $prestudent_id = null, + $person_id = null, + $exkludierte_studiengang_kz = null + ) { $params = array($studiensemester_kurzbz); $qry = " @@ -89,6 +96,12 @@ class AktSemesterNull extends PlausiChecker $params[] = $prestudent_id; } + 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 ?"; diff --git a/application/libraries/issues/plausichecks/AktiverStudentOhneStatus.php b/application/libraries/issues/plausichecks/AktiverStudentOhneStatus.php index 94fe5cc8d..fe9f551a2 100644 --- a/application/libraries/issues/plausichecks/AktiverStudentOhneStatus.php +++ b/application/libraries/issues/plausichecks/AktiverStudentOhneStatus.php @@ -18,9 +18,10 @@ class AktiverStudentOhneStatus extends PlausiChecker // pass parameters needed for plausicheck $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->getAktiverStudentOhneStatus($studiengang_kz, null, $exkludierte_studiengang_kz); + $prestudentRes = $this->getAktiverStudentOhneStatus($studiengang_kz, null, $person_id, $exkludierte_studiengang_kz); if (isError($prestudentRes)) return $prestudentRes; @@ -48,10 +49,11 @@ class AktiverStudentOhneStatus extends PlausiChecker * Students with active Benutzer should have a status in the current semester. * @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 person_id int if check is to be executed only for one person * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check * @return success with prestudents or error */ - public function getAktiverStudentOhneStatus($studiengang_kz = null, $prestudent_id = null, $exkludierte_studiengang_kz = null) + public function getAktiverStudentOhneStatus($studiengang_kz = null, $prestudent_id = null, $person_id = null, $exkludierte_studiengang_kz = null) { $params = array(); @@ -88,6 +90,12 @@ class AktiverStudentOhneStatus extends PlausiChecker $params[] = $prestudent_id; } + if (isset($person_id)) + { + $qry .= " AND prestudent.person_id = ?"; + $params[] = $person_id; + } + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) { $qry .= " AND stg.studiengang_kz NOT IN ?"; diff --git a/application/libraries/issues/plausichecks/AktiverStudentstatusOhneKontobuchung.php b/application/libraries/issues/plausichecks/AktiverStudentstatusOhneKontobuchung.php index 28684388f..5f34790e2 100644 --- a/application/libraries/issues/plausichecks/AktiverStudentstatusOhneKontobuchung.php +++ b/application/libraries/issues/plausichecks/AktiverStudentstatusOhneKontobuchung.php @@ -19,12 +19,14 @@ class AktiverStudentstatusOhneKontobuchung extends PlausiChecker // 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->getAktiverStudentstatusOhneKontobuchung( $studiensemester_kurzbz, $studiengang_kz, null, + $person_id, $exkludierte_studiengang_kz ); @@ -61,6 +63,7 @@ class AktiverStudentstatusOhneKontobuchung extends PlausiChecker * @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 person_id int if check is to be executed only for one person * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check * @return success with prestudents or error */ @@ -68,6 +71,7 @@ class AktiverStudentstatusOhneKontobuchung extends PlausiChecker $studiensemester_kurzbz, $studiengang_kz = null, $prestudent_id = null, + $person_id = null, $exkludierte_studiengang_kz = null ) { $params = array($studiensemester_kurzbz); @@ -109,6 +113,13 @@ class AktiverStudentstatusOhneKontobuchung extends PlausiChecker $params[] = $prestudent_id; } + if (isset($person_id)) + { + $qry .= " AND pers.person_id = ?"; + $params[] = $person_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) { $qry .= " AND stg.studiengang_kz NOT IN ?"; diff --git a/application/libraries/issues/plausichecks/AusbildungssemPrestudentUngleichAusbildungssemStatus.php b/application/libraries/issues/plausichecks/AusbildungssemPrestudentUngleichAusbildungssemStatus.php index 00ff16ae0..22fa069bd 100644 --- a/application/libraries/issues/plausichecks/AusbildungssemPrestudentUngleichAusbildungssemStatus.php +++ b/application/libraries/issues/plausichecks/AusbildungssemPrestudentUngleichAusbildungssemStatus.php @@ -19,12 +19,14 @@ class AusbildungssemPrestudentUngleichAusbildungssemStatus extends PlausiChecker // 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->getAusbildungssemPrestudentUngleichAusbildungssemStatus( $studiensemester_kurzbz, $studiengang_kz, null, + $person_id, $exkludierte_studiengang_kz ); @@ -64,6 +66,7 @@ class AusbildungssemPrestudentUngleichAusbildungssemStatus extends PlausiChecker * @param studiensemester_kurzbz string 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 person_id int if check is to be executed only for one person * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check * @return success with prestudents or error */ @@ -71,6 +74,7 @@ class AusbildungssemPrestudentUngleichAusbildungssemStatus extends PlausiChecker $studiensemester_kurzbz, $studiengang_kz = null, $prestudent_id = null, + $person_id = null, $exkludierte_studiengang_kz = null ) { $params = array($studiensemester_kurzbz, $studiensemester_kurzbz, $studiensemester_kurzbz); @@ -105,6 +109,12 @@ class AusbildungssemPrestudentUngleichAusbildungssemStatus extends PlausiChecker $params[] = $prestudent_id; } + if (isset($person_id)) + { + $qry .= " AND prestudent.person_id = ?"; + $params[] = $person_id; + } + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) { $qry .= " AND stg.studiengang_kz NOT IN ?"; diff --git a/application/libraries/issues/plausichecks/BewerberNichtZumRtAngetreten.php b/application/libraries/issues/plausichecks/BewerberNichtZumRtAngetreten.php index 4a9655d13..307f47467 100644 --- a/application/libraries/issues/plausichecks/BewerberNichtZumRtAngetreten.php +++ b/application/libraries/issues/plausichecks/BewerberNichtZumRtAngetreten.php @@ -19,12 +19,14 @@ class BewerberNichtZumRtAngetreten extends PlausiChecker // 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->getBewerberNichtZumRtAngetreten( $studiensemester_kurzbz, $studiengang_kz, null, + $person_id, $exkludierte_studiengang_kz ); @@ -58,6 +60,7 @@ class BewerberNichtZumRtAngetreten extends PlausiChecker * @param studiensemester_kurzbz string 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 person_id int if check is to be executed only for one person * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check * @return success with prestudents or error */ @@ -65,6 +68,7 @@ class BewerberNichtZumRtAngetreten extends PlausiChecker $studiensemester_kurzbz, $studiengang_kz = null, $prestudent_id = null, + $person_id = null, $exkludierte_studiengang_kz = null ) { $this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); @@ -112,6 +116,12 @@ class BewerberNichtZumRtAngetreten extends PlausiChecker $params[] = $prestudent_id; } + if (isset($person_id)) + { + $qry .= " AND prestudent.person_id = ?"; + $params[] = $person_id; + } + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) { $qry .= " AND stg.studiengang_kz NOT IN ?"; diff --git a/application/libraries/issues/plausichecks/DatumAbschlusspruefungFehlt.php b/application/libraries/issues/plausichecks/DatumAbschlusspruefungFehlt.php index f606e2c8c..028d89650 100644 --- a/application/libraries/issues/plausichecks/DatumAbschlusspruefungFehlt.php +++ b/application/libraries/issues/plausichecks/DatumAbschlusspruefungFehlt.php @@ -19,12 +19,14 @@ class DatumAbschlusspruefungFehlt extends PlausiChecker // 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->getDatumAbschlusspruefungFehlt( $studiensemester_kurzbz, $studiengang_kz, null, + $person_id, $exkludierte_studiengang_kz ); @@ -58,6 +60,7 @@ class DatumAbschlusspruefungFehlt extends PlausiChecker * @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 abschlusspruefung_id int if check is to be executed for a certain Abschlussprüfung + * @param person_id int if check is to be executed only for one person * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check * @return success with prestudents or error */ @@ -65,6 +68,7 @@ class DatumAbschlusspruefungFehlt extends PlausiChecker $studiensemester_kurzbz = null, $studiengang_kz = null, $abschlusspruefung_id = null, + $person_id = null, $exkludierte_studiengang_kz = null ) { $params = array(); @@ -112,6 +116,12 @@ class DatumAbschlusspruefungFehlt extends PlausiChecker $params[] = $abschlusspruefung_id; } + 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 ?"; diff --git a/application/libraries/issues/plausichecks/DatumSponsionFehlt.php b/application/libraries/issues/plausichecks/DatumSponsionFehlt.php index 210ae6f01..b60b33a6e 100644 --- a/application/libraries/issues/plausichecks/DatumSponsionFehlt.php +++ b/application/libraries/issues/plausichecks/DatumSponsionFehlt.php @@ -19,12 +19,14 @@ class DatumSponsionFehlt extends PlausiChecker // 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->getDatumSponsionFehlt( $studiensemester_kurzbz, $studiengang_kz, null, + $person_id, $exkludierte_studiengang_kz ); @@ -58,6 +60,7 @@ class DatumSponsionFehlt extends PlausiChecker * @param studiensemester_kurzbz string check is to be executed for certain Studiensemester * @param studiengang_kz int if check is to be executed for certain Studiengang * @param abschlusspruefung_id int if check is to be executed only for a certain Abschlussprüfung + * @param person_id int if check is to be executed only for one person * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check * @return success with prestudents or error */ @@ -65,6 +68,7 @@ class DatumSponsionFehlt extends PlausiChecker $studiensemester_kurzbz = null, $studiengang_kz = null, $abschlusspruefung_id = null, + $person_id = null, $exkludierte_studiengang_kz = null ) { $params = array(); @@ -112,6 +116,12 @@ class DatumSponsionFehlt extends PlausiChecker $params[] = $abschlusspruefung_id; } + 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 ?"; diff --git a/application/libraries/issues/plausichecks/DatumStudiensemesterFalscheReihenfolge.php b/application/libraries/issues/plausichecks/DatumStudiensemesterFalscheReihenfolge.php index 381bea7df..cc749f601 100644 --- a/application/libraries/issues/plausichecks/DatumStudiensemesterFalscheReihenfolge.php +++ b/application/libraries/issues/plausichecks/DatumStudiensemesterFalscheReihenfolge.php @@ -18,9 +18,10 @@ class DatumStudiensemesterFalscheReihenfolge extends PlausiChecker // pass parameters needed for plausicheck $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->getDatumStudiensemesterFalscheReihenfolge($studiengang_kz, null, $exkludierte_studiengang_kz); + $prestudentRes = $this->getDatumStudiensemesterFalscheReihenfolge($studiengang_kz, null, $person_id, $exkludierte_studiengang_kz); if (isError($prestudentRes)) return $prestudentRes; @@ -50,11 +51,16 @@ class DatumStudiensemesterFalscheReihenfolge extends PlausiChecker * Status Dates and status studysemester dates should be in correct order. * @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 person_id int if check is to be executed only for one person * @param exkludierte_studiengang_kz array if check is to be executed only for certain Studiengaenge * @return success with prestudents or error */ - public function getDatumStudiensemesterFalscheReihenfolge($studiengang_kz = null, $prestudent_id = null, $exkludierte_studiengang_kz = null) - { + public function getDatumStudiensemesterFalscheReihenfolge( + $studiengang_kz = null, + $prestudent_id = null, + $person_id = null, + $exkludierte_studiengang_kz = null + ) { $params = array(); // all active students with Status student in current semester @@ -97,6 +103,12 @@ class DatumStudiensemesterFalscheReihenfolge extends PlausiChecker $params[] = $prestudent_id; } + if (isset($person_id)) + { + $qry .= " AND person_id = ?"; + $params[] = $person_id; + } + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) { $qry .= " AND studiengang_kz NOT IN ?"; diff --git a/application/libraries/issues/plausichecks/DualesStudiumOhneMarkierung.php b/application/libraries/issues/plausichecks/DualesStudiumOhneMarkierung.php index 3951f6d76..18ca83da1 100644 --- a/application/libraries/issues/plausichecks/DualesStudiumOhneMarkierung.php +++ b/application/libraries/issues/plausichecks/DualesStudiumOhneMarkierung.php @@ -19,12 +19,14 @@ class DualesStudiumOhneMarkierung extends PlausiChecker // 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->getDualesStudiumOhneMarkierung( $studiensemester_kurzbz, $studiengang_kz, null, + $person_id, $exkludierte_studiengang_kz ); @@ -61,6 +63,7 @@ class DualesStudiumOhneMarkierung extends PlausiChecker * @param studiensemester_kurzbz string 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 person_id int if check is to be executed only for one person * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check * @return success with prestudents or error */ @@ -68,6 +71,7 @@ class DualesStudiumOhneMarkierung extends PlausiChecker $studiensemester_kurzbz, $studiengang_kz = null, $prestudent_id = null, + $person_id = null, $exkludierte_studiengang_kz = null ) { $params = array($studiensemester_kurzbz); @@ -132,6 +136,12 @@ class DualesStudiumOhneMarkierung extends PlausiChecker $params[] = $prestudent_id; } + if (isset($person_id)) + { + $qry .= " AND tbl_person.person_id = ?"; + $params[] = $person_id; + } + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) { $qry .= " AND stg.studiengang_kz NOT IN ?"; diff --git a/application/libraries/issues/plausichecks/FalscheAnzahlAbschlusspruefungen.php b/application/libraries/issues/plausichecks/FalscheAnzahlAbschlusspruefungen.php index 1021fe85a..f0084a30d 100644 --- a/application/libraries/issues/plausichecks/FalscheAnzahlAbschlusspruefungen.php +++ b/application/libraries/issues/plausichecks/FalscheAnzahlAbschlusspruefungen.php @@ -19,12 +19,14 @@ class FalscheAnzahlAbschlusspruefungen extends PlausiChecker // 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->getFalscheAnzahlAbschlusspruefungen( $studiensemester_kurzbz, $studiengang_kz, null, + $person_id, $exkludierte_studiengang_kz ); @@ -55,6 +57,7 @@ class FalscheAnzahlAbschlusspruefungen extends PlausiChecker * @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 person_id int if check is to be executed only for one person * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check * @return success with prestudents or error */ @@ -62,6 +65,7 @@ class FalscheAnzahlAbschlusspruefungen extends PlausiChecker $studiensemester_kurzbz = null, $studiengang_kz = null, $prestudent_id = null, + $person_id = null, $exkludierte_studiengang_kz = null ) { $params = array(); @@ -111,6 +115,12 @@ class FalscheAnzahlAbschlusspruefungen extends PlausiChecker $params[] = $prestudent_id; } + 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 ?"; diff --git a/application/libraries/issues/plausichecks/FalscheAnzahlHeimatadressen.php b/application/libraries/issues/plausichecks/FalscheAnzahlHeimatadressen.php index b3551904e..ff374750e 100644 --- a/application/libraries/issues/plausichecks/FalscheAnzahlHeimatadressen.php +++ b/application/libraries/issues/plausichecks/FalscheAnzahlHeimatadressen.php @@ -19,12 +19,13 @@ class FalscheAnzahlHeimatadressen extends PlausiChecker // 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->getFalscheAnzahlHeimatadressen( $studiensemester_kurzbz, $studiengang_kz, - null, + $person_id, $exkludierte_studiengang_kz ); diff --git a/application/libraries/issues/plausichecks/FalscheAnzahlZustelladressen.php b/application/libraries/issues/plausichecks/FalscheAnzahlZustelladressen.php index 9d72b0236..f84478bb5 100644 --- a/application/libraries/issues/plausichecks/FalscheAnzahlZustelladressen.php +++ b/application/libraries/issues/plausichecks/FalscheAnzahlZustelladressen.php @@ -19,12 +19,13 @@ class FalscheAnzahlZustelladressen extends PlausiChecker // 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->getFalscheAnzahlZustelladressen( $studiensemester_kurzbz, $studiengang_kz, - null, + $person_id, $exkludierte_studiengang_kz ); diff --git a/application/libraries/issues/plausichecks/FalscherIncomingZweckPlausi.php b/application/libraries/issues/plausichecks/FalscherIncomingZweckPlausi.php new file mode 100644 index 000000000..d8a2c0221 --- /dev/null +++ b/application/libraries/issues/plausichecks/FalscherIncomingZweckPlausi.php @@ -0,0 +1,131 @@ +_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; + $person_id = isset($params['person_id']) ? $params['person_id'] : null; + + // get all students failing the plausicheck + $prestudentRes = $this->_getFalscherIncomingZweck( + $studiensemester_kurzbz, + $studiengang_kz, + $bisio_id, + $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('bisio_id' => $prestudent->bisio_id), + 'resolution_params' => array('bisio_id' => $prestudent->bisio_id) + ); + } + } + + // return the results + return success($results); + } + + /** + * Incomings should have the correct Zweck. + * @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 person_id int if check is to be executed only for one person + * @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, + $person_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($person_id)) + { + $qry .= " AND zwecke.person_id = ?"; + $params[] = $person_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/GbDatumWeitZurueck.php b/application/libraries/issues/plausichecks/GbDatumWeitZurueck.php index 04e1cf97b..160375259 100644 --- a/application/libraries/issues/plausichecks/GbDatumWeitZurueck.php +++ b/application/libraries/issues/plausichecks/GbDatumWeitZurueck.php @@ -19,9 +19,10 @@ class GbDatumWeitZurueck extends PlausiChecker // 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->getGbDatumWeitZurueck($studiensemester_kurzbz, $studiengang_kz, null, $exkludierte_studiengang_kz); + $personRes = $this->getGbDatumWeitZurueck($studiensemester_kurzbz, $studiengang_kz, $person_id, $exkludierte_studiengang_kz); if (isError($personRes)) return $personRes; diff --git a/application/libraries/issues/plausichecks/GeburtsnationFehlt.php b/application/libraries/issues/plausichecks/GeburtsnationFehlt.php new file mode 100644 index 000000000..459851110 --- /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); + } + + /** + * Geburtsnation is missing. + * @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 person_id int if check is to be executed only for one person + * @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, + $person_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($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/InaktiverStudentAktiverStatus.php b/application/libraries/issues/plausichecks/InaktiverStudentAktiverStatus.php index 59965e238..5825a86de 100644 --- a/application/libraries/issues/plausichecks/InaktiverStudentAktiverStatus.php +++ b/application/libraries/issues/plausichecks/InaktiverStudentAktiverStatus.php @@ -19,12 +19,14 @@ class InaktiverStudentAktiverStatus extends PlausiChecker // 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->getInaktiverStudentAktiverStatus( $studiensemester_kurzbz, $studiengang_kz, null, + $person_id, $exkludierte_studiengang_kz ); @@ -58,21 +60,26 @@ class InaktiverStudentAktiverStatus extends PlausiChecker * @param studiensemester_kurzbz string 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 person_id int if check is to be executed only for one person * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check * @return success with prestudents or error */ public function getInaktiverStudentAktiverStatus( - $studiensemester_kurzbz, + $studiensemester_kurzbz = null, $studiengang_kz = null, $prestudent_id = null, + $person_id = null, $exkludierte_studiengang_kz = null ) { - $this->_ci->load->model('organisation/studiensemester_model', 'StudiensemesterModel'); - $aktStudiensemesterRes = $this->_ci->StudiensemesterModel->getAkt(); + if (!isset($studiensemester_kurzbz)) + { + $this->_ci->load->model('organisation/studiensemester_model', 'StudiensemesterModel'); + $aktStudiensemesterRes = $this->_ci->StudiensemesterModel->getAkt(); - if (isError($aktStudiensemesterRes)) return $aktStudiensemesterRes; + if (isError($aktStudiensemesterRes)) return $aktStudiensemesterRes; - $studiensemester_kurzbz = hasData($aktStudiensemesterRes) ? getData($aktStudiensemesterRes)[0]->studiensemester_kurzbz : ''; + $studiensemester_kurzbz = hasData($aktStudiensemesterRes) ? getData($aktStudiensemesterRes)[0]->studiensemester_kurzbz : ''; + } $params = array($studiensemester_kurzbz); @@ -103,6 +110,12 @@ class InaktiverStudentAktiverStatus extends PlausiChecker $params[] = $prestudent_id; } + if (isset($person_id)) + { + $qry .= " AND prestudent.person_id = ?"; + $params[] = $person_id; + } + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) { $qry .= " AND stg.studiengang_kz NOT IN ?"; diff --git a/application/libraries/issues/plausichecks/IncomingHeimatNationOesterreich.php b/application/libraries/issues/plausichecks/IncomingHeimatNationOesterreich.php index 5276164dc..9ef2d3b42 100644 --- a/application/libraries/issues/plausichecks/IncomingHeimatNationOesterreich.php +++ b/application/libraries/issues/plausichecks/IncomingHeimatNationOesterreich.php @@ -19,12 +19,13 @@ class IncomingHeimatNationOesterreich extends PlausiChecker // 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->getIncomingHeimatNationOesterreich( $studiensemester_kurzbz, $studiengang_kz, - null, + $person_id, $exkludierte_studiengang_kz ); diff --git a/application/libraries/issues/plausichecks/IncomingOhneIoDatensatz.php b/application/libraries/issues/plausichecks/IncomingOhneIoDatensatz.php index e08280f83..ee2c3d5fe 100644 --- a/application/libraries/issues/plausichecks/IncomingOhneIoDatensatz.php +++ b/application/libraries/issues/plausichecks/IncomingOhneIoDatensatz.php @@ -18,9 +18,10 @@ class IncomingOhneIoDatensatz extends PlausiChecker // pass parameters needed for plausicheck $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->getIncomingOhneIoDatensatz($studiengang_kz, null, $exkludierte_studiengang_kz); + $prestudentRes = $this->getIncomingOhneIoDatensatz($studiengang_kz, null, $person_id, $exkludierte_studiengang_kz); if (isError($prestudentRes)) return $prestudentRes; @@ -48,10 +49,11 @@ class IncomingOhneIoDatensatz extends PlausiChecker * Incoming should have IN/OUT data. * @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 person_id int if check is to be executed only for one person * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check * @return success with prestudents or error */ - public function getIncomingOhneIoDatensatz($studiengang_kz = null, $prestudent_id = null, $exkludierte_studiengang_kz = null) + public function getIncomingOhneIoDatensatz($studiengang_kz = null, $prestudent_id = null, $person_id = null, $exkludierte_studiengang_kz = null) { $params = array(); @@ -85,6 +87,12 @@ class IncomingOhneIoDatensatz extends PlausiChecker $params[] = $prestudent_id; } + if (isset($person_id)) + { + $qry .= " AND tbl_person.person_id = ?"; + $params[] = $person_id; + } + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) { $qry .= " AND stg.studiengang_kz NOT IN ?"; diff --git a/application/libraries/issues/plausichecks/IncomingOrGsFoerderrelevant.php b/application/libraries/issues/plausichecks/IncomingOrGsFoerderrelevant.php index 4d789f71a..3339730b8 100644 --- a/application/libraries/issues/plausichecks/IncomingOrGsFoerderrelevant.php +++ b/application/libraries/issues/plausichecks/IncomingOrGsFoerderrelevant.php @@ -19,12 +19,14 @@ class IncomingOrGsFoerderrelevant extends PlausiChecker // 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->getIncomingOrGsFoerderrelevant( $studiensemester_kurzbz, $studiengang_kz, null, + $person_id, $exkludierte_studiengang_kz ); @@ -55,6 +57,7 @@ class IncomingOrGsFoerderrelevant extends PlausiChecker * @param studiensemester_kurzbz string 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 person_id int if check is to be executed only for one person * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check * @return object success or error */ @@ -62,6 +65,7 @@ class IncomingOrGsFoerderrelevant extends PlausiChecker $studiensemester_kurzbz = null, $studiengang_kz = null, $prestudent_id = null, + $person_id = null, $exkludierte_studiengang_kz = null ) { $params = array(); @@ -114,6 +118,12 @@ class IncomingOrGsFoerderrelevant extends PlausiChecker $params[] = $prestudent_id; } + if (isset($person_id)) + { + $qry .= " AND pers.person_id = ?"; + $params[] = $person_id; + } + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) { $qry .= " AND stg.studiengang_kz NOT IN ?"; diff --git a/application/libraries/issues/plausichecks/InskriptionVorLetzerBismeldung.php b/application/libraries/issues/plausichecks/InskriptionVorLetzerBismeldung.php index 871b3b3d4..96acbd250 100644 --- a/application/libraries/issues/plausichecks/InskriptionVorLetzerBismeldung.php +++ b/application/libraries/issues/plausichecks/InskriptionVorLetzerBismeldung.php @@ -19,12 +19,14 @@ class InskriptionVorLetzerBismeldung extends PlausiChecker // 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->getInskriptionVorLetzerBismeldung( $studiensemester_kurzbz, $studiengang_kz, null, + $person_id, $exkludierte_studiengang_kz ); @@ -59,7 +61,7 @@ class InskriptionVorLetzerBismeldung extends PlausiChecker /** * Students of a semester shouldn't start studies before the date of Bismeldung. - * e.g. If student studies in WS2022 datum of status shouldn't be before 15.4.2020 + * e.g. If student studies in WS2022 datum of status shouldn't be before 15.4.2022 * e.g. If student studies in SS2022 datum of status shouldn't be before 15.11.2022 * @param studiensemester_kurzbz string check is to be executed for certain Studiensemester * @param studiengang_kz int if check is to be executed for certain Studiengang @@ -71,11 +73,14 @@ class InskriptionVorLetzerBismeldung extends PlausiChecker $studiensemester_kurzbz, $studiengang_kz = null, $prestudent_id = null, + $person_id = null, $exkludierte_studiengang_kz = null ) { // get Bismeldedatum $datumBis = $this->_getBisdateFromSemester($studiensemester_kurzbz); + if (!$datumBis) return success([]); + $params = array($datumBis, $studiensemester_kurzbz, $datumBis); // get active students @@ -117,6 +122,12 @@ class InskriptionVorLetzerBismeldung extends PlausiChecker $params[] = $prestudent_id; } + if (isset($person_id)) + { + $qry .= " AND prestudent.person_id = ?"; + $params[] = $person_id; + } + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) { $qry .= " AND stg.studiengang_kz NOT IN ?"; @@ -132,17 +143,16 @@ class InskriptionVorLetzerBismeldung extends PlausiChecker */ private function _getBisdateFromSemester($studiensemester_kurzbz) { - $semesterYear = substr($studiensemester_kurzbz, 2, 6); - $semesterType = substr($studiensemester_kurzbz, 0, 2); + $bisdate = null; - if ($semesterType == 'SS') - { - return date_format(date_create(($semesterYear - 1)."-11-15"), 'Y-m-d'); - } + $this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + $prevSemester = $this->_ci->StudiensemesterModel->getPreviousFrom($studiensemester_kurzbz); + if (!hasData($prevSemester)) return null; + $prevSemester = getData($prevSemester)[0]->studiensemester_kurzbz; - if ($semesterType == 'WS') - { - return date_format(date_create($semesterYear."-04-15"), 'Y-m-d'); - } + $this->_ci->load->model('codex/Bismeldestichtag_model', 'BismeldestichtagModel'); + $bisDate = $this->_ci->BismeldestichtagModel->getLastReachedMeldestichtag($prevSemester); + if (!hasData($bisDate)) return null; + return getData($bisDate)[0]->meldestichtag; } } diff --git a/application/libraries/issues/plausichecks/KeinAufenthaltszweckPlausi.php b/application/libraries/issues/plausichecks/KeinAufenthaltszweckPlausi.php new file mode 100644 index 000000000..7773d5fdd --- /dev/null +++ b/application/libraries/issues/plausichecks/KeinAufenthaltszweckPlausi.php @@ -0,0 +1,125 @@ +_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; + $person_id = isset($params['person_id']) ? $params['person_id'] : null; + + // get all students failing the plausicheck + $prestudentRes = $this->_getKeinAufenthaltszweck( + $studiensemester_kurzbz, + $studiengang_kz, + $bisio_id, + $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('bisio_id' => $prestudent->bisio_id), + 'resolution_params' => array('bisio_id' => $prestudent->bisio_id) + ); + } + } + + // return the results + return success($results); + } + + /** + * Students with mobility should have Aufenthaltszweck. + * @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, + $person_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($person_id)) + { + $qry .= " AND pre.person_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/NationNichtOesterreichAberGemeinde.php b/application/libraries/issues/plausichecks/NationNichtOesterreichAberGemeinde.php index c04cd664c..cccd3ddef 100644 --- a/application/libraries/issues/plausichecks/NationNichtOesterreichAberGemeinde.php +++ b/application/libraries/issues/plausichecks/NationNichtOesterreichAberGemeinde.php @@ -18,11 +18,12 @@ class NationNichtOesterreichAberGemeinde extends PlausiChecker // pass parameters needed for plausicheck $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->getNationNichtOesterreichAberGemeinde( $studiengang_kz, - null, + $person_id, $exkludierte_studiengang_kz ); diff --git a/application/libraries/issues/plausichecks/OrgformStgUngleichOrgformPrestudent.php b/application/libraries/issues/plausichecks/OrgformStgUngleichOrgformPrestudent.php index 316e81072..10dd80952 100644 --- a/application/libraries/issues/plausichecks/OrgformStgUngleichOrgformPrestudent.php +++ b/application/libraries/issues/plausichecks/OrgformStgUngleichOrgformPrestudent.php @@ -19,12 +19,14 @@ class OrgformStgUngleichOrgformPrestudent extends PlausiChecker // 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->getOrgformStgUngleichOrgformPrestudent( $studiensemester_kurzbz, $studiengang_kz, null, + $person_id, $exkludierte_studiengang_kz ); @@ -70,6 +72,7 @@ class OrgformStgUngleichOrgformPrestudent extends PlausiChecker $studiensemester_kurzbz, $studiengang_kz = null, $prestudent_id = null, + $person_id = null, $exkludierte_studiengang_kz = null ) { $params = array($studiensemester_kurzbz); @@ -116,6 +119,12 @@ class OrgformStgUngleichOrgformPrestudent extends PlausiChecker $params[] = $prestudent_id; } + if (isset($person_id)) + { + $qry .= " AND prestudent.person_id = ?"; + $params[] = $person_id; + } + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) { $qry .= " AND stg.studiengang_kz NOT IN ?"; diff --git a/application/libraries/issues/plausichecks/OutgoingAngerechneteEctsFehlenPlausi.php b/application/libraries/issues/plausichecks/OutgoingAngerechneteEctsFehlenPlausi.php new file mode 100644 index 000000000..5cc2f6d08 --- /dev/null +++ b/application/libraries/issues/plausichecks/OutgoingAngerechneteEctsFehlenPlausi.php @@ -0,0 +1,129 @@ +_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; + $person_id = isset($params['person_id']) ? $params['person_id'] : null; + + // get all students failing the plausicheck + $prestudentRes = $this->_getAngerechneteEctsFehlen( + $studiensemester_kurzbz, + $studiengang_kz, + $bisio_id, + $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('bisio_id' => $prestudent->bisio_id), + 'resolution_params' => array('bisio_id' => $prestudent->bisio_id) + ); + } + } + + // return the results + return success($results); + } + + /** + * Outgoing should have angerechnete ECTS. + * @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 person_id int if check is to be executed only for one person + * @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, + $person_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($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/OutgoingAufenthaltfoerderungfehltPlausi.php b/application/libraries/issues/plausichecks/OutgoingAufenthaltfoerderungfehltPlausi.php new file mode 100644 index 000000000..9f66610d3 --- /dev/null +++ b/application/libraries/issues/plausichecks/OutgoingAufenthaltfoerderungfehltPlausi.php @@ -0,0 +1,128 @@ +_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; + $person_id = isset($params['person_id']) ? $params['person_id'] : null; + + // get all students failing the plausicheck + $prestudentRes = $this->_getAufenthaltsfoerderungFehlt( + $studiensemester_kurzbz, + $studiengang_kz, + $bisio_id, + $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('bisio_id' => $prestudent->bisio_id), + 'resolution_params' => array('bisio_id' => $prestudent->bisio_id) + ); + } + } + + // return the results + return success($results); + } + + /** + * Student with mobility should have Aufenthaltsfoerderung. + * @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, + $person_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($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/OutgoingErworbeneEctsFehlenPlausi.php b/application/libraries/issues/plausichecks/OutgoingErworbeneEctsFehlenPlausi.php new file mode 100644 index 000000000..1dbd89f1c --- /dev/null +++ b/application/libraries/issues/plausichecks/OutgoingErworbeneEctsFehlenPlausi.php @@ -0,0 +1,128 @@ +_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; + $person_id = isset($params['person_id']) ? $params['person_id'] : null; + + // get all students failing the plausicheck + $prestudentRes = $this->_getAngerechneteEctsFehlen( + $studiensemester_kurzbz, + $studiengang_kz, + $bisio_id, + $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('bisio_id' => $prestudent->bisio_id), + 'resolution_params' => array('bisio_id' => $prestudent->bisio_id) + ); + } + } + + // return the results + return success($results); + } + + /** + * Outgoing should have erworbene ECTS. + * @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, + $person_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($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/PlausiChecker.php b/application/libraries/issues/plausichecks/PlausiChecker.php index f23606eb0..1a16fddac 100644 --- a/application/libraries/issues/plausichecks/PlausiChecker.php +++ b/application/libraries/issues/plausichecks/PlausiChecker.php @@ -5,12 +5,12 @@ */ abstract class PlausiChecker { + const ISSUE_ID_NAME = 'issue_id'; + protected $_ci; // code igniter instance protected $_config; // all applicable configuration parameters for this plausicheck protected $_db; // database for queries - protected $_isForResolutionCheck; // if true, additional parameters only needed for resolution are checked - protected $_base_sql = ''; // base sql string protected $_config_params = []; // name of all config params which should be applied for this plausicheck, with sql [name] => [sql] @@ -26,8 +26,6 @@ abstract class PlausiChecker // set configuration $this->_config = $params['configurationParams'] ?? []; - $this->_isForResolutionCheck = $params['isForResolutionCheck'] ?? false; - // get database for queries $this->_db = new DB_Model(); } @@ -43,15 +41,20 @@ abstract class PlausiChecker $params = []; $qry = $this->_base_sql; - if ($this->_isForResolutionCheck == true) + // if issue id is set, issue is resolving - check if behebung parameter are present + if (isset($paramsForChecking[self::ISSUE_ID_NAME])) { foreach ($this->_resolution_params as $resParam) { if (!isset($paramsForChecking[$resParam])) - return error("$resParam missing".(isset($paramsForChecking['issue_id']) ? ", issue ID: ".$paramsForChecking['issue_id'] : "")); + return error("$resParam missing" + .(isset($paramsForChecking[self::ISSUE_ID_NAME]) ? ", issue ID: ".$paramsForChecking[self::ISSUE_ID_NAME] : "")); } } + // get fehlertext and resolution params + + // add config params to query if (isset($this->_config_params) && !isEmptyArray($this->_config_params)) { diff --git a/application/libraries/issues/plausichecks/PrestudentMischformOhneOrgform.php b/application/libraries/issues/plausichecks/PrestudentMischformOhneOrgform.php index a4c3e2a4b..e5f803f74 100644 --- a/application/libraries/issues/plausichecks/PrestudentMischformOhneOrgform.php +++ b/application/libraries/issues/plausichecks/PrestudentMischformOhneOrgform.php @@ -19,12 +19,14 @@ class PrestudentMischformOhneOrgform extends PlausiChecker // 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->getPrestudentMischformOhneOrgform( $studiensemester_kurzbz, $studiengang_kz, null, + $person_id, $exkludierte_studiengang_kz ); @@ -68,6 +70,7 @@ class PrestudentMischformOhneOrgform extends PlausiChecker $studiensemester_kurzbz, $studiengang_kz = null, $prestudent_id = null, + $person_id = null, $exkludierte_studiengang_kz = null ) { $params = array($studiensemester_kurzbz); @@ -98,6 +101,12 @@ class PrestudentMischformOhneOrgform extends PlausiChecker $params[] = $prestudent_id; } + if (isset($person_id)) + { + $qry .= " AND tbl_person.person_id = ?"; + $params[] = $person_id; + } + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) { $qry .= " AND stg.studiengang_kz NOT IN ?"; diff --git a/application/libraries/issues/plausichecks/StgPrestudentUngleichStgStudent.php b/application/libraries/issues/plausichecks/StgPrestudentUngleichStgStudent.php index 94bea2f35..447fc9007 100644 --- a/application/libraries/issues/plausichecks/StgPrestudentUngleichStgStudent.php +++ b/application/libraries/issues/plausichecks/StgPrestudentUngleichStgStudent.php @@ -18,9 +18,10 @@ class StgPrestudentUngleichStgStudent extends PlausiChecker // pass parameters needed for plausicheck $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->getStgPrestudentUngleichStgStudent($studiengang_kz, null, $exkludierte_studiengang_kz); + $prestudentRes = $this->getStgPrestudentUngleichStgStudent($studiengang_kz, null, $person_id, $exkludierte_studiengang_kz); if (isError($prestudentRes)) return $prestudentRes; @@ -51,7 +52,7 @@ class StgPrestudentUngleichStgStudent extends PlausiChecker * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check * @return success with prestudents or error */ - public function getStgPrestudentUngleichStgStudent($studiengang_kz = null, $prestudent_id = null, $exkludierte_studiengang_kz = null) + public function getStgPrestudentUngleichStgStudent($studiengang_kz = null, $prestudent_id = null, $person_id = null, $exkludierte_studiengang_kz = null) { $params = array(); @@ -79,6 +80,12 @@ class StgPrestudentUngleichStgStudent extends PlausiChecker $params[] = $prestudent_id; } + if (isset($person_id)) + { + $qry .= " AND pers.person_id = ?"; + $params[] = $person_id; + } + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) { $qry .= " AND stg.studiengang_kz NOT IN ?"; diff --git a/application/libraries/issues/plausichecks/StgPrestudentUngleichStgStudienplan.php b/application/libraries/issues/plausichecks/StgPrestudentUngleichStgStudienplan.php index fc0f52f23..521c0c677 100644 --- a/application/libraries/issues/plausichecks/StgPrestudentUngleichStgStudienplan.php +++ b/application/libraries/issues/plausichecks/StgPrestudentUngleichStgStudienplan.php @@ -18,9 +18,10 @@ class StgPrestudentUngleichStgStudienplan extends PlausiChecker // pass parameters needed for plausicheck $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->getStgPrestudentUngleichStgStudienplan($studiengang_kz, null, null, $exkludierte_studiengang_kz); + $prestudentRes = $this->getStgPrestudentUngleichStgStudienplan($studiengang_kz, null, null, $person_id, $exkludierte_studiengang_kz); if (isError($prestudentRes)) return $prestudentRes; @@ -56,6 +57,7 @@ class StgPrestudentUngleichStgStudienplan extends PlausiChecker $studiengang_kz = null, $prestudent_id = null, $studienordnung_id = null, + $person_id = null, $exkludierte_studiengang_kz = null ) { $params = array(); @@ -93,6 +95,12 @@ class StgPrestudentUngleichStgStudienplan extends PlausiChecker $params[] = $studienordnung_id; } + if (isset($person_id)) + { + $qry .= " AND tbl_person.person_id = ?"; + $params[] = $person_id; + } + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) { $qry .= " AND stg.studiengang_kz NOT IN ?"; diff --git a/application/libraries/issues/plausichecks/StudentstatusNachAbbrecher.php b/application/libraries/issues/plausichecks/StudentstatusNachAbbrecher.php index 87bb51d7e..aac47753d 100644 --- a/application/libraries/issues/plausichecks/StudentstatusNachAbbrecher.php +++ b/application/libraries/issues/plausichecks/StudentstatusNachAbbrecher.php @@ -18,9 +18,10 @@ class StudentstatusNachAbbrecher extends PlausiChecker // pass parameters needed for plausicheck $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->getStudentstatusNachAbbrecher($studiengang_kz, null, $exkludierte_studiengang_kz); + $prestudentRes = $this->getStudentstatusNachAbbrecher($studiengang_kz, null, $person_id, $exkludierte_studiengang_kz); if (isError($prestudentRes)) return $prestudentRes; @@ -51,7 +52,7 @@ class StudentstatusNachAbbrecher extends PlausiChecker * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check * @return success with prestudents or error */ - public function getStudentstatusNachAbbrecher($studiengang_kz = null, $prestudent_id = null, $exkludierte_studiengang_kz = null) + public function getStudentstatusNachAbbrecher($studiengang_kz = null, $prestudent_id = null, $person_id = null, $exkludierte_studiengang_kz = null) { $params = array(); @@ -79,6 +80,12 @@ class StudentstatusNachAbbrecher extends PlausiChecker $params[] = $prestudent_id; } + if (isset($person_id)) + { + $qry .= " AND prestudent.person_id = ?"; + $params[] = $person_id; + } + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) { $qry .= " AND stg.studiengang_kz NOT IN ?"; diff --git a/application/libraries/issues/plausichecks/StudienplanUngueltig.php b/application/libraries/issues/plausichecks/StudienplanUngueltig.php index 9a306278e..d4aee05a5 100644 --- a/application/libraries/issues/plausichecks/StudienplanUngueltig.php +++ b/application/libraries/issues/plausichecks/StudienplanUngueltig.php @@ -19,12 +19,14 @@ class StudienplanUngueltig extends PlausiChecker // 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->getStudienplanUngueltig( $studiensemester_kurzbz, $studiengang_kz, null, + $person_id, $exkludierte_studiengang_kz ); @@ -69,6 +71,7 @@ class StudienplanUngueltig extends PlausiChecker $studiensemester_kurzbz, $studiengang_kz = null, $prestudent_id = null, + $person_id = null, $exkludierte_studiengang_kz = null ) { $params = array($studiensemester_kurzbz); @@ -115,6 +118,12 @@ class StudienplanUngueltig extends PlausiChecker $params[] = $prestudent_id; } + if (isset($person_id)) + { + $qry .= " AND tbl_person.person_id = ?"; + $params[] = $person_id; + } + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) { $qry .= " AND stg.studiengang_kz NOT IN ?"; diff --git a/application/libraries/issues/plausichecks/UhstatPersonkennungFehltCore.php b/application/libraries/issues/plausichecks/UhstatPersonkennungFehltCore.php new file mode 100644 index 000000000..509401128 --- /dev/null +++ b/application/libraries/issues/plausichecks/UhstatPersonkennungFehltCore.php @@ -0,0 +1,112 @@ +_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 + //'fehlertext_params' => array('person_id' => $prestudent->person_id), + //'resolution_params' => array('person_id' => $prestudent->person_id) + ); + } + } + + // return the results + return success($results); + } + + /** + * Student should have Personenkennung for UHSTAT reporting. + * @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 + 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 pers.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..797f86790 --- /dev/null +++ b/application/libraries/issues/plausichecks/ZgvDatumInZukunft.php @@ -0,0 +1,135 @@ +_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; + $person_id = isset($params['person_id']) ? $params['person_id'] : null; + + // get all students failing the plausicheck + $prestudentRes = $this->_getZgvDatumInZukunft( + $studiensemester_kurzbz, + $studiengang_kz, + $prestudent_id, + $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('prestudent_id' => $prestudent->prestudent_id), + 'resolution_params' => array('prestudent_id' => $prestudent->prestudent_id) + ); + } + } + + // return the results + return success($results); + } + + /** + * ZGV date should be in the past. + * @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, + $person_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($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/ZgvDatumVorGeburtsdatum.php b/application/libraries/issues/plausichecks/ZgvDatumVorGeburtsdatum.php new file mode 100644 index 000000000..fef53cf4d --- /dev/null +++ b/application/libraries/issues/plausichecks/ZgvDatumVorGeburtsdatum.php @@ -0,0 +1,118 @@ +_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; + $person_id = isset($params['person_id']) ? $params['person_id'] : null; + + // get all students failing the plausicheck + $prestudentRes = $this->_getZgvDatumVorGeburtsdatum( + $studiensemester_kurzbz, + $studiengang_kz, + $prestudent_id, + $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('prestudent_id' => $prestudent->prestudent_id), + 'resolution_params' => array('prestudent_id' => $prestudent->prestudent_id) + ); + } + } + + // return the results + return success($results); + } + + /** + * Zgv date should be after birthdate. + * @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, + $person_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($person_id)) + { + $qry .= " AND pers.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/ZgvMasterDatumInZukunft.php b/application/libraries/issues/plausichecks/ZgvMasterDatumInZukunft.php new file mode 100644 index 000000000..7f7a8964c --- /dev/null +++ b/application/libraries/issues/plausichecks/ZgvMasterDatumInZukunft.php @@ -0,0 +1,118 @@ +_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; + $person_id = isset($params['person_id']) ? $params['person_id'] : null; + + // get all students failing the plausicheck + $prestudentRes = $this->_getZgvMasterDatumInZukunft( + $studiensemester_kurzbz, + $studiengang_kz, + $prestudent_id, + $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('prestudent_id' => $prestudent->prestudent_id), + 'resolution_params' => array('prestudent_id' => $prestudent->prestudent_id) + ); + } + } + + // return the results + return success($results); + } + + /** + * ZGV master date should be in the past. + * @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, + $person_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($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/ZgvMasterDatumVorGeburtsdatum.php b/application/libraries/issues/plausichecks/ZgvMasterDatumVorGeburtsdatum.php new file mode 100644 index 000000000..bd179623f --- /dev/null +++ b/application/libraries/issues/plausichecks/ZgvMasterDatumVorGeburtsdatum.php @@ -0,0 +1,118 @@ +_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; + $person_id = isset($params['person_id']) ? $params['person_id'] : null; + + // get all students failing the plausicheck + $prestudentRes = $this->_getZgvMasterDatumVorGeburtsdatum( + $studiensemester_kurzbz, + $studiengang_kz, + $prestudent_id, + $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('prestudent_id' => $prestudent->prestudent_id), + 'resolution_params' => array('prestudent_id' => $prestudent->prestudent_id) + ); + } + } + + // return the results + return success($results); + } + + /** + * ZGV master date should be after birthdate. + * @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, + $person_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($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/ZgvMasterDatumVorZgvdatum.php b/application/libraries/issues/plausichecks/ZgvMasterDatumVorZgvdatum.php new file mode 100644 index 000000000..2ff2e7862 --- /dev/null +++ b/application/libraries/issues/plausichecks/ZgvMasterDatumVorZgvdatum.php @@ -0,0 +1,118 @@ +_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; + $person_id = isset($params['person_id']) ? $params['person_id'] : null; + + // get all students failing the plausicheck + $prestudentRes = $this->_getZgvMasterDatumVorZgvDatum( + $studiensemester_kurzbz, + $studiengang_kz, + $prestudent_id, + $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('prestudent_id' => $prestudent->prestudent_id), + 'resolution_params' => array('prestudent_id' => $prestudent->prestudent_id) + ); + } + } + + // return the results + return success($results); + } + + /** + * ZGV master date should be before ZGV date. + * @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, + $person_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($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/ZuVieleZweckeIncomingPlausi.php b/application/libraries/issues/plausichecks/ZuVieleZweckeIncomingPlausi.php new file mode 100644 index 000000000..df5d50936 --- /dev/null +++ b/application/libraries/issues/plausichecks/ZuVieleZweckeIncomingPlausi.php @@ -0,0 +1,129 @@ +_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; + $person_id = isset($params['person_id']) ? $params['person_id'] : null; + + // get all students failing the plausicheck + $prestudentRes = $this->_getFalscherIncomingZweck( + $studiensemester_kurzbz, + $studiengang_kz, + $bisio_id, + $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('anzahl' => $prestudent->anzahl), + 'resolution_params' => array('bisio_id' => $prestudent->bisio_id) + ); + } + } + + // return the results + return success($results); + } + + /** + * There should be exactly one Incoming Zweck. + * @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, + $person_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, stg.studiengang_kz, + bisio.bisio_id, (SELECT count(*) FROM bis.tbl_bisio_zweck WHERE bisio_id = bisio.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 + 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($person_id)) + { + $qry .= " AND zwecke.person_id = ?"; + $params[] = $person_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/application/libraries/issues/resolvers/CORE_PERSON_0005.php b/application/libraries/issues/resolvers/CORE_PERSON_0005.php deleted file mode 100644 index 1d768e70c..000000000 --- a/application/libraries/issues/resolvers/CORE_PERSON_0005.php +++ /dev/null @@ -1,36 +0,0 @@ -_ci =& get_instance(); // get code igniter instance - - $this->_ci->load->model('person/Person_model', 'PersonModel'); - - // load geburtsnation for the given person - $this->_ci->PersonModel->addSelect('geburtsnation'); - $personRes = $this->_ci->PersonModel->load($params['issue_person_id']); - - if (isError($personRes)) return $personRes; - - if (hasData($personRes)) - { - // get person data - $personData = getData($personRes)[0]; - - // if geburtsnation present, issue is resolved - return success(!isEmptyString($personData->geburtsnation)); - } - else - return success(false); // if no person found, not resolved - } -} \ No newline at end of file diff --git a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0004.php b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0004.php index cbce2b01e..0dabb00c1 100644 --- a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0004.php +++ b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0004.php @@ -12,16 +12,13 @@ class CORE_STUDENTSTATUS_0004 implements IIssueResolvedChecker if (!isset($params['prestudent_id']) || !is_numeric($params['prestudent_id'])) return error('Prestudent Id missing, issue_id: '.$params['issue_id']); - if (!isset($params['studiensemester_kurzbz']) || isEmptyString($params['studiensemester_kurzbz'])) - return error('Studiensemester missing, issue_id: '.$params['issue_id']); - $this->_ci =& get_instance(); // get code igniter instance $this->_ci->load->library('issues/plausichecks/InaktiverStudentAktiverStatus'); // check if issue persists $checkRes = $this->_ci->inaktiverstudentaktiverstatus->getInaktiverStudentAktiverStatus( - $params['studiensemester_kurzbz'], + null, null, $params['prestudent_id'] ); diff --git a/application/models/system/App_model.php b/application/models/system/App_model.php new file mode 100644 index 000000000..85d015f42 --- /dev/null +++ b/application/models/system/App_model.php @@ -0,0 +1,14 @@ +dbTable = 'system.tbl_app'; + $this->pk = 'app'; + } +} diff --git a/application/models/system/FehlerApp_model.php b/application/models/system/FehlerApp_model.php new file mode 100644 index 000000000..d803894f1 --- /dev/null +++ b/application/models/system/FehlerApp_model.php @@ -0,0 +1,15 @@ +dbTable = 'system.tbl_fehler_app'; + $this->pk = array('fehlercode', 'app'); + $this->hasSequence = false; + } +} \ No newline at end of file diff --git a/application/models/system/Fehler_model.php b/application/models/system/Fehler_model.php index 28618f6d9..cf0c45092 100644 --- a/application/models/system/Fehler_model.php +++ b/application/models/system/Fehler_model.php @@ -9,6 +9,44 @@ class Fehler_model extends DB_Model { parent::__construct(); $this->dbTable = 'system.tbl_fehler'; - $this->pk = 'fehlercode'; + $this->pk = array('fehlercode'); + $this->hasSequence = false; + } + + /** + * Gets all fehler for particular apps. + * @param $apps string of one app or array with multiple + * @return object success or error + */ + public function getByApps($apps) + { + if (is_string($apps)) $apps = [$apps]; + + $params = []; + + $qry = " + SELECT + fehlercode, fehler_kurzbz, fehlercode_extern, fehlertext, fehlertyp_kurzbz + FROM + system.tbl_fehler fe"; + + if (!isEmptyArray($apps)) + { + $qry .= " + WHERE EXISTS ( + SELECT 1 + FROM + system.tbl_fehler_app + WHERE + fehlercode = fe.fehlercode + AND app IN ? + )"; + + $params[] = $apps; + } + + $qry .= " ORDER BY fehlercode;"; + + return $this->execReadOnlyQuery($qry, $params); } } diff --git a/application/models/system/Fehlerkonfiguration_model.php b/application/models/system/Fehlerkonfiguration_model.php index bf8de4cde..2186ef933 100644 --- a/application/models/system/Fehlerkonfiguration_model.php +++ b/application/models/system/Fehlerkonfiguration_model.php @@ -15,17 +15,21 @@ class Fehlerkonfiguration_model extends DB_Model /** * Retrieve all set configuration parameters, optionally filtered by app. - * @param string $app + * @param string $apps * @return object success or error */ - public function getKonfiguration($app = null) + public function getKonfiguration($apps = null) { + if (is_string($apps)) $apps = [$apps]; $fehlerkonfiguration = array(); - $this->addSelect('fehlercode, konfigurationstyp_kurzbz, konfiguration, fehler_kurzbz'); + $this->addDistinct(); + $this->addSelect('fehler.fehlercode, konftyp.konfigurationstyp_kurzbz, tbl_fehler_konfiguration.konfiguration, fehler.fehler_kurzbz'); $this->addJoin('system.tbl_fehler_konfigurationstyp konftyp', 'konfigurationstyp_kurzbz'); $this->addJoin('system.tbl_fehler fehler', 'fehlercode'); - $fehlerkonfigurationRes = isset($app) ? $this->loadWhere(array('fehler.app' => $app)) : $this->load(); + $this->addJoin('system.tbl_fehler_app fe_app', 'fehlercode'); + if (isset($apps) && !isEmptyArray($apps)) $this->db->where_in('fe_app.app', $apps); + $fehlerkonfigurationRes = $this->load(); if (isError($fehlerkonfigurationRes)) return $fehlerkonfigurationRes; diff --git a/application/models/system/Fehlerkonfigurationstyp_model.php b/application/models/system/Fehlerkonfigurationstyp_model.php index dc1c7957f..07a0b88ee 100644 --- a/application/models/system/Fehlerkonfigurationstyp_model.php +++ b/application/models/system/Fehlerkonfigurationstyp_model.php @@ -11,37 +11,4 @@ class Fehlerkonfigurationstyp_model extends DB_Model $this->dbTable = 'system.tbl_fehler_konfigurationstyp'; $this->pk = array('konfigurationstyp_kurzbz'); } - - /** - * Retrieve all set configuration parameters, optionally filtered by app. - * @param string $app - * @return object success or error - */ - public function getKonfiguration($app = null) - { - $fehlerkonfiguration = array(); - - $this->addSelect('fehlercode, konfigurationstyp_kurzbz, konfiguration, fehler_kurzbz'); - $this->addJoin('system.tbl_fehler_konfigurationstyp konftyp', 'konfigurationstyp_kurzbz'); - $this->addJoin('system.tbl_fehler fehler', 'fehlercode'); - $fehlerkonfigurationRes = isset($app) ? $this->loadWhere(array('fehler.app' => $app)) : $this->load(); - - if (isError($fehlerkonfigurationRes)) return $fehlerkonfigurationRes; - - if (hasData($fehlerkonfigurationRes)) - { - $fehlerkonfigurationData = getData($fehlerkonfigurationRes); - foreach ($fehlerkonfigurationData as $fk) - { - $konf = json_decode($fk->konfiguration); - if (is_array($konf)) - { - $fk->konfiguration = $konf; - $fehlerkonfiguration[] = $fk; - } - } - } - - return success($fehlerkonfiguration); - } } diff --git a/application/models/system/Fehlerzustaendigkeiten_model.php b/application/models/system/Fehlerzustaendigkeiten_model.php index 9277f3609..8e98ab0e6 100644 --- a/application/models/system/Fehlerzustaendigkeiten_model.php +++ b/application/models/system/Fehlerzustaendigkeiten_model.php @@ -12,6 +12,67 @@ class Fehlerzustaendigkeiten_model extends DB_Model $this->pk = 'fehlerzustaendigkeiten_id'; } + /** + * Get all Fehler for which user is hauptzuständig (is in charge). + * @return object success or error + */ + public function getFehlerForUserHauptzustaendig() + { + $params = [getAuthPersonId()]; + + $this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel'); + + // get oes of uid for which there is a current funktion + $all_funktionen_oe_kurzbz = array(); + $benutzerfunktionRes = $this->BenutzerfunktionModel->getBenutzerFunktionByUid(getAuthUID(), null, date('Y-m-d'), date('Y-m-d')); + + if (isError($benutzerfunktionRes)) return $benutzerfunktionRes; + + if (hasData($benutzerfunktionRes)) + { + foreach (getData($benutzerfunktionRes) as $benutzerfunktion) + { + $all_funktionen_oe_kurzbz[$benutzerfunktion->oe_kurzbz][] = $benutzerfunktion->funktion_kurzbz; + } + } + + $query = "WITH zustaendigkeiten AS ( + SELECT fehlercode, + CASE + WHEN zst.person_id = ?"; + + if (!isEmptyArray($all_funktionen_oe_kurzbz)) + { + $params[] = array_keys($all_funktionen_oe_kurzbz); + $query .= " OR (zst.oe_kurzbz IN ? AND zst.funktion_kurzbz IS NULL) /* if oe is specified in fehler_zustaendigkeiten */"; + + // check for each oe for each function if zustaendig + foreach ($all_funktionen_oe_kurzbz as $oe_kurzbz => $funktionen_kurzbz) + { + foreach ($funktionen_kurzbz as $funktion_kurzbz) + { + $query .= " OR (zst.oe_kurzbz = '$oe_kurzbz' AND zst.funktion_kurzbz = '$funktion_kurzbz')"; + } + } + } + + $query .= " THEN TRUE + ELSE FALSE + END AS \"zustaendig\" + FROM system.tbl_fehler_zustaendigkeiten zst + ) + SELECT + fehler.fehler_kurzbz, fehler.fehlercode + FROM + system.tbl_fehler fehler + LEFT JOIN zustaendigkeiten USING(fehlercode) + WHERE + zustaendigkeiten.fehlercode IS NULL + OR zustaendigkeiten.zustaendig = TRUE"; + + return $this->execReadOnlyQuery($query, $params); + } + /** * Gets active Mitarbeiter not assigned to a Fehler. * @param $fehlercode diff --git a/application/models/system/Issue_model.php b/application/models/system/Issue_model.php index 331b0f050..0e3ee3fbc 100644 --- a/application/models/system/Issue_model.php +++ b/application/models/system/Issue_model.php @@ -20,45 +20,20 @@ class Issue_model extends DB_Model * @param string $fehlercode_extern * @return object success with issues or error */ - public function getOpenIssues($fehlercodes, $person_id = null, $oe_kurzbz = null, $fehlercode_extern = null) + public function getOpenIssues($fehlercodes, $person_id = null, $oe_kurzbz = null, $fehlercode_extern = null, $hauptzustaendig = false) { - $params = array(); // issue exists for a fehlercode (or fehlercode_extern), person_id, oe_kurzbz, if not verarbeitet yet - $qry = 'SELECT - iss.issue_id, iss.fehlercode, fe.fehler_kurzbz, iss.inhalt, iss.fehlercode_extern, - iss.inhalt_extern, iss.person_id, iss.oe_kurzbz, iss.behebung_parameter, - iss.datum, iss.verarbeitetvon, iss.verarbeitetamum - FROM - system.tbl_issue iss - JOIN system.tbl_fehler fe USING (fehlercode) - WHERE - verarbeitetamum IS NULL'; - - if (!isEmptyArray($fehlercodes)) - { - $qry .= ' AND fehlercode IN ?'; - $params[] = $fehlercodes; - } - - if (!isEmptyString($fehlercode_extern)) - { - $qry .= ' AND fehlercode_extern = ?'; - $params[] = $fehlercode_extern; - } - - if (isset($person_id)) - { - $qry .= ' AND person_id = ?'; - $params[] = $person_id; - } - - if (isset($oe_kurzbz)) - { - $qry .= ' AND oe_kurzbz = ?'; - $params[] = $oe_kurzbz; - } - - return $this->execQuery($qry, $params); + return $this->_getIssues( + $person_id, + $oe_kurzbz, + $fehlertyp_kurzbz = null, + $apps = null, + $ist_verarbeitet = false, + $behebung_parameter = null, + $fehlercodes, + $fehlercode_extern, + $hauptzustaendig + ); } /** @@ -69,8 +44,14 @@ class Issue_model extends DB_Model * @param string $fehlercode_extern if provided, only issues with this external fehlercode are counted (for identifying issues from external systems). * @return Object success with number of issues or error */ - public function getOpenIssueCount($fehlercode, $person_id = null, $oe_kurzbz = null, $fehlercode_extern = null, $behebung_parameter = null) - { + public function getOpenIssueCount( + $fehlercode, + $person_id = null, + $oe_kurzbz = null, + $fehlercode_extern = null, + $behebung_parameter = null, + $hauptzustaendig = false + ) { $params = array($fehlercode); // issue exists for a fehlercode (or fehlercode_extern), person_id, oe_kurzbz, if not verarbeitet yet $qry = 'SELECT count(*) as anzahl_open_issues FROM system.tbl_issue @@ -83,7 +64,7 @@ class Issue_model extends DB_Model $params[] = $fehlercode_extern; } - if (isset($person_id)) + if (isset($person_id) && is_numeric($person_id)) { $qry .= ' AND person_id = ?'; $params[] = $person_id; @@ -110,4 +91,149 @@ class Issue_model extends DB_Model return $this->execQuery($qry, $params); } + + /** + * Gets issues which are open, i.e. not resolved. + * @param int $person_id + * @param string $oe_kurzbz + * @param string $fehlertyp_kurzbz + * @param string|array $apps + * @param array $behebung_parameter + + * @return object success with issues or error + */ + public function getOpenIssuesByProperties( + $person_id = null, + $oe_kurzbz = null, + $fehlertyp_kurzbz = null, + $apps = null, + $behebung_parameter = null, + $hauptzustaendig = false + ) { + return $this->_getIssues( + $person_id, + $oe_kurzbz, + $fehlertyp_kurzbz, + $apps, + $ist_verarbeitet = false, + $behebung_parameter, + $fehlercodes = null, + $fehlercode_extern = null, + $hauptzustaendig + ); + } + + /** + * Gets issues which are open, i.e. not resolved. + * @param int $person_id + * @param string $oe_kurzbz + * @param string $fehlertyp_kurzbz + * @param array $apps only issues for given apps are retrieved + * @param bool $ist_verarbeitet wether the issue has already been resolved + * @param array $behebung_parameter + * @param array $fehlercodes + * @param string $fehlercode_extern + * @return object success with issues or error + */ + private function _getIssues( + $person_id = null, + $oe_kurzbz = null, + $fehlertyp_kurzbz = null, + $apps = null, + $ist_verarbeitet = null, + $behebung_parameter = null, + $fehlercodes = null, + $fehlercode_extern = null, + $hauptzustaendig = false + ) { + $params = array(); + + $qry = 'SELECT + iss.issue_id, iss.fehlercode, fe.fehler_kurzbz, iss.inhalt, iss.fehlercode_extern, + iss.inhalt_extern, iss.person_id, iss.oe_kurzbz, iss.behebung_parameter, + iss.datum, iss.verarbeitetvon, iss.verarbeitetamum + FROM + system.tbl_issue iss + JOIN system.tbl_fehler fe USING (fehlercode) + WHERE + TRUE'; + + if (isset($person_id) && is_numeric($person_id)) + { + $qry .= ' AND person_id = ?'; + $params[] = $person_id; + } + + if (isset($oe_kurzbz)) + { + $qry .= ' AND oe_kurzbz = ?'; + $params[] = $oe_kurzbz; + } + + if (isset($fehlertyp_kurzbz)) + { + $qry .= ' AND fehlertyp_kurzbz = ?'; + $params[] = $fehlertyp_kurzbz; + } + + if (isset($apps)) + { + if (is_string($apps)) $apps = [$apps]; + + if (is_array($apps)) + { + $qry .= ' AND EXISTS (SELECT 1 FROM system.tbl_fehler_app WHERE fehlercode = fe.fehlercode AND app IN ?)'; + $params[] = $apps; + } + } + + if (is_bool($ist_verarbeitet)) + { + $qry .= $ist_verarbeitet ? ' AND verarbeitetamum IS NOT NULL' : ' AND verarbeitetamum IS NULL'; + } + + if (!isEmptyArray($behebung_parameter)) + { + // convert array to JSON string for postgres + $behebung_parameter_string = json_encode($behebung_parameter); + + if ($behebung_parameter_string) + { + // check if jsonb value is equal to the passed parameters array (if value contains array and array contains value) + $qry .= ' AND behebung_parameter @> ? AND behebung_parameter <@ ?'; + $params = array_merge($params, array($behebung_parameter_string, $behebung_parameter_string)); + } + } + + // retrieving only fehler for which user is hauptzuständig + if ($hauptzustaendig === true) + { + $this->load->model('system/Fehlerzustaendigkeiten_model', 'FehlerzustaendigkeitenModel'); + + $result = $this->FehlerzustaendigkeitenModel->getFehlerForUserHauptzustaendig(); + + + if (isError($result)) return $result; + + if (hasData($result)) + { + $fehlercodesZust = array_column(getData($result), 'fehlercode'); + $fehlercodes = isEmptyArray($fehlercodes) ? $fehlercodesZust : array_intersect($fehlercodes, $fehlercodesZust); + } + } + + if (!isEmptyArray($fehlercodes)) + { + $qry .= ' AND fehlercode IN ?'; + $params[] = $fehlercodes; + } + + if (isset($fehlercode_extern)) + { + $qry .= ' AND fehlercode_extern = ?'; + $params[] = $fehlercode_extern; + } + + return $this->execQuery($qry, $params); + } } diff --git a/application/views/system/issues/issuesData.php b/application/views/system/issues/issuesData.php index edaee9058..d94fb2904 100644 --- a/application/views/system/issues/issuesData.php +++ b/application/views/system/issues/issuesData.php @@ -49,7 +49,8 @@ $query .= " inhalt AS \"Inhalt\", inhalt_extern AS \"Inhalt extern\", iss.person_id AS \"PersonId\", iss.oe_kurzbz AS \"OE\", ftyp.bezeichnung_mehrsprachig[".$this->db->escape($language_index)."] AS \"Fehlertyp\", stat.bezeichnung_mehrsprachig[".$this->db->escape($language_index)."] AS \"Fehlerstatus\", - verarbeitetvon AS \"Verarbeitet von\",verarbeitetamum AS \"Verarbeitet am\", fr.app AS \"Applikation\", + verarbeitetvon AS \"Verarbeitet von\",verarbeitetamum AS \"Verarbeitet am\", + (SELECT STRING_AGG(app, ', ') FROM system.tbl_fehler_app WHERE fehlercode = fr.fehlercode GROUP BY fehlercode) AS \"Applikation\", fr.fehlertyp_kurzbz AS \"Fehlertypcode\", iss.status_kurzbz AS \"Statuscode\", pers.vorname AS \"Vorname\", pers.nachname AS \"Nachname\", ( @@ -168,7 +169,7 @@ $query .= ") $query .= ") "; -if (!isEmptyString($APPS)) $query .= " AND fr.app IN ".$APPS; +if (!isEmptyString($APPS)) $query .= " AND EXISTS (SELECT 1 FROM system.tbl_fehler_app WHERE fehlercode = fr.fehlercode AND app IN ".$APPS.")"; $query .= " ORDER BY CASE diff --git a/application/views/system/issues/issuesKonfigurationData.php b/application/views/system/issues/issuesKonfigurationData.php index a83dc73ce..dbd41c6e9 100644 --- a/application/views/system/issues/issuesKonfigurationData.php +++ b/application/views/system/issues/issuesKonfigurationData.php @@ -2,7 +2,8 @@ // get assigned Konfiguration $query = "SELECT - konftyp.konfigurationstyp_kurzbz, fe.fehlercode, fe.fehler_kurzbz, konf.konfiguration, fe.app, + konftyp.konfigurationstyp_kurzbz, fe.fehlercode, fe.fehler_kurzbz, konf.konfiguration, + (SELECT STRING_AGG(app, ', ') FROM system.tbl_fehler_app WHERE fehlercode = fe.fehlercode GROUP BY fehlercode) AS app, konftyp.beschreibung AS konfigurationsbeschreibung, konftyp.konfigurationsdatentyp, fe.fehlertext FROM system.tbl_fehler_konfiguration konf diff --git a/application/views/system/issues/issuesZustaendigkeitenData.php b/application/views/system/issues/issuesZustaendigkeitenData.php index d4cedd192..bce52a5f9 100644 --- a/application/views/system/issues/issuesZustaendigkeitenData.php +++ b/application/views/system/issues/issuesZustaendigkeitenData.php @@ -1,7 +1,8 @@ { + //this.$emit('issuesLoaded', this.issues); + this.openissuescount = result.data.openissues; + this.isFetching = false; + }) + .catch(this.$fhcAlert.handleSystemError); + }, + checkPerson() { + this.isFetching = true; + this.$api.call( + this.endpoint.checkPerson(this.person_id, this.hauptzustaendig) + ) + .then(result => { + //this.$emit('issuesLoaded', this.issues); + this.openissuescount = result.data.openissues; + this.isFetching = false; + }) + .catch(this.$fhcAlert.handleSystemError); + }, + toggle(event) { + this.$refs.issuesOverlay.toggle(event); + } + }, + template: ` +
+

Issues 

+
{{ openissuescount }}
+
+
+ + + + + + ` +} diff --git a/public/js/components/Issues/IssueList.js b/public/js/components/Issues/IssueList.js new file mode 100644 index 000000000..449e06c15 --- /dev/null +++ b/public/js/components/Issues/IssueList.js @@ -0,0 +1,93 @@ +import ApiIssueList from '../../api/factory/issueList.js'; + +export default { + name: 'IssueList', + emits: ['issuesLoaded'], + expose: ['fetchIssues'], + components: { + }, + props: { + person_id: Number, + oe_kurzbz: String, + fehlertyp_kurzbz: String, + apps: [String, Array], + behebung_parameter: Array, + hauptzustaendig: { + type: Boolean, + default: false + }, + date: null, + endpoint: { + type: Object, + default: ApiIssueList + } + }, + data() { + return { + title: "Issues", + currentDate: null, + isFetching: false, + issues: null + } + }, + computed: { + // if any property changes, get issues again + propertiesChanged() { + return `${this.person_id}|${this.oe_kurzbz}|${this.fehlertyp_kurzbz}||${this.apps}|${this.behebung_parameter}`; + }, + }, + watch: { + propertiesChanged(newVal, oldVal) { + this.fetchIssues(); + }, + }, + mounted() { + this.currentDate = this.date || new Date(); + this.fetchIssues(); + }, + methods: { + + fetchIssues() { + this.isFetching = true; + this.$api.call( + this.endpoint.getOpenIssuesByProperties( + this.person_id, + this.oe_kurzbz, + this.fehlertyp_kurzbz, + this.apps, + this.behebung_parameter, + this.hauptzustaendig + ) + ) + .then(result => { + this.issues = result.data; + this.$emit('issuesLoaded', this.issues); + this.isFetching = false; + }) + .catch(this.$fhcAlert.handleSystemError); + }, + formatDate(ds) { + if (ds == undefined) return ''; + var d = new Date(ds); + return d.getDate() + "." + (d.getMonth()+1) + "." + d.getFullYear() + } + }, + template: ` +
+ Loading... +
+
+ + + + + + + + +
DatumInhalt
{{ formatDate(item.datum) }}{{ item.inhalt }}
+ +
+
+ ` +} diff --git a/public/js/components/Stv/Studentenverwaltung/Details.js b/public/js/components/Stv/Studentenverwaltung/Details.js index e59492cf5..ee551a2c5 100644 --- a/public/js/components/Stv/Studentenverwaltung/Details.js +++ b/public/js/components/Stv/Studentenverwaltung/Details.js @@ -1,5 +1,6 @@ import FhcTabs from "../../Tabs.js"; import FhcHeader from "../../DetailHeader/DetailHeader.js"; +import IssueChecker from "../../Issues/IssueChecker.js"; import ApiStvApp from '../../../api/factory/stv/app.js'; @@ -10,7 +11,8 @@ export default { name: "DetailsPrestudent", components: { FhcTabs, - FhcHeader + FhcHeader, + IssueChecker }, data() { return { @@ -104,6 +106,13 @@ export default { + Pruefe Tabellen und Attribute!'; @@ -418,8 +419,9 @@ $tabellen=array( "system.tbl_benutzerrolle" => array("benutzerberechtigung_id","rolle_kurzbz","berechtigung_kurzbz","uid","funktion_kurzbz","oe_kurzbz","art","studiensemester_kurzbz","start","ende","negativ","updateamum", "updatevon","insertamum","insertvon","kostenstelle_id","anmerkung"), "system.tbl_berechtigung" => array("berechtigung_kurzbz","beschreibung"), "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"), + "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"), diff --git a/system/dbupdate_3.4/68834_fehlermonitoring_issues_weitere_features.php b/system/dbupdate_3.4/68834_fehlermonitoring_issues_weitere_features.php new file mode 100644 index 000000000..c8ab6864a --- /dev/null +++ b/system/dbupdate_3.4/68834_fehlermonitoring_issues_weitere_features.php @@ -0,0 +1,51 @@ +db_query("SELECT insertamum FROM system.tbl_fehler LIMIT 1")) +{ + $qry = "ALTER TABLE system.tbl_fehler ADD COLUMN insertamum timestamp DEFAULT now(); + ALTER TABLE system.tbl_fehler ADD COLUMN insertvon varchar(32); + ALTER TABLE system.tbl_fehler ADD COLUMN updateamum timestamp DEFAULT now(); + ALTER TABLE system.tbl_fehler ADD COLUMN updatevon varchar(32);"; + + if(!$db->db_query($qry)) + echo 'system.tbl_fehler '.$db->db_last_error().'
'; + else + echo '
Spalten insertamum, insertvon, updateamum, updatevon in system.tbl_fehler hinzugefügt'; +} + +if (!$result = @$db->db_query('SELECT 1 FROM system.tbl_fehler_app LIMIT 1')) +{ + $qry = 'CREATE TABLE system.tbl_fehler_app + ( + fehlercode varchar(64), + app varchar(32) NOT NULL, + insertamum timestamp DEFAULT now(), + insertvon varchar(32) + ); + + COMMENT ON TABLE system.tbl_fehler_app IS \'Fehler app Zuordnungen\'; + COMMENT ON COLUMN system.tbl_fehler_app.fehlercode IS \'Fehler\'; + COMMENT ON COLUMN system.tbl_fehler_app.app IS \'dem Fehler zugeweisene App\'; + + ALTER TABLE system.tbl_fehler_app ADD CONSTRAINT pk_fehler_app PRIMARY KEY (fehlercode, app); + ALTER TABLE system.tbl_fehler_app ADD CONSTRAINT fk_fehler_app_app FOREIGN KEY (app) REFERENCES system.tbl_app(app) ON UPDATE CASCADE ON DELETE RESTRICT; + ALTER TABLE system.tbl_fehler_app ADD CONSTRAINT fk_fehler_app_fehlercode FOREIGN KEY (fehlercode) REFERENCES system.tbl_fehler(fehlercode) ON UPDATE CASCADE ON DELETE CASCADE; + + GRANT SELECT, UPDATE, INSERT, DELETE ON system.tbl_fehler_app TO web; + GRANT SELECT, UPDATE, INSERT, DELETE ON system.tbl_fehler_app TO vilesci; + + -- prefill values + INSERT INTO system.tbl_fehler_app(fehlercode, app, insertvon) + SELECT fehlercode, app, \'dbupdate\' FROM system.tbl_fehler; + + -- remove not null constraint from old table + ALTER TABLE system.tbl_fehler ALTER COLUMN app DROP NOT NULL; + '; + + if(!$db->db_query($qry)) + echo 'system.tbl_fehler_app: '.$db->db_last_error().'
'; + else + echo ' system.tbl_fehler_app: Tabelle hinzugefuegt
'; +} \ No newline at end of file diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php index 5f6269365..2a25ac3bf 100644 --- a/system/phrasesupdate.php +++ b/system/phrasesupdate.php @@ -58177,6 +58177,26 @@ I have been informed that I am under no obligation to consent to the transmissio ) ), // ### Phrases Dashboard Admin END + array( + 'app' => 'core', + 'category' => 'ui', + 'phrase' => 'error_invalidId', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Id {id} ungültig', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Invalid Id {id}', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ) );