diff --git a/application/config/navigation.php b/application/config/navigation.php index 928f5bae3..56d142d08 100644 --- a/application/config/navigation.php +++ b/application/config/navigation.php @@ -283,10 +283,18 @@ $config['navigation_menu']['system/issues/Issues/*'] = array( 'fehlerzustaendigkeiten' => array( 'link' => site_url('system/issues/IssuesZustaendigkeiten'), 'description' => 'Fehler Zuständigkeiten', - 'icon' => 'cogs', + 'icon' => 'users', 'sort' => 100, 'target' => '_blank', 'requiredPermissions' => array('admin:rw') - ) + ), + 'fehlerkonfiguration' => array( + 'link' => site_url('system/issues/IssuesKonfiguration'), + 'description' => 'Fehler Konfiguration', + 'icon' => 'cogs', + 'sort' => 200, + 'target' => '_blank', + 'requiredPermissions' => array('admin:rw') + ), ); diff --git a/application/controllers/jobs/PlausiIssueProducer.php b/application/controllers/jobs/PlausiIssueProducer.php index 943d7aa46..b667e835d 100644 --- a/application/controllers/jobs/PlausiIssueProducer.php +++ b/application/controllers/jobs/PlausiIssueProducer.php @@ -1,16 +1,29 @@ load->library('issues/PlausicheckProducerLib'); - $this->load->library('IssuesLib'); + $this->load->library('issues/PlausicheckDefinitionLib'); + + // load models + $this->load->model('organisation/studiensemester_model', 'StudiensemesterModel'); + + // get current Studiensemester + $studiensemesterRes = $this->StudiensemesterModel->getAkt(); + if (hasData($studiensemesterRes)) $this->_currentStudiensemester = getData($studiensemesterRes)[0]->studiensemester_kurzbz; + + // set fehler which can be produced by the job + // structure: fehler_kurzbz => class (library) name for resolving + $this->_fehlerLibMappings = $this->plausicheckdefinitionlib->getFehlerLibMappings(); } /** @@ -20,43 +33,10 @@ class PlausiIssueProducer extends JOB_Controller */ public function run($studiensemester_kurzbz = null, $studiengang_kz = null) { - $fehlerKurzbz = $this->plausicheckproducerlib->getFehlerKurzbz(); + // get Studiensemester + if (isEmptyString($studiensemester_kurzbz)) $studiensemester_kurzbz = $this->_currentStudiensemester; - $this->logInfo("Plausicheck issue producer job started"); - - // get the data returned by Plausicheck - foreach ($fehlerKurzbz as $fehler_kurzbz) - { - // execute the check - $this->logInfo("Checking " . $fehler_kurzbz . "..."); - $plausicheckRes = $this->plausicheckproducerlib->producePlausicheckIssue($fehler_kurzbz, $studiensemester_kurzbz, $studiengang_kz); - - if (isError($plausicheckRes)) $this->logError(getError($plausicheckRes)); - - if (hasData($plausicheckRes)) - { - $plausicheckData = getData($plausicheckRes); - - foreach ($plausicheckData as $plausiData) - { - // get the data needed for issue production - $person_id = isset($plausiData['person_id']) ? $plausiData['person_id'] : null; - $oe_kurzbz = isset($plausiData['oe_kurzbz']) ? $plausiData['oe_kurzbz'] : null; - $fehlertext_params = isset($plausiData['fehlertext_params']) ? $plausiData['fehlertext_params'] : null; - $resolution_params = isset($plausiData['resolution_params']) ? $plausiData['resolution_params'] : null; - - // write the issue - $addIssueRes = $this->issueslib->addFhcIssue($fehler_kurzbz, $person_id, $oe_kurzbz, $fehlertext_params, $resolution_params); - - // log if error, or log info if inserted new issue - if (isError($addIssueRes)) - $this->logError(getError($addIssueRes)); - elseif (hasData($addIssueRes) && is_integer(getData($addIssueRes))) - $this->logInfo("Plausicheck issue " . $fehler_kurzbz . " successfully produced, person_id: " . $person_id); - } - } - } - - $this->logInfo("Plausicheck issue producer job stopped"); + // producing issues for semester and optionally Studiengang + $this->producePlausicheckIssues(array('studiensemester_kurzbz' => $studiensemester_kurzbz, 'studiengang_kz' => $studiengang_kz)); } } diff --git a/application/controllers/system/issues/Issues.php b/application/controllers/system/issues/Issues.php index 6d959a024..44c2ff5d3 100644 --- a/application/controllers/system/issues/Issues.php +++ b/application/controllers/system/issues/Issues.php @@ -26,6 +26,7 @@ class Issues extends Auth_Controller // Load models $this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel'); $this->load->model('organisation/Organisationseinheit_model', 'OrganisationseinheitModel'); + $this->load->model('system/Sprache_model', 'SpracheModel'); $this->loadPhrases( array( @@ -45,10 +46,11 @@ class Issues extends Auth_Controller public function index() { $oes_for_issues = $this->_getOesForIssues(); + $language_index = $this->_getLanguageIndex(); $this->load->view( 'system/issues/issues', - $oes_for_issues + array_merge($oes_for_issues, array('language_index' => $language_index)) ); } @@ -166,4 +168,28 @@ class Issues extends Auth_Controller 'all_oe_kurzbz_berechtigt' => $all_oe_kurzbz_berechtigt ); } + + /** + * Gets language index of currently logged in user. + * @return object int (the index, start at 1) + */ + private function _getLanguageIndex() + { + $idx = 1; + $this->SpracheModel->addSelect('sprache, index'); + $langRes = $this->SpracheModel->load(); + + if (hasData($langRes)) + { + $userLang = getUserLanguage(); + $lang = getData($langRes); + + foreach ($lang as $l) + { + if ($l->sprache == $userLang) $idx = $l->index; + } + } + + return $idx; + } } diff --git a/application/controllers/system/issues/IssuesKonfiguration.php b/application/controllers/system/issues/IssuesKonfiguration.php new file mode 100644 index 000000000..a19a2a93b --- /dev/null +++ b/application/controllers/system/issues/IssuesKonfiguration.php @@ -0,0 +1,305 @@ + 'admin:r', + 'getApps' => 'admin:r', + 'getFehlerKonfigurationByApp' => 'admin:r', + 'saveFehlerKonfiguration' => 'admin:rw', + 'deleteKonfiguration' => 'admin:rw', + 'deleteKonfigurationsWerte' => 'admin:rw' + ) + ); + + // Load libraries + $this->load->library('IssuesLib'); + $this->load->library('WidgetLib'); + + // Load models + $this->load->model('system/Fehlerkonfigurationstyp_model', 'FehlerkonfigurationstypModel'); + $this->load->model('system/Fehlerkonfiguration_model', 'FehlerkonfigurationModel'); + + $this->loadPhrases( + array( + 'global', + 'ui', + 'filter', + 'fehlermonitoring' + ) + ); + + $this->_setAuthUID(); // sets property uid + $this->setControllerId(); // sets the controller id + } + + // ----------------------------------------------------------------------------------------------------------------- + // Public methods + + /** + * Load initial view. + */ + public function index() + { + $this->load->view("system/issues/issuesKonfiguration.php"); + } + + /** + * Loads all Apps to which Fehler exist. + */ + public function getApps() + { + $this->FehlerModel->addDistinct(); + $this->FehlerModel->addSelect('app'); + $this->FehlerModel->addJoin('system.tbl_fehler_konfigurationstyp', 'app'); + $this->FehlerModel->addOrder('app'); + + $appRes = $this->FehlerModel->load(); + + $this->outputJson($appRes); + } + + /** + * Gets all fehlercodes, optionally by app. + */ + public function getFehlerKonfigurationByApp() + { + $app = $this->input->get('app'); + + // get all Konfiguration types, optionally filtered by app + $this->FehlerkonfigurationstypModel->addSelect('konfigurationstyp_kurzbz, konfigurationsdatentyp, beschreibung'); + $this->FehlerkonfigurationstypModel->addOrder('konfigurationstyp_kurzbz'); + $konfRes = isEmptyString($app) + ? $this->FehlerkonfigurationstypModel->load() + : $this->FehlerkonfigurationstypModel->loadWhere(array('app' => $app)); + + if (isError($konfRes)) $this->terminateWithJsonError($this->p->t('fehlermonitoring', 'fehlerFehlerKonfigurationLaden')); + + // get all Fehler, optionally filtered by app + $params = array('fehlercode_extern' => null); + $this->FehlerModel->addSelect('fehlercode, fehler_kurzbz, fehlertyp_kurzbz, fehlertext'); + $this->FehlerModel->addOrder('fehlercode'); + if (!isEmptyString($app)) $params['app'] = $app; + $fehlerRes = $this->FehlerModel->loadWhere($params); + + if (isError($fehlerRes)) $this->terminateWithJsonError($this->p->t('fehlermonitoring', 'fehlerFehlerLaden')); + + // return object with retrieved data + $konfObj = new StdClass(); + $konfObj->konfigurationstypen = array(); + $konfObj->fehler = array(); + + if (hasData($konfRes)) $konfObj->konfigurationstypen = getData($konfRes); + if (hasData($fehlerRes)) $konfObj->fehler = getData($fehlerRes); + + $this->outputJsonSuccess($konfObj); + } + + /** + * Saves a Fehler configuration, inserts new configuration or updates existing. + * Checks if datatype of passed configuration is correct. + */ + public function saveFehlerKonfiguration() + { + $result = null; + $konfigurationstyp_kurzbz = $this->input->post('konfigurationstyp_kurzbz'); + $fehlercode = $this->input->post('fehlercode'); + $konfigurationsWert = $this->input->post('konfigurationsWert'); + + // check if all params passed + if (isEmptyString($konfigurationstyp_kurzbz)) $this->terminateWithJsonError($this->p->t('fehlermonitoring', 'ungueltigerKonfigurationstyp')); + + if (isEmptyString($fehlercode)) $this->terminateWithJsonError($this->p->t('fehlermonitoring', 'fehlercodeFehlt')); + + // separate by semicolon if multiple values passed + $konfigurationsWert = explode(';', $konfigurationsWert); + + // check konfigurationswert + + // get the expected data type + $dataType = self::STRING_DATA_TYPE; + $this->FehlerkonfigurationstypModel->addSelect('konfigurationsdatentyp'); + $konfigtypRes = $this->FehlerkonfigurationstypModel->loadWhere(array('konfigurationstyp_kurzbz' => $konfigurationstyp_kurzbz)); + + if (hasData($konfigtypRes)) + { + $konfigurationsdatentyp = getData($konfigtypRes)[0]->konfigurationsdatentyp; + foreach ($konfigurationsWert as $idx => $konfWert) + { + // check if data type correct + $valid = false; + switch ($konfigurationsdatentyp) + { + case self::INTEGER_DATA_TYPE: + $valid = (string)(int)$konfWert == $konfWert; + $konfigurationsWert[$idx] = (int) $konfWert; + break; + case self::FLOAT_DATA_TYPE: + $valid = (string)(float)$konfWert == $konfWert; + $konfigurationsWert[$idx] = (float) $konfWert; + break; + default: + $valid = is_string($konfWert) && preg_match('/^[A-Za-z0-9_]+$/', $konfWert); + } + if (!$valid) $this->terminateWithJsonError($this->p->t('fehlermonitoring', 'ungueltigerKonfigurationswert', array($konfigurationsdatentyp))); + } + } + + // check if konfiguration already set for the fehlercode + $this->FehlerkonfigurationModel->addSelect('konfiguration'); + $fehlerkonfigurationRes = $this->FehlerkonfigurationModel->loadWhere( + array( + 'konfigurationstyp_kurzbz' => $konfigurationstyp_kurzbz, + 'fehlercode' => $fehlercode + ) + ); + + if (isError($fehlerkonfigurationRes)) $this->terminateWithJsonError($this->p->t('fehlermonitoring', 'fehlerFehlerKonfigurationLaden')); + + // if konfiguration exists, update by add konfiguration values to existing + if (hasData($fehlerkonfigurationRes)) + { + $fehlerkonfiguration = getData($fehlerkonfigurationRes); + + $existingKonf = json_decode($fehlerkonfiguration[0]->konfiguration); + + if (!$existingKonf) $this->terminateWithJsonError($this->p->t('fehlermonitoring', 'fehlerJsonDekodierung')); + + if (!is_array($existingKonf)) $existingKonf = array($existingKonf); + + $newKonf = json_encode(array_values(array_unique(array_merge($existingKonf, $konfigurationsWert)))); + if (!$newKonf) $this->terminateWithJsonError("error when encoding JSON"); + + $result = $this->FehlerkonfigurationModel->update( + array('konfigurationstyp_kurzbz' => $konfigurationstyp_kurzbz, 'fehlercode' => $fehlercode), + array('konfiguration' => $newKonf, 'updateamum' => 'NOW()', 'updatevon' => $this->_uid) + ); + } + else // if no konfiguration exists, add new konfiguration entry + { + $newKonf = json_encode($konfigurationsWert); + if (!$newKonf) $this->terminateWithJsonError("error when encoding JSON"); + + $result = $this->FehlerkonfigurationModel->insert( + array( + 'konfigurationstyp_kurzbz' => $konfigurationstyp_kurzbz, + 'fehlercode' => $fehlercode, + 'konfiguration' => $newKonf, + 'insertvon' => $this->_uid + ) + ); + } + + // output result (insert or update) + $this->outputJson($result); + } + + /** + * Deletes values of a Konfiguration. + */ + public function deleteKonfigurationsWerte() + { + $konfigurationstyp_kurzbz = $this->input->post('konfigurationstyp_kurzbz'); + $fehlercode = $this->input->post('fehlercode'); + $konfigurationsWert = $this->input->post('konfigurationsWert'); + + // check if Konfigurationstyp correctly passed + if (isEmptyString($konfigurationstyp_kurzbz)) $this->terminateWithJsonError($this->p->t('fehlermonitoring', 'ungueltigerKonfigurationstyp')); + + // check if fehlercode correctly passed + if (isEmptyString($fehlercode)) $this->terminateWithJsonError($this->p->t('fehlermonitoring', 'fehlercodeFehlt')); + + // separate by semicolon if multiple values passed + $konfigurationsWert = explode(';', $konfigurationsWert); + + // check if konfiguration already set for the fehlercode + $this->FehlerkonfigurationModel->addSelect('konfiguration'); + $fehlerkonfigurationRes = $this->FehlerkonfigurationModel->loadWhere( + array( + 'konfigurationstyp_kurzbz' => $konfigurationstyp_kurzbz, + 'fehlercode' => $fehlercode + ) + ); + + if (!hasData($fehlerkonfigurationRes)) $this->terminateWithJsonError($this->p->t('fehlermonitoring', 'fehlerFehlerKonfigurationLaden')); + + // if konfiguration exists, update values + if (hasData($fehlerkonfigurationRes)) + { + $fehlerkonfiguration = getData($fehlerkonfigurationRes); + + $existingKonf = json_decode($fehlerkonfiguration[0]->konfiguration); + + if (!$existingKonf) $this->terminateWithJsonError($this->p->t('fehlermonitoring', 'fehlerJsonDekodierung')); + + if (!is_array($existingKonf)) $existingKonf = array($existingKonf); + + $newKonfArr = array_values(array_diff($existingKonf, $konfigurationsWert)); + + // if no konfiguration values left, delete whole entry + if (isEmptyArray($newKonfArr)) + { + $this->outputJson( + $this->FehlerkonfigurationModel->delete( + array('konfigurationstyp_kurzbz' => $konfigurationstyp_kurzbz, 'fehlercode' => $fehlercode) + ) + ); + } + else + { + $newKonf = json_encode($newKonfArr); + if (!$newKonf) $this->terminateWithJsonError("error when encoding JSON"); + + // if there are still values, delete only part of the konfiguration + $this->outputJson( + $this->FehlerkonfigurationModel->update( + array('konfigurationstyp_kurzbz' => $konfigurationstyp_kurzbz, 'fehlercode' => $fehlercode), + array('konfiguration' => $newKonf, 'updateamum' => 'NOW()', 'updatevon' => $this->_uid) + ) + ); + } + } + } + + /** + * Deletes a Konfiguration. + */ + public function deleteKonfiguration() + { + $konfigurationstyp_kurzbz = $this->input->post('konfigurationstyp_kurzbz'); + $fehlercode = $this->input->post('fehlercode'); + + // check if Konfigurationstyp correctly passed + if (isEmptyString($konfigurationstyp_kurzbz)) $this->terminateWithJsonError($this->p->t('fehlermonitoring', 'ungueltigerKonfigurationstyp')); + + // check if fehlercode correctly passed + if (isEmptyString($fehlercode)) $this->terminateWithJsonError($this->p->t('fehlermonitoring', 'fehlercodeFehlt')); + + $this->outputJson( + $this->FehlerkonfigurationModel->delete( + array('konfigurationstyp_kurzbz' => $konfigurationstyp_kurzbz, 'fehlercode' => $fehlercode) + ) + ); + } + + /** + * Retrieve the UID of the logged user and checks if it is valid + */ + private function _setAuthUID() + { + $this->_uid = getAuthUID(); + + if (!$this->_uid) show_error('User authentification failed'); + } +} diff --git a/application/controllers/system/issues/IssuesZustaendigkeiten.php b/application/controllers/system/issues/IssuesZustaendigkeiten.php index fd3e6192a..d7bf9836e 100644 --- a/application/controllers/system/issues/IssuesZustaendigkeiten.php +++ b/application/controllers/system/issues/IssuesZustaendigkeiten.php @@ -26,7 +26,6 @@ class IssuesZustaendigkeiten extends Auth_Controller // Load models $this->load->model('organisation/Organisationseinheit_model', 'OrganisationseinheitModel'); $this->load->model('system/Fehler_model', 'FehlerModel'); - $this->load->model('system/Fehler_model', 'FehlerModel'); $this->load->model('system/Fehlerzustaendigkeiten_model', 'FehlerzustaendigkeitenModel'); $this->loadPhrases( @@ -70,7 +69,7 @@ class IssuesZustaendigkeiten extends Auth_Controller { $app = $this->input->get('app'); - //$this->FehlerModel->addSelect('fehlercode, fehler_kurzbz, fehlertext, fehlertyp_kurzbz'); + $this->FehlerModel->addSelect('fehlercode, fehler_kurzbz, fehlertext, fehlertyp_kurzbz, app'); $this->FehlerModel->addOrder('fehlercode'); $fehlerRes = isset($app) ? $this->FehlerModel->loadWhere(array('app' => $app)) : $this->FehlerModel->load(); diff --git a/application/controllers/system/issues/Plausichecks.php b/application/controllers/system/issues/Plausichecks.php index 2dd166794..53ff8afe8 100644 --- a/application/controllers/system/issues/Plausichecks.php +++ b/application/controllers/system/issues/Plausichecks.php @@ -16,7 +16,8 @@ class Plausichecks extends Auth_Controller ); // Load libraries - $this->load->library('issues/PlausicheckProducerLib'); + $this->load->library('issues/PlausicheckProducerLib', array('app' => 'core')); + $this->load->library('issues/PlausicheckDefinitionLib'); $this->load->library('WidgetLib'); // Load models @@ -44,18 +45,43 @@ class Plausichecks extends Auth_Controller $fehler_kurzbz = $this->input->get('fehler_kurzbz'); // issues array for passing issue texts - $issueTexts = array(); + $allIssues = array(); // all fehler kurzbz which are going to be checked - $fehlerKurzbz = !isEmptyString($fehler_kurzbz) ? array($fehler_kurzbz) : $this->plausicheckproducerlib->getFehlerKurzbz(); + $fehlerKurzbz = !isEmptyString($fehler_kurzbz) ? array($fehler_kurzbz) : $this->plausicheckdefinitionlib->getFehlerKurzbz(); + $fehlerLibMappings = $this->plausicheckdefinitionlib->getFehlerLibMappings(); // set Studiengang to null if not passed if (isEmptyString($studiengang_kz)) $studiengang_kz = null; // get the data returned by Plausicheck foreach ($fehlerKurzbz as $fehler_kurzbz) { + // get Text and fehlercode of the Fehler + $this->FehlerModel->addSelect('fehlercode, fehlertext, fehlertyp_kurzbz'); + $fehlerRes = $this->FehlerModel->loadWhere(array('fehler_kurzbz' => $fehler_kurzbz)); + + if (isError($fehlerRes)) $this->terminateWithJsonError(getError($fehlerRes)); + + // do not check error if no data + if (!hasData($fehlerRes)) continue; + + // get the error data + $fehler = getData($fehlerRes)[0]; + + // initialize issue array + $allIssues[$fehler_kurzbz] = array('fehlercode' => $fehler->fehlercode, 'data' => array()); + + // get library name for producing issue + $libName = $fehlerLibMappings[$fehler_kurzbz]; + // execute the check - $issueTexts[$fehler_kurzbz] = array(); - $plausicheckRes = $this->plausicheckproducerlib->producePlausicheckIssue($fehler_kurzbz, $studiensemester_kurzbz, $studiengang_kz); + $plausicheckRes = $this->plausicheckproducerlib->producePlausicheckIssue( + $libName, + $fehler_kurzbz, + array( + 'studiensemester_kurzbz' => $studiensemester_kurzbz, + 'studiengang_kz' => $studiengang_kz + ) + ); if (isError($plausicheckRes)) $this->terminateWithJsonError(getError($plausicheckRes)); @@ -69,19 +95,13 @@ class Plausichecks extends Auth_Controller $person_id = isset($plausiData['person_id']) ? $plausiData['person_id'] : null; $oe_kurzbz = isset($plausiData['oe_kurzbz']) ? $plausiData['oe_kurzbz'] : null; $fehlertext_params = isset($plausiData['fehlertext_params']) ? $plausiData['fehlertext_params'] : null; - $resolution_params = isset($plausiData['resolution_params']) ? $plausiData['resolution_params'] : null; - - // get Text of the Fehler - $this->FehlerModel->addSelect('fehlertext'); - $fehlerRes = $this->FehlerModel->loadWhere(array('fehler_kurzbz' => $fehler_kurzbz)); - - if (isError($fehlerRes)) $this->outputJsonError(getError($fehlerRes)); // optionally replace fehler parameters in text, output the fehlertext - if (hasData($fehlerRes)) + if (!isEmptyString($fehler->fehlertext)) { - // use issue fehler text from database if present - $fehlerText = getData($fehlerRes)[0]->fehlertext; + $fehlercode = $fehler->fehlercode; + $fehlerText = $fehler->fehlertext; + $fehlerTyp = $fehler->fehlertyp_kurzbz; if (!isEmptyArray($fehlertext_params)) { @@ -91,6 +111,14 @@ class Plausichecks extends Auth_Controller $fehlerText = vsprintf($fehlerText, $fehlertext_params); } + + if (isset($person_id)) $fehlerText .= "; person_id: $person_id"; + if (isset($oe_kurzbz)) $fehlerText .= "; oe_kurzbz: $oe_kurzbz"; + + $issueObj = new StdClass(); + $issueObj->fehlertext = $fehlerText; + $issueObj->type = $fehlerTyp; + $allIssues[$fehler_kurzbz]['data'][] = $issueObj; } else // if no issue text found, use generic text { @@ -100,12 +128,11 @@ class Plausichecks extends Auth_Controller // add generic parameters to issue text if (isset($person_id)) $fehlerText .= "; person_id: $person_id"; if (isset($oe_kurzbz)) $fehlerText .= "; oe_kurzbz: $oe_kurzbz"; - $issueTexts[$fehler_kurzbz][] = $fehlerText; } } } - $this->outputJsonSuccess($issueTexts); + $this->outputJsonSuccess($allIssues); } /** @@ -130,13 +157,38 @@ class Plausichecks extends Auth_Controller if (isError($studiengaengeRes)) show_error(getError($studiengaengeRes)); - $fehlerKurzbz = $this->plausicheckproducerlib->getFehlerKurzbz(); + $fehlerKurzbz = $this->plausicheckdefinitionlib->getFehlerKurzbz(); + + $db = new DB_Model(); + + // get fehlercodes for fehler_kurzbz + $fehlerRes = $db->execReadOnlyQuery( + 'SELECT + fehler_kurzbz, fehlercode + FROM + system.tbl_fehler + WHERE + fehler_kurzbz IN ?', + array($fehlerKurzbz) + ); + + if (isError($fehlerRes)) show_error(getError($fehlerRes)); + + $fehlerKurzbzCodeMappings = array(); + if (hasData($fehlerRes)) + { + $fehler = getData($fehlerRes); + foreach ($fehler as $fe) + { + $fehlerKurzbzCodeMappings[$fe->fehler_kurzbz] = $fe->fehlercode; + } + } return array( 'semester' => hasData($studiensemesterRes) ? getData($studiensemesterRes) : array(), 'currsemester' => hasData($currSemRes) ? getData($currSemRes) : array(), 'studiengaenge' => hasData($studiengaengeRes) ? getData($studiengaengeRes) : array(), - 'fehler' => $fehlerKurzbz + 'fehlerKurzbzCodeMappings' => $fehlerKurzbzCodeMappings ); } } diff --git a/application/core/IIssueExistsChecker.php b/application/core/IIssueExistsChecker.php deleted file mode 100644 index 7f5a6b6e5..000000000 --- a/application/core/IIssueExistsChecker.php +++ /dev/null @@ -1,21 +0,0 @@ -behebung_parameter) ? json_decode($issue->behebung_parameter, true) : array() ); - // if called from extension (extension name set), path includes extension names, otherwise it is the core library folder - $libRootPath = isset($this->_extensionName) ? 'extensions/' . $this->_extensionName . '/' : ''; + // 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 . '/'; - $issuesLibFilePath = DOC_ROOT . self::CI_PATH . '/' . $libRootPath . 'libraries/' . self::ISSUE_RESOLVERS_FOLDER . '/' . $libName . '.php'; + + // 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)) diff --git a/application/core/PlausiIssueProducer_Controller.php b/application/core/PlausiIssueProducer_Controller.php new file mode 100644 index 000000000..0dce7a487 --- /dev/null +++ b/application/core/PlausiIssueProducer_Controller.php @@ -0,0 +1,66 @@ +_extensionName) ? $this->_extensionName : null; + + // load libraries + $this->load->library('issues/PlausicheckProducerLib', array('extensionName' => $extensionName, 'app' => $this->_app)); + $this->load->library('IssuesLib'); + } + + protected function producePlausicheckIssues($params) + { + $this->logInfo("Plausicheck issue producer job started"); + + // get the data returned by Plausicheck + foreach ($this->_fehlerLibMappings as $fehler_kurzbz => $libName) + { + // execute the check + $this->logInfo("Checking " . $fehler_kurzbz . "..."); + $plausicheckRes = $this->plausicheckproducerlib->producePlausicheckIssue( + $libName, + $fehler_kurzbz, + $params + ); + + if (isError($plausicheckRes)) $this->logError(getError($plausicheckRes)); + + if (hasData($plausicheckRes)) + { + $plausicheckData = getData($plausicheckRes); + + foreach ($plausicheckData as $plausiData) + { + // get the data needed for issue production + $person_id = isset($plausiData['person_id']) ? $plausiData['person_id'] : null; + $oe_kurzbz = isset($plausiData['oe_kurzbz']) ? $plausiData['oe_kurzbz'] : null; + $fehlertext_params = isset($plausiData['fehlertext_params']) ? $plausiData['fehlertext_params'] : null; + $resolution_params = isset($plausiData['resolution_params']) ? $plausiData['resolution_params'] : null; + + // write the issue + $addIssueRes = $this->issueslib->addFhcIssue($fehler_kurzbz, $person_id, $oe_kurzbz, $fehlertext_params, $resolution_params); + + // log if error, or log info if inserted new issue + if (isError($addIssueRes)) + $this->logError(getError($addIssueRes)); + elseif (hasData($addIssueRes) && is_integer(getData($addIssueRes))) + $this->logInfo("Plausicheck issue " . $fehler_kurzbz . " successfully produced, person_id: " . $person_id); + } + } + } + + $this->logInfo("Plausicheck issue producer job stopped"); + } +} diff --git a/application/libraries/SignatureLib.php b/application/libraries/SignatureLib.php index 132545219..c44ffc5f6 100644 --- a/application/libraries/SignatureLib.php +++ b/application/libraries/SignatureLib.php @@ -35,6 +35,17 @@ class SignatureLib { try { + // Dont send Document if it is bigger than 30 MB (Limit of Signature Server) + if (filesize($inputFileName) > 30000000) + { + $returnObject = new stdClass(); + $returnObject->code = 1; + $returnObject->error = 1; + $returnObject->retval = 'File to big'; + + return $returnObject; + } + // Get the content of the given file $inputFileContent = file_get_contents($inputFileName); if ($inputFileContent === false) // if failed @@ -72,4 +83,3 @@ class SignatureLib return null; } } - diff --git a/application/libraries/issues/PlausicheckDefinitionLib.php b/application/libraries/issues/PlausicheckDefinitionLib.php new file mode 100644 index 000000000..cef28a736 --- /dev/null +++ b/application/libraries/issues/PlausicheckDefinitionLib.php @@ -0,0 +1,55 @@ + class (library) name for resolving + private $_fehlerLibMappings = array( + 'AbbrecherAktiv' => 'AbbrecherAktiv', + 'AbschlussstatusFehlt' => 'AbschlussstatusFehlt', + 'AktSemesterNull' => 'AktSemesterNull', + 'AktiverStudentOhneStatus' => 'AktiverStudentOhneStatus', + 'AusbildungssemPrestudentUngleichAusbildungssemStatus' => 'AusbildungssemPrestudentUngleichAusbildungssemStatus', + 'BewerberNichtZumRtAngetreten' => 'BewerberNichtZumRtAngetreten', + 'DatumAbschlusspruefungFehlt' => 'DatumAbschlusspruefungFehlt', + 'DatumSponsionFehlt' => 'DatumSponsionFehlt', + 'DatumStudiensemesterFalscheReihenfolge' => 'DatumStudiensemesterFalscheReihenfolge', + 'FalscheAnzahlAbschlusspruefungen' => 'FalscheAnzahlAbschlusspruefungen', + 'FalscheAnzahlHeimatadressen' => 'FalscheAnzahlHeimatadressen', + 'FalscheAnzahlZustelladressen' => 'FalscheAnzahlZustelladressen', + 'GbDatumWeitZurueck' => 'GbDatumWeitZurueck', + 'InaktiverStudentAktiverStatus' => 'InaktiverStudentAktiverStatus', + 'IncomingHeimatNationOesterreich' => 'IncomingHeimatNationOesterreich', + 'IncomingOhneIoDatensatz' => 'IncomingOhneIoDatensatz', + 'IncomingOrGsFoerderrelevant' => 'IncomingOrGsFoerderrelevant', + 'InskriptionVorLetzerBismeldung' => 'InskriptionVorLetzerBismeldung', + 'NationNichtOesterreichAberGemeinde' => 'NationNichtOesterreichAberGemeinde', + 'OrgformStgUngleichOrgformPrestudent' => 'OrgformStgUngleichOrgformPrestudent', + 'PrestudentMischformOhneOrgform' => 'PrestudentMischformOhneOrgform', + 'StgPrestudentUngleichStgStudienplan' => 'StgPrestudentUngleichStgStudienplan', + 'StgPrestudentUngleichStgStudent' => 'StgPrestudentUngleichStgStudent', + 'StudentstatusNachAbbrecher' => 'StudentstatusNachAbbrecher' + //'StudienplanUngueltig' => 'StudienplanUngueltig' + ); + + /** + * 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); + } +} diff --git a/application/libraries/issues/PlausicheckLib.php b/application/libraries/issues/PlausicheckLib.php deleted file mode 100644 index 19442de3c..000000000 --- a/application/libraries/issues/PlausicheckLib.php +++ /dev/null @@ -1,1362 +0,0 @@ -_ci =& get_instance(); // get ci instance - - // load models - $this->_ci->load->model('crm/Prestudent_model', 'PrestudentModel'); - $this->_ci->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel'); - $this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); - - // get database for queries - $this->_db = new DB_Model(); - } - - //------------------------------------------------------------------------------------------------------------------ - // Studiengang checks - - /** - * Studiengang should be the same for prestudent and student. - * @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 - * @return success with prestudents or error - */ - public function getStgPrestudentUngleichStgStudent($studiengang_kz = null, $prestudent_id = null) - { - $params = array(); - - $qry = " - SELECT - pre.person_id, pre.prestudent_id, stg.oe_kurzbz prestudent_stg_oe_kurzbz, student_stg.oe_kurzbz student_stg_oe_kurzbz - FROM - public.tbl_prestudent pre - JOIN public.tbl_student stud USING(prestudent_id) - JOIN public.tbl_person pers USING(person_id) - JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz - JOIN public.tbl_studiengang student_stg ON stud.studiengang_kz = student_stg.studiengang_kz - WHERE - stud.studiengang_kz != pre.studiengang_kz"; - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($prestudent_id)) - { - $qry .= " AND pre.prestudent_id = ?"; - $params[] = $prestudent_id; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - /** - * Orgform of a Studiengang in Studienplan should be the same as orgform of student. - * @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 - * @return success with prestudents or error - */ - public function getOrgformStgUngleichOrgformPrestudent($studiensemester_kurzbz, $studiengang_kz = null, $prestudent_id = null) - { - $params = array($studiensemester_kurzbz); - - $qry = " - SELECT - prestudent.person_id, prestudent.prestudent_id, status.studiensemester_kurzbz, - studiengang.orgform_kurzbz AS stg_orgform, status.orgform_kurzbz AS student_orgform, - prestudent.studiengang_kz AS student_studiengang, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz - FROM - public.tbl_studiengang studiengang - JOIN public.tbl_student student USING(studiengang_kz) - JOIN public.tbl_prestudent prestudent USING(prestudent_id) - JOIN public.tbl_prestudentstatus status USING(prestudent_id) - JOIN public.tbl_benutzer benutzer on(benutzer.uid = student.student_uid) - JOIN public.tbl_studiengang stg ON prestudent.studiengang_kz = stg.studiengang_kz - LEFT JOIN lehre.tbl_studienplan stpl USING (studienplan_id) - WHERE - benutzer.aktiv = true - AND status.status_kurzbz IN ('Student', 'Unterbrecher', 'Abbrecher', 'Diplomand', 'Absolvent') - AND studiengang.studiengang_kz < 10000 - AND status.studiensemester_kurzbz = ? - AND NOT (status.orgform_kurzbz IS NULL AND studiengang.mischform = FALSE) - AND NOT EXISTS( - SELECT 1 - FROM - lehre.tbl_studienplan - JOIN - lehre.tbl_studienordnung USING(studienordnung_id) - WHERE - tbl_studienplan.studienplan_id = stpl.studienplan_id - AND tbl_studienordnung.studiengang_kz = prestudent.studiengang_kz - AND tbl_studienplan.orgform_kurzbz = status.orgform_kurzbz)"; - - if (isset($prestudent_id)) - { - $qry .= " AND prestudent.prestudent_id = ?"; - $params[] = $prestudent_id; - } - - if (isset($studiengang_kz)) - { - $qry .= " AND studiengang.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - $qry .= " - ORDER BY student_uid"; - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - /** - * Students in "mixed" Studiengang should have Orgform. - * @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 - * @return success with prestudents or error - */ - public function getPrestudentMischformOhneOrgform($studiensemester_kurzbz, $studiengang_kz = null, $prestudent_id = null) - { - $params = array($studiensemester_kurzbz); - - $qry = " - SELECT - pre.person_id, pre.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, status.studiensemester_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 USING(studiengang_kz) - WHERE - status.status_kurzbz IN ('Bewerber', 'Student') - AND stg.mischform - AND (status.orgform_kurzbz='' OR status.orgform_kurzbz IS NULL) - AND status.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; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - /** - * Studiengang should be the same for prestudent and studienplan. - * @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 studienordnung_id int if check is to be executed only for a certain studienordnung_id - * @return success with prestudents or error - */ - public function getStgPrestudentUngleichStgStudienplan($studiengang_kz = null, $prestudent_id = null, $studienordnung_id = null) - { - $params = array(); - - $qry = " - SELECT - DISTINCT ON (ps.prestudent_id) ps.person_id, ps.prestudent_id, stordnung.studienordnung_id, - stplan.bezeichnung AS studienplan, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz - FROM - public.tbl_prestudent ps - JOIN public.tbl_prestudentstatus USING(prestudent_id) - JOIN lehre.tbl_studienplan stplan USING(studienplan_id) - JOIN lehre.tbl_studienordnung stordnung USING(studienordnung_id) - JOIN public.tbl_person USING(person_id) - JOIN public.tbl_studiengang stg ON ps.studiengang_kz = stg.studiengang_kz - WHERE - ps.studiengang_kz<>stordnung.studiengang_kz - AND stg.melderelevant"; - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($prestudent_id)) - { - $qry .= " AND ps.prestudent_id = ?"; - $params[] = $prestudent_id; - } - - if (isset($studienordnung_id)) - { - $qry .= " AND stordnung.studienordnung_id = ?"; - $params[] = $studienordnung_id; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - //------------------------------------------------------------------------------------------------------------------ - // Studentstatus checks - - /** - * Abbrecher cannot be active. - * @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 - * @return success with prestudents or error - */ - public function getAbbrecherAktiv($studiengang_kz = null, $prestudent_id = null) - { - $params = array(); - - $qry = " - SELECT - pre.person_id, pre.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz - FROM - public.tbl_prestudentstatus pre_status - JOIN public.tbl_prestudent pre USING(prestudent_id) - JOIN public.tbl_student student USING(prestudent_id) - JOIN public.tbl_benutzer benutzer on(benutzer.uid=student.student_uid) - JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz - WHERE - pre_status.status_kurzbz ='Abbrecher' - AND benutzer.aktiv=true"; - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($prestudent_id)) - { - $qry .= " AND pre.prestudent_id = ?"; - $params[] = $prestudent_id; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - /** - * There shouldn't be any status after Abbrecher status. - * @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 - * @return success with prestudents or error - */ - public function getStudentstatusNachAbbrecher($studiengang_kz = null, $prestudent_id = null) - { - $params = array(); - - $qry = " - SELECT - prestudent.person_id, prestudent.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz - FROM - public.tbl_student student - JOIN public.tbl_prestudent prestudent USING(prestudent_id) - JOIN public.tbl_prestudentstatus prestatus USING(prestudent_id) - JOIN public.tbl_studiengang stg ON prestudent.studiengang_kz = stg.studiengang_kz - WHERE - prestatus.status_kurzbz = 'Abbrecher' - AND get_rolle_prestudent(prestudent.prestudent_id, prestatus.studiensemester_kurzbz) <> 'Abbrecher'"; - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($prestudent_id)) - { - $qry .= " AND prestudent.prestudent_id = ?"; - $params[] = $prestudent_id; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - /** - * Ausbildungssemester of prestudent (lehrverband) must be the same as Ausbildungssemester of prestudentstatus. - * @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 - * @return success with prestudents or error - */ - public function getAusbildungssemPrestudentUngleichAusbildungssemStatus($studiensemester_kurzbz, $studiengang_kz = null, $prestudent_id = null) - { - $params = array($studiensemester_kurzbz, $studiensemester_kurzbz, $studiensemester_kurzbz); - - $qry = " - SELECT - DISTINCT(student.student_uid), student.student_uid, prestudent.person_id, prestudent.prestudent_id, - status.ausbildungssemester AS status_ausbildungssemester, lv.semester AS student_ausbildungssemester, status.studiensemester_kurzbz, - stg.oe_kurzbz AS prestudent_stg_oe_kurzbz - FROM - public.tbl_student student - JOIN public.tbl_studentlehrverband lv USING(student_uid) - JOIN public.tbl_prestudent prestudent USING(prestudent_id) - JOIN public.tbl_prestudentstatus status USING(prestudent_id) - JOIN public.tbl_studiengang stg ON prestudent.studiengang_kz = stg.studiengang_kz - WHERE - status.studiensemester_kurzbz = ? - AND lv.studiensemester_kurzbz = ? - AND status.status_kurzbz NOT IN ('Interessent','Bewerber','Aufgenommener','Wartender','Abgewiesener','Unterbrecher') - AND get_rolle_prestudent (prestudent_id, ?)='Student' - AND status.ausbildungssemester != lv.semester"; - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($prestudent_id)) - { - $qry .= " AND prestudent.prestudent_id = ?"; - $params[] = $prestudent_id; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - /** - * Students with active status should have an active Benutzer. - * @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 - * @return success with prestudents or error - */ - public function getInaktiverStudentAktiverStatus($studiensemester_kurzbz, $studiengang_kz = null, $prestudent_id = null) - { - $aktStudiensemesterRes = $this->_ci->StudiensemesterModel->getAkt(); - - if (isError($aktStudiensemesterRes)) return $aktStudiensemesterRes; - - $studiensemester_kurzbz = hasData($aktStudiensemesterRes) ? getData($aktStudiensemesterRes)[0]->studiensemester_kurzbz : ''; - - $params = array($studiensemester_kurzbz); - - $qry = " - SELECT - DISTINCT(student.student_uid), prestudent.person_id, prestudent.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz - FROM - public.tbl_benutzer benutzer - JOIN public.tbl_student student on(benutzer.uid = student.student_uid) - JOIN public.tbl_prestudent prestudent USING(prestudent_id) - JOIN public.tbl_studiengang stg ON prestudent.studiengang_kz = stg.studiengang_kz - WHERE - benutzer.aktiv=false - AND EXISTS (SELECT 1 FROM public.tbl_prestudentstatus WHERE prestudent_id = prestudent.prestudent_id AND studiensemester_kurzbz = ?) - AND get_rolle_prestudent(prestudent_id, NULL) IN ('Student', 'Diplomand', 'Unterbrecher', 'Praktikant') - AND stg.melderelevant - AND prestudent.bismelden"; - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($prestudent_id)) - { - $qry .= " AND prestudent.prestudent_id = ?"; - $params[] = $prestudent_id; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - /** - * 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 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 - * @param prestudent_id int if check is to be executed only for one prestudent - * @return success with prestudents or error - */ - public function getInskriptionVorLetzerBismeldung($studiensemester_kurzbz, $studiengang_kz = null, $prestudent_id = null) - { - // get Bismeldedatum - $datumBis = $this->_getBisdateFromSemester($studiensemester_kurzbz); - - $params = array($datumBis, $studiensemester_kurzbz, $datumBis); - - // get active students - $qry = " - SELECT - DISTINCT ON (student.student_uid) ? AS datum_bismeldung, - prestudent.person_id, prestudent.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, status.studiensemester_kurzbz - FROM - public.tbl_benutzer benutzer - JOIN public.tbl_student student on(benutzer.uid = student.student_uid) - JOIN public.tbl_prestudent prestudent USING(prestudent_id) - JOIN public.tbl_prestudentstatus status USING(prestudent_id) - JOIN public.tbl_studiengang stg ON prestudent.studiengang_kz = stg.studiengang_kz - WHERE - benutzer.aktiv=true - AND status.studiensemester_kurzbz = ? - /* inscription date before date of first student status */ - AND ( - SELECT datum - FROM public.tbl_prestudentstatus - WHERE prestudent_id = prestudent.prestudent_id - AND studiensemester_kurzbz = status.studiensemester_kurzbz - AND status_kurzbz = 'Student' - ORDER BY datum, insertamum, ext_id - LIMIT 1 - ) < ? - AND stg.melderelevant - AND prestudent.bismelden"; - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($prestudent_id)) - { - $qry .= " AND prestudent.prestudent_id = ?"; - $params[] = $prestudent_id; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - /** - * 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 - * @return success with prestudents or error - */ - public function getDatumStudiensemesterFalscheReihenfolge($studiengang_kz = null, $prestudent_id = null) - { - $params = array(); - - // all active students with Status student in current semester - $qry = " - SELECT DISTINCT ON (prestudent_id) * - FROM ( - SELECT - prestudent.person_id, prestudent.prestudent_id, - stg.studiengang_kz, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, - ROW_NUMBER () OVER ( - PARTITION BY prestudent.prestudent_id - ORDER BY sem.start DESC, status.datum DESC, status.insertamum DESC, status.ext_id DESC - ) AS reihenfolge_semester, - ROW_NUMBER () OVER ( - PARTITION BY prestudent.prestudent_id - ORDER BY status.datum DESC, status.insertamum DESC, status.ext_id DESC - ) AS reihenfolge_datum - FROM - public.tbl_student student - JOIN public.tbl_benutzer benutzer on(student.student_uid = benutzer.uid) - JOIN public.tbl_prestudent prestudent USING(prestudent_id) - JOIN public.tbl_prestudentstatus status USING(prestudent_id) - JOIN public.tbl_studiensemester sem USING(studiensemester_kurzbz) - JOIN public.tbl_studiengang stg ON prestudent.studiengang_kz = stg.studiengang_kz - WHERE - benutzer.aktiv=true - AND status.status_kurzbz='Student' - ) reihenfolge - WHERE reihenfolge_semester <> reihenfolge_datum"; - - if (isset($studiengang_kz)) - { - $qry .= " AND studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($prestudent_id)) - { - $qry .= " AND prestudent_id = ?"; - $params[] = $prestudent_id; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - /** - * 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 - * @return success with prestudents or error - */ - public function getAktiverStudentOhneStatus($studiengang_kz = null, $prestudent_id = null) - { - $params = array(); - - $qry = " - SELECT - DISTINCT (student_uid), prestudent.person_id, prestudent.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz - FROM - public.tbl_student student - JOIN public.tbl_benutzer benutzer on (benutzer.uid = student.student_uid) - JOIN public.tbl_prestudent prestudent USING(prestudent_id) - JOIN public.tbl_studiengang stg ON prestudent.studiengang_kz = stg.studiengang_kz - WHERE - benutzer.aktiv=TRUE - AND stg.melderelevant - AND prestudent.bismelden - AND NOT EXISTS ( - SELECT 1 - FROM public.tbl_prestudentstatus - JOIN public.tbl_studiensemester sem USING (studiensemester_kurzbz) - WHERE prestudent_id = prestudent.prestudent_id - /* buffer of four months, as status are often entered later */ - AND sem.ende::date > NOW() - interval '4 months' - )"; - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($prestudent_id)) - { - $qry .= " AND prestudent.prestudent_id = ?"; - $params[] = $prestudent_id; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - /** - * Studienplan should be valid in current Ausbildungssemester of prestudent. - * @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 - * @return success with prestudents or error - */ - public function getStudienplanUngueltig($studiensemester_kurzbz, $studiengang_kz = null, $prestudent_id = null) - { - $params = array($studiensemester_kurzbz); - - $qry = " - SELECT - DISTINCT pre.person_id, pre.prestudent_id, - tbl_studienplan.bezeichnung AS studienplan, - status.status_kurzbz, - status.studiensemester_kurzbz, - status.ausbildungssemester, - stg.oe_kurzbz AS prestudent_stg_oe_kurzbz - FROM - public.tbl_prestudent pre - JOIN public.tbl_prestudentstatus status USING(prestudent_id) - JOIN public.tbl_person USING(person_id) - JOIN lehre.tbl_studienplan USING(studienplan_id) - JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz - WHERE - status_kurzbz in('Student', 'Interessent','Bewerber','Aufgenommener') - AND NOT EXISTS ( - SELECT - 1 - FROM - lehre.tbl_studienplan_semester - WHERE - studienplan_id=status.studienplan_id - AND tbl_studienplan_semester.semester = status.ausbildungssemester - AND tbl_studienplan_semester.studiensemester_kurzbz = status.studiensemester_kurzbz - ) - AND status.studiensemester_kurzbz=? - AND pre.bismelden - AND stg.melderelevant"; - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($prestudent_id)) - { - $qry .= " AND tbl_prestudent.prestudent_id = ?"; - $params[] = $prestudent_id; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - /** - * Students with finished studies should have exactly one final exam. - * @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 - * @return success with prestudents or error - */ - public function getFalscheAnzahlAbschlusspruefungen($studiensemester_kurzbz = null, $studiengang_kz = null, $prestudent_id = null) - { - $params = array(); - - $qry = " - SELECT * FROM ( - SELECT - DISTINCT ON(pre.prestudent_id) pre.person_id, pre.prestudent_id, student_uid, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, - ( - SELECT COUNT(*) - FROM lehre.tbl_abschlusspruefung - WHERE student_uid = stud.student_uid - AND abschlussbeurteilung_kurzbz != 'nicht' - AND abschlussbeurteilung_kurzbz IS NOT NULL - ) AS anzahl_abschlusspruefungen - FROM - public.tbl_prestudent pre - JOIN public.tbl_student stud USING(prestudent_id) - JOIN public.tbl_prestudentstatus status USING(prestudent_id) - JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz - WHERE - status_kurzbz = 'Absolvent' - AND pre.bismelden - AND stg.melderelevant - AND NOT EXISTS ( /* exclude gs */ - SELECT 1 - FROM bis.tbl_mobilitaet - WHERE prestudent_id = pre.prestudent_id - AND studiensemester_kurzbz = status.studiensemester_kurzbz - )"; - - 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; - } - - $qry .= ") studenten - WHERE anzahl_abschlusspruefungen != 1"; - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - /** - * Date of final exam shouldn't be missing for Absolvent. - * @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 - * @return success with prestudents or error - */ - public function getDatumAbschlusspruefungFehlt($studiensemester_kurzbz = null, $studiengang_kz = null, $abschlusspruefung_id = null) - { - $results = array(); - - $pruefungenRes = $this->_getInvalidAbschlusspruefungen($studiensemester_kurzbz, $studiengang_kz, $abschlusspruefung_id); - - if (isError($pruefungenRes)) return $pruefungenRes; - - if (hasData($pruefungenRes)) - { - $pruefungen = getData($pruefungenRes); - - foreach ($pruefungen as $pruefung) - { - if (isEmptyString($pruefung->datum)) $results[] = $pruefung; - } - } - - return success($results); - } - - /** - * Date of sponsion shouldn't be missing for Absolvent. - * @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 - * @return success with prestudents or error - */ - public function getDatumSponsionFehlt($studiensemester_kurzbz = null, $studiengang_kz = null, $abschlusspruefung_id = null) - { - $results = array(); - - $pruefungenRes = $this->_getInvalidAbschlusspruefungen($studiensemester_kurzbz, $studiengang_kz, $abschlusspruefung_id); - - if (isError($pruefungenRes)) return $pruefungenRes; - - if (hasData($pruefungenRes)) - { - $pruefungen = getData($pruefungenRes); - - foreach ($pruefungen as $pruefung) - { - if (isEmptyString($pruefung->sponsion)) $results[] = $pruefung; - } - } - - return success($results); - } - - /** - * Bewerber should have participated in Reihungstest. - * @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 - * @return success with prestudents or error - */ - public function getBewerberNichtZumRtAngetreten($studiensemester_kurzbz, $studiengang_kz = null, $prestudent_id = null) - { - $previousStudiensemesterRes = $this->_ci->StudiensemesterModel->getPreviousFrom($studiensemester_kurzbz); - - if (isError($previousStudiensemesterRes)) return $previousStudiensemesterRes; - - $params = array($studiensemester_kurzbz); - - $qry = " - SELECT - prestudent.person_id, prestudent.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, status.studiensemester_kurzbz - FROM - public.tbl_prestudent prestudent - JOIN public.tbl_prestudentstatus status ON(prestudent.prestudent_id=status.prestudent_id) - JOIN public.tbl_person USING(person_id) - LEFT JOIN bis.tbl_orgform USING(orgform_kurzbz) - JOIN public.tbl_studiengang stg USING(studiengang_kz) - WHERE - status_kurzbz='Bewerber' - AND reihungstestangetreten=false - AND stg.melderelevant - AND prestudent.bismelden"; - - if (hasData($previousStudiensemesterRes)) - { - $previousStudiensemester = getData($previousStudiensemesterRes)[0]->studiensemester_kurzbz; - $qry .= " AND (studiensemester_kurzbz=? OR studiensemester_kurzbz=?)"; - $params[] = $previousStudiensemester; - } - else - { - $qry .= " AND studiensemester_kurzbz=?"; - } - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($prestudent_id)) - { - $qry .= " AND prestudent.prestudent_id = ?"; - $params[] = $prestudent_id; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - /** - * Current Ausbildungssemester shouldn't be 0. - * @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 - * @return success with prestudents or error - */ - public function getAktSemesterNull($studiensemester_kurzbz, $studiengang_kz = null, $prestudent_id = null) - { - $params = array($studiensemester_kurzbz); - - $qry = " - SELECT - DISTINCT pre.person_id, pre.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, prestat.studiensemester_kurzbz - FROM - public.tbl_prestudent pre - JOIN public.tbl_prestudentstatus prestat USING(prestudent_id) - JOIN public.tbl_studiengang stg USING(studiengang_kz) - WHERE - prestat.status_kurzbz != 'Incoming' - AND prestat.studiensemester_kurzbz = ? - AND ausbildungssemester = 0 - AND stg.melderelevant - AND pre.bismelden"; - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($prestudent_id)) - { - $qry .= " AND pre.prestudent_id = ?"; - $params[] = $prestudent_id; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - /** - * Prestudent should have a final status. - * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester - * @param studiengang_kz int if check is to be executed for certain Studiengang - * @param prestudent_id int if check is to be executed only for one prestudent - * @return success with prestudents or error - */ - public function getAbschlussstatusFehlt($studiensemester_kurzbz = null, $studiengang_kz = null, $prestudent_id = null) - { - $params = array(); - - $qry = " - SELECT - DISTINCT ON (pre.prestudent_id) - pre.person_id, pre.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, status.studiensemester_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 USING(studiengang_kz) - WHERE - NOT EXISTS( /*student does not study anymore*/ - SELECT - 1 - FROM - public.tbl_prestudentstatus ps - JOIN public.tbl_studiensemester USING(studiensemester_kurzbz) - WHERE - prestudent_id=pre.prestudent_id - /* 4 months: There might be Diplomanden, in summer months end status is often not entered yet */ - AND tbl_studiensemester.ende>now() - interval '4 months' - ) - /* check only valid begininng with 2018 */ - AND '2018-01-01'<(SELECT max(datum) FROM public.tbl_prestudentstatus WHERE prestudent_id=pre.prestudent_id) - AND NOT EXISTS( /* no end status */ - SELECT 1 - FROM public.tbl_prestudentstatus ps - WHERE - prestudent_id=pre.prestudent_id - AND status_kurzbz IN('Abbrecher','Abgewiesener','Absolvent','Incoming') - ) - AND stg.melderelevant - AND pre.bismelden"; - - if (isset($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; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - /** - * Student with active status should have been charged, i.e. have a Kontobuchung with a negative or zero value. - * @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 - * @return success with prestudents or error - */ - public function getAktiverStudentstatusOhneKontobuchung($studiensemester_kurzbz, $studiengang_kz = null, $prestudent_id = null) - { - $params = array($studiensemester_kurzbz); - - $qry = " - SELECT - DISTINCT ON (pre.prestudent_id) - pre.person_id, pre.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, status.studiensemester_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 USING(studiengang_kz) - WHERE - status.studiensemester_kurzbz = ? - AND status.status_kurzbz IN ('Student', 'Incoming') - AND NOT EXISTS ( - SELECT 1 - FROM - public.tbl_konto - WHERE - person_id = pers.person_id - AND studiensemester_kurzbz = status.studiensemester_kurzbz - AND buchungsnr_verweis IS NULL - AND betrag <= 0 - ) - AND stg.melderelevant - AND pre.bismelden"; - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($prestudent_id)) - { - $qry .= " AND pre.prestudent_id = ?"; - $params[] = $prestudent_id; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - //------------------------------------------------------------------------------------------------------------------ - // Person checks - - /** - * Birthdate is too long ago. - * @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 - * @return success with prestudents or error - */ - public function getGbDatumWeitZurueck($studiensemester_kurzbz = null, $studiengang_kz = null, $person_id = null) - { - $params = array(); - - $qry = " - SELECT - pers.person_id - FROM - public.tbl_person pers - WHERE - pers.gebdatum < '1920-01-01' - AND EXISTS ( - SELECT 1 - FROM public.tbl_prestudent - JOIN public.tbl_prestudentstatus status USING(prestudent_id) - JOIN public.tbl_studiengang stg USING(studiengang_kz) - WHERE person_id = pers.person_id"; - - if (isset($studiensemester_kurzbz)) - { - $qry .= " AND status.studiensemester_kurzbz = ?"; - $params[] = $studiensemester_kurzbz; - } - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - $qry .= ")"; - - if (isset($person_id)) - { - $qry .= " AND pers.person_id = ?"; - $params[] = $person_id; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - /** - * Nation is not Austria, but address has austrian Gemeinde. - * @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 - * @return success with prestudents or error - */ - public function getNationNichtOesterreichAberGemeinde($studiengang_kz = null, $person_id = null) - { - $params = array(); - - $qry = "SELECT DISTINCT tbl_person.person_id, adr.gemeinde, adr.adresse_id - FROM - public.tbl_adresse adr - JOIN public.tbl_prestudent USING(person_id) - JOIN public.tbl_person USING(person_id) - JOIN public.tbl_student USING(prestudent_id) - JOIN public.tbl_benutzer ON(uid=student_uid) - JOIN public.tbl_studiengang stg ON tbl_prestudent.studiengang_kz = stg.studiengang_kz - WHERE - adr.nation!='A' - AND tbl_benutzer.aktiv - AND gemeinde NOT IN ('Münster') - AND EXISTS(SELECT 1 FROM bis.tbl_gemeinde WHERE name = adr.gemeinde)"; - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($person_id)) - { - $qry .= " AND tbl_person.person_id = ?"; - $params[] = $person_id; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - /** - * Students should have exactly one home address. - * @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 person_id int if check is to be executed only for one person - * @return success with prestudents or error - */ - public function getFalscheAnzahlHeimatadressen($studiensemester_kurzbz = null, $studiengang_kz = null, $person_id = null) - { - $params = array(); - - $qry = " - SELECT - DISTINCT person_id - FROM - ( - SELECT person_id, COUNT(adresse_id) AS anzahl_adressen - FROM public.tbl_adresse addr - WHERE heimatadresse IS TRUE - GROUP BY person_id - ) adressen - JOIN public.tbl_person USING(person_id) - JOIN public.tbl_prestudent pre USING(person_id) - JOIN public.tbl_prestudentstatus status USING(prestudent_id) - JOIN public.tbl_student USING(prestudent_id) - JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz - WHERE - anzahl_adressen != 1 - 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 person_id = ?"; - $params[] = $person_id; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - /** - * Students should have exactly one delivery address. - * @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 - * @return success with prestudents or error - */ - public function getFalscheAnzahlZustelladressen($studiensemester_kurzbz = null, $studiengang_kz = null, $person_id = null) - { - $params = array(); - - $qry = " - SELECT - DISTINCT person_id - FROM - ( - SELECT person_id, COUNT(adresse_id) AS anzahl_adressen - FROM public.tbl_adresse addr - WHERE zustelladresse IS TRUE - GROUP BY person_id - ) adressen - JOIN public.tbl_person USING(person_id) - JOIN public.tbl_prestudent pre USING(person_id) - JOIN public.tbl_prestudentstatus status USING(prestudent_id) - JOIN public.tbl_student USING(prestudent_id) - JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz - WHERE - anzahl_adressen != 1 - 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 person_id = ?"; - $params[] = $person_id; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - //------------------------------------------------------------------------------------------------------------------ - // I/O checks - - /** - * Incoming shouldn't have austrian home address. - * @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 person_id int if check is to be executed only for one person - * @return success with prestudents or error - */ - public function getIncomingHeimatNationOesterreich($studiensemester_kurzbz, $studiengang_kz = null, $person_id = null) - { - $params = array($studiensemester_kurzbz); - - $qry = " - SELECT - DISTINCT pers.person_id, status.studiensemester_kurzbz - FROM - public.tbl_prestudent pre - JOIN public.tbl_prestudentstatus status USING(prestudent_id) - JOIN public.tbl_person pers USING(person_id) - JOIN public.tbl_adresse addr USING(person_id) - JOIN public.tbl_studiengang stg USING(studiengang_kz) - WHERE - status.status_kurzbz = 'Incoming' - AND addr.nation = 'A' - AND addr.heimatadresse - AND status.studiensemester_kurzbz = ? - AND stg.melderelevant - AND pre.bismelden"; - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($person_id)) - { - $qry .= " AND pers.person_id = ?"; - $params[] = $person_id; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - /** - * 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 - * @return success with prestudents or error - */ - public function getIncomingOhneIoDatensatz($studiengang_kz = null, $prestudent_id = null) - { - $params = array(); - - $qry = " - SELECT - DISTINCT ON(student_uid, nachname, vorname) - tbl_person.person_id, - tbl_prestudent.prestudent_id, - stg.oe_kurzbz AS prestudent_stg_oe_kurzbz - FROM - public.tbl_student - JOIN public.tbl_benutzer ON(student_uid=uid) - JOIN public.tbl_person USING(person_id) - JOIN public.tbl_prestudent USING(prestudent_id) - JOIN public.tbl_prestudentstatus ON(tbl_prestudent.prestudent_id=tbl_prestudentstatus.prestudent_id) - JOIN public.tbl_studiengang stg ON(stg.studiengang_kz=tbl_student.studiengang_kz) - WHERE - bismelden=TRUE - AND status_kurzbz='Incoming' AND NOT EXISTS (SELECT 1 FROM bis.tbl_bisio WHERE student_uid=tbl_student.student_uid) - AND stg.melderelevant"; - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($prestudent_id)) - { - $qry .= " AND tbl_prestudent.prestudent_id = ?"; - $params[] = $prestudent_id; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - /** - * Incoming or gemeinsame Studien students should not receive funding (not be förderrelevant). - * @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 - * @return object success or error - */ - public function getIncomingOrGsFoerderrelevant($studiensemester_kurzbz = null, $studiengang_kz = null, $prestudent_id = null) - { - $params = array(); - - $qry = " - SELECT - DISTINCT ON(prestudent_id) - pers.person_id, - ps.prestudent_id, - stg.oe_kurzbz AS prestudent_stg_oe_kurzbz - FROM - public.tbl_student stud - JOIN public.tbl_benutzer ON(student_uid=uid) - JOIN public.tbl_person pers USING(person_id) - JOIN public.tbl_prestudent ps USING(prestudent_id) - JOIN public.tbl_prestudentstatus status USING(prestudent_id) - JOIN public.tbl_studiengang stg ON(stg.studiengang_kz=stud.studiengang_kz) - WHERE - ( - status.status_kurzbz = 'Incoming' - OR EXISTS ( - SELECT 1 - FROM - bis.tbl_mobilitaet - JOIN public.tbl_prestudent USING(prestudent_id) - WHERE - prestudent_id = ps.prestudent_id - AND gsstudientyp_kurzbz = 'Extern' - ) - ) - AND (ps.foerderrelevant <> FALSE OR ps.foerderrelevant IS NULL) - AND bismelden=TRUE - AND stg.melderelevant"; - - 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 ps.prestudent_id = ?"; - $params[] = $prestudent_id; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - //------------------------------------------------------------------------------------------------------------------ - // Private methods - - /** - * Get final exams in a semester which are invalid (e.g. missing data) - * @param studiensemester_kurzbz string if check is to be executed for certain Studiengang - * @param studiengang_kz int if check is to be executed for certain Studiengang - * @param abschlusspruefung_id int if check is to be executed for certain Abschlussprüfung - */ - private function _getInvalidAbschlusspruefungen($studiensemester_kurzbz = null, $studiengang_kz = null, $abschlusspruefung_id = null) - { - $params = array(); - - $qry = " - SELECT - pre.person_id, pre.prestudent_id, - pruefung.sponsion, pruefung.datum, pruefung.abschlusspruefung_id, - stg.oe_kurzbz AS prestudent_stg_oe_kurzbz - FROM - public.tbl_prestudent pre - JOIN public.tbl_student stud USING(prestudent_id) - JOIN public.tbl_prestudentstatus prestatus USING(prestudent_id) - JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz - JOIN lehre.tbl_abschlusspruefung pruefung ON stud.student_uid = pruefung.student_uid - WHERE - status_kurzbz = 'Absolvent' - AND NOT EXISTS ( /* exclude gs */ - SELECT 1 - FROM bis.tbl_mobilitaet - WHERE prestudent_id = pre.prestudent_id - AND studiensemester_kurzbz = prestatus.studiensemester_kurzbz - ) - AND abschlussbeurteilung_kurzbz!='nicht' - AND abschlussbeurteilung_kurzbz IS NOT NULL - AND (pruefung.datum IS NULL OR pruefung.sponsion IS NULL) - AND pre.bismelden - AND stg.melderelevant"; - - if (isset($studiensemester_kurzbz)) - { - $qry .= " AND prestatus.studiensemester_kurzbz = ?"; - $params[] = $studiensemester_kurzbz; - } - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($abschlusspruefung_id)) - { - $qry .= " AND pruefung.abschlusspruefung_id = ?"; - $params[] = $abschlusspruefung_id; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - /** - * Gets Bismeldedate from Studiensemester. - * @param studiensemester_kurzbz string - */ - private function _getBisdateFromSemester($studiensemester_kurzbz) - { - $semesterYear = substr($studiensemester_kurzbz, 2, 6); - $semesterType = substr($studiensemester_kurzbz, 0, 2); - - if ($semesterType == 'SS') - { - return date_format(date_create(($semesterYear - 1)."-11-15"), 'Y-m-d'); - } - - if ($semesterType == 'WS') - { - return date_format(date_create($semesterYear."-04-15"), 'Y-m-d'); - } - } -} diff --git a/application/libraries/issues/PlausicheckProducerLib.php b/application/libraries/issues/PlausicheckProducerLib.php index dde9b5396..c32f1f863 100644 --- a/application/libraries/issues/PlausicheckProducerLib.php +++ b/application/libraries/issues/PlausicheckProducerLib.php @@ -4,78 +4,70 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); class PlausicheckProducerLib { - const CI_LIBRARY_PATH = 'application/libraries'; + 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'; private $_ci; // ci instance - private $_currentStudiensemester; // current Studiensemester + private $_extensionName; // name of extension + private $_app; // name of application + private $_konfiguration = array(); // konfigratio parameters - // set fehler which can be produced by the job - // structure: fehler_kurzbz => class (library) name for resolving - private $_fehlerLibMappings = array( - 'AbbrecherAktiv' => 'AbbrecherAktiv', - 'AbschlussstatusFehlt' => 'AbschlussstatusFehlt', - 'AktSemesterNull' => 'AktSemesterNull', - 'AktiverStudentOhneStatus' => 'AktiverStudentOhneStatus', - 'AktiverStudentstatusOhneKontobuchung' => 'AktiverStudentstatusOhneKontobuchung', - 'AusbildungssemPrestudentUngleichAusbildungssemStatus' => 'AusbildungssemPrestudentUngleichAusbildungssemStatus', - 'BewerberNichtZumRtAngetreten' => 'BewerberNichtZumRtAngetreten', - 'DatumAbschlusspruefungFehlt' => 'DatumAbschlusspruefungFehlt', - 'DatumSponsionFehlt' => 'DatumSponsionFehlt', - 'DatumStudiensemesterFalscheReihenfolge' => 'DatumStudiensemesterFalscheReihenfolge', - 'FalscheAnzahlAbschlusspruefungen' => 'FalscheAnzahlAbschlusspruefungen', - 'FalscheAnzahlHeimatadressen' => 'FalscheAnzahlHeimatadressen', - 'FalscheAnzahlZustelladressen' => 'FalscheAnzahlZustelladressen', - 'GbDatumWeitZurueck' => 'GbDatumWeitZurueck', - 'InaktiverStudentAktiverStatus' => 'InaktiverStudentAktiverStatus', - 'IncomingHeimatNationOesterreich' => 'IncomingHeimatNationOesterreich', - 'IncomingOhneIoDatensatz' => 'IncomingOhneIoDatensatz', - 'IncomingOrGsFoerderrelevant' => 'IncomingOrGsFoerderrelevant', - 'InskriptionVorLetzerBismeldung' => 'InskriptionVorLetzerBismeldung', - 'NationNichtOesterreichAberGemeinde' => 'NationNichtOesterreichAberGemeinde', - 'OrgformStgUngleichOrgformPrestudent' => 'OrgformStgUngleichOrgformPrestudent', - 'PrestudentMischformOhneOrgform' => 'PrestudentMischformOhneOrgform', - 'StgPrestudentUngleichStgStudienplan' => 'StgPrestudentUngleichStgStudienplan', - 'StgPrestudentUngleichStgStudent' => 'StgPrestudentUngleichStgStudent', - 'StudentstatusNachAbbrecher' => 'StudentstatusNachAbbrecher' - //'StudienplanUngueltig' => 'StudienplanUngueltig' - ); - - public function __construct() + public function __construct($params = null) { + // set extension name if called from extension + if (isset($params['extensionName'])) $this->_extensionName = $params['extensionName']; + + // set application + $app = isset($params['app']) ? $params['app'] : null; + $this->_ci =& get_instance(); // get ci instance // load models - $this->_ci->load->model('organisation/studiensemester_model', 'StudiensemesterModel'); + $this->_ci->load->model('system/Fehlerkonfiguration_model', 'FehlerkonfigurationModel'); - // get current Studiensemester - $studiensemesterRes = $this->_ci->StudiensemesterModel->getAkt(); - if (hasData($studiensemesterRes)) $this->_currentStudiensemester = getData($studiensemesterRes)[0]->studiensemester_kurzbz; + // get all configuration parameters for the application + $fehlerkonfigurationRes = $this->_ci->FehlerkonfigurationModel->getKonfiguration($app); + + if (hasData($fehlerkonfigurationRes)) + { + $fehlerkonfiguration = getData($fehlerkonfigurationRes); + + foreach ($fehlerkonfiguration as $fk) + { + $this->_konfiguration[$fk->fehler_kurzbz][$fk->konfigurationstyp_kurzbz] = $fk->konfiguration; + } + } } /** - * Executes check for a fehler_kurzbz, returns the result. - * @param $fehler_kurzbz string - * @param $studiensemester_kurzbz string optionally needed for issue production - * @param $studiengang_kz int optionally needed for issue production + * 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($fehler_kurzbz, $studiensemester_kurzbz = null, $studiengang_kz = null) + public function producePlausicheckIssue($libName, $fehler_kurzbz, $params) { - $libName = $this->_fehlerLibMappings[$fehler_kurzbz]; + // if called from extension (extension name set), path includes extension names + $libRootPath = isset($this->_extensionName) ? self::EXTENSIONS_FOLDER . '/' . $this->_extensionName . '/' : ''; - // get Studiensemester - if (isEmptyString($studiensemester_kurzbz)) $studiensemester_kurzbz = $this->_currentStudiensemester; + // path for loading issue library + $issuesLibPath = $libRootPath . self::PLAUSI_ISSUES_FOLDER . '/'; - // get path of library for issue to be produced - $issuesLibPath = DOC_ROOT . self::CI_LIBRARY_PATH . '/' . self::PLAUSI_ISSUES_FOLDER . '/'; - $issuesLibFilePath = $issuesLibPath . $libName . '.php'; + // file path of library for check if file exists + $issuesLibFilePath = DOC_ROOT . self::CI_PATH + . '/' . $libRootPath . self::CI_LIBRARY_FOLDER . '/' . self::PLAUSI_ISSUES_FOLDER . '/' . $libName . '.php'; // check if library file exists if (!file_exists($issuesLibFilePath)) return error("Issue library file " . $issuesLibFilePath . " does not exist"); + // load konfiguration parameters of the fehler_kurzbz + $config = isset($this->_konfiguration[$fehler_kurzbz]) ? $this->_konfiguration[$fehler_kurzbz] : null; + // load library connected to fehlercode - $this->_ci->load->library(self::PLAUSI_ISSUES_FOLDER . '/'.$libName); + $this->_ci->load->library($issuesLibPath . $libName, $config); $lowercaseLibName = mb_strtolower($libName); @@ -83,21 +75,7 @@ class PlausicheckProducerLib if (!is_callable(array($this->_ci->{$lowercaseLibName}, self::EXECUTE_PLAUSI_CHECK_METHOD_NAME))) return error("Method " . self::EXECUTE_PLAUSI_CHECK_METHOD_NAME . " is not defined in library $lowercaseLibName"); - // pass the data needed for issue check - $paramsForCheck = array( - 'studiensemester_kurzbz' => $studiensemester_kurzbz, - 'studiengang_kz' => $studiengang_kz - ); - // call the function for checking for issue production - return $this->_ci->{$lowercaseLibName}->{self::EXECUTE_PLAUSI_CHECK_METHOD_NAME}($paramsForCheck); - } - - /** - * Gets all fehler_kurzbz for fehler which need to be checked. - */ - public function getFehlerKurzbz() - { - return array_keys($this->_fehlerLibMappings); + return $this->_ci->{$lowercaseLibName}->{self::EXECUTE_PLAUSI_CHECK_METHOD_NAME}($params); } } diff --git a/application/libraries/issues/plausichecks/AbbrecherAktiv.php b/application/libraries/issues/plausichecks/AbbrecherAktiv.php index cc6e2996a..9eae389b5 100644 --- a/application/libraries/issues/plausichecks/AbbrecherAktiv.php +++ b/application/libraries/issues/plausichecks/AbbrecherAktiv.php @@ -13,11 +13,14 @@ class AbbrecherAktiv extends PlausiChecker { $results = array(); + // get parameters from config + $exkludierte_studiengang_kz = isset($this->_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null; + // pass parameters needed for plausicheck $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; // get all students failing the plausicheck - $prestudentRes = $this->_ci->plausichecklib->getAbbrecherAktiv($studiengang_kz); + $prestudentRes = $this->getAbbrecherAktiv($studiengang_kz, null, $exkludierte_studiengang_kz); if (isError($prestudentRes)) return $prestudentRes; @@ -40,4 +43,49 @@ class AbbrecherAktiv extends PlausiChecker // return the results return success($results); } + + /** + * Abbrecher cannot be active. + * @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 + */ + public function getAbbrecherAktiv($studiengang_kz = null, $prestudent_id = null, $exkludierte_studiengang_kz = null) + { + $params = array(); + + $qry = " + SELECT + pre.person_id, pre.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz + FROM + public.tbl_prestudentstatus pre_status + JOIN public.tbl_prestudent pre USING(prestudent_id) + JOIN public.tbl_student student USING(prestudent_id) + JOIN public.tbl_benutzer benutzer on(benutzer.uid=student.student_uid) + JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz + WHERE + pre_status.status_kurzbz ='Abbrecher' + AND benutzer.aktiv=true"; + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND pre.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } } diff --git a/application/libraries/issues/plausichecks/AbschlussstatusFehlt.php b/application/libraries/issues/plausichecks/AbschlussstatusFehlt.php index 66615220a..3690e1331 100644 --- a/application/libraries/issues/plausichecks/AbschlussstatusFehlt.php +++ b/application/libraries/issues/plausichecks/AbschlussstatusFehlt.php @@ -13,12 +13,20 @@ class AbschlussstatusFehlt extends PlausiChecker { $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; // get all students failing the plausicheck - $prestudentRes = $this->_ci->plausichecklib->getAbschlussstatusFehlt($studiensemester_kurzbz, $studiengang_kz); + $prestudentRes = $this->getAbschlussstatusFehlt( + $studiensemester_kurzbz, + $studiengang_kz, + null, + $exkludierte_studiengang_kz + ); if (isError($prestudentRes)) return $prestudentRes; @@ -41,4 +49,95 @@ class AbschlussstatusFehlt extends PlausiChecker // return the results return success($results); } + + /** + * Prestudent should have a final status. + * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param prestudent_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + public function getAbschlussstatusFehlt( + $studiensemester_kurzbz = null, + $studiengang_kz = null, + $prestudent_id = null, + $exkludierte_studiengang_kz = null + ) { + $params = array(); + + $qry = " + SELECT + DISTINCT ON (pre.prestudent_id) + pre.person_id, pre.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, status.studiensemester_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 USING(studiengang_kz) + WHERE + NOT EXISTS( /*student does not study anymore*/ + SELECT + 1 + FROM + public.tbl_prestudentstatus ps + JOIN public.tbl_studiensemester USING(studiensemester_kurzbz) + WHERE + prestudent_id=pre.prestudent_id + /* 4 months: There might be Diplomanden, in summer months end status is often not entered yet */ + AND tbl_studiensemester.ende>now() - interval '4 months' + ) + /* check only valid begininng with 2018 */ + AND '2018-01-01'<(SELECT max(datum) FROM public.tbl_prestudentstatus WHERE prestudent_id=pre.prestudent_id) + AND NOT EXISTS( /* no end status */ + SELECT 1 + FROM public.tbl_prestudentstatus ps + WHERE + prestudent_id=pre.prestudent_id + AND status_kurzbz IN('Abbrecher','Abgewiesener','Absolvent','Incoming') + ) + AND stg.melderelevant + AND pre.bismelden"; + + if (isset($studiensemester_kurzbz)) + { + $prevStudiensemesterRes = $this->_ci->StudiensemesterModel->getPreviousFrom($studiensemester_kurzbz); + + if (isError($prevStudiensemesterRes)) return $prevStudiensemesterRes; + + if (hasData($prevStudiensemesterRes)) + { + // if Studiensemester given, check only if has status in current or previous semester + $prevStudiensemester = getData($prevStudiensemesterRes)[0]->studiensemester_kurzbz; + $qry .= " AND EXISTS ( + SELECT 1 + FROM public.tbl_prestudentstatus ps + WHERE studiensemester_kurzbz IN (?, ?) + AND ps.prestudent_id = pre.prestudent_id + )"; + $params[] = $prevStudiensemester; + $params[] = $studiensemester_kurzbz; + } + } + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND pre.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } } diff --git a/application/libraries/issues/plausichecks/AktSemesterNull.php b/application/libraries/issues/plausichecks/AktSemesterNull.php index d55506d68..1223a2720 100644 --- a/application/libraries/issues/plausichecks/AktSemesterNull.php +++ b/application/libraries/issues/plausichecks/AktSemesterNull.php @@ -13,12 +13,15 @@ class AktSemesterNull extends PlausiChecker { $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; // get all students failing the plausicheck - $prestudentRes = $this->_ci->plausichecklib->getAktSemesterNull($studiensemester_kurzbz, $studiengang_kz); + $prestudentRes = $this->getAktSemesterNull($studiensemester_kurzbz, $studiengang_kz, null, $exkludierte_studiengang_kz); if (isError($prestudentRes)) return $prestudentRes; @@ -47,4 +50,51 @@ class AktSemesterNull extends PlausiChecker // return the results return success($results); } + + /** + * Current Ausbildungssemester shouldn't be 0. + * @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 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) + { + $params = array($studiensemester_kurzbz); + + $qry = " + SELECT + DISTINCT pre.person_id, pre.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, prestat.studiensemester_kurzbz + FROM + public.tbl_prestudent pre + JOIN public.tbl_prestudentstatus prestat USING(prestudent_id) + JOIN public.tbl_studiengang stg USING(studiengang_kz) + WHERE + prestat.status_kurzbz != 'Incoming' + AND prestat.studiensemester_kurzbz = ? + AND ausbildungssemester = 0 + AND stg.melderelevant + AND pre.bismelden"; + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND pre.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } } diff --git a/application/libraries/issues/plausichecks/AktiverStudentOhneStatus.php b/application/libraries/issues/plausichecks/AktiverStudentOhneStatus.php index 2dfd9f866..94fe5cc8d 100644 --- a/application/libraries/issues/plausichecks/AktiverStudentOhneStatus.php +++ b/application/libraries/issues/plausichecks/AktiverStudentOhneStatus.php @@ -13,11 +13,14 @@ class AktiverStudentOhneStatus extends PlausiChecker { $results = array(); + // get parameters from config + $exkludierte_studiengang_kz = isset($this->_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null; + // pass parameters needed for plausicheck $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; // get all students failing the plausicheck - $prestudentRes = $this->_ci->plausichecklib->getAktiverStudentOhneStatus($studiengang_kz); + $prestudentRes = $this->getAktiverStudentOhneStatus($studiengang_kz, null, $exkludierte_studiengang_kz); if (isError($prestudentRes)) return $prestudentRes; @@ -40,4 +43,57 @@ class AktiverStudentOhneStatus extends PlausiChecker // return the results return success($results); } + + /** + * 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 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) + { + $params = array(); + + $qry = " + SELECT + DISTINCT (student_uid), prestudent.person_id, prestudent.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz + FROM + public.tbl_student student + JOIN public.tbl_benutzer benutzer on (benutzer.uid = student.student_uid) + JOIN public.tbl_prestudent prestudent USING(prestudent_id) + JOIN public.tbl_studiengang stg ON prestudent.studiengang_kz = stg.studiengang_kz + WHERE + benutzer.aktiv=TRUE + AND stg.melderelevant + AND prestudent.bismelden + AND NOT EXISTS ( + SELECT 1 + FROM public.tbl_prestudentstatus + JOIN public.tbl_studiensemester sem USING (studiensemester_kurzbz) + WHERE prestudent_id = prestudent.prestudent_id + /* buffer of four months, as status are often entered later */ + AND sem.ende::date > NOW() - interval '4 months' + )"; + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND prestudent.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } } diff --git a/application/libraries/issues/plausichecks/AktiverStudentstatusOhneKontobuchung.php b/application/libraries/issues/plausichecks/AktiverStudentstatusOhneKontobuchung.php index baa35bc57..28684388f 100644 --- a/application/libraries/issues/plausichecks/AktiverStudentstatusOhneKontobuchung.php +++ b/application/libraries/issues/plausichecks/AktiverStudentstatusOhneKontobuchung.php @@ -13,12 +13,20 @@ class AktiverStudentstatusOhneKontobuchung extends PlausiChecker { $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; // get all students failing the plausicheck - $prestudentRes = $this->_ci->plausichecklib->getAktiverStudentstatusOhneKontobuchung($studiensemester_kurzbz, $studiengang_kz); + $prestudentRes = $this->getAktiverStudentstatusOhneKontobuchung( + $studiensemester_kurzbz, + $studiengang_kz, + null, + $exkludierte_studiengang_kz + ); if (isError($prestudentRes)) return $prestudentRes; @@ -47,4 +55,66 @@ class AktiverStudentstatusOhneKontobuchung extends PlausiChecker // return the results return success($results); } + + /** + * Student with active status should have been charged, i.e. have a Kontobuchung with a negative or zero value. + * @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 + */ + public function getAktiverStudentstatusOhneKontobuchung( + $studiensemester_kurzbz, + $studiengang_kz = null, + $prestudent_id = null, + $exkludierte_studiengang_kz = null + ) { + $params = array($studiensemester_kurzbz); + + $qry = " + SELECT + DISTINCT ON (pre.prestudent_id) + pre.person_id, pre.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, status.studiensemester_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 USING(studiengang_kz) + WHERE + status.studiensemester_kurzbz = ? + AND status.status_kurzbz IN ('Student', 'Incoming') + AND NOT EXISTS ( + SELECT 1 + FROM + public.tbl_konto + WHERE + person_id = pers.person_id + AND studiensemester_kurzbz = status.studiensemester_kurzbz + AND buchungsnr_verweis IS NULL + AND betrag <= 0 + ) + AND stg.melderelevant + AND pre.bismelden"; + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND pre.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } } diff --git a/application/libraries/issues/plausichecks/AusbildungssemPrestudentUngleichAusbildungssemStatus.php b/application/libraries/issues/plausichecks/AusbildungssemPrestudentUngleichAusbildungssemStatus.php index ca967a97f..13d800a3f 100644 --- a/application/libraries/issues/plausichecks/AusbildungssemPrestudentUngleichAusbildungssemStatus.php +++ b/application/libraries/issues/plausichecks/AusbildungssemPrestudentUngleichAusbildungssemStatus.php @@ -13,14 +13,19 @@ class AusbildungssemPrestudentUngleichAusbildungssemStatus extends PlausiChecker { $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; // get all students failing the plausicheck - $prestudentRes = $this->_ci->plausichecklib->getAusbildungssemPrestudentUngleichAusbildungssemStatus( + $prestudentRes = $this->getAusbildungssemPrestudentUngleichAusbildungssemStatus( $studiensemester_kurzbz, - $studiengang_kz + $studiengang_kz, + null, + $exkludierte_studiengang_kz ); if (isError($prestudentRes)) return $prestudentRes; @@ -53,4 +58,61 @@ class AusbildungssemPrestudentUngleichAusbildungssemStatus extends PlausiChecker // return the results return success($results); } + + /** + * Ausbildungssemester of prestudent (lehrverband) must be the same as Ausbildungssemester of prestudentstatus. + * @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 exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + public function getAusbildungssemPrestudentUngleichAusbildungssemStatus( + $studiensemester_kurzbz, + $studiengang_kz = null, + $prestudent_id = null, + $exkludierte_studiengang_kz = null + ) { + $params = array($studiensemester_kurzbz, $studiensemester_kurzbz, $studiensemester_kurzbz); + + $qry = " + SELECT + DISTINCT(student.student_uid), student.student_uid, prestudent.person_id, prestudent.prestudent_id, + status.ausbildungssemester AS status_ausbildungssemester, lv.semester AS student_ausbildungssemester, status.studiensemester_kurzbz, + stg.oe_kurzbz AS prestudent_stg_oe_kurzbz + FROM + public.tbl_student student + JOIN public.tbl_studentlehrverband lv USING(student_uid) + JOIN public.tbl_prestudent prestudent USING(prestudent_id) + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_studiengang stg ON prestudent.studiengang_kz = stg.studiengang_kz + WHERE + status.studiensemester_kurzbz = ? + AND lv.studiensemester_kurzbz = ? + AND status.status_kurzbz NOT IN ('Interessent','Bewerber','Aufgenommener','Wartender','Abgewiesener','Unterbrecher') + AND get_rolle_prestudent (prestudent_id, ?)='Student' + AND status.ausbildungssemester != lv.semester"; + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND prestudent.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } + + } diff --git a/application/libraries/issues/plausichecks/BewerberNichtZumRtAngetreten.php b/application/libraries/issues/plausichecks/BewerberNichtZumRtAngetreten.php index 35d954236..4a9655d13 100644 --- a/application/libraries/issues/plausichecks/BewerberNichtZumRtAngetreten.php +++ b/application/libraries/issues/plausichecks/BewerberNichtZumRtAngetreten.php @@ -13,12 +13,20 @@ class BewerberNichtZumRtAngetreten extends PlausiChecker { $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; // get all students failing the plausicheck - $prestudentRes = $this->_ci->plausichecklib->getBewerberNichtZumRtAngetreten($studiensemester_kurzbz, $studiengang_kz); + $prestudentRes = $this->getBewerberNichtZumRtAngetreten( + $studiensemester_kurzbz, + $studiengang_kz, + null, + $exkludierte_studiengang_kz + ); if (isError($prestudentRes)) return $prestudentRes; @@ -44,4 +52,72 @@ class BewerberNichtZumRtAngetreten extends PlausiChecker // return the results return success($results); } + + /** + * Bewerber should have participated in Reihungstest. + * @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 exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + public function getBewerberNichtZumRtAngetreten( + $studiensemester_kurzbz, + $studiengang_kz = null, + $prestudent_id = null, + $exkludierte_studiengang_kz = null + ) { + $this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + $previousStudiensemesterRes = $this->_ci->StudiensemesterModel->getPreviousFrom($studiensemester_kurzbz); + + if (isError($previousStudiensemesterRes)) return $previousStudiensemesterRes; + + $params = array($studiensemester_kurzbz); + + $qry = " + SELECT + prestudent.person_id, prestudent.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, status.studiensemester_kurzbz + FROM + public.tbl_prestudent prestudent + JOIN public.tbl_prestudentstatus status ON(prestudent.prestudent_id=status.prestudent_id) + JOIN public.tbl_person USING(person_id) + LEFT JOIN bis.tbl_orgform USING(orgform_kurzbz) + JOIN public.tbl_studiengang stg USING(studiengang_kz) + WHERE + status_kurzbz='Bewerber' + AND reihungstestangetreten=false + AND stg.melderelevant + AND prestudent.bismelden"; + + if (hasData($previousStudiensemesterRes)) + { + $previousStudiensemester = getData($previousStudiensemesterRes)[0]->studiensemester_kurzbz; + $qry .= " AND (studiensemester_kurzbz=? OR studiensemester_kurzbz=?)"; + $params[] = $previousStudiensemester; + } + else + { + $qry .= " AND studiensemester_kurzbz=?"; + } + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND prestudent.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } } diff --git a/application/libraries/issues/plausichecks/DatumAbschlusspruefungFehlt.php b/application/libraries/issues/plausichecks/DatumAbschlusspruefungFehlt.php index 7a2555b69..985bc1f08 100644 --- a/application/libraries/issues/plausichecks/DatumAbschlusspruefungFehlt.php +++ b/application/libraries/issues/plausichecks/DatumAbschlusspruefungFehlt.php @@ -13,12 +13,20 @@ class DatumAbschlusspruefungFehlt extends PlausiChecker { $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; // get all students failing the plausicheck - $prestudentRes = $this->_ci->plausichecklib->getDatumAbschlusspruefungFehlt($studiensemester_kurzbz, $studiengang_kz); + $prestudentRes = $this->getDatumAbschlusspruefungFehlt( + $studiensemester_kurzbz, + $studiengang_kz, + null, + $exkludierte_studiengang_kz + ); if (isError($prestudentRes)) return $prestudentRes; @@ -44,4 +52,110 @@ class DatumAbschlusspruefungFehlt extends PlausiChecker // return the results return success($results); } + + /** + * Date of final exam shouldn't be missing for Absolvent. + * @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 exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + public function getDatumAbschlusspruefungFehlt( + $studiensemester_kurzbz = null, + $studiengang_kz = null, + $abschlusspruefung_id = null, + $exkludierte_studiengang_kz = null + ) { + $params = array(); + + $qry = " + SELECT + pre.person_id, pre.prestudent_id, + pruefung.sponsion, pruefung.datum, pruefung.abschlusspruefung_id, + stg.oe_kurzbz AS prestudent_stg_oe_kurzbz + FROM + public.tbl_prestudent pre + JOIN public.tbl_student stud USING(prestudent_id) + JOIN public.tbl_prestudentstatus prestatus USING(prestudent_id) + JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz + JOIN lehre.tbl_abschlusspruefung pruefung ON stud.student_uid = pruefung.student_uid + WHERE + status_kurzbz = 'Absolvent' + AND NOT EXISTS ( /* exclude gs */ + SELECT 1 + FROM bis.tbl_mobilitaet + WHERE prestudent_id = pre.prestudent_id + AND studiensemester_kurzbz = prestatus.studiensemester_kurzbz + ) + AND abschlussbeurteilung_kurzbz!='nicht' + AND abschlussbeurteilung_kurzbz IS NOT NULL + AND pruefung.datum IS NULL + AND pre.bismelden + AND stg.melderelevant"; + + if (isset($studiensemester_kurzbz)) + { + $qry .= " AND prestatus.studiensemester_kurzbz = ?"; + $params[] = $studiensemester_kurzbz; + } + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($abschlusspruefung_id)) + { + $qry .= " AND pruefung.abschlusspruefung_id = ?"; + $params[] = $abschlusspruefung_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); + } + + /** + * Date of final exam shouldn't be missing for Absolvent. + * @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 exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + //~ public function getDatumAbschlusspruefungFehlt( + //~ $studiensemester_kurzbz = null, + //~ $studiengang_kz = null, + //~ $abschlusspruefung_id = null, + //~ $exkludierte_studiengang_kz = null + //~ ) { + //~ $results = array(); + + //~ $pruefungenRes = $this->_getInvalidAbschlusspruefungen( + //~ $studiensemester_kurzbz, + //~ $studiengang_kz, + //~ $abschlusspruefung_id, + //~ $exkludierte_studiengang_kz + //~ ); + + //~ if (isError($pruefungenRes)) return $pruefungenRes; + + //~ if (hasData($pruefungenRes)) + //~ { + //~ $pruefungen = getData($pruefungenRes); + + //~ foreach ($pruefungen as $pruefung) + //~ { + //~ if (isEmptyString($pruefung->datum)) $results[] = $pruefung; + //~ } + //~ } + + //~ return success($results); + //~ } } diff --git a/application/libraries/issues/plausichecks/DatumSponsionFehlt.php b/application/libraries/issues/plausichecks/DatumSponsionFehlt.php index 102a89656..a1f32ca2f 100644 --- a/application/libraries/issues/plausichecks/DatumSponsionFehlt.php +++ b/application/libraries/issues/plausichecks/DatumSponsionFehlt.php @@ -13,12 +13,20 @@ class DatumSponsionFehlt extends PlausiChecker { $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; // get all students failing the plausicheck - $prestudentRes = $this->_ci->plausichecklib->getDatumSponsionFehlt($studiensemester_kurzbz, $studiengang_kz); + $prestudentRes = $this->getDatumSponsionFehlt( + $studiensemester_kurzbz, + $studiengang_kz, + null, + $exkludierte_studiengang_kz + ); if (isError($prestudentRes)) return $prestudentRes; @@ -44,4 +52,110 @@ class DatumSponsionFehlt extends PlausiChecker // return the results return success($results); } + + /** + * Date of sponsion shouldn't be missing for Absolvent. + * @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 exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + public function getDatumSponsionFehlt( + $studiensemester_kurzbz = null, + $studiengang_kz = null, + $abschlusspruefung_id = null, + $exkludierte_studiengang_kz = null + ) { + $params = array(); + + $qry = " + SELECT + pre.person_id, pre.prestudent_id, + pruefung.sponsion, pruefung.datum, pruefung.abschlusspruefung_id, + stg.oe_kurzbz AS prestudent_stg_oe_kurzbz + FROM + public.tbl_prestudent pre + JOIN public.tbl_student stud USING(prestudent_id) + JOIN public.tbl_prestudentstatus prestatus USING(prestudent_id) + JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz + JOIN lehre.tbl_abschlusspruefung pruefung ON stud.student_uid = pruefung.student_uid + WHERE + status_kurzbz = 'Absolvent' + AND NOT EXISTS ( /* exclude gs */ + SELECT 1 + FROM bis.tbl_mobilitaet + WHERE prestudent_id = pre.prestudent_id + AND studiensemester_kurzbz = prestatus.studiensemester_kurzbz + ) + AND abschlussbeurteilung_kurzbz!='nicht' + AND abschlussbeurteilung_kurzbz IS NOT NULL + AND pruefung.sponsion IS NULL + AND pre.bismelden + AND stg.melderelevant"; + + if (isset($studiensemester_kurzbz)) + { + $qry .= " AND prestatus.studiensemester_kurzbz = ?"; + $params[] = $studiensemester_kurzbz; + } + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($abschlusspruefung_id)) + { + $qry .= " AND pruefung.abschlusspruefung_id = ?"; + $params[] = $abschlusspruefung_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); + } + + /** + * Date of sponsion shouldn't be missing for Absolvent. + * @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 exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + //~ public function getDatumSponsionFehlt( + //~ $studiensemester_kurzbz = null, + //~ $studiengang_kz = null, + //~ $abschlusspruefung_id = null, + //~ $exkludierte_studiengang_kz = null + //~ ) { + //~ $results = array(); + + //~ $pruefungenRes = $this->_getInvalidAbschlusspruefungen( + //~ $studiensemester_kurzbz, + //~ $studiengang_kz, + //~ $abschlusspruefung_id, + //~ $exkludierte_studiengang_kz + //~ ); + + //~ if (isError($pruefungenRes)) return $pruefungenRes; + + //~ if (hasData($pruefungenRes)) + //~ { + //~ $pruefungen = getData($pruefungenRes); + + //~ foreach ($pruefungen as $pruefung) + //~ { + //~ if (isEmptyString($pruefung->sponsion)) $results[] = $pruefung; + //~ } + //~ } + + //~ return success($results); + //~ } } diff --git a/application/libraries/issues/plausichecks/DatumStudiensemesterFalscheReihenfolge.php b/application/libraries/issues/plausichecks/DatumStudiensemesterFalscheReihenfolge.php index ab8566e47..381bea7df 100644 --- a/application/libraries/issues/plausichecks/DatumStudiensemesterFalscheReihenfolge.php +++ b/application/libraries/issues/plausichecks/DatumStudiensemesterFalscheReihenfolge.php @@ -13,11 +13,14 @@ class DatumStudiensemesterFalscheReihenfolge extends PlausiChecker { $results = array(); + // get parameters from config + $exkludierte_studiengang_kz = isset($this->_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null; + // pass parameters needed for plausicheck $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; // get all students failing the plausicheck - $prestudentRes = $this->_ci->plausichecklib->getDatumStudiensemesterFalscheReihenfolge($studiengang_kz); + $prestudentRes = $this->getDatumStudiensemesterFalscheReihenfolge($studiengang_kz, null, $exkludierte_studiengang_kz); if (isError($prestudentRes)) return $prestudentRes; @@ -42,4 +45,64 @@ class DatumStudiensemesterFalscheReihenfolge extends PlausiChecker // return the results return success($results); } + + /** + * 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 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) + { + $params = array(); + + // all active students with Status student in current semester + $qry = " + SELECT DISTINCT ON (prestudent_id) * + FROM ( + SELECT + prestudent.person_id, prestudent.prestudent_id, + stg.studiengang_kz, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, + ROW_NUMBER () OVER ( + PARTITION BY prestudent.prestudent_id + ORDER BY sem.start DESC, status.datum DESC, status.insertamum DESC, status.ext_id DESC + ) AS reihenfolge_semester, + ROW_NUMBER () OVER ( + PARTITION BY prestudent.prestudent_id + ORDER BY status.datum DESC, status.insertamum DESC, status.ext_id DESC + ) AS reihenfolge_datum + FROM + public.tbl_student student + JOIN public.tbl_benutzer benutzer on(student.student_uid = benutzer.uid) + JOIN public.tbl_prestudent prestudent USING(prestudent_id) + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_studiensemester sem USING(studiensemester_kurzbz) + JOIN public.tbl_studiengang stg ON prestudent.studiengang_kz = stg.studiengang_kz + WHERE + benutzer.aktiv=true + AND status.status_kurzbz='Student' + ) reihenfolge + WHERE reihenfolge_semester <> reihenfolge_datum"; + + if (isset($studiengang_kz)) + { + $qry .= " AND studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } } diff --git a/application/libraries/issues/plausichecks/FalscheAnzahlAbschlusspruefungen.php b/application/libraries/issues/plausichecks/FalscheAnzahlAbschlusspruefungen.php index 7fbe2d828..1021fe85a 100644 --- a/application/libraries/issues/plausichecks/FalscheAnzahlAbschlusspruefungen.php +++ b/application/libraries/issues/plausichecks/FalscheAnzahlAbschlusspruefungen.php @@ -13,12 +13,20 @@ class FalscheAnzahlAbschlusspruefungen extends PlausiChecker { $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; // get all students failing the plausicheck - $prestudentRes = $this->_ci->plausichecklib->getFalscheAnzahlAbschlusspruefungen($studiensemester_kurzbz, $studiengang_kz); + $prestudentRes = $this->getFalscheAnzahlAbschlusspruefungen( + $studiensemester_kurzbz, + $studiengang_kz, + null, + $exkludierte_studiengang_kz + ); if (isError($prestudentRes)) return $prestudentRes; @@ -41,4 +49,77 @@ class FalscheAnzahlAbschlusspruefungen extends PlausiChecker // return the results return success($results); } + + /** + * Students with finished studies should have exactly one final exam. + * @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 + */ + public function getFalscheAnzahlAbschlusspruefungen( + $studiensemester_kurzbz = null, + $studiengang_kz = null, + $prestudent_id = null, + $exkludierte_studiengang_kz = null + ) { + $params = array(); + + $qry = " + SELECT * FROM ( + SELECT + DISTINCT ON(pre.prestudent_id) pre.person_id, pre.prestudent_id, student_uid, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, + ( + SELECT COUNT(*) + FROM lehre.tbl_abschlusspruefung + WHERE student_uid = stud.student_uid + AND abschlussbeurteilung_kurzbz != 'nicht' + AND abschlussbeurteilung_kurzbz IS NOT NULL + ) AS anzahl_abschlusspruefungen + FROM + public.tbl_prestudent pre + JOIN public.tbl_student stud USING(prestudent_id) + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz + WHERE + status_kurzbz = 'Absolvent' + AND pre.bismelden + AND stg.melderelevant + AND NOT EXISTS ( /* exclude gs */ + SELECT 1 + FROM bis.tbl_mobilitaet + WHERE prestudent_id = pre.prestudent_id + AND studiensemester_kurzbz = status.studiensemester_kurzbz + )"; + + if (isset($studiensemester_kurzbz)) + { + $qry .= " AND status.studiensemester_kurzbz = ?"; + $params[] = $studiensemester_kurzbz; + } + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND pre.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + $qry .= ") studenten + WHERE anzahl_abschlusspruefungen != 1"; + + return $this->_db->execReadOnlyQuery($qry, $params); + } } diff --git a/application/libraries/issues/plausichecks/FalscheAnzahlHeimatadressen.php b/application/libraries/issues/plausichecks/FalscheAnzahlHeimatadressen.php index eac50a88a..b3551904e 100644 --- a/application/libraries/issues/plausichecks/FalscheAnzahlHeimatadressen.php +++ b/application/libraries/issues/plausichecks/FalscheAnzahlHeimatadressen.php @@ -13,12 +13,20 @@ class FalscheAnzahlHeimatadressen extends PlausiChecker { $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; // get all students failing the plausicheck - $personRes = $this->_ci->plausichecklib->getFalscheAnzahlHeimatadressen($studiensemester_kurzbz, $studiengang_kz); + $personRes = $this->getFalscheAnzahlHeimatadressen( + $studiensemester_kurzbz, + $studiengang_kz, + null, + $exkludierte_studiengang_kz + ); if (isError($personRes)) return $personRes; @@ -39,4 +47,67 @@ class FalscheAnzahlHeimatadressen extends PlausiChecker // return the results return success($results); } + + /** + * Students should have exactly one home address. + * @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 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 getFalscheAnzahlHeimatadressen( + $studiensemester_kurzbz = null, + $studiengang_kz = null, + $person_id = null, + $exkludierte_studiengang_kz = null + ) { + $params = array(); + + $qry = " + SELECT + DISTINCT person_id + FROM + ( + SELECT person_id, COUNT(adresse_id) AS anzahl_adressen + FROM public.tbl_adresse addr + WHERE heimatadresse IS TRUE + GROUP BY person_id + ) adressen + JOIN public.tbl_person USING(person_id) + JOIN public.tbl_prestudent pre USING(person_id) + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_student USING(prestudent_id) + JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz + WHERE + anzahl_adressen != 1 + 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 person_id = ?"; + $params[] = $person_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } } diff --git a/application/libraries/issues/plausichecks/FalscheAnzahlZustelladressen.php b/application/libraries/issues/plausichecks/FalscheAnzahlZustelladressen.php index e2fc4a781..191b2a98e 100644 --- a/application/libraries/issues/plausichecks/FalscheAnzahlZustelladressen.php +++ b/application/libraries/issues/plausichecks/FalscheAnzahlZustelladressen.php @@ -13,12 +13,20 @@ class FalscheAnzahlZustelladressen extends PlausiChecker { $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; // get all students failing the plausicheck - $personRes = $this->_ci->plausichecklib->getFalscheAnzahlZustelladressen($studiensemester_kurzbz, $studiengang_kz); + $personRes = $this->getFalscheAnzahlZustelladressen( + $studiensemester_kurzbz, + $studiengang_kz, + null, + $exkludierte_studiengang_kz + ); if (isError($personRes)) return $personRes; @@ -39,4 +47,69 @@ class FalscheAnzahlZustelladressen extends PlausiChecker // return the results return success($results); } + + /** + * Students should have exactly one delivery address. + * @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 + */ + public function getFalscheAnzahlZustelladressen( + $studiensemester_kurzbz = null, + $studiengang_kz = null, + $person_id = null, + $exkludierte_studiengang_kz = null + ) { + $params = array(); + + $qry = " + SELECT + DISTINCT person_id + FROM + ( + SELECT person_id, COUNT(adresse_id) AS anzahl_adressen + FROM public.tbl_adresse addr + WHERE zustelladresse IS TRUE + GROUP BY person_id + ) adressen + JOIN public.tbl_person USING(person_id) + JOIN public.tbl_prestudent pre USING(person_id) + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_student USING(prestudent_id) + JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz + WHERE + anzahl_adressen != 1 + 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 person_id = ?"; + $params[] = $person_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } + + } diff --git a/application/libraries/issues/plausichecks/GbDatumWeitZurueck.php b/application/libraries/issues/plausichecks/GbDatumWeitZurueck.php index 7a7cf0d6f..70699b624 100644 --- a/application/libraries/issues/plausichecks/GbDatumWeitZurueck.php +++ b/application/libraries/issues/plausichecks/GbDatumWeitZurueck.php @@ -13,12 +13,15 @@ class GbDatumWeitZurueck extends PlausiChecker { $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; // get all students failing the plausicheck - $personRes = $this->_ci->plausichecklib->getGbDatumWeitZurueck($studiensemester_kurzbz, $studiengang_kz); + $personRes = $this->getGbDatumWeitZurueck($studiensemester_kurzbz, $studiengang_kz, null, $exkludierte_studiengang_kz); if (isError($personRes)) return $personRes; @@ -39,4 +42,65 @@ class GbDatumWeitZurueck extends PlausiChecker // return the results return success($results); } + + /** + * Birthdate is too long ago. + * @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 + */ + public function getGbDatumWeitZurueck( + $studiensemester_kurzbz = null, + $studiengang_kz = null, + $person_id = null, + $exkludierte_studiengang_kz = null + ) { + $params = array(); + + $qry = " + SELECT + pers.person_id + FROM + public.tbl_person pers + WHERE + pers.gebdatum < '1920-01-01' + AND EXISTS ( + SELECT 1 + FROM public.tbl_prestudent + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_studiengang stg USING(studiengang_kz) + WHERE person_id = pers.person_id"; + + if (isset($studiensemester_kurzbz)) + { + $qry .= " AND status.studiensemester_kurzbz = ?"; + $params[] = $studiensemester_kurzbz; + } + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + $qry .= ")"; + + if (isset($person_id)) + { + $qry .= " AND pers.person_id = ?"; + $params[] = $person_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } + + } diff --git a/application/libraries/issues/plausichecks/InaktiverStudentAktiverStatus.php b/application/libraries/issues/plausichecks/InaktiverStudentAktiverStatus.php index 76fd477e3..dead2b1e7 100644 --- a/application/libraries/issues/plausichecks/InaktiverStudentAktiverStatus.php +++ b/application/libraries/issues/plausichecks/InaktiverStudentAktiverStatus.php @@ -13,12 +13,20 @@ class InaktiverStudentAktiverStatus extends PlausiChecker { $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; // get all students failing the plausicheck - $prestudentRes = $this->_ci->plausichecklib->getInaktiverStudentAktiverStatus($studiensemester_kurzbz, $studiengang_kz); + $prestudentRes = $this->getInaktiverStudentAktiverStatus( + $studiensemester_kurzbz, + $studiengang_kz, + null, + $exkludierte_studiengang_kz + ); if (isError($prestudentRes)) return $prestudentRes; @@ -44,4 +52,62 @@ class InaktiverStudentAktiverStatus extends PlausiChecker // return the results return success($results); } + + /** + * Students with active status should have an active Benutzer. + * @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 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, + $studiengang_kz = null, + $prestudent_id = null, + $exkludierte_studiengang_kz = null + ) { + $aktStudiensemesterRes = $this->_ci->StudiensemesterModel->getAkt(); + + if (isError($aktStudiensemesterRes)) return $aktStudiensemesterRes; + + $studiensemester_kurzbz = hasData($aktStudiensemesterRes) ? getData($aktStudiensemesterRes)[0]->studiensemester_kurzbz : ''; + + $params = array($studiensemester_kurzbz); + + $qry = " + SELECT + DISTINCT(student.student_uid), prestudent.person_id, prestudent.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz + FROM + public.tbl_benutzer benutzer + JOIN public.tbl_student student on(benutzer.uid = student.student_uid) + JOIN public.tbl_prestudent prestudent USING(prestudent_id) + JOIN public.tbl_studiengang stg ON prestudent.studiengang_kz = stg.studiengang_kz + WHERE + benutzer.aktiv=false + AND EXISTS (SELECT 1 FROM public.tbl_prestudentstatus WHERE prestudent_id = prestudent.prestudent_id AND studiensemester_kurzbz = ?) + AND get_rolle_prestudent(prestudent_id, NULL) IN ('Student', 'Diplomand', 'Unterbrecher', 'Praktikant') + AND stg.melderelevant + AND prestudent.bismelden"; + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND prestudent.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } } diff --git a/application/libraries/issues/plausichecks/IncomingHeimatNationOesterreich.php b/application/libraries/issues/plausichecks/IncomingHeimatNationOesterreich.php index 51726d969..d7ba7316c 100644 --- a/application/libraries/issues/plausichecks/IncomingHeimatNationOesterreich.php +++ b/application/libraries/issues/plausichecks/IncomingHeimatNationOesterreich.php @@ -13,12 +13,20 @@ class IncomingHeimatNationOesterreich extends PlausiChecker { $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; // get all students failing the plausicheck - $personRes = $this->_ci->plausichecklib->getIncomingHeimatNationOesterreich($studiensemester_kurzbz, $studiengang_kz); + $personRes = $this->getIncomingHeimatNationOesterreich( + $studiensemester_kurzbz, + $studiengang_kz, + null, + $exkludierte_studiengang_kz + ); if (isError($personRes)) return $personRes; @@ -39,4 +47,60 @@ class IncomingHeimatNationOesterreich extends PlausiChecker // return the results return success($results); } + + /** + * Incoming shouldn't have austrian home address. + * @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 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 getIncomingHeimatNationOesterreich( + $studiensemester_kurzbz, + $studiengang_kz = null, + $person_id = null, + $exkludierte_studiengang_kz = null + ) { + $params = array($studiensemester_kurzbz); + + $qry = " + SELECT + DISTINCT pers.person_id, status.studiensemester_kurzbz + FROM + public.tbl_prestudent pre + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_person pers USING(person_id) + JOIN public.tbl_adresse addr USING(person_id) + JOIN public.tbl_studiengang stg USING(studiengang_kz) + WHERE + status.status_kurzbz = 'Incoming' + AND addr.nation = 'A' + AND addr.heimatadresse + AND status.studiensemester_kurzbz = ? + AND stg.melderelevant + AND pre.bismelden"; + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($person_id)) + { + $qry .= " AND pers.person_id = ?"; + $params[] = $person_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } + + } diff --git a/application/libraries/issues/plausichecks/IncomingOhneIoDatensatz.php b/application/libraries/issues/plausichecks/IncomingOhneIoDatensatz.php index 9681554e5..e08280f83 100644 --- a/application/libraries/issues/plausichecks/IncomingOhneIoDatensatz.php +++ b/application/libraries/issues/plausichecks/IncomingOhneIoDatensatz.php @@ -13,11 +13,14 @@ class IncomingOhneIoDatensatz extends PlausiChecker { $results = array(); + // get parameters from config + $exkludierte_studiengang_kz = isset($this->_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null; + // pass parameters needed for plausicheck $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; // get all students failing the plausicheck - $prestudentRes = $this->_ci->plausichecklib->getIncomingOhneIoDatensatz($studiengang_kz); + $prestudentRes = $this->getIncomingOhneIoDatensatz($studiengang_kz, null, $exkludierte_studiengang_kz); if (isError($prestudentRes)) return $prestudentRes; @@ -40,4 +43,54 @@ class IncomingOhneIoDatensatz extends PlausiChecker // return the results return success($results); } + + /** + * 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 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) + { + $params = array(); + + $qry = " + SELECT + DISTINCT ON(student_uid, nachname, vorname) + tbl_person.person_id, + tbl_prestudent.prestudent_id, + stg.oe_kurzbz AS prestudent_stg_oe_kurzbz + FROM + public.tbl_student + JOIN public.tbl_benutzer ON(student_uid=uid) + JOIN public.tbl_person USING(person_id) + JOIN public.tbl_prestudent USING(prestudent_id) + JOIN public.tbl_prestudentstatus ON(tbl_prestudent.prestudent_id=tbl_prestudentstatus.prestudent_id) + JOIN public.tbl_studiengang stg ON(stg.studiengang_kz=tbl_student.studiengang_kz) + WHERE + bismelden=TRUE + AND status_kurzbz='Incoming' AND NOT EXISTS (SELECT 1 FROM bis.tbl_bisio WHERE student_uid=tbl_student.student_uid) + AND stg.melderelevant"; + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND tbl_prestudent.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } } diff --git a/application/libraries/issues/plausichecks/IncomingOrGsFoerderrelevant.php b/application/libraries/issues/plausichecks/IncomingOrGsFoerderrelevant.php index 0e12ccac8..4d789f71a 100644 --- a/application/libraries/issues/plausichecks/IncomingOrGsFoerderrelevant.php +++ b/application/libraries/issues/plausichecks/IncomingOrGsFoerderrelevant.php @@ -13,12 +13,20 @@ class IncomingOrGsFoerderrelevant extends PlausiChecker { $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; // get all students failing the plausicheck - $prestudentRes = $this->_ci->plausichecklib->getIncomingOrGsFoerderrelevant($studiensemester_kurzbz, $studiengang_kz); + $prestudentRes = $this->getIncomingOrGsFoerderrelevant( + $studiensemester_kurzbz, + $studiengang_kz, + null, + $exkludierte_studiengang_kz + ); if (isError($prestudentRes)) return $prestudentRes; @@ -41,4 +49,77 @@ class IncomingOrGsFoerderrelevant extends PlausiChecker // return the results return success($results); } + + /** + * Incoming or gemeinsame Studien students should not receive funding (not be förderrelevant). + * @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 exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return object success or error + */ + public function getIncomingOrGsFoerderrelevant( + $studiensemester_kurzbz = null, + $studiengang_kz = null, + $prestudent_id = null, + $exkludierte_studiengang_kz = null + ) { + $params = array(); + + $qry = " + SELECT + DISTINCT ON(prestudent_id) + pers.person_id, + ps.prestudent_id, + stg.oe_kurzbz AS prestudent_stg_oe_kurzbz + FROM + public.tbl_student stud + JOIN public.tbl_benutzer ON(student_uid=uid) + JOIN public.tbl_person pers USING(person_id) + JOIN public.tbl_prestudent ps USING(prestudent_id) + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_studiengang stg ON(stg.studiengang_kz=stud.studiengang_kz) + WHERE + ( + status.status_kurzbz = 'Incoming' + OR EXISTS ( + SELECT 1 + FROM + bis.tbl_mobilitaet + JOIN public.tbl_prestudent USING(prestudent_id) + WHERE + prestudent_id = ps.prestudent_id + AND gsstudientyp_kurzbz = 'Extern' + ) + ) + AND (ps.foerderrelevant <> FALSE OR ps.foerderrelevant IS NULL) + AND bismelden=TRUE + AND stg.melderelevant"; + + 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 ps.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } } diff --git a/application/libraries/issues/plausichecks/InskriptionVorLetzerBismeldung.php b/application/libraries/issues/plausichecks/InskriptionVorLetzerBismeldung.php index 672dfa585..871b3b3d4 100644 --- a/application/libraries/issues/plausichecks/InskriptionVorLetzerBismeldung.php +++ b/application/libraries/issues/plausichecks/InskriptionVorLetzerBismeldung.php @@ -13,12 +13,20 @@ class InskriptionVorLetzerBismeldung extends PlausiChecker { $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; // get all students failing the plausicheck - $prestudentRes = $this->_ci->plausichecklib->getInskriptionVorLetzerBismeldung($studiensemester_kurzbz, $studiengang_kz); + $prestudentRes = $this->getInskriptionVorLetzerBismeldung( + $studiensemester_kurzbz, + $studiengang_kz, + null, + $exkludierte_studiengang_kz + ); if (isError($prestudentRes)) return $prestudentRes; @@ -48,4 +56,93 @@ class InskriptionVorLetzerBismeldung extends PlausiChecker // return the results return success($results); } + + /** + * 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 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 + * @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 + */ + public function getInskriptionVorLetzerBismeldung( + $studiensemester_kurzbz, + $studiengang_kz = null, + $prestudent_id = null, + $exkludierte_studiengang_kz = null + ) { + // get Bismeldedatum + $datumBis = $this->_getBisdateFromSemester($studiensemester_kurzbz); + + $params = array($datumBis, $studiensemester_kurzbz, $datumBis); + + // get active students + $qry = " + SELECT + DISTINCT ON (student.student_uid) ? AS datum_bismeldung, + prestudent.person_id, prestudent.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, status.studiensemester_kurzbz + FROM + public.tbl_benutzer benutzer + JOIN public.tbl_student student on(benutzer.uid = student.student_uid) + JOIN public.tbl_prestudent prestudent USING(prestudent_id) + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_studiengang stg ON prestudent.studiengang_kz = stg.studiengang_kz + WHERE + benutzer.aktiv=true + AND status.studiensemester_kurzbz = ? + /* inscription date before date of first student status */ + AND ( + SELECT datum + FROM public.tbl_prestudentstatus + WHERE prestudent_id = prestudent.prestudent_id + AND studiensemester_kurzbz = status.studiensemester_kurzbz + AND status_kurzbz = 'Student' + ORDER BY datum, insertamum, ext_id + LIMIT 1 + ) < ? + AND stg.melderelevant + AND prestudent.bismelden"; + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND prestudent.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } + + /** + * Gets Bismeldedate from Studiensemester. + * @param studiensemester_kurzbz string + */ + private function _getBisdateFromSemester($studiensemester_kurzbz) + { + $semesterYear = substr($studiensemester_kurzbz, 2, 6); + $semesterType = substr($studiensemester_kurzbz, 0, 2); + + if ($semesterType == 'SS') + { + return date_format(date_create(($semesterYear - 1)."-11-15"), 'Y-m-d'); + } + + if ($semesterType == 'WS') + { + return date_format(date_create($semesterYear."-04-15"), 'Y-m-d'); + } + } } diff --git a/application/libraries/issues/plausichecks/NationNichtOesterreichAberGemeinde.php b/application/libraries/issues/plausichecks/NationNichtOesterreichAberGemeinde.php index c61531e46..c04cd664c 100644 --- a/application/libraries/issues/plausichecks/NationNichtOesterreichAberGemeinde.php +++ b/application/libraries/issues/plausichecks/NationNichtOesterreichAberGemeinde.php @@ -13,11 +13,18 @@ class NationNichtOesterreichAberGemeinde extends PlausiChecker { $results = array(); + // get parameters from config + $exkludierte_studiengang_kz = isset($this->_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null; + // pass parameters needed for plausicheck $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; // get all students failing the plausicheck - $personRes = $this->_ci->plausichecklib->getNationNichtOesterreichAberGemeinde($studiengang_kz); + $personRes = $this->getNationNichtOesterreichAberGemeinde( + $studiengang_kz, + null, + $exkludierte_studiengang_kz + ); if (isError($personRes)) return $personRes; @@ -39,4 +46,49 @@ class NationNichtOesterreichAberGemeinde extends PlausiChecker // return the results return success($results); } + + /** + * Nation is not Austria, but address has austrian Gemeinde. + * @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 + * @return success with prestudents or error + */ + public function getNationNichtOesterreichAberGemeinde($studiengang_kz = null, $person_id = null, $exkludierte_studiengang_kz = null) + { + $params = array(); + + $qry = "SELECT DISTINCT tbl_person.person_id, adr.gemeinde, adr.adresse_id + FROM + public.tbl_adresse adr + JOIN public.tbl_prestudent USING(person_id) + JOIN public.tbl_person USING(person_id) + JOIN public.tbl_student USING(prestudent_id) + JOIN public.tbl_benutzer ON(uid=student_uid) + JOIN public.tbl_studiengang stg ON tbl_prestudent.studiengang_kz = stg.studiengang_kz + WHERE + adr.nation!='A' + AND tbl_benutzer.aktiv + AND gemeinde NOT IN ('Münster') + AND EXISTS(SELECT 1 FROM bis.tbl_gemeinde WHERE name = adr.gemeinde)"; + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + 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 ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } } diff --git a/application/libraries/issues/plausichecks/OrgformStgUngleichOrgformPrestudent.php b/application/libraries/issues/plausichecks/OrgformStgUngleichOrgformPrestudent.php index b7ef64c41..316e81072 100644 --- a/application/libraries/issues/plausichecks/OrgformStgUngleichOrgformPrestudent.php +++ b/application/libraries/issues/plausichecks/OrgformStgUngleichOrgformPrestudent.php @@ -13,12 +13,20 @@ class OrgformStgUngleichOrgformPrestudent extends PlausiChecker { $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; // get all students failing the plausicheck - $prestudentRes = $this->_ci->plausichecklib->getOrgformStgUngleichOrgformPrestudent($studiensemester_kurzbz, $studiengang_kz); + $prestudentRes = $this->getOrgformStgUngleichOrgformPrestudent( + $studiensemester_kurzbz, + $studiengang_kz, + null, + $exkludierte_studiengang_kz + ); if (isError($prestudentRes)) return $prestudentRes; @@ -49,4 +57,74 @@ class OrgformStgUngleichOrgformPrestudent extends PlausiChecker // return the results return success($results); } + + /** + * Orgform of a Studiengang in Studienplan should be the same as orgform of student. + * @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 exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + public function getOrgformStgUngleichOrgformPrestudent( + $studiensemester_kurzbz, + $studiengang_kz = null, + $prestudent_id = null, + $exkludierte_studiengang_kz = null + ) { + $params = array($studiensemester_kurzbz); + + $qry = " + SELECT + prestudent.person_id, prestudent.prestudent_id, status.studiensemester_kurzbz, + studiengang.orgform_kurzbz AS stg_orgform, status.orgform_kurzbz AS student_orgform, + prestudent.studiengang_kz AS student_studiengang, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz + FROM + public.tbl_studiengang studiengang + JOIN public.tbl_student student USING(studiengang_kz) + JOIN public.tbl_prestudent prestudent USING(prestudent_id) + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_benutzer benutzer on(benutzer.uid = student.student_uid) + JOIN public.tbl_studiengang stg ON prestudent.studiengang_kz = stg.studiengang_kz + LEFT JOIN lehre.tbl_studienplan stpl USING (studienplan_id) + WHERE + benutzer.aktiv = true + AND status.status_kurzbz IN ('Student', 'Unterbrecher', 'Abbrecher', 'Diplomand', 'Absolvent') + AND studiengang.studiengang_kz < 10000 + AND status.studiensemester_kurzbz = ? + AND NOT (status.orgform_kurzbz IS NULL AND studiengang.mischform = FALSE) + AND NOT EXISTS( + SELECT 1 + FROM + lehre.tbl_studienplan + JOIN + lehre.tbl_studienordnung USING(studienordnung_id) + WHERE + tbl_studienplan.studienplan_id = stpl.studienplan_id + AND tbl_studienordnung.studiengang_kz = prestudent.studiengang_kz + AND tbl_studienplan.orgform_kurzbz = status.orgform_kurzbz)"; + + if (isset($studiengang_kz)) + { + $qry .= " AND studiengang.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND prestudent.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + $qry .= " + ORDER BY student_uid"; + + return $this->_db->execReadOnlyQuery($qry, $params); + } } diff --git a/application/libraries/issues/plausichecks/PlausiChecker.php b/application/libraries/issues/plausichecks/PlausiChecker.php index bfa72b5e0..086a44cc4 100644 --- a/application/libraries/issues/plausichecks/PlausiChecker.php +++ b/application/libraries/issues/plausichecks/PlausiChecker.php @@ -6,13 +6,18 @@ abstract class PlausiChecker { protected $_ci; // code igniter instance + protected $_config; // configuration parameters for this plausicheck + protected $_db; // database for queries - public function __construct() + public function __construct($configurationParams = null) { $this->_ci =& get_instance(); // get code igniter instance - // load libraries - $this->_ci->load->library('issues/PlausicheckLib'); // load plausicheck library + // set configuration + $this->_config = $configurationParams; + + // get database for queries + $this->_db = new DB_Model(); } /** diff --git a/application/libraries/issues/plausichecks/PrestudentMischformOhneOrgform.php b/application/libraries/issues/plausichecks/PrestudentMischformOhneOrgform.php index 369085089..8e3926a12 100644 --- a/application/libraries/issues/plausichecks/PrestudentMischformOhneOrgform.php +++ b/application/libraries/issues/plausichecks/PrestudentMischformOhneOrgform.php @@ -13,12 +13,20 @@ class PrestudentMischformOhneOrgform extends PlausiChecker { $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; // get all students failing the plausicheck - $prestudentRes = $this->_ci->plausichecklib->getPrestudentMischformOhneOrgform($studiensemester_kurzbz, $studiengang_kz); + $prestudentRes = $this->getPrestudentMischformOhneOrgform( + $studiensemester_kurzbz, + $studiengang_kz, + null, + $exkludierte_studiengang_kz + ); if (isError($prestudentRes)) return $prestudentRes; @@ -47,4 +55,57 @@ class PrestudentMischformOhneOrgform extends PlausiChecker // return the results return success($results); } + + /** + * Students in "mixed" Studiengang should have Orgform. + * @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 exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + public function getPrestudentMischformOhneOrgform( + $studiensemester_kurzbz, + $studiengang_kz = null, + $prestudent_id = null, + $exkludierte_studiengang_kz = null + ) { + $params = array($studiensemester_kurzbz); + + $qry = " + SELECT + pre.person_id, pre.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, status.studiensemester_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 USING(studiengang_kz) + WHERE + status.status_kurzbz IN ('Bewerber', 'Student') + AND stg.mischform + AND (status.orgform_kurzbz='' OR status.orgform_kurzbz IS NULL) + AND status.studiensemester_kurzbz=?"; + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND pre.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } + + } diff --git a/application/libraries/issues/plausichecks/StgPrestudentUngleichStgStudent.php b/application/libraries/issues/plausichecks/StgPrestudentUngleichStgStudent.php index 4eb25ed11..700557c65 100644 --- a/application/libraries/issues/plausichecks/StgPrestudentUngleichStgStudent.php +++ b/application/libraries/issues/plausichecks/StgPrestudentUngleichStgStudent.php @@ -13,11 +13,14 @@ class StgPrestudentUngleichStgStudent extends PlausiChecker { $results = array(); + // get parameters from config + $exkludierte_studiengang_kz = isset($this->_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null; + // pass parameters needed for plausicheck $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; // get all students failing the plausicheck - $prestudentRes = $this->_ci->plausichecklib->getStgPrestudentUngleichStgStudent($studiengang_kz); + $prestudentRes = $this->getStgPrestudentUngleichStgStudent($studiengang_kz, null, $exkludierte_studiengang_kz); if (isError($prestudentRes)) return $prestudentRes; @@ -40,4 +43,50 @@ class StgPrestudentUngleichStgStudent extends PlausiChecker // return the results return success($results); } + + /** + * Studiengang should be the same for prestudent and student. + * @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 + */ + public function getStgPrestudentUngleichStgStudent($studiengang_kz = null, $prestudent_id = null, $exkludierte_studiengang_kz = null) + { + $params = array(); + + $qry = " + SELECT + pre.person_id, pre.prestudent_id, stg.oe_kurzbz prestudent_stg_oe_kurzbz, student_stg.oe_kurzbz student_stg_oe_kurzbz + FROM + public.tbl_prestudent pre + JOIN public.tbl_student stud USING(prestudent_id) + JOIN public.tbl_person pers USING(person_id) + JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz + JOIN public.tbl_studiengang student_stg ON stud.studiengang_kz = student_stg.studiengang_kz + WHERE + stud.studiengang_kz != pre.studiengang_kz"; + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND pre.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } + + } diff --git a/application/libraries/issues/plausichecks/StgPrestudentUngleichStgStudienplan.php b/application/libraries/issues/plausichecks/StgPrestudentUngleichStgStudienplan.php index 7175725fd..f8e1d8691 100644 --- a/application/libraries/issues/plausichecks/StgPrestudentUngleichStgStudienplan.php +++ b/application/libraries/issues/plausichecks/StgPrestudentUngleichStgStudienplan.php @@ -13,11 +13,14 @@ class StgPrestudentUngleichStgStudienplan extends PlausiChecker { $results = array(); + // get parameters from config + $exkludierte_studiengang_kz = isset($this->_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null; + // pass parameters needed for plausicheck $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; // get all students failing the plausicheck - $prestudentRes = $this->_ci->plausichecklib->getStgPrestudentUngleichStgStudienplan($studiengang_kz); + $prestudentRes = $this->getStgPrestudentUngleichStgStudienplan($studiengang_kz, null, null, $exkludierte_studiengang_kz); if (isError($prestudentRes)) return $prestudentRes; @@ -40,4 +43,64 @@ class StgPrestudentUngleichStgStudienplan extends PlausiChecker // return the results return success($results); } + + /** + * Studiengang should be the same for prestudent and studienplan. + * @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 studienordnung_id int if check is to be executed only for a certain studienordnung_id + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + public function getStgPrestudentUngleichStgStudienplan( + $studiengang_kz = null, + $prestudent_id = null, + $studienordnung_id = null, + $exkludierte_studiengang_kz = null + ) { + $params = array(); + + $qry = " + SELECT + DISTINCT ON (ps.prestudent_id) ps.person_id, ps.prestudent_id, stordnung.studienordnung_id, + stplan.bezeichnung AS studienplan, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz + FROM + public.tbl_prestudent ps + JOIN public.tbl_prestudentstatus USING(prestudent_id) + JOIN lehre.tbl_studienplan stplan USING(studienplan_id) + JOIN lehre.tbl_studienordnung stordnung USING(studienordnung_id) + JOIN public.tbl_person USING(person_id) + JOIN public.tbl_studiengang stg ON ps.studiengang_kz = stg.studiengang_kz + WHERE + ps.studiengang_kz<>stordnung.studiengang_kz + AND stg.melderelevant"; + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND ps.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($studienordnung_id)) + { + $qry .= " AND stordnung.studienordnung_id = ?"; + $params[] = $studienordnung_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } + + } diff --git a/application/libraries/issues/plausichecks/StudentstatusNachAbbrecher.php b/application/libraries/issues/plausichecks/StudentstatusNachAbbrecher.php index 12a7516ef..87bb51d7e 100644 --- a/application/libraries/issues/plausichecks/StudentstatusNachAbbrecher.php +++ b/application/libraries/issues/plausichecks/StudentstatusNachAbbrecher.php @@ -13,11 +13,14 @@ class StudentstatusNachAbbrecher extends PlausiChecker { $results = array(); + // get parameters from config + $exkludierte_studiengang_kz = isset($this->_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null; + // pass parameters needed for plausicheck $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; // get all students failing the plausicheck - $prestudentRes = $this->_ci->plausichecklib->getStudentstatusNachAbbrecher($studiengang_kz); + $prestudentRes = $this->getStudentstatusNachAbbrecher($studiengang_kz, null, $exkludierte_studiengang_kz); if (isError($prestudentRes)) return $prestudentRes; @@ -40,4 +43,48 @@ class StudentstatusNachAbbrecher extends PlausiChecker // return the results return success($results); } + + /** + * There shouldn't be any status after Abbrecher status. + * @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 + */ + public function getStudentstatusNachAbbrecher($studiengang_kz = null, $prestudent_id = null, $exkludierte_studiengang_kz = null) + { + $params = array(); + + $qry = " + SELECT + prestudent.person_id, prestudent.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz + FROM + public.tbl_student student + JOIN public.tbl_prestudent prestudent USING(prestudent_id) + JOIN public.tbl_prestudentstatus prestatus USING(prestudent_id) + JOIN public.tbl_studiengang stg ON prestudent.studiengang_kz = stg.studiengang_kz + WHERE + prestatus.status_kurzbz = 'Abbrecher' + AND get_rolle_prestudent(prestudent.prestudent_id, prestatus.studiensemester_kurzbz) <> 'Abbrecher'"; + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND prestudent.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } } diff --git a/application/libraries/issues/plausichecks/StudienplanUngueltig.php b/application/libraries/issues/plausichecks/StudienplanUngueltig.php index 6b8fe49aa..2f2de1e9c 100644 --- a/application/libraries/issues/plausichecks/StudienplanUngueltig.php +++ b/application/libraries/issues/plausichecks/StudienplanUngueltig.php @@ -13,12 +13,20 @@ class StudienplanUngueltig extends PlausiChecker { $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; // get all students failing the plausicheck - $prestudentRes = $this->_ci->plausichecklib->getStudienplanUngueltig($studiensemester_kurzbz, $studiengang_kz); + $prestudentRes = $this->getStudienplanUngueltig( + $studiensemester_kurzbz, + $studiengang_kz, + null, + $exkludierte_studiengang_kz + ); if (isError($prestudentRes)) return $prestudentRes; @@ -48,4 +56,73 @@ class StudienplanUngueltig extends PlausiChecker // return the results return success($results); } + + /** + * Studienplan should be valid in current Ausbildungssemester of prestudent. + * @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 exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + public function getStudienplanUngueltig( + $studiensemester_kurzbz, + $studiengang_kz = null, + $prestudent_id = null, + $exkludierte_studiengang_kz = null + ) { + $params = array($studiensemester_kurzbz); + + $qry = " + SELECT + DISTINCT pre.person_id, pre.prestudent_id, + tbl_studienplan.bezeichnung AS studienplan, + status.status_kurzbz, + status.studiensemester_kurzbz, + status.ausbildungssemester, + stg.oe_kurzbz AS prestudent_stg_oe_kurzbz + FROM + public.tbl_prestudent pre + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_person USING(person_id) + JOIN lehre.tbl_studienplan USING(studienplan_id) + JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz + WHERE + status_kurzbz in('Student', 'Interessent','Bewerber','Aufgenommener') + AND NOT EXISTS ( + SELECT + 1 + FROM + lehre.tbl_studienplan_semester + WHERE + studienplan_id=status.studienplan_id + AND tbl_studienplan_semester.semester = status.ausbildungssemester + AND tbl_studienplan_semester.studiensemester_kurzbz = status.studiensemester_kurzbz + ) + AND status.studiensemester_kurzbz=? + AND pre.bismelden + AND stg.melderelevant"; + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND tbl_prestudent.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } + + } diff --git a/application/libraries/issues/resolvers/CORE_INOUT_0007.php b/application/libraries/issues/resolvers/CORE_INOUT_0007.php index 2d9c7a3f4..31ca79ffb 100644 --- a/application/libraries/issues/resolvers/CORE_INOUT_0007.php +++ b/application/libraries/issues/resolvers/CORE_INOUT_0007.php @@ -17,10 +17,10 @@ class CORE_INOUT_0007 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/IncomingHeimatNationOesterreich'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getIncomingHeimatNationOesterreich($params['studiensemester_kurzbz'], null, $params['issue_person_id']); + $checkRes = $this->_ci->incomingheimatnationoesterreich->getIncomingHeimatNationOesterreich($params['studiensemester_kurzbz'], null, $params['issue_person_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_INOUT_0008.php b/application/libraries/issues/resolvers/CORE_INOUT_0008.php index afa43893a..4fa090c6a 100644 --- a/application/libraries/issues/resolvers/CORE_INOUT_0008.php +++ b/application/libraries/issues/resolvers/CORE_INOUT_0008.php @@ -3,7 +3,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); /** - * Incoming shouldn't have austrian home address. + * Incoming should have IN/OUT data entry. */ class CORE_INOUT_0008 implements IIssueResolvedChecker { @@ -14,10 +14,10 @@ class CORE_INOUT_0008 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/IncomingOhneIoDatensatz'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getIncomingOhneIoDatensatz(null, $params['prestudent_id']); + $checkRes = $this->_ci->incomingohneiodatensatz->getIncomingOhneIoDatensatz(null, $params['prestudent_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_INOUT_0009.php b/application/libraries/issues/resolvers/CORE_INOUT_0009.php index b56344042..c739d71c3 100644 --- a/application/libraries/issues/resolvers/CORE_INOUT_0009.php +++ b/application/libraries/issues/resolvers/CORE_INOUT_0009.php @@ -14,10 +14,10 @@ class CORE_INOUT_0009 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/IncomingOrGsFoerderrelevant'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getIncomingOrGsFoerderrelevant(null, null, $params['prestudent_id']); + $checkRes = $this->_ci->incomingorgsfoerderrelevant->getIncomingOrGsFoerderrelevant(null, null, $params['prestudent_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_PERSON_0001.php b/application/libraries/issues/resolvers/CORE_PERSON_0001.php index bd94fea59..d0ac0d3ed 100644 --- a/application/libraries/issues/resolvers/CORE_PERSON_0001.php +++ b/application/libraries/issues/resolvers/CORE_PERSON_0001.php @@ -3,7 +3,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); /** - * Incoming shouldn't have austrian home address. + * Birth date of person shouldn't be too long ago. */ class CORE_PERSON_0001 implements IIssueResolvedChecker { @@ -14,10 +14,10 @@ class CORE_PERSON_0001 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/GbDatumWeitZurueck'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getGbDatumWeitZurueck(null, null, $params['issue_person_id']); + $checkRes = $this->_ci->gbdatumweitzurueck->getGbDatumWeitZurueck(null, null, $params['issue_person_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_PERSON_0002.php b/application/libraries/issues/resolvers/CORE_PERSON_0002.php index d1bb2fe94..608dcf0ce 100644 --- a/application/libraries/issues/resolvers/CORE_PERSON_0002.php +++ b/application/libraries/issues/resolvers/CORE_PERSON_0002.php @@ -3,7 +3,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); /** - * Incoming shouldn't have austrian home address. + * Nation of person should be austria if Gemeinde (city) is austrian. */ class CORE_PERSON_0002 implements IIssueResolvedChecker { @@ -14,10 +14,10 @@ class CORE_PERSON_0002 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/NationNichtOesterreichAberGemeinde'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getNationNichtOesterreichAberGemeinde(null, $params['issue_person_id']); + $checkRes = $this->_ci->nationnichtoesterreichabergemeinde->getNationNichtOesterreichAberGemeinde(null, $params['issue_person_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_PERSON_0003.php b/application/libraries/issues/resolvers/CORE_PERSON_0003.php index 08fea6c05..23a81b660 100644 --- a/application/libraries/issues/resolvers/CORE_PERSON_0003.php +++ b/application/libraries/issues/resolvers/CORE_PERSON_0003.php @@ -3,7 +3,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); /** - * Incoming shouldn't have austrian home address. + * Person should have only one home adress. */ class CORE_PERSON_0003 implements IIssueResolvedChecker { @@ -14,10 +14,10 @@ class CORE_PERSON_0003 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/FalscheAnzahlHeimatadressen'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getFalscheAnzahlHeimatadressen(null, null, $params['issue_person_id']); + $checkRes = $this->_ci->falscheanzahlheimatadressen->getFalscheAnzahlHeimatadressen(null, null, $params['issue_person_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_PERSON_0004.php b/application/libraries/issues/resolvers/CORE_PERSON_0004.php index bfe243fd1..ae3a855ec 100644 --- a/application/libraries/issues/resolvers/CORE_PERSON_0004.php +++ b/application/libraries/issues/resolvers/CORE_PERSON_0004.php @@ -3,7 +3,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); /** - * Incoming shouldn't have austrian home address. + * Person should have only one delivery adress. */ class CORE_PERSON_0004 implements IIssueResolvedChecker { @@ -14,10 +14,10 @@ class CORE_PERSON_0004 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/FalscheAnzahlZustelladressen'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getFalscheAnzahlZustelladressen(null, null, $params['issue_person_id']); + $checkRes = $this->_ci->falscheanzahlzustelladressen->getFalscheAnzahlZustelladressen(null, null, $params['issue_person_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_STG_0001.php b/application/libraries/issues/resolvers/CORE_STG_0001.php index 97cef6056..09c34be74 100644 --- a/application/libraries/issues/resolvers/CORE_STG_0001.php +++ b/application/libraries/issues/resolvers/CORE_STG_0001.php @@ -3,7 +3,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); /** - * Incoming shouldn't have austrian home address. + * Studiengang should be the same for prestudent and student. */ class CORE_STG_0001 implements IIssueResolvedChecker { @@ -14,10 +14,10 @@ class CORE_STG_0001 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/StgPrestudentUngleichStgStudent'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getStgPrestudentUngleichStgStudent(null, $params['prestudent_id']); + $checkRes = $this->_ci->stgprestudentungleichstgstudent->getStgPrestudentUngleichStgStudent(null, $params['prestudent_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_STG_0002.php b/application/libraries/issues/resolvers/CORE_STG_0002.php index fe414de38..999958042 100644 --- a/application/libraries/issues/resolvers/CORE_STG_0002.php +++ b/application/libraries/issues/resolvers/CORE_STG_0002.php @@ -3,7 +3,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); /** - * Incoming shouldn't have austrian home address. + * Orgform of a Studiengang in Studienplan should be the same as orgform of student. */ class CORE_STG_0002 implements IIssueResolvedChecker { @@ -17,10 +17,10 @@ class CORE_STG_0002 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/OrgformStgUngleichOrgformPrestudent'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getOrgformStgUngleichOrgformPrestudent($params['studiensemester_kurzbz'], null, $params['prestudent_id']); + $checkRes = $this->_ci->orgformstgungleichorgformprestudent->getOrgformStgUngleichOrgformPrestudent($params['studiensemester_kurzbz'], null, $params['prestudent_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_STG_0003.php b/application/libraries/issues/resolvers/CORE_STG_0003.php index 33cb0846b..22d6399be 100644 --- a/application/libraries/issues/resolvers/CORE_STG_0003.php +++ b/application/libraries/issues/resolvers/CORE_STG_0003.php @@ -3,7 +3,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); /** - * Incoming shouldn't have austrian home address. + * Students in "mixed" Studiengang should have Orgform. */ class CORE_STG_0003 implements IIssueResolvedChecker { @@ -17,10 +17,10 @@ class CORE_STG_0003 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/PrestudentMischformOhneOrgform'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getPrestudentMischformOhneOrgform($params['studiensemester_kurzbz'], null, $params['prestudent_id']); + $checkRes = $this->_ci->prestudentmischformohneorgform->getPrestudentMischformOhneOrgform($params['studiensemester_kurzbz'], null, $params['prestudent_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_STG_0004.php b/application/libraries/issues/resolvers/CORE_STG_0004.php index 02d45bbd3..2eedfc7fe 100644 --- a/application/libraries/issues/resolvers/CORE_STG_0004.php +++ b/application/libraries/issues/resolvers/CORE_STG_0004.php @@ -3,7 +3,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); /** - * Incoming shouldn't have austrian home address. + * Studiengang should be the same for prestudent and studienplan. */ class CORE_STG_0004 implements IIssueResolvedChecker { @@ -17,10 +17,10 @@ class CORE_STG_0004 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/StgPrestudentUngleichStgStudienplan'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getStgPrestudentUngleichStgStudienplan(null, $params['prestudent_id'], $params['studienordnung_id']); + $checkRes = $this->_ci->stgprestudentungleichstgstudienplan->getStgPrestudentUngleichStgStudienplan(null, $params['prestudent_id'], $params['studienordnung_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0001.php b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0001.php index 78c49810b..c74cd38fb 100644 --- a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0001.php +++ b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0001.php @@ -3,7 +3,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); /** - * Incoming shouldn't have austrian home address. + * Abbrecher cannot be active. */ class CORE_STUDENTSTATUS_0001 implements IIssueResolvedChecker { @@ -14,10 +14,10 @@ class CORE_STUDENTSTATUS_0001 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/AbbrecherAktiv'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getAbbrecherAktiv(null, $params['prestudent_id']); + $checkRes = $this->_ci->abbrecheraktiv->getAbbrecherAktiv(null, $params['prestudent_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0002.php b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0002.php index 23943397a..36827684c 100644 --- a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0002.php +++ b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0002.php @@ -3,7 +3,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); /** - * Incoming shouldn't have austrian home address. + * There shouldn't be any status after Abbrecher status. */ class CORE_STUDENTSTATUS_0002 implements IIssueResolvedChecker { @@ -14,10 +14,10 @@ class CORE_STUDENTSTATUS_0002 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/StudentstatusNachAbbrecher'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getStudentstatusNachAbbrecher(null, $params['prestudent_id']); + $checkRes = $this->_ci->studentstatusnachabbrecher->getStudentstatusNachAbbrecher(null, $params['prestudent_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0003.php b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0003.php index 6ac243b4f..f3b150d8d 100644 --- a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0003.php +++ b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0003.php @@ -3,7 +3,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); /** - * Incoming shouldn't have austrian home address. + * Ausbildungssemester of prestudent (lehrverband) must be the same as Ausbildungssemester of prestudentstatus. */ class CORE_STUDENTSTATUS_0003 implements IIssueResolvedChecker { @@ -17,10 +17,14 @@ class CORE_STUDENTSTATUS_0003 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/AusbildungssemPrestudentUngleichAusbildungssemStatus'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getAusbildungssemPrestudentUngleichAusbildungssemStatus($params['studiensemester_kurzbz'], null, $params['prestudent_id']); + $checkRes = $this->_ci->ausbildungssemprestudentungleichausbildungssemstatus->getAusbildungssemPrestudentUngleichAusbildungssemStatus( + $params['studiensemester_kurzbz'], + null, + $params['prestudent_id'] + ); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0004.php b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0004.php index d76215b6a..cbce2b01e 100644 --- a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0004.php +++ b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0004.php @@ -3,7 +3,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); /** - * Incoming shouldn't have austrian home address. + * Students with active status should have an active Benutzer. */ class CORE_STUDENTSTATUS_0004 implements IIssueResolvedChecker { @@ -17,10 +17,14 @@ class CORE_STUDENTSTATUS_0004 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/InaktiverStudentAktiverStatus'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getInaktiverStudentAktiverStatus($params['studiensemester_kurzbz'], null, $params['prestudent_id']); + $checkRes = $this->_ci->inaktiverstudentaktiverstatus->getInaktiverStudentAktiverStatus( + $params['studiensemester_kurzbz'], + null, + $params['prestudent_id'] + ); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0005.php b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0005.php index 7f7ca4723..f5e265194 100644 --- a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0005.php +++ b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0005.php @@ -3,7 +3,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); /** - * Incoming shouldn't have austrian home address. + * Students of a semester shouldn't start studies before the date of Bismeldung. */ class CORE_STUDENTSTATUS_0005 implements IIssueResolvedChecker { @@ -17,10 +17,10 @@ class CORE_STUDENTSTATUS_0005 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/InskriptionVorLetzerBismeldung'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getInskriptionVorLetzerBismeldung($params['studiensemester_kurzbz'], null, $params['prestudent_id']); + $checkRes = $this->_ci->inskriptionvorletzerbismeldung->getInskriptionVorLetzerBismeldung($params['studiensemester_kurzbz'], null, $params['prestudent_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0006.php b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0006.php index ba1e5b715..94658ec9c 100644 --- a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0006.php +++ b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0006.php @@ -3,7 +3,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); /** - * Incoming shouldn't have austrian home address. + * Status Dates and status studysemester dates should be in correct order. */ class CORE_STUDENTSTATUS_0006 implements IIssueResolvedChecker { @@ -14,10 +14,10 @@ class CORE_STUDENTSTATUS_0006 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/DatumStudiensemesterFalscheReihenfolge'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getDatumStudiensemesterFalscheReihenfolge(null, $params['prestudent_id']); + $checkRes = $this->_ci->datumstudiensemesterfalschereihenfolge->getDatumStudiensemesterFalscheReihenfolge(null, $params['prestudent_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0007.php b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0007.php index 1dd8fdcb2..3a2575e53 100644 --- a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0007.php +++ b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0007.php @@ -3,7 +3,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); /** - * Incoming shouldn't have austrian home address. + * Students with active Benutzer should have a status in the current semester. */ class CORE_STUDENTSTATUS_0007 implements IIssueResolvedChecker { @@ -14,10 +14,10 @@ class CORE_STUDENTSTATUS_0007 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/AktiverStudentOhneStatus'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getAktiverStudentOhneStatus(null, $params['prestudent_id']); + $checkRes = $this->_ci->aktiverstudentohnestatus->getAktiverStudentOhneStatus(null, $params['prestudent_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0008.php b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0008.php index 83357d9bf..53bfd72a6 100644 --- a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0008.php +++ b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0008.php @@ -3,7 +3,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); /** - * Incoming shouldn't have austrian home address. + * Studienplan should be valid in current Ausbildungssemester of prestudent. */ class CORE_STUDENTSTATUS_0008 implements IIssueResolvedChecker { @@ -17,10 +17,10 @@ class CORE_STUDENTSTATUS_0008 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/StudienplanUngueltig'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getStudienplanUngueltig($params['studiensemester_kurzbz'], null, $params['prestudent_id']); + $checkRes = $this->_ci->studienplanungueltig->getStudienplanUngueltig($params['studiensemester_kurzbz'], null, $params['prestudent_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0009.php b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0009.php index b1b5e9876..816b7e933 100644 --- a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0009.php +++ b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0009.php @@ -3,7 +3,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); /** - * Incoming shouldn't have austrian home address. + * Students with finished studies should have exactly one final exam. */ class CORE_STUDENTSTATUS_0009 implements IIssueResolvedChecker { @@ -14,10 +14,10 @@ class CORE_STUDENTSTATUS_0009 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/FalscheAnzahlAbschlusspruefungen'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getFalscheAnzahlAbschlusspruefungen(null, null, $params['prestudent_id']); + $checkRes = $this->_ci->falscheanzahlabschlusspruefungen->getFalscheAnzahlAbschlusspruefungen(null, null, $params['prestudent_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0010.php b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0010.php index 1e3a6849b..b31fb872a 100644 --- a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0010.php +++ b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0010.php @@ -3,7 +3,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); /** - * Incoming shouldn't have austrian home address. + * Date of final exam shouldn't be missing for Absolvent. */ class CORE_STUDENTSTATUS_0010 implements IIssueResolvedChecker { @@ -14,10 +14,10 @@ class CORE_STUDENTSTATUS_0010 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/DatumAbschlusspruefungFehlt'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getDatumAbschlusspruefungFehlt(null, null, $params['abschlusspruefung_id']); + $checkRes = $this->_ci->datumabschlusspruefungfehlt->getDatumAbschlusspruefungFehlt(null, null, $params['abschlusspruefung_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0011.php b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0011.php index 233240305..9dff0181e 100644 --- a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0011.php +++ b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0011.php @@ -3,7 +3,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); /** - * Incoming shouldn't have austrian home address. + * Date of sponsion shouldn't be missing for Absolvent. */ class CORE_STUDENTSTATUS_0011 implements IIssueResolvedChecker { @@ -14,10 +14,10 @@ class CORE_STUDENTSTATUS_0011 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/DatumSponsionFehlt'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getDatumSponsionFehlt(null, null, $params['abschlusspruefung_id']); + $checkRes = $this->_ci->datumsponsionfehlt->getDatumSponsionFehlt(null, null, $params['abschlusspruefung_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0012.php b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0012.php index 38832edc0..7fe5dbde4 100644 --- a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0012.php +++ b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0012.php @@ -3,7 +3,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); /** - * Incoming shouldn't have austrian home address. + * Bewerber should have participated in Reihungstest. */ class CORE_STUDENTSTATUS_0012 implements IIssueResolvedChecker { @@ -17,10 +17,14 @@ class CORE_STUDENTSTATUS_0012 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/BewerberNichtZumRtAngetreten'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getBewerberNichtZumRtAngetreten($params['studiensemester_kurzbz'], null, $params['prestudent_id']); + $checkRes = $this->_ci->bewerbernichtzumrtangetreten->getBewerberNichtZumRtAngetreten( + $params['studiensemester_kurzbz'], + null, + $params['prestudent_id'] + ); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0013.php b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0013.php index 78ad40a8e..86e8b75b1 100644 --- a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0013.php +++ b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0013.php @@ -3,7 +3,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); /** - * Incoming shouldn't have austrian home address. + * Current Ausbildungssemester shouldn't be 0. */ class CORE_STUDENTSTATUS_0013 implements IIssueResolvedChecker { @@ -17,10 +17,10 @@ class CORE_STUDENTSTATUS_0013 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/AktSemesterNull'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getAktSemesterNull($params['studiensemester_kurzbz'], null, $params['prestudent_id']); + $checkRes = $this->_ci->aktsemesternull->getAktSemesterNull($params['studiensemester_kurzbz'], null, $params['prestudent_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0014.php b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0014.php index 8d96b7c65..4b542cf0a 100644 --- a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0014.php +++ b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0014.php @@ -3,7 +3,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); /** - * Incoming shouldn't have austrian home address. + * Prestudent should have a final status. */ class CORE_STUDENTSTATUS_0014 implements IIssueResolvedChecker { @@ -14,10 +14,10 @@ class CORE_STUDENTSTATUS_0014 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/AbschlussstatusFehlt'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getAbschlussstatusFehlt(null, null, $params['prestudent_id']); + $checkRes = $this->_ci->abschlussstatusfehlt->getAbschlussstatusFehlt(null, null, $params['prestudent_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0015.php b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0015.php index aafee1124..37e42ec0a 100644 --- a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0015.php +++ b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0015.php @@ -17,10 +17,10 @@ class CORE_STUDENTSTATUS_0015 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/AktiverStudentstatusOhneKontobuchung'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getAktiverStudentstatusOhneKontobuchung( + $checkRes = $this->_ci->aktiverstudentstatusohnekontobuchung->getAktiverStudentstatusOhneKontobuchung( $params['studiensemester_kurzbz'], null, $params['prestudent_id'] diff --git a/application/models/system/Fehlerkonfiguration_model.php b/application/models/system/Fehlerkonfiguration_model.php new file mode 100644 index 000000000..bf8de4cde --- /dev/null +++ b/application/models/system/Fehlerkonfiguration_model.php @@ -0,0 +1,48 @@ +dbTable = 'system.tbl_fehler_konfiguration'; + $this->pk = array('konfigurationstyp_kurzbz', 'fehlercode'); + $this->hasSequence = false; + } + + /** + * Retrieve all set configuration parameters, optionally filtered by app. + * @param string $app + * @return object success or error + */ + public function getKonfiguration($app = null) + { + $fehlerkonfiguration = array(); + + $this->addSelect('fehlercode, konfigurationstyp_kurzbz, konfiguration, fehler_kurzbz'); + $this->addJoin('system.tbl_fehler_konfigurationstyp konftyp', 'konfigurationstyp_kurzbz'); + $this->addJoin('system.tbl_fehler fehler', 'fehlercode'); + $fehlerkonfigurationRes = isset($app) ? $this->loadWhere(array('fehler.app' => $app)) : $this->load(); + + if (isError($fehlerkonfigurationRes)) return $fehlerkonfigurationRes; + + if (hasData($fehlerkonfigurationRes)) + { + $fehlerkonfigurationData = getData($fehlerkonfigurationRes); + foreach ($fehlerkonfigurationData as $fk) + { + $konf = json_decode($fk->konfiguration); + if (is_array($konf)) + { + $fk->konfiguration = $konf; + $fehlerkonfiguration[] = $fk; + } + } + } + + return success($fehlerkonfiguration); + } +} diff --git a/application/models/system/Fehlerkonfigurationstyp_model.php b/application/models/system/Fehlerkonfigurationstyp_model.php new file mode 100644 index 000000000..dc1c7957f --- /dev/null +++ b/application/models/system/Fehlerkonfigurationstyp_model.php @@ -0,0 +1,47 @@ +dbTable = 'system.tbl_fehler_konfigurationstyp'; + $this->pk = array('konfigurationstyp_kurzbz'); + } + + /** + * Retrieve all set configuration parameters, optionally filtered by app. + * @param string $app + * @return object success or error + */ + public function getKonfiguration($app = null) + { + $fehlerkonfiguration = array(); + + $this->addSelect('fehlercode, konfigurationstyp_kurzbz, konfiguration, fehler_kurzbz'); + $this->addJoin('system.tbl_fehler_konfigurationstyp konftyp', 'konfigurationstyp_kurzbz'); + $this->addJoin('system.tbl_fehler fehler', 'fehlercode'); + $fehlerkonfigurationRes = isset($app) ? $this->loadWhere(array('fehler.app' => $app)) : $this->load(); + + if (isError($fehlerkonfigurationRes)) return $fehlerkonfigurationRes; + + if (hasData($fehlerkonfigurationRes)) + { + $fehlerkonfigurationData = getData($fehlerkonfigurationRes); + foreach ($fehlerkonfigurationData as $fk) + { + $konf = json_decode($fk->konfiguration); + if (is_array($konf)) + { + $fk->konfiguration = $konf; + $fehlerkonfiguration[] = $fk; + } + } + } + + return success($fehlerkonfiguration); + } +} diff --git a/application/views/system/issues/issuesData.php b/application/views/system/issues/issuesData.php index 50b7c1483..c60b03a74 100644 --- a/application/views/system/issues/issuesData.php +++ b/application/views/system/issues/issuesData.php @@ -6,7 +6,6 @@ $ALL_FUNKTIONEN_OE_KURZBZ = "('" . implode("','", array_keys($all_funktionen_oe_ // all oes for which logged user has issues permissions, including permissions for "special" issue funktion $ALL_OE_KURZBZ_BERECHTIGT = "('" . implode("','", $all_oe_kurzbz_berechtigt) . "')"; $RELEVANT_PRESTUDENT_STATUS = "('Aufgenommener', 'Student', 'Incoming', 'Diplomand', 'Abbrecher', 'Unterbrecher', 'Absolvent')"; -$LANGUAGE_INDEX = getUserLanguage() == 'German' ? '1' : '2'; // get issues for the oes of the logged user or for the persons (students, oe-zuordnung) of the oes $query = "WITH zustaendigkeiten AS ( @@ -34,73 +33,97 @@ $query = "WITH zustaendigkeiten AS ( FROM system.tbl_fehler_zustaendigkeiten zst )"; -$query .= "SELECT issue_id, fehlercode AS \"Fehlercode\", iss.fehlercode_extern AS \"Fehlercode extern\", datum AS \"Datum\", - inhalt AS \"Inhalt\", inhalt_extern AS \"Inhalt extern\", iss.person_id AS \"PersonId\", iss.oe_kurzbz AS \"OE\", - ftyp.bezeichnung_mehrsprachig[".$LANGUAGE_INDEX."] AS \"Fehlertyp\", stat.bezeichnung_mehrsprachig[".$LANGUAGE_INDEX."] AS \"Fehlerstatus\", - verarbeitetvon AS \"Verarbeitet von\",verarbeitetamum AS \"Verarbeitet am\", fr.app AS \"Applikation\", - fr.fehlertyp_kurzbz AS \"Fehlertypcode\", iss.status_kurzbz AS \"Statuscode\", - pers.vorname AS \"Vorname\", pers.nachname AS \"Nachname\", - ( - /* show all relevant Studiengänge of person and wether it is an employee*/ - SELECT STRING_AGG(studiengang || ' ' || last_status, ' | ') - || (CASE WHEN EXISTS ( - SELECT 1 FROM public.tbl_mitarbeiter ma - JOIN public.tbl_benutzer ben ON ma.mitarbeiter_uid = ben.uid - WHERE person_id = prestudents.person_id - AND ben.aktiv - ) THEN ' | Mitarbeiter' ELSE '' END) - FROM ( - SELECT DISTINCT person_id, prestudent_id, UPPER(stg.typ || stg.kurzbz) AS studiengang, get_rolle_prestudent(ps.prestudent_id, null) AS last_status - FROM public.tbl_prestudent ps - JOIN public.tbl_studiengang stg USING (studiengang_kz) - WHERE person_id = pers.person_id - ORDER BY prestudent_id DESC - ) prestudents - WHERE last_status IN ('Abgewiesener','Aufgenommener', 'Student', 'Incoming', 'Diplomand', 'Abbrecher', 'Unterbrecher', 'Absolvent') - GROUP BY person_id - LIMIT 1; - ) AS \"Zugehörigkeit\", - CASE - WHEN - EXISTS(SELECT 1 - FROM zustaendigkeiten - WHERE fehlercode = iss.fehlercode - AND zustaendig = TRUE) /* If Zuständigkeit is defined for the oe/person, zustaendig. */ - THEN 'Ja' - WHEN - EXISTS(SELECT 1 - FROM zustaendigkeiten - WHERE fehlercode = iss.fehlercode - AND zustaendig = FALSE) /* If Zuständigkeit is defined for different oe/person, not zustaendig. */ - THEN 'Nein' - ELSE 'Ja' /* If no Zuständigkeit defined, zustaendig by default. */ - END AS \"Hauptzuständig\", - ( - SELECT string_agg(vorname || ' ' || nachname, ' | ' ORDER BY vorname, nachname) - FROM system.tbl_fehler_zustaendigkeiten - JOIN public.tbl_person USING (person_id) - WHERE fehlercode = fr.fehlercode - GROUP BY fehlercode - ) AS \"Person Zuständigkeiten\", - ( - SELECT string_agg(organisationseinheittyp_kurzbz || ' ' || oe.bezeichnung || COALESCE(' - ' || fu.beschreibung, ''), ' | ' ORDER BY bezeichnung, oe_kurzbz) - FROM system.tbl_fehler_zustaendigkeiten - LEFT JOIN public.tbl_organisationseinheit oe USING (oe_kurzbz) - LEFT JOIN public.tbl_funktion fu USING (funktion_kurzbz) - WHERE fehlercode = fr.fehlercode - GROUP BY fehlercode - ) AS \"Organisationseinheit Zuständigkeiten\", - pers.bpk AS \"BPK\", - pers.matr_nr AS \"Matrikelnummer\" - FROM system.tbl_issue iss - JOIN system.tbl_fehler fr USING (fehlercode) - JOIN system.tbl_fehlertyp ftyp USING (fehlertyp_kurzbz) - JOIN system.tbl_issue_status stat USING (status_kurzbz) - LEFT JOIN public.tbl_person pers ON iss.person_id = pers.person_id - WHERE EXISTS ( /* if oe or person is specified in fehler_zustaendigkeiten */ - SELECT 1 FROM zustaendigkeiten - WHERE fehlercode = iss.fehlercode - AND zustaendig = TRUE)"; +$query .= " + SELECT + issue_id, fehlercode AS \"Fehlercode\", fehler_kurzbz AS \"Fehler Kurzbezeichnung\", iss.fehlercode_extern AS \"Fehlercode extern\", datum AS \"Datum\", + inhalt AS \"Inhalt\", inhalt_extern AS \"Inhalt extern\", iss.person_id AS \"PersonId\", iss.oe_kurzbz AS \"OE\", + ftyp.bezeichnung_mehrsprachig[".$language_index."] AS \"Fehlertyp\", + stat.bezeichnung_mehrsprachig[".$language_index."] AS \"Fehlerstatus\", + verarbeitetvon AS \"Verarbeitet von\",verarbeitetamum AS \"Verarbeitet am\", fr.app AS \"Applikation\", + fr.fehlertyp_kurzbz AS \"Fehlertypcode\", iss.status_kurzbz AS \"Statuscode\", + pers.vorname AS \"Vorname\", pers.nachname AS \"Nachname\", + ( + /* show all relevant Studiengänge of person and wether it is an employee*/ + SELECT + STRING_AGG(studiengang || ' ' || last_status, ' | ') + || (CASE WHEN EXISTS ( + SELECT 1 FROM public.tbl_mitarbeiter ma + JOIN public.tbl_benutzer ben ON ma.mitarbeiter_uid = ben.uid + WHERE person_id = prestudents.person_id + AND ben.aktiv + ) THEN ' | Mitarbeiter' ELSE '' END) + FROM ( + SELECT + DISTINCT person_id, prestudent_id, UPPER(stg.typ || stg.kurzbz) AS studiengang, + get_rolle_prestudent(ps.prestudent_id, null) AS last_status + FROM + public.tbl_prestudent ps + JOIN public.tbl_studiengang stg USING (studiengang_kz) + WHERE + person_id = pers.person_id + ORDER BY + prestudent_id DESC + ) prestudents + WHERE + last_status IN ('Abgewiesener','Aufgenommener', 'Student', 'Incoming', 'Diplomand', 'Abbrecher', 'Unterbrecher', 'Absolvent') + GROUP BY + person_id + LIMIT 1; + ) AS \"Zugehörigkeit\", + CASE + WHEN + EXISTS(SELECT 1 + FROM zustaendigkeiten + WHERE fehlercode = iss.fehlercode + AND zustaendig = TRUE) /* If Zuständigkeit is defined for the oe/person, zustaendig. */ + THEN 'Ja' + WHEN + EXISTS(SELECT 1 + FROM zustaendigkeiten + WHERE fehlercode = iss.fehlercode + AND zustaendig = FALSE) /* If Zuständigkeit is defined for different oe/person, not zustaendig. */ + THEN 'Nein' + ELSE 'Ja' /* If no Zuständigkeit defined, zustaendig by default. */ + END AS \"Hauptzuständig\", + ( + SELECT + string_agg(vorname || ' ' || nachname, ' | ' ORDER BY vorname, nachname) + FROM + system.tbl_fehler_zustaendigkeiten + JOIN public.tbl_person USING (person_id) + WHERE + fehlercode = fr.fehlercode + GROUP BY + fehlercode + ) AS \"Person Zuständigkeiten\", + ( + SELECT + string_agg(organisationseinheittyp_kurzbz || ' ' || oe.bezeichnung || + COALESCE(' - ' || fu.beschreibung, ''), ' | ' ORDER BY bezeichnung, oe_kurzbz) + FROM + system.tbl_fehler_zustaendigkeiten + LEFT JOIN public.tbl_organisationseinheit oe USING (oe_kurzbz) + LEFT JOIN public.tbl_funktion fu USING (funktion_kurzbz) + WHERE + fehlercode = fr.fehlercode + GROUP BY + fehlercode + ) AS \"Organisationseinheit Zuständigkeiten\", + pers.bpk AS \"BPK\", + pers.matr_nr AS \"Matrikelnummer\" + FROM + system.tbl_issue iss + JOIN system.tbl_fehler fr USING (fehlercode) + JOIN system.tbl_fehlertyp ftyp USING (fehlertyp_kurzbz) + JOIN system.tbl_issue_status stat USING (status_kurzbz) + LEFT JOIN public.tbl_person pers ON iss.person_id = pers.person_id + WHERE + fr.app IN ('core', 'dvuh') + AND ( + EXISTS ( /* if oe or person is specified in fehler_zustaendigkeiten */ + SELECT 1 FROM zustaendigkeiten + WHERE fehlercode = iss.fehlercode + AND zustaendig = TRUE)"; // show issue if it is assigend to oe of logged in user or to student of oe of logged in user if (!isEmptyArray($all_oe_kurzbz_berechtigt)) @@ -131,6 +154,7 @@ if (!isEmptyArray($all_oe_kurzbz_berechtigt)) ) )"; } +$query .= ") "; $query .= " ORDER BY CASE @@ -146,17 +170,18 @@ $query .= " ORDER BY datum DESC, fehlercode, issue_id DESC"; $filterWidgetArray = array( - 'query' => $query, + 'query' => $query, 'app' => 'core', 'datasetName' => 'issues', 'filter_id' => $this->input->get('filter_id'), - 'tableUniqueId' => 'issues', - 'requiredPermissions' => 'system/issues_verwalten', - 'datasetRepresentation' => 'tablesorter', + 'tableUniqueId' => 'issues', + 'requiredPermissions' => 'system/issues_verwalten', + 'datasetRepresentation' => 'tablesorter', 'checkboxes' => 'issue_id', - 'columnsAliases' => array( - 'ID', + 'columnsAliases' => array( + 'ID', ucfirst($this->p->t('fehlermonitoring', 'fehlercode')), + ucfirst($this->p->t('fehlermonitoring', 'fehlerkurzbz')), ucfirst($this->p->t('fehlermonitoring', 'fehlercodeExtern')), ucfirst($this->p->t('global', 'datum')), ucfirst($this->p->t('fehlermonitoring', 'inhalt')), @@ -176,10 +201,15 @@ $filterWidgetArray = array( ucfirst($this->p->t('fehlermonitoring', 'hauptzustaendig')), ucfirst($this->p->t('fehlermonitoring', 'zustaendigePersonen')), ucfirst($this->p->t('fehlermonitoring', 'zustaendigeOrganisationseinheiten')), - 'BPK', - 'Matrikelnummer' - ), - 'formatRow' => function($datasetRaw) { + 'BPK', + 'Matrikelnummer' + ), + 'formatRow' => function ($datasetRaw) { + + if ($datasetRaw->{'Fehler Kurzbezeichnung'} == null) + { + $datasetRaw->{'Fehler Kurzbezeichnung'} = '-'; + } if ($datasetRaw->{'Fehlercode extern'} == null) { @@ -238,7 +268,7 @@ $filterWidgetArray = array( return $datasetRaw; }, - 'markRow' => function($datasetRaw) { + 'markRow' => function ($datasetRaw) { $mark = ''; diff --git a/application/views/system/issues/issuesKonfiguration.php b/application/views/system/issues/issuesKonfiguration.php new file mode 100644 index 000000000..dbd62a26a --- /dev/null +++ b/application/views/system/issues/issuesKonfiguration.php @@ -0,0 +1,200 @@ +load->view( + 'templates/FHC-Header', + array( + 'title' => 'Fehler Konfiguration', + 'jquery3' => true, + 'jqueryui1' => true, + 'jquerycheckboxes1' => true, + 'bootstrap3' => true, + 'fontawesome4' => true, + 'sbadmintemplate3' => true, + 'tablesorter2' => true, + 'ajaxlib' => true, + 'filterwidget' => true, + 'navigationwidget' => true, + 'dialoglib' => true, + 'phrases' => array( + 'ui', + 'fehlermonitoring' + ), + 'customCSSs' => array('public/css/issues/issuesKonfiguration.css', 'public/css/sbadmin2/tablesort_bootstrap.css'), + 'customJSs' => array('public/js/issues/issuesKonfiguration.js', 'public/js/bootstrapper.js') + ) +); +?> + + +
+ + widgetlib->widget('NavigationWidget'); ?> + +
+
+
+
+ +
+
+
+
+
+ + + + +
+ + +
+
+
+
+
+ + + + + +
+ + + + + + + +
+
+
+
+
+
+
+ +
+ + +
+
+
+
+
+
+ load->view('system/issues/issuesKonfigurationData.php'); ?> +
+ + +
+
+ +
+ + +load->view('templates/FHC-Footer'); ?> diff --git a/application/views/system/issues/issuesKonfigurationData.php b/application/views/system/issues/issuesKonfigurationData.php new file mode 100644 index 000000000..a83dc73ce --- /dev/null +++ b/application/views/system/issues/issuesKonfigurationData.php @@ -0,0 +1,56 @@ + $query, + 'app' => 'core', + 'datasetName' => 'fehlerKonfiguration', + 'filter_id' => $this->input->get('filter_id'), + 'tableUniqueId' => 'issuesKonfiguration', + 'requiredPermissions' => 'admin', + 'datasetRepresentation' => 'tablesorter', + 'additionalColumns' => array('Delete'), + 'columnsAliases' => array( + ucfirst($this->p->t('fehlermonitoring', 'konfigurationstyp')), + ucfirst($this->p->t('fehlermonitoring', 'fehlercode')), + ucfirst($this->p->t('fehlermonitoring', 'fehlerkurzbz')), + ucfirst($this->p->t('fehlermonitoring', 'konfigurationswert')), + 'Application', + ucfirst($this->p->t('fehlermonitoring', 'konfigurationsbeschreibung')), + ucfirst($this->p->t('fehlermonitoring', 'konfigurationsdatentyp')), + ucfirst($this->p->t('fehlermonitoring', 'fehlertext')), + ), + 'formatRow' => function($datasetRaw) { + + $datasetRaw->{'Delete'} = + ""; + + if ($datasetRaw->{'konfigurationsbeschreibung'} == null) + { + $datasetRaw->{'konfigurationsbeschreibung'} = '-'; + } + + if ($datasetRaw->{'fehlertext'} == null) + { + $datasetRaw->{'fehlertext'} = '-'; + } + + return $datasetRaw; + } +); + +echo $this->widgetlib->widget('FilterWidget', $filterWidgetArray); diff --git a/application/views/system/issues/plausichecks.php b/application/views/system/issues/plausichecks.php index 4016e64cd..45c272ff4 100644 --- a/application/views/system/issues/plausichecks.php +++ b/application/views/system/issues/plausichecks.php @@ -71,9 +71,9 @@ $this->load->view( diff --git a/application/views/templates/FHC-Footer.php b/application/views/templates/FHC-Footer.php index 0c3782fea..c461dd8b0 100644 --- a/application/views/templates/FHC-Footer.php +++ b/application/views/templates/FHC-Footer.php @@ -60,7 +60,7 @@ if ($bootstrap3 === true) generateJSsInclude('vendor/twbs/bootstrap3/dist/js/bootstrap.min.js'); // Bootstrap 5 JS - if ($bootstrap5 === true) generateJSsInclude('vendor/twbs/bootstrap5/dist/js/bootstrap.min.js'); + if ($bootstrap5 === true) generateJSsInclude('vendor/twbs/bootstrap5/dist/js/bootstrap.bundle.min.js'); // Moment JS if ($momentjs2 === true) diff --git a/cis/private/lehre/abgabe_lektor_details.php b/cis/private/lehre/abgabe_lektor_details.php index 142af5527..a8705e7f9 100644 --- a/cis/private/lehre/abgabe_lektor_details.php +++ b/cis/private/lehre/abgabe_lektor_details.php @@ -710,6 +710,10 @@ while ($row=@$db->db_fetch_object($result)) $signaturVorhanden = true; // The document is signed } + elseif (isset($signList->code) && $signList->code == 1) + { + $uploadedDocumentSigned = $p->t('abgabetool/uploaddDocumentToBigForSignature'); + } elseif ($signList === null) { $uploadedDocumentSigned = 'WARNING: signature server error'; diff --git a/cis/private/lehre/lvincoming.php b/cis/private/lehre/lvincoming.php deleted file mode 100644 index f81292aab..000000000 --- a/cis/private/lehre/lvincoming.php +++ /dev/null @@ -1,146 +0,0 @@ - - * Andreas Oesterreicher < andreas.oesterreicher@technikum-wien.at > - * Rudolf Hangl < rudolf.hangl@technikum-wien.at > - */ -require_once('../../../config/cis.config.inc.php'); -require_once('../../../include/studiensemester.class.php'); -require_once('../../../include/studiengang.class.php'); - -$db = new basis_db(); - -$stsem = new studiensemester(); -$stsem->getNextStudiensemester(); - -$stg = new studiengang(); -$stg->getAll(); -?> - - - - - - - - Lehrveranstaltungen - Übersicht - - - - -   - - - - - - - - - - - -
-  Lehrveranstaltungen - Übersicht ('.$stsem->studiensemester_kurzbz.') -
 
- '; - - $qry = "SELECT - tbl_lehrveranstaltung.lehrveranstaltung_id, tbl_lehrveranstaltung.studiengang_kz, - tbl_lehrveranstaltung.bezeichnung, tbl_lehrveranstaltung.semester, - tbl_lehrveranstaltung.bezeichnung_english, tbl_lehrveranstaltung.incoming, - tbl_lehrveranstaltung.sprache, - ( - SELECT - count(*) - FROM - campus.vw_student_lehrveranstaltung - JOIN public.tbl_student ON(uid=student_uid) - JOIN public.tbl_prestudentstatus USING(prestudent_id) - WHERE - lehrveranstaltung_id=tbl_lehrveranstaltung.lehrveranstaltung_id AND - lehreinheit_id in (SELECT lehreinheit_id FROM lehre.tbl_lehreinheit - WHERE lehrveranstaltung_id=tbl_lehrveranstaltung.lehrveranstaltung_id - AND tbl_lehreinheit.studiensemester_kurzbz='$stsem->studiensemester_kurzbz') - AND tbl_prestudentstatus.status_kurzbz='Incoming' - AND tbl_prestudentstatus.status_kurzbz='$stsem->studiensemester_kurzbz' - GROUP BY uid - ) as anzahlincoming - FROM - lehre.tbl_lehrveranstaltung JOIN public.tbl_studiengang USING(studiengang_kz) - WHERE - tbl_lehrveranstaltung.incoming>0 AND - tbl_lehrveranstaltung.aktiv AND - tbl_lehrveranstaltung.lehre - AND tbl_lehrveranstaltung.studiengang_kz>0 AND tbl_lehrveranstaltung.studiengang_kz<10000 - AND tbl_studiengang.aktiv - "; - - echo ' - - - - - - - - - - - - - - '; - if($result = $db->db_query($qry)) - { - $i=0; - while($row = $db->db_fetch_object($result)) - { - $freieplaetze = $row->incoming - $row->anzahlincoming; - if($freieplaetze<0) - $freieplaetze=0; - - $i++; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - } - } - echo '
IDStudiengangSemesterSpracheLehrveranstaltungLehrveranstaltung EnglischLV-InfoPlätze gesamtFreie Plätze
',$row->lehrveranstaltung_id,'',$stg->kuerzel_arr[$row->studiengang_kz],'',$row->semester,'',$row->sprache,'',$row->bezeichnung,'',$row->bezeichnung_english,' - Deutsch  - Englisch - ',$row->incoming,'',$freieplaetze,'
'; -?> -
- - - - - - diff --git a/cis/private/lvplan/raumsuche.php b/cis/private/lvplan/raumsuche.php index 0cb9677d4..7be028be8 100644 --- a/cis/private/lvplan/raumsuche.php +++ b/cis/private/lvplan/raumsuche.php @@ -47,11 +47,11 @@ echo ' - - - - - + + + + + '; diff --git a/include/functions.inc.php b/include/functions.inc.php index 7b3560dde..e0787a0d4 100644 --- a/include/functions.inc.php +++ b/include/functions.inc.php @@ -1196,4 +1196,19 @@ function anzahlTage($date1, $date2) $diff = $date2_ts - $date1_ts; return round($diff / 86400); } + +/** + * Gibt zurück, ob ein String ausschließlich erlaubte Zeichen enthält + * erlaubt: Buchstaben a-z, A-Z, 0-9, -, _ + * @param string $stringToCheck Eingabestring + * @return boolena true or false + */ +function hasOnlyAllowedChars($stringToCheck) +{ + if (!preg_match("#^[a-zA-Z0-9_-]+$#", $stringToCheck)) + return false; + else + return true; +} + ?> diff --git a/include/lehrstunde.class.php b/include/lehrstunde.class.php index 280e626a8..a0f52d799 100644 --- a/include/lehrstunde.class.php +++ b/include/lehrstunde.class.php @@ -41,6 +41,7 @@ class lehrstunde extends basis_db public $unr; // @brief Unterrichtsnummer public $lektor_uid; // @brief UID des Lektors public $lektor_kurzbz; // @brief Kurzbezeichnung des Lektors + public $mitarbeiter_kurzbz; // @brief Kurzbezeichnung public $datum; // @brief Datum public $stunde; // @brief Unterrichts-Stunde des Tages public $ort_kurzbz; // @brief Ort in dem der Unterricht stattfindet @@ -116,6 +117,7 @@ class lehrstunde extends basis_db $this->unr=$row->unr; $this->lektor_uid=$row->uid; $this->lektor_kurzbz=$row->lektor; + $this->mitarbeiter_kurzbz=$row->mitarbeiter_kurzbz; $this->datum=$row->datum; $this->stunde=$row->stunde; $this->ort_kurzbz=$row->ort_kurzbz; @@ -590,6 +592,7 @@ class lehrstunde extends basis_db $stunde->unr=$row->unr; $stunde->lektor_uid=$row->uid; $stunde->lektor_kurzbz=$row->lektor; + $stunde->mitarbeiter_kurzbz=$row->mitarbeiter_kurzbz; $stunde->datum=$row->datum; $stunde->stunde=$row->stunde; $stunde->ort_kurzbz=$row->ort_kurzbz; @@ -663,6 +666,7 @@ class lehrstunde extends basis_db $stunde->updateamum=$row->insertamum; $stunde->updatevon=$row->insertvon; $stunde->farbe=''; + $stunde->mitarbeiter_kurzbz = $row->mitarbeiter_kurzbz; $this->lehrstunden[]=$stunde; } } diff --git a/include/prestudent.class.php b/include/prestudent.class.php index 3bd7cd733..13f3e5e00 100644 --- a/include/prestudent.class.php +++ b/include/prestudent.class.php @@ -834,6 +834,42 @@ class prestudent extends person case "statusbestaetigt": $qry.=" AND a.rolle='Interessent' AND bestaetigtam is not null"; break; + case "statusbestaetigtrtnichtangemeldet": + $qry.=" AND a.rolle='Interessent' AND bestaetigtam is not null + AND NOT EXISTS ( + SELECT + 1 + FROM + public.tbl_rt_person + JOIN public.tbl_reihungstest ON (rt_id = reihungstest_id) + WHERE + person_id=a.person_id + AND studienplan_id IN ( + SELECT studienplan_id FROM lehre.tbl_studienplan + JOIN lehre.tbl_studienordnung USING(studienordnung_id) + WHERE tbl_studienordnung.studiengang_kz=a.studiengang_kz + ) + AND tbl_reihungstest.studiensemester_kurzbz=".$this->db_add_param($studiensemester_kurzbz)." + )"; + break; + case "statusbestaetigtrtangemeldet": + $qry.=" AND a.rolle='Interessent' AND bestaetigtam is not null + AND EXISTS ( + SELECT + 1 + FROM + public.tbl_rt_person + JOIN public.tbl_reihungstest ON (rt_id = reihungstest_id) + WHERE + person_id=a.person_id + AND studienplan_id IN ( + SELECT studienplan_id FROM lehre.tbl_studienplan + JOIN lehre.tbl_studienordnung USING(studienordnung_id) + WHERE tbl_studienordnung.studiengang_kz=a.studiengang_kz + ) + AND tbl_reihungstest.studiensemester_kurzbz=".$this->db_add_param($studiensemester_kurzbz)." + )"; + break; case "zgv": $stg_obj = new studiengang(); $stg_obj->load($studiengang_kz); diff --git a/include/raumtyp.class.php b/include/raumtyp.class.php index 7cbe7a20a..7f4579d26 100644 --- a/include/raumtyp.class.php +++ b/include/raumtyp.class.php @@ -33,6 +33,7 @@ class raumtyp extends basis_db //Tabellenspalten public $beschreibung; // string public $raumtyp_kurzbz; // string + public $aktiv; //boolean /** @@ -42,7 +43,7 @@ class raumtyp extends basis_db public function __construct($raumtyp_kurzbz=null) { parent::__construct(); - + if($raumtyp_kurzbz != null) $this->load($raumtyp_kurzbz); } @@ -51,10 +52,14 @@ class raumtyp extends basis_db * Laedt alle verfuegbaren Raumtypen * @return true wenn ok, false im Fehlerfall */ - public function getAll() + public function getAll($aktiv = null) { - $qry = 'SELECT * FROM public.tbl_raumtyp ORDER BY raumtyp_kurzbz;'; + $qry = 'SELECT * FROM public.tbl_raumtyp'; + if (!is_null($aktiv)) + $qry .= ' WHERE aktiv = '.$this->db_add_param($aktiv, FHC_BOOLEAN); + + $qry .= ' ORDER BY raumtyp_kurzbz'; if(!$this->db_query($qry)) { $this->errormsg = 'Fehler beim Laden der Datensaetze'; @@ -67,7 +72,7 @@ class raumtyp extends basis_db $raumtyp_obj->beschreibung = $row->beschreibung; $raumtyp_obj->raumtyp_kurzbz = $row->raumtyp_kurzbz; - + $raumtyp_obj->aktiv = $this->db_parse_bool($row->aktiv); $this->result[] = $raumtyp_obj; } @@ -99,7 +104,7 @@ class raumtyp extends basis_db { $this->beschreibung = $row->beschreibung; $this->raumtyp_kurzbz = $row->kurzbz; - + $this->aktiv = $this->db_parse_bool($row->aktiv); } else { @@ -135,7 +140,7 @@ class raumtyp extends basis_db $this->errormsg = ''; return true; } - + /** * Speichert den aktuellen Datensatz * @return true wenn ok, false im Fehlerfall @@ -154,6 +159,7 @@ class raumtyp extends basis_db $this->errormsg = 'Keine gültige ID'; return false; } + //Neuen Datensatz anlegen $qry = 'INSERT INTO public.tbl_raumtyp (beschreibung, raumtyp_kurzbz) VALUES ('. $this->db_add_param($this->beschreibung).', '. diff --git a/include/tw/cis_menu_lv.inc.php b/include/tw/cis_menu_lv.inc.php index 4b3005c07..16abdc48a 100644 --- a/include/tw/cis_menu_lv.inc.php +++ b/include/tw/cis_menu_lv.inc.php @@ -68,29 +68,8 @@ function checkZeilenUmbruch() if(!defined('CIS_LEHRVERANSTALTUNG_LVINFO_ANZEIGEN') || CIS_LEHRVERANSTALTUNG_LVINFO_ANZEIGEN) { $text=''; - - $qry = "SELECT * FROM campus.tbl_lvinfo WHERE lehrveranstaltung_id=".$db->db_add_param($lvid, FHC_INTEGER)." AND genehmigt=true AND sprache='".ATTR_SPRACHE_DE."' AND aktiv=true"; $need_br=false; - if($result=$db->db_query($qry)) - { - if($db->db_num_rows($result)>0) - { - $text.= "".$p->t('global/deutsch')." "; - $need_br=true; - } - } - $qry = "SELECT * FROM campus.tbl_lvinfo WHERE lehrveranstaltung_id=".$db->db_add_param($lvid, FHC_INTEGER)." AND genehmigt=true AND sprache='".ATTR_SPRACHE_EN."' AND aktiv=true"; - if($result=$db->db_query($qry)) - { - if($db->db_num_rows($result)>0) - { - $row1=$db->db_fetch_object($result); - $text.= "".$p->t('global/englisch').""; - $need_br=true; - } - } - // Bearbeiten Button anzeigen wenn Lektor der LV und bearbeiten fuer Lektoren aktiviert ist // Oder Berechtigung zum Bearbeiten eingetragen ist if((!defined('CIS_LEHRVERANSTALTUNG_LVINFO_LEKTOR_EDIT') && $lektor_der_lv) diff --git a/include/tw/vilesci_menu_main.inc.php b/include/tw/vilesci_menu_main.inc.php index 204feeec3..834183c2c 100644 --- a/include/tw/vilesci_menu_main.inc.php +++ b/include/tw/vilesci_menu_main.inc.php @@ -53,7 +53,7 @@ $menu=array ( 'name'=>'Mitarbeiter','permissions'=>array('admin','lv-plan','support'), 'Übersicht'=>array('name'=>'Zeitwünsche', 'link'=>'personen/lektor_uebersicht.php', 'target'=>'main','permissions'=>array('mitarbeiter')), - 'Zeitsperren'=>array('name'=>'Zeitsperren', 'link'=>'personen/urlaubsverwaltung.php', 'target'=>'main','permissions'=>array('mitarbeiter/zeitsperre')), + 'Zeitsperren'=>array('name'=>'Zeitsperren', 'link'=>'personen/urlaubsverwaltung.php', 'target'=>'main','permissions'=>array('mitarbeiter/zeitsperre:begrenzt')), ), 'Vorrueckung'=> array @@ -119,7 +119,7 @@ $menu=array ( 'name'=>'Mitarbeiter','permissions'=>array('admin','mitarbeiter','support'), 'Übersicht'=>array('name'=>'Übersicht', 'link'=>'personen/lektor_uebersicht.php', 'target'=>'main'), - 'Zeitsperren'=>array('name'=>'Zeitsperren/Urlaub', 'link'=>'personen/urlaubsverwaltung.php', 'target'=>'main','permissions'=>array('mitarbeiter/zeitsperre')), + 'Zeitsperren'=>array('name'=>'Zeitsperren/Urlaub', 'link'=>'personen/urlaubsverwaltung.php', 'target'=>'main','permissions'=>array('mitarbeiter/zeitsperre:begrenzt')), ), 'Betriebsmittel'=>array('name'=>'Betriebsmittel', 'link'=>'stammdaten/betriebsmittel_frameset.php', 'target'=>'main','permissions'=>array('basis/betriebsmittel')), 'AnwesenheitslistenBarcode'=>array('name'=>'Anwesenheitslisten mit Barcodes', 'link'=>'personen/anwesenheitslisten_barcode.php', 'target'=>'main','permissions'=>array('basis/person')), diff --git a/include/wochenplan.class.php b/include/wochenplan.class.php index f6cc94c3c..34fbadc63 100644 --- a/include/wochenplan.class.php +++ b/include/wochenplan.class.php @@ -445,6 +445,7 @@ class wochenplan extends basis_db $this->std_plan[$tag][$stunde][$idx]->stundenplan_id=$this->wochenplan->lehrstunden[$i]->stundenplan_id; $this->std_plan[$tag][$stunde][$idx]->lektor_uid=$this->wochenplan->lehrstunden[$i]->lektor_uid; $this->std_plan[$tag][$stunde][$idx]->lektor=$this->wochenplan->lehrstunden[$i]->lektor_kurzbz; + $this->std_plan[$tag][$stunde][$idx]->mitarbeiter_kurzbz=$this->wochenplan->lehrstunden[$i]->mitarbeiter_kurzbz; $this->std_plan[$tag][$stunde][$idx]->ort=$this->wochenplan->lehrstunden[$i]->ort_kurzbz; $this->std_plan[$tag][$stunde][$idx]->stg=$this->wochenplan->lehrstunden[$i]->studiengang; $this->std_plan[$tag][$stunde][$idx]->stg_kz=$this->wochenplan->lehrstunden[$i]->studiengang_kz; @@ -736,7 +737,10 @@ class wochenplan extends basis_db { $unr[]=$lehrstunde->unr; // Lektoren - $lektor[]=$lehrstunde->lektor; + if ($lehrstunde->mitarbeiter_kurzbz === null) + $lektor[] = $lehrstunde->lektor; + else + $lektor[]=$lehrstunde->mitarbeiter_kurzbz; // Lehrverband $typ=''; if ($lehrstunde->reservierung) @@ -1450,7 +1454,10 @@ class wochenplan extends basis_db if ($lehrstunde->unr==$unr) { // Lektoren - $lektor[]=$lehrstunde->lektor; + if ($lehrstunde->mitarbeiter_kurzbz === null) + $lektor[] = $lehrstunde->lektor; + else + $lektor[]=$lehrstunde->mitarbeiter_kurzbz; // Lehrverband $lvb=$lehrstunde->stg.'-'.$lehrstunde->sem; if ($lehrstunde->ver!=null && $lehrstunde->ver!='0' && $lehrstunde->ver!='') @@ -2364,7 +2371,10 @@ class wochenplan extends basis_db $unr[]=$lehrstunde->unr; // Lektoren - $lektor[]=$lehrstunde->lektor; + if ($lehrstunde->mitarbeiter_kurzbz === null) + $lektor[] = $lehrstunde->lektor; + else + $lektor[]=$lehrstunde->mitarbeiter_kurzbz; $lektor_uids[]=$lehrstunde->lektor_uid; // Lehrverband $lvb=$lehrstunde->stg.'-'.$lehrstunde->sem; @@ -2516,6 +2526,7 @@ class wochenplan extends basis_db if (!mb_strstr($this->std_plan[$i][$j][$idx1]->lektor,$this->std_plan[$i][$j][$idx]->lektor)) { $this->std_plan[$i][$j][$idx]->lektor.=' / '.$this->std_plan[$i][$j][$idx1]->lektor; + $this->std_plan[$i][$j][$idx]->mitarbeiter_kurzbz.=' / '.$this->std_plan[$i][$j][$idx1]->mitarbeiter_kurzbz; } //Ort @@ -2549,7 +2560,7 @@ class wochenplan extends basis_db //"Betreff","Beginnt am","Beginnt um","Endet am","Endet um","Ganztaegiges Ereignis","Erinnerung Ein/Aus","Erinnerung am","Erinnerung um","Besprechungsplanung","Erforderliche Teilnehmer","Optionale Teilnehmer","Besprechungsressourcen","Abrechnungsinformationen","Beschreibung", //"Kategorien","Ort","Prioritaet","Privat","Reisekilometer","Vertraulichkeit","Zeitspanne zeigen als" echo $this->crlf.'"'.$this->std_plan[$i][$j][$idx]->lehrfach.(isset($this->std_plan[$i][$j][$idx]->lehrform) && $this->std_plan[$i][$j][$idx]->lehrform!=''?'-'.$this->std_plan[$i][$j][$idx]->lehrform:'').($lvb!=''?' - '.$lvb:'').'","'.$start_date.'","'.$start_time.'","'.$end_date.'","'.$end_time.'","Aus","Aus",,,,,,,,"Stundenplan'; - echo $this->crlf.$this->std_plan[$i][$j][$idx]->lehrfach.$this->crlf.$this->std_plan[$i][$j][$idx]->lektor.$this->crlf.$lvb.$this->crlf.$this->std_plan[$i][$j][$idx]->ort.(LVPLAN_ANMERKUNG_ANZEIGEN?$this->crlf.$this->std_plan[$i][$j][$idx]->anmerkung:'').'","StundenplanFH","'.$this->std_plan[$i][$j][$idx]->ort.'","Normal","Aus",,"Normal","2"'; + echo $this->crlf.$this->std_plan[$i][$j][$idx]->lehrfach.$this->crlf.(($this->std_plan[$i][$j][$idx]->mitarbeiter_kurzbz === null) ? $this->std_plan[$i][$j][$idx]->lektor : $this->std_plan[$i][$j][$idx]->mitarbeiter_kurzbz).$this->crlf.$lvb.$this->crlf.$this->std_plan[$i][$j][$idx]->ort.(LVPLAN_ANMERKUNG_ANZEIGEN?$this->crlf.$this->std_plan[$i][$j][$idx]->anmerkung:'').'","StundenplanFH","'.$this->std_plan[$i][$j][$idx]->ort.'","Normal","Aus",,"Normal","2"'; } elseif ($target=='ical') { @@ -2564,9 +2575,9 @@ class wochenplan extends basis_db $end_date_time_ical = $eda[2].$eda[1].$eda[0].'T'.sprintf('%02s',($eta[0])).$eta[1].$eta[2]; //neu gruppieren der Startzeit und des Startdatums echo $this->crlf.'BEGIN:VEVENT'.$this->crlf - .'UID:'.'FH'.str_replace(',',' ',$lvb.$this->std_plan[$i][$j][$idx]->ort.$this->std_plan[$i][$j][$idx]->lektor.$lehrfach[$idx].$start_date_time_ical.$end_date_time_ical.$this->crlf) + .'UID:'.'FH'.str_replace(',',' ',$lvb.$this->std_plan[$i][$j][$idx]->ort.(($this->std_plan[$i][$j][$idx]->mitarbeiter_kurzbz === null) ? $this->std_plan[$i][$j][$idx]->lektor : $this->std_plan[$i][$j][$idx]->mitarbeiter_kurzbz).$lehrfach[$idx].$start_date_time_ical.$end_date_time_ical.$this->crlf) .'SUMMARY:'.str_replace(',',' ',$lehrfach[$idx].' '.$this->std_plan[$i][$j][$idx]->ort.' - '.$lvb.$this->crlf) - .'DESCRIPTION:'.str_replace(',',' ',$lehrfach[$idx].'\n'.$this->std_plan[$i][$j][$idx]->lektor.'\n'.$lvb.'\n'.$this->std_plan[$i][$j][$idx]->ort.(LVPLAN_ANMERKUNG_ANZEIGEN?'\n'.$this->std_plan[$i][$j][$idx]->anmerkung:'').$this->crlf) + .'DESCRIPTION:'.str_replace(',',' ',$lehrfach[$idx].'\n'.(($this->std_plan[$i][$j][$idx]->mitarbeiter_kurzbz === null) ? $this->std_plan[$i][$j][$idx]->lektor : $this->std_plan[$i][$j][$idx]->mitarbeiter_kurzbz).'\n'.$lvb.'\n'.$this->std_plan[$i][$j][$idx]->ort.(LVPLAN_ANMERKUNG_ANZEIGEN?'\n'.$this->std_plan[$i][$j][$idx]->anmerkung:'').$this->crlf) .'LOCATION:'.$this->std_plan[$i][$j][$idx]->ort.$this->crlf .'CATEGORIES:'.$lvplan_kategorie.$this->crlf .'DTSTART;TZID=Europe/Vienna:'.$start_date_time_ical.$this->crlf @@ -2606,9 +2617,9 @@ class wochenplan extends basis_db $start_date_time_ical = $sda[2].$sda[1].$sda[0].'T'.sprintf('%02s',($sta[0])).$sta[1].$sta[2]; //neu gruppieren der Startzeit und des Startdatums $end_date_time_ical = $eda[2].$eda[1].$eda[0].'T'.sprintf('%02s',($eta[0])).$eta[1].$eta[2]; //neu gruppieren der Startzeit und des Startdatums - $UID = 'FH'.$lvb.$this->std_plan[$i][$j][$idx]->ort.$this->std_plan[$i][$j][$idx]->lektor.$lehrfach[$idx].$start_date_time_ical.$end_date_time_ical; + $UID = 'FH'.$lvb.$this->std_plan[$i][$j][$idx]->ort.(($this->std_plan[$i][$j][$idx]->mitarbeiter_kurzbz === null) ? $this->std_plan[$i][$j][$idx]->lektor : $this->std_plan[$i][$j][$idx]->mitarbeiter_kurzbz).$lehrfach[$idx].$start_date_time_ical.$end_date_time_ical; $Summary = $lehrfach[$idx].' '.$this->std_plan[$i][$j][$idx]->ort.' - '.$lvb; - $description = $lehrfach[$idx].'\n'.$this->std_plan[$i][$j][$idx]->lektor.'\n'.$lvb.'\n'.$this->std_plan[$i][$j][$idx]->ort.(LVPLAN_ANMERKUNG_ANZEIGEN?'\n'.$this->std_plan[$i][$j][$idx]->anmerkung:''); + $description = $lehrfach[$idx].'\n'.(($this->std_plan[$i][$j][$idx]->mitarbeiter_kurzbz === null) ? $this->std_plan[$i][$j][$idx]->lektor : $this->std_plan[$i][$j][$idx]->mitarbeiter_kurzbz).'\n'.$lvb.'\n'.$this->std_plan[$i][$j][$idx]->ort.(LVPLAN_ANMERKUNG_ANZEIGEN?'\n'.$this->std_plan[$i][$j][$idx]->anmerkung:''); $UID = str_replace(',',' ',$UID); $Summary = str_replace(',',' ',$Summary); @@ -2646,7 +2657,7 @@ class wochenplan extends basis_db else { echo $this->crlf.'"'.$lehrfach[$idx].'","'.$lvplan_kategorie.'","'.$this->std_plan[$i][$j][$idx]->ort.'","Stundenplan'.$this->crlf.$this->std_plan[$i][$j][$idx]->lehrfach.$this->crlf; - echo $this->std_plan[$i][$j][$idx]->lektor.$this->crlf.$lvb.$this->crlf.$this->std_plan[$i][$j][$idx]->ort.(LVPLAN_ANMERKUNG_ANZEIGEN?$this->crlf.$this->std_plan[$i][$j][$idx]->anmerkung:'').'","Stundenplan",'; + echo (($this->std_plan[$i][$j][$idx]->mitarbeiter_kurzbz === null) ? $this->std_plan[$i][$j][$idx]->lektor : $this->std_plan[$i][$j][$idx]->mitarbeiter_kurzbz).$this->crlf.$lvb.$this->crlf.$this->std_plan[$i][$j][$idx]->ort.(LVPLAN_ANMERKUNG_ANZEIGEN?$this->crlf.$this->std_plan[$i][$j][$idx]->anmerkung:'').'","Stundenplan",'; echo '"'.$start_date.'","'.$start_time.'","'.$end_date.'","'.$end_time.'",,,,,'; } } diff --git a/locale/de-AT/abgabetool.php b/locale/de-AT/abgabetool.php index f3b2cfac5..aae3ca2de 100644 --- a/locale/de-AT/abgabetool.php +++ b/locale/de-AT/abgabetool.php @@ -94,6 +94,7 @@ $this->phrasen['abgabetool/fehlerErmittelnEndabgabeProjektarbeit']='Fehler beim $this->phrasen['abgabetool/uploadedDocumentNotSignedStudent']='Es konnte keine gültige digitale Signatur erkannt werden. Bitte wenden Sie sich an Ihren Studiengang ob Ihre Endabgabe erfolgreich war und die Arbeit zur Benotung vorgelegt werden kann.'; $this->phrasen['abgabetool/uploadedDocumentNotSigned']='Signatur fehlt'; $this->phrasen['abgabetool/uploadedDocumentSigned']='Signatur vorhanden'; +$this->phrasen['abgabetool/uploaddDocumentToBigForSignature']='Datei zu groß für Signaturprüfung'; $this->phrasen['abgabetool/senatsMitglied']='Mitglied Prüfungssenat'; $this->phrasen['abgabetool/abgegeben']='Abgegeben, in Beurteilung'; ?> diff --git a/locale/de-AT/fas.dtd b/locale/de-AT/fas.dtd index df6180904..c3d420ede 100644 --- a/locale/de-AT/fas.dtd +++ b/locale/de-AT/fas.dtd @@ -187,6 +187,10 @@ + + + + diff --git a/locale/en-US/abgabetool.php b/locale/en-US/abgabetool.php index b77e25d92..c13ebd90d 100644 --- a/locale/en-US/abgabetool.php +++ b/locale/en-US/abgabetool.php @@ -94,6 +94,7 @@ $this->phrasen['abgabetool/fehlerErmittelnEndabgabeProjektarbeit']='Error when g $this->phrasen['abgabetool/uploadedDocumentNotSignedStudent']='The document does not contain an electronic signature. Please inform your Dregree Programm to verify the upload'; $this->phrasen['abgabetool/uploadedDocumentNotSigned']='Signature not found'; $this->phrasen['abgabetool/uploadedDocumentSigned']='Signature found'; +$this->phrasen['abgabetool/uploaddDocumentToBigForSignature']='File to big for Signaturecheck'; $this->phrasen['abgabetool/senatsMitglied']='Examiner'; $this->phrasen['abgabetool/abgegeben']='handed in, in assessment'; ?> diff --git a/public/css/issues/issuesKonfiguration.css b/public/css/issues/issuesKonfiguration.css new file mode 100644 index 000000000..4d582e9e1 --- /dev/null +++ b/public/css/issues/issuesKonfiguration.css @@ -0,0 +1,7 @@ +#konfigSelect, #fehlercodeSelect { + float: left; +} + +#konfigurationstypInfoIcon,#fehlercodeInfoIcon { + cursor: pointer; +} diff --git a/public/js/components/filter/Filter.js b/public/js/components/filter/Filter.js index e153042ad..2bf878e5a 100644 --- a/public/js/components/filter/Filter.js +++ b/public/js/components/filter/Filter.js @@ -23,6 +23,8 @@ import {CoreFetchCmpt} from '../../components/Fetch.js'; const FILTER_COMPONENT_NEW_FILTER = 'Filter Component New Filter'; const FILTER_COMPONENT_NEW_FILTER_TYPE = 'Filter Component New Filter Type'; +var _uuid = 0; + /** * */ @@ -42,10 +44,12 @@ export const CoreFilterCmpt = { required: true }, tabulatorOptions: Object, - tabulatorEvents: Array + tabulatorEvents: Array, + tableOnly: Boolean }, data: function() { return { + uuid: 0, // FilterCmpt properties filterName: null, fields: null, @@ -54,7 +58,6 @@ export const CoreFilterCmpt = { selectedFields: null, notSelectedFields: null, filterFields: null, - columnsAlias: null, availableFilters: null, @@ -64,104 +67,136 @@ export const CoreFilterCmpt = { fetchCmptApiFunctionParams: null, fetchCmptDataFetched: null, - tabulator: null + tabulator: null, + tableBuilt: false }; }, - created: function() { - this.getFilter(); // get the filter data - }, - updated: function() { - // - let dataset = JSON.parse(JSON.stringify(this.dataset)); - let fields = JSON.parse(JSON.stringify(this.fields)); - let selectedFields = JSON.parse(JSON.stringify(this.selectedFields)); + computed: { + filteredData() { + if (!this.dataset) + return []; + return JSON.parse(JSON.stringify(this.dataset)); + }, + filteredColumns() { + let fields = JSON.parse(JSON.stringify(this.fields)) || []; + let selectedFields = JSON.parse(JSON.stringify(this.selectedFields)) || []; - // - let columns = null; + let columns = null; - // If the tabulator options has been provided and it contains the property columns - if (this.tabulatorOptions != null && this.tabulatorOptions.hasOwnProperty('columns')) - { - columns = this.tabulatorOptions.columns; - } + // If the tabulator options has been provided and it contains the property columns + if (this.tabulatorOptions && this.tabulatorOptions.hasOwnProperty('columns')) + columns = this.tabulatorOptions.columns; - // If columns is not an array or it is an array with less elements then the array fields - if (!Array.isArray(columns) || (Array.isArray(columns) && columns.length < fields.length)) - { - columns = []; // set it as an empty array - - // Loop throught all the retrieved columns from database - for (let i = 0; i < fields.length; i++) + // If columns is not an array or it is an array with less elements then the array fields + if (!Array.isArray(columns) || (Array.isArray(columns) && columns.length < fields.length)) { - // Create a new column having the title equal to the field name - let column = { - title: fields[i], - field: fields[i] - }; + columns = []; // set it as an empty array - // If the column has to be displayed or not - selectedFields.indexOf(fields[i]) >= 0 ? column.visible = true : column.visible = false; - - // Add the new column to the list of columns - columns.push(column); - } - } - else // the property columns has been provided in the tabulator options - { - // Loop throught the property columns of the tabulator options - for (let i = 0; i < columns.length; i++) - { - // If the column has to be displayed or not - selectedFields.indexOf(columns[i].field) >= 0 ? columns[i].visible = true : columns[i].visible = false; - - if (columns[i].hasOwnProperty('resizable')) + // Loop throught all the retrieved columns from database + for (let field of fields) { - columns[i].visible ? columns[i].resizable = true : columns[i].resizable = false; - } + // Create a new column having the title equal to the field name + let column = { + title: field, + field: field + }; + + // If the column has to be displayed or not + column.visible = selectedFields.indexOf(field) >= 0; + + // Add the new column to the list of columns + columns.push(column); + } } - } - - this.columnsAlias = columns; - - // Define a default tabulator options in case it was not provided - let tabulatorOptions = { - height: 500, - layout: "fitColumns", - movableColumns: true, - reactiveData: true, - columns: columns, - data: JSON.parse(JSON.stringify(this.dataset)) - }; - - // If it was provided - if (this.tabulatorOptions != null) - { - // Then copy it... - tabulatorOptions = this.tabulatorOptions; - // ...and overwrite the properties data, reactiveData, movableColumns and columns - tabulatorOptions.data = JSON.parse(JSON.stringify(this.dataset)); - tabulatorOptions.columns = columns; - tabulatorOptions.reactiveData = true; - tabulatorOptions.movableColumns = true; - } - - // Start the tabulator with the buid options - this.tabulator = new Tabulator( - "#filterTableDataset", - tabulatorOptions - ); - - // If event handlers have been provided - if (Array.isArray(this.tabulatorEvents) && this.tabulatorEvents.length > 0) - { - // Attach all the provided event handlers to the started tabulator - for (let i = 0; i < this.tabulatorEvents.length; i++) + else // the property columns has been provided in the tabulator options { - this.tabulator.on(this.tabulatorEvents[i].event, this.tabulatorEvents[i].handler); + // Loop throught the property columns of the tabulator options + for (let col of columns) + { + // If the column has to be displayed or not + col.visible = selectedFields.indexOf(col.field) >= 0; + + if (col.hasOwnProperty('resizable')) + col.resizable = col.visible; + } } + + return columns; + }, + fieldNames() { + if (!this.tableBuilt) + return {}; + return this.tabulator.getColumns().reduce((res, col) => { + res[col.getField()] = col.getDefinition().title; + return res; + }, {}); + }, + idExtra() { + if (!this.uuid) + return ''; + return '-' + this.uuid; } }, + beforeCreate() { + if (!this.tableOnly == !this.filterType) + alert('You can not have a filter-type in table-only mode!'); + }, + created() { + this.uuid = _uuid++; + if (!this.tableOnly) + this.getFilter(); // get the filter data + }, + mounted() { + this.initTabulator(); + }, methods: { + initTabulator() { + // Define a default tabulator options in case it was not provided + let tabulatorOptions = {...{ + height: 500, + layout: "fitColumns", + movableColumns: true, + reactiveData: true + }, ...(this.tabulatorOptions || {})}; + + if (!this.tableOnly) { + tabulatorOptions.data = this.filteredData; + tabulatorOptions.columns = this.filteredColumns; + } + + // Start the tabulator with the build options + this.tabulator = new Tabulator( + this.$refs.table, + tabulatorOptions + ); + // If event handlers have been provided + if (Array.isArray(this.tabulatorEvents) && this.tabulatorEvents.length > 0) + { + // Attach all the provided event handlers to the started tabulator + for (let evt of this.tabulatorEvents) + this.tabulator.on(evt.event, evt.handler); + } + this.tabulator.on('tableBuilt', () => this.tableBuilt = true); + if (this.tableOnly) { + this.tabulator.on('tableBuilt', () => { + const cols = this.tabulator.getColumns(); + this.fields = cols.map(col => col.getField()); + this.selectedFields = cols.filter(col => col.isVisible()).map(col => col.getField()); + }); + } + }, + updateTabulator() { + if (this.tabulator) { + if (this.tableBuilt) + this._updateTabulator(); + else + this.tabulator.on('tableBuilt', this._updateTabulator); + } + }, + _updateTabulator() { + this.tabulator.setData(this.filteredData); + this.tabulator.setColumns(this.filteredColumns); + }, /** * */ @@ -209,6 +244,7 @@ export const CoreFilterCmpt = { { this.setDropDownMenu(data); } + this.updateTabulator(); } else { @@ -335,7 +371,7 @@ export const CoreFilterCmpt = { this.startFetchCmpt( CoreFilterAPIs.saveCustomFilter, { - customFilterName: document.getElementById('customFilterName').value + customFilterName: this.$refscustomFilterName.value }, this.getFilter ); @@ -463,22 +499,22 @@ export const CoreFilterCmpt = { /* * */ - handlerToggleSelectedField: function(event) { + handlerToggleSelectedField(field) { // If it is a selected field - if (this.selectedFields.indexOf(event.target.innerText) != -1) + if (this.selectedFields.indexOf(field) != -1) { // then hide it - this.tabulator.hideColumn(event.target.innerText); + this.tabulator.hideColumn(field); // and remove it from the this.selectedFields property - this.selectedFields.splice(this.selectedFields.indexOf(event.target.innerText), 1); + this.selectedFields.splice(this.selectedFields.indexOf(field), 1); } else // otherwise { // show it - this.tabulator.showColumn(event.target.innerText); + this.tabulator.showColumn(field); // and add it to the this.selectedFields property - this.selectedFields.push(event.target.innerText); + this.selectedFields.push(field); } }, /** @@ -527,6 +563,7 @@ export const CoreFilterCmpt = { template: ` -
+
- [ {{ filterName }} ] - - + [ {{ filterName }} ] + +
-
+
@@ -558,9 +595,9 @@ export const CoreFilterCmpt = {
- {{ fieldToDisplay }} + {{ fieldNames[fieldToDisplay] || fieldToDisplay }}
@@ -568,7 +605,7 @@ export const CoreFilterCmpt = {
-
+
@@ -591,7 +628,7 @@ export const CoreFilterCmpt = {
-
+