Merge branch 'feature-68834/Fehlermonitoring_Issues_weitere_features' into feature-39602/Fas_Statusbearbeitung_bei_Sperre

This commit is contained in:
Alexei Karpenko
2026-05-26 15:38:53 +02:00
80 changed files with 4230 additions and 428 deletions
+448
View File
@@ -0,0 +1,448 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
$config['fehler'] = array(
array(
'fehlercode' => '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
)
);
@@ -0,0 +1,200 @@
<?php
defined('BASEPATH') || exit('No direct script access allowed');
class IssueChecker extends FHCAPI_Controller
{
const DEFAULT_PERMISSION = 'system/issues_verwalten:r';
protected $person_id;
protected $_extensionName = null;
protected $_fehlercodes = [];
protected $_apps = [];
protected $errors = [];
protected $infos = [];
public function __construct($permissions = [])
{
$default_permissions = [
'checkPerson' => 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);
}
}
}
@@ -0,0 +1,104 @@
<?php
defined('BASEPATH') || exit('No direct script access allowed');
class Issues extends FHCAPI_Controller
{
const DEFAULT_PERMISSION = 'system/issues_verwalten:r';
public function __construct() {
parent::__construct(
array(
'getOpenIssuesByProperties' => 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 = <<<EOSQL
SELECT
person_id, uid, vorname, nachname, count(*) AS openissues ,
(select count(*) anz_aktiv
from hr.tbl_dienstverhaeltnis dv
where dv.mitarbeiter_uid=uid and dv.von<=now() and
(dv.bis is null OR dv.bis>=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());
}
}
}
@@ -0,0 +1,17 @@
<?php
defined('BASEPATH') || exit('No direct script access allowed');
require_once APPPATH.'/controllers/api/frontend/v1/issues/IssueChecker.php';
class StudentIssueChecker extends IssueChecker
{
protected $_apps = array(
'core',
'dvuh',
'bis'
);
//protected $_fehlercodes = array(
//~ 'CORE_AA_0001'
//);
}
+42 -60
View File
@@ -5,64 +5,46 @@
*/
class IssueResolver extends IssueResolver_Controller
{
public function __construct()
{
parent::__construct();
// set fehler codes which can be resolved by the job, with own resolver defined
// structure: fehlercode => 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'
);
}
@@ -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();
}
/**
@@ -0,0 +1,57 @@
<?php
/**
* Copyright (C) 2024 fhcomplete.org
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
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));
}
}
@@ -0,0 +1,46 @@
<?php
if (!defined("BASEPATH")) exit("No direct script access allowed");
class Manager extends Auth_Controller
{
/**
*
*/
public function __construct()
{
parent::__construct(
array(
'installAll' => '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);
}
}
@@ -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'));
@@ -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);
}
@@ -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)
);
+6 -16
View File
@@ -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);
@@ -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");
+382
View File
@@ -0,0 +1,382 @@
<?php
/**
* Copyright (C) 2025 fhcomplete.org
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
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);
}
}
+35 -20
View File
@@ -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);
}
@@ -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;
}
}
@@ -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;
}
}
@@ -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;
}
}
}
@@ -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'];
}
@@ -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 ?";
@@ -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 ?";
@@ -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 ?";
@@ -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 ?";
@@ -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 ?";
@@ -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 ?";
@@ -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 ?";
@@ -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 ?";
@@ -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 ?";
@@ -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 ?";
@@ -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 ?";
@@ -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
);
@@ -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
);
@@ -0,0 +1,131 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class FalscherIncomingZweckPlausi extends PlausiChecker
{
public function executePlausiCheck($params)
{
$results = array();
// get parameters from config
$exkludierte_studiengang_kz = isset($this->_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);
}
}
@@ -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;
@@ -0,0 +1,108 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class GeburtsnationFehlt extends PlausiChecker
{
public function executePlausiCheck($params)
{
$results = array();
// get parameters from config
$exkludierte_studiengang_kz = isset($this->_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);
}
}
@@ -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 ?";
@@ -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
);
@@ -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 ?";
@@ -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 ?";
@@ -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;
}
}
@@ -0,0 +1,125 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class KeinAufenthaltszweckPlausi extends PlausiChecker
{
public function executePlausiCheck($params)
{
$results = array();
// get parameters from config
$exkludierte_studiengang_kz = isset($this->_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);
}
}
@@ -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
);
@@ -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 ?";
@@ -0,0 +1,129 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class OutgoingAngerechneteEctsFehlenPlausi extends PlausiChecker
{
public function executePlausiCheck($params)
{
$results = array();
// get parameters from config
$exkludierte_studiengang_kz = isset($this->_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);
}
}
@@ -0,0 +1,128 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class OutgoingAufenthaltfoerderungfehltPlausi extends PlausiChecker
{
public function executePlausiCheck($params)
{
$results = array();
// get parameters from config
$exkludierte_studiengang_kz = isset($this->_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);
}
}
@@ -0,0 +1,128 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class OutgoingErworbeneEctsFehlenPlausi extends PlausiChecker
{
public function executePlausiCheck($params)
{
$results = array();
// get parameters from config
$exkludierte_studiengang_kz = isset($this->_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);
}
}
@@ -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))
{
@@ -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 ?";
@@ -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 ?";
@@ -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 ?";
@@ -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 ?";
@@ -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 ?";
@@ -0,0 +1,112 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class UhstatPersonkennungFehltCore extends PlausiChecker
{
const PERSONKENNUNG_KENNZEICHEN_TYPEN = ['vbpkAs', 'vbpkBf'];
public function executePlausiCheck($params)
{
$results = array();
// get parameters from config
$exkludierte_studiengang_kz = isset($this->_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);
}
}
@@ -0,0 +1,135 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class ZgvDatumInZukunft extends PlausiChecker
{
public function executePlausiCheck($params)
{
$results = array();
// get parameters from config
$exkludierte_studiengang_kz = isset($this->_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);
}
}
@@ -0,0 +1,118 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class ZgvDatumVorGeburtsdatum extends PlausiChecker
{
public function executePlausiCheck($params)
{
$results = array();
// get parameters from config
$exkludierte_studiengang_kz = isset($this->_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);
}
}
@@ -0,0 +1,118 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class ZgvMasterDatumInZukunft extends PlausiChecker
{
public function executePlausiCheck($params)
{
$results = array();
// get parameters from config
$exkludierte_studiengang_kz = isset($this->_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);
}
}
@@ -0,0 +1,118 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class ZgvMasterDatumVorGeburtsdatum extends PlausiChecker
{
public function executePlausiCheck($params)
{
$results = array();
// get parameters from config
$exkludierte_studiengang_kz = isset($this->_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);
}
}
@@ -0,0 +1,118 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class ZgvMasterDatumVorZgvdatum extends PlausiChecker
{
public function executePlausiCheck($params)
{
$results = array();
// get parameters from config
$exkludierte_studiengang_kz = isset($this->_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);
}
}
@@ -0,0 +1,129 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
require_once('PlausiChecker.php');
/**
*
*/
class ZuVieleZweckeIncomingPlausi extends PlausiChecker
{
public function executePlausiCheck($params)
{
$results = array();
// get parameters from config
$exkludierte_studiengang_kz = isset($this->_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);
}
}
@@ -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']));
@@ -1,36 +0,0 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* Geburtsnation missing
*/
class CORE_PERSON_0005 implements IIssueResolvedChecker
{
public function checkIfIssueIsResolved($params)
{
if (!isset($params['issue_person_id']) || !is_numeric($params['issue_person_id']))
return error('Person Id missing, issue_id: '.$params['issue_id']);
$this->_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
}
}
@@ -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']
);
+14
View File
@@ -0,0 +1,14 @@
<?php
class App_model extends DB_Model
{
/**
* Constructor
*/
public function __construct()
{
parent::__construct();
$this->dbTable = 'system.tbl_app';
$this->pk = 'app';
}
}
@@ -0,0 +1,15 @@
<?php
class FehlerApp_model extends DB_Model
{
/**
* Constructor
*/
public function __construct()
{
parent::__construct();
$this->dbTable = 'system.tbl_fehler_app';
$this->pk = array('fehlercode', 'app');
$this->hasSequence = false;
}
}
+39 -1
View File
@@ -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);
}
}
@@ -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;
@@ -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);
}
}
@@ -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
+166 -40
View File
@@ -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);
}
}
@@ -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
@@ -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
@@ -1,7 +1,8 @@
<?php
// get assigned Zustaendigkeiten
$query = "SELECT fehlerzustaendigkeiten_id, fe.fehlercode, fe.fehlercode_extern, fehler_kurzbz, fehlertext, fehlertyp_kurzbz, fe.app,
$query = "SELECT fehlerzustaendigkeiten_id, fe.fehlercode, fe.fehlercode_extern, fehler_kurzbz, fehlertext, fehlertyp_kurzbz,
(SELECT STRING_AGG(app, ', ') FROM system.tbl_fehler_app WHERE fehlercode = fe.fehlercode GROUP BY fehlercode) AS app,
pers.person_id, pers.vorname, pers.nachname,
oe.oe_kurzbz, oe.bezeichnung AS oe_bezeichnung, funk.funktion_kurzbz, funk.beschreibung AS funktion_beschreibung
FROM system.tbl_fehler_zustaendigkeiten zst
+20
View File
@@ -0,0 +1,20 @@
export default {
checkPerson(person_id)
{
return {
method: 'post',
url: '/api/frontend/v1/issues/StudentIssueChecker/checkPerson',
params: { person_id }
};
},
countPersonOpenIssues(person_id)
{
return {
method: 'get',
url: '/api/frontend/v1/issues/StudentIssueChecker/countPersonOpenIssues',
params: { person_id }
};
}
}
+12
View File
@@ -0,0 +1,12 @@
export default {
getOpenIssuesByProperties(person_id, oe_kurzbz, fehlertyp_kurzbz, apps, behebung_parameter, hauptzustaendig)
{
return {
method: 'get',
url: '/api/frontend/v1/issues/Issues/getOpenIssuesByProperties',
params: { person_id, oe_kurzbz, fehlertyp_kurzbz, apps, behebung_parameter, hauptzustaendig }
};
}
}
+109
View File
@@ -0,0 +1,109 @@
import IssueList from './IssueList.js';
import DefaultIssueCheckerEndpoint from '../../api/factory/issueChecker.js';
import DefaultIssueListEndpoint from '../../api/factory/issueList.js';
export default {
name: 'IssueChecker',
expose: ['countPersonOpenIssues', 'checkPerson'],
//emits: ['issuesLoaded'],
components: {
IssueList,
"p-skeleton": primevue.skeleton,
"p-overlaypanel": primevue.overlaypanel
},
props: {
person_id: Number,
//oe_kurzbz: String,
apps: [String, Array],
hauptzustaendig: {
type: Boolean,
default: false
},
endpoint: {
type: Object,
required: true,
default: DefaultIssueCheckerEndpoint
},
issueListEndpoint: {
type: Object,
required: true,
default: DefaultIssueListEndpoint
},
issueListStyle: {
type: Object
},
issueListStyleBreakpoints: {
type: Object
},
includeIssueList: {
type: Boolean,
default: true
},
},
data() {
return {
title: "IssueChecker",
currentDate: null,
isFetching: false,
openissuescount: null
}
},
computed: {
},
watch: {
person_id() {
this.countPersonOpenIssues();
}
},
mounted() {
this.countPersonOpenIssues();
},
methods: {
countPersonOpenIssues() {
this.isFetching = true;
this.$api.call(
this.endpoint.countPersonOpenIssues(this.person_id, this.hauptzustaendig)
)
.then(result => {
//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: `
<div>
<h4 class="mb-1">Issues&nbsp;<a class="refresh-issues" title="erneut prüfen" href="javascript:void(0);" @click="checkPerson"><i class="fas fa-sync"></i></a></h4>
<h6 v-if="!isFetching" class="text-muted" :role="includeIssueList ? 'button' : ''" @click="toggle">{{ openissuescount }}</h6>
<h6 v-else class="mb-2"><p-skeleton v-if="isFetching" style="width:45%"></p-skeleton></h6>
</div>
<p-overlaypanel ref="issuesOverlay" :style="issueListStyle" :breakpoints="issueListStyleBreakpoints" v-if="includeIssueList">
<issue-list
ref="issueListRef"
:person_id = "person_id"
:apps = "apps"
:hauptzustaendig = "hauptzustaendig"
:endpoint = "issueListEndpoint"
>
</issue-list>
</p-overlaypanel>
`
}
+93
View File
@@ -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: `
<div v-if="isFetching" class="spinner-border" role="status">
<span class="visually-hidden">Loading...</span>
</div>
<div v-if="!isFetching && issues!=null && issues!=[]">
<table class="table table-bordered">
<tbody>
<tr><th>Datum</th><th>Inhalt</th></tr>
<tr v-for="(item, index) in issues" :key="item.issue_id">
<td>{{ formatDate(item.datum) }}</td>
<td>{{ item.inhalt }} <br>
<slot name="additionalText" v-bind="item"></slot>
</td>
</tr>
</tbody>
</table>
</div>
`
}
@@ -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 {
<template #valueBetaTile>{{tile_MatrNr}}</template>
<template #titleGammaTile>PersKz</template>
<template #valueGammaTile>{{tile_PersKz}}</template>
<template #issues>
<issue-checker
ref="issueCheckerRef"
:person_id="students[0].person_id"
:apps="['core', 'dvuh', 'bis']"
>
</issue-checker></template>
</fhc-header>
<fhc-tabs
v-if="students.length == 1"
+3 -1
View File
@@ -94,6 +94,7 @@ require_once('dbupdate_3.4/71399_dashboard_update_widget_paths.php');
require_once('dbupdate_3.4/71645_studvw_messagetab_ladezeit.php');
require_once('dbupdate_3.4/71566_studienordnungsdokument_neuer_organisationseinheitstyp_programm.php');
require_once('dbupdate_3.4/70376_lohnguide.php');
require_once('dbupdate_3.4/68834_fehlermonitoring_issues_weitere_features.php');
// *** Pruefung und hinzufuegen der neuen Attribute und Tabellen
echo '<H2>Pruefe Tabellen und Attribute!</H2>';
@@ -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"),
@@ -0,0 +1,51 @@
<?php
if (! defined('DB_NAME')) exit('No direct script access allowed');
// ADD COLUMNS insertamum, insertvon, updateamum, updatevon to system.tbl_fehler
if(!$result = @$db->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 '<strong>system.tbl_fehler '.$db->db_last_error().'</strong><br>';
else
echo '<br>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 '<strong>system.tbl_fehler_app: '.$db->db_last_error().'</strong><br>';
else
echo ' system.tbl_fehler_app: Tabelle hinzugefuegt<br>';
}
+20
View File
@@ -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'
)
)
)
);