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
+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']
);