diff --git a/application/controllers/jobs/IssueResolver.php b/application/controllers/jobs/IssueResolver.php new file mode 100755 index 000000000..17c4cb9ce --- /dev/null +++ b/application/controllers/jobs/IssueResolver.php @@ -0,0 +1,28 @@ + class (library) name for resolving + $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' + ); + } +} diff --git a/application/controllers/system/infocenter/InfoCenter.php b/application/controllers/system/infocenter/InfoCenter.php index a69a43220..25ee96b60 100644 --- a/application/controllers/system/infocenter/InfoCenter.php +++ b/application/controllers/system/infocenter/InfoCenter.php @@ -560,8 +560,10 @@ class InfoCenter extends Auth_Controller /** * Sendet bei einer neuen ZGV Prüfung die Mail raus an den Studiengang */ - private function sendZgvMail($mail, $typ){ + private function sendZgvMail($mail, $typ, $person){ $data = array( + 'vorname' => $person->vorname, + 'nachname' => $person->nachname, 'link' => site_url('system/infocenter/ZGVUeberpruefung') ); @@ -657,6 +659,16 @@ class InfoCenter extends Auth_Controller if (isEmptyString($prestudent_id) || isEmptyString($person_id)) $this->terminateWithJsonError('Prestudentid OR/AND Personid missing'); + $person = $this->PersonModel->load($person_id); + + if (isError($person)) + $this->terminateWithJsonError(getError($person)); + + if (!hasData($person)) + $this->terminateWithJsonError('Person existiert nicht.'); + + $person = getData($person)[0]; + $zgv = $this->ZGVPruefungStatusModel->getZgvStatusByPrestudent($prestudent_id); $data = $this->_getPersonAndStudiengangFromPrestudent($prestudent_id); @@ -688,7 +700,7 @@ class InfoCenter extends Auth_Controller $this->_log($person_id, 'updatezgv', array($zgv[0]->zgvpruefung_id, 'pruefung_stg')); if (isSuccess($insert)) - $this->sendZgvMail($mail, $typ); + $this->sendZgvMail($mail, $typ, $person); elseif (isError($insert)) $this->terminateWithJsonError('Fehler beim Speichern'); }else @@ -714,7 +726,7 @@ class InfoCenter extends Auth_Controller $this->_log($person_id, 'newzgv', array($zgvpruefung_id)); if (isSuccess($result)) - $this->sendZgvMail($mail, $typ); + $this->sendZgvMail($mail, $typ, $person); elseif (isError($result)) $this->terminateWithJsonError('Fehler beim Speichern'); } @@ -1708,9 +1720,15 @@ class InfoCenter extends Auth_Controller if (isset($locked->retval[0]->uid)) { - $lockedby = $locked->retval[0]->uid; - if ($lockedby !== $this->_uid) + if (!$lockedby = getData($this->PersonModel->getFullName($locked->retval[0]->uid))) + { + show_error('Failed retrieving person'); + } + + if ($locked->retval[0]->uid !== $this->_uid) + { $lockedbyother = true; + } } $stammdaten = $this->PersonModel->getPersonStammdaten($person_id, true); diff --git a/application/controllers/system/issues/Issues.php b/application/controllers/system/issues/Issues.php index e9764fb63..e0103cfec 100644 --- a/application/controllers/system/issues/Issues.php +++ b/application/controllers/system/issues/Issues.php @@ -58,21 +58,42 @@ class Issues extends Auth_Controller { $issue_ids = $this->input->post('issue_ids'); $status_kurzbz = $this->input->post('status_kurzbz'); - $verarbeitetvon = $this->_uid; + $user = $this->_uid; $errors = array(); foreach ($issue_ids as $issue_id) { - $issueRes = $this->issueslib->changeIssueStatus($issue_id, $status_kurzbz, $verarbeitetvon); + switch ($status_kurzbz) + { + case IssuesLib::STATUS_NEU: + $changeIssueMethod = 'setNeu'; + break; + case IssuesLib::STATUS_IN_BEARBEITUNG: + $changeIssueMethod = 'setInBearbeitung'; + break; + case IssuesLib::STATUS_BEHOBEN: + $changeIssueMethod = 'setBehoben'; + break; + default: + $changeIssueMethod = null; + break; + } - if (isError($issueRes)) - $errors[] = getError($issueRes); + if (isEmptyString($changeIssueMethod)) + $errors[] = error("Invalid issue status given"); + else + { + $issueRes = $this->issueslib->{$changeIssueMethod}($issue_id, $user); + + if (isError($issueRes)) + $errors[] = getError($issueRes); + } } if (!isEmptyArray($errors)) $this->outputJsonError(implode(", ", $errors)); else - $this->outputJsonSuccess("Status erfolgreich aktualisiert"); + $this->outputJsonSuccess("Status successfully refreshed"); } /** @@ -133,7 +154,7 @@ class Issues extends Auth_Controller // add oes for which there is the "manage issues" Berechtigung if (!$oe_kurzbz_berechtigt = $this->permissionlib->getOE_isEntitledFor(self::BERECHTIGUNG_KURZBZ)) - show_error('Keine Berechtigung oder Fehler bei Berechtigungsprüfung'); + show_error('No permission or error when checking permissions'); $all_oe_kurzbz_berechtigt = array_unique(array_merge($oe_kurzbz_for_funktion, $oe_kurzbz_berechtigt)); diff --git a/application/core/IIssueResolvedChecker.php b/application/core/IIssueResolvedChecker.php new file mode 100644 index 000000000..82da67ff7 --- /dev/null +++ b/application/core/IIssueResolvedChecker.php @@ -0,0 +1,15 @@ +load->model('system/Issue_model', 'IssueModel'); + + $this->load->library('IssuesLib'); + } + + /** + * Initializes issue resolution. + */ + public function run() + { + $this->logInfo("Issue resolve job started"); + + // load open issues with given errorcodes + $openIssuesRes = $this->IssueModel->getOpenIssues(array_keys($this->_codeLibMappings)); + + // log error if occured + if (isError($openIssuesRes)) + { + $this->logError(getError($openIssuesRes)); + } + else + { + // log info if no data found + if (!hasData($openIssuesRes)) + { + $this->logInfo("No open issues found"); + } + else + { + + $openIssues = getData($openIssuesRes); + + foreach ($openIssues as $issue) + { + if (isset($this->_codeLibMappings[$issue->fehlercode])) + { + $libName = $this->_codeLibMappings[$issue->fehlercode]; + + // 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), + isset($issue->behebung_parameter) ? json_decode($issue->behebung_parameter, true) : array() + ); + + // if called from extension (extension name set), path includes extension names, otherwise it is the core library folder + $libRootPath = isset($this->_extensionName) ? 'extensions/' . $this->_extensionName . '/' : ''; + $issuesLibPath = $libRootPath . self::ISSUES_FOLDER . '/'; + $issuesLibFilePath = DOC_ROOT . 'application/' . $libRootPath . 'libraries/' . self::ISSUES_FOLDER . '/' . $libName . '.php'; + + // check if library file exists + if (!file_exists($issuesLibFilePath)) + { + // log error and continue with next issue if not + $this->logError("Issue library file " . $issuesLibFilePath . " does not exist"); + continue; + } + + // load library connected to fehlercode + $this->load->library( + $issuesLibPath . $libName + ); + + $lowercaseLibName = mb_strtolower($libName); + + // check if method is defined in libary class + if (!is_callable(array($this->{$lowercaseLibName}, self::CHECK_ISSUE_RESOLVED_METHOD_NAME))) + { + // log error and continue with next issue if not + $this->logError("Method " . self::CHECK_ISSUE_RESOLVED_METHOD_NAME . " is not defined in library $lowercaseLibName"); + continue; + } + + // call the function for checking for issue resolution + $issueResolvedRes = $this->{$lowercaseLibName}->{self::CHECK_ISSUE_RESOLVED_METHOD_NAME}($params); + + if (isError($issueResolvedRes)) + { + $this->logError(getError($issueResolvedRes)); + } + else + { + $issueResolvedData = getData($issueResolvedRes); + + if ($issueResolvedData === true) + { + // set issue to resolved if needed + $behobenRes = $this->issueslib->setBehoben($issue->issue_id, null); + + if (isError($behobenRes)) + $this->logError(getError($behobenRes)); + else + $this->logInfo("Issue " . $issue->issue_id . " successfully resolved"); + } + } + } + } + } + } + + $this->logInfo("Issue resolve job ended"); + } +} diff --git a/application/libraries/IssuesLib.php b/application/libraries/IssuesLib.php index 1b06db333..d6488bc36 100644 --- a/application/libraries/IssuesLib.php +++ b/application/libraries/IssuesLib.php @@ -62,17 +62,17 @@ class IssuesLib * @param array $fehlertext_params params for sprint replace of error text in system.tbl_fehler * @return object success or error */ - public function addFhcIssue($fehler_kurzbz, $person_id = null, $oe_kurzbz = null, $fehlertext_params = null) + public function addFhcIssue($fehler_kurzbz, $person_id = null, $oe_kurzbz = null, $fehlertext_params = null, $resolution_params = null) { $fehlerRes = $this->_ci->FehlerModel->loadWhere(array('fehler_kurzbz' => $fehler_kurzbz)); if (hasData($fehlerRes)) { $fehlercode = getData($fehlerRes)[0]->fehlercode; - return $this->_addIssue($fehlercode, $person_id, $oe_kurzbz, $fehlertext_params); + return $this->_addIssue($fehlercode, $person_id, $oe_kurzbz, $fehlertext_params, $resolution_params); } else - return error("Fehler $fehler_kurzbz nicht gefunden"); + return error("Error $fehler_kurzbz not found"); } /** @@ -82,13 +82,13 @@ class IssuesLib * @param int $person_id * @param int $oe_kurzbz * @param array $fehlertext_params params for replacement of parts of error text - * @param bool $force_predefined if true, only predefined external issues are added + * @param bool $force_predefined if true, only predefined (with entry in fehler table) external issues are added * @return object success or error */ - public function addExternalIssue($fehlercode_extern, $inhalt_extern, $person_id = null, $oe_kurzbz = null, $fehlertext_params = null, $force_predefined = false) + public function addExternalIssue($fehlercode_extern, $inhalt_extern, $person_id = null, $oe_kurzbz = null, $fehlertext_params = null) { if (isEmptyString($fehlercode_extern)) - return error("fehlercode_extern fehlt"); + return error("fehlercode_extern missing"); // get external fehlercode (unique for each app) $this->_ci->FehlerModel->addSelect('fehlercode'); @@ -102,19 +102,13 @@ class IssuesLib if (isError($fehlerRes)) return $fehlerRes; - $fehlerData = getData($fehlerRes)[0]; - // check if there is a predefined custom error for the external issue if (hasData($fehlerRes)) { + $fehlerData = getData($fehlerRes)[0]; // if found, use the code $fehlercode = $fehlerData->fehlercode; } - elseif ($force_predefined === true) - { - // only added if predefined - return success("No definition found - not added"); - } else { // if predefined error is not found, insert with fallback code @@ -122,20 +116,70 @@ class IssuesLib } // add external issue - return $this->_addIssue($fehlercode, $person_id, $oe_kurzbz, $fehlertext_params, $fehlercode_extern, $inhalt_extern); + return $this->_addIssue($fehlercode, $person_id, $oe_kurzbz, $fehlertext_params, null, $fehlercode_extern, $inhalt_extern); + } + + /** + * Set issue to resolved. + * @param int $issue_id + * @param string $user uid of issue resolver + * @return object success or error + */ + public function setBehoben($issue_id, $user) + { + $data = array( + 'status_kurzbz' => self::STATUS_BEHOBEN, + 'verarbeitetvon' => $user, + 'verarbeitetamum' => date('Y-m-d H:i:s') + ); + + return $this->_changeIssueStatus($issue_id, $data, $user); + } + + /** + * Set issue to in progress. + * @param int $issue_id + * @param string $user uid of issue resovler + * @return object success or error + */ + public function setInBearbeitung($issue_id, $user) + { + $data = array( + 'status_kurzbz' => self::STATUS_IN_BEARBEITUNG, + 'verarbeitetvon' => $user + ); + + return $this->_changeIssueStatus($issue_id, $data, $user); + } + + /** + * Set issue to new. + * @param int $issue_id + * @param string $user uid of issue resolver + * @return object success or error + */ + public function setNeu($issue_id, $user) + { + $data = array( + 'status_kurzbz' => self::STATUS_NEU, + 'verarbeitetvon' => null, + 'verarbeitetamum' => null + ); + + return $this->_changeIssueStatus($issue_id, $data, $user); } /** * Changes status of an issue. * @param int $issue_id - * @param string $status_kurzbz the new status - * @param string $verarbeitetvon uid of person changing the status (needed for in Bearbeitung and behoben) + * @param array $sdata the data to save, including status + * @param string $user uid of person changing the status (needed for in Bearbeitung and behoben) * @return success or error */ - public function changeIssueStatus($issue_id, $status_kurzbz, $verarbeitetvon = null) + private function _changeIssueStatus($issue_id, $data, $user) { if (!isset($issue_id) || !is_numeric($issue_id)) - return error("Issue Id muss korrekt gesetzt sein."); + return error("Issue Id must be set correctly."); // check if given status is same as existing $this->_ci->IssueModel->addSelect('status_kurzbz'); @@ -143,39 +187,14 @@ class IssuesLib if (hasData($currStatus)) { - if (getData($currStatus)[0]->status_kurzbz == $status_kurzbz) - return success("Gleicher Status bereits gesetzt"); + if (getData($currStatus)[0]->status_kurzbz == $data['status_kurzbz']) + return success("Same status already set"); } else - return error("Fehler beim Holen des Status"); + return error("Error when getting status"); - $data = array( - 'status_kurzbz' => $status_kurzbz, - 'updatevon' => $verarbeitetvon, - 'updateamum' => date('Y-m-d H:i:s') - ); - - if ($status_kurzbz == self::STATUS_NEU) - { - - $data['verarbeitetvon'] = null; - } - - if ($status_kurzbz == self::STATUS_NEU || $status_kurzbz == self::STATUS_IN_BEARBEITUNG) - { - $data['verarbeitetamum'] = null; - } - - if ($status_kurzbz == self::STATUS_IN_BEARBEITUNG || $status_kurzbz == self::STATUS_BEHOBEN) - { - if (isset($verarbeitetvon)) - $data['verarbeitetvon'] = $verarbeitetvon; - else - return error("Verarbeitetvon nicht gesetzt"); - } - - if ($status_kurzbz == self::STATUS_BEHOBEN) - $data['verarbeitetamum'] = date('Y-m-d H:i:s'); + $data['updatevon'] = $user; + $data['updateamum'] = date('Y-m-d H:i:s'); return $this->_ci->IssueModel->update( array( @@ -191,14 +210,15 @@ class IssuesLib * @param int $person_id * @param string $oe_kurzbz * @param array $fehlertext_params + * @param string $resolution_params * @param string $fehlercode_extern * @param string $inhalt_extern * @return object success or error */ - private function _addIssue($fehlercode, $person_id = null, $oe_kurzbz = null, $fehlertext_params = null, $fehlercode_extern = null, $inhalt_extern = null) + private function _addIssue($fehlercode, $person_id = null, $oe_kurzbz = null, $fehlertext_params = null, $resolution_params = null, $fehlercode_extern = null, $inhalt_extern = null) { if (isEmptyString($person_id) && isEmptyString($oe_kurzbz)) - return error("Person_id oder oe_kurzbz muss gesetzt sein."); + return error("Person_id or oe_kurzbz must be set."); // get fehlertextVorlage and replace it with params $fehlerRes = $this->_ci->FehlerModel->load($fehlercode); @@ -218,6 +238,20 @@ class IssuesLib if ($openIssueCount == 0) { + if (isset($resolution_params)) + { + if (is_array($resolution_params)) + { + foreach ($resolution_params as $resolution_key => $resolution_param) + { + if (!is_string($resolution_key)) + return error("Invalid parameter for resolution, must be an associative array"); + } + } + else + return error("Invalid parameters for resolution"); + } + return $this->_ci->IssueModel->insert( array( 'fehlercode' => $fehlercode, @@ -228,6 +262,7 @@ class IssuesLib 'oe_kurzbz' => $oe_kurzbz, 'datum' => date('Y-m-d H:i:s'), 'status_kurzbz' => self::STATUS_NEU, + 'behebung_parameter' => isset($resolution_params) ? json_encode($resolution_params) : null, 'insertvon' => $this->_insertvon ) ); @@ -236,9 +271,9 @@ class IssuesLib return success($openIssueCount); } else - return error("Anzahl offener Issues konnte nicht ermittelt werden."); + return error("Number of open issues could not be determined"); } else - return error("Fehler $fehlercode nicht gefunden"); + return error("Error $fehlercode could not be found"); } } diff --git a/application/libraries/issues/CORE_INOUT_0001.php b/application/libraries/issues/CORE_INOUT_0001.php new file mode 100644 index 000000000..d62c73f9e --- /dev/null +++ b/application/libraries/issues/CORE_INOUT_0001.php @@ -0,0 +1,31 @@ +_ci =& get_instance(); // get code igniter instance + + $this->_ci->load->model('codex/Bisiozweck_model', 'BisiozweckModel'); + + // get all bisio Zwecke + $this->_ci->BisiozweckModel->addSelect('1'); + $bisiozweckRes = $this->_ci->BisiozweckModel->loadWhere(array('bisio_id' => $params['bisio_id'])); + + if (isError($bisiozweckRes)) + return $bisiozweckRes; + + if (hasData($bisiozweckRes)) + return success(true); // resolved if bisio Zweck exists + else + return success(false); // not resolved if no bisio zweck + } +} diff --git a/application/libraries/issues/CORE_INOUT_0002.php b/application/libraries/issues/CORE_INOUT_0002.php new file mode 100644 index 000000000..9868ccd25 --- /dev/null +++ b/application/libraries/issues/CORE_INOUT_0002.php @@ -0,0 +1,34 @@ +_ci =& get_instance(); // get code igniter instance + + $this->_ci->load->model('codex/Bisiozweck_model', 'BisiozweckModel'); + + // get all bisio Zwecke + $this->_ci->BisiozweckModel->addSelect('1'); + $bisiozweckRes = $this->_ci->BisiozweckModel->loadWhere(array('bisio_id' => $params['bisio_id'])); + + if (isError($bisiozweckRes)) + return $bisiozweckRes; + + if (hasData($bisiozweckRes)) + { + if (count(getData($bisiozweckRes)) <= 1) // resolved if one bisio Zweck + return success(true); + else + return success(false); // otherwise not resolved + } + else + return success(true); // resolved if no bisio zweck + } +} diff --git a/application/libraries/issues/CORE_INOUT_0003.php b/application/libraries/issues/CORE_INOUT_0003.php new file mode 100644 index 000000000..0fee6c061 --- /dev/null +++ b/application/libraries/issues/CORE_INOUT_0003.php @@ -0,0 +1,39 @@ +_ci =& get_instance(); // get code igniter instance + + $this->_ci->load->model('codex/Bisiozweck_model', 'BisiozweckModel'); + + // get all Zwecke + $this->_ci->BisiozweckModel->addSelect('zweck_code'); + $bisiozweckRes = $this->_ci->BisiozweckModel->loadWhere(array('bisio_id' => $params['bisio_id'])); + + if (isError($bisiozweckRes)) + return $bisiozweckRes; + + if (hasData($bisiozweckRes)) + { + $bisiozweckData = getData($bisiozweckRes); + + // resolved if Zweck is 1, 2 or 3 + if (count($bisiozweckData) == 1 && !in_array($bisiozweckData[0]->zweck_code, array(1, 2, 3))) + return success(false); + else + return success(true); + } + else + return success(true); + } +} diff --git a/application/libraries/issues/CORE_INOUT_0004.php b/application/libraries/issues/CORE_INOUT_0004.php new file mode 100644 index 000000000..703b108cc --- /dev/null +++ b/application/libraries/issues/CORE_INOUT_0004.php @@ -0,0 +1,57 @@ +_ci =& get_instance(); // get code igniter instance + + $this->_ci->load->model('codex/Aufenthaltfoerderung_model', 'AufenthaltfoerderungModel'); + + // get all Zwecke + $this->_ci->AufenthaltfoerderungModel->addSelect('tbl_aufenthaltfoerderung.aufenthaltfoerderung_code'); + $this->_ci->AufenthaltfoerderungModel->addJoin('bis.tbl_bisio_aufenthaltfoerderung', 'aufenthaltfoerderung_code'); + $this->_ci->AufenthaltfoerderungModel->addOrder('tbl_aufenthaltfoerderung.aufenthaltfoerderung_code'); + $bisioFoerderungRes = $this->_ci->AufenthaltfoerderungModel->loadWhere(array('bisio_id' => $params['bisio_id'])); + + if (isError($bisioFoerderungRes)) + return $bisioFoerderungRes; + + if (hasData($bisioFoerderungRes)) + { + // resolved if Aufenthaltsfoerderung exists + return success(true); + } + else + { + $this->_ci->load->model('codex/Bisio_model', 'BisioModel'); + + // get Bisio Aufenthaltsdauer + $aufenthaltsdauerRes = $this->_ci->BisioModel->getAufenthaltsdauer($params['bisio_id']); + + if (isError($aufenthaltsdauerRes)) + return $aufenthaltsdauerRes; + + if (hasData($aufenthaltsdauerRes)) + { + $aufenthaltsdauer = getData($aufenthaltsdauerRes); + + // check if stay >= 29 days. If yes and no Aufenthaltsfoerderung - not resolved + if ($aufenthaltsdauer >= 29) + return success(false); + else + return success(true); + } + else // no Aufenthaltsdauer - not resolved + return success(false); + } + } +} diff --git a/application/libraries/issues/CORE_INOUT_0005.php b/application/libraries/issues/CORE_INOUT_0005.php new file mode 100644 index 000000000..e655d2e36 --- /dev/null +++ b/application/libraries/issues/CORE_INOUT_0005.php @@ -0,0 +1,53 @@ +_ci =& get_instance(); // get code igniter instance + + $this->_ci->load->model('codex/Bisio_model', 'BisioModel'); + + // get all Zwecke + $this->_ci->BisioModel->addSelect('ects_angerechnet'); + $bisioRes = $this->_ci->BisioModel->loadWhere(array('bisio_id' => $params['bisio_id'])); + + if (isError($bisioRes)) + return $bisioRes; + + if (hasData($bisioRes) && !isEmptyString(getData($bisioRes)[0]->ects_angerechnet)) + { + // resolved if ects exists + return success(true); + } + else + { + // get Bisio Aufenthaltsdauer + $aufenthaltsdauerRes = $this->_ci->BisioModel->getAufenthaltsdauer($params['bisio_id']); + + if (isError($aufenthaltsdauerRes)) + return $aufenthaltsdauerRes; + + if (hasData($aufenthaltsdauerRes)) + { + $aufenthaltsdauer = getData($aufenthaltsdauerRes); + + // check if stay >= 29 days. If yes and no ects - not resolved + if ($aufenthaltsdauer >= 29) + return success(false); + else + return success(true); + } + else // no Aufenthaltsdauer - not resolved + return success(false); + } + } +} diff --git a/application/libraries/issues/CORE_INOUT_0006.php b/application/libraries/issues/CORE_INOUT_0006.php new file mode 100644 index 000000000..a447a9625 --- /dev/null +++ b/application/libraries/issues/CORE_INOUT_0006.php @@ -0,0 +1,54 @@ +_ci =& get_instance(); // get code igniter instance + + $this->_ci->load->model('codex/Bisio_model', 'BisioModel'); + //$this->_ci->load->model('codex/Aufenthaltfoerderung_model', 'AufenthaltfoerderungModel'); + + // get all Zwecke + $this->_ci->BisioModel->addSelect('ects_erworben'); + $bisioRes = $this->_ci->BisioModel->loadWhere(array('bisio_id' => $params['bisio_id'])); + + if (isError($bisioRes)) + return $bisioRes; + + if (hasData($bisioRes) && !isEmptyString(getData($bisioRes)[0]->ects_erworben)) + { + // resolved if ects exists + return success(true); + } + else + { + // get Bisio Aufenthaltsdauer + $aufenthaltsdauerRes = $this->_ci->BisioModel->getAufenthaltsdauer($params['bisio_id']); + + if (isError($aufenthaltsdauerRes)) + return $aufenthaltsdauerRes; + + if (hasData($aufenthaltsdauerRes)) + { + $aufenthaltsdauer = getData($aufenthaltsdauerRes); + + // check if stay >= 29 days. If yes and no ects - not resolved + if ($aufenthaltsdauer >= 29) + return success(false); + else + return success(true); + } + else // no Aufenthaltsdauer - not resolved + return success(false); + } + } +} diff --git a/application/libraries/issues/CORE_ZGV_0001.php b/application/libraries/issues/CORE_ZGV_0001.php new file mode 100644 index 000000000..47d27d30e --- /dev/null +++ b/application/libraries/issues/CORE_ZGV_0001.php @@ -0,0 +1,42 @@ +_ci =& get_instance(); // get code igniter instance + + // get zgvdatum of prestudent + $this->_ci->load->model('crm/Prestudent_model', 'PrestudentModel'); + + $this->_ci->PrestudentModel->addSelect('zgvdatum'); + $prestudentRes = $this->_ci->PrestudentModel->load($params['prestudent_id']); + + if (isError($prestudentRes)) + return $prestudentRes; + + if (hasData($prestudentRes)) + { + $zgvdatum = getData($prestudentRes)[0]->zgvdatum; + + if (isEmptyString($zgvdatum)) + return success(false); + + // check if zgvdatum comes after today + if ($zgvdatum > date('Y-m-d')) + return success(false); + else + return success(true); + } + else + return success(false); + } +} diff --git a/application/libraries/issues/CORE_ZGV_0002.php b/application/libraries/issues/CORE_ZGV_0002.php new file mode 100644 index 000000000..d09380ddb --- /dev/null +++ b/application/libraries/issues/CORE_ZGV_0002.php @@ -0,0 +1,50 @@ +_ci =& get_instance(); // get code igniter instance + + // get zgvdatum of prestudent + $this->_ci->load->model('crm/Prestudent_model', 'PrestudentModel'); + + $this->_ci->PrestudentModel->addSelect('zgvdatum, gebdatum'); + $this->_ci->PrestudentModel->addJoin('public.tbl_person', 'person_id'); + $prestudentRes = $this->_ci->PrestudentModel->load($params['prestudent_id']); + + if (isError($prestudentRes)) + return $prestudentRes; + + if (hasData($prestudentRes)) + { + $prestudentData = getData($prestudentRes)[0]; + + $zgvdatum = $prestudentData->zgvdatum; + + if (isEmptyString($zgvdatum)) + return success(false); + + $gebdatum = $prestudentData->gebdatum; + + if (isEmptyString($gebdatum)) + return success(false); + + // check if zgvdatum comes before geburtsdatum + if ($zgvdatum < $gebdatum) + return success(false); + else + return success(true); + } + else + return success(false); + } +} diff --git a/application/libraries/issues/CORE_ZGV_0003.php b/application/libraries/issues/CORE_ZGV_0003.php new file mode 100644 index 000000000..db0ab29db --- /dev/null +++ b/application/libraries/issues/CORE_ZGV_0003.php @@ -0,0 +1,42 @@ +_ci =& get_instance(); // get code igniter instance + + // get zgvdatum of prestudent + $this->_ci->load->model('crm/Prestudent_model', 'PrestudentModel'); + + $this->_ci->PrestudentModel->addSelect('zgvmadatum'); + $prestudentRes = $this->_ci->PrestudentModel->load($params['prestudent_id']); + + if (isError($prestudentRes)) + return $prestudentRes; + + if (hasData($prestudentRes)) + { + $zgvdatum = getData($prestudentRes)[0]->zgvmadatum; + + if (isEmptyString($zgvdatum)) + return success(false); + + // check if zgvdatum comes after today + if ($zgvdatum > date('Y-m-d')) + return success(false); + else + return success(true); + } + else + return success(false); + } +} diff --git a/application/libraries/issues/CORE_ZGV_0004.php b/application/libraries/issues/CORE_ZGV_0004.php new file mode 100644 index 000000000..27488af00 --- /dev/null +++ b/application/libraries/issues/CORE_ZGV_0004.php @@ -0,0 +1,50 @@ +_ci =& get_instance(); // get code igniter instance + + // get zgvdatum of prestudent + $this->_ci->load->model('crm/Prestudent_model', 'PrestudentModel'); + + $this->_ci->PrestudentModel->addSelect('zgvdatum, zgvmadatum'); + $prestudentRes = $this->_ci->PrestudentModel->load($params['prestudent_id']); + + if (isError($prestudentRes)) + return $prestudentRes; + + if (hasData($prestudentRes)) + { + $prestudentData = getData($prestudentRes)[0]; + + // get and compare zgvdatum and zgvmadatum + $zgvdatum = $prestudentData->zgvdatum; + + if (isEmptyString($zgvdatum)) + return success(false); + + $zgvmadatum = $prestudentData->zgvmadatum; + + if (isEmptyString($zgvmadatum)) + return success(false); + + // check if zgvmadatum comes after zgvdatum + if ($zgvmadatum < $zgvdatum) + return success(false); + else + return success(true); + } + else + return success(false); + } +} diff --git a/application/libraries/issues/CORE_ZGV_0005.php b/application/libraries/issues/CORE_ZGV_0005.php new file mode 100644 index 000000000..405f3d88d --- /dev/null +++ b/application/libraries/issues/CORE_ZGV_0005.php @@ -0,0 +1,50 @@ +_ci =& get_instance(); // get code igniter instance + + // get zgvdatum and geburtsdatum of prestudent + $this->_ci->load->model('crm/Prestudent_model', 'PrestudentModel'); + + $this->_ci->PrestudentModel->addSelect('zgvmadatum, gebdatum'); + $this->_ci->PrestudentModel->addJoin('public.tbl_person', 'person_id'); + $prestudentRes = $this->_ci->PrestudentModel->load($params['prestudent_id']); + + if (isError($prestudentRes)) + return $prestudentRes; + + if (hasData($prestudentRes)) + { + $prestudentData = getData($prestudentRes)[0]; + + $zgvdatum = $prestudentData->zgvmadatum; + + if (isEmptyString($zgvdatum)) + return success(false); + + $gebdatum = $prestudentData->gebdatum; + + if (isEmptyString($gebdatum)) + return success(false); + + // check if zgvdatum comes before geburtsdatum + if ($zgvdatum < $gebdatum) + return success(false); + else + return success(true); + } + else + return success(false); + } +} diff --git a/application/models/codex/Bisio_model.php b/application/models/codex/Bisio_model.php index 5f35aec9a..1cff1dc54 100644 --- a/application/models/codex/Bisio_model.php +++ b/application/models/codex/Bisio_model.php @@ -11,4 +11,37 @@ class Bisio_model extends DB_Model $this->dbTable = 'bis.tbl_bisio'; $this->pk = 'bisio_id'; } + + /** + * Gets duration of stay in days by bisio_id. + * @param int $bisio_id + * @return object success with number of days or error + */ + public function getAufenthaltsdauer($bisio_id) + { + // get from and to date + $this->addSelect('von, bis'); + $bisioRes = $this->load($bisio_id); + + if (isError($bisioRes)) + return $bisioRes; + + if (hasData($bisioRes)) + { + $bisioData = getData($bisioRes)[0]; + + $avon = $bisioData->von; + $abis = $bisioData->bis; + + if (is_null($avon) || is_null($abis)) + return success("Von or bis date not set"); + + $vonDate = new DateTime($avon); + $bisDate = new DateTime($abis); + $interval = $vonDate->diff($bisDate); + return success($interval->days); + } + else + return success("Bisio not found"); + } } diff --git a/application/models/person/Person_model.php b/application/models/person/Person_model.php index ec5522674..559700390 100644 --- a/application/models/person/Person_model.php +++ b/application/models/person/Person_model.php @@ -165,7 +165,7 @@ class Person_model extends DB_Model if (!hasData($person)) return success(null); - $this->KontaktModel->addSelect('kontakttyp, anmerkung, kontakt, zustellung'); + $this->KontaktModel->addSelect('kontakt_id, kontakttyp, anmerkung, kontakt, zustellung'); $this->KontaktModel->addOrder('kontakttyp'); $this->KontaktModel->addOrder('insertamum', 'DESC'); $where = $zustellung_only === true ? array('person_id' => $person_id, 'zustellung' => true) : array('person_id' => $person_id); @@ -268,16 +268,61 @@ class Person_model extends DB_Model public function checkDuplicate($person_id) { - $qry = "SELECT sp.person_id - FROM public.tbl_person p - LEFT JOIN public.tbl_person sp ON p.vorname = sp.vorname - AND p.nachname = sp.nachname - AND p.gebdatum = sp.gebdatum - JOIN public.tbl_prestudent ps ON sp.person_id = ps.person_id - JOIN public.tbl_prestudentstatus pss ON ps.prestudent_id = pss.prestudent_id - WHERE p.person_id = ? AND sp.person_id != ? AND pss.status_kurzbz = ?"; + $qry = "SELECT person_id + FROM public.tbl_prestudent p + JOIN + ( + SELECT DISTINCT ON(prestudent_id) * + FROM public.tbl_prestudentstatus + WHERE prestudent_id IN + ( + SELECT prestudent_id + FROM public.tbl_prestudent + WHERE person_id IN + ( + SELECT p2.person_id + FROM public.tbl_person p + JOIN public.tbl_person p2 + ON p.vorname = p2.vorname + AND p.nachname = p2.nachname + AND p.gebdatum = p2.gebdatum + AND p.person_id = ? + ) + ) + ORDER BY prestudent_id, datum DESC, insertamum DESC + ) ps USING(prestudent_id) + JOIN public.tbl_status USING(status_kurzbz) + WHERE status_kurzbz = 'Interessent' + AND studiengang_kz IN + ( + SELECT studiengang_kz + FROM public.tbl_prestudent p + JOIN + ( + SELECT DISTINCT ON(prestudent_id) * + FROM public.tbl_prestudentstatus + WHERE prestudent_id IN + ( + SELECT prestudent_id + FROM public.tbl_prestudent + WHERE person_id IN + ( + SELECT p2.person_id + FROM public.tbl_person p + JOIN public.tbl_person p2 + ON p.vorname = p2.vorname + AND p.nachname = p2.nachname + AND p.gebdatum = p2.gebdatum + AND p.person_id = ? + ) + ) + ORDER BY prestudent_id, datum DESC, insertamum DESC + ) ps USING(prestudent_id) + JOIN public.tbl_status USING(status_kurzbz) + WHERE status_kurzbz = 'Abbrecher' + ) + "; - - return $this->execQuery($qry, array($person_id, $person_id, 'Abbrecher')); + return $this->execQuery($qry, array($person_id, $person_id)); } } diff --git a/application/models/system/Issue_model.php b/application/models/system/Issue_model.php index 5dac85066..ab1f9ba6e 100644 --- a/application/models/system/Issue_model.php +++ b/application/models/system/Issue_model.php @@ -12,6 +12,45 @@ class Issue_model extends DB_Model $this->pk = 'issue_id'; } + /** + * Gets issues which are open, i.e. not resolved. + * @param array $fehlercodes only issues for given fehler are retrieved + * @param int $person_id + * @param string $oe_kurzbz + * @param string $fehlercode_extern + * @return object success with issues or error + */ + public function getOpenIssues($fehlercodes, $person_id = null, $oe_kurzbz = null, $fehlercode_extern = null) + { + $params = array($fehlercodes); + // issue exists for a fehlercode (or fehlercode_extern), person_id, oe_kurzbz, if not verarbeitet yet + $qry = 'SELECT issue_id, fehlercode, inhalt, fehlercode_extern, inhalt_extern, person_id, oe_kurzbz, + behebung_parameter, datum, verarbeitetvon, verarbeitetamum + FROM system.tbl_issue + WHERE fehlercode IN ? + AND verarbeitetamum IS NULL'; + + 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); + } + /** * Gets number of open (non-resolved) issues. * @param string $fehlercode unique error code diff --git a/application/views/system/infocenter/infocenterData.php b/application/views/system/infocenter/infocenterData.php index d867c8613..f3849d622 100644 --- a/application/views/system/infocenter/infocenterData.php +++ b/application/views/system/infocenter/infocenterData.php @@ -414,6 +414,10 @@ { $datasetRaw->{'OnholdDate'} = '-'; } + else + { + $datasetRaw->{'OnholdDate'} = date_format(date_create($datasetRaw->{'OnholdDate'}), 'Y-m-d H:i'); + } if ($datasetRaw->{'StgAbgeschickt'} == null) { diff --git a/application/views/system/infocenter/infocenterFreigegebenData.php b/application/views/system/infocenter/infocenterFreigegebenData.php index 39b1e3cca..92f062b62 100644 --- a/application/views/system/infocenter/infocenterFreigegebenData.php +++ b/application/views/system/infocenter/infocenterFreigegebenData.php @@ -11,6 +11,7 @@ $STATUS_KURZBZ = '\'Wartender\', \'Bewerber\', \'Aufgenommener\', \'Student\''; $STUDIENSEMESTER = '\''.$this->variablelib->getVar('infocenter_studiensemester').'\''; $ORG_NAME = '\'InfoCenter\''; + $IDENTITY = '\'identity\''; $query = ' SELECT @@ -245,7 +246,15 @@ $query = ' LIMIT 1 ) LIMIT 1 - ) AS "InfoCenterMitarbeiter" + ) AS "InfoCenterMitarbeiter", + ( + SELECT akte.akte_id + FROM public.tbl_akte akte + JOIN public.tbl_dokument USING (dokument_kurzbz) + WHERE akte.person_id = p.person_id + AND dokument_kurzbz = '. $IDENTITY .' + LIMIT 1 + ) AS "AktenId" FROM public.tbl_person p LEFT JOIN ( SELECT tpl.person_id, @@ -317,7 +326,8 @@ $query = ' 'Reihungstest date', 'ZGV Nation BA', 'ZGV Nation MA', - 'InfoCenter Mitarbeiter' + 'InfoCenter Mitarbeiter', + 'Identitätsnachweis' ), 'formatRow' => function($datasetRaw) { @@ -425,6 +435,19 @@ $query = ' $datasetRaw->{'InfoCenterMitarbeiter'} = 'Ja'; } + if ($datasetRaw->{'AktenId'} !== null) + { + $datasetRaw->{'AktenId'} = sprintf( + 'Identitätsnachweis', + $datasetRaw->{'AktenId'} + ); + } + else + { + $datasetRaw->{'AktenId'} = '-'; + } + + return $datasetRaw; }, 'markRow' => function($datasetRaw) { diff --git a/cis/testtool/login.php b/cis/testtool/login.php index a738c0a88..df4874a4c 100644 --- a/cis/testtool/login.php +++ b/cis/testtool/login.php @@ -55,7 +55,7 @@ if (isset($_GET['logout']) && $_GET['logout'] == true) echo ' diff --git a/cis/testtool/logout.html b/cis/testtool/logout.html new file mode 100644 index 000000000..58a0b191f --- /dev/null +++ b/cis/testtool/logout.html @@ -0,0 +1,31 @@ + + +
+| Nachname | Vornamen | -uid | -Lehrfach | -Studiengang | -Semester | |
|---|---|---|---|---|---|---|
| Delete | -nachname; ?> | -vornamen; ?> | -uid; ?> | -lfkurzbz; ?> | -stgkurzbz; ?> | -semester; ?> | -