From a24483188bf016219d61740851918769aa8119ec Mon Sep 17 00:00:00 2001 From: Alexei Karpenko Date: Wed, 26 Nov 2025 16:24:30 +0100 Subject: [PATCH 01/32] issueproducer: use next studiensemester as well to avoid problems with semester august gap --- application/controllers/jobs/PlausiIssueProducer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/controllers/jobs/PlausiIssueProducer.php b/application/controllers/jobs/PlausiIssueProducer.php index b667e835d..356895a76 100644 --- a/application/controllers/jobs/PlausiIssueProducer.php +++ b/application/controllers/jobs/PlausiIssueProducer.php @@ -18,7 +18,7 @@ class PlausiIssueProducer extends PlausiIssueProducer_Controller $this->load->model('organisation/studiensemester_model', 'StudiensemesterModel'); // get current Studiensemester - $studiensemesterRes = $this->StudiensemesterModel->getAkt(); + $studiensemesterRes = $this->StudiensemesterModel->getAktOrNextSemester(); if (hasData($studiensemesterRes)) $this->_currentStudiensemester = getData($studiensemesterRes)[0]->studiensemester_kurzbz; // set fehler which can be produced by the job From 733a6a8c15305413f44d10583aa5f17c185ffe5a Mon Sep 17 00:00:00 2001 From: Alexei Karpenko Date: Wed, 26 Nov 2025 16:28:16 +0100 Subject: [PATCH 02/32] issues: added vue component for displaying issues in a table --- .../controllers/api/frontend/v1/Issues.php | 56 ++++++ application/models/system/Issue_model.php | 164 ++++++++++++++---- public/js/api/factory/issues.js | 12 ++ public/js/components/Issues/IssueList.js | 79 +++++++++ 4 files changed, 274 insertions(+), 37 deletions(-) create mode 100644 application/controllers/api/frontend/v1/Issues.php create mode 100644 public/js/api/factory/issues.js create mode 100644 public/js/components/Issues/IssueList.js diff --git a/application/controllers/api/frontend/v1/Issues.php b/application/controllers/api/frontend/v1/Issues.php new file mode 100644 index 000000000..2e63ffeb1 --- /dev/null +++ b/application/controllers/api/frontend/v1/Issues.php @@ -0,0 +1,56 @@ + Self::DEFAULT_PERMISSION + ) + ); + + // Loads authentication library and starts authenticationfetc + $this->load->library('AuthLib'); + + $this->load->model('extensions/FHC-Core-Personalverwaltung/Api_model','ApiModel'); + $this->load->model('person/Person_model','PersonModel'); + $this->load->model('system/Fehler_model','FehlerModel'); + $this->load->model('system/Issue_model', 'IssueModel'); + $this->load->model('person/Benutzer_model', 'BenutzerModel'); + + // get CI for transaction management + $this->CI = &get_instance(); + } + + public function getOpenIssuesByProperties() + { + $person_id = $this->input->get('person_id', true); + $oe_kurzbz = $this->input->get('oe_kurzbz', true); + $fehlertyp_kurzbz = $this->input->get('fehlertyp_kurzbz', true); + $apps = $this->input->get('apps', true); + $behebung_parameter = $this->input->get('behebung_parameter', true); + + if (isset($person_id) && !is_numeric($person_id)) + $this->terminateWithError('person id is not numeric!'); + + if (isset($behebung_parameter) && !is_array($behebung_parameter)) + $this->terminateWithError('Behebung parameter invalid'); + + $issueRes = $this->IssueModel->getOpenIssuesByProperties($person_id, $oe_kurzbz, $fehlertyp_kurzbz, $apps, $behebung_parameter); + + if (isError($issueRes)) + { + $this->terminateWithError(getError($issueRes)); + } + + $this->terminateWithSuccess(hasData($issueRes) ? getData($issueRes) : []); + } +} \ No newline at end of file diff --git a/application/models/system/Issue_model.php b/application/models/system/Issue_model.php index 331b0f050..cafb869e2 100644 --- a/application/models/system/Issue_model.php +++ b/application/models/system/Issue_model.php @@ -22,43 +22,17 @@ class Issue_model extends DB_Model */ public function getOpenIssues($fehlercodes, $person_id = null, $oe_kurzbz = null, $fehlercode_extern = null) { - $params = array(); // issue exists for a fehlercode (or fehlercode_extern), person_id, oe_kurzbz, if not verarbeitet yet - $qry = 'SELECT - iss.issue_id, iss.fehlercode, fe.fehler_kurzbz, iss.inhalt, iss.fehlercode_extern, - iss.inhalt_extern, iss.person_id, iss.oe_kurzbz, iss.behebung_parameter, - iss.datum, iss.verarbeitetvon, iss.verarbeitetamum - FROM - system.tbl_issue iss - JOIN system.tbl_fehler fe USING (fehlercode) - WHERE - verarbeitetamum IS NULL'; - - if (!isEmptyArray($fehlercodes)) - { - $qry .= ' AND fehlercode IN ?'; - $params[] = $fehlercodes; - } - - if (!isEmptyString($fehlercode_extern)) - { - $qry .= ' AND fehlercode_extern = ?'; - $params[] = $fehlercode_extern; - } - - if (isset($person_id)) - { - $qry .= ' AND person_id = ?'; - $params[] = $person_id; - } - - if (isset($oe_kurzbz)) - { - $qry .= ' AND oe_kurzbz = ?'; - $params[] = $oe_kurzbz; - } - - return $this->execQuery($qry, $params); + return $this->_getIssues( + $person_id, + $oe_kurzbz, + $fehlertyp_kurzbz = null, + $apps = null, + $ist_verarbeitet = false, + $behebung_parameter = null, + $fehlercodes, + $fehlercode_extern + ); } /** @@ -83,7 +57,7 @@ class Issue_model extends DB_Model $params[] = $fehlercode_extern; } - if (isset($person_id)) + if (isset($person_id) && is_numeric($person_id)) { $qry .= ' AND person_id = ?'; $params[] = $person_id; @@ -110,4 +84,120 @@ class Issue_model extends DB_Model return $this->execQuery($qry, $params); } + + /** + * Gets issues which are open, i.e. not resolved. + * @param int $person_id + * @param string $oe_kurzbz + * @param string $fehlertyp_kurzbz + * @param string|array $apps + * @param array $behebung_parameter + + * @return object success with issues or error + */ + public function getOpenIssuesByProperties( + $person_id = null, + $oe_kurzbz = null, + $fehlertyp_kurzbz = null, + $apps = null, + $behebung_parameter = null + ) { + return $this->_getIssues($person_id, $oe_kurzbz, $fehlertyp_kurzbz, $apps, $ist_verarbeitet = false, $behebung_parameter); + } + + /** + * Gets issues which are open, i.e. not resolved. + * @param int $person_id + * @param string $oe_kurzbz + * @param string $fehlertyp_kurzbz + * @param array $apps only issues for given apps are retrieved + * @param bool $ist_verarbeitet wether the issue has already been resolved + * @param array $behebung_parameter + * @param array $fehlercodes + * @param string $fehlercode_extern + * @return object success with issues or error + */ + private function _getIssues( + $person_id = null, + $oe_kurzbz = null, + $fehlertyp_kurzbz = null, + $apps = null, + $ist_verarbeitet = null, + $behebung_parameter = null, + $fehlercodes = null, + $fehlercode_extern = null + ) { + $params = array(); + + $qry = 'SELECT + iss.issue_id, iss.fehlercode, fe.fehler_kurzbz, iss.inhalt, iss.fehlercode_extern, + iss.inhalt_extern, iss.person_id, iss.oe_kurzbz, iss.behebung_parameter, + iss.datum, iss.verarbeitetvon, iss.verarbeitetamum + FROM + system.tbl_issue iss + JOIN system.tbl_fehler fe USING (fehlercode) + WHERE + TRUE'; + + if (isset($person_id) && is_numeric($person_id)) + { + $qry .= ' AND person_id = ?'; + $params[] = $person_id; + } + + if (isset($oe_kurzbz)) + { + $qry .= ' AND oe_kurzbz = ?'; + $params[] = $oe_kurzbz; + } + + if (isset($fehlertyp_kurzbz)) + { + $qry .= ' AND fehlertyp_kurzbz = ?'; + $params[] = $fehlertyp_kurzbz; + } + + if (isset($apps)) + { + if (is_string($apps)) $apps = [$apps]; + + if (is_array($apps)) + { + $qry .= ' AND app IN ?'; + $params[] = $apps; + } + } + + if (is_bool($ist_verarbeitet)) + { + $qry .= $ist_verarbeitet ? ' AND verarbeitetamum IS NOT NULL' : ' AND verarbeitetamum IS NULL'; + } + + if (!isEmptyArray($behebung_parameter)) + { + // convert array to JSON string for postgres + $behebung_parameter_string = json_encode($behebung_parameter); + + if ($behebung_parameter_string) + { + // check if jsonb value is equal to the passed parameters array (if value contains array and array contains value) + $qry .= ' AND behebung_parameter @> ? AND behebung_parameter <@ ?'; + $params = array_merge($params, array($behebung_parameter_string, $behebung_parameter_string)); + } + } + + if (!isEmptyArray($fehlercodes)) + { + $qry .= ' AND fehlercode IN ?'; + $params[] = $fehlercodes; + } + + if (isset($fehlercode_extern)) + { + $qry .= ' AND fehlercode_extern = ?'; + $params[] = $fehlercode_extern; + } + + return $this->execQuery($qry, $params); + } } diff --git a/public/js/api/factory/issues.js b/public/js/api/factory/issues.js new file mode 100644 index 000000000..376845897 --- /dev/null +++ b/public/js/api/factory/issues.js @@ -0,0 +1,12 @@ +export default { + + getOpenIssuesByProperties(person_id, oe_kurzbz, fehlertyp_kurzbz, apps, behebung_parameter) + { + return { + method: 'get', + url: '/api/frontend/v1/Issues/getOpenIssuesByProperties', + params: { person_id, oe_kurzbz, fehlertyp_kurzbz, apps, behebung_parameter } + }; + } + +} \ No newline at end of file diff --git a/public/js/components/Issues/IssueList.js b/public/js/components/Issues/IssueList.js new file mode 100644 index 000000000..e70fa7831 --- /dev/null +++ b/public/js/components/Issues/IssueList.js @@ -0,0 +1,79 @@ +import ApiIssues from '../../api/factory/issues.js'; + +export default { + name: 'IssueList', + emits: ['issuesLoaded'], + components: { + }, + props: { + person_id: Number, + oe_kurzbz: String, + fehlertyp_kurzbz: String, + apps: [String, Array], + behebung_parameter: Array, + date: null + }, + data() { + return { + title: "Issues", + currentDate: null, + isFetching: false, + issues: null + } + }, + computed: { + // if any property changes, get issues again + propertiesChanged() { + return `${this.person_id}|${this.oe_kurzbz}|${this.fehlertyp_kurzbz}||${this.apps}|${this.behebung_parameter}`; + }, + }, + watch: { + propertiesChanged(newVal, oldVal) { + this.fetchIssues(); + }, + }, + mounted() { + //this.currentDate = props.date || new Date(); + this.currentDate = new Date(); + console.log("created in list"); + this.fetchIssues(); + }, + methods: { + + fetchIssues() { + this.isFetching = true; + this.$api.call( + ApiIssues.getOpenIssuesByProperties(this.person_id, this.oe_kurzbz, this.fehlertyp_kurzbz, this.apps, this.behebung_parameter) + ) + .then(result => { + this.issues = result.data; + this.$emit('issuesLoaded', this.issues); + this.isFetching = false; + }) + .catch(this.$fhcAlert.handleSystemError); + }, + formatDate(ds) { + if (ds == undefined) return ''; + var d = new Date(ds); + return d.getDate() + "." + (d.getMonth()+1) + "." + d.getFullYear() + } + }, + template: ` +
+ Loading... +
+
+ + + + + + + + +
DatumInhalt
{{ formatDate(item.datum) }}{{ item.inhalt }}
+ +
+
+ ` +} From 9c37215e6215ae344d887cfe28b264a96ef6e6f5 Mon Sep 17 00:00:00 2001 From: Alexei Karpenko Date: Mon, 15 Dec 2025 17:20:56 +0100 Subject: [PATCH 03/32] issues: added issue controller for displaying issues, added issuechecker controller and component --- .../api/frontend/v1/issues/IssueChecker.php | 170 ++++++++++++++++++ .../api/frontend/v1/issues/Issues.php | 100 +++++++++++ .../controllers/jobs/PlausiIssueProducer.php | 2 +- public/js/api/factory/issues.js | 2 +- public/js/components/Issues/IssueChecker.js | 65 +++++++ system/phrasesupdate.php | 19 ++ 6 files changed, 356 insertions(+), 2 deletions(-) create mode 100644 application/controllers/api/frontend/v1/issues/IssueChecker.php create mode 100644 application/controllers/api/frontend/v1/issues/Issues.php create mode 100644 public/js/components/Issues/IssueChecker.js diff --git a/application/controllers/api/frontend/v1/issues/IssueChecker.php b/application/controllers/api/frontend/v1/issues/IssueChecker.php new file mode 100644 index 000000000..4ed957dba --- /dev/null +++ b/application/controllers/api/frontend/v1/issues/IssueChecker.php @@ -0,0 +1,170 @@ + self::DEFAULT_PERMISSION, + 'countPersonOpenIssues' => self::DEFAULT_PERMISSION + ]; + + if(!is_array($permissions)) + { + $this->terminateWithError("Issue Checker: permissions must be an array"); + } + + $merged_permissions = array_merge($default_permissions, $permissions); + + parent::__construct($merged_permissions); + + $this->load->model('system/Issue_model', 'IssueModel'); + $this->load->model('person/Person_model', 'PersonModel'); + } + + public function checkPerson() + { + $person_id = $this->input->post('person_id', true); + + if (!is_numeric($person_id)) $this->terminateWithError($this->p->t('ui', 'error_invalidId', ['id'=> 'Person ID']), self::ERROR_TYPE_GENERAL); + + $this->person_id = intval($person_id); + + $persRes = $this->PersonModel->load($this->person_id); + if (!hasData($persRes)) $this->terminateWithError('Person with id ' . $this->person_id . ' not found.', self::ERROR_TYPE_GENERAL); + + $allCodeLibMappings = array_merge($this->_codeLibMappings, $this->_codeProducerLibMappings); + + $this->load->library( + 'issues/PlausicheckProducerLib', + array( + 'extensionName' => $this->_extensionName, + 'codeLibMappings' => $allCodeLibMappings + ), + 'PlausicheckProducerLib' + ); + + $this->load->library( + 'issues/PlausicheckResolverLib', + array( + 'extensionName' => $this->_extensionName, + 'codeLibMappings' => $this->_codeLibMappings, + 'codeProducerLibMappings' => $this->_codeProducerLibMappings + ), + 'PlausicheckResolverLib' + ); + + $this->produceIssues(); + $this->resolveIssues(); + $this->produceIssues(); + + $openIssueCountRes = $this->countOpenIssues(array_keys($allCodeLibMappings)); + if (isError($openIssueCountRes)) $this->terminateWithError(getError($openIssueCountRes), self::ERROR_TYPE_GENERAL); + + $data = array( + 'person_id' => $this->person_id, + 'openissues' => hasData($openIssueCountRes) ? getData($openIssueCountRes) : 0 + ); + + $this->addMeta('errors', $this->errors); + $this->addMeta('infos', $this->infos); + + $this->terminateWithSuccess($data); + } + + public function countPersonOpenIssues() + { + $person_id = $this->input->get('person_id', true); + + if (!is_numeric($person_id)) $this->terminateWithError($this->p->t('ui', 'error_invalidId', ['id'=> 'Person ID']), self::ERROR_TYPE_GENERAL); + + $this->person_id = intval($person_id); + + $persRes = $this->PersonModel->load($this->person_id); + + if (!hasData($persRes)) $this->terminateWithError('Person with id ' . $this->person_id . ' not found.', self::ERROR_TYPE_GENERAL); + + $openIssueCountRes = $this->countOpenIssues(array_keys(array_merge($this->_codeLibMappings, $this->_codeProducerLibMappings))); + if (isError($openIssueCountRes)) $this->terminateWithError(getError($openIssueCountRes), self::ERROR_TYPE_GENERAL); + + $data = array( + 'person_id' => $this->person_id, + 'openissues' => hasData($openIssueCountRes) ? getData($openIssueCountRes) : 0 + ); + + $this->addMeta('errors', $this->errors); + $this->addMeta('infos', $this->infos); + + $this->terminateWithSuccess($data); + } + + protected function countOpenIssues($fehlercodes) + { + if (isEmptyArray($fehlercodes)) return success([]); + + // load open issues with given errorcodes + $openIssuesRes = $this->IssueModel->getOpenIssues( + $fehlercodes, + $this->person_id + ); + + // log error if occured + if (isError($openIssuesRes)) return $openIssuesRes; + + $issues = hasData($openIssuesRes) ? getData($openIssuesRes) : []; + $issuescount = is_array($issues) || $issues instanceof Countable ? count($issues) : 0; + + return success($issuescount); + } + + protected function produceIssues() + { + if (isEmptyArray($this->_codeLibMappings) && isEmptyArray($this->_codeProducerLibMappings)) return success([]); + + $allCodeLibMappings = array_merge($this->_codeLibMappings, $this->_codeProducerLibMappings); + + $result = $this->PlausicheckProducerLib->producePlausicheckIssues( + array('person_id' => $this->person_id) + ); + + // log if error, or log info if inserted new issue + if (isset($result->errors)) + $this->errors = array_merge($this->errors, $result->errors); + if (isset($result->infos)) + $this->infos = array_merge($this->infos, $result->infos); + } + + protected function resolveIssues() + { + // load open issues with given errorcodes + $openIssuesRes = $this->IssueModel->getOpenIssues( + array_keys(array_merge($this->_codeLibMappings, $this->_codeProducerLibMappings)), + $this->person_id + ); + + if (hasData($openIssuesRes)) + { + $openIssues = getData($openIssuesRes); + + $result = $this->PlausicheckResolverLib->resolvePlausicheckIssues($openIssues); + + // log if error, or log info if inserted new issue + if (isset($result->errors)) + $this->errors = array_merge($this->errors, $result->errors); + if (isset($result->infos)) + $this->infos = array_merge($this->infos, $result->infos); + } + } +} diff --git a/application/controllers/api/frontend/v1/issues/Issues.php b/application/controllers/api/frontend/v1/issues/Issues.php new file mode 100644 index 000000000..6ae268a53 --- /dev/null +++ b/application/controllers/api/frontend/v1/issues/Issues.php @@ -0,0 +1,100 @@ + Self::DEFAULT_PERMISSION + ) + ); + + // Loads authentication library and starts authenticationfetc + $this->load->library('AuthLib'); + + $this->load->model('extensions/FHC-Core-Personalverwaltung/Api_model','ApiModel'); + $this->load->model('person/Person_model','PersonModel'); + $this->load->model('system/Fehler_model','FehlerModel'); + $this->load->model('system/Issue_model', 'IssueModel'); + $this->load->model('person/Benutzer_model', 'BenutzerModel'); + + // get CI for transaction management + $this->CI = &get_instance(); + } + + public function getOpenIssuesByProperties() + { + $person_id = $this->input->get('person_id', true); + $oe_kurzbz = $this->input->get('oe_kurzbz', true); + $fehlertyp_kurzbz = $this->input->get('fehlertyp_kurzbz', true); + $apps = $this->input->get('apps', true); + $behebung_parameter = $this->input->get('behebung_parameter', true); + + if (isset($person_id) && !is_numeric($person_id)) + $this->terminateWithError('person id is not numeric!'); + + if (isset($behebung_parameter) && !is_array($behebung_parameter)) + $this->terminateWithError('Behebung parameter invalid'); + + $issueRes = $this->IssueModel->getOpenIssuesByProperties($person_id, $oe_kurzbz, $fehlertyp_kurzbz, $apps, $behebung_parameter); + + if (isError($issueRes)) + { + $this->terminateWithError(getError($issueRes)); + } + + $this->terminateWithSuccess(hasData($issueRes) ? getData($issueRes) : []); + } + + public function PersonenMitOffenenIssues() + { + + $sql = <<=now()) + ) aktiv +FROM + system.tbl_issue +JOIN + system.tbl_fehler USING (fehlercode) +JOIN + public.tbl_person USING (person_id) +JOIN + public.tbl_benutzer USING (person_id) +JOIN + public.tbl_mitarbeiter ON uid = mitarbeiter_uid +WHERE + app = 'personalverwaltung' AND verarbeitetamum IS NULL +GROUP BY + person_id, uid, vorname, nachname +HAVING + count(*) > 0 +ORDER BY + count(*) DESC; + +EOSQL; + + $personenmitissues = $this->IssueModel->execReadOnlyQuery($sql); + if( hasData($personenmitissues) ) + { + $this->terminateWithSuccess(getData($personenmitissues)); + } + else + { + $this->terminateWithSuccess(array()); + } + } +} \ No newline at end of file diff --git a/application/controllers/jobs/PlausiIssueProducer.php b/application/controllers/jobs/PlausiIssueProducer.php index 356895a76..77d4518ff 100644 --- a/application/controllers/jobs/PlausiIssueProducer.php +++ b/application/controllers/jobs/PlausiIssueProducer.php @@ -18,7 +18,7 @@ class PlausiIssueProducer extends PlausiIssueProducer_Controller $this->load->model('organisation/studiensemester_model', 'StudiensemesterModel'); // get current Studiensemester - $studiensemesterRes = $this->StudiensemesterModel->getAktOrNextSemester(); + $studiensemesterRes = $this->StudiensemesterModel->getAktOrNextSemester(62); if (hasData($studiensemesterRes)) $this->_currentStudiensemester = getData($studiensemesterRes)[0]->studiensemester_kurzbz; // set fehler which can be produced by the job diff --git a/public/js/api/factory/issues.js b/public/js/api/factory/issues.js index 376845897..1279cc232 100644 --- a/public/js/api/factory/issues.js +++ b/public/js/api/factory/issues.js @@ -4,7 +4,7 @@ export default { { return { method: 'get', - url: '/api/frontend/v1/Issues/getOpenIssuesByProperties', + url: '/api/frontend/v1/issues/getOpenIssuesByProperties', params: { person_id, oe_kurzbz, fehlertyp_kurzbz, apps, behebung_parameter } }; } diff --git a/public/js/components/Issues/IssueChecker.js b/public/js/components/Issues/IssueChecker.js new file mode 100644 index 000000000..f698faa64 --- /dev/null +++ b/public/js/components/Issues/IssueChecker.js @@ -0,0 +1,65 @@ +export default { + name: 'IssueChecker', + //emits: ['issuesLoaded'], + components: { + "p-skeleton": primevue.skeleton, + }, + props: { + person_id: Number, + //oe_kurzbz: String, + apps: [String, Array], + endpoint: { + type: Object, + required: true + } + }, + data() { + return { + title: "IssueChecker", + currentDate: null, + isFetching: false, + openissuescount: null + } + }, + computed: { + }, + watch: { + }, + mounted() { + this.getOpenIssuesCount(); + }, + methods: { + + getOpenIssuesCount() { + this.isFetching = true; + this.$api.call( + this.endpoint.countPersonOpenIssues(this.person_id) + ) + .then(result => { + //this.$emit('issuesLoaded', this.issues); + this.openissuescount = result.data.openissues; + this.isFetching = false; + }) + .catch(this.$fhcAlert.handleSystemError); + }, + checkPerson() { + this.isFetching = true; + this.$api.call( + this.endpoint.checkPerson(this.person_id) + ) + .then(result => { + //this.$emit('issuesLoaded', this.issues); + this.openissuescount = result.data.openissues; + this.isFetching = false; + }) + .catch(this.$fhcAlert.handleSystemError); + }, + }, + template: ` +
+

Issues

+
{{ openissuescount }}
+
+
+ ` +} diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php index e1568b97e..2b8bc28b6 100644 --- a/system/phrasesupdate.php +++ b/system/phrasesupdate.php @@ -52310,6 +52310,25 @@ I have been informed that I am under no obligation to consent to the transmissio ) ), // ### Personen zusammenlegen Phrasen END + array( + 'app' => 'core', + 'category' => 'ui', + 'phrase' => 'error_invalidId', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Id {id} ungültig', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Invalid Id {id}', + 'description' => '', + 'insertvon' => 'system' + ) + ) ); From 026bd6e2471a84c0f70fba4959596e3aae90b066 Mon Sep 17 00:00:00 2001 From: Alexei Karpenko Date: Mon, 15 Dec 2025 18:00:05 +0100 Subject: [PATCH 04/32] moved issues controller to another folder --- .../controllers/api/frontend/v1/Issues.php | 56 ------------------- public/js/api/factory/issues.js | 2 +- 2 files changed, 1 insertion(+), 57 deletions(-) delete mode 100644 application/controllers/api/frontend/v1/Issues.php diff --git a/application/controllers/api/frontend/v1/Issues.php b/application/controllers/api/frontend/v1/Issues.php deleted file mode 100644 index 2e63ffeb1..000000000 --- a/application/controllers/api/frontend/v1/Issues.php +++ /dev/null @@ -1,56 +0,0 @@ - Self::DEFAULT_PERMISSION - ) - ); - - // Loads authentication library and starts authenticationfetc - $this->load->library('AuthLib'); - - $this->load->model('extensions/FHC-Core-Personalverwaltung/Api_model','ApiModel'); - $this->load->model('person/Person_model','PersonModel'); - $this->load->model('system/Fehler_model','FehlerModel'); - $this->load->model('system/Issue_model', 'IssueModel'); - $this->load->model('person/Benutzer_model', 'BenutzerModel'); - - // get CI for transaction management - $this->CI = &get_instance(); - } - - public function getOpenIssuesByProperties() - { - $person_id = $this->input->get('person_id', true); - $oe_kurzbz = $this->input->get('oe_kurzbz', true); - $fehlertyp_kurzbz = $this->input->get('fehlertyp_kurzbz', true); - $apps = $this->input->get('apps', true); - $behebung_parameter = $this->input->get('behebung_parameter', true); - - if (isset($person_id) && !is_numeric($person_id)) - $this->terminateWithError('person id is not numeric!'); - - if (isset($behebung_parameter) && !is_array($behebung_parameter)) - $this->terminateWithError('Behebung parameter invalid'); - - $issueRes = $this->IssueModel->getOpenIssuesByProperties($person_id, $oe_kurzbz, $fehlertyp_kurzbz, $apps, $behebung_parameter); - - if (isError($issueRes)) - { - $this->terminateWithError(getError($issueRes)); - } - - $this->terminateWithSuccess(hasData($issueRes) ? getData($issueRes) : []); - } -} \ No newline at end of file diff --git a/public/js/api/factory/issues.js b/public/js/api/factory/issues.js index 1279cc232..72836b0b5 100644 --- a/public/js/api/factory/issues.js +++ b/public/js/api/factory/issues.js @@ -4,7 +4,7 @@ export default { { return { method: 'get', - url: '/api/frontend/v1/issues/getOpenIssuesByProperties', + url: '/api/frontend/v1/issues/Issues/getOpenIssuesByProperties', params: { person_id, oe_kurzbz, fehlertyp_kurzbz, apps, behebung_parameter } }; } From 2d71a436f6646b7962b814a4726a9bb06e53f38c Mon Sep 17 00:00:00 2001 From: Alexei Karpenko Date: Tue, 16 Dec 2025 17:30:25 +0100 Subject: [PATCH 05/32] IssueList: possible to pass endpoint dynamically --- public/js/components/Issues/IssueList.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/public/js/components/Issues/IssueList.js b/public/js/components/Issues/IssueList.js index e70fa7831..e7a54f117 100644 --- a/public/js/components/Issues/IssueList.js +++ b/public/js/components/Issues/IssueList.js @@ -11,7 +11,11 @@ export default { fehlertyp_kurzbz: String, apps: [String, Array], behebung_parameter: Array, - date: null + date: null, + endpoint: { + type: Object, + default: ApiIssues + } }, data() { return { @@ -33,9 +37,7 @@ export default { }, }, mounted() { - //this.currentDate = props.date || new Date(); - this.currentDate = new Date(); - console.log("created in list"); + this.currentDate = this.date || new Date(); this.fetchIssues(); }, methods: { @@ -43,7 +45,7 @@ export default { fetchIssues() { this.isFetching = true; this.$api.call( - ApiIssues.getOpenIssuesByProperties(this.person_id, this.oe_kurzbz, this.fehlertyp_kurzbz, this.apps, this.behebung_parameter) + this.endpoint.getOpenIssuesByProperties(this.person_id, this.oe_kurzbz, this.fehlertyp_kurzbz, this.apps, this.behebung_parameter) ) .then(result => { this.issues = result.data; From 3e77d80d26c38221bb2a8afdb8fdf43feff2e922 Mon Sep 17 00:00:00 2001 From: Alexei Karpenko Date: Thu, 18 Dec 2025 15:19:02 +0100 Subject: [PATCH 06/32] Issues: added possibility to display issues only when user is hauptzustaendig --- .../api/frontend/v1/issues/IssueChecker.php | 27 +++++--- .../api/frontend/v1/issues/Issues.php | 12 +++- .../system/Fehlerzustaendigkeiten_model.php | 61 +++++++++++++++++++ application/models/system/Issue_model.php | 50 ++++++++++++--- .../api/factory/{issues.js => issueList.js} | 4 +- public/js/components/Issues/IssueChecker.js | 12 ++-- public/js/components/Issues/IssueList.js | 17 +++++- 7 files changed, 156 insertions(+), 27 deletions(-) rename public/js/api/factory/{issues.js => issueList.js} (76%) diff --git a/application/controllers/api/frontend/v1/issues/IssueChecker.php b/application/controllers/api/frontend/v1/issues/IssueChecker.php index 4ed957dba..4cd662029 100644 --- a/application/controllers/api/frontend/v1/issues/IssueChecker.php +++ b/application/controllers/api/frontend/v1/issues/IssueChecker.php @@ -23,7 +23,7 @@ class IssueChecker extends FHCAPI_Controller if(!is_array($permissions)) { - $this->terminateWithError("Issue Checker: permissions must be an array"); + $this->terminateWithError("Issue Checker: permissions must be an array"); } $merged_permissions = array_merge($default_permissions, $permissions); @@ -37,10 +37,12 @@ class IssueChecker extends FHCAPI_Controller public function checkPerson() { $person_id = $this->input->post('person_id', true); + $hauptzustaendig = filter_var($this->input->post('hauptzustaendig', true), FILTER_VALIDATE_BOOLEAN); if (!is_numeric($person_id)) $this->terminateWithError($this->p->t('ui', 'error_invalidId', ['id'=> 'Person ID']), self::ERROR_TYPE_GENERAL); $this->person_id = intval($person_id); + $this->hauptzustaendig = $hauptzustaendig; $persRes = $this->PersonModel->load($this->person_id); if (!hasData($persRes)) $this->terminateWithError('Person with id ' . $this->person_id . ' not found.', self::ERROR_TYPE_GENERAL); @@ -66,11 +68,11 @@ class IssueChecker extends FHCAPI_Controller 'PlausicheckResolverLib' ); - $this->produceIssues(); - $this->resolveIssues(); - $this->produceIssues(); + $this->_produceIssues(); + $this->_resolveIssues(); + $this->_produceIssues(); - $openIssueCountRes = $this->countOpenIssues(array_keys($allCodeLibMappings)); + $openIssueCountRes = $this->_countOpenIssues(array_keys($allCodeLibMappings)); if (isError($openIssueCountRes)) $this->terminateWithError(getError($openIssueCountRes), self::ERROR_TYPE_GENERAL); $data = array( @@ -87,16 +89,18 @@ class IssueChecker extends FHCAPI_Controller public function countPersonOpenIssues() { $person_id = $this->input->get('person_id', true); + $hauptzustaendig = filter_var($this->input->get('hauptzustaendig', true), FILTER_VALIDATE_BOOLEAN); if (!is_numeric($person_id)) $this->terminateWithError($this->p->t('ui', 'error_invalidId', ['id'=> 'Person ID']), self::ERROR_TYPE_GENERAL); $this->person_id = intval($person_id); + $this->hauptzustaendig = $hauptzustaendig; $persRes = $this->PersonModel->load($this->person_id); if (!hasData($persRes)) $this->terminateWithError('Person with id ' . $this->person_id . ' not found.', self::ERROR_TYPE_GENERAL); - $openIssueCountRes = $this->countOpenIssues(array_keys(array_merge($this->_codeLibMappings, $this->_codeProducerLibMappings))); + $openIssueCountRes = $this->_countOpenIssues(array_keys(array_merge($this->_codeLibMappings, $this->_codeProducerLibMappings))); if (isError($openIssueCountRes)) $this->terminateWithError(getError($openIssueCountRes), self::ERROR_TYPE_GENERAL); $data = array( @@ -110,14 +114,17 @@ class IssueChecker extends FHCAPI_Controller $this->terminateWithSuccess($data); } - protected function countOpenIssues($fehlercodes) + protected function _countOpenIssues($fehlercodes) { if (isEmptyArray($fehlercodes)) return success([]); // load open issues with given errorcodes $openIssuesRes = $this->IssueModel->getOpenIssues( $fehlercodes, - $this->person_id + $this->person_id, + $oe_kurzbz = null, + $fehlercode_extern = null, + $this->hauptzustaendig ); // log error if occured @@ -129,7 +136,7 @@ class IssueChecker extends FHCAPI_Controller return success($issuescount); } - protected function produceIssues() + protected function _produceIssues() { if (isEmptyArray($this->_codeLibMappings) && isEmptyArray($this->_codeProducerLibMappings)) return success([]); @@ -146,7 +153,7 @@ class IssueChecker extends FHCAPI_Controller $this->infos = array_merge($this->infos, $result->infos); } - protected function resolveIssues() + protected function _resolveIssues() { // load open issues with given errorcodes $openIssuesRes = $this->IssueModel->getOpenIssues( diff --git a/application/controllers/api/frontend/v1/issues/Issues.php b/application/controllers/api/frontend/v1/issues/Issues.php index 6ae268a53..08e4f6501 100644 --- a/application/controllers/api/frontend/v1/issues/Issues.php +++ b/application/controllers/api/frontend/v1/issues/Issues.php @@ -37,6 +37,7 @@ class Issues extends FHCAPI_Controller $fehlertyp_kurzbz = $this->input->get('fehlertyp_kurzbz', true); $apps = $this->input->get('apps', true); $behebung_parameter = $this->input->get('behebung_parameter', true); + $hauptzustaendig = filter_var($this->input->get('hauptzustaendig', true), FILTER_VALIDATE_BOOLEAN); if (isset($person_id) && !is_numeric($person_id)) $this->terminateWithError('person id is not numeric!'); @@ -44,7 +45,16 @@ class Issues extends FHCAPI_Controller if (isset($behebung_parameter) && !is_array($behebung_parameter)) $this->terminateWithError('Behebung parameter invalid'); - $issueRes = $this->IssueModel->getOpenIssuesByProperties($person_id, $oe_kurzbz, $fehlertyp_kurzbz, $apps, $behebung_parameter); + $this->addMeta("vorher", $hauptzustaendig); + + $issueRes = $this->IssueModel->getOpenIssuesByProperties( + $person_id, + $oe_kurzbz, + $fehlertyp_kurzbz, + $apps, + $behebung_parameter, + $hauptzustaendig + ); if (isError($issueRes)) { diff --git a/application/models/system/Fehlerzustaendigkeiten_model.php b/application/models/system/Fehlerzustaendigkeiten_model.php index 9277f3609..8e98ab0e6 100644 --- a/application/models/system/Fehlerzustaendigkeiten_model.php +++ b/application/models/system/Fehlerzustaendigkeiten_model.php @@ -12,6 +12,67 @@ class Fehlerzustaendigkeiten_model extends DB_Model $this->pk = 'fehlerzustaendigkeiten_id'; } + /** + * Get all Fehler for which user is hauptzuständig (is in charge). + * @return object success or error + */ + public function getFehlerForUserHauptzustaendig() + { + $params = [getAuthPersonId()]; + + $this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel'); + + // get oes of uid for which there is a current funktion + $all_funktionen_oe_kurzbz = array(); + $benutzerfunktionRes = $this->BenutzerfunktionModel->getBenutzerFunktionByUid(getAuthUID(), null, date('Y-m-d'), date('Y-m-d')); + + if (isError($benutzerfunktionRes)) return $benutzerfunktionRes; + + if (hasData($benutzerfunktionRes)) + { + foreach (getData($benutzerfunktionRes) as $benutzerfunktion) + { + $all_funktionen_oe_kurzbz[$benutzerfunktion->oe_kurzbz][] = $benutzerfunktion->funktion_kurzbz; + } + } + + $query = "WITH zustaendigkeiten AS ( + SELECT fehlercode, + CASE + WHEN zst.person_id = ?"; + + if (!isEmptyArray($all_funktionen_oe_kurzbz)) + { + $params[] = array_keys($all_funktionen_oe_kurzbz); + $query .= " OR (zst.oe_kurzbz IN ? AND zst.funktion_kurzbz IS NULL) /* if oe is specified in fehler_zustaendigkeiten */"; + + // check for each oe for each function if zustaendig + foreach ($all_funktionen_oe_kurzbz as $oe_kurzbz => $funktionen_kurzbz) + { + foreach ($funktionen_kurzbz as $funktion_kurzbz) + { + $query .= " OR (zst.oe_kurzbz = '$oe_kurzbz' AND zst.funktion_kurzbz = '$funktion_kurzbz')"; + } + } + } + + $query .= " THEN TRUE + ELSE FALSE + END AS \"zustaendig\" + FROM system.tbl_fehler_zustaendigkeiten zst + ) + SELECT + fehler.fehler_kurzbz, fehler.fehlercode + FROM + system.tbl_fehler fehler + LEFT JOIN zustaendigkeiten USING(fehlercode) + WHERE + zustaendigkeiten.fehlercode IS NULL + OR zustaendigkeiten.zustaendig = TRUE"; + + return $this->execReadOnlyQuery($query, $params); + } + /** * Gets active Mitarbeiter not assigned to a Fehler. * @param $fehlercode diff --git a/application/models/system/Issue_model.php b/application/models/system/Issue_model.php index cafb869e2..c1d31a5ee 100644 --- a/application/models/system/Issue_model.php +++ b/application/models/system/Issue_model.php @@ -20,7 +20,7 @@ class Issue_model extends DB_Model * @param string $fehlercode_extern * @return object success with issues or error */ - public function getOpenIssues($fehlercodes, $person_id = null, $oe_kurzbz = null, $fehlercode_extern = null) + public function getOpenIssues($fehlercodes, $person_id = null, $oe_kurzbz = null, $fehlercode_extern = null, $hauptzustaendig = false) { // issue exists for a fehlercode (or fehlercode_extern), person_id, oe_kurzbz, if not verarbeitet yet return $this->_getIssues( @@ -31,7 +31,8 @@ class Issue_model extends DB_Model $ist_verarbeitet = false, $behebung_parameter = null, $fehlercodes, - $fehlercode_extern + $fehlercode_extern, + $hauptzustaendig ); } @@ -43,8 +44,14 @@ class Issue_model extends DB_Model * @param string $fehlercode_extern if provided, only issues with this external fehlercode are counted (for identifying issues from external systems). * @return Object success with number of issues or error */ - public function getOpenIssueCount($fehlercode, $person_id = null, $oe_kurzbz = null, $fehlercode_extern = null, $behebung_parameter = null) - { + public function getOpenIssueCount( + $fehlercode, + $person_id = null, + $oe_kurzbz = null, + $fehlercode_extern = null, + $behebung_parameter = null, + $hauptzustaendig = false + ) { $params = array($fehlercode); // issue exists for a fehlercode (or fehlercode_extern), person_id, oe_kurzbz, if not verarbeitet yet $qry = 'SELECT count(*) as anzahl_open_issues FROM system.tbl_issue @@ -100,9 +107,20 @@ class Issue_model extends DB_Model $oe_kurzbz = null, $fehlertyp_kurzbz = null, $apps = null, - $behebung_parameter = null + $behebung_parameter = null, + $hauptzustaendig = false ) { - return $this->_getIssues($person_id, $oe_kurzbz, $fehlertyp_kurzbz, $apps, $ist_verarbeitet = false, $behebung_parameter); + return $this->_getIssues( + $person_id, + $oe_kurzbz, + $fehlertyp_kurzbz, + $apps, + $ist_verarbeitet = false, + $behebung_parameter, + $fehlercodes = null, + $fehlercode_extern = null, + $hauptzustaendig + ); } /** @@ -125,7 +143,8 @@ class Issue_model extends DB_Model $ist_verarbeitet = null, $behebung_parameter = null, $fehlercodes = null, - $fehlercode_extern = null + $fehlercode_extern = null, + $hauptzustaendig = false ) { $params = array(); @@ -186,6 +205,23 @@ class Issue_model extends DB_Model } } + // retrieving only fehler for which user is hauptzuständig + if ($hauptzustaendig === true) + { + $this->load->model('system/Fehlerzustaendigkeiten_model', 'FehlerzustaendigkeitenModel'); + + $result = $this->FehlerzustaendigkeitenModel->getFehlerForUserHauptzustaendig(); + + + if (isError($result)) return $result; + + if (hasData($result)) + { + $fehlercodesZust = array_column(getData($result), 'fehlercode'); + $fehlercodes = isEmptyArray($fehlercodes) ? $fehlercodesZust : array_intersect($fehlercodes, $fehlercodesZust); + } + } + if (!isEmptyArray($fehlercodes)) { $qry .= ' AND fehlercode IN ?'; diff --git a/public/js/api/factory/issues.js b/public/js/api/factory/issueList.js similarity index 76% rename from public/js/api/factory/issues.js rename to public/js/api/factory/issueList.js index 72836b0b5..3c8f8172a 100644 --- a/public/js/api/factory/issues.js +++ b/public/js/api/factory/issueList.js @@ -1,11 +1,11 @@ export default { - getOpenIssuesByProperties(person_id, oe_kurzbz, fehlertyp_kurzbz, apps, behebung_parameter) + getOpenIssuesByProperties(person_id, oe_kurzbz, fehlertyp_kurzbz, apps, behebung_parameter, hauptzustaendig) { return { method: 'get', url: '/api/frontend/v1/issues/Issues/getOpenIssuesByProperties', - params: { person_id, oe_kurzbz, fehlertyp_kurzbz, apps, behebung_parameter } + params: { person_id, oe_kurzbz, fehlertyp_kurzbz, apps, behebung_parameter, hauptzustaendig } }; } diff --git a/public/js/components/Issues/IssueChecker.js b/public/js/components/Issues/IssueChecker.js index f698faa64..3b00d44fa 100644 --- a/public/js/components/Issues/IssueChecker.js +++ b/public/js/components/Issues/IssueChecker.js @@ -8,6 +8,10 @@ export default { person_id: Number, //oe_kurzbz: String, apps: [String, Array], + hauptzustaendig: { + type: Boolean, + default: false + }, endpoint: { type: Object, required: true @@ -26,14 +30,14 @@ export default { watch: { }, mounted() { - this.getOpenIssuesCount(); + this.countPersonOpenIssues(); }, methods: { - getOpenIssuesCount() { + countPersonOpenIssues() { this.isFetching = true; this.$api.call( - this.endpoint.countPersonOpenIssues(this.person_id) + this.endpoint.countPersonOpenIssues(this.person_id, this.hauptzustaendig) ) .then(result => { //this.$emit('issuesLoaded', this.issues); @@ -45,7 +49,7 @@ export default { checkPerson() { this.isFetching = true; this.$api.call( - this.endpoint.checkPerson(this.person_id) + this.endpoint.checkPerson(this.person_id, this.hauptzustaendig) ) .then(result => { //this.$emit('issuesLoaded', this.issues); diff --git a/public/js/components/Issues/IssueList.js b/public/js/components/Issues/IssueList.js index e7a54f117..ba8c4f8f5 100644 --- a/public/js/components/Issues/IssueList.js +++ b/public/js/components/Issues/IssueList.js @@ -1,4 +1,4 @@ -import ApiIssues from '../../api/factory/issues.js'; +import ApiIssueList from '../../api/factory/issueList.js'; export default { name: 'IssueList', @@ -11,10 +11,14 @@ export default { fehlertyp_kurzbz: String, apps: [String, Array], behebung_parameter: Array, + hauptzustaendig: { + type: Boolean, + default: false + }, date: null, endpoint: { type: Object, - default: ApiIssues + default: ApiIssueList } }, data() { @@ -45,7 +49,14 @@ export default { fetchIssues() { this.isFetching = true; this.$api.call( - this.endpoint.getOpenIssuesByProperties(this.person_id, this.oe_kurzbz, this.fehlertyp_kurzbz, this.apps, this.behebung_parameter) + this.endpoint.getOpenIssuesByProperties( + this.person_id, + this.oe_kurzbz, + this.fehlertyp_kurzbz, + this.apps, + this.behebung_parameter, + this.hauptzustaendig + ) ) .then(result => { this.issues = result.data; From a259db2e7bc144751af1ede0b2566bff295ae1c5 Mon Sep 17 00:00:00 2001 From: Alexei Karpenko Date: Fri, 19 Dec 2025 16:09:38 +0100 Subject: [PATCH 07/32] issues: renamed method PersonenMitOffenenIssues, added expose to components --- application/controllers/api/frontend/v1/issues/Issues.php | 5 +++-- public/js/components/Issues/IssueChecker.js | 1 + public/js/components/Issues/IssueList.js | 1 + 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/application/controllers/api/frontend/v1/issues/Issues.php b/application/controllers/api/frontend/v1/issues/Issues.php index 08e4f6501..79ce91db2 100644 --- a/application/controllers/api/frontend/v1/issues/Issues.php +++ b/application/controllers/api/frontend/v1/issues/Issues.php @@ -13,7 +13,8 @@ class Issues extends FHCAPI_Controller parent::__construct( array( - 'getOpenIssuesByProperties' => Self::DEFAULT_PERMISSION + 'getOpenIssuesByProperties' => Self::DEFAULT_PERMISSION, + 'getPersonenMitOffenenIssues' => Self::DEFAULT_PERMISSION ) ); @@ -64,7 +65,7 @@ class Issues extends FHCAPI_Controller $this->terminateWithSuccess(hasData($issueRes) ? getData($issueRes) : []); } - public function PersonenMitOffenenIssues() + public function getPersonenMitOffenenIssues() { $sql = << Date: Wed, 14 Jan 2026 14:13:23 +0100 Subject: [PATCH 08/32] issues: changed logic to read producable issues from config file --- application/config/fehler.php | 448 ++++++++++++++++++ .../api/frontend/v1/issues/IssueChecker.php | 71 +-- .../controllers/jobs/IssueResolver.php | 96 ++-- .../controllers/jobs/PlausiIssueProducer.php | 4 +- .../system/issues/Plausichecks.php | 9 +- application/core/IssueResolver_Controller.php | 13 +- .../core/PlausiIssueProducer_Controller.php | 6 +- .../issues/PlausicheckDefinitionLib.php | 62 ++- .../issues/PlausicheckProducerLib.php | 134 +++++- .../issues/PlausicheckResolverLib.php | 220 ++++++--- .../issues/plausichecks/PlausiChecker.php | 15 +- .../system/Fehlerkonfiguration_model.php | 6 +- 12 files changed, 851 insertions(+), 233 deletions(-) create mode 100644 application/config/fehler.php diff --git a/application/config/fehler.php b/application/config/fehler.php new file mode 100644 index 000000000..68e833cd7 --- /dev/null +++ b/application/config/fehler.php @@ -0,0 +1,448 @@ + 'CORE_ZGV_0001', + 'fehler_kurzbz' => 'zgvDatumInZukunft', + 'fehlercode_extern' => null, + 'fehlertext' => 'ZGV Datum in Zukunft', + 'fehlertyp_kurzbz' => 'error', + 'app' => array('core'), + 'producerLibName' => null, + 'resolverLibName' => 'CORE_ZGV_0001', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_ZGV_0002', + 'fehler_kurzbz' => 'zgvDatumVorGeburtsdatum', + 'fehlercode_extern' => null, + 'fehlertext' => 'ZGV Datum vor Geburtsdatum', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => null, + 'resolverLibName' => 'CORE_ZGV_0002', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_ZGV_0003', + 'fehler_kurzbz' => 'zgvMasterDatumInZukunft', + 'fehlercode_extern' => null, + 'fehlertext' => 'ZGV Masterdatum in Zukunft', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => null, + 'resolverLibName' => 'CORE_ZGV_0003', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_ZGV_0004', + 'fehler_kurzbz' => 'zgvMasterDatumVorZgvdatum', + 'fehlercode_extern' => null, + 'fehlertext' => 'ZGV Masterdatum vor Zgvdatum', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => null, + 'resolverLibName' => 'CORE_ZGV_0004', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_ZGV_0005', + 'fehler_kurzbz' => 'zgvMasterDatumVorGeburtsdatum', + 'fehlercode_extern' => null, + 'fehlertext' => 'ZGV Masterdatum vor Geburtsdatum', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => null, + 'resolverLibName' => 'CORE_ZGV_0005', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_INOUT_0001', + 'fehler_kurzbz' => 'keinAufenthaltszweckPlausi', + 'fehlercode_extern' => null, + 'fehlertext' => 'Kein Aufenthaltszweck gefunden', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => null, + 'resolverLibName' => 'CORE_INOUT_0001', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_INOUT_0002', + 'fehler_kurzbz' => 'zuVieleZweckeIncomingPlausi', + 'fehlercode_extern' => null, + 'fehlertext' => 'Es sind %s Aufenthaltszwecke eingetragen (max. 1 Zweck für Incomings)', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => null, + 'resolverLibName' => 'CORE_INOUT_0002', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_INOUT_0003', + 'fehler_kurzbz' => 'falscherIncomingZweckPlausi', + 'fehlercode_extern' => null, + 'fehlertext' => 'Aufenthaltszweckcode ist %s (für Incomings ist nur Zweck 1, 2, 3 erlaubt)', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => null, + 'resolverLibName' => 'CORE_INOUT_0003', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_INOUT_0004', + 'fehler_kurzbz' => 'outgoingAufenthaltfoerderungfehltPlausi', + 'fehlercode_extern' => null, + 'fehlertext' => 'Keine Aufenthaltsfoerderung angegeben (bei Outgoings >= 29 Tage Monat im Ausland muss mind. 1 gemeldet werden)', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => null, + 'resolverLibName' => 'CORE_INOUT_0004', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_INOUT_0005', + 'fehler_kurzbz' => 'outgoingAngerechneteEctsFehlenPlausi', + 'fehlercode_extern' => null, + 'fehlertext' => 'Angerechnete ECTS fehlen (Meldepflicht bei Outgoings >= 29 Tage Monat im Ausland)', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => null, + 'resolverLibName' => 'CORE_INOUT_0005', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_INOUT_0006', + 'fehler_kurzbz' => 'outgoingErworbeneEctsFehlenPlausi', + 'fehlercode_extern' => null, + 'fehlertext' => 'Erworbene ECTS fehlen (Meldepflicht bei Outgoings >= 29 Tage Monat im Ausland)', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => null, + 'resolverLibName' => 'CORE_INOUT_0006', + 'producerIsResolver' => false + ), + + /** Plausichecks **/ + array( + 'fehlercode' => 'CORE_INOUT_0007', + 'fehler_kurzbz' => 'IncomingHeimatNationOesterreich', + 'fehlercode_extern' => null, + 'fehlertext' => 'Heimatnation bei Incoming Österreich', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => 'IncomingHeimatNationOesterreich', + 'resolverLibName' => 'CORE_INOUT_0007', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_INOUT_0008', + 'fehler_kurzbz' => 'IncomingOhneIoDatensatz', + 'fehlercode_extern' => null, + 'fehlertext' => 'Incoming hat keinen IO Datensatz (prestudent_id %s)', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => 'IncomingOhneIoDatensatz', + 'resolverLibName' => 'CORE_INOUT_0008', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_INOUT_0009', + 'fehler_kurzbz' => 'IncomingOrGsFoerderrelevant', + 'fehlercode_extern' => null, + 'fehlertext' => 'Incoming oder gemeinsames Studium ist nicht als nicht förderrelevant markiert. (prestudent_id %s)', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => 'IncomingOrGsFoerderrelevant', + 'resolverLibName' => 'CORE_INOUT_0009', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_STG_0001', + 'fehler_kurzbz' => 'StgPrestudentUngleichStgStudent', + 'fehlercode_extern' => null, + 'fehlertext' => 'Studiengang des Prestudenten ist ungleich dem Studiengang des Studenten. (prestudent_id %s)', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => 'StgPrestudentUngleichStgStudent', + 'resolverLibName' => 'CORE_STG_0001', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_STG_0002', + 'fehler_kurzbz' => 'OrgformStgUngleichOrgformPrestudent', + 'fehlercode_extern' => null, + 'fehlertext' => 'Es ist kein Studienplan mit Studiengang (%s) und Organisationsform (%s) des Studenten zugewiesen. (prestudent_id %s, Studiensemester %s)', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => 'OrgformStgUngleichOrgformPrestudent', + 'resolverLibName' => 'CORE_STG_0002', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_STG_0003', + 'fehler_kurzbz' => 'PrestudentMischformOhneOrgform', + 'fehlercode_extern' => null, + 'fehlertext' => 'Organisationsform ist für Studierenden/BewerberIn in Mischformstudiengang nicht eingetragen. (prestudent_id %s, Studiensemester %s)', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => 'PrestudentMischformOhneOrgform', + 'resolverLibName' => 'CORE_STG_0003', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_STG_0004', + 'fehler_kurzbz' => 'StgPrestudentUngleichStgStudienplan', + 'fehlercode_extern' => null, + 'fehlertext' => 'Studiengang des Prestudenten passt nicht zu Studiengang des Studienplans. (prestudent_id %s, Studienplan %s)', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => 'StgPrestudentUngleichStgStudienplan', + 'resolverLibName' => 'CORE_STG_0004', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_STUDENTSTATUS_0001', + 'fehler_kurzbz' => 'AbbrecherAktiv', + 'fehlercode_extern' => null, + 'fehlertext' => 'AbbrecherIn hat aktiven Benutzer. (prestudent_id %s)', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => 'AbbrecherAktiv', + 'resolverLibName' => null, + 'producerIsResolver' => true + ), + array( + 'fehlercode' => 'CORE_STUDENTSTATUS_0002', + 'fehler_kurzbz' => 'StudentstatusNachAbbrecher', + 'fehlercode_extern' => null, + 'fehlertext' => 'Aktiver Status nach Abbrecher Status. (prestudent_id %s)', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => 'StudentstatusNachAbbrecher', + 'resolverLibName' => 'CORE_STUDENTSTATUS_0002', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_STUDENTSTATUS_0003', + 'fehler_kurzbz' => 'AusbildungssemPrestudentUngleichAusbildungssemStatus', + 'fehlercode_extern' => null, + 'fehlertext' => 'Ausbildungssemester %s des aktuellen Status stimmt nicht mit Ausbildungssemester %s bei StudentIn (Lehrverband) überein. (student_uid %s, prestudent_id %s, Studiensemester %s)', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => 'AusbildungssemPrestudentUngleichAusbildungssemStatus', + 'resolverLibName' => 'CORE_STUDENTSTATUS_0003', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_STUDENTSTATUS_0004', + 'fehler_kurzbz' => 'InaktiverStudentAktiverStatus', + 'fehlercode_extern' => null, + 'fehlertext' => 'Inaktiver Benutzer hat aktiven Status. (prestudent_id %s)', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => 'InaktiverStudentAktiverStatus', + 'resolverLibName' => 'CORE_STUDENTSTATUS_0004', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_STUDENTSTATUS_0005', + 'fehler_kurzbz' => 'InskriptionVorLetzerBismeldung', + 'fehlercode_extern' => null, + 'fehlertext' => 'Datum der Inskription liegt vor dem Datum der letzten BIS-Meldung %s. (prestudent_id %s, Studiensemester %s)', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => 'InskriptionVorLetzerBismeldung', + 'resolverLibName' => 'CORE_STUDENTSTATUS_0005', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_STUDENTSTATUS_0006', + 'fehler_kurzbz' => 'DatumStudiensemesterFalscheReihenfolge', + 'fehlercode_extern' => null, + 'fehlertext' => 'Datum und Studiensemester sind bei den Status in falscher Reihenfolge. (prestudent_id %s)', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => 'DatumStudiensemesterFalscheReihenfolge', + 'resolverLibName' => 'CORE_STUDENTSTATUS_0006', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_STUDENTSTATUS_0007', + 'fehler_kurzbz' => 'AktiverStudentOhneStatus', + 'fehlercode_extern' => null, + 'fehlertext' => 'Aktive/r StudentIn ohne aktuellen Status (prestudent_id %s)', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => 'AktiverStudentOhneStatus', + 'resolverLibName' => 'CORE_STUDENTSTATUS_0007', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_STUDENTSTATUS_0008', + 'fehler_kurzbz' => 'StudienplanUngueltig', + 'fehlercode_extern' => null, + 'fehlertext' => 'Studienplan %s ist im Ausbildungssemester %s nicht gültig (prestudent_id %s)', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => 'StudienplanUngueltig', + 'resolverLibName' => 'CORE_STUDENTSTATUS_0008', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_STUDENTSTATUS_0009', + 'fehler_kurzbz' => 'FalscheAnzahlAbschlusspruefungen', + 'fehlercode_extern' => null, + 'fehlertext' => 'Mehrere oder keine bestandenen Abschlussprüfungen (prestudent_id %s)', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => 'FalscheAnzahlAbschlusspruefungen', + 'resolverLibName' => 'CORE_STUDENTSTATUS_0009', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_STUDENTSTATUS_0010', + 'fehler_kurzbz' => 'DatumAbschlusspruefungFehlt', + 'fehlercode_extern' => null, + 'fehlertext' => 'Kein Abschlussprüfung Datum (prestudent_id %s, abschlusspruefung_id %s)', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => 'DatumAbschlusspruefungFehlt', + 'resolverLibName' => 'CORE_STUDENTSTATUS_0010', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_STUDENTSTATUS_0011', + 'fehler_kurzbz' => 'DatumSponsionFehlt', + 'fehlercode_extern' => null, + 'fehlertext' => 'Kein Sponsionsdatum (prestudent_id %s, abschlusspruefung_id %s)', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => 'DatumSponsionFehlt', + 'resolverLibName' => 'CORE_STUDENTSTATUS_0011', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_STUDENTSTATUS_0012', + 'fehler_kurzbz' => 'BewerberNichtZumRtAngetreten', + 'fehlercode_extern' => null, + 'fehlertext' => 'Bewerber nicht zum Reihungstest angetreten (prestudent_id %s)', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => 'BewerberNichtZumRtAngetreten', + 'resolverLibName' => 'CORE_STUDENTSTATUS_0012', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_STUDENTSTATUS_0013', + 'fehler_kurzbz' => 'AktSemesterNull', + 'fehlercode_extern' => null, + 'fehlertext' => 'Aktuelles Ausbildungssemester ist 0 (prestudent_id %s, Studiensemester %s)', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => 'AktSemesterNull', + 'resolverLibName' => 'CORE_STUDENTSTATUS_0013', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_STUDENTSTATUS_0014', + 'fehler_kurzbz' => 'AbschlussstatusFehlt', + 'fehlercode_extern' => null, + 'fehlertext' => 'Kein Abschlussstatus (prestudent_id %s)', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => 'AbschlussstatusFehlt', + 'resolverLibName' => 'CORE_STUDENTSTATUS_0014', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_STUDENTSTATUS_0015', + 'fehler_kurzbz' => 'AktiverStudentstatusOhneKontobuchung', + 'fehlercode_extern' => null, + 'fehlertext' => 'Keine Kontobuchung bei aktivem Studentstatus (prestudent_id %s, Studiensemester %s)', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => 'AktiverStudentstatusOhneKontobuchung', + 'resolverLibName' => 'CORE_STUDENTSTATUS_0015', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_STUDENTSTATUS_0016', + 'fehler_kurzbz' => 'DualesStudiumOhneMarkierung', + 'fehlercode_extern' => null, + 'fehlertext' => 'StudentIn in dualem Studiengang nicht als dual markiert (prestudent_id %s, Studienplan %s)', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => 'DualesStudiumOhneMarkierung', + 'resolverLibName' => 'CORE_STUDENTSTATUS_0016', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_PERSON_0001', + 'fehler_kurzbz' => 'GbDatumWeitZurueck', + 'fehlercode_extern' => null, + 'fehlertext' => 'Geburtsdatum vor dem 01.01.1920', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => 'GbDatumWeitZurueck', + 'resolverLibName' => 'CORE_PERSON_0001', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_PERSON_0002', + 'fehler_kurzbz' => 'NationNichtOesterreichAberGemeinde', + 'fehlercode_extern' => null, + 'fehlertext' => 'Nation der Adresse ist ungleich Österreich, es ist aber eine österreichische Gemeinde (%s) angegeben (adresse_id %s)', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => 'NationNichtOesterreichAberGemeinde', + 'resolverLibName' => 'CORE_PERSON_0002', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_PERSON_0003', + 'fehler_kurzbz' => 'FalscheAnzahlHeimatadressen', + 'fehlercode_extern' => null, + 'fehlertext' => 'Es sind mehrere oder keine Heimatadressen eingetragen', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => 'FalscheAnzahlHeimatadressen', + 'resolverLibName' => 'CORE_PERSON_0003', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_PERSON_0004', + 'fehler_kurzbz' => 'FalscheAnzahlZustelladressen', + 'fehlercode_extern' => null, + 'fehlertext' => 'Es sind mehrere oder keine Zustelladressen eingetragen', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => 'FalscheAnzahlZustelladressen', + 'resolverLibName' => 'CORE_PERSON_0004', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_PERSON_0005', + 'fehler_kurzbz' => 'geburtsnationFehlt', + 'fehlercode_extern' => null, + 'fehlertext' => 'Geburtsnation nicht vorhanden', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => null, + 'resolverLibName' => 'CORE_PERSON_0005', + 'producerIsResolver' => false + ), + array( + 'fehlercode' => 'CORE_PERSON_0006', + 'fehler_kurzbz' => 'uhstatPersonkennungFehltCore', + 'fehlercode_extern' => null, + 'fehlertext' => 'Personkennung fehlt (vBpk AS, vBpk BF oder Ersatzkennzeichen fehlt)', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core', + 'producerLibName' => null, + 'resolverLibName' => 'CORE_PERSON_0006', + 'producerIsResolver' => false + ) +); diff --git a/application/controllers/api/frontend/v1/issues/IssueChecker.php b/application/controllers/api/frontend/v1/issues/IssueChecker.php index 4cd662029..d09a01af0 100644 --- a/application/controllers/api/frontend/v1/issues/IssueChecker.php +++ b/application/controllers/api/frontend/v1/issues/IssueChecker.php @@ -7,8 +7,7 @@ class IssueChecker extends FHCAPI_Controller protected $person_id; protected $_extensionName = null; - protected $_codeLibMappings = []; - protected $_codeProducerLibMappings = []; + protected $_fehlercodes = []; protected $_app = null; protected $errors = []; @@ -25,13 +24,40 @@ class IssueChecker extends FHCAPI_Controller { $this->terminateWithError("Issue Checker: permissions must be an array"); } - + $merged_permissions = array_merge($default_permissions, $permissions); - + parent::__construct($merged_permissions); $this->load->model('system/Issue_model', 'IssueModel'); + $this->load->model('system/Fehler_model', 'FehlerModel'); $this->load->model('person/Person_model', 'PersonModel'); + + // get fehler kurzbz from fehlercodes + $this->FehlerModel->addSelect('fehler_kurzbz'); + if (!isEmptyArray($this->_fehlercodes))$this->FehlerModel->db->where_in('tbl_fehler.fehlercode', $this->_fehlercodes); + $fehlerKurzbzRes = $this->FehlerModel->load(); + + if (isError($fehlerKurzbzRes)) $this->terminateWithError(getError($fehlerKurzbzRes), self::ERROR_TYPE_GENERAL); + + $fehlerKurzbz = hasData($fehlerKurzbzRes) ? array_column(getData($fehlerKurzbzRes), 'fehler_kurzbz') : []; + + // load producer and checker libraries with fehler kurbz and fehlercode list + $this->load->library( + 'issues/PlausicheckProducerLib', + array( + 'fehlerKurzbz' => $fehlerKurzbz + ), + 'PlausicheckProducerLib' + ); + + $this->load->library( + 'issues/PlausicheckResolverLib', + array( + 'fehlercodes' => $this->_fehlercodes + ), + 'PlausicheckResolverLib' + ); } public function checkPerson() @@ -47,32 +73,11 @@ class IssueChecker extends FHCAPI_Controller $persRes = $this->PersonModel->load($this->person_id); if (!hasData($persRes)) $this->terminateWithError('Person with id ' . $this->person_id . ' not found.', self::ERROR_TYPE_GENERAL); - $allCodeLibMappings = array_merge($this->_codeLibMappings, $this->_codeProducerLibMappings); - - $this->load->library( - 'issues/PlausicheckProducerLib', - array( - 'extensionName' => $this->_extensionName, - 'codeLibMappings' => $allCodeLibMappings - ), - 'PlausicheckProducerLib' - ); - - $this->load->library( - 'issues/PlausicheckResolverLib', - array( - 'extensionName' => $this->_extensionName, - 'codeLibMappings' => $this->_codeLibMappings, - 'codeProducerLibMappings' => $this->_codeProducerLibMappings - ), - 'PlausicheckResolverLib' - ); - $this->_produceIssues(); $this->_resolveIssues(); $this->_produceIssues(); - $openIssueCountRes = $this->_countOpenIssues(array_keys($allCodeLibMappings)); + $openIssueCountRes = $this->_countOpenIssues(); if (isError($openIssueCountRes)) $this->terminateWithError(getError($openIssueCountRes), self::ERROR_TYPE_GENERAL); $data = array( @@ -100,7 +105,7 @@ class IssueChecker extends FHCAPI_Controller if (!hasData($persRes)) $this->terminateWithError('Person with id ' . $this->person_id . ' not found.', self::ERROR_TYPE_GENERAL); - $openIssueCountRes = $this->_countOpenIssues(array_keys(array_merge($this->_codeLibMappings, $this->_codeProducerLibMappings))); + $openIssueCountRes = $this->_countOpenIssues(); if (isError($openIssueCountRes)) $this->terminateWithError(getError($openIssueCountRes), self::ERROR_TYPE_GENERAL); $data = array( @@ -114,13 +119,13 @@ class IssueChecker extends FHCAPI_Controller $this->terminateWithSuccess($data); } - protected function _countOpenIssues($fehlercodes) + protected function _countOpenIssues() { - if (isEmptyArray($fehlercodes)) return success([]); + if (isEmptyArray($this->_fehlercodes)) return success([]); // load open issues with given errorcodes $openIssuesRes = $this->IssueModel->getOpenIssues( - $fehlercodes, + $this->_fehlercodes, $this->person_id, $oe_kurzbz = null, $fehlercode_extern = null, @@ -138,10 +143,6 @@ class IssueChecker extends FHCAPI_Controller protected function _produceIssues() { - if (isEmptyArray($this->_codeLibMappings) && isEmptyArray($this->_codeProducerLibMappings)) return success([]); - - $allCodeLibMappings = array_merge($this->_codeLibMappings, $this->_codeProducerLibMappings); - $result = $this->PlausicheckProducerLib->producePlausicheckIssues( array('person_id' => $this->person_id) ); @@ -157,7 +158,7 @@ class IssueChecker extends FHCAPI_Controller { // load open issues with given errorcodes $openIssuesRes = $this->IssueModel->getOpenIssues( - array_keys(array_merge($this->_codeLibMappings, $this->_codeProducerLibMappings)), + $this->_fehlercodes, $this->person_id ); diff --git a/application/controllers/jobs/IssueResolver.php b/application/controllers/jobs/IssueResolver.php index fe7ee21f5..05befd0ba 100755 --- a/application/controllers/jobs/IssueResolver.php +++ b/application/controllers/jobs/IssueResolver.php @@ -5,58 +5,46 @@ */ class IssueResolver extends IssueResolver_Controller { - public function __construct() - { - parent::__construct(); - - // set fehler codes which can be resolved by the job, with own resolver defined - // structure: fehlercode => class (library) name for resolving in "resolvers" folder - $this->_codeLibMappings = array( - 'CORE_ZGV_0001' => 'CORE_ZGV_0001', - 'CORE_ZGV_0002' => 'CORE_ZGV_0002', - 'CORE_ZGV_0003' => 'CORE_ZGV_0003', - 'CORE_ZGV_0004' => 'CORE_ZGV_0004', - 'CORE_ZGV_0005' => 'CORE_ZGV_0005', - 'CORE_INOUT_0001' => 'CORE_INOUT_0001', - 'CORE_INOUT_0002' => 'CORE_INOUT_0002', - 'CORE_INOUT_0003' => 'CORE_INOUT_0003', - 'CORE_INOUT_0004' => 'CORE_INOUT_0004', - 'CORE_INOUT_0005' => 'CORE_INOUT_0005', - 'CORE_INOUT_0006' => 'CORE_INOUT_0006', - 'CORE_INOUT_0007' => 'CORE_INOUT_0007', - 'CORE_INOUT_0008' => 'CORE_INOUT_0008', - 'CORE_INOUT_0009' => 'CORE_INOUT_0009', - 'CORE_STG_0001' => 'CORE_STG_0001', - 'CORE_STG_0002' => 'CORE_STG_0002', - 'CORE_STG_0003' => 'CORE_STG_0003', - 'CORE_STG_0004' => 'CORE_STG_0004', - 'CORE_STUDENTSTATUS_0002' => 'CORE_STUDENTSTATUS_0002', - 'CORE_STUDENTSTATUS_0003' => 'CORE_STUDENTSTATUS_0003', - 'CORE_STUDENTSTATUS_0004' => 'CORE_STUDENTSTATUS_0004', - 'CORE_STUDENTSTATUS_0005' => 'CORE_STUDENTSTATUS_0005', - 'CORE_STUDENTSTATUS_0006' => 'CORE_STUDENTSTATUS_0006', - 'CORE_STUDENTSTATUS_0007' => 'CORE_STUDENTSTATUS_0007', - 'CORE_STUDENTSTATUS_0008' => 'CORE_STUDENTSTATUS_0008', - 'CORE_STUDENTSTATUS_0009' => 'CORE_STUDENTSTATUS_0009', - 'CORE_STUDENTSTATUS_0010' => 'CORE_STUDENTSTATUS_0010', - 'CORE_STUDENTSTATUS_0011' => 'CORE_STUDENTSTATUS_0011', - 'CORE_STUDENTSTATUS_0012' => 'CORE_STUDENTSTATUS_0012', - 'CORE_STUDENTSTATUS_0013' => 'CORE_STUDENTSTATUS_0013', - 'CORE_STUDENTSTATUS_0014' => 'CORE_STUDENTSTATUS_0014', - 'CORE_STUDENTSTATUS_0015' => 'CORE_STUDENTSTATUS_0015', - 'CORE_STUDENTSTATUS_0016' => 'CORE_STUDENTSTATUS_0016', - 'CORE_PERSON_0001' => 'CORE_PERSON_0001', - 'CORE_PERSON_0002' => 'CORE_PERSON_0002', - 'CORE_PERSON_0003' => 'CORE_PERSON_0003', - 'CORE_PERSON_0004' => 'CORE_PERSON_0004', - 'CORE_PERSON_0005' => 'CORE_PERSON_0005', - 'CORE_PERSON_0006' => 'CORE_PERSON_0006' - ); - - // fehler which are resolved by the job the same way as they are produced - // structure: fehlercode => class (library) name for resolving in "plausichecks" folder - $this->_codeProducerLibMappings = array( - 'CORE_STUDENTSTATUS_0001' => 'AbbrecherAktiv', - ); - } + protected $_fehlercodes = array( + 'CORE_ZGV_0001', + 'CORE_ZGV_0002', + 'CORE_ZGV_0003', + 'CORE_ZGV_0004', + 'CORE_ZGV_0005', + 'CORE_INOUT_0001', + 'CORE_INOUT_0002', + 'CORE_INOUT_0003', + 'CORE_INOUT_0004', + 'CORE_INOUT_0005', + 'CORE_INOUT_0006', + 'CORE_INOUT_0007', + 'CORE_INOUT_0008', + 'CORE_INOUT_0009', + 'CORE_STG_0001', + 'CORE_STG_0002', + 'CORE_STG_0003', + 'CORE_STG_0004', + 'CORE_STUDENTSTATUS_0001', + 'CORE_STUDENTSTATUS_0002', + 'CORE_STUDENTSTATUS_0003', + 'CORE_STUDENTSTATUS_0004', + 'CORE_STUDENTSTATUS_0005', + 'CORE_STUDENTSTATUS_0006', + 'CORE_STUDENTSTATUS_0007', + 'CORE_STUDENTSTATUS_0008', + 'CORE_STUDENTSTATUS_0009', + 'CORE_STUDENTSTATUS_0010', + 'CORE_STUDENTSTATUS_0011', + 'CORE_STUDENTSTATUS_0012', + 'CORE_STUDENTSTATUS_0013', + 'CORE_STUDENTSTATUS_0014', + 'CORE_STUDENTSTATUS_0015', + 'CORE_STUDENTSTATUS_0016', + 'CORE_PERSON_0001', + 'CORE_PERSON_0002', + 'CORE_PERSON_0003', + 'CORE_PERSON_0004', + 'CORE_PERSON_0005', + 'CORE_PERSON_0006' + ); } diff --git a/application/controllers/jobs/PlausiIssueProducer.php b/application/controllers/jobs/PlausiIssueProducer.php index 77d4518ff..e41b887c5 100644 --- a/application/controllers/jobs/PlausiIssueProducer.php +++ b/application/controllers/jobs/PlausiIssueProducer.php @@ -6,7 +6,7 @@ class PlausiIssueProducer extends PlausiIssueProducer_Controller { private $_currentStudiensemester; - protected $_app = 'core'; + protected $_apps = 'core'; public function __construct() { @@ -23,7 +23,7 @@ class PlausiIssueProducer extends PlausiIssueProducer_Controller // set fehler which can be produced by the job // structure: fehler_kurzbz => class (library) name for resolving - $this->_fehlerLibMappings = $this->plausicheckdefinitionlib->getFehlerLibMappings(); + $this->_fehlerKurzbz = $this->plausicheckdefinitionlib->getFehlerKurzbz(); } /** diff --git a/application/controllers/system/issues/Plausichecks.php b/application/controllers/system/issues/Plausichecks.php index 53ff8afe8..eb0d01e9e 100644 --- a/application/controllers/system/issues/Plausichecks.php +++ b/application/controllers/system/issues/Plausichecks.php @@ -16,7 +16,7 @@ class Plausichecks extends Auth_Controller ); // Load libraries - $this->load->library('issues/PlausicheckProducerLib', array('app' => 'core')); + $this->load->library('issues/PlausicheckProducerLib', array('apps' => 'core')); $this->load->library('issues/PlausicheckDefinitionLib'); $this->load->library('WidgetLib'); @@ -46,9 +46,10 @@ class Plausichecks extends Auth_Controller // issues array for passing issue texts $allIssues = array(); + // all fehler kurzbz which are going to be checked $fehlerKurzbz = !isEmptyString($fehler_kurzbz) ? array($fehler_kurzbz) : $this->plausicheckdefinitionlib->getFehlerKurzbz(); - $fehlerLibMappings = $this->plausicheckdefinitionlib->getFehlerLibMappings(); + // set Studiengang to null if not passed if (isEmptyString($studiengang_kz)) $studiengang_kz = null; @@ -70,12 +71,8 @@ class Plausichecks extends Auth_Controller // 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 $plausicheckRes = $this->plausicheckproducerlib->producePlausicheckIssue( - $libName, $fehler_kurzbz, array( 'studiensemester_kurzbz' => $studiensemester_kurzbz, diff --git a/application/core/IssueResolver_Controller.php b/application/core/IssueResolver_Controller.php index ea278ddb0..0ddf31fbd 100755 --- a/application/core/IssueResolver_Controller.php +++ b/application/core/IssueResolver_Controller.php @@ -5,11 +5,8 @@ */ abstract class IssueResolver_Controller extends JOB_Controller { - // mappings in form fehlercode -> resolverlibrary name, fehler which have explicit resolver class defined - protected $_codeLibMappings = []; - - // mappings in form fehlercode -> producer library name, fehler which are resolved the same way they are produced - protected $_codeProducerLibMappings = []; + // codes of fehler to be resolved + protected $fehlercodes = []; public function __construct() { @@ -27,9 +24,7 @@ abstract class IssueResolver_Controller extends JOB_Controller $this->load->library( 'issues/PlausicheckResolverLib', [ - 'extensionName' => $this->_extensionName ?? null, - 'codeLibMappings' => $this->_codeLibMappings, - 'codeProducerLibMappings' => $this->_codeProducerLibMappings + 'fehlercodes' => $this->_fehlercodes ] ); @@ -37,7 +32,7 @@ abstract class IssueResolver_Controller extends JOB_Controller // load open issues with given errorcodes $openIssuesRes = $this->IssueModel->getOpenIssues( - array_merge(array_keys($this->_codeLibMappings), array_keys($this->_codeProducerLibMappings)) + $this->_fehlercodes ); $openIssues = hasData($openIssuesRes) ? getData($openIssuesRes) : []; diff --git a/application/core/PlausiIssueProducer_Controller.php b/application/core/PlausiIssueProducer_Controller.php index 5216d284c..6004a3e0e 100644 --- a/application/core/PlausiIssueProducer_Controller.php +++ b/application/core/PlausiIssueProducer_Controller.php @@ -5,14 +5,14 @@ */ abstract class PlausiIssueProducer_Controller extends JOB_Controller { - protected $_fehlerLibMappings = []; - protected $_app; + protected $_fehlerKurzbz = []; + protected $_apps; protected function producePlausicheckIssues($params) { $this->load->library( 'issues/PlausicheckProducerLib', - ['extensionName' => $this->_extensionName ?? null, 'app' => $this->_app, 'fehlerLibMappings' => $this->_fehlerLibMappings] + ['apps' => $this->_apps, 'fehlerKurzbz' => $this->_fehlerKurzbz] ); $this->logInfo("Plausicheck issue producer job started"); diff --git a/application/libraries/issues/PlausicheckDefinitionLib.php b/application/libraries/issues/PlausicheckDefinitionLib.php index d8c26d43a..d760fbc7d 100644 --- a/application/libraries/issues/PlausicheckDefinitionLib.php +++ b/application/libraries/issues/PlausicheckDefinitionLib.php @@ -9,48 +9,40 @@ class PlausicheckDefinitionLib { // set fehler for core plausichecks // structure: fehler_kurzbz => class (library) name for resolving - private $_fehlerLibMappings = array( - 'AbbrecherAktiv' => 'AbbrecherAktiv', - 'AbschlussstatusFehlt' => 'AbschlussstatusFehlt', - 'AktSemesterNull' => 'AktSemesterNull', - 'AktiverStudentOhneStatus' => 'AktiverStudentOhneStatus', - 'AusbildungssemPrestudentUngleichAusbildungssemStatus' => 'AusbildungssemPrestudentUngleichAusbildungssemStatus', - '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', + private $_fehlerKurzbz = array( + 'AbbrecherAktiv', + 'AbschlussstatusFehlt', + 'AktSemesterNull', + 'AktiverStudentOhneStatus', + 'AusbildungssemPrestudentUngleichAusbildungssemStatus', + 'DatumAbschlusspruefungFehlt', + 'DatumSponsionFehlt', + 'DatumStudiensemesterFalscheReihenfolge', + 'FalscheAnzahlAbschlusspruefungen', + 'FalscheAnzahlHeimatadressen', + 'FalscheAnzahlZustelladressen', + 'GbDatumWeitZurueck', + 'InaktiverStudentAktiverStatus', + 'IncomingHeimatNationOesterreich', + 'IncomingOhneIoDatensatz', + 'IncomingOrGsFoerderrelevant', + 'InskriptionVorLetzerBismeldung', + 'NationNichtOesterreichAberGemeinde', + 'OrgformStgUngleichOrgformPrestudent', + 'PrestudentMischformOhneOrgform', + 'StgPrestudentUngleichStgStudienplan', + 'StgPrestudentUngleichStgStudent', + 'StudentstatusNachAbbrecher', 'DualesStudiumOhneMarkierung' => 'DualesStudiumOhneMarkierung' - //'StudienplanUngueltig' => 'StudienplanUngueltig' - //'BewerberNichtZumRtAngetreten' => 'BewerberNichtZumRtAngetreten' + //'StudienplanUngueltig', + //'BewerberNichtZumRtAngetreten' ); - /** - * Gets all fehler_kurzbz-library mappings for fehler which need to be checked. - */ - public function getFehlerLibMappings() - { - return $this->_fehlerLibMappings; - } - /** * Gets all fehler_kurzbz for fehler which need to be checked. */ public function getFehlerKurzbz() { - return array_keys($this->_fehlerLibMappings); + return $this->_fehlerKurzbz; } } diff --git a/application/libraries/issues/PlausicheckProducerLib.php b/application/libraries/issues/PlausicheckProducerLib.php index cea9967fb..da332d83d 100644 --- a/application/libraries/issues/PlausicheckProducerLib.php +++ b/application/libraries/issues/PlausicheckProducerLib.php @@ -9,33 +9,41 @@ class PlausicheckProducerLib const EXTENSIONS_FOLDER = 'extensions'; const PLAUSI_ISSUES_FOLDER = 'issues/plausichecks'; const EXECUTE_PLAUSI_CHECK_METHOD_NAME = 'executePlausiCheck'; + const CONFIG_FEHLER_FILENAME = 'fehler.php'; + const CONFIG_FEHLER_NAME = 'fehler'; + const FEHLER_KURZBZ_NAME = 'fehler_kurzbz'; + const PRODUCER_LIB_NAME = 'producerLibName'; + const EXTENSION_NAME = 'extensionName'; private $_ci; // ci instance - private $_extensionName; // name of extension private $_konfiguration = []; // configuration parameters + private $_fehlerKurzbz = []; // fehler to produce private $_fehlerLibMappings = []; // mappings of fehler and libraries for producing them - private $_isForResolutionCheck = false; // mappings of fehler and libraries for producing them + private $_apps = []; // apps of fehler to produce public function __construct($params = null) { - // set extension name if called from extension - if (isset($params['extensionName'])) $this->_extensionName = $params['extensionName']; - if (isset($params['fehlerLibMappings'])) $this->_fehlerLibMappings = $params['fehlerLibMappings']; - if (isset($params['isForResolutionCheck'])) $this->_isForResolutionCheck = $params['isForResolutionCheck']; - - // set application - $app = isset($params['app']) ? $params['app'] : null; + // set application(s)) + if (isset($params['apps'])) + { + if (is_string($params['apps'])) $params['apps'] = [$params['apps']]; + if (is_array($params['apps'])) $this->_apps = $params['apps']; + } $this->_ci =& get_instance(); // get ci instance // load libraries $this->_ci->load->library('IssuesLib'); + $this->_ci->load->library('ExtensionsLib'); // load models + $this->_ci->load->model('system/Fehler_model', 'FehlerModel'); $this->_ci->load->model('system/Fehlerkonfiguration_model', 'FehlerkonfigurationModel'); - // get all configuration parameters for the application - $fehlerkonfigurationRes = $this->_ci->FehlerkonfigurationModel->getKonfiguration($app); + $this->_ci->load->config('fehler'); + + // get all configuration parameters for the application(s)) + $fehlerkonfigurationRes = $this->_ci->FehlerkonfigurationModel->getKonfiguration($this->_apps); if (hasData($fehlerkonfigurationRes)) { @@ -46,10 +54,86 @@ class PlausicheckProducerLib $this->_konfiguration[$fk->fehler_kurzbz][$fk->konfigurationstyp_kurzbz] = $fk->konfiguration; } } + + // get all fehler to be produced (by kurzbz array or app) + if (isset($params['fehlerKurzbz']) && !isEmptyArray($params['fehlerKurzbz'])) + { + $this->_fehlerKurzbz = $params['fehlerKurzbz']; + } + else + { + $this->_ci->FehlerModel->addSelect('fehler_kurzbz'); + if (!isEmptyArray($this->_apps)) $this->_ci->FehlerModel->db->where_in('app', $this->_apps); + $fehlerRes = $this->_ci->FehlerModel->load(); + + if (hasData($fehlerRes)) + { + $this->_fehlerKurzbz = array_column(getData($fehlerRes), 'fehler_kurzbz'); + } + } + + // get producer file paths for the fehler + + // Load Fehler Entries of Core + $configArray = $this->_ci->config->item(self::CONFIG_FEHLER_NAME); + + foreach ($configArray as $coreEntry) + { + if (!isset($coreEntry[self::FEHLER_KURZBZ_NAME]) + || !isset($coreEntry[self::PRODUCER_LIB_NAME]) + || !in_array($coreEntry[self::FEHLER_KURZBZ_NAME], $this->_fehlerKurzbz) + ) { + continue; + } + + $this->_fehlerLibMappings[$coreEntry[self::FEHLER_KURZBZ_NAME]][self::PRODUCER_LIB_NAME] = $coreEntry[self::PRODUCER_LIB_NAME]; + } + + // load fehler entries of extensions + $extensions = $this->_ci->extensionslib->getInstalledExtensions(); + + if (hasData($extensions)) + { + $extensionArray = array(); + + $extensionsData = getData($extensions); + + + foreach ($extensionsData as $ext) + { + $configFilename = APPPATH.'config/'.ExtensionsLib::EXTENSIONS_DIR_NAME.'/'.$ext->name.'/'.self::CONFIG_FEHLER_FILENAME; + + if (file_exists($configFilename)) + { + $config = array(); // default value + + include($configFilename); + + if (isset($config[self::CONFIG_FEHLER_NAME]) && is_array($config[self::CONFIG_FEHLER_NAME])) + { + foreach ($config[self::CONFIG_FEHLER_NAME] as $extensionEntry) + { + if ( + !isset($extensionEntry[self::FEHLER_KURZBZ_NAME]) + || !isset($extensionEntry[self::PRODUCER_LIB_NAME]) + || !in_array($extensionEntry[self::FEHLER_KURZBZ_NAME], $this->_fehlerKurzbz) + ) { + continue; + } + + $fehler_kurzbz = $extensionEntry[self::FEHLER_KURZBZ_NAME]; + + $this->_fehlerLibMappings[$fehler_kurzbz][self::PRODUCER_LIB_NAME] = $extensionEntry[self::PRODUCER_LIB_NAME]; + $this->_fehlerLibMappings[$fehler_kurzbz][self::EXTENSION_NAME] = $ext->name; + } + } + } + } + } } /** - * Produces multiple plausicheck issues at once and saved them to db. + * Produces multiple plausicheck issues at once, and saves them in the database. * @param array $params passed to each plausicheck * @return result object with occured error and info */ @@ -58,11 +142,17 @@ class PlausicheckProducerLib $result = new StdClass(); $result->errors = []; $result->infos = []; + $mappingFehlerKurbz = array_keys($this->_fehlerLibMappings); - foreach ($this->_fehlerLibMappings as $fehler_kurzbz => $libName) + // check if all issues to produce could be found in database + $notFoundFehlerKurzbz = array_diff($this->_fehlerKurzbz, $mappingFehlerKurbz); + + if (!isEmptyArray($notFoundFehlerKurzbz)) + $result->errors[] = error('Fehler to produce not defined in config: '.implode(', ', $notFoundFehlerKurzbz)); + + foreach ($mappingFehlerKurbz as $fehler_kurzbz) { $plausicheckRes = $this->producePlausicheckIssue( - $libName, $fehler_kurzbz, $params ); @@ -96,14 +186,22 @@ class PlausicheckProducerLib /** * Executes plausicheck using a given library, returns the result. - * @param $libName string name of library producing the issue * @param $fehler_kurzbz string unique short name of fehler, for which issue is produced * @param $params parameters passed to issue production method */ - public function producePlausicheckIssue($libName, $fehler_kurzbz, $params) + public function producePlausicheckIssue($fehler_kurzbz, $params) { + if (!isset($this->_fehlerLibMappings[$fehler_kurzbz])) return error("Mapping for Fehler " . $fehler_kurzbz . " was not found"); + + $mapping = $this->_fehlerLibMappings[$fehler_kurzbz]; + + if (!isset($mapping[self::PRODUCER_LIB_NAME]) || isEmptyString($mapping[self::PRODUCER_LIB_NAME])) + return error("No producer lib name set for Fehler " . $fehler_kurzbz); + + $libName = $mapping[self::PRODUCER_LIB_NAME]; + // if called from extension (extension name set), path includes extension names - $libRootPath = isset($this->_extensionName) ? self::EXTENSIONS_FOLDER . '/' . $this->_extensionName . '/' : ''; + $libRootPath = isset($mapping[self::EXTENSION_NAME]) ? self::EXTENSIONS_FOLDER . '/' . $mapping[self::EXTENSION_NAME] . '/' : ''; // path for loading issue library $issuesLibPath = $libRootPath . self::PLAUSI_ISSUES_FOLDER . '/'; @@ -121,7 +219,7 @@ class PlausicheckProducerLib // load library connected to fehlercode $this->_ci->load->library( $issuesLibPath . $libName, - ['configurationParams' => $config, 'isForResolutionCheck' => $this->_isForResolutionCheck] + ['configurationParams' => $config] ); $lowercaseLibName = mb_strtolower($libName); diff --git a/application/libraries/issues/PlausicheckResolverLib.php b/application/libraries/issues/PlausicheckResolverLib.php index 2b20a7d93..bbbd79203 100644 --- a/application/libraries/issues/PlausicheckResolverLib.php +++ b/application/libraries/issues/PlausicheckResolverLib.php @@ -9,28 +9,106 @@ class PlausicheckResolverLib const EXTENSIONS_FOLDER = 'extensions'; const ISSUE_RESOLVERS_FOLDER = 'issues/resolvers'; const CHECK_ISSUE_RESOLVED_METHOD_NAME = 'checkIfIssueIsResolved'; + const CONFIG_FEHLER_FILENAME = 'fehler.php'; + const CONFIG_FEHLER_NAME = 'fehler'; + const FEHLERCODE_NAME = 'fehlercode'; + const FEHLER_KURZBZ_NAME = 'fehler_kurzbz'; + const RESOLVER_LIB_NAME = 'resolverLibName'; + const PRODUCER_IS_RESOLVER_NAME = 'producerIsResolver'; + const EXTENSION_NAME = 'extensionName'; + private $_ci; // ci instance private $_extensionName; // name of extension + private $_fehlercodes = []; // name of extension private $_codeLibMappings = []; // mappings for issues which explicitly defined resolver - private $_codeProducerLibMappings = []; // mappings for issues which are resolved with the same check as they are produced + private $_defaultIssueParams = ['issue_id' => 'issue_id', 'issue_person_id' => 'person_id', 'issue_oe_kurzbz' => 'oe_kurzbz']; public function __construct($params = null) { - // set extension name if called from extension - if (isset($params['extensionName'])) $this->_extensionName = $params['extensionName']; - if (isset($params['codeLibMappings'])) $this->_codeLibMappings = $params['codeLibMappings']; - if (isset($params['codeProducerLibMappings'])) $this->_codeProducerLibMappings = $params['codeProducerLibMappings']; + // get all fehler to be produced (by kurzbz array or app) + if (isset($params['fehlercodes']) && !isEmptyArray($params['fehlercodes'])) + { + $this->_fehlercodes = $params['fehlercodes']; + } $this->_ci =& get_instance(); // get ci instance $this->_ci->load->library('IssuesLib'); - $this->_ci->load->library('issues/PlausicheckProducerLib', ['extensionName' => $this->_extensionName, 'isForResolutionCheck' => true]); + $this->_ci->load->library('ExtensionsLib'); + + $this->_ci->load->config('fehler'); + + // Load Fehler Entries of Core + $configArray = $this->_ci->config->item(self::CONFIG_FEHLER_NAME); + + $fehlerKurzbzArr = []; + + foreach ($configArray as $coreEntry) + { + if (!isset($coreEntry[self::FEHLERCODE_NAME]) + || !in_array($coreEntry[self::FEHLERCODE_NAME], $this->_fehlercodes) + ) { + continue; + } + + if (isset($coreEntry[self::FEHLER_KURZBZ_NAME])) $fehlerKurzbzArr[] = $coreEntry[self::FEHLER_KURZBZ_NAME]; + + $this->_codeLibMappings[$coreEntry[self::FEHLERCODE_NAME]][self::RESOLVER_LIB_NAME] = $coreEntry[self::RESOLVER_LIB_NAME] ?? null; + $this->_codeLibMappings[$coreEntry[self::FEHLERCODE_NAME]][self::PRODUCER_IS_RESOLVER_NAME] + = $coreEntry[self::PRODUCER_IS_RESOLVER_NAME] ?? false; + } + + // load fehler entries of extensions + $extensions = $this->_ci->extensionslib->getInstalledExtensions(); + + if (hasData($extensions)) + { + $extensionArray = array(); + + $extensionsData = getData($extensions); + + foreach ($extensionsData as $ext) + { + $configFilename = APPPATH.'config/'.ExtensionsLib::EXTENSIONS_DIR_NAME.'/'.$ext->name.'/'.self::CONFIG_FEHLER_FILENAME; + + if (file_exists($configFilename)) + { + $config = array(); // default value + + include($configFilename); + + if (isset($config[self::CONFIG_FEHLER_NAME]) && is_array($config[self::CONFIG_FEHLER_NAME])) + { + foreach ($config[self::CONFIG_FEHLER_NAME] as $extensionEntry) + { + if ( + !isset($extensionEntry[self::FEHLERCODE_NAME]) + || !in_array($extensionEntry[self::FEHLERCODE_NAME], $this->_fehlercodes) + ) { + continue; + } + + $fehlercode = $extensionEntry[self::FEHLERCODE_NAME]; + if (isset($extensionEntry[self::FEHLER_KURZBZ_NAME])) $fehlerKurzbzArr[] = $extensionEntry[self::FEHLER_KURZBZ_NAME]; + + $this->_codeLibMappings[$fehlercode][self::RESOLVER_LIB_NAME] + = $extensionEntry[self::RESOLVER_LIB_NAME] ?? null; + $this->_codeLibMappings[$fehlercode][self::EXTENSION_NAME] = $ext->name; + $this->_codeLibMappings[$fehlercode][self::PRODUCER_IS_RESOLVER_NAME] + = $extensionEntry[self::PRODUCER_IS_RESOLVER_NAME] ?? false; + + } + } + } + } + } + + $this->_ci->load->library('issues/PlausicheckProducerLib', ['fehlerKurzbz' => $fehlerKurzbzArr]); } /** * Reseolves multiple plausicheck issues at once. - * @param array $codeLibMappings contains fehler type to check and library responsible for check (fehlercode => libName) * @param array $openIssues passed issues to resolve * @return result object with occured error and info */ @@ -40,12 +118,25 @@ class PlausicheckResolverLib $result->errors = []; $result->infos = []; + // check if all issues to resolve could be found in database + $mappingFehlerCodes = array_keys($this->_codeLibMappings); + $notFoundFehlerCodes = array_diff($this->_fehlercodes, $mappingFehlerCodes); + + if (!isEmptyArray($notFoundFehlerCodes)) + $result->errors[] = error('Fehler to resolve not defined in config: '.implode(', ', $notFoundFehlerCodes)); + foreach ($openIssues as $issue) { + $params = []; + foreach ($this->_defaultIssueParams as $index => $propertyName) + { + $params[$index] = $issue->{$propertyName}; + } + // add person id and oe kurzbz automatically as params, merge it with additional params // decode bewerbung_parameter into assoc array $params = array_merge( - array('issue_id' => $issue->issue_id, 'issue_person_id' => $issue->person_id, 'issue_oe_kurzbz' => $issue->oe_kurzbz), + $params, isset($issue->behebung_parameter) ? json_decode($issue->behebung_parameter, true) : array() ); @@ -54,69 +145,72 @@ class PlausicheckResolverLib // ignore if Fehlercode is not in libmappings (shouldn't be checked) if (isset($this->_codeLibMappings[$issue->fehlercode])) { - $libName = $this->_codeLibMappings[$issue->fehlercode]; + $codeLibMapping = $this->_codeLibMappings[$issue->fehlercode]; + $libName = $codeLibMapping[self::RESOLVER_LIB_NAME]; + $extensionName = $codeLibMapping[self::EXTENSION_NAME] ?? null; + $producerIsResolver = $codeLibMapping[self::PRODUCER_IS_RESOLVER_NAME] ?? false; - // if called from extension (extension name set), path includes extension names - $libRootPath = isset($this->_extensionName) ? self::EXTENSIONS_FOLDER . '/' . $this->_extensionName . '/' : ''; - - // path for loading issue library - $issuesLibPath = $libRootPath . self::ISSUE_RESOLVERS_FOLDER . '/'; - - // file path of library for check if file exists - $issuesLibFilePath = DOC_ROOT . self::CI_PATH - . '/' . $libRootPath . self::CI_LIBRARY_FOLDER . '/' . self::ISSUE_RESOLVERS_FOLDER . '/' . $libName . '.php'; - - // check if library file exists - if (!file_exists($issuesLibFilePath)) + if ($producerIsResolver) { - // log error and continue with next issue if not - $result->errors[] = "Issue library file " . $issuesLibFilePath . " does not exist"; - continue; - } + // execute same check as used for issue production + $issueResolvedRes = $this->_ci->plausicheckproducerlib->producePlausicheckIssue( + $issue->fehler_kurzbz, + $params + ); - // load library connected to fehlercode - $this->_ci->load->library($issuesLibPath . $libName); - - $lowercaseLibName = mb_strtolower($libName); - - // check if method is defined in library class - if (!is_callable(array($this->_ci->{$lowercaseLibName}, self::CHECK_ISSUE_RESOLVED_METHOD_NAME))) - { - // log error and continue with next issue if not - $result->errors[] = "Method " . self::CHECK_ISSUE_RESOLVED_METHOD_NAME . " is not defined in library $lowercaseLibName"; - continue; - } - - // call the function for checking for issue resolution - $issueResolvedRes = $this->_ci->{$lowercaseLibName}->{self::CHECK_ISSUE_RESOLVED_METHOD_NAME}($params); - - if (isError($issueResolvedRes)) - { - $result->errors[] = getError($issueResolvedRes); + if (isError($issueResolvedRes)) + { + $result->errors[] = getError($issueResolvedRes); + } + else + { + $issueResolved = !hasData($issueResolvedRes); + } } else { - $issueResolved = getData($issueResolvedRes) === true; - } - } - elseif (isset($this->_codeProducerLibMappings[$issue->fehlercode])) // check if it is an issue without explicit resolver, "self-resolving" - { - $libName = $this->_codeProducerLibMappings[$issue->fehlercode]; + // if called from extension (extension name set), path includes extension names + $libRootPath = isset($extensionName) ? self::EXTENSIONS_FOLDER . '/' . $extensionName . '/' : ''; - // execute same check as used for issue production - $issueResolvedRes = $this->_ci->plausicheckproducerlib->producePlausicheckIssue( - $libName, - $issue->fehler_kurzbz, - $params - ); + // path for loading issue library + $issuesLibPath = $libRootPath . self::ISSUE_RESOLVERS_FOLDER . '/'; - if (isError($issueResolvedRes)) - { - $result->errors[] = getError($issueResolvedRes); - } - else - { - $issueResolved = !hasData($issueResolvedRes); + // file path of library for check if file exists + $issuesLibFilePath = DOC_ROOT . self::CI_PATH + . '/' . $libRootPath . self::CI_LIBRARY_FOLDER . '/' . self::ISSUE_RESOLVERS_FOLDER . '/' . $libName . '.php'; + + // check if library file exists + if (!file_exists($issuesLibFilePath)) + { + // log error and continue with next issue if not + $result->errors[] = "Issue library file " . $issuesLibFilePath . " does not exist"; + continue; + } + + // load library connected to fehlercode + $this->_ci->load->library($issuesLibPath . $libName); + + $lowercaseLibName = mb_strtolower($libName); + + // check if method is defined in library class + if (!is_callable(array($this->_ci->{$lowercaseLibName}, self::CHECK_ISSUE_RESOLVED_METHOD_NAME))) + { + // log error and continue with next issue if not + $result->errors[] = "Method " . self::CHECK_ISSUE_RESOLVED_METHOD_NAME . " is not defined in library $lowercaseLibName"; + continue; + } + + // call the function for checking for issue resolution + $issueResolvedRes = $this->_ci->{$lowercaseLibName}->{self::CHECK_ISSUE_RESOLVED_METHOD_NAME}($params); + + if (isError($issueResolvedRes)) + { + $result->errors[] = getError($issueResolvedRes); + } + else + { + $issueResolved = getData($issueResolvedRes) === true; + } } } diff --git a/application/libraries/issues/plausichecks/PlausiChecker.php b/application/libraries/issues/plausichecks/PlausiChecker.php index 7e5fe7db0..ccc999874 100644 --- a/application/libraries/issues/plausichecks/PlausiChecker.php +++ b/application/libraries/issues/plausichecks/PlausiChecker.php @@ -5,12 +5,12 @@ */ abstract class PlausiChecker { + const ISSUE_ID_NAME = 'issue_id'; + protected $_ci; // code igniter instance protected $_config; // all applicable configuration parameters for this plausicheck protected $_db; // database for queries - protected $_isForResolutionCheck; // if true, additional parameters only needed for resolution are checked - protected $_config_params = []; // name of all config params which should be applied for this plausicheck, with sql [name] => [sql] protected $_params_for_checking = []; // name of all passed params for checking, with sql [name] => [sql] @@ -24,8 +24,6 @@ abstract class PlausiChecker // set configuration $this->_config = $params['configurationParams'] ?? []; - $this->_isForResolutionCheck = $params['isForResolutionCheck'] ?? false; - // get database for queries $this->_db = new DB_Model(); } @@ -41,15 +39,20 @@ abstract class PlausiChecker $params = []; $qry = $this->_base_sql; - if ($this->_isForResolutionCheck == true) + // if issue id is set, issue is resolving - check if behebung parameter are present + if (isset($paramsForChecking[self::ISSUE_ID_NAME])) { foreach ($this->_resolution_params as $resParam) { if (!isset($paramsForChecking[$resParam])) - return error("$resParam missing".(isset($paramsForChecking['issue_id']) ? ", issue ID: ".$paramsForChecking['issue_id'] : "")); + return error("$resParam missing" + .(isset($paramsForChecking[self::ISSUE_ID_NAME]) ? ", issue ID: ".$paramsForChecking[self::ISSUE_ID_NAME] : "")); } } + // get fehlertext and resolution params + + // add config params to query if (isset($this->_config_params) && !isEmptyArray($this->_config_params)) { diff --git a/application/models/system/Fehlerkonfiguration_model.php b/application/models/system/Fehlerkonfiguration_model.php index bf8de4cde..442c8212f 100644 --- a/application/models/system/Fehlerkonfiguration_model.php +++ b/application/models/system/Fehlerkonfiguration_model.php @@ -18,14 +18,16 @@ class Fehlerkonfiguration_model extends DB_Model * @param string $app * @return object success or error */ - public function getKonfiguration($app = null) + public function getKonfiguration($apps = null) { $fehlerkonfiguration = array(); + $apps = is_string($apps) ? [$apps] : $apps; $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 (is_array($apps) && !isEmptyArray($apps)) $this->db->where_in('fehler.app', $apps); + $fehlerkonfigurationRes = $this->load(); if (isError($fehlerkonfigurationRes)) return $fehlerkonfigurationRes; From 4b8b3c90fbadea3895c6f96a3d2ddd7e9e361476 Mon Sep 17 00:00:00 2001 From: Alexei Karpenko Date: Wed, 14 Jan 2026 16:15:33 +0100 Subject: [PATCH 09/32] plausicheck resolver: by default, all issues for fehlercodes provided in constructor are resolved --- application/core/IssueResolver_Controller.php | 11 +++------- .../issues/PlausicheckResolverLib.php | 20 +++++++++++++++++-- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/application/core/IssueResolver_Controller.php b/application/core/IssueResolver_Controller.php index 0ddf31fbd..74a4eb451 100755 --- a/application/core/IssueResolver_Controller.php +++ b/application/core/IssueResolver_Controller.php @@ -21,6 +21,7 @@ abstract class IssueResolver_Controller extends JOB_Controller */ public function run() { + // initialize librariy with provided fehlercodes $this->load->library( 'issues/PlausicheckResolverLib', [ @@ -30,14 +31,8 @@ abstract class IssueResolver_Controller extends JOB_Controller $this->logInfo("Issue resolve job started"); - // load open issues with given errorcodes - $openIssuesRes = $this->IssueModel->getOpenIssues( - $this->_fehlercodes - ); - - $openIssues = hasData($openIssuesRes) ? getData($openIssuesRes) : []; - - $result = $this->plausicheckresolverlib->resolvePlausicheckIssues($openIssues); + // resolve the issues + $result = $this->plausicheckresolverlib->resolvePlausicheckIssues(); // log if error, or log info if inserted new issue foreach ($result->errors as $error) $this->logError($error); diff --git a/application/libraries/issues/PlausicheckResolverLib.php b/application/libraries/issues/PlausicheckResolverLib.php index bbbd79203..4d9faefcf 100644 --- a/application/libraries/issues/PlausicheckResolverLib.php +++ b/application/libraries/issues/PlausicheckResolverLib.php @@ -109,11 +109,27 @@ class PlausicheckResolverLib /** * Reseolves multiple plausicheck issues at once. - * @param array $openIssues passed issues to resolve + * @param array $openIssues passed issues to resolve. If null, issues with fehlercodes in _fehlercodes property are loaded * @return result object with occured error and info */ - public function resolvePlausicheckIssues($openIssues) + public function resolvePlausicheckIssues($openIssues = null) { + if (!isset($openIssues)) + { + if (!isEmptyArray($this->_fehlercodes)) + { + $this->_ci->load->model('system/Issue_model', 'IssueModel'); + + // load open issues with given errorcodes + $openIssuesRes = $this->_ci->IssueModel->getOpenIssues( + $this->_fehlercodes + ); + + $openIssues = hasData($openIssuesRes) ? getData($openIssuesRes) : []; + } + } + + $result = new StdClass(); $result->errors = []; $result->infos = []; From cf2cc796b30339573b67c79309324984f36b022e Mon Sep 17 00:00:00 2001 From: Alexei Karpenko Date: Thu, 15 Jan 2026 16:26:16 +0100 Subject: [PATCH 10/32] plausicheckproducerlib: extension fehler config files are loaded using code igniter --- .../libraries/issues/PlausicheckProducerLib.php | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/application/libraries/issues/PlausicheckProducerLib.php b/application/libraries/issues/PlausicheckProducerLib.php index da332d83d..61012e303 100644 --- a/application/libraries/issues/PlausicheckProducerLib.php +++ b/application/libraries/issues/PlausicheckProducerLib.php @@ -6,7 +6,6 @@ class PlausicheckProducerLib { const CI_PATH = 'application'; const CI_LIBRARY_FOLDER = 'libraries'; - const EXTENSIONS_FOLDER = 'extensions'; const PLAUSI_ISSUES_FOLDER = 'issues/plausichecks'; const EXECUTE_PLAUSI_CHECK_METHOD_NAME = 'executePlausiCheck'; const CONFIG_FEHLER_FILENAME = 'fehler.php'; @@ -40,7 +39,7 @@ class PlausicheckProducerLib $this->_ci->load->model('system/Fehler_model', 'FehlerModel'); $this->_ci->load->model('system/Fehlerkonfiguration_model', 'FehlerkonfigurationModel'); - $this->_ci->load->config('fehler'); + $this->_ci->load->config(self::CONFIG_FEHLER_NAME); // get all configuration parameters for the application(s)) $fehlerkonfigurationRes = $this->_ci->FehlerkonfigurationModel->getKonfiguration($this->_apps); @@ -98,20 +97,20 @@ class PlausicheckProducerLib $extensionsData = getData($extensions); - foreach ($extensionsData as $ext) { - $configFilename = APPPATH.'config/'.ExtensionsLib::EXTENSIONS_DIR_NAME.'/'.$ext->name.'/'.self::CONFIG_FEHLER_FILENAME; + $configFilePath = ExtensionsLib::EXTENSIONS_DIR_NAME.'/'.$ext->name.'/'.self::CONFIG_FEHLER_FILENAME; + $configFilename = APPPATH.'config/'.$configFilePath; if (file_exists($configFilename)) { - $config = array(); // default value + $this->_ci->load->config($configFilePath); - include($configFilename); + $extensionEntries = $this->_ci->config->item(self::CONFIG_FEHLER_NAME); - if (isset($config[self::CONFIG_FEHLER_NAME]) && is_array($config[self::CONFIG_FEHLER_NAME])) + if (isset($extensionEntries) && is_array($extensionEntries)) { - foreach ($config[self::CONFIG_FEHLER_NAME] as $extensionEntry) + foreach ($extensionEntries as $extensionEntry) { if ( !isset($extensionEntry[self::FEHLER_KURZBZ_NAME]) @@ -201,7 +200,7 @@ class PlausicheckProducerLib $libName = $mapping[self::PRODUCER_LIB_NAME]; // if called from extension (extension name set), path includes extension names - $libRootPath = isset($mapping[self::EXTENSION_NAME]) ? self::EXTENSIONS_FOLDER . '/' . $mapping[self::EXTENSION_NAME] . '/' : ''; + $libRootPath = isset($mapping[self::EXTENSION_NAME]) ? ExtensionsLib::EXTENSIONS_DIR_NAME . '/' . $mapping[self::EXTENSION_NAME] . '/' : ''; // path for loading issue library $issuesLibPath = $libRootPath . self::PLAUSI_ISSUES_FOLDER . '/'; From c6232f7959b3dd52ffa3bc8b9a4ee2432ba94b5f Mon Sep 17 00:00:00 2001 From: Alexei Karpenko Date: Thu, 15 Jan 2026 17:08:05 +0100 Subject: [PATCH 11/32] plausicheckresolver bugfixes, removed CONFIG_FEHLER_FILENAME constants --- application/core/IssueResolver_Controller.php | 2 +- application/libraries/issues/PlausicheckProducerLib.php | 8 ++++---- application/libraries/issues/PlausicheckResolverLib.php | 3 +-- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/application/core/IssueResolver_Controller.php b/application/core/IssueResolver_Controller.php index 74a4eb451..6d7a8a197 100755 --- a/application/core/IssueResolver_Controller.php +++ b/application/core/IssueResolver_Controller.php @@ -6,7 +6,7 @@ abstract class IssueResolver_Controller extends JOB_Controller { // codes of fehler to be resolved - protected $fehlercodes = []; + protected $_fehlercodes = []; public function __construct() { diff --git a/application/libraries/issues/PlausicheckProducerLib.php b/application/libraries/issues/PlausicheckProducerLib.php index 61012e303..85ecd3577 100644 --- a/application/libraries/issues/PlausicheckProducerLib.php +++ b/application/libraries/issues/PlausicheckProducerLib.php @@ -8,8 +8,8 @@ class PlausicheckProducerLib const CI_LIBRARY_FOLDER = 'libraries'; const PLAUSI_ISSUES_FOLDER = 'issues/plausichecks'; const EXECUTE_PLAUSI_CHECK_METHOD_NAME = 'executePlausiCheck'; - const CONFIG_FEHLER_FILENAME = 'fehler.php'; const CONFIG_FEHLER_NAME = 'fehler'; + const CONFIG_FEHLER_INDEX = 'fehler'; const FEHLER_KURZBZ_NAME = 'fehler_kurzbz'; const PRODUCER_LIB_NAME = 'producerLibName'; const EXTENSION_NAME = 'extensionName'; @@ -74,7 +74,7 @@ class PlausicheckProducerLib // get producer file paths for the fehler // Load Fehler Entries of Core - $configArray = $this->_ci->config->item(self::CONFIG_FEHLER_NAME); + $configArray = $this->_ci->config->item(self::CONFIG_FEHLER_INDEX); foreach ($configArray as $coreEntry) { @@ -99,14 +99,14 @@ class PlausicheckProducerLib foreach ($extensionsData as $ext) { - $configFilePath = ExtensionsLib::EXTENSIONS_DIR_NAME.'/'.$ext->name.'/'.self::CONFIG_FEHLER_FILENAME; + $configFilePath = ExtensionsLib::EXTENSIONS_DIR_NAME.'/'.$ext->name.'/'.self::CONFIG_FEHLER_NAME.'.php'; $configFilename = APPPATH.'config/'.$configFilePath; if (file_exists($configFilename)) { $this->_ci->load->config($configFilePath); - $extensionEntries = $this->_ci->config->item(self::CONFIG_FEHLER_NAME); + $extensionEntries = $this->_ci->config->item(self::CONFIG_FEHLER_INDEX); if (isset($extensionEntries) && is_array($extensionEntries)) { diff --git a/application/libraries/issues/PlausicheckResolverLib.php b/application/libraries/issues/PlausicheckResolverLib.php index 4d9faefcf..89b68a7b8 100644 --- a/application/libraries/issues/PlausicheckResolverLib.php +++ b/application/libraries/issues/PlausicheckResolverLib.php @@ -9,7 +9,6 @@ class PlausicheckResolverLib const EXTENSIONS_FOLDER = 'extensions'; const ISSUE_RESOLVERS_FOLDER = 'issues/resolvers'; const CHECK_ISSUE_RESOLVED_METHOD_NAME = 'checkIfIssueIsResolved'; - const CONFIG_FEHLER_FILENAME = 'fehler.php'; const CONFIG_FEHLER_NAME = 'fehler'; const FEHLERCODE_NAME = 'fehlercode'; const FEHLER_KURZBZ_NAME = 'fehler_kurzbz'; @@ -70,7 +69,7 @@ class PlausicheckResolverLib foreach ($extensionsData as $ext) { - $configFilename = APPPATH.'config/'.ExtensionsLib::EXTENSIONS_DIR_NAME.'/'.$ext->name.'/'.self::CONFIG_FEHLER_FILENAME; + $configFilename = APPPATH.'config/'.ExtensionsLib::EXTENSIONS_DIR_NAME.'/'.$ext->name.'/'.self::CONFIG_FEHLER_NAME.'.php'; if (file_exists($configFilename)) { From cd03264ab44b8ffccc726d43ccb07cb12e4ca3db Mon Sep 17 00:00:00 2001 From: Alexei Karpenko Date: Fri, 16 Jan 2026 13:09:11 +0100 Subject: [PATCH 12/32] Fehler: added fehlerupdate for adding missing fehler from config files to database --- .../controllers/system/fehler/CLI_Manager.php | 57 ++++ .../controllers/system/fehler/Manager.php | 46 +++ application/libraries/FehlerUpdateLib.php | 304 ++++++++++++++++++ application/libraries/IssuesLib.php | 2 +- .../issues/PlausicheckProducerLib.php | 19 +- application/models/system/Fehler_model.php | 3 +- 6 files changed, 421 insertions(+), 10 deletions(-) create mode 100644 application/controllers/system/fehler/CLI_Manager.php create mode 100644 application/controllers/system/fehler/Manager.php create mode 100644 application/libraries/FehlerUpdateLib.php diff --git a/application/controllers/system/fehler/CLI_Manager.php b/application/controllers/system/fehler/CLI_Manager.php new file mode 100644 index 000000000..0a510d25d --- /dev/null +++ b/application/controllers/system/fehler/CLI_Manager.php @@ -0,0 +1,57 @@ +. + */ + +if (!defined("BASEPATH")) exit("No direct script access allowed"); + +class CLI_Manager extends CLI_Controller +{ + /** + * + */ + public function __construct() + { + parent::__construct(); + + // Load libraries + $this->load->library('FehlerUpdateLib'); + } + + /** + * + */ + public function installAll() + { + $this->fehlerupdatelib->installAll(); + } + + /** + * + */ + public function installFromCore() + { + $this->fehlerupdatelib->installFromCore(); + } + + /** + * + */ + public function installFrom($fehlerConfigDirectory) + { + $this->fehlerupdatelib->installFrom(urldecode($fehlerConfigDirectory)); + } +} \ No newline at end of file diff --git a/application/controllers/system/fehler/Manager.php b/application/controllers/system/fehler/Manager.php new file mode 100644 index 000000000..832108dcf --- /dev/null +++ b/application/controllers/system/fehler/Manager.php @@ -0,0 +1,46 @@ + 'admin:rw', + 'installFromCore' => 'admin:rw' + ) + ); + + // Load libraries + $this->load->library('FehlerUpdateLib'); + } + + /** + * + */ + public function installAll() + { + $this->fehlerupdatelib->installAll(); + } + + /** + * + */ + public function installFromCore() + { + $this->fehlerupdatelib->installFromCore(); + } + + /** + * + */ + public function installFrom($fehlerConfigDirectory) + { + $this->fehlerupdatelib->installFrom($fehlerConfigDirectory); + } +} \ No newline at end of file diff --git a/application/libraries/FehlerUpdateLib.php b/application/libraries/FehlerUpdateLib.php new file mode 100644 index 000000000..a969bffba --- /dev/null +++ b/application/libraries/FehlerUpdateLib.php @@ -0,0 +1,304 @@ +. + */ + +if (! defined('BASEPATH')) exit('No direct script access allowed'); + +class FehlerUpdateLib +{ + // Who adds phrases into the database + //const INSERT_BY = 'FehlerUpdate'; + + const CONFIG_DIRECTORY = 'config'; + const CONFIG_FEHLER_NAME = 'fehler'; + const CONFIG_FEHLER_INDEX = 'fehler'; + + const TYPE_STRING = 'string'; + const TYPE_ARRAY = 'array'; + + //~ // Array elements names + const FEHLERCODE = 'fehlercode'; + const FEHLER_KURZBZ = 'fehler_kurzbz'; + const FEHLERTEXT = 'fehlertext'; + const FEHLERTYP_KURZBZ = 'fehlertyp_kurzbz'; + const APP = 'app'; + + // structure of a fehler + // type default: string + const FEHLER_ATTRIBUTES = [ + self::FEHLERCODE => ['required' => true], + self::FEHLER_KURZBZ => ['required' => true], + self::FEHLERTEXT => ['required' => true], + self::FEHLERTYP_KURZBZ => ['required' => false], + self::APP => ['required' => true, 'types' => [self::TYPE_STRING, self::TYPE_ARRAY]] + ]; + + private $_ci; // Code igniter instance + + /** + * Loads parser library + */ + public function __construct() + { + $this->_ci =& get_instance(); + + // Loads EPrintfLib + $this->_ci->load->library('EPrintfLib'); + + // Loads the PhraseModel + $this->_ci->load->model('system/Fehler_model', 'FehlerModel'); + } + + // ----------------------------------------------------------------------------------------------------------------- + // Public methods + + + /** + * + * @param + * @return object success or error + */ + public function installAll() + { + $this->installFromCore(); + + $this->_ci->load->library('ExtensionsLib'); + + // load fehler entries of extensions + $extensions = $this->_ci->extensionslib->getInstalledExtensions(); + + if (hasData($extensions)) + { + $extensionArray = array(); + + $extensionsData = getData($extensions); + + foreach ($extensionsData as $ext) + { + $configFilePath = ExtensionsLib::EXTENSIONS_DIR_NAME.'/'.$ext->name.'/'.FehlerUpdateLib::CONFIG_FEHLER_NAME; + $this->installFrom($configFilePath); + } + } + + } + + /** + * Install fehler from the core + */ + public function installFromCore() + { + $this->_installFehler(); + } + + /** + * Install fehler from the given path + */ + public function installFrom($fehlerConfigDirectory) + { + $this->_installFehler($fehlerConfigDirectory); + } + + + // ----------------------------------------------------------------------------------------------------------------- + // Private methods + + /** + * Install fehler from the given directory + */ + private function _installFehler($fehlerConfigDirectory = null) + { + // check that fehler config file exists + $fehlerConfigDirectory = isset($fehlerConfigDirectory) ? $fehlerConfigDirectory : self::CONFIG_FEHLER_NAME; + + $configFilename = APPPATH.self::CONFIG_DIRECTORY.'/'.$fehlerConfigDirectory.'.php'; + + if (!file_exists($configFilename)) + { + return; + } + + // Load Fehler Entries + $this->_ci->load->config($fehlerConfigDirectory); + $configArray = $this->_ci->config->item(self::CONFIG_FEHLER_INDEX); + + if (!isset($configArray) || !is_array($configArray)) // check if fehler config entries could be loaded + { + $this->_ci->eprintflib->printError( + 'Fehler config array could not be loaded, directory '.$fehlerConfigDirectory.' index '.self::CONFIG_FEHLER_INDEX + ); + return; + } + + $this->_ci->eprintflib->printInfo('------------------------------------------------------------------------------------------'); + $this->_ci->eprintflib->printInfo('Fehler installation started, directory '.$fehlerConfigDirectory); + + foreach ($configArray as $idx => $configEntry) + { + // create fehler from config entry + $createFehlerResult = $this->_createFehlerFromEntry($configEntry); + + // write error if creation failed + if (isError($createFehlerResult)) + { + $this->_ci->eprintflib->printError( + getError($createFehlerResult).', directory'.$fehlerConfigDirectory.', index '.$idx + ); + } + elseif (hasData($createFehlerResult)) + { + // add fehler to db + $addFehlerResult = $this->_addFehler(getData($createFehlerResult)); + + if (isError($addFehlerResult)) + { + $this->_ci->eprintflib->printError( + getError($addFehlerResult).', directory'.$fehlerConfigDirectory.', index '.$idx + ); + } + } + } + + $this->_ci->eprintflib->printInfo('Fehler installation ended'); + $this->_ci->eprintflib->printInfo('------------------------------------------------------------------------------------------'); + } + + /** + * Add a new fehler to the database + */ + private function _addFehler($fehler) + { + // Checks if the fehler already exists in the database + $this->_ci->FehlerModel->addSelect(self::FEHLERCODE.', '.self::FEHLER_KURZBZ); + $this->_ci->FehlerModel->db->where(self::FEHLERCODE.' = ', $fehler[self::FEHLERCODE]); + $this->_ci->FehlerModel->db->or_where(self::FEHLER_KURZBZ.' = ', $fehler[self::FEHLER_KURZBZ]); + $fehlerResult = $this->_ci->FehlerModel->load(); + + // If an error occurred then return the error itself + if (isError($fehlerResult)) return $fehlerResult; + + // if fehler has been found + if (hasData($fehlerResult)) + { + $foundFehler = getData($fehlerResult)[0]; + + // check if fehlercode - fehler kurzbz combination is correct + if ($foundFehler->{self::FEHLERCODE} != $fehler[self::FEHLERCODE] || $foundFehler->{self::FEHLER_KURZBZ} != $fehler[self::FEHLER_KURZBZ]) + { + return error("Wrong fehlercode - fehler kurzbz combination: ".$fehler[self::FEHLERCODE].", ".$fehler[self::FEHLER_KURZBZ]); + } + + $this->_ci->eprintflib->printMessage("Fehler ".$fehler[self::FEHLERCODE]." already exists in database"); + return success($fehler[self::FEHLERCODE]); + } + + // no fehler has been found + + // hanlde apps + if (isset($fehler[self::APP])) + { + $apps = $fehler[self::APP]; + if (is_string($apps)) $apps = [$apps]; + //unset($fehler[self::APP]); + $fehler[self::APP] = $apps[0]; + + //~ foreach ($apps as $app) + //~ { + //~ // TODO add entry for each app + //~ foreach ($_ as $_) + //~ { + + //~ } + + //~ } + } + + // Then add the fehler to the database + $fehlerInsertResult = $this->_ci->FehlerModel->insert( + $fehler + // TODO: add insertamum? + //~ array( + //~ 'insertamum' => 'NOW()', + //~ 'insertvon' => self::INSERT_BY + //~ ) + ); + + // If an error occurred then return the error itself + if (isError($fehlerInsertResult)) return $fehlerInsertResult; + + // Prints info about the new added fehler + $this->_ci->eprintflib->printMessage( + sprintf( + 'A new fehler has been added into the database: '. + 'fehlercode => %s | fehler_kurzbz => %s | fehlertyp => %s', + $fehler[self::FEHLERCODE], + $fehler[self::FEHLER_KURZBZ], + $fehler[self::FEHLERTYP_KURZBZ] + ) + ); + + // If here then no blocking errors occurred + return success(); + } + + /** + * Create an array with fehler data from config entry + */ + private function _createFehlerFromEntry($configEntry) + { + $fehler = []; + foreach (self::FEHLER_ATTRIBUTES as $attributeName => $attributeConditions) + { + $required = isset($attributeConditions['required']) && $attributeConditions['required']; + if ($required && !isset($configEntry[$attributeName])) + { + return error('attribute'.$attributeName.' is missing'); + } + + $attributeValue = $configEntry[$attributeName]; + $validType = false; + if (isset($attributeConditions['types']) && is_array($attributeConditions['types'])) + { + foreach ($attributeConditions['types'] as $type) + { + switch ($type) + { + case self::TYPE_STRING: + if (is_string($attributeValue) || is_null($attributeValue)) $validType = true; + break; + case self::TYPE_ARRAY: + if (is_array($attributeValue) && !($required && isEmptyArray($attributeValue))) $validType = true; + break; + //~ default: + //~ if (is_string($configEntry[$attributeName]) || is_null($configEntry[$attributeName])) $validType = true; + } + } + } + else + { + $validType = is_string($attributeValue) || is_null($attributeValue); + } + + if (!$validType) + { + return error('attribute'.$attributeName.' has invalid type'); + } + + $fehler[$attributeName] = $configEntry[$attributeName]; + } + return success($fehler); + } +} diff --git a/application/libraries/IssuesLib.php b/application/libraries/IssuesLib.php index f38303b3c..a5369d7e2 100644 --- a/application/libraries/IssuesLib.php +++ b/application/libraries/IssuesLib.php @@ -231,7 +231,7 @@ class IssuesLib return error("Person_id or oe_kurzbz must be set."); // get fehlertextVorlage and replace it with params - $fehlerRes = $this->_ci->FehlerModel->load($fehlercode); + $fehlerRes = $this->_ci->FehlerModel->loadWhere(['fehlercode' => $fehlercode]); if (hasData($fehlerRes)) { diff --git a/application/libraries/issues/PlausicheckProducerLib.php b/application/libraries/issues/PlausicheckProducerLib.php index 85ecd3577..0cd76962a 100644 --- a/application/libraries/issues/PlausicheckProducerLib.php +++ b/application/libraries/issues/PlausicheckProducerLib.php @@ -76,16 +76,19 @@ class PlausicheckProducerLib // Load Fehler Entries of Core $configArray = $this->_ci->config->item(self::CONFIG_FEHLER_INDEX); - foreach ($configArray as $coreEntry) + if (isset($configArray) && is_array($configArray)) { - if (!isset($coreEntry[self::FEHLER_KURZBZ_NAME]) - || !isset($coreEntry[self::PRODUCER_LIB_NAME]) - || !in_array($coreEntry[self::FEHLER_KURZBZ_NAME], $this->_fehlerKurzbz) - ) { - continue; - } + foreach ($configArray as $coreEntry) + { + if (!isset($coreEntry[self::FEHLER_KURZBZ_NAME]) + || !isset($coreEntry[self::PRODUCER_LIB_NAME]) + || !in_array($coreEntry[self::FEHLER_KURZBZ_NAME], $this->_fehlerKurzbz) + ) { + continue; + } - $this->_fehlerLibMappings[$coreEntry[self::FEHLER_KURZBZ_NAME]][self::PRODUCER_LIB_NAME] = $coreEntry[self::PRODUCER_LIB_NAME]; + $this->_fehlerLibMappings[$coreEntry[self::FEHLER_KURZBZ_NAME]][self::PRODUCER_LIB_NAME] = $coreEntry[self::PRODUCER_LIB_NAME]; + } } // load fehler entries of extensions diff --git a/application/models/system/Fehler_model.php b/application/models/system/Fehler_model.php index 28618f6d9..2b0dc8802 100644 --- a/application/models/system/Fehler_model.php +++ b/application/models/system/Fehler_model.php @@ -9,6 +9,7 @@ class Fehler_model extends DB_Model { parent::__construct(); $this->dbTable = 'system.tbl_fehler'; - $this->pk = 'fehlercode'; + $this->pk = array('fehlercode'); + $this->hasSequence = false; } } From 131ec86deeeee5b32ce36f99527f84e3f676dfdb Mon Sep 17 00:00:00 2001 From: Alexei Karpenko Date: Mon, 19 Jan 2026 15:27:54 +0100 Subject: [PATCH 13/32] fehlerupdate: added check for app (existing in database?), code layout --- application/libraries/FehlerUpdateLib.php | 28 +++++++++---------- .../issues/PlausicheckProducerLib.php | 1 + .../issues/PlausicheckResolverLib.php | 2 +- application/models/system/App_model.php | 14 ++++++++++ 4 files changed, 30 insertions(+), 15 deletions(-) create mode 100644 application/models/system/App_model.php diff --git a/application/libraries/FehlerUpdateLib.php b/application/libraries/FehlerUpdateLib.php index a969bffba..5eca64f76 100644 --- a/application/libraries/FehlerUpdateLib.php +++ b/application/libraries/FehlerUpdateLib.php @@ -59,8 +59,9 @@ class FehlerUpdateLib // Loads EPrintfLib $this->_ci->load->library('EPrintfLib'); - // Loads the PhraseModel + // Loads the Models $this->_ci->load->model('system/Fehler_model', 'FehlerModel'); + $this->_ci->load->model('system/App_model', 'AppModel'); } // ----------------------------------------------------------------------------------------------------------------- @@ -93,7 +94,6 @@ class FehlerUpdateLib $this->installFrom($configFilePath); } } - } /** @@ -207,23 +207,23 @@ class FehlerUpdateLib // no fehler has been found - // hanlde apps + // handle apps if (isset($fehler[self::APP])) { $apps = $fehler[self::APP]; if (is_string($apps)) $apps = [$apps]; - //unset($fehler[self::APP]); + + foreach ($apps as $app) + { + // check if app exists in db + $this->_ci->AppModel->addSelect('1'); + $appRes = $this->_ci->AppModel->loadWhere(['app' => $app]); + + if (!hasData($appRes)) return error("App ".$app." does not exist"); + // TODO add entry for each app + } + $fehler[self::APP] = $apps[0]; - - //~ foreach ($apps as $app) - //~ { - //~ // TODO add entry for each app - //~ foreach ($_ as $_) - //~ { - - //~ } - - //~ } } // Then add the fehler to the database diff --git a/application/libraries/issues/PlausicheckProducerLib.php b/application/libraries/issues/PlausicheckProducerLib.php index 0cd76962a..34807c917 100644 --- a/application/libraries/issues/PlausicheckProducerLib.php +++ b/application/libraries/issues/PlausicheckProducerLib.php @@ -144,6 +144,7 @@ class PlausicheckProducerLib $result = new StdClass(); $result->errors = []; $result->infos = []; + $mappingFehlerKurbz = array_keys($this->_fehlerLibMappings); // check if all issues to produce could be found in database diff --git a/application/libraries/issues/PlausicheckResolverLib.php b/application/libraries/issues/PlausicheckResolverLib.php index 89b68a7b8..06c3705a3 100644 --- a/application/libraries/issues/PlausicheckResolverLib.php +++ b/application/libraries/issues/PlausicheckResolverLib.php @@ -161,7 +161,7 @@ class PlausicheckResolverLib if (isset($this->_codeLibMappings[$issue->fehlercode])) { $codeLibMapping = $this->_codeLibMappings[$issue->fehlercode]; - $libName = $codeLibMapping[self::RESOLVER_LIB_NAME]; + $libName = $codeLibMapping[self::RESOLVER_LIB_NAME] ?? null; $extensionName = $codeLibMapping[self::EXTENSION_NAME] ?? null; $producerIsResolver = $codeLibMapping[self::PRODUCER_IS_RESOLVER_NAME] ?? false; diff --git a/application/models/system/App_model.php b/application/models/system/App_model.php new file mode 100644 index 000000000..85d015f42 --- /dev/null +++ b/application/models/system/App_model.php @@ -0,0 +1,14 @@ +dbTable = 'system.tbl_app'; + $this->pk = 'app'; + } +} From 545e2b04457ee0a2f372789c44a0d492c19eb5fd Mon Sep 17 00:00:00 2001 From: Alexei Karpenko Date: Tue, 20 Jan 2026 17:02:47 +0100 Subject: [PATCH 14/32] Fehlerupdate: additional extension check, fehler_kurzbz optional --- .../controllers/system/fehler/CLI_Manager.php | 4 +- application/libraries/FehlerUpdateLib.php | 48 ++++++++++++------- 2 files changed, 33 insertions(+), 19 deletions(-) diff --git a/application/controllers/system/fehler/CLI_Manager.php b/application/controllers/system/fehler/CLI_Manager.php index 0a510d25d..af3655233 100644 --- a/application/controllers/system/fehler/CLI_Manager.php +++ b/application/controllers/system/fehler/CLI_Manager.php @@ -50,8 +50,8 @@ class CLI_Manager extends CLI_Controller /** * */ - public function installFrom($fehlerConfigDirectory) + public function installFrom($extensionName) { - $this->fehlerupdatelib->installFrom(urldecode($fehlerConfigDirectory)); + $this->fehlerupdatelib->installFrom(urldecode($extensionName)); } } \ No newline at end of file diff --git a/application/libraries/FehlerUpdateLib.php b/application/libraries/FehlerUpdateLib.php index 5eca64f76..df9d8266d 100644 --- a/application/libraries/FehlerUpdateLib.php +++ b/application/libraries/FehlerUpdateLib.php @@ -36,15 +36,17 @@ class FehlerUpdateLib const FEHLERTEXT = 'fehlertext'; const FEHLERTYP_KURZBZ = 'fehlertyp_kurzbz'; const APP = 'app'; + const FEHLERCODE_EXTERN = 'fehlercode_extern'; // structure of a fehler // type default: string const FEHLER_ATTRIBUTES = [ self::FEHLERCODE => ['required' => true], - self::FEHLER_KURZBZ => ['required' => true], + self::FEHLER_KURZBZ => ['required' => false], self::FEHLERTEXT => ['required' => true], self::FEHLERTYP_KURZBZ => ['required' => false], - self::APP => ['required' => true, 'types' => [self::TYPE_STRING, self::TYPE_ARRAY]] + self::APP => ['required' => true, 'types' => [self::TYPE_STRING, self::TYPE_ARRAY]], + self::FEHLERCODE_EXTERN => ['required' => false] ]; private $_ci; // Code igniter instance @@ -62,6 +64,9 @@ class FehlerUpdateLib // Loads the Models $this->_ci->load->model('system/Fehler_model', 'FehlerModel'); $this->_ci->load->model('system/App_model', 'AppModel'); + + // Loads extensions lib + $this->_ci->load->library('ExtensionsLib'); } // ----------------------------------------------------------------------------------------------------------------- @@ -77,8 +82,6 @@ class FehlerUpdateLib { $this->installFromCore(); - $this->_ci->load->library('ExtensionsLib'); - // load fehler entries of extensions $extensions = $this->_ci->extensionslib->getInstalledExtensions(); @@ -90,8 +93,7 @@ class FehlerUpdateLib foreach ($extensionsData as $ext) { - $configFilePath = ExtensionsLib::EXTENSIONS_DIR_NAME.'/'.$ext->name.'/'.FehlerUpdateLib::CONFIG_FEHLER_NAME; - $this->installFrom($configFilePath); + $this->installFrom($ext->name); } } } @@ -107,9 +109,16 @@ class FehlerUpdateLib /** * Install fehler from the given path */ - public function installFrom($fehlerConfigDirectory) + public function installFrom($extensionName) { - $this->_installFehler($fehlerConfigDirectory); + if (!isset($extensionName)) + { + $this->_ci->eprintflib->printError('Extension name missing!'); + return; + } + + $this->_installFehler(ExtensionsLib::EXTENSIONS_DIR_NAME.'/'.$extensionName.'/'.FehlerUpdateLib::CONFIG_FEHLER_NAME); + } @@ -122,9 +131,9 @@ class FehlerUpdateLib private function _installFehler($fehlerConfigDirectory = null) { // check that fehler config file exists - $fehlerConfigDirectory = isset($fehlerConfigDirectory) ? $fehlerConfigDirectory : self::CONFIG_FEHLER_NAME; + $configDir = isset($fehlerConfigDirectory) ? $fehlerConfigDirectory : self::CONFIG_FEHLER_NAME; - $configFilename = APPPATH.self::CONFIG_DIRECTORY.'/'.$fehlerConfigDirectory.'.php'; + $configFilename = APPPATH.self::CONFIG_DIRECTORY.'/'.$configDir.'.php'; if (!file_exists($configFilename)) { @@ -132,19 +141,19 @@ class FehlerUpdateLib } // Load Fehler Entries - $this->_ci->load->config($fehlerConfigDirectory); + $this->_ci->load->config($configDir); $configArray = $this->_ci->config->item(self::CONFIG_FEHLER_INDEX); if (!isset($configArray) || !is_array($configArray)) // check if fehler config entries could be loaded { $this->_ci->eprintflib->printError( - 'Fehler config array could not be loaded, directory '.$fehlerConfigDirectory.' index '.self::CONFIG_FEHLER_INDEX + 'Fehler config array could not be loaded, directory '.$configDir.' index '.self::CONFIG_FEHLER_INDEX ); return; } $this->_ci->eprintflib->printInfo('------------------------------------------------------------------------------------------'); - $this->_ci->eprintflib->printInfo('Fehler installation started, directory '.$fehlerConfigDirectory); + $this->_ci->eprintflib->printInfo('Fehler installation started, directory '.$configDir); foreach ($configArray as $idx => $configEntry) { @@ -155,7 +164,7 @@ class FehlerUpdateLib if (isError($createFehlerResult)) { $this->_ci->eprintflib->printError( - getError($createFehlerResult).', directory'.$fehlerConfigDirectory.', index '.$idx + getError($createFehlerResult).', directory '.$configDir.', index '.$idx ); } elseif (hasData($createFehlerResult)) @@ -166,7 +175,7 @@ class FehlerUpdateLib if (isError($addFehlerResult)) { $this->_ci->eprintflib->printError( - getError($addFehlerResult).', directory'.$fehlerConfigDirectory.', index '.$idx + getError($addFehlerResult).', directory'.$configDir.', index '.$idx ); } } @@ -184,7 +193,7 @@ class FehlerUpdateLib // Checks if the fehler already exists in the database $this->_ci->FehlerModel->addSelect(self::FEHLERCODE.', '.self::FEHLER_KURZBZ); $this->_ci->FehlerModel->db->where(self::FEHLERCODE.' = ', $fehler[self::FEHLERCODE]); - $this->_ci->FehlerModel->db->or_where(self::FEHLER_KURZBZ.' = ', $fehler[self::FEHLER_KURZBZ]); + if ($fehler[self::FEHLER_KURZBZ] != null) $this->_ci->FehlerModel->db->or_where(self::FEHLER_KURZBZ.' = ', $fehler[self::FEHLER_KURZBZ]); $fehlerResult = $this->_ci->FehlerModel->load(); // If an error occurred then return the error itself @@ -201,7 +210,12 @@ class FehlerUpdateLib return error("Wrong fehlercode - fehler kurzbz combination: ".$fehler[self::FEHLERCODE].", ".$fehler[self::FEHLER_KURZBZ]); } - $this->_ci->eprintflib->printMessage("Fehler ".$fehler[self::FEHLERCODE]." already exists in database"); + $this->_ci->eprintflib->printMessage( + "Fehler ".$fehler[self::FEHLERCODE] + .(isset($fehler[self::FEHLER_KURZBZ]) ? " (".$fehler[self::FEHLER_KURZBZ].")" : "") + ." already exists in database" + ); + return success($fehler[self::FEHLERCODE]); } From d6803a3947d84c8f355d33f9ec4c02891de3c404 Mon Sep 17 00:00:00 2001 From: Alexei Karpenko Date: Tue, 20 Jan 2026 18:56:43 +0100 Subject: [PATCH 15/32] Fehler update: enabled updating of fehler columns, added insertaum, insertvon, updateamum, insertvon --- application/libraries/FehlerUpdateLib.php | 51 +++++++++++++------ system/dbupdate_3.4.php | 3 +- ...hlermonitoring_issues_weitere_features.php | 16 ++++++ 3 files changed, 53 insertions(+), 17 deletions(-) create mode 100644 system/dbupdate_3.4/68834_fehlermonitoring_issues_weitere_features.php diff --git a/application/libraries/FehlerUpdateLib.php b/application/libraries/FehlerUpdateLib.php index df9d8266d..0e6f3914f 100644 --- a/application/libraries/FehlerUpdateLib.php +++ b/application/libraries/FehlerUpdateLib.php @@ -21,7 +21,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); class FehlerUpdateLib { // Who adds phrases into the database - //const INSERT_BY = 'FehlerUpdate'; + const UPSERT_BY = 'FehlerUpdate'; const CONFIG_DIRECTORY = 'config'; const CONFIG_FEHLER_NAME = 'fehler'; @@ -43,8 +43,8 @@ class FehlerUpdateLib const FEHLER_ATTRIBUTES = [ self::FEHLERCODE => ['required' => true], self::FEHLER_KURZBZ => ['required' => false], - self::FEHLERTEXT => ['required' => true], - self::FEHLERTYP_KURZBZ => ['required' => false], + self::FEHLERTEXT => ['required' => true, 'updateable' => false], + self::FEHLERTYP_KURZBZ => ['required' => false, 'updateable' => true], self::APP => ['required' => true, 'types' => [self::TYPE_STRING, self::TYPE_ARRAY]], self::FEHLERCODE_EXTERN => ['required' => false] ]; @@ -170,7 +170,7 @@ class FehlerUpdateLib elseif (hasData($createFehlerResult)) { // add fehler to db - $addFehlerResult = $this->_addFehler(getData($createFehlerResult)); + $addFehlerResult = $this->_updateFehler(getData($createFehlerResult)); if (isError($addFehlerResult)) { @@ -188,10 +188,9 @@ class FehlerUpdateLib /** * Add a new fehler to the database */ - private function _addFehler($fehler) + private function _updateFehler($fehler) { // Checks if the fehler already exists in the database - $this->_ci->FehlerModel->addSelect(self::FEHLERCODE.', '.self::FEHLER_KURZBZ); $this->_ci->FehlerModel->db->where(self::FEHLERCODE.' = ', $fehler[self::FEHLERCODE]); if ($fehler[self::FEHLER_KURZBZ] != null) $this->_ci->FehlerModel->db->or_where(self::FEHLER_KURZBZ.' = ', $fehler[self::FEHLER_KURZBZ]); $fehlerResult = $this->_ci->FehlerModel->load(); @@ -216,6 +215,31 @@ class FehlerUpdateLib ." already exists in database" ); + $updateArr = []; + + // update fehler, if needed + foreach (self::FEHLER_ATTRIBUTES as $attributeName => $attributeInfo) + { + // set attributes to be updated + if (isset($attributeInfo['updateable']) && $attributeInfo['updateable'] && $foundFehler->{$attributeName} != $fehler[$attributeName]) + { + $updateArr[$attributeName] = $fehler[$attributeName]; + } + } + + if (!isEmptyArray($updateArr)) + { + $updateRes = $this->_ci->FehlerModel->update( + [self::FEHLERCODE => $foundFehler->{self::FEHLERCODE}], + array_merge($updateArr, ['updateamum' => 'NOW()', 'updatevon' => self::UPSERT_BY]) + ); + if (isError($updateRes)) return $updateRes; + + $this->_ci->eprintflib->printMessage( + "Fehler ".$fehler[self::FEHLERCODE].(isset($fehler[self::FEHLER_KURZBZ]) ? " (".$fehler[self::FEHLER_KURZBZ].")" : "")." updated" + ); + } + return success($fehler[self::FEHLERCODE]); } @@ -242,12 +266,7 @@ class FehlerUpdateLib // Then add the fehler to the database $fehlerInsertResult = $this->_ci->FehlerModel->insert( - $fehler - // TODO: add insertamum? - //~ array( - //~ 'insertamum' => 'NOW()', - //~ 'insertvon' => self::INSERT_BY - //~ ) + array_merge($fehler, ['insertamum' => 'NOW()', 'insertvon' => self::UPSERT_BY]) ); // If an error occurred then return the error itself @@ -274,9 +293,9 @@ class FehlerUpdateLib private function _createFehlerFromEntry($configEntry) { $fehler = []; - foreach (self::FEHLER_ATTRIBUTES as $attributeName => $attributeConditions) + foreach (self::FEHLER_ATTRIBUTES as $attributeName => $attributeInfo) { - $required = isset($attributeConditions['required']) && $attributeConditions['required']; + $required = isset($attributeInfo['required']) && $attributeInfo['required']; if ($required && !isset($configEntry[$attributeName])) { return error('attribute'.$attributeName.' is missing'); @@ -284,9 +303,9 @@ class FehlerUpdateLib $attributeValue = $configEntry[$attributeName]; $validType = false; - if (isset($attributeConditions['types']) && is_array($attributeConditions['types'])) + if (isset($attributeInfo['types']) && is_array($attributeInfo['types'])) { - foreach ($attributeConditions['types'] as $type) + foreach ($attributeInfo['types'] as $type) { switch ($type) { diff --git a/system/dbupdate_3.4.php b/system/dbupdate_3.4.php index 7bd195064..d3e56a93c 100644 --- a/system/dbupdate_3.4.php +++ b/system/dbupdate_3.4.php @@ -87,6 +87,7 @@ require_once('dbupdate_3.4/47972_pruefungsverwaltung_ects_angabe.php'); require_once('dbupdate_3.4/67490_studstatus_suche_abort_controller_haengt.php'); require_once('dbupdate_3.4/69065_Projektarbeiten_Firmen_verwalten.php'); require_once('dbupdate_3.4/68744_StV_settings.php'); +require_once('dbupdate_3.4/68834_fehlermonitoring_issues_weitere_features.php'); // *** Pruefung und hinzufuegen der neuen Attribute und Tabellen echo '

Pruefe Tabellen und Attribute!

'; @@ -406,7 +407,7 @@ $tabellen=array( "system.tbl_benutzerrolle" => array("benutzerberechtigung_id","rolle_kurzbz","berechtigung_kurzbz","uid","funktion_kurzbz","oe_kurzbz","art","studiensemester_kurzbz","start","ende","negativ","updateamum", "updatevon","insertamum","insertvon","kostenstelle_id","anmerkung"), "system.tbl_berechtigung" => array("berechtigung_kurzbz","beschreibung"), "system.tbl_extensions" => array("extension_id","name","version","description","license","url","core_version","dependencies","enabled"), - "system.tbl_fehler" => array("fehlercode","fehler_kurzbz","fehlercode_extern","fehlertext","fehlertyp_kurzbz","app"), + "system.tbl_fehler" => array("fehlercode","fehler_kurzbz","fehlercode_extern","fehlertext","fehlertyp_kurzbz","app","insertamum","insertvon","updateamum","updatevon"), "system.tbl_fehlertyp" => array("fehlertyp_kurzbz","bezeichnung_mehrsprachig"), "system.tbl_fehler_konfiguration" => array("konfigurationstyp_kurzbz","fehlercode","konfiguration","insertamum","insertvon","updateamum","updatevon"), "system.tbl_fehler_konfigurationsdatentyp" => array("konfigurationsdatentyp"), diff --git a/system/dbupdate_3.4/68834_fehlermonitoring_issues_weitere_features.php b/system/dbupdate_3.4/68834_fehlermonitoring_issues_weitere_features.php new file mode 100644 index 000000000..7ef5324eb --- /dev/null +++ b/system/dbupdate_3.4/68834_fehlermonitoring_issues_weitere_features.php @@ -0,0 +1,16 @@ +db_query("SELECT insertamum FROM system.tbl_fehler LIMIT 1")) +{ + $qry = "ALTER TABLE system.tbl_fehler ADD COLUMN insertamum timestamp DEFAULT now(); + ALTER TABLE system.tbl_fehler ADD COLUMN insertvon varchar(32); + ALTER TABLE system.tbl_fehler ADD COLUMN updateamum timestamp DEFAULT now(); + ALTER TABLE system.tbl_fehler ADD COLUMN updatevon varchar(32);"; + + if(!$db->db_query($qry)) + echo 'system.tbl_fehler '.$db->db_last_error().'
'; + else + echo '
Spalten insertamum, insertvon, updateamum, updatevon in system.tbl_fehler hinzugefügt'; +} \ No newline at end of file From 9ccbb7b9e2859d05ada4555116c7abb38d002141 Mon Sep 17 00:00:00 2001 From: Alexei Karpenko Date: Wed, 21 Jan 2026 16:16:33 +0100 Subject: [PATCH 16/32] issuechecker: detailed issue list on click --- public/js/components/Issues/IssueChecker.js | 30 ++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/public/js/components/Issues/IssueChecker.js b/public/js/components/Issues/IssueChecker.js index dd4ee696e..27fb960c2 100644 --- a/public/js/components/Issues/IssueChecker.js +++ b/public/js/components/Issues/IssueChecker.js @@ -1,9 +1,13 @@ +import IssueList from './IssueList.js'; + export default { name: 'IssueChecker', expose: ['countPersonOpenIssues', 'checkPerson'], //emits: ['issuesLoaded'], components: { + IssueList, "p-skeleton": primevue.skeleton, + "p-overlaypanel": primevue.overlaypanel }, props: { person_id: Number, @@ -16,6 +20,16 @@ export default { endpoint: { type: Object, required: true + }, + issueListEndpoint: { + type: Object, + required: true + }, + issueListStyle: { + type: String + }, + issueListStyleBreakpoints: { + type: String } }, data() { @@ -59,12 +73,26 @@ export default { }) .catch(this.$fhcAlert.handleSystemError); }, + toggle(event) { + this.$refs.issuesOverlay.toggle(event); + } }, template: `

Issues

-
{{ openissuescount }}
+
{{ openissuescount }}
+ + + + + ` } From 413ccba64b6a7397c0a2f19d83c714d3c00c33c7 Mon Sep 17 00:00:00 2001 From: Alexei Karpenko Date: Fri, 23 Jan 2026 14:18:33 +0100 Subject: [PATCH 17/32] fehler.php config: changed some fehler to warnings --- application/config/fehler.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/application/config/fehler.php b/application/config/fehler.php index 68e833cd7..7c006c970 100644 --- a/application/config/fehler.php +++ b/application/config/fehler.php @@ -230,7 +230,7 @@ $config['fehler'] = array( 'fehler_kurzbz' => 'AusbildungssemPrestudentUngleichAusbildungssemStatus', 'fehlercode_extern' => null, 'fehlertext' => 'Ausbildungssemester %s des aktuellen Status stimmt nicht mit Ausbildungssemester %s bei StudentIn (Lehrverband) überein. (student_uid %s, prestudent_id %s, Studiensemester %s)', - 'fehlertyp_kurzbz' => 'error', + 'fehlertyp_kurzbz' => 'warning', 'app' => 'core', 'producerLibName' => 'AusbildungssemPrestudentUngleichAusbildungssemStatus', 'resolverLibName' => 'CORE_STUDENTSTATUS_0003', @@ -241,7 +241,7 @@ $config['fehler'] = array( 'fehler_kurzbz' => 'InaktiverStudentAktiverStatus', 'fehlercode_extern' => null, 'fehlertext' => 'Inaktiver Benutzer hat aktiven Status. (prestudent_id %s)', - 'fehlertyp_kurzbz' => 'error', + 'fehlertyp_kurzbz' => 'warning', 'app' => 'core', 'producerLibName' => 'InaktiverStudentAktiverStatus', 'resolverLibName' => 'CORE_STUDENTSTATUS_0004', @@ -329,7 +329,7 @@ $config['fehler'] = array( 'fehler_kurzbz' => 'BewerberNichtZumRtAngetreten', 'fehlercode_extern' => null, 'fehlertext' => 'Bewerber nicht zum Reihungstest angetreten (prestudent_id %s)', - 'fehlertyp_kurzbz' => 'error', + 'fehlertyp_kurzbz' => 'warning', 'app' => 'core', 'producerLibName' => 'BewerberNichtZumRtAngetreten', 'resolverLibName' => 'CORE_STUDENTSTATUS_0012', @@ -351,7 +351,7 @@ $config['fehler'] = array( 'fehler_kurzbz' => 'AbschlussstatusFehlt', 'fehlercode_extern' => null, 'fehlertext' => 'Kein Abschlussstatus (prestudent_id %s)', - 'fehlertyp_kurzbz' => 'error', + 'fehlertyp_kurzbz' => 'warning', 'app' => 'core', 'producerLibName' => 'AbschlussstatusFehlt', 'resolverLibName' => 'CORE_STUDENTSTATUS_0014', @@ -384,7 +384,7 @@ $config['fehler'] = array( 'fehler_kurzbz' => 'GbDatumWeitZurueck', 'fehlercode_extern' => null, 'fehlertext' => 'Geburtsdatum vor dem 01.01.1920', - 'fehlertyp_kurzbz' => 'error', + 'fehlertyp_kurzbz' => 'warning', 'app' => 'core', 'producerLibName' => 'GbDatumWeitZurueck', 'resolverLibName' => 'CORE_PERSON_0001', From f72ea1a655b51ed4ee43e92ead1a13333b2d3442 Mon Sep 17 00:00:00 2001 From: Alexei Karpenko Date: Wed, 28 Jan 2026 17:28:10 +0100 Subject: [PATCH 18/32] Pausicheckproducerlib: loading fehler config files with php without code igniter, due to naming index conflicts --- application/libraries/issues/PlausicheckProducerLib.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/application/libraries/issues/PlausicheckProducerLib.php b/application/libraries/issues/PlausicheckProducerLib.php index 34807c917..e1a4bc556 100644 --- a/application/libraries/issues/PlausicheckProducerLib.php +++ b/application/libraries/issues/PlausicheckProducerLib.php @@ -107,13 +107,13 @@ class PlausicheckProducerLib if (file_exists($configFilename)) { - $this->_ci->load->config($configFilePath); + $config = array(); // default value - $extensionEntries = $this->_ci->config->item(self::CONFIG_FEHLER_INDEX); + include($configFilename); - if (isset($extensionEntries) && is_array($extensionEntries)) + if (isset($config[self::CONFIG_FEHLER_NAME]) && is_array($config[self::CONFIG_FEHLER_NAME])) { - foreach ($extensionEntries as $extensionEntry) + foreach ($config[self::CONFIG_FEHLER_NAME] as $extensionEntry) { if ( !isset($extensionEntry[self::FEHLER_KURZBZ_NAME]) From 1c65d6e076153ce13a3d529dc43e88c7961b61bb Mon Sep 17 00:00:00 2001 From: Alexei Karpenko Date: Wed, 28 Jan 2026 17:49:06 +0100 Subject: [PATCH 19/32] plausicheckproducerlib, plausicheckresolverlib: added comments, resolver lib: loading producer lib only when calling resolvePlausicheckIssues, because producerlib is only needed for self-resolving logic in the resolvePlausicheckIssues method --- .../issues/PlausicheckProducerLib.php | 3 ++ .../issues/PlausicheckResolverLib.php | 30 ++++++++++++------- 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/application/libraries/issues/PlausicheckProducerLib.php b/application/libraries/issues/PlausicheckProducerLib.php index e1a4bc556..36bc19eb3 100644 --- a/application/libraries/issues/PlausicheckProducerLib.php +++ b/application/libraries/issues/PlausicheckProducerLib.php @@ -105,10 +105,12 @@ class PlausicheckProducerLib $configFilePath = ExtensionsLib::EXTENSIONS_DIR_NAME.'/'.$ext->name.'/'.self::CONFIG_FEHLER_NAME.'.php'; $configFilename = APPPATH.'config/'.$configFilePath; + // if fehler config file exists in extension if (file_exists($configFilename)) { $config = array(); // default value + // include the config file include($configFilename); if (isset($config[self::CONFIG_FEHLER_NAME]) && is_array($config[self::CONFIG_FEHLER_NAME])) @@ -123,6 +125,7 @@ class PlausicheckProducerLib continue; } + // add extension config data to fehler lib mappings $fehler_kurzbz = $extensionEntry[self::FEHLER_KURZBZ_NAME]; $this->_fehlerLibMappings[$fehler_kurzbz][self::PRODUCER_LIB_NAME] = $extensionEntry[self::PRODUCER_LIB_NAME]; diff --git a/application/libraries/issues/PlausicheckResolverLib.php b/application/libraries/issues/PlausicheckResolverLib.php index 06c3705a3..0f58deda0 100644 --- a/application/libraries/issues/PlausicheckResolverLib.php +++ b/application/libraries/issues/PlausicheckResolverLib.php @@ -41,20 +41,23 @@ class PlausicheckResolverLib // Load Fehler Entries of Core $configArray = $this->_ci->config->item(self::CONFIG_FEHLER_NAME); - $fehlerKurzbzArr = []; - foreach ($configArray as $coreEntry) { + // each entry must have fehlercode if (!isset($coreEntry[self::FEHLERCODE_NAME]) || !in_array($coreEntry[self::FEHLERCODE_NAME], $this->_fehlercodes) ) { continue; } - if (isset($coreEntry[self::FEHLER_KURZBZ_NAME])) $fehlerKurzbzArr[] = $coreEntry[self::FEHLER_KURZBZ_NAME]; + // fill code lib mappings with needed values + $fehlercode = $coreEntry[self::FEHLERCODE_NAME]; - $this->_codeLibMappings[$coreEntry[self::FEHLERCODE_NAME]][self::RESOLVER_LIB_NAME] = $coreEntry[self::RESOLVER_LIB_NAME] ?? null; - $this->_codeLibMappings[$coreEntry[self::FEHLERCODE_NAME]][self::PRODUCER_IS_RESOLVER_NAME] + if (isset($coreEntry[self::FEHLER_KURZBZ_NAME])) + $this->_codeLibMappings[$fehlercode][self::FEHLER_KURZBZ_NAME] = $coreEntry[self::FEHLER_KURZBZ_NAME]; + + $this->_codeLibMappings[$fehlercode][self::RESOLVER_LIB_NAME] = $coreEntry[self::RESOLVER_LIB_NAME] ?? null; + $this->_codeLibMappings[$fehlercode][self::PRODUCER_IS_RESOLVER_NAME] = $coreEntry[self::PRODUCER_IS_RESOLVER_NAME] ?? false; } @@ -71,10 +74,12 @@ class PlausicheckResolverLib { $configFilename = APPPATH.'config/'.ExtensionsLib::EXTENSIONS_DIR_NAME.'/'.$ext->name.'/'.self::CONFIG_FEHLER_NAME.'.php'; + // if fehler config file exists in teh extension if (file_exists($configFilename)) { $config = array(); // default value + // include config data include($configFilename); if (isset($config[self::CONFIG_FEHLER_NAME]) && is_array($config[self::CONFIG_FEHLER_NAME])) @@ -88,22 +93,21 @@ class PlausicheckResolverLib continue; } + // add extension config data to fehlercode lib mappings $fehlercode = $extensionEntry[self::FEHLERCODE_NAME]; - if (isset($extensionEntry[self::FEHLER_KURZBZ_NAME])) $fehlerKurzbzArr[] = $extensionEntry[self::FEHLER_KURZBZ_NAME]; + if (isset($extensionEntry[self::FEHLER_KURZBZ_NAME])) + $this->_codeLibMappings[$fehlercode][self::FEHLER_KURZBZ_NAME] = $extensionEntry[self::FEHLER_KURZBZ_NAME]; $this->_codeLibMappings[$fehlercode][self::RESOLVER_LIB_NAME] = $extensionEntry[self::RESOLVER_LIB_NAME] ?? null; $this->_codeLibMappings[$fehlercode][self::EXTENSION_NAME] = $ext->name; $this->_codeLibMappings[$fehlercode][self::PRODUCER_IS_RESOLVER_NAME] = $extensionEntry[self::PRODUCER_IS_RESOLVER_NAME] ?? false; - } } } } } - - $this->_ci->load->library('issues/PlausicheckProducerLib', ['fehlerKurzbz' => $fehlerKurzbzArr]); } /** @@ -113,6 +117,12 @@ class PlausicheckResolverLib */ public function resolvePlausicheckIssues($openIssues = null) { + // loading producer lib with fehler kurzbz of provided code mappings, for "self resolving" issues + $this->_ci->load->library( + 'issues/PlausicheckProducerLib', + ['fehlerKurzbz' => array_column($this->_codeLibMappings, self::FEHLER_KURZBZ_NAME)], 'PlausicheckResolverProducerLib' + ); + if (!isset($openIssues)) { if (!isEmptyArray($this->_fehlercodes)) @@ -168,7 +178,7 @@ class PlausicheckResolverLib if ($producerIsResolver) { // execute same check as used for issue production - $issueResolvedRes = $this->_ci->plausicheckproducerlib->producePlausicheckIssue( + $issueResolvedRes = $this->_ci->PlausicheckResolverProducerLib->producePlausicheckIssue( $issue->fehler_kurzbz, $params ); From 85db467cff57137b8abee1c7342188895a24a67c Mon Sep 17 00:00:00 2001 From: Alexei Karpenko Date: Wed, 28 Jan 2026 17:50:37 +0100 Subject: [PATCH 20/32] issuechecker: layout, commented out _app property --- .../controllers/api/frontend/v1/issues/IssueChecker.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/application/controllers/api/frontend/v1/issues/IssueChecker.php b/application/controllers/api/frontend/v1/issues/IssueChecker.php index d09a01af0..f4ffb4929 100644 --- a/application/controllers/api/frontend/v1/issues/IssueChecker.php +++ b/application/controllers/api/frontend/v1/issues/IssueChecker.php @@ -8,7 +8,7 @@ class IssueChecker extends FHCAPI_Controller protected $person_id; protected $_extensionName = null; protected $_fehlercodes = []; - protected $_app = null; + //protected $_app = null; TODO possible to check for all fehler of app? protected $errors = []; protected $infos = []; @@ -35,7 +35,7 @@ class IssueChecker extends FHCAPI_Controller // get fehler kurzbz from fehlercodes $this->FehlerModel->addSelect('fehler_kurzbz'); - if (!isEmptyArray($this->_fehlercodes))$this->FehlerModel->db->where_in('tbl_fehler.fehlercode', $this->_fehlercodes); + if (!isEmptyArray($this->_fehlercodes)) $this->FehlerModel->db->where_in('tbl_fehler.fehlercode', $this->_fehlercodes); $fehlerKurzbzRes = $this->FehlerModel->load(); if (isError($fehlerKurzbzRes)) $this->terminateWithError(getError($fehlerKurzbzRes), self::ERROR_TYPE_GENERAL); From 2de6278603ba202034ead1cfe3ec0430027dbaab Mon Sep 17 00:00:00 2001 From: Alexei Karpenko Date: Thu, 29 Jan 2026 11:46:52 +0100 Subject: [PATCH 21/32] IssueChecker: changed expected prop type of isseListStyle and issueListStyleBreakpoints --- public/js/components/Issues/IssueChecker.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/js/components/Issues/IssueChecker.js b/public/js/components/Issues/IssueChecker.js index 27fb960c2..94472d25d 100644 --- a/public/js/components/Issues/IssueChecker.js +++ b/public/js/components/Issues/IssueChecker.js @@ -26,10 +26,10 @@ export default { required: true }, issueListStyle: { - type: String + type: Object }, issueListStyleBreakpoints: { - type: String + type: Object } }, data() { From 10d52caa987b4f9aec452c2831b42c8abe22aafa Mon Sep 17 00:00:00 2001 From: Alexei Karpenko Date: Tue, 3 Feb 2026 15:39:11 +0100 Subject: [PATCH 22/32] Issue system: adapted to work with multiple apps per fehler --- .../system/issues/IssuesKonfiguration.php | 4 +- .../system/issues/IssuesZustaendigkeiten.php | 5 +- application/libraries/FehlerUpdateLib.php | 133 ++++++++++++------ application/libraries/IssuesLib.php | 49 ++++--- application/models/system/FehlerApp_model.php | 15 ++ application/models/system/Fehler_model.php | 37 +++++ .../system/Fehlerkonfiguration_model.php | 10 +- .../system/Fehlerkonfigurationstyp_model.php | 33 ----- application/models/system/Issue_model.php | 2 +- .../views/system/issues/issuesData.php | 5 +- .../system/issues/issuesKonfigurationData.php | 3 +- .../issues/issuesZustaendigkeitenData.php | 3 +- ...hlermonitoring_issues_weitere_features.php | 35 +++++ 13 files changed, 226 insertions(+), 108 deletions(-) create mode 100644 application/models/system/FehlerApp_model.php diff --git a/application/controllers/system/issues/IssuesKonfiguration.php b/application/controllers/system/issues/IssuesKonfiguration.php index a19a2a93b..abd314dbd 100644 --- a/application/controllers/system/issues/IssuesKonfiguration.php +++ b/application/controllers/system/issues/IssuesKonfiguration.php @@ -88,9 +88,11 @@ class IssuesKonfiguration extends Auth_Controller // get all Fehler, optionally filtered by app $params = array('fehlercode_extern' => null); + $this->FehlerModel->addDistinct(); $this->FehlerModel->addSelect('fehlercode, fehler_kurzbz, fehlertyp_kurzbz, fehlertext'); + $this->FehlerModel->addJoin('system.tbl_fehler_app', 'fehlercode'); $this->FehlerModel->addOrder('fehlercode'); - if (!isEmptyString($app)) $params['app'] = $app; + if (!isEmptyString($app)) $params['tbl_fehler_app.app'] = $app; $fehlerRes = $this->FehlerModel->loadWhere($params); if (isError($fehlerRes)) $this->terminateWithJsonError($this->p->t('fehlermonitoring', 'fehlerFehlerLaden')); diff --git a/application/controllers/system/issues/IssuesZustaendigkeiten.php b/application/controllers/system/issues/IssuesZustaendigkeiten.php index d7bf9836e..cf343084d 100644 --- a/application/controllers/system/issues/IssuesZustaendigkeiten.php +++ b/application/controllers/system/issues/IssuesZustaendigkeiten.php @@ -69,10 +69,7 @@ class IssuesZustaendigkeiten extends Auth_Controller { $app = $this->input->get('app'); - $this->FehlerModel->addSelect('fehlercode, fehler_kurzbz, fehlertext, fehlertyp_kurzbz, app'); - $this->FehlerModel->addOrder('fehlercode'); - - $fehlerRes = isset($app) ? $this->FehlerModel->loadWhere(array('app' => $app)) : $this->FehlerModel->load(); + $fehlerRes = $this->FehlerModel->getByApps($app); $this->outputJson($fehlerRes); } diff --git a/application/libraries/FehlerUpdateLib.php b/application/libraries/FehlerUpdateLib.php index 0e6f3914f..d8ae2ef68 100644 --- a/application/libraries/FehlerUpdateLib.php +++ b/application/libraries/FehlerUpdateLib.php @@ -50,6 +50,7 @@ class FehlerUpdateLib ]; private $_ci; // Code igniter instance + private $_updateHistory = []; /** * Loads parser library @@ -74,9 +75,7 @@ class FehlerUpdateLib /** - * - * @param - * @return object success or error + * Install all possible fehler, from core and extensions */ public function installAll() { @@ -121,7 +120,6 @@ class FehlerUpdateLib } - // ----------------------------------------------------------------------------------------------------------------- // Private methods @@ -190,22 +188,29 @@ class FehlerUpdateLib */ private function _updateFehler($fehler) { + $fehlerReferences = $fehler['references']; + $fehler = $fehler['fehler']; + // Checks if the fehler already exists in the database $this->_ci->FehlerModel->db->where(self::FEHLERCODE.' = ', $fehler[self::FEHLERCODE]); - if ($fehler[self::FEHLER_KURZBZ] != null) $this->_ci->FehlerModel->db->or_where(self::FEHLER_KURZBZ.' = ', $fehler[self::FEHLER_KURZBZ]); + if (isset($fehler[self::FEHLER_KURZBZ]) && !isEmptyString($fehler[self::FEHLER_KURZBZ])) + $this->_ci->FehlerModel->db->or_where(self::FEHLER_KURZBZ.' = ', $fehler[self::FEHLER_KURZBZ]); $fehlerResult = $this->_ci->FehlerModel->load(); // If an error occurred then return the error itself if (isError($fehlerResult)) return $fehlerResult; + $updateRes = null; + // if fehler has been found if (hasData($fehlerResult)) { $foundFehler = getData($fehlerResult)[0]; // check if fehlercode - fehler kurzbz combination is correct - if ($foundFehler->{self::FEHLERCODE} != $fehler[self::FEHLERCODE] || $foundFehler->{self::FEHLER_KURZBZ} != $fehler[self::FEHLER_KURZBZ]) - { + if ($foundFehler->{self::FEHLERCODE} != $fehler[self::FEHLERCODE] + || $foundFehler->{self::FEHLER_KURZBZ} != ($fehler[self::FEHLER_KURZBZ] ?? null) + ) { return error("Wrong fehlercode - fehler kurzbz combination: ".$fehler[self::FEHLERCODE].", ".$fehler[self::FEHLER_KURZBZ]); } @@ -224,6 +229,13 @@ class FehlerUpdateLib if (isset($attributeInfo['updateable']) && $attributeInfo['updateable'] && $foundFehler->{$attributeName} != $fehler[$attributeName]) { $updateArr[$attributeName] = $fehler[$attributeName]; + + if (isset($this->_updateHistory[$foundFehler->{self::FEHLERCODE}][$attributeName]) + && $this->_updateHistory[$foundFehler->{self::FEHLERCODE}][$attributeName] != $fehler[$attributeName] + ) { + return error("Conflicting update values for attribute ".$attributeName.", fehler ".$foundFehler->{self::FEHLERCODE}); + } + $this->_updateHistory[$foundFehler->{self::FEHLERCODE}][$attributeName] = $fehler[$attributeName]; } } @@ -239,50 +251,60 @@ class FehlerUpdateLib "Fehler ".$fehler[self::FEHLERCODE].(isset($fehler[self::FEHLER_KURZBZ]) ? " (".$fehler[self::FEHLER_KURZBZ].")" : "")." updated" ); } + } + else + { + // no fehler has been found - return success($fehler[self::FEHLERCODE]); + // then add the fehler to the database + $updateRes = $this->_ci->FehlerModel->insert( + array_merge($fehler, ['insertamum' => 'NOW()', 'insertvon' => self::UPSERT_BY]) + ); + + // If an error occurred then return the error itself + if (isError($updateRes)) return $updateRes; + + // Prints info about the new added fehler + $this->_ci->eprintflib->printMessage( + sprintf( + 'A new fehler has been added into the database: '. + 'fehlercode => %s | fehler_kurzbz => %s | fehlertyp => %s', + $fehler[self::FEHLERCODE], + $fehler[self::FEHLER_KURZBZ], + $fehler[self::FEHLERTYP_KURZBZ] + ) + ); } - // no fehler has been found - - // handle apps - if (isset($fehler[self::APP])) + // handle references + if (isset($fehlerReferences[self::APP])) { - $apps = $fehler[self::APP]; - if (is_string($apps)) $apps = [$apps]; + $this->_ci->load->model('system/FehlerApp_model', 'FehlerAppModel'); + $apps = $fehlerReferences[self::APP]; - foreach ($apps as $app) + // load all assigned apps + $this->_ci->FehlerAppModel->addSelect(self::APP); + $fehlerAppRes = $this->_ci->FehlerAppModel->loadWhere([self::FEHLERCODE => $fehler[self::FEHLERCODE]]); + + $fehlerApps = hasData($fehlerAppRes) ? array_column(getData($fehlerAppRes), self::APP) : []; + + $appsToInsert = array_diff($apps, $fehlerApps); + + foreach ($appsToInsert as $app) { // check if app exists in db - $this->_ci->AppModel->addSelect('1'); - $appRes = $this->_ci->AppModel->loadWhere(['app' => $app]); + $fehlerAppsInsertRes = $this->_ci->FehlerAppModel->insert( + [self::FEHLERCODE => $fehler[self::FEHLERCODE], self::APP => $app, 'insertamum' => 'NOW()', 'insertvon' => self::UPSERT_BY] + ); - if (!hasData($appRes)) return error("App ".$app." does not exist"); - // TODO add entry for each app + if (isError($fehlerAppsInsertRes)) return $fehlerAppsInsertRes; + + $this->_ci->eprintflib->printMessage( + "Added app ".$app." to fehler ".$fehler[self::FEHLERCODE] + ); } - - $fehler[self::APP] = $apps[0]; } - // Then add the fehler to the database - $fehlerInsertResult = $this->_ci->FehlerModel->insert( - array_merge($fehler, ['insertamum' => 'NOW()', 'insertvon' => self::UPSERT_BY]) - ); - - // If an error occurred then return the error itself - if (isError($fehlerInsertResult)) return $fehlerInsertResult; - - // Prints info about the new added fehler - $this->_ci->eprintflib->printMessage( - sprintf( - 'A new fehler has been added into the database: '. - 'fehlercode => %s | fehler_kurzbz => %s | fehlertyp => %s', - $fehler[self::FEHLERCODE], - $fehler[self::FEHLER_KURZBZ], - $fehler[self::FEHLERTYP_KURZBZ] - ) - ); - // If here then no blocking errors occurred return success(); } @@ -292,13 +314,14 @@ class FehlerUpdateLib */ private function _createFehlerFromEntry($configEntry) { - $fehler = []; + $fehler = ['fehler' => [], 'references' => []]; foreach (self::FEHLER_ATTRIBUTES as $attributeName => $attributeInfo) { $required = isset($attributeInfo['required']) && $attributeInfo['required']; - if ($required && !isset($configEntry[$attributeName])) + if (!isset($configEntry[$attributeName])) { - return error('attribute'.$attributeName.' is missing'); + if ($required) return error('attribute'.$attributeName.' is missing'); + continue; } $attributeValue = $configEntry[$attributeName]; @@ -330,7 +353,29 @@ class FehlerUpdateLib return error('attribute'.$attributeName.' has invalid type'); } - $fehler[$attributeName] = $configEntry[$attributeName]; + if ($attributeName == self::APP) + { + if (is_string($attributeValue)) $attributeValue = [$attributeValue]; + + foreach ($attributeValue as $app) + { + // check if app exists in db + $this->_ci->AppModel->addSelect('1'); + $appRes = $this->_ci->AppModel->loadWhere(['app' => $app]); + + if (!hasData($appRes)) return error("App ".$app." does not exist"); + } + } + + if (isset($attributeInfo['types']) && is_array($attributeInfo['types']) && in_array(self::TYPE_ARRAY, $attributeInfo['types'])) + { + $fehler['references'][$attributeName] = $attributeValue; + } + else + { + $fehler['fehler'][$attributeName] = $attributeValue; + } + } return success($fehler); } diff --git a/application/libraries/IssuesLib.php b/application/libraries/IssuesLib.php index a5369d7e2..c9cbf75d6 100644 --- a/application/libraries/IssuesLib.php +++ b/application/libraries/IssuesLib.php @@ -20,6 +20,10 @@ class IssuesLib const ERRORTYPE_CODE = 'error'; const WARNINGTYPE_CODE = 'warning'; + const STATUS_KURZBZ = 'status_kurzbz'; + const VERARBEITET_AMUM = 'verarbeitetamum'; + const VERARBEITET_VON = 'verarbeitetvon'; + public function __construct($params = null) { $this->_ci =& get_instance(); @@ -91,12 +95,16 @@ class IssuesLib return error("fehlercode_extern missing"); // get external fehlercode (unique for each app) - $this->_ci->FehlerModel->addSelect('fehlercode'); - $fehlerRes = $this->_ci->FehlerModel->loadWhere( - array( - 'fehlercode_extern' => $fehlercode_extern, - 'app' => $this->_app - ) + $fehlerRes = $this->_ci->FehlerModel->execReadOnlyQuery( + ' + SELECT + fehlercode + FROM + system.tbl_fehler fe + WHERE + fehlercode_extern = ? + AND EXISTS (SELECT 1 FROM system.tbl_fehler_app WHERE fehlercode = fe.fehlercode AND app = ?)', + [$fehlercode_extern, $this->_app] ); if (isError($fehlerRes)) @@ -105,8 +113,10 @@ class IssuesLib // check if there is a predefined custom error for the external issue if (hasData($fehlerRes)) { - $fehlerData = getData($fehlerRes)[0]; // if found, use the code + $fehlerData = getData($fehlerRes); + if (count($fehlerData) > 1) return error("Multiple fehlercode_extern ".$fehlercode_extern. " for app ".$this->_app); + $fehlerData = getData($fehlerRes)[0]; $fehlercode = $fehlerData->fehlercode; } else @@ -128,9 +138,9 @@ class IssuesLib public function setBehoben($issue_id, $user) { $data = array( - 'status_kurzbz' => self::STATUS_BEHOBEN, - 'verarbeitetvon' => $user, - 'verarbeitetamum' => date('Y-m-d H:i:s') + self::STATUS_KURZBZ => self::STATUS_BEHOBEN, + self::VERARBEITET_VON => $user, + self::VERARBEITET_AMUM => date('Y-m-d H:i:s') ); return $this->_changeIssueStatus($issue_id, $data, $user); @@ -145,8 +155,8 @@ class IssuesLib public function setInBearbeitung($issue_id, $user) { $data = array( - 'status_kurzbz' => self::STATUS_IN_BEARBEITUNG, - 'verarbeitetvon' => $user + self::STATUS_KURZBZ => self::STATUS_IN_BEARBEITUNG, + self::VERARBEITET_VON => $user ); return $this->_changeIssueStatus($issue_id, $data, $user); @@ -161,9 +171,9 @@ class IssuesLib public function setNeu($issue_id, $user) { $data = array( - 'status_kurzbz' => self::STATUS_NEU, - 'verarbeitetvon' => null, - 'verarbeitetamum' => null + self::STATUS_KURZBZ => self::STATUS_NEU, + self::VERARBEITET_VON => null, + self::VERARBEITET_AMUM => null ); return $this->_changeIssueStatus($issue_id, $data, $user); @@ -185,13 +195,18 @@ class IssuesLib return error("Issue Id must be set correctly."); // check if given status is same as existing - $this->_ci->IssueModel->addSelect('status_kurzbz'); + $this->_ci->IssueModel->addSelect(self::STATUS_KURZBZ.', '.self::VERARBEITET_AMUM); $currStatus = $this->_ci->IssueModel->load($issue_id); if (hasData($currStatus)) { - if (getData($currStatus)[0]->status_kurzbz == $data['status_kurzbz']) + $currStatusData = getData($currStatus)[0]; + // if same status set, and verarbeitet amum is not being newly set + if ($currStatusData->{self::STATUS_KURZBZ} == $data[self::STATUS_KURZBZ] + && !(isset($data[self::VERARBEITET_AMUM]) && !isset($currStatusData->{self::VERARBEITET_AMUM})) + ) { return success("Same status already set"); + } } else return error("Error when getting status"); diff --git a/application/models/system/FehlerApp_model.php b/application/models/system/FehlerApp_model.php new file mode 100644 index 000000000..d803894f1 --- /dev/null +++ b/application/models/system/FehlerApp_model.php @@ -0,0 +1,15 @@ +dbTable = 'system.tbl_fehler_app'; + $this->pk = array('fehlercode', 'app'); + $this->hasSequence = false; + } +} \ No newline at end of file diff --git a/application/models/system/Fehler_model.php b/application/models/system/Fehler_model.php index 2b0dc8802..cf0c45092 100644 --- a/application/models/system/Fehler_model.php +++ b/application/models/system/Fehler_model.php @@ -12,4 +12,41 @@ class Fehler_model extends DB_Model $this->pk = array('fehlercode'); $this->hasSequence = false; } + + /** + * Gets all fehler for particular apps. + * @param $apps string of one app or array with multiple + * @return object success or error + */ + public function getByApps($apps) + { + if (is_string($apps)) $apps = [$apps]; + + $params = []; + + $qry = " + SELECT + fehlercode, fehler_kurzbz, fehlercode_extern, fehlertext, fehlertyp_kurzbz + FROM + system.tbl_fehler fe"; + + if (!isEmptyArray($apps)) + { + $qry .= " + WHERE EXISTS ( + SELECT 1 + FROM + system.tbl_fehler_app + WHERE + fehlercode = fe.fehlercode + AND app IN ? + )"; + + $params[] = $apps; + } + + $qry .= " ORDER BY fehlercode;"; + + return $this->execReadOnlyQuery($qry, $params); + } } diff --git a/application/models/system/Fehlerkonfiguration_model.php b/application/models/system/Fehlerkonfiguration_model.php index 442c8212f..2186ef933 100644 --- a/application/models/system/Fehlerkonfiguration_model.php +++ b/application/models/system/Fehlerkonfiguration_model.php @@ -15,18 +15,20 @@ class Fehlerkonfiguration_model extends DB_Model /** * Retrieve all set configuration parameters, optionally filtered by app. - * @param string $app + * @param string $apps * @return object success or error */ public function getKonfiguration($apps = null) { + if (is_string($apps)) $apps = [$apps]; $fehlerkonfiguration = array(); - $apps = is_string($apps) ? [$apps] : $apps; - $this->addSelect('fehlercode, konfigurationstyp_kurzbz, konfiguration, fehler_kurzbz'); + $this->addDistinct(); + $this->addSelect('fehler.fehlercode, konftyp.konfigurationstyp_kurzbz, tbl_fehler_konfiguration.konfiguration, fehler.fehler_kurzbz'); $this->addJoin('system.tbl_fehler_konfigurationstyp konftyp', 'konfigurationstyp_kurzbz'); $this->addJoin('system.tbl_fehler fehler', 'fehlercode'); - if (is_array($apps) && !isEmptyArray($apps)) $this->db->where_in('fehler.app', $apps); + $this->addJoin('system.tbl_fehler_app fe_app', 'fehlercode'); + if (isset($apps) && !isEmptyArray($apps)) $this->db->where_in('fe_app.app', $apps); $fehlerkonfigurationRes = $this->load(); if (isError($fehlerkonfigurationRes)) return $fehlerkonfigurationRes; diff --git a/application/models/system/Fehlerkonfigurationstyp_model.php b/application/models/system/Fehlerkonfigurationstyp_model.php index dc1c7957f..07a0b88ee 100644 --- a/application/models/system/Fehlerkonfigurationstyp_model.php +++ b/application/models/system/Fehlerkonfigurationstyp_model.php @@ -11,37 +11,4 @@ class Fehlerkonfigurationstyp_model extends DB_Model $this->dbTable = 'system.tbl_fehler_konfigurationstyp'; $this->pk = array('konfigurationstyp_kurzbz'); } - - /** - * Retrieve all set configuration parameters, optionally filtered by app. - * @param string $app - * @return object success or error - */ - public function getKonfiguration($app = null) - { - $fehlerkonfiguration = array(); - - $this->addSelect('fehlercode, konfigurationstyp_kurzbz, konfiguration, fehler_kurzbz'); - $this->addJoin('system.tbl_fehler_konfigurationstyp konftyp', 'konfigurationstyp_kurzbz'); - $this->addJoin('system.tbl_fehler fehler', 'fehlercode'); - $fehlerkonfigurationRes = isset($app) ? $this->loadWhere(array('fehler.app' => $app)) : $this->load(); - - if (isError($fehlerkonfigurationRes)) return $fehlerkonfigurationRes; - - if (hasData($fehlerkonfigurationRes)) - { - $fehlerkonfigurationData = getData($fehlerkonfigurationRes); - foreach ($fehlerkonfigurationData as $fk) - { - $konf = json_decode($fk->konfiguration); - if (is_array($konf)) - { - $fk->konfiguration = $konf; - $fehlerkonfiguration[] = $fk; - } - } - } - - return success($fehlerkonfiguration); - } } diff --git a/application/models/system/Issue_model.php b/application/models/system/Issue_model.php index c1d31a5ee..0e3ee3fbc 100644 --- a/application/models/system/Issue_model.php +++ b/application/models/system/Issue_model.php @@ -182,7 +182,7 @@ class Issue_model extends DB_Model if (is_array($apps)) { - $qry .= ' AND app IN ?'; + $qry .= ' AND EXISTS (SELECT 1 FROM system.tbl_fehler_app WHERE fehlercode = fe.fehlercode AND app IN ?)'; $params[] = $apps; } } diff --git a/application/views/system/issues/issuesData.php b/application/views/system/issues/issuesData.php index edaee9058..d94fb2904 100644 --- a/application/views/system/issues/issuesData.php +++ b/application/views/system/issues/issuesData.php @@ -49,7 +49,8 @@ $query .= " inhalt AS \"Inhalt\", inhalt_extern AS \"Inhalt extern\", iss.person_id AS \"PersonId\", iss.oe_kurzbz AS \"OE\", ftyp.bezeichnung_mehrsprachig[".$this->db->escape($language_index)."] AS \"Fehlertyp\", stat.bezeichnung_mehrsprachig[".$this->db->escape($language_index)."] AS \"Fehlerstatus\", - verarbeitetvon AS \"Verarbeitet von\",verarbeitetamum AS \"Verarbeitet am\", fr.app AS \"Applikation\", + verarbeitetvon AS \"Verarbeitet von\",verarbeitetamum AS \"Verarbeitet am\", + (SELECT STRING_AGG(app, ', ') FROM system.tbl_fehler_app WHERE fehlercode = fr.fehlercode GROUP BY fehlercode) AS \"Applikation\", fr.fehlertyp_kurzbz AS \"Fehlertypcode\", iss.status_kurzbz AS \"Statuscode\", pers.vorname AS \"Vorname\", pers.nachname AS \"Nachname\", ( @@ -168,7 +169,7 @@ $query .= ") $query .= ") "; -if (!isEmptyString($APPS)) $query .= " AND fr.app IN ".$APPS; +if (!isEmptyString($APPS)) $query .= " AND EXISTS (SELECT 1 FROM system.tbl_fehler_app WHERE fehlercode = fr.fehlercode AND app IN ".$APPS.")"; $query .= " ORDER BY CASE diff --git a/application/views/system/issues/issuesKonfigurationData.php b/application/views/system/issues/issuesKonfigurationData.php index a83dc73ce..dbd41c6e9 100644 --- a/application/views/system/issues/issuesKonfigurationData.php +++ b/application/views/system/issues/issuesKonfigurationData.php @@ -2,7 +2,8 @@ // get assigned Konfiguration $query = "SELECT - konftyp.konfigurationstyp_kurzbz, fe.fehlercode, fe.fehler_kurzbz, konf.konfiguration, fe.app, + konftyp.konfigurationstyp_kurzbz, fe.fehlercode, fe.fehler_kurzbz, konf.konfiguration, + (SELECT STRING_AGG(app, ', ') FROM system.tbl_fehler_app WHERE fehlercode = fe.fehlercode GROUP BY fehlercode) AS app, konftyp.beschreibung AS konfigurationsbeschreibung, konftyp.konfigurationsdatentyp, fe.fehlertext FROM system.tbl_fehler_konfiguration konf diff --git a/application/views/system/issues/issuesZustaendigkeitenData.php b/application/views/system/issues/issuesZustaendigkeitenData.php index d4cedd192..bce52a5f9 100644 --- a/application/views/system/issues/issuesZustaendigkeitenData.php +++ b/application/views/system/issues/issuesZustaendigkeitenData.php @@ -1,7 +1,8 @@ db_query("SELECT insertamum FROM system.tbl_fehler LIMIT 1") echo 'system.tbl_fehler '.$db->db_last_error().'
'; else echo '
Spalten insertamum, insertvon, updateamum, updatevon in system.tbl_fehler hinzugefügt'; +} + +if (!$result = @$db->db_query('SELECT 1 FROM system.tbl_fehler_app LIMIT 1')) +{ + $qry = 'CREATE TABLE system.tbl_fehler_app + ( + fehlercode varchar(64), + app varchar(32) NOT NULL, + insertamum timestamp DEFAULT now(), + insertvon varchar(32) + ); + + COMMENT ON TABLE system.tbl_fehler_app IS \'Fehler app Zuordnungen\'; + COMMENT ON COLUMN system.tbl_fehler_app.fehlercode IS \'Fehler\'; + COMMENT ON COLUMN system.tbl_fehler_app.app IS \'dem Fehler zugeweisene App\'; + + ALTER TABLE system.tbl_fehler_app ADD CONSTRAINT pk_fehler_app PRIMARY KEY (fehlercode, app); + ALTER TABLE system.tbl_fehler_app ADD CONSTRAINT fk_fehler_app_app FOREIGN KEY (app) REFERENCES system.tbl_app(app) ON UPDATE CASCADE ON DELETE RESTRICT; + ALTER TABLE system.tbl_fehler_app ADD CONSTRAINT fk_fehler_app_fehlercode FOREIGN KEY (fehlercode) REFERENCES system.tbl_fehler(fehlercode) ON UPDATE CASCADE ON DELETE CASCADE; + + GRANT SELECT, UPDATE, INSERT, DELETE ON system.tbl_fehler_app TO web; + GRANT SELECT, UPDATE, INSERT, DELETE ON system.tbl_fehler_app TO vilesci; + + -- prefill values + INSERT INTO system.tbl_fehler_app(fehlercode, app, insertvon) + SELECT fehlercode, app, \'dbupdate\' FROM system.tbl_fehler; + + -- remove not null constraint from old table + ALTER TABLE system.tbl_fehler ALTER COLUMN app DROP NOT NULL; + '; + + if(!$db->db_query($qry)) + echo 'system.tbl_fehler_app: '.$db->db_last_error().'
'; + else + echo ' system.tbl_fehler_app: Tabelle hinzugefuegt
'; } \ No newline at end of file From 4c03668082b0eafe3e9995e6c446b9e4eab2ecd2 Mon Sep 17 00:00:00 2001 From: Alexei Karpenko Date: Tue, 10 Feb 2026 17:34:17 +0100 Subject: [PATCH 23/32] PlausiIssueProducer Controller: added default run method --- application/core/PlausiIssueProducer_Controller.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/application/core/PlausiIssueProducer_Controller.php b/application/core/PlausiIssueProducer_Controller.php index 6004a3e0e..215d843d5 100644 --- a/application/core/PlausiIssueProducer_Controller.php +++ b/application/core/PlausiIssueProducer_Controller.php @@ -8,6 +8,15 @@ abstract class PlausiIssueProducer_Controller extends JOB_Controller protected $_fehlerKurzbz = []; protected $_apps; + /** + * Runs issue production job. + */ + public function run() + { + // producing issues + $this->producePlausicheckIssues(array()); + } + protected function producePlausicheckIssues($params) { $this->load->library( From 43811d57245d9ee8db257ddf21b5fac7e2e066a9 Mon Sep 17 00:00:00 2001 From: Alexei Karpenko Date: Thu, 12 Feb 2026 14:46:49 +0100 Subject: [PATCH 24/32] fehler/issue monitoring: enabled resolving/producing by app only, improved error messages, code layout, removed error: fehler to produce is not defined in config --- .../api/frontend/v1/issues/IssueChecker.php | 48 +++++++++++----- .../api/frontend/v1/issues/Issues.php | 57 ++++++++----------- application/libraries/IssuesLib.php | 4 +- .../issues/PlausicheckProducerLib.php | 16 ++---- .../issues/PlausicheckResolverLib.php | 28 +++++++-- 5 files changed, 91 insertions(+), 62 deletions(-) diff --git a/application/controllers/api/frontend/v1/issues/IssueChecker.php b/application/controllers/api/frontend/v1/issues/IssueChecker.php index f4ffb4929..efd457ace 100644 --- a/application/controllers/api/frontend/v1/issues/IssueChecker.php +++ b/application/controllers/api/frontend/v1/issues/IssueChecker.php @@ -8,7 +8,7 @@ class IssueChecker extends FHCAPI_Controller protected $person_id; protected $_extensionName = null; protected $_fehlercodes = []; - //protected $_app = null; TODO possible to check for all fehler of app? + protected $_apps = []; protected $errors = []; protected $infos = []; @@ -33,31 +33,53 @@ class IssueChecker extends FHCAPI_Controller $this->load->model('system/Fehler_model', 'FehlerModel'); $this->load->model('person/Person_model', 'PersonModel'); - // get fehler kurzbz from fehlercodes - $this->FehlerModel->addSelect('fehler_kurzbz'); - if (!isEmptyArray($this->_fehlercodes)) $this->FehlerModel->db->where_in('tbl_fehler.fehlercode', $this->_fehlercodes); - $fehlerKurzbzRes = $this->FehlerModel->load(); + $producerArgs = []; + $resolverArgs = []; - if (isError($fehlerKurzbzRes)) $this->terminateWithError(getError($fehlerKurzbzRes), self::ERROR_TYPE_GENERAL); + // get fehler kurzbz from fehlercodes, if fehlercodes provided + if (!isEmptyArray($this->_fehlercodes)) + { + $this->FehlerModel->addSelect('fehlercode, fehler_kurzbz'); + $this->FehlerModel->db->where_in('tbl_fehler.fehlercode', $this->_fehlercodes); + $fehlerKurzbzRes = $this->FehlerModel->load(); - $fehlerKurzbz = hasData($fehlerKurzbzRes) ? array_column(getData($fehlerKurzbzRes), 'fehler_kurzbz') : []; + if (isError($fehlerKurzbzRes)) $this->terminateWithError(getError($fehlerKurzbzRes), self::ERROR_TYPE_GENERAL); + if (hasData($fehlerKurzbzRes)) + { + $producerArgs['fehlerKurzbz'] = array_column(getData($fehlerKurzbzRes), 'fehler_kurzbz'); + $resolverArgs['fehlercode'] = array_column(getData($fehlerKurzbzRes), 'fehlercode'); + } + } + elseif (!isEmptyArray($this->_apps)) // if apps are provided + { + // get fehlercodes for the apps + $fehlerRes = $this->FehlerModel->getByApps($this->_apps); + if (hasData($fehlerRes)) $this->_fehlercodes = array_column(getData($fehlerRes), 'fehlercode'); + + $producerArgs['apps'] = $this->_apps; + $resolverArgs['apps'] = $this->_apps; + } // load producer and checker libraries with fehler kurbz and fehlercode list $this->load->library( 'issues/PlausicheckProducerLib', - array( - 'fehlerKurzbz' => $fehlerKurzbz - ), + $producerArgs, 'PlausicheckProducerLib' ); $this->load->library( 'issues/PlausicheckResolverLib', - array( - 'fehlercodes' => $this->_fehlercodes - ), + $resolverArgs, 'PlausicheckResolverLib' ); + + $this->load->library('PhrasesLib'); + + $this->loadPhrases( + array( + 'ui' + ) + ); } public function checkPerson() diff --git a/application/controllers/api/frontend/v1/issues/Issues.php b/application/controllers/api/frontend/v1/issues/Issues.php index 79ce91db2..89a166ce3 100644 --- a/application/controllers/api/frontend/v1/issues/Issues.php +++ b/application/controllers/api/frontend/v1/issues/Issues.php @@ -6,11 +6,9 @@ defined('BASEPATH') || exit('No direct script access allowed'); class Issues extends FHCAPI_Controller { const DEFAULT_PERMISSION = 'system/issues_verwalten:r'; - // code igniter - protected $CI; public function __construct() { - + parent::__construct( array( 'getOpenIssuesByProperties' => Self::DEFAULT_PERMISSION, @@ -26,9 +24,6 @@ class Issues extends FHCAPI_Controller $this->load->model('system/Fehler_model','FehlerModel'); $this->load->model('system/Issue_model', 'IssueModel'); $this->load->model('person/Benutzer_model', 'BenutzerModel'); - - // get CI for transaction management - $this->CI = &get_instance(); } public function getOpenIssuesByProperties() @@ -46,8 +41,6 @@ class Issues extends FHCAPI_Controller if (isset($behebung_parameter) && !is_array($behebung_parameter)) $this->terminateWithError('Behebung parameter invalid'); - $this->addMeta("vorher", $hauptzustaendig); - $issueRes = $this->IssueModel->getOpenIssuesByProperties( $person_id, $oe_kurzbz, @@ -67,39 +60,39 @@ class Issues extends FHCAPI_Controller public function getPersonenMitOffenenIssues() { - + $sql = <<=now()) ) aktiv -FROM - system.tbl_issue -JOIN - system.tbl_fehler USING (fehlercode) -JOIN - public.tbl_person USING (person_id) -JOIN - public.tbl_benutzer USING (person_id) -JOIN - public.tbl_mitarbeiter ON uid = mitarbeiter_uid -WHERE - app = 'personalverwaltung' AND verarbeitetamum IS NULL -GROUP BY - person_id, uid, vorname, nachname -HAVING - count(*) > 0 -ORDER BY +FROM + system.tbl_issue +JOIN + system.tbl_fehler USING (fehlercode) +JOIN + public.tbl_person USING (person_id) +JOIN + public.tbl_benutzer USING (person_id) +JOIN + public.tbl_mitarbeiter ON uid = mitarbeiter_uid +WHERE + app = 'personalverwaltung' AND verarbeitetamum IS NULL +GROUP BY + person_id, uid, vorname, nachname +HAVING + count(*) > 0 +ORDER BY count(*) DESC; - + EOSQL; - + $personenmitissues = $this->IssueModel->execReadOnlyQuery($sql); - if( hasData($personenmitissues) ) + if( hasData($personenmitissues) ) { $this->terminateWithSuccess(getData($personenmitissues)); } diff --git a/application/libraries/IssuesLib.php b/application/libraries/IssuesLib.php index c9cbf75d6..8e505bd83 100644 --- a/application/libraries/IssuesLib.php +++ b/application/libraries/IssuesLib.php @@ -243,7 +243,7 @@ class IssuesLib $inhalt_extern = null ) { if (isEmptyString($person_id) && isEmptyString($oe_kurzbz)) - return error("Person_id or oe_kurzbz must be set."); + return error("Person_id or oe_kurzbz must be set, fehlercode: $fehlercode"); // get fehlertextVorlage and replace it with params $fehlerRes = $this->_ci->FehlerModel->loadWhere(['fehlercode' => $fehlercode]); @@ -256,7 +256,7 @@ class IssuesLib if (!isEmptyArray($fehlertext_params)) { if (count($fehlertext_params) != substr_count($fehlertextVorlage, '%s')) - return error('Wrong number of parameters for Fehlertext, fehler_kurzbz ' . $fehlercode); + return error('Wrong number of parameters for Fehlertext, fehlercode ' . $fehlercode); $fehlertext = vsprintf($fehlertextVorlage, $fehlertext_params); } diff --git a/application/libraries/issues/PlausicheckProducerLib.php b/application/libraries/issues/PlausicheckProducerLib.php index 36bc19eb3..bcab8ac56 100644 --- a/application/libraries/issues/PlausicheckProducerLib.php +++ b/application/libraries/issues/PlausicheckProducerLib.php @@ -61,14 +61,10 @@ class PlausicheckProducerLib } else { - $this->_ci->FehlerModel->addSelect('fehler_kurzbz'); - if (!isEmptyArray($this->_apps)) $this->_ci->FehlerModel->db->where_in('app', $this->_apps); - $fehlerRes = $this->_ci->FehlerModel->load(); + // get fehler by apps + $fehlerRes = $this->_ci->FehlerModel->getByApps($this->_apps); - if (hasData($fehlerRes)) - { - $this->_fehlerKurzbz = array_column(getData($fehlerRes), 'fehler_kurzbz'); - } + if (hasData($fehlerRes)) $this->_fehlerKurzbz = array_column(getData($fehlerRes), 'fehler_kurzbz'); } // get producer file paths for the fehler @@ -151,10 +147,10 @@ class PlausicheckProducerLib $mappingFehlerKurbz = array_keys($this->_fehlerLibMappings); // check if all issues to produce could be found in database - $notFoundFehlerKurzbz = array_diff($this->_fehlerKurzbz, $mappingFehlerKurbz); + //~ $notFoundFehlerKurzbz = array_diff($this->_fehlerKurzbz, $mappingFehlerKurbz); - if (!isEmptyArray($notFoundFehlerKurzbz)) - $result->errors[] = error('Fehler to produce not defined in config: '.implode(', ', $notFoundFehlerKurzbz)); + //~ if (!isEmptyArray($notFoundFehlerKurzbz)) + //~ $result->errors[] = error('Fehler to produce not defined in config: '.implode(', ', $notFoundFehlerKurzbz)); foreach ($mappingFehlerKurbz as $fehler_kurzbz) { diff --git a/application/libraries/issues/PlausicheckResolverLib.php b/application/libraries/issues/PlausicheckResolverLib.php index 0f58deda0..e4cdcc23f 100644 --- a/application/libraries/issues/PlausicheckResolverLib.php +++ b/application/libraries/issues/PlausicheckResolverLib.php @@ -20,18 +20,36 @@ class PlausicheckResolverLib private $_ci; // ci instance private $_extensionName; // name of extension private $_fehlercodes = []; // name of extension + private $_apps = []; // apps for which issues should be resolved private $_codeLibMappings = []; // mappings for issues which explicitly defined resolver private $_defaultIssueParams = ['issue_id' => 'issue_id', 'issue_person_id' => 'person_id', 'issue_oe_kurzbz' => 'oe_kurzbz']; public function __construct($params = null) { + // set application(s)) + if (isset($params['apps'])) + { + if (is_string($params['apps'])) $params['apps'] = [$params['apps']]; + if (is_array($params['apps'])) $this->_apps = $params['apps']; + } + + $this->_ci =& get_instance(); // get ci instance + // get all fehler to be produced (by kurzbz array or app) if (isset($params['fehlercodes']) && !isEmptyArray($params['fehlercodes'])) { $this->_fehlercodes = $params['fehlercodes']; } + elseif (isset($params['apps']) && !isEmptyArray($params['apps'])) + { + $this->_ci->load->model('system/Fehler_model', 'FehlerModel'); + $fehlerRes = $this->_ci->FehlerModel->getByApps($this->_apps); - $this->_ci =& get_instance(); // get ci instance + if (hasData($fehlerRes)) + { + $this->_fehlercodes = array_column(getData($fehlerRes), 'fehlercode'); + } + } $this->_ci->load->library('IssuesLib'); $this->_ci->load->library('ExtensionsLib'); @@ -144,11 +162,11 @@ class PlausicheckResolverLib $result->infos = []; // check if all issues to resolve could be found in database - $mappingFehlerCodes = array_keys($this->_codeLibMappings); - $notFoundFehlerCodes = array_diff($this->_fehlercodes, $mappingFehlerCodes); + //~ $mappingFehlerCodes = array_keys($this->_codeLibMappings); + //~ $notFoundFehlerCodes = array_diff($this->_fehlercodes, $mappingFehlerCodes); - if (!isEmptyArray($notFoundFehlerCodes)) - $result->errors[] = error('Fehler to resolve not defined in config: '.implode(', ', $notFoundFehlerCodes)); + //~ if (!isEmptyArray($notFoundFehlerCodes)) + //~ $result->errors[] = error('Fehler to resolve not defined in config: '.implode(', ', $notFoundFehlerCodes)); foreach ($openIssues as $issue) { From 1b400f7d421ea814a94b4e41b081f7dc49b30e88 Mon Sep 17 00:00:00 2001 From: Alexei Karpenko Date: Thu, 12 Feb 2026 22:36:42 +0100 Subject: [PATCH 25/32] issuechecker: made details list optional, producer_controller: default value for apps --- application/core/PlausiIssueProducer_Controller.php | 2 +- public/js/components/Issues/IssueChecker.js | 10 +++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/application/core/PlausiIssueProducer_Controller.php b/application/core/PlausiIssueProducer_Controller.php index 215d843d5..41fc5aa76 100644 --- a/application/core/PlausiIssueProducer_Controller.php +++ b/application/core/PlausiIssueProducer_Controller.php @@ -6,7 +6,7 @@ abstract class PlausiIssueProducer_Controller extends JOB_Controller { protected $_fehlerKurzbz = []; - protected $_apps; + protected $_apps = []; /** * Runs issue production job. diff --git a/public/js/components/Issues/IssueChecker.js b/public/js/components/Issues/IssueChecker.js index 94472d25d..492d49015 100644 --- a/public/js/components/Issues/IssueChecker.js +++ b/public/js/components/Issues/IssueChecker.js @@ -30,7 +30,11 @@ export default { }, issueListStyleBreakpoints: { type: Object - } + }, + includeIssueList: { + type: Boolean, + default: true + }, }, data() { return { @@ -80,11 +84,11 @@ export default { template: `

Issues

-
{{ openissuescount }}
+
{{ openissuescount }}
- + Date: Wed, 25 Mar 2026 11:44:36 +0100 Subject: [PATCH 26/32] issues, plausichecks: added producer for some core issues, producer lib: fehler with no config mappings are just ignored, plausicheck page optimizations (sorting etc) --- application/config/fehler.php | 70 +++++----- .../system/issues/Plausichecks.php | 44 +++--- .../issues/PlausicheckProducerLib.php | 12 +- .../FalscherIncomingZweckPlausi.php | 121 +++++++++++++++++ .../plausichecks/GeburtsnationFehlt.php | 108 +++++++++++++++ .../KeinAufenthaltszweckPlausi.php | 116 ++++++++++++++++ .../OutgoingAngerechneteEctsFehlenPlausi.php | 119 +++++++++++++++++ ...utgoingAufenthaltfoerderungfehltPlausi.php | 119 +++++++++++++++++ .../OutgoingErworbeneEctsFehlenPlausi.php | 119 +++++++++++++++++ .../UhstatPersonkennungFehltCore.php | 113 ++++++++++++++++ .../issues/plausichecks/ZgvDatumInZukunft.php | 126 ++++++++++++++++++ .../plausichecks/ZgvDatumVorGeburtsdatum.php | 109 +++++++++++++++ .../plausichecks/ZgvMasterDatumInZukunft.php | 109 +++++++++++++++ .../ZgvMasterDatumVorGeburtsdatum.php | 109 +++++++++++++++ .../ZgvMasterDatumVorZgvdatum.php | 109 +++++++++++++++ .../ZuVieleZweckeIncomingPlausi.php | 121 +++++++++++++++++ .../issues/resolvers/CORE_INOUT_0005.php | 2 +- system/dbupdate_3.4.php | 1 + 18 files changed, 1568 insertions(+), 59 deletions(-) create mode 100644 application/libraries/issues/plausichecks/FalscherIncomingZweckPlausi.php create mode 100644 application/libraries/issues/plausichecks/GeburtsnationFehlt.php create mode 100644 application/libraries/issues/plausichecks/KeinAufenthaltszweckPlausi.php create mode 100644 application/libraries/issues/plausichecks/OutgoingAngerechneteEctsFehlenPlausi.php create mode 100644 application/libraries/issues/plausichecks/OutgoingAufenthaltfoerderungfehltPlausi.php create mode 100644 application/libraries/issues/plausichecks/OutgoingErworbeneEctsFehlenPlausi.php create mode 100644 application/libraries/issues/plausichecks/UhstatPersonkennungFehltCore.php create mode 100644 application/libraries/issues/plausichecks/ZgvDatumInZukunft.php create mode 100644 application/libraries/issues/plausichecks/ZgvDatumVorGeburtsdatum.php create mode 100644 application/libraries/issues/plausichecks/ZgvMasterDatumInZukunft.php create mode 100644 application/libraries/issues/plausichecks/ZgvMasterDatumVorGeburtsdatum.php create mode 100644 application/libraries/issues/plausichecks/ZgvMasterDatumVorZgvdatum.php create mode 100644 application/libraries/issues/plausichecks/ZuVieleZweckeIncomingPlausi.php diff --git a/application/config/fehler.php b/application/config/fehler.php index 7c006c970..32b1e82e7 100644 --- a/application/config/fehler.php +++ b/application/config/fehler.php @@ -10,7 +10,7 @@ $config['fehler'] = array( 'fehlertext' => 'ZGV Datum in Zukunft', 'fehlertyp_kurzbz' => 'error', 'app' => array('core'), - 'producerLibName' => null, + 'producerLibName' => 'ZgvDatumInZukunft', 'resolverLibName' => 'CORE_ZGV_0001', 'producerIsResolver' => false ), @@ -21,7 +21,7 @@ $config['fehler'] = array( 'fehlertext' => 'ZGV Datum vor Geburtsdatum', 'fehlertyp_kurzbz' => 'error', 'app' => 'core', - 'producerLibName' => null, + 'producerLibName' => 'ZgvDatumVorGeburtsdatum', 'resolverLibName' => 'CORE_ZGV_0002', 'producerIsResolver' => false ), @@ -32,7 +32,7 @@ $config['fehler'] = array( 'fehlertext' => 'ZGV Masterdatum in Zukunft', 'fehlertyp_kurzbz' => 'error', 'app' => 'core', - 'producerLibName' => null, + 'producerLibName' => 'ZgvMasterDatumInZukunft', 'resolverLibName' => 'CORE_ZGV_0003', 'producerIsResolver' => false ), @@ -43,7 +43,7 @@ $config['fehler'] = array( 'fehlertext' => 'ZGV Masterdatum vor Zgvdatum', 'fehlertyp_kurzbz' => 'error', 'app' => 'core', - 'producerLibName' => null, + 'producerLibName' => 'ZgvMasterDatumVorZgvdatum', 'resolverLibName' => 'CORE_ZGV_0004', 'producerIsResolver' => false ), @@ -54,7 +54,7 @@ $config['fehler'] = array( 'fehlertext' => 'ZGV Masterdatum vor Geburtsdatum', 'fehlertyp_kurzbz' => 'error', 'app' => 'core', - 'producerLibName' => null, + 'producerLibName' => 'ZgvMasterDatumVorGeburtsdatum', 'resolverLibName' => 'CORE_ZGV_0005', 'producerIsResolver' => false ), @@ -65,7 +65,7 @@ $config['fehler'] = array( 'fehlertext' => 'Kein Aufenthaltszweck gefunden', 'fehlertyp_kurzbz' => 'error', 'app' => 'core', - 'producerLibName' => null, + 'producerLibName' => 'KeinAufenthaltszweckPlausi', 'resolverLibName' => 'CORE_INOUT_0001', 'producerIsResolver' => false ), @@ -76,7 +76,7 @@ $config['fehler'] = array( 'fehlertext' => 'Es sind %s Aufenthaltszwecke eingetragen (max. 1 Zweck für Incomings)', 'fehlertyp_kurzbz' => 'error', 'app' => 'core', - 'producerLibName' => null, + 'producerLibName' => 'ZuVieleZweckeIncomingPlausi', 'resolverLibName' => 'CORE_INOUT_0002', 'producerIsResolver' => false ), @@ -87,7 +87,7 @@ $config['fehler'] = array( 'fehlertext' => 'Aufenthaltszweckcode ist %s (für Incomings ist nur Zweck 1, 2, 3 erlaubt)', 'fehlertyp_kurzbz' => 'error', 'app' => 'core', - 'producerLibName' => null, + 'producerLibName' => 'FalscherIncomingZweckPlausi', 'resolverLibName' => 'CORE_INOUT_0003', 'producerIsResolver' => false ), @@ -98,7 +98,7 @@ $config['fehler'] = array( 'fehlertext' => 'Keine Aufenthaltsfoerderung angegeben (bei Outgoings >= 29 Tage Monat im Ausland muss mind. 1 gemeldet werden)', 'fehlertyp_kurzbz' => 'error', 'app' => 'core', - 'producerLibName' => null, + 'producerLibName' => 'OutgoingAufenthaltfoerderungfehltPlausi', 'resolverLibName' => 'CORE_INOUT_0004', 'producerIsResolver' => false ), @@ -109,7 +109,7 @@ $config['fehler'] = array( 'fehlertext' => 'Angerechnete ECTS fehlen (Meldepflicht bei Outgoings >= 29 Tage Monat im Ausland)', 'fehlertyp_kurzbz' => 'error', 'app' => 'core', - 'producerLibName' => null, + 'producerLibName' => 'OutgoingAngerechneteEctsFehlenPlausi', 'resolverLibName' => 'CORE_INOUT_0005', 'producerIsResolver' => false ), @@ -120,7 +120,7 @@ $config['fehler'] = array( 'fehlertext' => 'Erworbene ECTS fehlen (Meldepflicht bei Outgoings >= 29 Tage Monat im Ausland)', 'fehlertyp_kurzbz' => 'error', 'app' => 'core', - 'producerLibName' => null, + 'producerLibName' => 'OutgoingErworbeneEctsFehlenPlausi', 'resolverLibName' => 'CORE_INOUT_0006', 'producerIsResolver' => false ), @@ -280,17 +280,17 @@ $config['fehler'] = array( 'resolverLibName' => 'CORE_STUDENTSTATUS_0007', 'producerIsResolver' => false ), - array( - 'fehlercode' => 'CORE_STUDENTSTATUS_0008', - 'fehler_kurzbz' => 'StudienplanUngueltig', - 'fehlercode_extern' => null, - 'fehlertext' => 'Studienplan %s ist im Ausbildungssemester %s nicht gültig (prestudent_id %s)', - 'fehlertyp_kurzbz' => 'error', - 'app' => 'core', - 'producerLibName' => 'StudienplanUngueltig', - 'resolverLibName' => 'CORE_STUDENTSTATUS_0008', - 'producerIsResolver' => false - ), + //~ array( + //~ 'fehlercode' => 'CORE_STUDENTSTATUS_0008', + //~ 'fehler_kurzbz' => 'StudienplanUngueltig', + //~ 'fehlercode_extern' => null, + //~ 'fehlertext' => 'Studienplan %s ist im Ausbildungssemester %s nicht gültig (prestudent_id %s)', + //~ 'fehlertyp_kurzbz' => 'error', + //~ 'app' => 'core', + //~ 'producerLibName' => 'StudienplanUngueltig', + //~ 'resolverLibName' => 'CORE_STUDENTSTATUS_0008', + //~ 'producerIsResolver' => false + //~ ), array( 'fehlercode' => 'CORE_STUDENTSTATUS_0009', 'fehler_kurzbz' => 'FalscheAnzahlAbschlusspruefungen', @@ -324,17 +324,17 @@ $config['fehler'] = array( 'resolverLibName' => 'CORE_STUDENTSTATUS_0011', 'producerIsResolver' => false ), - array( - 'fehlercode' => 'CORE_STUDENTSTATUS_0012', - 'fehler_kurzbz' => 'BewerberNichtZumRtAngetreten', - 'fehlercode_extern' => null, - 'fehlertext' => 'Bewerber nicht zum Reihungstest angetreten (prestudent_id %s)', - 'fehlertyp_kurzbz' => 'warning', - 'app' => 'core', - 'producerLibName' => 'BewerberNichtZumRtAngetreten', - 'resolverLibName' => 'CORE_STUDENTSTATUS_0012', - 'producerIsResolver' => false - ), + //~ array( + //~ 'fehlercode' => 'CORE_STUDENTSTATUS_0012', + //~ 'fehler_kurzbz' => 'BewerberNichtZumRtAngetreten', + //~ 'fehlercode_extern' => null, + //~ 'fehlertext' => 'Bewerber nicht zum Reihungstest angetreten (prestudent_id %s)', + //~ 'fehlertyp_kurzbz' => 'warning', + //~ 'app' => 'core', + //~ 'producerLibName' => 'BewerberNichtZumRtAngetreten', + //~ 'resolverLibName' => 'CORE_STUDENTSTATUS_0012', + //~ 'producerIsResolver' => false + //~ ), array( 'fehlercode' => 'CORE_STUDENTSTATUS_0013', 'fehler_kurzbz' => 'AktSemesterNull', @@ -430,7 +430,7 @@ $config['fehler'] = array( 'fehlertext' => 'Geburtsnation nicht vorhanden', 'fehlertyp_kurzbz' => 'error', 'app' => 'core', - 'producerLibName' => null, + 'producerLibName' => 'GeburtsnationFehlt', 'resolverLibName' => 'CORE_PERSON_0005', 'producerIsResolver' => false ), @@ -441,7 +441,7 @@ $config['fehler'] = array( 'fehlertext' => 'Personkennung fehlt (vBpk AS, vBpk BF oder Ersatzkennzeichen fehlt)', 'fehlertyp_kurzbz' => 'error', 'app' => 'core', - 'producerLibName' => null, + 'producerLibName' => 'UhstatPersonkennungFehltCore', 'resolverLibName' => 'CORE_PERSON_0006', 'producerIsResolver' => false ) diff --git a/application/controllers/system/issues/Plausichecks.php b/application/controllers/system/issues/Plausichecks.php index eb0d01e9e..69b9afc15 100644 --- a/application/controllers/system/issues/Plausichecks.php +++ b/application/controllers/system/issues/Plausichecks.php @@ -5,6 +5,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); class Plausichecks extends Auth_Controller { const GENERIC_ISSUE_OCCURED_TEXT = 'Issue aufgetreten'; + const APPS = ['core']; public function __construct() { @@ -16,7 +17,7 @@ class Plausichecks extends Auth_Controller ); // Load libraries - $this->load->library('issues/PlausicheckProducerLib', array('apps' => 'core')); + $this->load->library('issues/PlausicheckProducerLib', array('apps' => self::APPS)); $this->load->library('issues/PlausicheckDefinitionLib'); $this->load->library('WidgetLib'); @@ -47,33 +48,30 @@ class Plausichecks extends Auth_Controller // issues array for passing issue texts $allIssues = array(); - // all fehler kurzbz which are going to be checked - $fehlerKurzbz = !isEmptyString($fehler_kurzbz) ? array($fehler_kurzbz) : $this->plausicheckdefinitionlib->getFehlerKurzbz(); + $fehler_kurzbz_arr = isEmptyString($fehler_kurzbz) ? array_keys($this->plausicheckproducerlib->getFehlerMappings()) : [$fehler_kurzbz]; + + $this->FehlerModel->addOrder('fehler_kurzbz, fehlercode'); + $this->FehlerModel->db->where_in('fehler_kurzbz', $fehler_kurzbz_arr); + $fehlerRes = $this->FehlerModel->load(); + + if (isError($fehlerRes)) $this->terminateWithJsonError(getError($fehlerRes)); + if (!hasData($fehlerRes)) return $this->outputJsonSuccess([]); + + // all fehler which are going to be checked + $fehlerArr = getData($fehlerRes); // set Studiengang to null if not passed if (isEmptyString($studiengang_kz)) $studiengang_kz = null; // get the data returned by Plausicheck - foreach ($fehlerKurzbz as $fehler_kurzbz) + foreach ($fehlerArr as $fehler) { - // get Text and fehlercode of the Fehler - $this->FehlerModel->addSelect('fehlercode, fehlertext, fehlertyp_kurzbz'); - $fehlerRes = $this->FehlerModel->loadWhere(array('fehler_kurzbz' => $fehler_kurzbz)); - - if (isError($fehlerRes)) $this->terminateWithJsonError(getError($fehlerRes)); - - // do not check error if no data - if (!hasData($fehlerRes)) continue; - - // get the error data - $fehler = getData($fehlerRes)[0]; - // initialize issue array - $allIssues[$fehler_kurzbz] = array('fehlercode' => $fehler->fehlercode, 'data' => array()); + $allIssues[$fehler->fehler_kurzbz] = array('fehlercode' => $fehler->fehlercode, 'data' => array()); // execute the check $plausicheckRes = $this->plausicheckproducerlib->producePlausicheckIssue( - $fehler_kurzbz, + $fehler->fehler_kurzbz, array( 'studiensemester_kurzbz' => $studiensemester_kurzbz, 'studiengang_kz' => $studiengang_kz @@ -104,7 +102,7 @@ class Plausichecks extends Auth_Controller { // replace placeholder with params, if present if (count($fehlertext_params) != substr_count($fehlerText, '%s')) - $this->terminateWithJsonError('Wrong number of parameters for Fehlertext, fehler_kurzbz ' . $fehler_kurzbz); + $this->terminateWithJsonError('Wrong number of parameters for Fehlertext, fehler_kurzbz ' . $fehler->fehler_kurzbz); $fehlerText = vsprintf($fehlerText, $fehlertext_params); } @@ -115,7 +113,7 @@ class Plausichecks extends Auth_Controller $issueObj = new StdClass(); $issueObj->fehlertext = $fehlerText; $issueObj->type = $fehlerTyp; - $allIssues[$fehler_kurzbz]['data'][] = $issueObj; + $allIssues[$fehler->fehler_kurzbz]['data'][] = $issueObj; } else // if no issue text found, use generic text { @@ -154,7 +152,7 @@ class Plausichecks extends Auth_Controller if (isError($studiengaengeRes)) show_error(getError($studiengaengeRes)); - $fehlerKurzbz = $this->plausicheckdefinitionlib->getFehlerKurzbz(); + $fehlerKurzbz = array_keys($this->plausicheckproducerlib->getFehlerMappings()); $db = new DB_Model(); @@ -165,7 +163,9 @@ class Plausichecks extends Auth_Controller FROM system.tbl_fehler WHERE - fehler_kurzbz IN ?', + fehler_kurzbz IN ? + ORDER BY + fehler_kurzbz, fehlercode', array($fehlerKurzbz) ); diff --git a/application/libraries/issues/PlausicheckProducerLib.php b/application/libraries/issues/PlausicheckProducerLib.php index bcab8ac56..02cdaa582 100644 --- a/application/libraries/issues/PlausicheckProducerLib.php +++ b/application/libraries/issues/PlausicheckProducerLib.php @@ -193,7 +193,8 @@ class PlausicheckProducerLib */ public function producePlausicheckIssue($fehler_kurzbz, $params) { - if (!isset($this->_fehlerLibMappings[$fehler_kurzbz])) return error("Mapping for Fehler " . $fehler_kurzbz . " was not found"); + //if (!isset($this->_fehlerLibMappings[$fehler_kurzbz])) return error("Mapping for Fehler " . $fehler_kurzbz . " was not found"); + if (!isset($this->_fehlerLibMappings[$fehler_kurzbz])) return success(null); $mapping = $this->_fehlerLibMappings[$fehler_kurzbz]; @@ -233,4 +234,13 @@ class PlausicheckProducerLib // call the function for checking for issue production return $this->_ci->{$lowercaseLibName}->{self::EXECUTE_PLAUSI_CHECK_METHOD_NAME}($params); } + + /** + * Get fehler kurzbz -> library mappings. + * @return array with fehler kurzbz as key and fehlerinfo as values + */ + public function getFehlerMappings() + { + return $this->_fehlerLibMappings; + } } diff --git a/application/libraries/issues/plausichecks/FalscherIncomingZweckPlausi.php b/application/libraries/issues/plausichecks/FalscherIncomingZweckPlausi.php new file mode 100644 index 000000000..91b888c7f --- /dev/null +++ b/application/libraries/issues/plausichecks/FalscherIncomingZweckPlausi.php @@ -0,0 +1,121 @@ +_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null; + + // pass parameters needed for plausicheck + $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; + $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; + $bisio_id = isset($params['bisio_id']) ? $params['bisio_id'] : null; + + // get all students failing the plausicheck + $prestudentRes = $this->_getFalscherIncomingZweck( + $studiensemester_kurzbz, + $studiengang_kz, + $bisio_id, + $exkludierte_studiengang_kz + ); + + if (isError($prestudentRes)) return $prestudentRes; + + if (hasData($prestudentRes)) + { + $prestudents = getData($prestudentRes); + + // populate results with data necessary for writing issues + foreach ($prestudents as $prestudent) + { + $results[] = array( + 'person_id' => $prestudent->person_id, + 'oe_kurzbz' => $prestudent->prestudent_stg_oe_kurzbz, + //'fehlertext_params' => array('bisio_id' => $prestudent->bisio_id), + 'resolution_params' => array('bisio_id' => $prestudent->bisio_id) + ); + } + } + + // return the results + return success($results); + } + + /** + * Prestudent should have a final status. + * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param bisio_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + private function _getFalscherIncomingZweck( + $studiensemester_kurzbz = null, + $studiengang_kz = null, + $bisio_id = null, + $exkludierte_studiengang_kz = null + ) { + + $params = array(); + $studiensemester_clause = ''; + + if (isset($studiensemester_kurzbz)) + { + $studiensemester_clause = "AND status.studiensemester_kurzbz = ?"; + $params[] = $studiensemester_kurzbz; + } + + $qry = " + SELECT * FROM ( + SELECT + DISTINCT ON (bisio_id) prestudent_id, person_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, zw.zweck_code, stg.studiengang_kz, + bisio.bisio_id, COUNT(zw.zweck_code) OVER (PARTITION BY bisio_id) AS anzahl + FROM + public.tbl_prestudent pre + JOIN public.tbl_student stud USING (prestudent_id) + JOIN public.tbl_person USING(person_id) + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_studiensemester sem ON status.studiensemester_kurzbz = sem.studiensemester_kurzbz + JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz + JOIN bis.tbl_bisio bisio ON stud.student_uid = bisio.student_uid + JOIN bis.tbl_bisio_zweck zw USING (bisio_id) + WHERE + stg.melderelevant + AND pre.bismelden + AND status.status_kurzbz = 'Incoming' + AND bisio.von::date < sem.ende AND bisio.bis::date > sem.start + {$studiensemester_clause} + ) zwecke + WHERE anzahl = 1 AND zweck_code NOT IN ('1', '2', '3')"; + + if (isset($studiengang_kz)) + { + $qry .= " AND zwecke.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($bisio_id)) + { + $qry .= " AND zwecke.bisio_id = ?"; + $params[] = $bisio_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND zwecke.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } +} diff --git a/application/libraries/issues/plausichecks/GeburtsnationFehlt.php b/application/libraries/issues/plausichecks/GeburtsnationFehlt.php new file mode 100644 index 000000000..7249ee416 --- /dev/null +++ b/application/libraries/issues/plausichecks/GeburtsnationFehlt.php @@ -0,0 +1,108 @@ +_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null; + + // pass parameters needed for plausicheck + $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; + $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; + $person_id = isset($params['person_id']) ? $params['person_id'] : null; + + // get all students failing the plausicheck + $personRes = $this->_getGeburtsnationFehlt( + $studiensemester_kurzbz, + $studiengang_kz, + $person_id, + $exkludierte_studiengang_kz + ); + + if (isError($personRes)) return $personRes; + + if (hasData($personRes)) + { + $persons = getData($personRes); + + // populate results with data necessary for writing issues + foreach ($persons as $person) + { + $results[] = array( + 'person_id' => $person->person_id, + 'fehlertext_params' => array(), + 'resolution_params' => array() + ); + } + } + + // return the results + return success($results); + } + + /** + * Prestudent should have a final status. + * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param prestudent_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + private function _getGeburtsnationFehlt( + $studiensemester_kurzbz = null, + $studiengang_kz = null, + $prestudent_id = null, + $exkludierte_studiengang_kz = null + ) { + $params = array(); + + $qry = " + SELECT + DISTINCT person_id + FROM + public.tbl_prestudent pre + JOIN public.tbl_person USING(person_id) + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz + WHERE + (geburtsnation IS NULL OR geburtsnation = '') + AND stg.melderelevant + AND pre.bismelden"; + + if (isset($studiensemester_kurzbz)) + { + $qry .= " AND status.studiensemester_kurzbz = ?"; + $params[] = $studiensemester_kurzbz; + } + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND pre.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } +} diff --git a/application/libraries/issues/plausichecks/KeinAufenthaltszweckPlausi.php b/application/libraries/issues/plausichecks/KeinAufenthaltszweckPlausi.php new file mode 100644 index 000000000..de1d94664 --- /dev/null +++ b/application/libraries/issues/plausichecks/KeinAufenthaltszweckPlausi.php @@ -0,0 +1,116 @@ +_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null; + + // pass parameters needed for plausicheck + $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; + $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; + $bisio_id = isset($params['bisio_id']) ? $params['bisio_id'] : null; + + // get all students failing the plausicheck + $prestudentRes = $this->_getKeinAufenthaltszweck( + $studiensemester_kurzbz, + $studiengang_kz, + $bisio_id, + $exkludierte_studiengang_kz + ); + + if (isError($prestudentRes)) return $prestudentRes; + + if (hasData($prestudentRes)) + { + $prestudents = getData($prestudentRes); + + // populate results with data necessary for writing issues + foreach ($prestudents as $prestudent) + { + $results[] = array( + 'person_id' => $prestudent->person_id, + 'oe_kurzbz' => $prestudent->prestudent_stg_oe_kurzbz, + //'fehlertext_params' => array('bisio_id' => $prestudent->bisio_id), + 'resolution_params' => array('bisio_id' => $prestudent->bisio_id) + ); + } + } + + // return the results + return success($results); + } + + /** + * Prestudent should have a final status. + * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param bisio_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + private function _getKeinAufenthaltszweck( + $studiensemester_kurzbz = null, + $studiengang_kz = null, + $bisio_id = null, + $exkludierte_studiengang_kz = null + ) { + + $params = array(); + + $qry = " + SELECT + DISTINCT ON (bisio_id) prestudent_id, person_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, + zw.zweck_code, stg.studiengang_kz, bisio.bisio_id + FROM + public.tbl_prestudent pre + JOIN public.tbl_student stud USING (prestudent_id) + JOIN public.tbl_person USING(person_id) + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_studiensemester sem ON status.studiensemester_kurzbz = sem.studiensemester_kurzbz + JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz + JOIN bis.tbl_bisio bisio ON stud.student_uid = bisio.student_uid + LEFT JOIN bis.tbl_bisio_zweck zw USING (bisio_id) + WHERE + (zw.zweck_code IS NULL OR zw.zweck_code = '') + AND bisio.von::date < sem.ende AND bisio.bis::date > sem.start + AND stg.melderelevant + AND pre.bismelden"; + + if (isset($studiensemester_kurzbz)) + { + $qry .= " AND status.studiensemester_kurzbz = ?"; + $params[] = $studiensemester_kurzbz; + } + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($bisio_id)) + { + $qry .= " AND bisio.bisio_id = ?"; + $params[] = $bisio_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } +} diff --git a/application/libraries/issues/plausichecks/OutgoingAngerechneteEctsFehlenPlausi.php b/application/libraries/issues/plausichecks/OutgoingAngerechneteEctsFehlenPlausi.php new file mode 100644 index 000000000..458e33ba2 --- /dev/null +++ b/application/libraries/issues/plausichecks/OutgoingAngerechneteEctsFehlenPlausi.php @@ -0,0 +1,119 @@ +_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null; + + // pass parameters needed for plausicheck + $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; + $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; + $bisio_id = isset($params['bisio_id']) ? $params['bisio_id'] : null; + + // get all students failing the plausicheck + $prestudentRes = $this->_getAngerechneteEctsFehlen( + $studiensemester_kurzbz, + $studiengang_kz, + $bisio_id, + $exkludierte_studiengang_kz + ); + + if (isError($prestudentRes)) return $prestudentRes; + + if (hasData($prestudentRes)) + { + $prestudents = getData($prestudentRes); + + // populate results with data necessary for writing issues + foreach ($prestudents as $prestudent) + { + $results[] = array( + 'person_id' => $prestudent->person_id, + 'oe_kurzbz' => $prestudent->prestudent_stg_oe_kurzbz, + //'fehlertext_params' => array('bisio_id' => $prestudent->bisio_id), + 'resolution_params' => array('bisio_id' => $prestudent->bisio_id) + ); + } + } + + // return the results + return success($results); + } + + /** + * Prestudent should have a final status. + * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param bisio_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + private function _getAngerechneteEctsFehlen( + $studiensemester_kurzbz = null, + $studiengang_kz = null, + $bisio_id = null, + $exkludierte_studiengang_kz = null + ) { + + $params = array(); + + $qry = " + SELECT + DISTINCT ON (bisio_id) prestudent_id, person_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, + stg.studiengang_kz, bisio.bisio_id + FROM + public.tbl_prestudent pre + JOIN public.tbl_student stud USING (prestudent_id) + JOIN public.tbl_person USING(person_id) + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_studiensemester sem ON status.studiensemester_kurzbz = sem.studiensemester_kurzbz + JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz + JOIN bis.tbl_bisio bisio ON stud.student_uid = bisio.student_uid + WHERE + bisio.bis IS NOT NULL + AND bisio.bis::date <= NOW() + AND bisio.bis::date - bisio.von::date >= 29 + AND bisio.ects_angerechnet IS NULL + AND NOT EXISTS (SELECT 1 FROM public.tbl_prestudentstatus WHERE status_kurzbz = 'Incoming' AND prestudent_id = pre.prestudent_id) + AND bisio.von::date < sem.ende AND bisio.bis::date > sem.start + AND stg.melderelevant + AND pre.bismelden"; + + if (isset($studiensemester_kurzbz)) + { + $qry .= " AND status.studiensemester_kurzbz = ?"; + $params[] = $studiensemester_kurzbz; + } + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($bisio_id)) + { + $qry .= " AND bisio.bisio_id = ?"; + $params[] = $bisio_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } +} diff --git a/application/libraries/issues/plausichecks/OutgoingAufenthaltfoerderungfehltPlausi.php b/application/libraries/issues/plausichecks/OutgoingAufenthaltfoerderungfehltPlausi.php new file mode 100644 index 000000000..dcffd7e05 --- /dev/null +++ b/application/libraries/issues/plausichecks/OutgoingAufenthaltfoerderungfehltPlausi.php @@ -0,0 +1,119 @@ +_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null; + + // pass parameters needed for plausicheck + $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; + $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; + $bisio_id = isset($params['bisio_id']) ? $params['bisio_id'] : null; + + // get all students failing the plausicheck + $prestudentRes = $this->_getAufenthaltsfoerderungFehlt( + $studiensemester_kurzbz, + $studiengang_kz, + $bisio_id, + $exkludierte_studiengang_kz + ); + + if (isError($prestudentRes)) return $prestudentRes; + + if (hasData($prestudentRes)) + { + $prestudents = getData($prestudentRes); + + // populate results with data necessary for writing issues + foreach ($prestudents as $prestudent) + { + $results[] = array( + 'person_id' => $prestudent->person_id, + 'oe_kurzbz' => $prestudent->prestudent_stg_oe_kurzbz, + //'fehlertext_params' => array('bisio_id' => $prestudent->bisio_id), + 'resolution_params' => array('bisio_id' => $prestudent->bisio_id) + ); + } + } + + // return the results + return success($results); + } + + /** + * Prestudent should have a final status. + * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param bisio_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + private function _getAufenthaltsfoerderungFehlt( + $studiensemester_kurzbz = null, + $studiengang_kz = null, + $bisio_id = null, + $exkludierte_studiengang_kz = null + ) { + + $params = array(); + + $qry = " + SELECT + DISTINCT ON (bisio_id) prestudent_id, person_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, + stg.studiengang_kz, bisio.bisio_id + FROM + public.tbl_prestudent pre + JOIN public.tbl_student stud USING (prestudent_id) + JOIN public.tbl_person USING(person_id) + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_studiensemester sem ON status.studiensemester_kurzbz = sem.studiensemester_kurzbz + JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz + JOIN bis.tbl_bisio bisio ON stud.student_uid = bisio.student_uid + LEFT JOIN bis.tbl_bisio_aufenthaltfoerderung foerd USING (bisio_id) + WHERE + bisio.bis IS NOT NULL + AND bisio.bis::date - bisio.von::date >= 29 + AND foerd.aufenthaltfoerderung_code IS NULL + AND NOT EXISTS (SELECT 1 FROM public.tbl_prestudentstatus WHERE status_kurzbz = 'Incoming' AND prestudent_id = pre.prestudent_id) + AND bisio.von::date < sem.ende AND bisio.bis::date > sem.start + AND stg.melderelevant + AND pre.bismelden"; + + if (isset($studiensemester_kurzbz)) + { + $qry .= " AND status.studiensemester_kurzbz = ?"; + $params[] = $studiensemester_kurzbz; + } + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($bisio_id)) + { + $qry .= " AND bisio.bisio_id = ?"; + $params[] = $bisio_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } +} diff --git a/application/libraries/issues/plausichecks/OutgoingErworbeneEctsFehlenPlausi.php b/application/libraries/issues/plausichecks/OutgoingErworbeneEctsFehlenPlausi.php new file mode 100644 index 000000000..9471b3b40 --- /dev/null +++ b/application/libraries/issues/plausichecks/OutgoingErworbeneEctsFehlenPlausi.php @@ -0,0 +1,119 @@ +_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null; + + // pass parameters needed for plausicheck + $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; + $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; + $bisio_id = isset($params['bisio_id']) ? $params['bisio_id'] : null; + + // get all students failing the plausicheck + $prestudentRes = $this->_getAngerechneteEctsFehlen( + $studiensemester_kurzbz, + $studiengang_kz, + $bisio_id, + $exkludierte_studiengang_kz + ); + + if (isError($prestudentRes)) return $prestudentRes; + + if (hasData($prestudentRes)) + { + $prestudents = getData($prestudentRes); + + // populate results with data necessary for writing issues + foreach ($prestudents as $prestudent) + { + $results[] = array( + 'person_id' => $prestudent->person_id, + 'oe_kurzbz' => $prestudent->prestudent_stg_oe_kurzbz, + //'fehlertext_params' => array('bisio_id' => $prestudent->bisio_id), + 'resolution_params' => array('bisio_id' => $prestudent->bisio_id) + ); + } + } + + // return the results + return success($results); + } + + /** + * Prestudent should have a final status. + * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param bisio_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + private function _getAngerechneteEctsFehlen( + $studiensemester_kurzbz = null, + $studiengang_kz = null, + $bisio_id = null, + $exkludierte_studiengang_kz = null + ) { + + $params = array(); + + $qry = " + SELECT + DISTINCT ON (bisio_id) prestudent_id, person_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, + stg.studiengang_kz, bisio.bisio_id + FROM + public.tbl_prestudent pre + JOIN public.tbl_student stud USING (prestudent_id) + JOIN public.tbl_person USING(person_id) + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_studiensemester sem ON status.studiensemester_kurzbz = sem.studiensemester_kurzbz + JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz + JOIN bis.tbl_bisio bisio ON stud.student_uid = bisio.student_uid + WHERE + bisio.bis IS NOT NULL + AND bisio.bis::date <= NOW() + AND bisio.bis::date - bisio.von::date >= 29 + AND bisio.ects_erworben IS NULL + AND NOT EXISTS (SELECT 1 FROM public.tbl_prestudentstatus WHERE status_kurzbz = 'Incoming' AND prestudent_id = pre.prestudent_id) + AND bisio.von::date < sem.ende AND bisio.bis::date > sem.start + AND stg.melderelevant + AND pre.bismelden"; + + if (isset($studiensemester_kurzbz)) + { + $qry .= " AND status.studiensemester_kurzbz = ?"; + $params[] = $studiensemester_kurzbz; + } + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($bisio_id)) + { + $qry .= " AND bisio.bisio_id = ?"; + $params[] = $bisio_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } +} diff --git a/application/libraries/issues/plausichecks/UhstatPersonkennungFehltCore.php b/application/libraries/issues/plausichecks/UhstatPersonkennungFehltCore.php new file mode 100644 index 000000000..68c5bb5f8 --- /dev/null +++ b/application/libraries/issues/plausichecks/UhstatPersonkennungFehltCore.php @@ -0,0 +1,113 @@ +_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null; + + // pass parameters needed for plausicheck + $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; + $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; + $person_id = isset($params['person_id']) ? $params['person_id'] : null; + + // get all students failing the plausicheck + $prestudentRes = $this->_getUhstatPersonkennungFehlt( + $studiensemester_kurzbz, + $studiengang_kz, + $person_id, + $exkludierte_studiengang_kz + ); + + if (isError($prestudentRes)) return $prestudentRes; + + if (hasData($prestudentRes)) + { + $prestudents = getData($prestudentRes); + + // populate results with data necessary for writing issues + foreach ($prestudents as $prestudent) + { + $results[] = array( + 'person_id' => $prestudent->person_id, + 'oe_kurzbz' => $prestudent->prestudent_stg_oe_kurzbz + //'fehlertext_params' => array('person_id' => $prestudent->person_id), + //'resolution_params' => array('person_id' => $prestudent->person_id) + ); + } + } + + // return the results + return success($results); + } + + /** + * Prestudent should have a final status. + * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param prestudent_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + private function _getUhstatPersonkennungFehlt( + $studiensemester_kurzbz = null, + $studiengang_kz = null, + $person_id = null, + $exkludierte_studiengang_kz = null + ) { + $params = array(); + + $qry = " + SELECT + DISTINCT ON (person_id) prestudent_id, person_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz + FROM + public.tbl_prestudent pre + JOIN public.tbl_person pers USING(person_id) + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz + WHERE + stg.melderelevant + AND pre.bismelden + AND EXISTS (SELECT 1 FROM bis.tbl_uhstat1daten WHERE person_id = pers.person_id) + AND (SELECT COUNT (DISTINCT kennzeichentyp_kurzbz) FROM public.tbl_kennzeichen WHERE person_id = pers.person_id AND kennzeichentyp_kurzbz IN ('vbpkAs', 'vbpkBf')) < 2 + AND pers.ersatzkennzeichen IS NULL"; + + if (isset($studiensemester_kurzbz)) + { + $qry .= " AND status.studiensemester_kurzbz = ?"; + $params[] = $studiensemester_kurzbz; + } + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($person_id)) + { + $qry .= " AND pre.person_id = ?"; + $params[] = $person_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } +} diff --git a/application/libraries/issues/plausichecks/ZgvDatumInZukunft.php b/application/libraries/issues/plausichecks/ZgvDatumInZukunft.php new file mode 100644 index 000000000..4ee91186c --- /dev/null +++ b/application/libraries/issues/plausichecks/ZgvDatumInZukunft.php @@ -0,0 +1,126 @@ +_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null; + + // pass parameters needed for plausicheck + $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; + $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; + $prestudent_id = isset($params['prestudent_id']) ? $params['prestudent_id'] : null; + + // get all students failing the plausicheck + $prestudentRes = $this->_getZgvDatumInZukunft( + $studiensemester_kurzbz, + $studiengang_kz, + $prestudent_id, + $exkludierte_studiengang_kz + ); + + if (isError($prestudentRes)) return $prestudentRes; + + if (hasData($prestudentRes)) + { + $prestudents = getData($prestudentRes); + + // populate results with data necessary for writing issues + foreach ($prestudents as $prestudent) + { + $results[] = array( + 'person_id' => $prestudent->person_id, + 'oe_kurzbz' => $prestudent->prestudent_stg_oe_kurzbz, + //'fehlertext_params' => array('prestudent_id' => $prestudent->prestudent_id), + 'resolution_params' => array('prestudent_id' => $prestudent->prestudent_id) + ); + } + } + + // return the results + return success($results); + } + + /** + * Prestudent should have a final status. + * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param prestudent_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + private function _getZgvDatumInZukunft( + $studiensemester_kurzbz = null, + $studiengang_kz = null, + $prestudent_id = null, + $exkludierte_studiengang_kz = null + ) { + $params = array(); + + $qry = " + SELECT + DISTINCT ON (prestudent_id) prestudent_id, person_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz + FROM + public.tbl_prestudent pre + JOIN public.tbl_person USING(person_id) + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz + WHERE + pre.zgvdatum::date > NOW() + AND stg.melderelevant + AND pre.bismelden"; + + if (isset($studiensemester_kurzbz)) + { + $qry .= " AND status.studiensemester_kurzbz = ?"; + $params[] = $studiensemester_kurzbz; + //~ $prevStudiensemesterRes = $this->_ci->StudiensemesterModel->getPreviousFrom($studiensemester_kurzbz); + + //~ if (isError($prevStudiensemesterRes)) return $prevStudiensemesterRes; + + //~ if (hasData($prevStudiensemesterRes)) + //~ { + //~ // if Studiensemester given, check only if has status in current or previous semester + //~ $prevStudiensemester = getData($prevStudiensemesterRes)[0]->studiensemester_kurzbz; + //~ $qry .= " AND EXISTS ( + //~ SELECT 1 + //~ FROM public.tbl_prestudentstatus ps + //~ WHERE studiensemester_kurzbz IN (?, ?) + //~ AND ps.prestudent_id = pre.prestudent_id + //~ )"; + //~ $params[] = $prevStudiensemester; + //~ $params[] = $studiensemester_kurzbz; + //~ } + } + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND pre.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } +} diff --git a/application/libraries/issues/plausichecks/ZgvDatumVorGeburtsdatum.php b/application/libraries/issues/plausichecks/ZgvDatumVorGeburtsdatum.php new file mode 100644 index 000000000..55c70758e --- /dev/null +++ b/application/libraries/issues/plausichecks/ZgvDatumVorGeburtsdatum.php @@ -0,0 +1,109 @@ +_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null; + + // pass parameters needed for plausicheck + $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; + $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; + $prestudent_id = isset($params['prestudent_id']) ? $params['prestudent_id'] : null; + + // get all students failing the plausicheck + $prestudentRes = $this->_getZgvDatumVorGeburtsdatum( + $studiensemester_kurzbz, + $studiengang_kz, + $prestudent_id, + $exkludierte_studiengang_kz + ); + + if (isError($prestudentRes)) return $prestudentRes; + + if (hasData($prestudentRes)) + { + $prestudents = getData($prestudentRes); + + // populate results with data necessary for writing issues + foreach ($prestudents as $prestudent) + { + $results[] = array( + 'person_id' => $prestudent->person_id, + 'oe_kurzbz' => $prestudent->prestudent_stg_oe_kurzbz, + //'fehlertext_params' => array('prestudent_id' => $prestudent->prestudent_id), + 'resolution_params' => array('prestudent_id' => $prestudent->prestudent_id) + ); + } + } + + // return the results + return success($results); + } + + /** + * Prestudent should have a final status. + * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param prestudent_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + private function _getZgvDatumVorGeburtsdatum( + $studiensemester_kurzbz = null, + $studiengang_kz = null, + $prestudent_id = null, + $exkludierte_studiengang_kz = null + ) { + $params = array(); + + $qry = " + SELECT + DISTINCT ON (prestudent_id) prestudent_id, person_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz + FROM + public.tbl_prestudent pre + JOIN public.tbl_person pers USING(person_id) + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz + WHERE + pre.zgvdatum::date < pers.gebdatum + AND stg.melderelevant + AND pre.bismelden"; + + if (isset($studiensemester_kurzbz)) + { + $qry .= " AND status.studiensemester_kurzbz = ?"; + $params[] = $studiensemester_kurzbz; + } + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND pre.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } +} diff --git a/application/libraries/issues/plausichecks/ZgvMasterDatumInZukunft.php b/application/libraries/issues/plausichecks/ZgvMasterDatumInZukunft.php new file mode 100644 index 000000000..1dc123c78 --- /dev/null +++ b/application/libraries/issues/plausichecks/ZgvMasterDatumInZukunft.php @@ -0,0 +1,109 @@ +_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null; + + // pass parameters needed for plausicheck + $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; + $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; + $prestudent_id = isset($params['prestudent_id']) ? $params['prestudent_id'] : null; + + // get all students failing the plausicheck + $prestudentRes = $this->_getZgvMasterDatumInZukunft( + $studiensemester_kurzbz, + $studiengang_kz, + $prestudent_id, + $exkludierte_studiengang_kz + ); + + if (isError($prestudentRes)) return $prestudentRes; + + if (hasData($prestudentRes)) + { + $prestudents = getData($prestudentRes); + + // populate results with data necessary for writing issues + foreach ($prestudents as $prestudent) + { + $results[] = array( + 'person_id' => $prestudent->person_id, + 'oe_kurzbz' => $prestudent->prestudent_stg_oe_kurzbz, + //'fehlertext_params' => array('prestudent_id' => $prestudent->prestudent_id), + 'resolution_params' => array('prestudent_id' => $prestudent->prestudent_id) + ); + } + } + + // return the results + return success($results); + } + + /** + * Prestudent should have a final status. + * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param prestudent_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + private function _getZgvMasterDatumInZukunft( + $studiensemester_kurzbz = null, + $studiengang_kz = null, + $prestudent_id = null, + $exkludierte_studiengang_kz = null + ) { + $params = array(); + + $qry = " + SELECT + DISTINCT ON (prestudent_id) prestudent_id, person_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz + FROM + public.tbl_prestudent pre + JOIN public.tbl_person USING(person_id) + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz + WHERE + pre.zgvmadatum::date > NOW() + AND stg.melderelevant + AND pre.bismelden"; + + if (isset($studiensemester_kurzbz)) + { + $qry .= " AND status.studiensemester_kurzbz = ?"; + $params[] = $studiensemester_kurzbz; + } + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND pre.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } +} diff --git a/application/libraries/issues/plausichecks/ZgvMasterDatumVorGeburtsdatum.php b/application/libraries/issues/plausichecks/ZgvMasterDatumVorGeburtsdatum.php new file mode 100644 index 000000000..00b3fff4a --- /dev/null +++ b/application/libraries/issues/plausichecks/ZgvMasterDatumVorGeburtsdatum.php @@ -0,0 +1,109 @@ +_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null; + + // pass parameters needed for plausicheck + $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; + $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; + $prestudent_id = isset($params['prestudent_id']) ? $params['prestudent_id'] : null; + + // get all students failing the plausicheck + $prestudentRes = $this->_getZgvMasterDatumVorGeburtsdatum( + $studiensemester_kurzbz, + $studiengang_kz, + $prestudent_id, + $exkludierte_studiengang_kz + ); + + if (isError($prestudentRes)) return $prestudentRes; + + if (hasData($prestudentRes)) + { + $prestudents = getData($prestudentRes); + + // populate results with data necessary for writing issues + foreach ($prestudents as $prestudent) + { + $results[] = array( + 'person_id' => $prestudent->person_id, + 'oe_kurzbz' => $prestudent->prestudent_stg_oe_kurzbz, + //'fehlertext_params' => array('prestudent_id' => $prestudent->prestudent_id), + 'resolution_params' => array('prestudent_id' => $prestudent->prestudent_id) + ); + } + } + + // return the results + return success($results); + } + + /** + * Prestudent should have a final status. + * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param prestudent_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + private function _getZgvMasterDatumVorGeburtsdatum( + $studiensemester_kurzbz = null, + $studiengang_kz = null, + $prestudent_id = null, + $exkludierte_studiengang_kz = null + ) { + $params = array(); + + $qry = " + SELECT + DISTINCT ON (prestudent_id) prestudent_id, person_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz + FROM + public.tbl_prestudent pre + JOIN public.tbl_person pers USING(person_id) + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz + WHERE + pre.zgvmadatum::date < pers.gebdatum + AND stg.melderelevant + AND pre.bismelden"; + + if (isset($studiensemester_kurzbz)) + { + $qry .= " AND status.studiensemester_kurzbz = ?"; + $params[] = $studiensemester_kurzbz; + } + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND pre.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } +} diff --git a/application/libraries/issues/plausichecks/ZgvMasterDatumVorZgvdatum.php b/application/libraries/issues/plausichecks/ZgvMasterDatumVorZgvdatum.php new file mode 100644 index 000000000..0d16e56b7 --- /dev/null +++ b/application/libraries/issues/plausichecks/ZgvMasterDatumVorZgvdatum.php @@ -0,0 +1,109 @@ +_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null; + + // pass parameters needed for plausicheck + $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; + $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; + $prestudent_id = isset($params['prestudent_id']) ? $params['prestudent_id'] : null; + + // get all students failing the plausicheck + $prestudentRes = $this->_getZgvMasterDatumVorZgvDatum( + $studiensemester_kurzbz, + $studiengang_kz, + $prestudent_id, + $exkludierte_studiengang_kz + ); + + if (isError($prestudentRes)) return $prestudentRes; + + if (hasData($prestudentRes)) + { + $prestudents = getData($prestudentRes); + + // populate results with data necessary for writing issues + foreach ($prestudents as $prestudent) + { + $results[] = array( + 'person_id' => $prestudent->person_id, + 'oe_kurzbz' => $prestudent->prestudent_stg_oe_kurzbz, + //'fehlertext_params' => array('prestudent_id' => $prestudent->prestudent_id), + 'resolution_params' => array('prestudent_id' => $prestudent->prestudent_id) + ); + } + } + + // return the results + return success($results); + } + + /** + * Prestudent should have a final status. + * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param prestudent_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + private function _getZgvMasterDatumVorZgvDatum( + $studiensemester_kurzbz = null, + $studiengang_kz = null, + $prestudent_id = null, + $exkludierte_studiengang_kz = null + ) { + $params = array(); + + $qry = " + SELECT + DISTINCT ON (prestudent_id) prestudent_id, person_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz + FROM + public.tbl_prestudent pre + JOIN public.tbl_person USING(person_id) + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz + WHERE + pre.zgvmadatum::date < pre.zgvdatum::date + AND stg.melderelevant + AND pre.bismelden"; + + if (isset($studiensemester_kurzbz)) + { + $qry .= " AND status.studiensemester_kurzbz = ?"; + $params[] = $studiensemester_kurzbz; + } + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND pre.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } +} diff --git a/application/libraries/issues/plausichecks/ZuVieleZweckeIncomingPlausi.php b/application/libraries/issues/plausichecks/ZuVieleZweckeIncomingPlausi.php new file mode 100644 index 000000000..ab39c880f --- /dev/null +++ b/application/libraries/issues/plausichecks/ZuVieleZweckeIncomingPlausi.php @@ -0,0 +1,121 @@ +_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null; + + // pass parameters needed for plausicheck + $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; + $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; + $bisio_id = isset($params['bisio_id']) ? $params['bisio_id'] : null; + + // get all students failing the plausicheck + $prestudentRes = $this->_getFalscherIncomingZweck( + $studiensemester_kurzbz, + $studiengang_kz, + $bisio_id, + $exkludierte_studiengang_kz + ); + + if (isError($prestudentRes)) return $prestudentRes; + + if (hasData($prestudentRes)) + { + $prestudents = getData($prestudentRes); + + // populate results with data necessary for writing issues + foreach ($prestudents as $prestudent) + { + $results[] = array( + 'person_id' => $prestudent->person_id, + 'oe_kurzbz' => $prestudent->prestudent_stg_oe_kurzbz, + //'fehlertext_params' => array('bisio_id' => $prestudent->bisio_id), + 'resolution_params' => array('bisio_id' => $prestudent->bisio_id) + ); + } + } + + // return the results + return success($results); + } + + /** + * Prestudent should have a final status. + * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param bisio_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + private function _getFalscherIncomingZweck( + $studiensemester_kurzbz = null, + $studiengang_kz = null, + $bisio_id = null, + $exkludierte_studiengang_kz = null + ) { + + $params = array(); + $studiensemester_clause = ''; + + if (isset($studiensemester_kurzbz)) + { + $studiensemester_clause = "AND status.studiensemester_kurzbz = ?"; + $params[] = $studiensemester_kurzbz; + } + + $qry = " + SELECT * FROM ( + SELECT + DISTINCT ON (bisio_id) prestudent_id, person_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, zw.zweck_code, stg.studiengang_kz, + bisio.bisio_id, COUNT(zw.zweck_code) OVER (PARTITION BY bisio_id) AS anzahl + FROM + public.tbl_prestudent pre + JOIN public.tbl_student stud USING (prestudent_id) + JOIN public.tbl_person USING(person_id) + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_studiensemester sem ON status.studiensemester_kurzbz = sem.studiensemester_kurzbz + JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz + JOIN bis.tbl_bisio bisio ON stud.student_uid = bisio.student_uid + JOIN bis.tbl_bisio_zweck zw USING (bisio_id) + WHERE + stg.melderelevant + AND pre.bismelden + AND status.status_kurzbz = 'Incoming' + AND bisio.von::date < sem.ende AND bisio.bis::date > sem.start + {$studiensemester_clause} + ) zwecke + WHERE anzahl > 1"; + + if (isset($studiengang_kz)) + { + $qry .= " AND zwecke.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($bisio_id)) + { + $qry .= " AND zwecke.bisio_id = ?"; + $params[] = $bisio_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND zwecke.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } +} diff --git a/application/libraries/issues/resolvers/CORE_INOUT_0005.php b/application/libraries/issues/resolvers/CORE_INOUT_0005.php index e655d2e36..ee6b7b5b7 100644 --- a/application/libraries/issues/resolvers/CORE_INOUT_0005.php +++ b/application/libraries/issues/resolvers/CORE_INOUT_0005.php @@ -16,7 +16,7 @@ class CORE_INOUT_0005 implements IIssueResolvedChecker $this->_ci->load->model('codex/Bisio_model', 'BisioModel'); - // get all Zwecke + // get bisio $this->_ci->BisioModel->addSelect('ects_angerechnet'); $bisioRes = $this->_ci->BisioModel->loadWhere(array('bisio_id' => $params['bisio_id'])); diff --git a/system/dbupdate_3.4.php b/system/dbupdate_3.4.php index e6d897be1..26acc7371 100644 --- a/system/dbupdate_3.4.php +++ b/system/dbupdate_3.4.php @@ -414,6 +414,7 @@ $tabellen=array( "system.tbl_extensions" => array("extension_id","name","version","description","license","url","core_version","dependencies","enabled"), "system.tbl_fehler" => array("fehlercode","fehler_kurzbz","fehlercode_extern","fehlertext","fehlertyp_kurzbz","app","insertamum","insertvon","updateamum","updatevon"), "system.tbl_fehlertyp" => array("fehlertyp_kurzbz","bezeichnung_mehrsprachig"), + "system.tbl_fehler_app" => array("fehlercode","app","insertamum","insertvon"), "system.tbl_fehler_konfiguration" => array("konfigurationstyp_kurzbz","fehlercode","konfiguration","insertamum","insertvon","updateamum","updatevon"), "system.tbl_fehler_konfigurationsdatentyp" => array("konfigurationsdatentyp"), "system.tbl_fehler_konfigurationstyp" => array("konfigurationstyp_kurzbz","beschreibung","konfigurationsdatentyp","app"), From 82d640b1f4ff5c77ca9560b694a987f78bd0a84c Mon Sep 17 00:00:00 2001 From: Alexei Karpenko Date: Fri, 3 Apr 2026 11:52:22 +0200 Subject: [PATCH 27/32] plausichecks: uhstatpersonenkennungfehlt issue: removed oe_kurzbz, added datenverbund issues to core plausicheck gui --- application/controllers/system/issues/Plausichecks.php | 2 +- .../issues/plausichecks/UhstatPersonkennungFehltCore.php | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/application/controllers/system/issues/Plausichecks.php b/application/controllers/system/issues/Plausichecks.php index 69b9afc15..8065680ba 100644 --- a/application/controllers/system/issues/Plausichecks.php +++ b/application/controllers/system/issues/Plausichecks.php @@ -5,7 +5,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); class Plausichecks extends Auth_Controller { const GENERIC_ISSUE_OCCURED_TEXT = 'Issue aufgetreten'; - const APPS = ['core']; + const APPS = ['core', 'dvuh']; public function __construct() { diff --git a/application/libraries/issues/plausichecks/UhstatPersonkennungFehltCore.php b/application/libraries/issues/plausichecks/UhstatPersonkennungFehltCore.php index 68c5bb5f8..a6b654cd5 100644 --- a/application/libraries/issues/plausichecks/UhstatPersonkennungFehltCore.php +++ b/application/libraries/issues/plausichecks/UhstatPersonkennungFehltCore.php @@ -41,8 +41,7 @@ class UhstatPersonkennungFehltCore extends PlausiChecker foreach ($prestudents as $prestudent) { $results[] = array( - 'person_id' => $prestudent->person_id, - 'oe_kurzbz' => $prestudent->prestudent_stg_oe_kurzbz + 'person_id' => $prestudent->person_id //'fehlertext_params' => array('person_id' => $prestudent->person_id), //'resolution_params' => array('person_id' => $prestudent->person_id) ); @@ -71,7 +70,7 @@ class UhstatPersonkennungFehltCore extends PlausiChecker $qry = " SELECT - DISTINCT ON (person_id) prestudent_id, person_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz + DISTINCT ON (person_id) prestudent_id, person_id FROM public.tbl_prestudent pre JOIN public.tbl_person pers USING(person_id) From 953a04f24ac65c71cf13001daa7373781bda6b97 Mon Sep 17 00:00:00 2001 From: Alexei Karpenko Date: Mon, 13 Apr 2026 11:37:36 +0200 Subject: [PATCH 28/32] added person id param to core plausichecks --- .../api/frontend/v1/issues/IssueChecker.php | 2 +- .../issues/plausichecks/AbbrecherAktiv.php | 6 +++++- .../plausichecks/AbschlussstatusFehlt.php | 9 +++++++++ .../issues/plausichecks/AktSemesterNull.php | 18 +++++++++++++++--- .../plausichecks/AktiverStudentOhneStatus.php | 11 +++++++++-- .../AktiverStudentstatusOhneKontobuchung.php | 10 ++++++++++ ...mPrestudentUngleichAusbildungssemStatus.php | 9 +++++++++ .../BewerberNichtZumRtAngetreten.php | 9 +++++++++ .../DatumAbschlusspruefungFehlt.php | 9 +++++++++ .../issues/plausichecks/DatumSponsionFehlt.php | 9 +++++++++ .../DatumStudiensemesterFalscheReihenfolge.php | 17 ++++++++++++++--- .../DualesStudiumOhneMarkierung.php | 9 +++++++++ .../FalscheAnzahlAbschlusspruefungen.php | 9 +++++++++ .../FalscheAnzahlHeimatadressen.php | 3 ++- .../FalscheAnzahlZustelladressen.php | 3 ++- .../issues/plausichecks/GbDatumWeitZurueck.php | 3 ++- .../InaktiverStudentAktiverStatus.php | 9 +++++++++ .../IncomingHeimatNationOesterreich.php | 3 ++- .../plausichecks/IncomingOhneIoDatensatz.php | 11 +++++++++-- .../IncomingOrGsFoerderrelevant.php | 9 +++++++++ .../InskriptionVorLetzerBismeldung.php | 9 +++++++++ .../KeinAufenthaltszweckPlausi.php | 9 +++++++++ .../NationNichtOesterreichAberGemeinde.php | 3 ++- .../OrgformStgUngleichOrgformPrestudent.php | 9 +++++++++ .../OutgoingAngerechneteEctsFehlenPlausi.php | 9 +++++++++ ...OutgoingAufenthaltfoerderungfehltPlausi.php | 9 +++++++++ .../OutgoingErworbeneEctsFehlenPlausi.php | 9 +++++++++ .../PrestudentMischformOhneOrgform.php | 9 +++++++++ .../StgPrestudentUngleichStgStudent.php | 11 +++++++++-- .../StgPrestudentUngleichStgStudienplan.php | 10 +++++++++- .../StudentstatusNachAbbrecher.php | 11 +++++++++-- .../plausichecks/StudienplanUngueltig.php | 9 +++++++++ .../UhstatPersonkennungFehltCore.php | 2 +- .../issues/plausichecks/ZgvDatumInZukunft.php | 9 +++++++++ .../plausichecks/ZgvDatumVorGeburtsdatum.php | 9 +++++++++ .../plausichecks/ZgvMasterDatumInZukunft.php | 9 +++++++++ .../ZgvMasterDatumVorGeburtsdatum.php | 9 +++++++++ .../plausichecks/ZgvMasterDatumVorZgvdatum.php | 9 +++++++++ .../ZuVieleZweckeIncomingPlausi.php | 9 +++++++++ 39 files changed, 308 insertions(+), 23 deletions(-) diff --git a/application/controllers/api/frontend/v1/issues/IssueChecker.php b/application/controllers/api/frontend/v1/issues/IssueChecker.php index efd457ace..6cb3497f2 100644 --- a/application/controllers/api/frontend/v1/issues/IssueChecker.php +++ b/application/controllers/api/frontend/v1/issues/IssueChecker.php @@ -13,7 +13,7 @@ class IssueChecker extends FHCAPI_Controller protected $errors = []; protected $infos = []; - public function __construct($permissions) + public function __construct($permissions = []) { $default_permissions = [ 'checkPerson' => self::DEFAULT_PERMISSION, diff --git a/application/libraries/issues/plausichecks/AbbrecherAktiv.php b/application/libraries/issues/plausichecks/AbbrecherAktiv.php index 464b77a30..dea7aae9b 100644 --- a/application/libraries/issues/plausichecks/AbbrecherAktiv.php +++ b/application/libraries/issues/plausichecks/AbbrecherAktiv.php @@ -23,7 +23,11 @@ class AbbrecherAktiv extends PlausiChecker AND benutzer.aktiv=true"; protected $_config_params = ['exkludierteStudiengaenge' => " AND stg.studiengang_kz NOT IN ?"]; - protected $_params_for_checking = ['studiengang_kz' => " AND stg.studiengang_kz = ?", 'prestudent_id' => " AND pre.prestudent_id = ?"]; + protected $_params_for_checking = [ + 'studiengang_kz' => " AND stg.studiengang_kz = ?", + 'prestudent_id' => " AND pre.prestudent_id = ?", + 'person_id' => " AND pre.person_id = ?" + ]; protected $_fehlertext_params = ['prestudent_id']; protected $_resolution_params = ['prestudent_id']; } diff --git a/application/libraries/issues/plausichecks/AbschlussstatusFehlt.php b/application/libraries/issues/plausichecks/AbschlussstatusFehlt.php index 3690e1331..93a5059f0 100644 --- a/application/libraries/issues/plausichecks/AbschlussstatusFehlt.php +++ b/application/libraries/issues/plausichecks/AbschlussstatusFehlt.php @@ -19,12 +19,14 @@ class AbschlussstatusFehlt extends PlausiChecker // pass parameters needed for plausicheck $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; + $person_id = isset($params['person_id']) ? $params['person_id'] : null; // get all students failing the plausicheck $prestudentRes = $this->getAbschlussstatusFehlt( $studiensemester_kurzbz, $studiengang_kz, null, + $person_id, $exkludierte_studiengang_kz ); @@ -62,6 +64,7 @@ class AbschlussstatusFehlt extends PlausiChecker $studiensemester_kurzbz = null, $studiengang_kz = null, $prestudent_id = null, + $person_id = null, $exkludierte_studiengang_kz = null ) { $params = array(); @@ -132,6 +135,12 @@ class AbschlussstatusFehlt extends PlausiChecker $params[] = $prestudent_id; } + if (isset($person_id)) + { + $qry .= " AND pre.person_id = ?"; + $params[] = $person_id; + } + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) { $qry .= " AND stg.studiengang_kz NOT IN ?"; diff --git a/application/libraries/issues/plausichecks/AktSemesterNull.php b/application/libraries/issues/plausichecks/AktSemesterNull.php index 1223a2720..7e0f4d132 100644 --- a/application/libraries/issues/plausichecks/AktSemesterNull.php +++ b/application/libraries/issues/plausichecks/AktSemesterNull.php @@ -19,9 +19,10 @@ class AktSemesterNull extends PlausiChecker // pass parameters needed for plausicheck $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; + $person_id = isset($params['person_id']) ? $params['person_id'] : null; // get all students failing the plausicheck - $prestudentRes = $this->getAktSemesterNull($studiensemester_kurzbz, $studiengang_kz, null, $exkludierte_studiengang_kz); + $prestudentRes = $this->getAktSemesterNull($studiensemester_kurzbz, $studiengang_kz, null, $person_id, $exkludierte_studiengang_kz); if (isError($prestudentRes)) return $prestudentRes; @@ -59,8 +60,13 @@ class AktSemesterNull extends PlausiChecker * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check * @return success with prestudents or error */ - public function getAktSemesterNull($studiensemester_kurzbz, $studiengang_kz = null, $prestudent_id = null, $exkludierte_studiengang_kz = null) - { + public function getAktSemesterNull( + $studiensemester_kurzbz, + $studiengang_kz = null, + $prestudent_id = null, + $person_id = null, + $exkludierte_studiengang_kz = null + ) { $params = array($studiensemester_kurzbz); $qry = " @@ -89,6 +95,12 @@ class AktSemesterNull extends PlausiChecker $params[] = $prestudent_id; } + if (isset($person_id)) + { + $qry .= " AND pre.person_id = ?"; + $params[] = $person_id; + } + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) { $qry .= " AND stg.studiengang_kz NOT IN ?"; diff --git a/application/libraries/issues/plausichecks/AktiverStudentOhneStatus.php b/application/libraries/issues/plausichecks/AktiverStudentOhneStatus.php index 94fe5cc8d..c2ab43ba3 100644 --- a/application/libraries/issues/plausichecks/AktiverStudentOhneStatus.php +++ b/application/libraries/issues/plausichecks/AktiverStudentOhneStatus.php @@ -18,9 +18,10 @@ class AktiverStudentOhneStatus extends PlausiChecker // pass parameters needed for plausicheck $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; + $person_id = isset($params['person_id']) ? $params['person_id'] : null; // get all students failing the plausicheck - $prestudentRes = $this->getAktiverStudentOhneStatus($studiengang_kz, null, $exkludierte_studiengang_kz); + $prestudentRes = $this->getAktiverStudentOhneStatus($studiengang_kz, null, $person_id, $exkludierte_studiengang_kz); if (isError($prestudentRes)) return $prestudentRes; @@ -51,7 +52,7 @@ class AktiverStudentOhneStatus extends PlausiChecker * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check * @return success with prestudents or error */ - public function getAktiverStudentOhneStatus($studiengang_kz = null, $prestudent_id = null, $exkludierte_studiengang_kz = null) + public function getAktiverStudentOhneStatus($studiengang_kz = null, $prestudent_id = null, $person_id = null, $exkludierte_studiengang_kz = null) { $params = array(); @@ -88,6 +89,12 @@ class AktiverStudentOhneStatus extends PlausiChecker $params[] = $prestudent_id; } + if (isset($person_id)) + { + $qry .= " AND prestudent.person_id = ?"; + $params[] = $person_id; + } + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) { $qry .= " AND stg.studiengang_kz NOT IN ?"; diff --git a/application/libraries/issues/plausichecks/AktiverStudentstatusOhneKontobuchung.php b/application/libraries/issues/plausichecks/AktiverStudentstatusOhneKontobuchung.php index 28684388f..29dd91c7e 100644 --- a/application/libraries/issues/plausichecks/AktiverStudentstatusOhneKontobuchung.php +++ b/application/libraries/issues/plausichecks/AktiverStudentstatusOhneKontobuchung.php @@ -19,12 +19,14 @@ class AktiverStudentstatusOhneKontobuchung extends PlausiChecker // pass parameters needed for plausicheck $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; + $person_id = isset($params['person_id']) ? $params['person_id'] : null; // get all students failing the plausicheck $prestudentRes = $this->getAktiverStudentstatusOhneKontobuchung( $studiensemester_kurzbz, $studiengang_kz, null, + $person_id, $exkludierte_studiengang_kz ); @@ -68,6 +70,7 @@ class AktiverStudentstatusOhneKontobuchung extends PlausiChecker $studiensemester_kurzbz, $studiengang_kz = null, $prestudent_id = null, + $person_id = null, $exkludierte_studiengang_kz = null ) { $params = array($studiensemester_kurzbz); @@ -109,6 +112,13 @@ class AktiverStudentstatusOhneKontobuchung extends PlausiChecker $params[] = $prestudent_id; } + if (isset($person_id)) + { + $qry .= " AND pers.person_id = ?"; + $params[] = $person_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) { $qry .= " AND stg.studiengang_kz NOT IN ?"; diff --git a/application/libraries/issues/plausichecks/AusbildungssemPrestudentUngleichAusbildungssemStatus.php b/application/libraries/issues/plausichecks/AusbildungssemPrestudentUngleichAusbildungssemStatus.php index 00ff16ae0..034b8185b 100644 --- a/application/libraries/issues/plausichecks/AusbildungssemPrestudentUngleichAusbildungssemStatus.php +++ b/application/libraries/issues/plausichecks/AusbildungssemPrestudentUngleichAusbildungssemStatus.php @@ -19,12 +19,14 @@ class AusbildungssemPrestudentUngleichAusbildungssemStatus extends PlausiChecker // pass parameters needed for plausicheck $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; + $person_id = isset($params['person_id']) ? $params['person_id'] : null; // get all students failing the plausicheck $prestudentRes = $this->getAusbildungssemPrestudentUngleichAusbildungssemStatus( $studiensemester_kurzbz, $studiengang_kz, null, + $person_id, $exkludierte_studiengang_kz ); @@ -71,6 +73,7 @@ class AusbildungssemPrestudentUngleichAusbildungssemStatus extends PlausiChecker $studiensemester_kurzbz, $studiengang_kz = null, $prestudent_id = null, + $person_id = null, $exkludierte_studiengang_kz = null ) { $params = array($studiensemester_kurzbz, $studiensemester_kurzbz, $studiensemester_kurzbz); @@ -105,6 +108,12 @@ class AusbildungssemPrestudentUngleichAusbildungssemStatus extends PlausiChecker $params[] = $prestudent_id; } + if (isset($person_id)) + { + $qry .= " AND prestudent.person_id = ?"; + $params[] = $person_id; + } + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) { $qry .= " AND stg.studiengang_kz NOT IN ?"; diff --git a/application/libraries/issues/plausichecks/BewerberNichtZumRtAngetreten.php b/application/libraries/issues/plausichecks/BewerberNichtZumRtAngetreten.php index 4a9655d13..2bc6fb730 100644 --- a/application/libraries/issues/plausichecks/BewerberNichtZumRtAngetreten.php +++ b/application/libraries/issues/plausichecks/BewerberNichtZumRtAngetreten.php @@ -19,12 +19,14 @@ class BewerberNichtZumRtAngetreten extends PlausiChecker // pass parameters needed for plausicheck $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; + $person_id = isset($params['person_id']) ? $params['person_id'] : null; // get all students failing the plausicheck $prestudentRes = $this->getBewerberNichtZumRtAngetreten( $studiensemester_kurzbz, $studiengang_kz, null, + $person_id, $exkludierte_studiengang_kz ); @@ -65,6 +67,7 @@ class BewerberNichtZumRtAngetreten extends PlausiChecker $studiensemester_kurzbz, $studiengang_kz = null, $prestudent_id = null, + $person_id = null, $exkludierte_studiengang_kz = null ) { $this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); @@ -112,6 +115,12 @@ class BewerberNichtZumRtAngetreten extends PlausiChecker $params[] = $prestudent_id; } + if (isset($person_id)) + { + $qry .= " AND prestudent.person_id = ?"; + $params[] = $person_id; + } + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) { $qry .= " AND stg.studiengang_kz NOT IN ?"; diff --git a/application/libraries/issues/plausichecks/DatumAbschlusspruefungFehlt.php b/application/libraries/issues/plausichecks/DatumAbschlusspruefungFehlt.php index f606e2c8c..7e9082162 100644 --- a/application/libraries/issues/plausichecks/DatumAbschlusspruefungFehlt.php +++ b/application/libraries/issues/plausichecks/DatumAbschlusspruefungFehlt.php @@ -19,12 +19,14 @@ class DatumAbschlusspruefungFehlt extends PlausiChecker // pass parameters needed for plausicheck $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; + $person_id = isset($params['person_id']) ? $params['person_id'] : null; // get all students failing the plausicheck $prestudentRes = $this->getDatumAbschlusspruefungFehlt( $studiensemester_kurzbz, $studiengang_kz, null, + $person_id, $exkludierte_studiengang_kz ); @@ -65,6 +67,7 @@ class DatumAbschlusspruefungFehlt extends PlausiChecker $studiensemester_kurzbz = null, $studiengang_kz = null, $abschlusspruefung_id = null, + $person_id = null, $exkludierte_studiengang_kz = null ) { $params = array(); @@ -112,6 +115,12 @@ class DatumAbschlusspruefungFehlt extends PlausiChecker $params[] = $abschlusspruefung_id; } + if (isset($person_id)) + { + $qry .= " AND pre.person_id = ?"; + $params[] = $person_id; + } + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) { $qry .= " AND stg.studiengang_kz NOT IN ?"; diff --git a/application/libraries/issues/plausichecks/DatumSponsionFehlt.php b/application/libraries/issues/plausichecks/DatumSponsionFehlt.php index 210ae6f01..d1fe63c80 100644 --- a/application/libraries/issues/plausichecks/DatumSponsionFehlt.php +++ b/application/libraries/issues/plausichecks/DatumSponsionFehlt.php @@ -19,12 +19,14 @@ class DatumSponsionFehlt extends PlausiChecker // pass parameters needed for plausicheck $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; + $person_id = isset($params['person_id']) ? $params['person_id'] : null; // get all students failing the plausicheck $prestudentRes = $this->getDatumSponsionFehlt( $studiensemester_kurzbz, $studiengang_kz, null, + $person_id, $exkludierte_studiengang_kz ); @@ -65,6 +67,7 @@ class DatumSponsionFehlt extends PlausiChecker $studiensemester_kurzbz = null, $studiengang_kz = null, $abschlusspruefung_id = null, + $person_id = null, $exkludierte_studiengang_kz = null ) { $params = array(); @@ -112,6 +115,12 @@ class DatumSponsionFehlt extends PlausiChecker $params[] = $abschlusspruefung_id; } + if (isset($person_id)) + { + $qry .= " AND pre.person_id = ?"; + $params[] = $person_id; + } + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) { $qry .= " AND stg.studiengang_kz NOT IN ?"; diff --git a/application/libraries/issues/plausichecks/DatumStudiensemesterFalscheReihenfolge.php b/application/libraries/issues/plausichecks/DatumStudiensemesterFalscheReihenfolge.php index 381bea7df..1f7b8cec6 100644 --- a/application/libraries/issues/plausichecks/DatumStudiensemesterFalscheReihenfolge.php +++ b/application/libraries/issues/plausichecks/DatumStudiensemesterFalscheReihenfolge.php @@ -18,9 +18,10 @@ class DatumStudiensemesterFalscheReihenfolge extends PlausiChecker // pass parameters needed for plausicheck $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; + $person_id = isset($params['person_id']) ? $params['person_id'] : null; // get all students failing the plausicheck - $prestudentRes = $this->getDatumStudiensemesterFalscheReihenfolge($studiengang_kz, null, $exkludierte_studiengang_kz); + $prestudentRes = $this->getDatumStudiensemesterFalscheReihenfolge($studiengang_kz, null, $person_id, $exkludierte_studiengang_kz); if (isError($prestudentRes)) return $prestudentRes; @@ -53,8 +54,12 @@ class DatumStudiensemesterFalscheReihenfolge extends PlausiChecker * @param exkludierte_studiengang_kz array if check is to be executed only for certain Studiengaenge * @return success with prestudents or error */ - public function getDatumStudiensemesterFalscheReihenfolge($studiengang_kz = null, $prestudent_id = null, $exkludierte_studiengang_kz = null) - { + public function getDatumStudiensemesterFalscheReihenfolge( + $studiengang_kz = null, + $prestudent_id = null, + $person_id = null, + $exkludierte_studiengang_kz = null + ) { $params = array(); // all active students with Status student in current semester @@ -97,6 +102,12 @@ class DatumStudiensemesterFalscheReihenfolge extends PlausiChecker $params[] = $prestudent_id; } + if (isset($person_id)) + { + $qry .= " AND person_id = ?"; + $params[] = $person_id; + } + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) { $qry .= " AND studiengang_kz NOT IN ?"; diff --git a/application/libraries/issues/plausichecks/DualesStudiumOhneMarkierung.php b/application/libraries/issues/plausichecks/DualesStudiumOhneMarkierung.php index 3951f6d76..344a40e4b 100644 --- a/application/libraries/issues/plausichecks/DualesStudiumOhneMarkierung.php +++ b/application/libraries/issues/plausichecks/DualesStudiumOhneMarkierung.php @@ -19,12 +19,14 @@ class DualesStudiumOhneMarkierung extends PlausiChecker // pass parameters needed for plausicheck $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; + $person_id = isset($params['person_id']) ? $params['person_id'] : null; // get all students failing the plausicheck $prestudentRes = $this->getDualesStudiumOhneMarkierung( $studiensemester_kurzbz, $studiengang_kz, null, + $person_id, $exkludierte_studiengang_kz ); @@ -68,6 +70,7 @@ class DualesStudiumOhneMarkierung extends PlausiChecker $studiensemester_kurzbz, $studiengang_kz = null, $prestudent_id = null, + $person_id = null, $exkludierte_studiengang_kz = null ) { $params = array($studiensemester_kurzbz); @@ -132,6 +135,12 @@ class DualesStudiumOhneMarkierung extends PlausiChecker $params[] = $prestudent_id; } + if (isset($person_id)) + { + $qry .= " AND tbl_person.person_id = ?"; + $params[] = $person_id; + } + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) { $qry .= " AND stg.studiengang_kz NOT IN ?"; diff --git a/application/libraries/issues/plausichecks/FalscheAnzahlAbschlusspruefungen.php b/application/libraries/issues/plausichecks/FalscheAnzahlAbschlusspruefungen.php index 1021fe85a..90609b004 100644 --- a/application/libraries/issues/plausichecks/FalscheAnzahlAbschlusspruefungen.php +++ b/application/libraries/issues/plausichecks/FalscheAnzahlAbschlusspruefungen.php @@ -19,12 +19,14 @@ class FalscheAnzahlAbschlusspruefungen extends PlausiChecker // pass parameters needed for plausicheck $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; + $person_id = isset($params['person_id']) ? $params['person_id'] : null; // get all students failing the plausicheck $prestudentRes = $this->getFalscheAnzahlAbschlusspruefungen( $studiensemester_kurzbz, $studiengang_kz, null, + $person_id, $exkludierte_studiengang_kz ); @@ -62,6 +64,7 @@ class FalscheAnzahlAbschlusspruefungen extends PlausiChecker $studiensemester_kurzbz = null, $studiengang_kz = null, $prestudent_id = null, + $person_id = null, $exkludierte_studiengang_kz = null ) { $params = array(); @@ -111,6 +114,12 @@ class FalscheAnzahlAbschlusspruefungen extends PlausiChecker $params[] = $prestudent_id; } + if (isset($person_id)) + { + $qry .= " AND pre.person_id = ?"; + $params[] = $person_id; + } + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) { $qry .= " AND stg.studiengang_kz NOT IN ?"; diff --git a/application/libraries/issues/plausichecks/FalscheAnzahlHeimatadressen.php b/application/libraries/issues/plausichecks/FalscheAnzahlHeimatadressen.php index b3551904e..ff374750e 100644 --- a/application/libraries/issues/plausichecks/FalscheAnzahlHeimatadressen.php +++ b/application/libraries/issues/plausichecks/FalscheAnzahlHeimatadressen.php @@ -19,12 +19,13 @@ class FalscheAnzahlHeimatadressen extends PlausiChecker // pass parameters needed for plausicheck $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; + $person_id = isset($params['person_id']) ? $params['person_id'] : null; // get all students failing the plausicheck $personRes = $this->getFalscheAnzahlHeimatadressen( $studiensemester_kurzbz, $studiengang_kz, - null, + $person_id, $exkludierte_studiengang_kz ); diff --git a/application/libraries/issues/plausichecks/FalscheAnzahlZustelladressen.php b/application/libraries/issues/plausichecks/FalscheAnzahlZustelladressen.php index 9d72b0236..f84478bb5 100644 --- a/application/libraries/issues/plausichecks/FalscheAnzahlZustelladressen.php +++ b/application/libraries/issues/plausichecks/FalscheAnzahlZustelladressen.php @@ -19,12 +19,13 @@ class FalscheAnzahlZustelladressen extends PlausiChecker // pass parameters needed for plausicheck $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; + $person_id = isset($params['person_id']) ? $params['person_id'] : null; // get all students failing the plausicheck $personRes = $this->getFalscheAnzahlZustelladressen( $studiensemester_kurzbz, $studiengang_kz, - null, + $person_id, $exkludierte_studiengang_kz ); diff --git a/application/libraries/issues/plausichecks/GbDatumWeitZurueck.php b/application/libraries/issues/plausichecks/GbDatumWeitZurueck.php index 04e1cf97b..160375259 100644 --- a/application/libraries/issues/plausichecks/GbDatumWeitZurueck.php +++ b/application/libraries/issues/plausichecks/GbDatumWeitZurueck.php @@ -19,9 +19,10 @@ class GbDatumWeitZurueck extends PlausiChecker // pass parameters needed for plausicheck $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; + $person_id = isset($params['person_id']) ? $params['person_id'] : null; // get all students failing the plausicheck - $personRes = $this->getGbDatumWeitZurueck($studiensemester_kurzbz, $studiengang_kz, null, $exkludierte_studiengang_kz); + $personRes = $this->getGbDatumWeitZurueck($studiensemester_kurzbz, $studiengang_kz, $person_id, $exkludierte_studiengang_kz); if (isError($personRes)) return $personRes; diff --git a/application/libraries/issues/plausichecks/InaktiverStudentAktiverStatus.php b/application/libraries/issues/plausichecks/InaktiverStudentAktiverStatus.php index 59965e238..3df54d1b4 100644 --- a/application/libraries/issues/plausichecks/InaktiverStudentAktiverStatus.php +++ b/application/libraries/issues/plausichecks/InaktiverStudentAktiverStatus.php @@ -19,12 +19,14 @@ class InaktiverStudentAktiverStatus extends PlausiChecker // pass parameters needed for plausicheck $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; + $person_id = isset($params['person_id']) ? $params['person_id'] : null; // get all students failing the plausicheck $prestudentRes = $this->getInaktiverStudentAktiverStatus( $studiensemester_kurzbz, $studiengang_kz, null, + $person_id, $exkludierte_studiengang_kz ); @@ -65,6 +67,7 @@ class InaktiverStudentAktiverStatus extends PlausiChecker $studiensemester_kurzbz, $studiengang_kz = null, $prestudent_id = null, + $person_id = null, $exkludierte_studiengang_kz = null ) { $this->_ci->load->model('organisation/studiensemester_model', 'StudiensemesterModel'); @@ -103,6 +106,12 @@ class InaktiverStudentAktiverStatus extends PlausiChecker $params[] = $prestudent_id; } + if (isset($person_id)) + { + $qry .= " AND prestudent.person_id = ?"; + $params[] = $person_id; + } + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) { $qry .= " AND stg.studiengang_kz NOT IN ?"; diff --git a/application/libraries/issues/plausichecks/IncomingHeimatNationOesterreich.php b/application/libraries/issues/plausichecks/IncomingHeimatNationOesterreich.php index 5276164dc..9ef2d3b42 100644 --- a/application/libraries/issues/plausichecks/IncomingHeimatNationOesterreich.php +++ b/application/libraries/issues/plausichecks/IncomingHeimatNationOesterreich.php @@ -19,12 +19,13 @@ class IncomingHeimatNationOesterreich extends PlausiChecker // pass parameters needed for plausicheck $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; + $person_id = isset($params['person_id']) ? $params['person_id'] : null; // get all students failing the plausicheck $personRes = $this->getIncomingHeimatNationOesterreich( $studiensemester_kurzbz, $studiengang_kz, - null, + $person_id, $exkludierte_studiengang_kz ); diff --git a/application/libraries/issues/plausichecks/IncomingOhneIoDatensatz.php b/application/libraries/issues/plausichecks/IncomingOhneIoDatensatz.php index e08280f83..d62e36a79 100644 --- a/application/libraries/issues/plausichecks/IncomingOhneIoDatensatz.php +++ b/application/libraries/issues/plausichecks/IncomingOhneIoDatensatz.php @@ -18,9 +18,10 @@ class IncomingOhneIoDatensatz extends PlausiChecker // pass parameters needed for plausicheck $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; + $person_id = isset($params['person_id']) ? $params['person_id'] : null; // get all students failing the plausicheck - $prestudentRes = $this->getIncomingOhneIoDatensatz($studiengang_kz, null, $exkludierte_studiengang_kz); + $prestudentRes = $this->getIncomingOhneIoDatensatz($studiengang_kz, null, $person_id, $exkludierte_studiengang_kz); if (isError($prestudentRes)) return $prestudentRes; @@ -51,7 +52,7 @@ class IncomingOhneIoDatensatz extends PlausiChecker * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check * @return success with prestudents or error */ - public function getIncomingOhneIoDatensatz($studiengang_kz = null, $prestudent_id = null, $exkludierte_studiengang_kz = null) + public function getIncomingOhneIoDatensatz($studiengang_kz = null, $prestudent_id = null, $person_id = null, $exkludierte_studiengang_kz = null) { $params = array(); @@ -85,6 +86,12 @@ class IncomingOhneIoDatensatz extends PlausiChecker $params[] = $prestudent_id; } + if (isset($person_id)) + { + $qry .= " AND tbl_person.person_id = ?"; + $params[] = $person_id; + } + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) { $qry .= " AND stg.studiengang_kz NOT IN ?"; diff --git a/application/libraries/issues/plausichecks/IncomingOrGsFoerderrelevant.php b/application/libraries/issues/plausichecks/IncomingOrGsFoerderrelevant.php index 4d789f71a..92b15a3d4 100644 --- a/application/libraries/issues/plausichecks/IncomingOrGsFoerderrelevant.php +++ b/application/libraries/issues/plausichecks/IncomingOrGsFoerderrelevant.php @@ -19,12 +19,14 @@ class IncomingOrGsFoerderrelevant extends PlausiChecker // pass parameters needed for plausicheck $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; + $person_id = isset($params['person_id']) ? $params['person_id'] : null; // get all students failing the plausicheck $prestudentRes = $this->getIncomingOrGsFoerderrelevant( $studiensemester_kurzbz, $studiengang_kz, null, + $person_id, $exkludierte_studiengang_kz ); @@ -62,6 +64,7 @@ class IncomingOrGsFoerderrelevant extends PlausiChecker $studiensemester_kurzbz = null, $studiengang_kz = null, $prestudent_id = null, + $person_id = null, $exkludierte_studiengang_kz = null ) { $params = array(); @@ -114,6 +117,12 @@ class IncomingOrGsFoerderrelevant extends PlausiChecker $params[] = $prestudent_id; } + if (isset($person_id)) + { + $qry .= " AND pers.person_id = ?"; + $params[] = $person_id; + } + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) { $qry .= " AND stg.studiengang_kz NOT IN ?"; diff --git a/application/libraries/issues/plausichecks/InskriptionVorLetzerBismeldung.php b/application/libraries/issues/plausichecks/InskriptionVorLetzerBismeldung.php index 871b3b3d4..7a56fd5ad 100644 --- a/application/libraries/issues/plausichecks/InskriptionVorLetzerBismeldung.php +++ b/application/libraries/issues/plausichecks/InskriptionVorLetzerBismeldung.php @@ -19,12 +19,14 @@ class InskriptionVorLetzerBismeldung extends PlausiChecker // pass parameters needed for plausicheck $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; + $person_id = isset($params['person_id']) ? $params['person_id'] : null; // get all students failing the plausicheck $prestudentRes = $this->getInskriptionVorLetzerBismeldung( $studiensemester_kurzbz, $studiengang_kz, null, + $person_id, $exkludierte_studiengang_kz ); @@ -71,6 +73,7 @@ class InskriptionVorLetzerBismeldung extends PlausiChecker $studiensemester_kurzbz, $studiengang_kz = null, $prestudent_id = null, + $person_id = null, $exkludierte_studiengang_kz = null ) { // get Bismeldedatum @@ -117,6 +120,12 @@ class InskriptionVorLetzerBismeldung extends PlausiChecker $params[] = $prestudent_id; } + if (isset($person_id)) + { + $qry .= " AND prestudent.person_id = ?"; + $params[] = $person_id; + } + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) { $qry .= " AND stg.studiengang_kz NOT IN ?"; diff --git a/application/libraries/issues/plausichecks/KeinAufenthaltszweckPlausi.php b/application/libraries/issues/plausichecks/KeinAufenthaltszweckPlausi.php index de1d94664..9f9e7a230 100644 --- a/application/libraries/issues/plausichecks/KeinAufenthaltszweckPlausi.php +++ b/application/libraries/issues/plausichecks/KeinAufenthaltszweckPlausi.php @@ -20,12 +20,14 @@ class KeinAufenthaltszweckPlausi extends PlausiChecker $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; $bisio_id = isset($params['bisio_id']) ? $params['bisio_id'] : null; + $person_id = isset($params['person_id']) ? $params['person_id'] : null; // get all students failing the plausicheck $prestudentRes = $this->_getKeinAufenthaltszweck( $studiensemester_kurzbz, $studiengang_kz, $bisio_id, + $person_id, $exkludierte_studiengang_kz ); @@ -63,6 +65,7 @@ class KeinAufenthaltszweckPlausi extends PlausiChecker $studiensemester_kurzbz = null, $studiengang_kz = null, $bisio_id = null, + $person_id = null, $exkludierte_studiengang_kz = null ) { @@ -105,6 +108,12 @@ class KeinAufenthaltszweckPlausi extends PlausiChecker $params[] = $bisio_id; } + if (isset($person_id)) + { + $qry .= " AND pre.person_id = ?"; + $params[] = $bisio_id; + } + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) { $qry .= " AND stg.studiengang_kz NOT IN ?"; diff --git a/application/libraries/issues/plausichecks/NationNichtOesterreichAberGemeinde.php b/application/libraries/issues/plausichecks/NationNichtOesterreichAberGemeinde.php index c04cd664c..cccd3ddef 100644 --- a/application/libraries/issues/plausichecks/NationNichtOesterreichAberGemeinde.php +++ b/application/libraries/issues/plausichecks/NationNichtOesterreichAberGemeinde.php @@ -18,11 +18,12 @@ class NationNichtOesterreichAberGemeinde extends PlausiChecker // pass parameters needed for plausicheck $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; + $person_id = isset($params['person_id']) ? $params['person_id'] : null; // get all students failing the plausicheck $personRes = $this->getNationNichtOesterreichAberGemeinde( $studiengang_kz, - null, + $person_id, $exkludierte_studiengang_kz ); diff --git a/application/libraries/issues/plausichecks/OrgformStgUngleichOrgformPrestudent.php b/application/libraries/issues/plausichecks/OrgformStgUngleichOrgformPrestudent.php index 316e81072..10dd80952 100644 --- a/application/libraries/issues/plausichecks/OrgformStgUngleichOrgformPrestudent.php +++ b/application/libraries/issues/plausichecks/OrgformStgUngleichOrgformPrestudent.php @@ -19,12 +19,14 @@ class OrgformStgUngleichOrgformPrestudent extends PlausiChecker // pass parameters needed for plausicheck $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; + $person_id = isset($params['person_id']) ? $params['person_id'] : null; // get all students failing the plausicheck $prestudentRes = $this->getOrgformStgUngleichOrgformPrestudent( $studiensemester_kurzbz, $studiengang_kz, null, + $person_id, $exkludierte_studiengang_kz ); @@ -70,6 +72,7 @@ class OrgformStgUngleichOrgformPrestudent extends PlausiChecker $studiensemester_kurzbz, $studiengang_kz = null, $prestudent_id = null, + $person_id = null, $exkludierte_studiengang_kz = null ) { $params = array($studiensemester_kurzbz); @@ -116,6 +119,12 @@ class OrgformStgUngleichOrgformPrestudent extends PlausiChecker $params[] = $prestudent_id; } + if (isset($person_id)) + { + $qry .= " AND prestudent.person_id = ?"; + $params[] = $person_id; + } + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) { $qry .= " AND stg.studiengang_kz NOT IN ?"; diff --git a/application/libraries/issues/plausichecks/OutgoingAngerechneteEctsFehlenPlausi.php b/application/libraries/issues/plausichecks/OutgoingAngerechneteEctsFehlenPlausi.php index 458e33ba2..dff0e14c1 100644 --- a/application/libraries/issues/plausichecks/OutgoingAngerechneteEctsFehlenPlausi.php +++ b/application/libraries/issues/plausichecks/OutgoingAngerechneteEctsFehlenPlausi.php @@ -20,12 +20,14 @@ class OutgoingAngerechneteEctsFehlenPlausi extends PlausiChecker $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; $bisio_id = isset($params['bisio_id']) ? $params['bisio_id'] : null; + $person_id = isset($params['person_id']) ? $params['person_id'] : null; // get all students failing the plausicheck $prestudentRes = $this->_getAngerechneteEctsFehlen( $studiensemester_kurzbz, $studiengang_kz, $bisio_id, + $person_id, $exkludierte_studiengang_kz ); @@ -63,6 +65,7 @@ class OutgoingAngerechneteEctsFehlenPlausi extends PlausiChecker $studiensemester_kurzbz = null, $studiengang_kz = null, $bisio_id = null, + $person_id = null, $exkludierte_studiengang_kz = null ) { @@ -108,6 +111,12 @@ class OutgoingAngerechneteEctsFehlenPlausi extends PlausiChecker $params[] = $bisio_id; } + if (isset($person_id)) + { + $qry .= " AND pre.person_id = ?"; + $params[] = $person_id; + } + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) { $qry .= " AND stg.studiengang_kz NOT IN ?"; diff --git a/application/libraries/issues/plausichecks/OutgoingAufenthaltfoerderungfehltPlausi.php b/application/libraries/issues/plausichecks/OutgoingAufenthaltfoerderungfehltPlausi.php index dcffd7e05..3a75d1940 100644 --- a/application/libraries/issues/plausichecks/OutgoingAufenthaltfoerderungfehltPlausi.php +++ b/application/libraries/issues/plausichecks/OutgoingAufenthaltfoerderungfehltPlausi.php @@ -20,12 +20,14 @@ class OutgoingAufenthaltfoerderungfehltPlausi extends PlausiChecker $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; $bisio_id = isset($params['bisio_id']) ? $params['bisio_id'] : null; + $person_id = isset($params['person_id']) ? $params['person_id'] : null; // get all students failing the plausicheck $prestudentRes = $this->_getAufenthaltsfoerderungFehlt( $studiensemester_kurzbz, $studiengang_kz, $bisio_id, + $person_id, $exkludierte_studiengang_kz ); @@ -63,6 +65,7 @@ class OutgoingAufenthaltfoerderungfehltPlausi extends PlausiChecker $studiensemester_kurzbz = null, $studiengang_kz = null, $bisio_id = null, + $person_id = null, $exkludierte_studiengang_kz = null ) { @@ -108,6 +111,12 @@ class OutgoingAufenthaltfoerderungfehltPlausi extends PlausiChecker $params[] = $bisio_id; } + if (isset($person_id)) + { + $qry .= " AND pre.person_id = ?"; + $params[] = $person_id; + } + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) { $qry .= " AND stg.studiengang_kz NOT IN ?"; diff --git a/application/libraries/issues/plausichecks/OutgoingErworbeneEctsFehlenPlausi.php b/application/libraries/issues/plausichecks/OutgoingErworbeneEctsFehlenPlausi.php index 9471b3b40..b5be77ea6 100644 --- a/application/libraries/issues/plausichecks/OutgoingErworbeneEctsFehlenPlausi.php +++ b/application/libraries/issues/plausichecks/OutgoingErworbeneEctsFehlenPlausi.php @@ -20,12 +20,14 @@ class OutgoingErworbeneEctsFehlenPlausi extends PlausiChecker $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; $bisio_id = isset($params['bisio_id']) ? $params['bisio_id'] : null; + $person_id = isset($params['person_id']) ? $params['person_id'] : null; // get all students failing the plausicheck $prestudentRes = $this->_getAngerechneteEctsFehlen( $studiensemester_kurzbz, $studiengang_kz, $bisio_id, + $person_id, $exkludierte_studiengang_kz ); @@ -63,6 +65,7 @@ class OutgoingErworbeneEctsFehlenPlausi extends PlausiChecker $studiensemester_kurzbz = null, $studiengang_kz = null, $bisio_id = null, + $person_id = null, $exkludierte_studiengang_kz = null ) { @@ -108,6 +111,12 @@ class OutgoingErworbeneEctsFehlenPlausi extends PlausiChecker $params[] = $bisio_id; } + if (isset($person_id)) + { + $qry .= " AND pre.person_id = ?"; + $params[] = $person_id; + } + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) { $qry .= " AND stg.studiengang_kz NOT IN ?"; diff --git a/application/libraries/issues/plausichecks/PrestudentMischformOhneOrgform.php b/application/libraries/issues/plausichecks/PrestudentMischformOhneOrgform.php index a4c3e2a4b..e5f803f74 100644 --- a/application/libraries/issues/plausichecks/PrestudentMischformOhneOrgform.php +++ b/application/libraries/issues/plausichecks/PrestudentMischformOhneOrgform.php @@ -19,12 +19,14 @@ class PrestudentMischformOhneOrgform extends PlausiChecker // pass parameters needed for plausicheck $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; + $person_id = isset($params['person_id']) ? $params['person_id'] : null; // get all students failing the plausicheck $prestudentRes = $this->getPrestudentMischformOhneOrgform( $studiensemester_kurzbz, $studiengang_kz, null, + $person_id, $exkludierte_studiengang_kz ); @@ -68,6 +70,7 @@ class PrestudentMischformOhneOrgform extends PlausiChecker $studiensemester_kurzbz, $studiengang_kz = null, $prestudent_id = null, + $person_id = null, $exkludierte_studiengang_kz = null ) { $params = array($studiensemester_kurzbz); @@ -98,6 +101,12 @@ class PrestudentMischformOhneOrgform extends PlausiChecker $params[] = $prestudent_id; } + if (isset($person_id)) + { + $qry .= " AND tbl_person.person_id = ?"; + $params[] = $person_id; + } + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) { $qry .= " AND stg.studiengang_kz NOT IN ?"; diff --git a/application/libraries/issues/plausichecks/StgPrestudentUngleichStgStudent.php b/application/libraries/issues/plausichecks/StgPrestudentUngleichStgStudent.php index 94bea2f35..447fc9007 100644 --- a/application/libraries/issues/plausichecks/StgPrestudentUngleichStgStudent.php +++ b/application/libraries/issues/plausichecks/StgPrestudentUngleichStgStudent.php @@ -18,9 +18,10 @@ class StgPrestudentUngleichStgStudent extends PlausiChecker // pass parameters needed for plausicheck $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; + $person_id = isset($params['person_id']) ? $params['person_id'] : null; // get all students failing the plausicheck - $prestudentRes = $this->getStgPrestudentUngleichStgStudent($studiengang_kz, null, $exkludierte_studiengang_kz); + $prestudentRes = $this->getStgPrestudentUngleichStgStudent($studiengang_kz, null, $person_id, $exkludierte_studiengang_kz); if (isError($prestudentRes)) return $prestudentRes; @@ -51,7 +52,7 @@ class StgPrestudentUngleichStgStudent extends PlausiChecker * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check * @return success with prestudents or error */ - public function getStgPrestudentUngleichStgStudent($studiengang_kz = null, $prestudent_id = null, $exkludierte_studiengang_kz = null) + public function getStgPrestudentUngleichStgStudent($studiengang_kz = null, $prestudent_id = null, $person_id = null, $exkludierte_studiengang_kz = null) { $params = array(); @@ -79,6 +80,12 @@ class StgPrestudentUngleichStgStudent extends PlausiChecker $params[] = $prestudent_id; } + if (isset($person_id)) + { + $qry .= " AND pers.person_id = ?"; + $params[] = $person_id; + } + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) { $qry .= " AND stg.studiengang_kz NOT IN ?"; diff --git a/application/libraries/issues/plausichecks/StgPrestudentUngleichStgStudienplan.php b/application/libraries/issues/plausichecks/StgPrestudentUngleichStgStudienplan.php index fc0f52f23..521c0c677 100644 --- a/application/libraries/issues/plausichecks/StgPrestudentUngleichStgStudienplan.php +++ b/application/libraries/issues/plausichecks/StgPrestudentUngleichStgStudienplan.php @@ -18,9 +18,10 @@ class StgPrestudentUngleichStgStudienplan extends PlausiChecker // pass parameters needed for plausicheck $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; + $person_id = isset($params['person_id']) ? $params['person_id'] : null; // get all students failing the plausicheck - $prestudentRes = $this->getStgPrestudentUngleichStgStudienplan($studiengang_kz, null, null, $exkludierte_studiengang_kz); + $prestudentRes = $this->getStgPrestudentUngleichStgStudienplan($studiengang_kz, null, null, $person_id, $exkludierte_studiengang_kz); if (isError($prestudentRes)) return $prestudentRes; @@ -56,6 +57,7 @@ class StgPrestudentUngleichStgStudienplan extends PlausiChecker $studiengang_kz = null, $prestudent_id = null, $studienordnung_id = null, + $person_id = null, $exkludierte_studiengang_kz = null ) { $params = array(); @@ -93,6 +95,12 @@ class StgPrestudentUngleichStgStudienplan extends PlausiChecker $params[] = $studienordnung_id; } + if (isset($person_id)) + { + $qry .= " AND tbl_person.person_id = ?"; + $params[] = $person_id; + } + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) { $qry .= " AND stg.studiengang_kz NOT IN ?"; diff --git a/application/libraries/issues/plausichecks/StudentstatusNachAbbrecher.php b/application/libraries/issues/plausichecks/StudentstatusNachAbbrecher.php index 87bb51d7e..aac47753d 100644 --- a/application/libraries/issues/plausichecks/StudentstatusNachAbbrecher.php +++ b/application/libraries/issues/plausichecks/StudentstatusNachAbbrecher.php @@ -18,9 +18,10 @@ class StudentstatusNachAbbrecher extends PlausiChecker // pass parameters needed for plausicheck $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; + $person_id = isset($params['person_id']) ? $params['person_id'] : null; // get all students failing the plausicheck - $prestudentRes = $this->getStudentstatusNachAbbrecher($studiengang_kz, null, $exkludierte_studiengang_kz); + $prestudentRes = $this->getStudentstatusNachAbbrecher($studiengang_kz, null, $person_id, $exkludierte_studiengang_kz); if (isError($prestudentRes)) return $prestudentRes; @@ -51,7 +52,7 @@ class StudentstatusNachAbbrecher extends PlausiChecker * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check * @return success with prestudents or error */ - public function getStudentstatusNachAbbrecher($studiengang_kz = null, $prestudent_id = null, $exkludierte_studiengang_kz = null) + public function getStudentstatusNachAbbrecher($studiengang_kz = null, $prestudent_id = null, $person_id = null, $exkludierte_studiengang_kz = null) { $params = array(); @@ -79,6 +80,12 @@ class StudentstatusNachAbbrecher extends PlausiChecker $params[] = $prestudent_id; } + if (isset($person_id)) + { + $qry .= " AND prestudent.person_id = ?"; + $params[] = $person_id; + } + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) { $qry .= " AND stg.studiengang_kz NOT IN ?"; diff --git a/application/libraries/issues/plausichecks/StudienplanUngueltig.php b/application/libraries/issues/plausichecks/StudienplanUngueltig.php index 9a306278e..d4aee05a5 100644 --- a/application/libraries/issues/plausichecks/StudienplanUngueltig.php +++ b/application/libraries/issues/plausichecks/StudienplanUngueltig.php @@ -19,12 +19,14 @@ class StudienplanUngueltig extends PlausiChecker // pass parameters needed for plausicheck $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; + $person_id = isset($params['person_id']) ? $params['person_id'] : null; // get all students failing the plausicheck $prestudentRes = $this->getStudienplanUngueltig( $studiensemester_kurzbz, $studiengang_kz, null, + $person_id, $exkludierte_studiengang_kz ); @@ -69,6 +71,7 @@ class StudienplanUngueltig extends PlausiChecker $studiensemester_kurzbz, $studiengang_kz = null, $prestudent_id = null, + $person_id = null, $exkludierte_studiengang_kz = null ) { $params = array($studiensemester_kurzbz); @@ -115,6 +118,12 @@ class StudienplanUngueltig extends PlausiChecker $params[] = $prestudent_id; } + if (isset($person_id)) + { + $qry .= " AND tbl_person.person_id = ?"; + $params[] = $person_id; + } + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) { $qry .= " AND stg.studiengang_kz NOT IN ?"; diff --git a/application/libraries/issues/plausichecks/UhstatPersonkennungFehltCore.php b/application/libraries/issues/plausichecks/UhstatPersonkennungFehltCore.php index a6b654cd5..1975e5c2a 100644 --- a/application/libraries/issues/plausichecks/UhstatPersonkennungFehltCore.php +++ b/application/libraries/issues/plausichecks/UhstatPersonkennungFehltCore.php @@ -97,7 +97,7 @@ class UhstatPersonkennungFehltCore extends PlausiChecker if (isset($person_id)) { - $qry .= " AND pre.person_id = ?"; + $qry .= " AND pers.person_id = ?"; $params[] = $person_id; } diff --git a/application/libraries/issues/plausichecks/ZgvDatumInZukunft.php b/application/libraries/issues/plausichecks/ZgvDatumInZukunft.php index 4ee91186c..125281070 100644 --- a/application/libraries/issues/plausichecks/ZgvDatumInZukunft.php +++ b/application/libraries/issues/plausichecks/ZgvDatumInZukunft.php @@ -20,12 +20,14 @@ class ZgvDatumInZukunft extends PlausiChecker $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; $prestudent_id = isset($params['prestudent_id']) ? $params['prestudent_id'] : null; + $person_id = isset($params['person_id']) ? $params['person_id'] : null; // get all students failing the plausicheck $prestudentRes = $this->_getZgvDatumInZukunft( $studiensemester_kurzbz, $studiengang_kz, $prestudent_id, + $person_id, $exkludierte_studiengang_kz ); @@ -63,6 +65,7 @@ class ZgvDatumInZukunft extends PlausiChecker $studiensemester_kurzbz = null, $studiengang_kz = null, $prestudent_id = null, + $person_id = null, $exkludierte_studiengang_kz = null ) { $params = array(); @@ -115,6 +118,12 @@ class ZgvDatumInZukunft extends PlausiChecker $params[] = $prestudent_id; } + if (isset($person_id)) + { + $qry .= " AND pre.person_id = ?"; + $params[] = $person_id; + } + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) { $qry .= " AND stg.studiengang_kz NOT IN ?"; diff --git a/application/libraries/issues/plausichecks/ZgvDatumVorGeburtsdatum.php b/application/libraries/issues/plausichecks/ZgvDatumVorGeburtsdatum.php index 55c70758e..d28fc522e 100644 --- a/application/libraries/issues/plausichecks/ZgvDatumVorGeburtsdatum.php +++ b/application/libraries/issues/plausichecks/ZgvDatumVorGeburtsdatum.php @@ -20,12 +20,14 @@ class ZgvDatumVorGeburtsdatum extends PlausiChecker $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; $prestudent_id = isset($params['prestudent_id']) ? $params['prestudent_id'] : null; + $person_id = isset($params['person_id']) ? $params['person_id'] : null; // get all students failing the plausicheck $prestudentRes = $this->_getZgvDatumVorGeburtsdatum( $studiensemester_kurzbz, $studiengang_kz, $prestudent_id, + $person_id, $exkludierte_studiengang_kz ); @@ -63,6 +65,7 @@ class ZgvDatumVorGeburtsdatum extends PlausiChecker $studiensemester_kurzbz = null, $studiengang_kz = null, $prestudent_id = null, + $person_id = null, $exkludierte_studiengang_kz = null ) { $params = array(); @@ -98,6 +101,12 @@ class ZgvDatumVorGeburtsdatum extends PlausiChecker $params[] = $prestudent_id; } + if (isset($person_id)) + { + $qry .= " AND pers.person_id = ?"; + $params[] = $person_id; + } + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) { $qry .= " AND stg.studiengang_kz NOT IN ?"; diff --git a/application/libraries/issues/plausichecks/ZgvMasterDatumInZukunft.php b/application/libraries/issues/plausichecks/ZgvMasterDatumInZukunft.php index 1dc123c78..1f83500de 100644 --- a/application/libraries/issues/plausichecks/ZgvMasterDatumInZukunft.php +++ b/application/libraries/issues/plausichecks/ZgvMasterDatumInZukunft.php @@ -20,12 +20,14 @@ class ZgvMasterDatumInZukunft extends PlausiChecker $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; $prestudent_id = isset($params['prestudent_id']) ? $params['prestudent_id'] : null; + $person_id = isset($params['person_id']) ? $params['person_id'] : null; // get all students failing the plausicheck $prestudentRes = $this->_getZgvMasterDatumInZukunft( $studiensemester_kurzbz, $studiengang_kz, $prestudent_id, + $person_id, $exkludierte_studiengang_kz ); @@ -63,6 +65,7 @@ class ZgvMasterDatumInZukunft extends PlausiChecker $studiensemester_kurzbz = null, $studiengang_kz = null, $prestudent_id = null, + $person_id = null, $exkludierte_studiengang_kz = null ) { $params = array(); @@ -98,6 +101,12 @@ class ZgvMasterDatumInZukunft extends PlausiChecker $params[] = $prestudent_id; } + if (isset($person_id)) + { + $qry .= " AND pre.person_id = ?"; + $params[] = $person_id; + } + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) { $qry .= " AND stg.studiengang_kz NOT IN ?"; diff --git a/application/libraries/issues/plausichecks/ZgvMasterDatumVorGeburtsdatum.php b/application/libraries/issues/plausichecks/ZgvMasterDatumVorGeburtsdatum.php index 00b3fff4a..7da8c08d8 100644 --- a/application/libraries/issues/plausichecks/ZgvMasterDatumVorGeburtsdatum.php +++ b/application/libraries/issues/plausichecks/ZgvMasterDatumVorGeburtsdatum.php @@ -20,12 +20,14 @@ class ZgvMasterDatumVorGeburtsdatum extends PlausiChecker $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; $prestudent_id = isset($params['prestudent_id']) ? $params['prestudent_id'] : null; + $person_id = isset($params['person_id']) ? $params['person_id'] : null; // get all students failing the plausicheck $prestudentRes = $this->_getZgvMasterDatumVorGeburtsdatum( $studiensemester_kurzbz, $studiengang_kz, $prestudent_id, + $person_id, $exkludierte_studiengang_kz ); @@ -63,6 +65,7 @@ class ZgvMasterDatumVorGeburtsdatum extends PlausiChecker $studiensemester_kurzbz = null, $studiengang_kz = null, $prestudent_id = null, + $person_id = null, $exkludierte_studiengang_kz = null ) { $params = array(); @@ -98,6 +101,12 @@ class ZgvMasterDatumVorGeburtsdatum extends PlausiChecker $params[] = $prestudent_id; } + if (isset($person_id)) + { + $qry .= " AND pre.person_id = ?"; + $params[] = $person_id; + } + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) { $qry .= " AND stg.studiengang_kz NOT IN ?"; diff --git a/application/libraries/issues/plausichecks/ZgvMasterDatumVorZgvdatum.php b/application/libraries/issues/plausichecks/ZgvMasterDatumVorZgvdatum.php index 0d16e56b7..8f10159ba 100644 --- a/application/libraries/issues/plausichecks/ZgvMasterDatumVorZgvdatum.php +++ b/application/libraries/issues/plausichecks/ZgvMasterDatumVorZgvdatum.php @@ -20,12 +20,14 @@ class ZgvMasterDatumVorZgvdatum extends PlausiChecker $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; $prestudent_id = isset($params['prestudent_id']) ? $params['prestudent_id'] : null; + $person_id = isset($params['person_id']) ? $params['person_id'] : null; // get all students failing the plausicheck $prestudentRes = $this->_getZgvMasterDatumVorZgvDatum( $studiensemester_kurzbz, $studiengang_kz, $prestudent_id, + $person_id, $exkludierte_studiengang_kz ); @@ -63,6 +65,7 @@ class ZgvMasterDatumVorZgvdatum extends PlausiChecker $studiensemester_kurzbz = null, $studiengang_kz = null, $prestudent_id = null, + $person_id = null, $exkludierte_studiengang_kz = null ) { $params = array(); @@ -98,6 +101,12 @@ class ZgvMasterDatumVorZgvdatum extends PlausiChecker $params[] = $prestudent_id; } + if (isset($person_id)) + { + $qry .= " AND pre.person_id = ?"; + $params[] = $person_id; + } + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) { $qry .= " AND stg.studiengang_kz NOT IN ?"; diff --git a/application/libraries/issues/plausichecks/ZuVieleZweckeIncomingPlausi.php b/application/libraries/issues/plausichecks/ZuVieleZweckeIncomingPlausi.php index ab39c880f..395bffe85 100644 --- a/application/libraries/issues/plausichecks/ZuVieleZweckeIncomingPlausi.php +++ b/application/libraries/issues/plausichecks/ZuVieleZweckeIncomingPlausi.php @@ -20,12 +20,14 @@ class ZuVieleZweckeIncomingPlausi extends PlausiChecker $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; $bisio_id = isset($params['bisio_id']) ? $params['bisio_id'] : null; + $person_id = isset($params['person_id']) ? $params['person_id'] : null; // get all students failing the plausicheck $prestudentRes = $this->_getFalscherIncomingZweck( $studiensemester_kurzbz, $studiengang_kz, $bisio_id, + $person_id, $exkludierte_studiengang_kz ); @@ -63,6 +65,7 @@ class ZuVieleZweckeIncomingPlausi extends PlausiChecker $studiensemester_kurzbz = null, $studiengang_kz = null, $bisio_id = null, + $person_id = null, $exkludierte_studiengang_kz = null ) { @@ -110,6 +113,12 @@ class ZuVieleZweckeIncomingPlausi extends PlausiChecker $params[] = $bisio_id; } + if (isset($person_id)) + { + $qry .= " AND zwecke.person_id = ?"; + $params[] = $person_id; + } + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) { $qry .= " AND zwecke.studiengang_kz NOT IN ?"; From 2428589bcaa0fdc144963fd6fed0c87083a21f3e Mon Sep 17 00:00:00 2001 From: Alexei Karpenko Date: Thu, 16 Apr 2026 02:12:01 +0200 Subject: [PATCH 29/32] Issues: Geburtsnation fehlt, Falscher Incoming Zweck: added person Id, added issue checker component to Studierendenverwaltung header, added comments to issues, set some issues to self-resolving, Plausicheck GUI: issues from core, dvuh and bis are displayed --- application/config/fehler.php | 4 +-- .../v1/issues/StudentIssueChecker.php | 17 +++++++++ .../system/issues/Plausichecks.php | 3 +- .../plausichecks/AbschlussstatusFehlt.php | 1 + .../issues/plausichecks/AktSemesterNull.php | 1 + .../plausichecks/AktiverStudentOhneStatus.php | 1 + .../AktiverStudentstatusOhneKontobuchung.php | 1 + ...PrestudentUngleichAusbildungssemStatus.php | 1 + .../BewerberNichtZumRtAngetreten.php | 1 + .../DatumAbschlusspruefungFehlt.php | 1 + .../plausichecks/DatumSponsionFehlt.php | 1 + ...DatumStudiensemesterFalscheReihenfolge.php | 1 + .../DualesStudiumOhneMarkierung.php | 1 + .../FalscheAnzahlAbschlusspruefungen.php | 1 + .../FalscherIncomingZweckPlausi.php | 12 ++++++- .../plausichecks/GeburtsnationFehlt.php | 12 +++---- .../InaktiverStudentAktiverStatus.php | 1 + .../plausichecks/IncomingOhneIoDatensatz.php | 1 + .../IncomingOrGsFoerderrelevant.php | 1 + .../InskriptionVorLetzerBismeldung.php | 23 ++++++------ .../KeinAufenthaltszweckPlausi.php | 2 +- .../OutgoingAngerechneteEctsFehlenPlausi.php | 3 +- ...utgoingAufenthaltfoerderungfehltPlausi.php | 2 +- .../OutgoingErworbeneEctsFehlenPlausi.php | 2 +- .../UhstatPersonkennungFehltCore.php | 2 +- .../issues/plausichecks/ZgvDatumInZukunft.php | 2 +- .../plausichecks/ZgvDatumVorGeburtsdatum.php | 2 +- .../plausichecks/ZgvMasterDatumInZukunft.php | 2 +- .../ZgvMasterDatumVorGeburtsdatum.php | 2 +- .../ZgvMasterDatumVorZgvdatum.php | 2 +- .../ZuVieleZweckeIncomingPlausi.php | 2 +- .../issues/resolvers/CORE_PERSON_0005.php | 36 ------------------- public/js/api/factory/issueChecker.js | 20 +++++++++++ public/js/components/Issues/IssueChecker.js | 11 ++++-- .../Stv/Studentenverwaltung/Details.js | 11 +++++- 35 files changed, 114 insertions(+), 72 deletions(-) create mode 100644 application/controllers/api/frontend/v1/issues/StudentIssueChecker.php delete mode 100644 application/libraries/issues/resolvers/CORE_PERSON_0005.php create mode 100644 public/js/api/factory/issueChecker.js diff --git a/application/config/fehler.php b/application/config/fehler.php index 32b1e82e7..7f546c840 100644 --- a/application/config/fehler.php +++ b/application/config/fehler.php @@ -431,8 +431,8 @@ $config['fehler'] = array( 'fehlertyp_kurzbz' => 'error', 'app' => 'core', 'producerLibName' => 'GeburtsnationFehlt', - 'resolverLibName' => 'CORE_PERSON_0005', - 'producerIsResolver' => false + 'resolverLibName' => null, + 'producerIsResolver' => true ), array( 'fehlercode' => 'CORE_PERSON_0006', diff --git a/application/controllers/api/frontend/v1/issues/StudentIssueChecker.php b/application/controllers/api/frontend/v1/issues/StudentIssueChecker.php new file mode 100644 index 000000000..83f8e8b30 --- /dev/null +++ b/application/controllers/api/frontend/v1/issues/StudentIssueChecker.php @@ -0,0 +1,17 @@ +load->library('issues/PlausicheckProducerLib', array('apps' => self::APPS)); - $this->load->library('issues/PlausicheckDefinitionLib'); $this->load->library('WidgetLib'); // Load models diff --git a/application/libraries/issues/plausichecks/AbschlussstatusFehlt.php b/application/libraries/issues/plausichecks/AbschlussstatusFehlt.php index 93a5059f0..8dd8af96d 100644 --- a/application/libraries/issues/plausichecks/AbschlussstatusFehlt.php +++ b/application/libraries/issues/plausichecks/AbschlussstatusFehlt.php @@ -57,6 +57,7 @@ class AbschlussstatusFehlt extends PlausiChecker * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester * @param studiengang_kz int if check is to be executed for certain Studiengang * @param prestudent_id int if check is to be executed only for one prestudent + * @param person_id int if check is to be executed only for one person * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check * @return success with prestudents or error */ diff --git a/application/libraries/issues/plausichecks/AktSemesterNull.php b/application/libraries/issues/plausichecks/AktSemesterNull.php index 7e0f4d132..48d97c62b 100644 --- a/application/libraries/issues/plausichecks/AktSemesterNull.php +++ b/application/libraries/issues/plausichecks/AktSemesterNull.php @@ -57,6 +57,7 @@ class AktSemesterNull extends PlausiChecker * @param studiensemester_kurzbz string check is to be executed for certain Studiensemester * @param studiengang_kz int if check is to be executed for certain Studiengang * @param prestudent_id int if check is to be executed only for one prestudent + * @param person_id int if check is to be executed only for one person * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check * @return success with prestudents or error */ diff --git a/application/libraries/issues/plausichecks/AktiverStudentOhneStatus.php b/application/libraries/issues/plausichecks/AktiverStudentOhneStatus.php index c2ab43ba3..fe9f551a2 100644 --- a/application/libraries/issues/plausichecks/AktiverStudentOhneStatus.php +++ b/application/libraries/issues/plausichecks/AktiverStudentOhneStatus.php @@ -49,6 +49,7 @@ class AktiverStudentOhneStatus extends PlausiChecker * Students with active Benutzer should have a status in the current semester. * @param studiengang_kz int if check is to be executed for certain Studiengang * @param prestudent_id int if check is to be executed only for one prestudent + * @param person_id int if check is to be executed only for one person * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check * @return success with prestudents or error */ diff --git a/application/libraries/issues/plausichecks/AktiverStudentstatusOhneKontobuchung.php b/application/libraries/issues/plausichecks/AktiverStudentstatusOhneKontobuchung.php index 29dd91c7e..5f34790e2 100644 --- a/application/libraries/issues/plausichecks/AktiverStudentstatusOhneKontobuchung.php +++ b/application/libraries/issues/plausichecks/AktiverStudentstatusOhneKontobuchung.php @@ -63,6 +63,7 @@ class AktiverStudentstatusOhneKontobuchung extends PlausiChecker * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester * @param studiengang_kz int if check is to be executed for certain Studiengang * @param prestudent_id int if check is to be executed only for one prestudent + * @param person_id int if check is to be executed only for one person * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check * @return success with prestudents or error */ diff --git a/application/libraries/issues/plausichecks/AusbildungssemPrestudentUngleichAusbildungssemStatus.php b/application/libraries/issues/plausichecks/AusbildungssemPrestudentUngleichAusbildungssemStatus.php index 034b8185b..22fa069bd 100644 --- a/application/libraries/issues/plausichecks/AusbildungssemPrestudentUngleichAusbildungssemStatus.php +++ b/application/libraries/issues/plausichecks/AusbildungssemPrestudentUngleichAusbildungssemStatus.php @@ -66,6 +66,7 @@ class AusbildungssemPrestudentUngleichAusbildungssemStatus extends PlausiChecker * @param studiensemester_kurzbz string check is to be executed for certain Studiensemester * @param studiengang_kz int if check is to be executed for certain Studiengang * @param prestudent_id int if check is to be executed only for one prestudent + * @param person_id int if check is to be executed only for one person * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check * @return success with prestudents or error */ diff --git a/application/libraries/issues/plausichecks/BewerberNichtZumRtAngetreten.php b/application/libraries/issues/plausichecks/BewerberNichtZumRtAngetreten.php index 2bc6fb730..307f47467 100644 --- a/application/libraries/issues/plausichecks/BewerberNichtZumRtAngetreten.php +++ b/application/libraries/issues/plausichecks/BewerberNichtZumRtAngetreten.php @@ -60,6 +60,7 @@ class BewerberNichtZumRtAngetreten extends PlausiChecker * @param studiensemester_kurzbz string check is to be executed for certain Studiensemester * @param studiengang_kz int if check is to be executed for certain Studiengang * @param prestudent_id int if check is to be executed only for one prestudent + * @param person_id int if check is to be executed only for one person * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check * @return success with prestudents or error */ diff --git a/application/libraries/issues/plausichecks/DatumAbschlusspruefungFehlt.php b/application/libraries/issues/plausichecks/DatumAbschlusspruefungFehlt.php index 7e9082162..028d89650 100644 --- a/application/libraries/issues/plausichecks/DatumAbschlusspruefungFehlt.php +++ b/application/libraries/issues/plausichecks/DatumAbschlusspruefungFehlt.php @@ -60,6 +60,7 @@ class DatumAbschlusspruefungFehlt extends PlausiChecker * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester * @param studiengang_kz int if check is to be executed for certain Studiengang * @param abschlusspruefung_id int if check is to be executed for a certain Abschlussprüfung + * @param person_id int if check is to be executed only for one person * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check * @return success with prestudents or error */ diff --git a/application/libraries/issues/plausichecks/DatumSponsionFehlt.php b/application/libraries/issues/plausichecks/DatumSponsionFehlt.php index d1fe63c80..b60b33a6e 100644 --- a/application/libraries/issues/plausichecks/DatumSponsionFehlt.php +++ b/application/libraries/issues/plausichecks/DatumSponsionFehlt.php @@ -60,6 +60,7 @@ class DatumSponsionFehlt extends PlausiChecker * @param studiensemester_kurzbz string check is to be executed for certain Studiensemester * @param studiengang_kz int if check is to be executed for certain Studiengang * @param abschlusspruefung_id int if check is to be executed only for a certain Abschlussprüfung + * @param person_id int if check is to be executed only for one person * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check * @return success with prestudents or error */ diff --git a/application/libraries/issues/plausichecks/DatumStudiensemesterFalscheReihenfolge.php b/application/libraries/issues/plausichecks/DatumStudiensemesterFalscheReihenfolge.php index 1f7b8cec6..cc749f601 100644 --- a/application/libraries/issues/plausichecks/DatumStudiensemesterFalscheReihenfolge.php +++ b/application/libraries/issues/plausichecks/DatumStudiensemesterFalscheReihenfolge.php @@ -51,6 +51,7 @@ class DatumStudiensemesterFalscheReihenfolge extends PlausiChecker * Status Dates and status studysemester dates should be in correct order. * @param studiengang_kz int if check is to be executed for certain Studiengang * @param prestudent_id int if check is to be executed only for one prestudent + * @param person_id int if check is to be executed only for one person * @param exkludierte_studiengang_kz array if check is to be executed only for certain Studiengaenge * @return success with prestudents or error */ diff --git a/application/libraries/issues/plausichecks/DualesStudiumOhneMarkierung.php b/application/libraries/issues/plausichecks/DualesStudiumOhneMarkierung.php index 344a40e4b..18ca83da1 100644 --- a/application/libraries/issues/plausichecks/DualesStudiumOhneMarkierung.php +++ b/application/libraries/issues/plausichecks/DualesStudiumOhneMarkierung.php @@ -63,6 +63,7 @@ class DualesStudiumOhneMarkierung extends PlausiChecker * @param studiensemester_kurzbz string check is to be executed for certain Studiensemester * @param studiengang_kz int if check is to be executed for certain Studiengang * @param prestudent_id int if check is to be executed only for one prestudent + * @param person_id int if check is to be executed only for one person * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check * @return success with prestudents or error */ diff --git a/application/libraries/issues/plausichecks/FalscheAnzahlAbschlusspruefungen.php b/application/libraries/issues/plausichecks/FalscheAnzahlAbschlusspruefungen.php index 90609b004..f0084a30d 100644 --- a/application/libraries/issues/plausichecks/FalscheAnzahlAbschlusspruefungen.php +++ b/application/libraries/issues/plausichecks/FalscheAnzahlAbschlusspruefungen.php @@ -57,6 +57,7 @@ class FalscheAnzahlAbschlusspruefungen extends PlausiChecker * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester * @param studiengang_kz int if check is to be executed for certain Studiengang * @param prestudent_id int if check is to be executed only for one prestudent + * @param person_id int if check is to be executed only for one person * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check * @return success with prestudents or error */ diff --git a/application/libraries/issues/plausichecks/FalscherIncomingZweckPlausi.php b/application/libraries/issues/plausichecks/FalscherIncomingZweckPlausi.php index 91b888c7f..d8a2c0221 100644 --- a/application/libraries/issues/plausichecks/FalscherIncomingZweckPlausi.php +++ b/application/libraries/issues/plausichecks/FalscherIncomingZweckPlausi.php @@ -20,12 +20,14 @@ class FalscherIncomingZweckPlausi extends PlausiChecker $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; $bisio_id = isset($params['bisio_id']) ? $params['bisio_id'] : null; + $person_id = isset($params['person_id']) ? $params['person_id'] : null; // get all students failing the plausicheck $prestudentRes = $this->_getFalscherIncomingZweck( $studiensemester_kurzbz, $studiengang_kz, $bisio_id, + $person_id, $exkludierte_studiengang_kz ); @@ -52,10 +54,11 @@ class FalscherIncomingZweckPlausi extends PlausiChecker } /** - * Prestudent should have a final status. + * Incomings should have the correct Zweck. * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester * @param studiengang_kz int if check is to be executed for certain Studiengang * @param bisio_id int if check is to be executed only for one prestudent + * @param person_id int if check is to be executed only for one person * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check * @return success with prestudents or error */ @@ -63,6 +66,7 @@ class FalscherIncomingZweckPlausi extends PlausiChecker $studiensemester_kurzbz = null, $studiengang_kz = null, $bisio_id = null, + $person_id = null, $exkludierte_studiengang_kz = null ) { @@ -110,6 +114,12 @@ class FalscherIncomingZweckPlausi extends PlausiChecker $params[] = $bisio_id; } + if (isset($person_id)) + { + $qry .= " AND zwecke.person_id = ?"; + $params[] = $person_id; + } + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) { $qry .= " AND zwecke.studiengang_kz NOT IN ?"; diff --git a/application/libraries/issues/plausichecks/GeburtsnationFehlt.php b/application/libraries/issues/plausichecks/GeburtsnationFehlt.php index 7249ee416..459851110 100644 --- a/application/libraries/issues/plausichecks/GeburtsnationFehlt.php +++ b/application/libraries/issues/plausichecks/GeburtsnationFehlt.php @@ -51,17 +51,17 @@ class GeburtsnationFehlt extends PlausiChecker } /** - * Prestudent should have a final status. + * Geburtsnation is missing. * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester * @param studiengang_kz int if check is to be executed for certain Studiengang - * @param prestudent_id int if check is to be executed only for one prestudent + * @param person_id int if check is to be executed only for one person * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check * @return success with prestudents or error */ private function _getGeburtsnationFehlt( $studiensemester_kurzbz = null, $studiengang_kz = null, - $prestudent_id = null, + $person_id = null, $exkludierte_studiengang_kz = null ) { $params = array(); @@ -91,10 +91,10 @@ class GeburtsnationFehlt extends PlausiChecker $params[] = $studiengang_kz; } - if (isset($prestudent_id)) + if (isset($person_id)) { - $qry .= " AND pre.prestudent_id = ?"; - $params[] = $prestudent_id; + $qry .= " AND pre.person_id = ?"; + $params[] = $person_id; } if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) diff --git a/application/libraries/issues/plausichecks/InaktiverStudentAktiverStatus.php b/application/libraries/issues/plausichecks/InaktiverStudentAktiverStatus.php index 3df54d1b4..ba20973a7 100644 --- a/application/libraries/issues/plausichecks/InaktiverStudentAktiverStatus.php +++ b/application/libraries/issues/plausichecks/InaktiverStudentAktiverStatus.php @@ -60,6 +60,7 @@ class InaktiverStudentAktiverStatus extends PlausiChecker * @param studiensemester_kurzbz string check is to be executed for certain Studiensemester * @param studiengang_kz int if check is to be executed for certain Studiengang * @param prestudent_id int if check is to be executed only for one prestudent + * @param person_id int if check is to be executed only for one person * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check * @return success with prestudents or error */ diff --git a/application/libraries/issues/plausichecks/IncomingOhneIoDatensatz.php b/application/libraries/issues/plausichecks/IncomingOhneIoDatensatz.php index d62e36a79..ee2c3d5fe 100644 --- a/application/libraries/issues/plausichecks/IncomingOhneIoDatensatz.php +++ b/application/libraries/issues/plausichecks/IncomingOhneIoDatensatz.php @@ -49,6 +49,7 @@ class IncomingOhneIoDatensatz extends PlausiChecker * Incoming should have IN/OUT data. * @param studiengang_kz int if check is to be executed for certain Studiengang * @param prestudent_id int if check is to be executed only for one prestudent + * @param person_id int if check is to be executed only for one person * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check * @return success with prestudents or error */ diff --git a/application/libraries/issues/plausichecks/IncomingOrGsFoerderrelevant.php b/application/libraries/issues/plausichecks/IncomingOrGsFoerderrelevant.php index 92b15a3d4..3339730b8 100644 --- a/application/libraries/issues/plausichecks/IncomingOrGsFoerderrelevant.php +++ b/application/libraries/issues/plausichecks/IncomingOrGsFoerderrelevant.php @@ -57,6 +57,7 @@ class IncomingOrGsFoerderrelevant extends PlausiChecker * @param studiensemester_kurzbz string check is to be executed for certain Studiensemester * @param studiengang_kz int if check is to be executed for certain Studiengang * @param prestudent_id int if check is to be executed only for one prestudent + * @param person_id int if check is to be executed only for one person * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check * @return object success or error */ diff --git a/application/libraries/issues/plausichecks/InskriptionVorLetzerBismeldung.php b/application/libraries/issues/plausichecks/InskriptionVorLetzerBismeldung.php index 7a56fd5ad..96acbd250 100644 --- a/application/libraries/issues/plausichecks/InskriptionVorLetzerBismeldung.php +++ b/application/libraries/issues/plausichecks/InskriptionVorLetzerBismeldung.php @@ -61,7 +61,7 @@ class InskriptionVorLetzerBismeldung extends PlausiChecker /** * Students of a semester shouldn't start studies before the date of Bismeldung. - * e.g. If student studies in WS2022 datum of status shouldn't be before 15.4.2020 + * e.g. If student studies in WS2022 datum of status shouldn't be before 15.4.2022 * e.g. If student studies in SS2022 datum of status shouldn't be before 15.11.2022 * @param studiensemester_kurzbz string check is to be executed for certain Studiensemester * @param studiengang_kz int if check is to be executed for certain Studiengang @@ -79,6 +79,8 @@ class InskriptionVorLetzerBismeldung extends PlausiChecker // get Bismeldedatum $datumBis = $this->_getBisdateFromSemester($studiensemester_kurzbz); + if (!$datumBis) return success([]); + $params = array($datumBis, $studiensemester_kurzbz, $datumBis); // get active students @@ -141,17 +143,16 @@ class InskriptionVorLetzerBismeldung extends PlausiChecker */ private function _getBisdateFromSemester($studiensemester_kurzbz) { - $semesterYear = substr($studiensemester_kurzbz, 2, 6); - $semesterType = substr($studiensemester_kurzbz, 0, 2); + $bisdate = null; - if ($semesterType == 'SS') - { - return date_format(date_create(($semesterYear - 1)."-11-15"), 'Y-m-d'); - } + $this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + $prevSemester = $this->_ci->StudiensemesterModel->getPreviousFrom($studiensemester_kurzbz); + if (!hasData($prevSemester)) return null; + $prevSemester = getData($prevSemester)[0]->studiensemester_kurzbz; - if ($semesterType == 'WS') - { - return date_format(date_create($semesterYear."-04-15"), 'Y-m-d'); - } + $this->_ci->load->model('codex/Bismeldestichtag_model', 'BismeldestichtagModel'); + $bisDate = $this->_ci->BismeldestichtagModel->getLastReachedMeldestichtag($prevSemester); + if (!hasData($bisDate)) return null; + return getData($bisDate)[0]->meldestichtag; } } diff --git a/application/libraries/issues/plausichecks/KeinAufenthaltszweckPlausi.php b/application/libraries/issues/plausichecks/KeinAufenthaltszweckPlausi.php index 9f9e7a230..7773d5fdd 100644 --- a/application/libraries/issues/plausichecks/KeinAufenthaltszweckPlausi.php +++ b/application/libraries/issues/plausichecks/KeinAufenthaltszweckPlausi.php @@ -54,7 +54,7 @@ class KeinAufenthaltszweckPlausi extends PlausiChecker } /** - * Prestudent should have a final status. + * Students with mobility should have Aufenthaltszweck. * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester * @param studiengang_kz int if check is to be executed for certain Studiengang * @param bisio_id int if check is to be executed only for one prestudent diff --git a/application/libraries/issues/plausichecks/OutgoingAngerechneteEctsFehlenPlausi.php b/application/libraries/issues/plausichecks/OutgoingAngerechneteEctsFehlenPlausi.php index dff0e14c1..5cc2f6d08 100644 --- a/application/libraries/issues/plausichecks/OutgoingAngerechneteEctsFehlenPlausi.php +++ b/application/libraries/issues/plausichecks/OutgoingAngerechneteEctsFehlenPlausi.php @@ -54,10 +54,11 @@ class OutgoingAngerechneteEctsFehlenPlausi extends PlausiChecker } /** - * Prestudent should have a final status. + * Outgoing should have angerechnete ECTS. * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester * @param studiengang_kz int if check is to be executed for certain Studiengang * @param bisio_id int if check is to be executed only for one prestudent + * @param person_id int if check is to be executed only for one person * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check * @return success with prestudents or error */ diff --git a/application/libraries/issues/plausichecks/OutgoingAufenthaltfoerderungfehltPlausi.php b/application/libraries/issues/plausichecks/OutgoingAufenthaltfoerderungfehltPlausi.php index 3a75d1940..9f66610d3 100644 --- a/application/libraries/issues/plausichecks/OutgoingAufenthaltfoerderungfehltPlausi.php +++ b/application/libraries/issues/plausichecks/OutgoingAufenthaltfoerderungfehltPlausi.php @@ -54,7 +54,7 @@ class OutgoingAufenthaltfoerderungfehltPlausi extends PlausiChecker } /** - * Prestudent should have a final status. + * Student with mobility should have Aufenthaltsfoerderung. * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester * @param studiengang_kz int if check is to be executed for certain Studiengang * @param bisio_id int if check is to be executed only for one prestudent diff --git a/application/libraries/issues/plausichecks/OutgoingErworbeneEctsFehlenPlausi.php b/application/libraries/issues/plausichecks/OutgoingErworbeneEctsFehlenPlausi.php index b5be77ea6..1dbd89f1c 100644 --- a/application/libraries/issues/plausichecks/OutgoingErworbeneEctsFehlenPlausi.php +++ b/application/libraries/issues/plausichecks/OutgoingErworbeneEctsFehlenPlausi.php @@ -54,7 +54,7 @@ class OutgoingErworbeneEctsFehlenPlausi extends PlausiChecker } /** - * Prestudent should have a final status. + * Outgoing should have erworbene ECTS. * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester * @param studiengang_kz int if check is to be executed for certain Studiengang * @param bisio_id int if check is to be executed only for one prestudent diff --git a/application/libraries/issues/plausichecks/UhstatPersonkennungFehltCore.php b/application/libraries/issues/plausichecks/UhstatPersonkennungFehltCore.php index 1975e5c2a..509401128 100644 --- a/application/libraries/issues/plausichecks/UhstatPersonkennungFehltCore.php +++ b/application/libraries/issues/plausichecks/UhstatPersonkennungFehltCore.php @@ -53,7 +53,7 @@ class UhstatPersonkennungFehltCore extends PlausiChecker } /** - * Prestudent should have a final status. + * Student should have Personenkennung for UHSTAT reporting. * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester * @param studiengang_kz int if check is to be executed for certain Studiengang * @param prestudent_id int if check is to be executed only for one prestudent diff --git a/application/libraries/issues/plausichecks/ZgvDatumInZukunft.php b/application/libraries/issues/plausichecks/ZgvDatumInZukunft.php index 125281070..797f86790 100644 --- a/application/libraries/issues/plausichecks/ZgvDatumInZukunft.php +++ b/application/libraries/issues/plausichecks/ZgvDatumInZukunft.php @@ -54,7 +54,7 @@ class ZgvDatumInZukunft extends PlausiChecker } /** - * Prestudent should have a final status. + * ZGV date should be in the past. * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester * @param studiengang_kz int if check is to be executed for certain Studiengang * @param prestudent_id int if check is to be executed only for one prestudent diff --git a/application/libraries/issues/plausichecks/ZgvDatumVorGeburtsdatum.php b/application/libraries/issues/plausichecks/ZgvDatumVorGeburtsdatum.php index d28fc522e..fef53cf4d 100644 --- a/application/libraries/issues/plausichecks/ZgvDatumVorGeburtsdatum.php +++ b/application/libraries/issues/plausichecks/ZgvDatumVorGeburtsdatum.php @@ -54,7 +54,7 @@ class ZgvDatumVorGeburtsdatum extends PlausiChecker } /** - * Prestudent should have a final status. + * Zgv date should be after birthdate. * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester * @param studiengang_kz int if check is to be executed for certain Studiengang * @param prestudent_id int if check is to be executed only for one prestudent diff --git a/application/libraries/issues/plausichecks/ZgvMasterDatumInZukunft.php b/application/libraries/issues/plausichecks/ZgvMasterDatumInZukunft.php index 1f83500de..7f7a8964c 100644 --- a/application/libraries/issues/plausichecks/ZgvMasterDatumInZukunft.php +++ b/application/libraries/issues/plausichecks/ZgvMasterDatumInZukunft.php @@ -54,7 +54,7 @@ class ZgvMasterDatumInZukunft extends PlausiChecker } /** - * Prestudent should have a final status. + * ZGV master date should be in the past. * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester * @param studiengang_kz int if check is to be executed for certain Studiengang * @param prestudent_id int if check is to be executed only for one prestudent diff --git a/application/libraries/issues/plausichecks/ZgvMasterDatumVorGeburtsdatum.php b/application/libraries/issues/plausichecks/ZgvMasterDatumVorGeburtsdatum.php index 7da8c08d8..bd179623f 100644 --- a/application/libraries/issues/plausichecks/ZgvMasterDatumVorGeburtsdatum.php +++ b/application/libraries/issues/plausichecks/ZgvMasterDatumVorGeburtsdatum.php @@ -54,7 +54,7 @@ class ZgvMasterDatumVorGeburtsdatum extends PlausiChecker } /** - * Prestudent should have a final status. + * ZGV master date should be after birthdate. * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester * @param studiengang_kz int if check is to be executed for certain Studiengang * @param prestudent_id int if check is to be executed only for one prestudent diff --git a/application/libraries/issues/plausichecks/ZgvMasterDatumVorZgvdatum.php b/application/libraries/issues/plausichecks/ZgvMasterDatumVorZgvdatum.php index 8f10159ba..2ff2e7862 100644 --- a/application/libraries/issues/plausichecks/ZgvMasterDatumVorZgvdatum.php +++ b/application/libraries/issues/plausichecks/ZgvMasterDatumVorZgvdatum.php @@ -54,7 +54,7 @@ class ZgvMasterDatumVorZgvdatum extends PlausiChecker } /** - * Prestudent should have a final status. + * ZGV master date should be before ZGV date. * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester * @param studiengang_kz int if check is to be executed for certain Studiengang * @param prestudent_id int if check is to be executed only for one prestudent diff --git a/application/libraries/issues/plausichecks/ZuVieleZweckeIncomingPlausi.php b/application/libraries/issues/plausichecks/ZuVieleZweckeIncomingPlausi.php index 395bffe85..8e7ba0855 100644 --- a/application/libraries/issues/plausichecks/ZuVieleZweckeIncomingPlausi.php +++ b/application/libraries/issues/plausichecks/ZuVieleZweckeIncomingPlausi.php @@ -54,7 +54,7 @@ class ZuVieleZweckeIncomingPlausi extends PlausiChecker } /** - * Prestudent should have a final status. + * There should be exactly one Incoming Zweck. * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester * @param studiengang_kz int if check is to be executed for certain Studiengang * @param bisio_id int if check is to be executed only for one prestudent diff --git a/application/libraries/issues/resolvers/CORE_PERSON_0005.php b/application/libraries/issues/resolvers/CORE_PERSON_0005.php deleted file mode 100644 index 1d768e70c..000000000 --- a/application/libraries/issues/resolvers/CORE_PERSON_0005.php +++ /dev/null @@ -1,36 +0,0 @@ -_ci =& get_instance(); // get code igniter instance - - $this->_ci->load->model('person/Person_model', 'PersonModel'); - - // load geburtsnation for the given person - $this->_ci->PersonModel->addSelect('geburtsnation'); - $personRes = $this->_ci->PersonModel->load($params['issue_person_id']); - - if (isError($personRes)) return $personRes; - - if (hasData($personRes)) - { - // get person data - $personData = getData($personRes)[0]; - - // if geburtsnation present, issue is resolved - return success(!isEmptyString($personData->geburtsnation)); - } - else - return success(false); // if no person found, not resolved - } -} \ No newline at end of file diff --git a/public/js/api/factory/issueChecker.js b/public/js/api/factory/issueChecker.js new file mode 100644 index 000000000..da0934bd0 --- /dev/null +++ b/public/js/api/factory/issueChecker.js @@ -0,0 +1,20 @@ +export default { + + checkPerson(person_id) + { + return { + method: 'post', + url: '/api/frontend/v1/issues/StudentIssueChecker/checkPerson', + params: { person_id } + }; + }, + countPersonOpenIssues(person_id) + { + return { + method: 'get', + url: '/api/frontend/v1/issues/StudentIssueChecker/countPersonOpenIssues', + params: { person_id } + }; + } + +} \ No newline at end of file diff --git a/public/js/components/Issues/IssueChecker.js b/public/js/components/Issues/IssueChecker.js index 492d49015..2b6bd891a 100644 --- a/public/js/components/Issues/IssueChecker.js +++ b/public/js/components/Issues/IssueChecker.js @@ -1,4 +1,6 @@ import IssueList from './IssueList.js'; +import DefaultIssueCheckerEndpoint from '../../api/factory/issueChecker.js'; +import DefaultIssueListEndpoint from '../../api/factory/issueList.js'; export default { name: 'IssueChecker', @@ -19,11 +21,13 @@ export default { }, endpoint: { type: Object, - required: true + required: true, + default: DefaultIssueCheckerEndpoint }, issueListEndpoint: { type: Object, - required: true + required: true, + default: DefaultIssueListEndpoint }, issueListStyle: { type: Object @@ -47,6 +51,9 @@ export default { computed: { }, watch: { + person_id() { + this.countPersonOpenIssues(); + } }, mounted() { this.countPersonOpenIssues(); diff --git a/public/js/components/Stv/Studentenverwaltung/Details.js b/public/js/components/Stv/Studentenverwaltung/Details.js index e59492cf5..ee551a2c5 100644 --- a/public/js/components/Stv/Studentenverwaltung/Details.js +++ b/public/js/components/Stv/Studentenverwaltung/Details.js @@ -1,5 +1,6 @@ import FhcTabs from "../../Tabs.js"; import FhcHeader from "../../DetailHeader/DetailHeader.js"; +import IssueChecker from "../../Issues/IssueChecker.js"; import ApiStvApp from '../../../api/factory/stv/app.js'; @@ -10,7 +11,8 @@ export default { name: "DetailsPrestudent", components: { FhcTabs, - FhcHeader + FhcHeader, + IssueChecker }, data() { return { @@ -104,6 +106,13 @@ export default { + Date: Fri, 17 Apr 2026 16:01:33 +0200 Subject: [PATCH 30/32] Plausichecks InaktiverStudentAktiverStatus, ZuVieleZweckeIncomingPlausi: ptimized for issue production without Datenverbund, semester for resolving InaktiverStudentAktiverStatus optional --- .../plausichecks/InaktiverStudentAktiverStatus.php | 13 ++++++++----- .../plausichecks/ZuVieleZweckeIncomingPlausi.php | 7 +++---- .../issues/resolvers/CORE_STUDENTSTATUS_0004.php | 5 +---- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/application/libraries/issues/plausichecks/InaktiverStudentAktiverStatus.php b/application/libraries/issues/plausichecks/InaktiverStudentAktiverStatus.php index ba20973a7..5825a86de 100644 --- a/application/libraries/issues/plausichecks/InaktiverStudentAktiverStatus.php +++ b/application/libraries/issues/plausichecks/InaktiverStudentAktiverStatus.php @@ -65,18 +65,21 @@ class InaktiverStudentAktiverStatus extends PlausiChecker * @return success with prestudents or error */ public function getInaktiverStudentAktiverStatus( - $studiensemester_kurzbz, + $studiensemester_kurzbz = null, $studiengang_kz = null, $prestudent_id = null, $person_id = null, $exkludierte_studiengang_kz = null ) { - $this->_ci->load->model('organisation/studiensemester_model', 'StudiensemesterModel'); - $aktStudiensemesterRes = $this->_ci->StudiensemesterModel->getAkt(); + if (!isset($studiensemester_kurzbz)) + { + $this->_ci->load->model('organisation/studiensemester_model', 'StudiensemesterModel'); + $aktStudiensemesterRes = $this->_ci->StudiensemesterModel->getAkt(); - if (isError($aktStudiensemesterRes)) return $aktStudiensemesterRes; + if (isError($aktStudiensemesterRes)) return $aktStudiensemesterRes; - $studiensemester_kurzbz = hasData($aktStudiensemesterRes) ? getData($aktStudiensemesterRes)[0]->studiensemester_kurzbz : ''; + $studiensemester_kurzbz = hasData($aktStudiensemesterRes) ? getData($aktStudiensemesterRes)[0]->studiensemester_kurzbz : ''; + } $params = array($studiensemester_kurzbz); diff --git a/application/libraries/issues/plausichecks/ZuVieleZweckeIncomingPlausi.php b/application/libraries/issues/plausichecks/ZuVieleZweckeIncomingPlausi.php index 8e7ba0855..df5d50936 100644 --- a/application/libraries/issues/plausichecks/ZuVieleZweckeIncomingPlausi.php +++ b/application/libraries/issues/plausichecks/ZuVieleZweckeIncomingPlausi.php @@ -43,7 +43,7 @@ class ZuVieleZweckeIncomingPlausi extends PlausiChecker $results[] = array( 'person_id' => $prestudent->person_id, 'oe_kurzbz' => $prestudent->prestudent_stg_oe_kurzbz, - //'fehlertext_params' => array('bisio_id' => $prestudent->bisio_id), + 'fehlertext_params' => array('anzahl' => $prestudent->anzahl), 'resolution_params' => array('bisio_id' => $prestudent->bisio_id) ); } @@ -81,8 +81,8 @@ class ZuVieleZweckeIncomingPlausi extends PlausiChecker $qry = " SELECT * FROM ( SELECT - DISTINCT ON (bisio_id) prestudent_id, person_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, zw.zweck_code, stg.studiengang_kz, - bisio.bisio_id, COUNT(zw.zweck_code) OVER (PARTITION BY bisio_id) AS anzahl + DISTINCT ON (bisio_id) prestudent_id, person_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, stg.studiengang_kz, + bisio.bisio_id, (SELECT count(*) FROM bis.tbl_bisio_zweck WHERE bisio_id = bisio.bisio_id) AS anzahl FROM public.tbl_prestudent pre JOIN public.tbl_student stud USING (prestudent_id) @@ -91,7 +91,6 @@ class ZuVieleZweckeIncomingPlausi extends PlausiChecker JOIN public.tbl_studiensemester sem ON status.studiensemester_kurzbz = sem.studiensemester_kurzbz JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz JOIN bis.tbl_bisio bisio ON stud.student_uid = bisio.student_uid - JOIN bis.tbl_bisio_zweck zw USING (bisio_id) WHERE stg.melderelevant AND pre.bismelden diff --git a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0004.php b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0004.php index cbce2b01e..0dabb00c1 100644 --- a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0004.php +++ b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0004.php @@ -12,16 +12,13 @@ class CORE_STUDENTSTATUS_0004 implements IIssueResolvedChecker if (!isset($params['prestudent_id']) || !is_numeric($params['prestudent_id'])) return error('Prestudent Id missing, issue_id: '.$params['issue_id']); - if (!isset($params['studiensemester_kurzbz']) || isEmptyString($params['studiensemester_kurzbz'])) - return error('Studiensemester missing, issue_id: '.$params['issue_id']); - $this->_ci =& get_instance(); // get code igniter instance $this->_ci->load->library('issues/plausichecks/InaktiverStudentAktiverStatus'); // check if issue persists $checkRes = $this->_ci->inaktiverstudentaktiverstatus->getInaktiverStudentAktiverStatus( - $params['studiensemester_kurzbz'], + null, null, $params['prestudent_id'] ); From 23075656965adb38920afca0dcf5d4f11386743a Mon Sep 17 00:00:00 2001 From: Alexei Karpenko Date: Mon, 20 Apr 2026 15:37:08 +0200 Subject: [PATCH 31/32] Plausicheckresolverlib: changed comment --- application/libraries/issues/PlausicheckResolverLib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/libraries/issues/PlausicheckResolverLib.php b/application/libraries/issues/PlausicheckResolverLib.php index e4cdcc23f..af7d58c8f 100644 --- a/application/libraries/issues/PlausicheckResolverLib.php +++ b/application/libraries/issues/PlausicheckResolverLib.php @@ -19,7 +19,7 @@ class PlausicheckResolverLib private $_ci; // ci instance private $_extensionName; // name of extension - private $_fehlercodes = []; // name of extension + private $_fehlercodes = []; // fehlercodes to resolve private $_apps = []; // apps for which issues should be resolved private $_codeLibMappings = []; // mappings for issues which explicitly defined resolver private $_defaultIssueParams = ['issue_id' => 'issue_id', 'issue_person_id' => 'person_id', 'issue_oe_kurzbz' => 'oe_kurzbz']; From 0c002b39697a1e2ebdfcf06c60738e741949488d Mon Sep 17 00:00:00 2001 From: Alexei Karpenko Date: Wed, 29 Apr 2026 16:13:46 +0200 Subject: [PATCH 32/32] issue checker: added space between heading and refresh symbol, removed px class for more flexibility --- public/js/components/Issues/IssueChecker.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/js/components/Issues/IssueChecker.js b/public/js/components/Issues/IssueChecker.js index 2b6bd891a..354afd03d 100644 --- a/public/js/components/Issues/IssueChecker.js +++ b/public/js/components/Issues/IssueChecker.js @@ -89,8 +89,8 @@ export default { } }, template: ` -
-

Issues

+
+

Issues 

{{ openissuescount }}