From cb3f3723ae95f03715e01fca8dc460398193ea63 Mon Sep 17 00:00:00 2001 From: KarpAlex Date: Tue, 28 Sep 2021 15:57:27 +0200 Subject: [PATCH] issues table dataset: - made more readable for assistance (added vorname, nachname, removed some fields) - added default filters (all new, last 7 days...) - issues displayed for children oes of permitted arrays as well - query: more exact check for prestudents future status by using studiensemester start date - typo fixes --- .../controllers/system/issues/Issues.php | 25 +++++- application/libraries/IssuesLib.php | 27 ++++-- .../views/system/issues/issuesData.php | 28 +++++-- public/js/issues/issuesDataset.js | 2 +- system/filtersupdate.php | 82 ++++++++++++++++--- 5 files changed, 135 insertions(+), 29 deletions(-) diff --git a/application/controllers/system/issues/Issues.php b/application/controllers/system/issues/Issues.php index 9ae390418..98787f703 100644 --- a/application/controllers/system/issues/Issues.php +++ b/application/controllers/system/issues/Issues.php @@ -14,7 +14,7 @@ class Issues extends Auth_Controller parent::__construct( array( 'index' => array(self::BERECHTIGUNG_KURZBZ.':r'), - 'changeIssueStatus' => array(self::BERECHTIGUNG_KURZBZ.':r') + 'changeIssueStatus' => array(self::BERECHTIGUNG_KURZBZ.':rw') ) ); @@ -33,6 +33,7 @@ class Issues extends Auth_Controller // Load models $this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel'); + $this->load->model('organisation/Organisationseinheit_model', 'OrganisationseinheitModel'); $this->_setAuthUID(); // sets property uid } @@ -101,8 +102,28 @@ class Issues extends Auth_Controller foreach (getData($benutzerfunktionRes) as $benutzerfunktion) { $all_oe_kurzbz_with_funktionen[$benutzerfunktion->oe_kurzbz][] = $benutzerfunktion->funktion_kurzbz; - if ($benutzerfunktion->funktion_kurzbz == self::FUNKTION_KURZBZ) // separate oes for the funktion needed for displaying issues + + // separate oes for the funktion needed for displaying issues + if ($benutzerfunktion->funktion_kurzbz == self::FUNKTION_KURZBZ) + { $oe_kurzbz_for_funktion[] = $benutzerfunktion->oe_kurzbz; + + $childOesFunktionRes = $this->OrganisationseinheitModel->getChilds($benutzerfunktion->oe_kurzbz); + + if (isError($childOesFunktionRes)) + show_error(getError($childOesFunktionRes)); + + if (hasData($childOesFunktionRes)) + { + $childOesFunktion = getData($childOesFunktionRes); + + foreach ($childOesFunktion as $childOeFunktion) + { + if (!in_array($childOeFunktion->oe_kurzbz, $oe_kurzbz_for_funktion)) + $oe_kurzbz_for_funktion[] = $childOeFunktion->oe_kurzbz; + } + } + } } } diff --git a/application/libraries/IssuesLib.php b/application/libraries/IssuesLib.php index ade2c6078..1b06db333 100644 --- a/application/libraries/IssuesLib.php +++ b/application/libraries/IssuesLib.php @@ -72,7 +72,7 @@ class IssuesLib return $this->_addIssue($fehlercode, $person_id, $oe_kurzbz, $fehlertext_params); } else - return error("Fehler nicht gefunden"); + return error("Fehler $fehler_kurzbz nicht gefunden"); } /** @@ -81,26 +81,39 @@ class IssuesLib * @param string $inhalt_extern error text in external system * @param int $person_id * @param int $oe_kurzbz - * @param array $fehlertext_params params for sprint replace of error text in system.tbl_fehler + * @param array $fehlertext_params params for replacement of parts of error text + * @param bool $force_predefined if true, only predefined 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) + public function addExternalIssue($fehlercode_extern, $inhalt_extern, $person_id = null, $oe_kurzbz = null, $fehlertext_params = null, $force_predefined = false) { if (isEmptyString($fehlercode_extern)) return error("fehlercode_extern fehlt"); // 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->loadWhere( + array( + 'fehlercode_extern' => $fehlercode_extern, + 'app' => $this->_app + ) + ); if (isError($fehlerRes)) return $fehlerRes; + $fehlerData = getData($fehlerRes)[0]; + // check if there is a predefined custom error for the external issue if (hasData($fehlerRes)) { // if found, use the code - $fehlercode = getData($fehlerRes)[0]->fehlercode; + $fehlercode = $fehlerData->fehlercode; + } + elseif ($force_predefined === true) + { + // only added if predefined + return success("No definition found - not added"); } else { @@ -180,7 +193,7 @@ class IssuesLib * @param array $fehlertext_params * @param string $fehlercode_extern * @param string $inhalt_extern - * @return array|stdClass + * @return object success or error */ private function _addIssue($fehlercode, $person_id = null, $oe_kurzbz = null, $fehlertext_params = null, $fehlercode_extern = null, $inhalt_extern = null) { @@ -226,6 +239,6 @@ class IssuesLib return error("Anzahl offener Issues konnte nicht ermittelt werden."); } else - return error("Fehler nicht gefunden"); + return error("Fehler $fehlercode nicht gefunden"); } } diff --git a/application/views/system/issues/issuesData.php b/application/views/system/issues/issuesData.php index 82e6fa409..2b4551603 100644 --- a/application/views/system/issues/issuesData.php +++ b/application/views/system/issues/issuesData.php @@ -10,27 +10,29 @@ $query = "SELECT issue_id, fehlercode AS \"Fehlercode\", iss.fehlercode_extern A inhalt AS \"Inhalt\", inhalt_extern AS \"Inhalt extern\", iss.person_id AS \"PersonId\", iss.oe_kurzbz AS \"OE\", ftyp.bezeichnung_mehrsprachig[1] AS \"Fehlertyp\", stat.bezeichnung_mehrsprachig[1] AS \"Fehlerstatus\", verarbeitetvon AS \"Verarbeitet von\",verarbeitetamum AS \"Verarbeitet am\", fr.app AS \"Applikation\", - fr.fehlertyp_kurzbz as \"Fehlertypcode\", iss.status_kurzbz AS \"Statuscode\" + fr.fehlertyp_kurzbz as \"Fehlertypcode\", iss.status_kurzbz AS \"Statuscode\", + pers.vorname AS \"Vorname\", pers.nachname AS \"Nachname\" FROM system.tbl_issue iss JOIN system.tbl_fehler fr USING (fehlercode) JOIN system.tbl_fehlertyp ftyp USING (fehlertyp_kurzbz) JOIN system.tbl_issue_status stat USING (status_kurzbz) + LEFT JOIN public.tbl_person pers ON iss.person_id = pers.person_id WHERE EXISTS ( - SELECT 1 FROM system.tbl_fehler_zustaendigkeiten + SELECT 1 FROM system.tbl_fehler_zustaendigkeiten zst WHERE fehlercode = iss.fehlercode AND ( person_id = ".$PERSON_ID." /* person_id in fehler_zustaendigkeit for individual persons */"; if (!isEmptyArray($all_oe_kurzbz_with_funktionen)) { - $query .= " OR (oe_kurzbz IN $ALL_OE_KURZBZ AND funktion_kurzbz IS NULL) /* if oe is specified in fehler_zustaendigkeiten */"; + $query .= " OR (zst.oe_kurzbz IN $ALL_OE_KURZBZ AND zst.funktion_kurzbz IS NULL) /* if oe is specified in fehler_zustaendigkeiten */"; // check for each oe for each function if zustaendig foreach ($all_oe_kurzbz_with_funktionen as $oe_kurzbz => $funktionen_kurzbz) { foreach ($funktionen_kurzbz as $funktion_kurzbz) { - $query .= " OR (oe_kurzbz = '$oe_kurzbz' AND funktion_kurzbz = '$funktion_kurzbz')"; + $query .= " OR (zst.oe_kurzbz = '$oe_kurzbz' AND zst.funktion_kurzbz = '$funktion_kurzbz')"; } } } @@ -40,9 +42,9 @@ $query .= "))"; // close AND of exists, and exists // show issue if it is assigend to oe of uid or to student of oe of uid if (!isEmptyArray($all_oe_kurzbz_berechtigt)) { - $query .= " OR oe_kurzbz IN $ALL_OE_KURZBZ_BERECHTIGT /* if error is for studiengang oe */"; + $query .= " OR iss.oe_kurzbz IN $ALL_OE_KURZBZ_BERECHTIGT /* if error is for studiengang oe */"; - $query .= " OR (oe_kurzbz IS NULL AND EXISTS ( /* if person_id of error is a student of studiengang oe */ + $query .= " OR (iss.oe_kurzbz IS NULL AND EXISTS ( /* if person_id of error is a student of studiengang oe */ SELECT 1 FROM public.tbl_prestudent ps JOIN public.tbl_prestudentstatus pss USING (prestudent_id) JOIN public.tbl_studiengang stg USING (studiengang_kz) @@ -51,15 +53,17 @@ if (!isEmptyArray($all_oe_kurzbz_berechtigt)) AND pss.status_kurzbz IN $RELEVANT_PRESTUDENT_STATUS AND NOT EXISTS (SELECT 1 FROM public.tbl_prestudentstatus ps_finished + JOIN public.tbl_studiensemester sem_finished USING (studiensemester_kurzbz) WHERE prestudent_id = ps.prestudent_id /* irrelevant if already finished studies and studied a while ago */ AND status_kurzbz IN ('Absolvent','Abbrecher','Abgewiesener') AND datum::date + interval '2 months' < NOW() AND EXISTS (SELECT 1 FROM public.tbl_prestudent /* if more recent prestudent exists, their oe should get the issue */ JOIN public.tbl_prestudentstatus USING (prestudent_id) + JOIN public.tbl_studiensemester USING (studiensemester_kurzbz) WHERE tbl_prestudentstatus.status_kurzbz IN $RELEVANT_PRESTUDENT_STATUS AND person_id = ps.person_id AND prestudent_id <> ps_finished.prestudent_id - AND datum::date >= ps_finished.datum::date) + AND tbl_studiensemester.start::date > sem_finished.start::date) ) ) )"; @@ -69,7 +73,13 @@ $query .= " ORDER BY CASE WHEN iss.status_kurzbz = '".IssuesLib::STATUS_NEU."' THEN 0 WHEN iss.status_kurzbz = '".IssuesLib::STATUS_IN_BEARBEITUNG."' THEN 1 ELSE 2 - END, datum DESC, fehlercode, issue_id DESC"; + END, + CASE + WHEN fehlertyp_kurzbz = '".IssuesLib::ERRORTYPE_CODE."' THEN 0 + WHEN fehlertyp_kurzbz = '".IssuesLib::WARNINGTYPE_CODE."' THEN 1 + ELSE 2 + END, + datum DESC, fehlercode, issue_id DESC"; $filterWidgetArray = array( 'query' => $query, @@ -96,6 +106,8 @@ $filterWidgetArray = array( 'Applikation', 'Fehlertypcode', 'Statuscode', + 'Vorname', + 'Nachname' ), 'formatRow' => function($datasetRaw) { diff --git a/public/js/issues/issuesDataset.js b/public/js/issues/issuesDataset.js index 385a1d0ed..b102a3f96 100644 --- a/public/js/issues/issuesDataset.js +++ b/public/js/issues/issuesDataset.js @@ -17,7 +17,7 @@ var IssuesDataset = { '' + '' + '' + - '' + + '' + '' + ''; diff --git a/system/filtersupdate.php b/system/filtersupdate.php index b5662492c..2998640ed 100644 --- a/system/filtersupdate.php +++ b/system/filtersupdate.php @@ -860,25 +860,49 @@ $filters = array( array( 'app' => 'core', 'dataset_name' => 'issues', - 'filter_kurzbz' => 'last7Days', - 'description' => '{Fehler letzte 7 Tage}', + 'filter_kurzbz' => 'offeneFehler', + 'description' => '{Alle offenen}', 'sort' => 1, 'default_filter' => true, 'filter' => ' { - "name": "Alle in den letzten 7 Tagen aufgetretenen Fehler ", + "name": "Alle offenen Fehler", "columns": [ - {"name": "Fehlercode"}, - {"name": "Fehlercode extern"}, {"name": "Datum"}, {"name": "Inhalt"}, - {"name": "Inhalt extern"}, + {"name": "Vorname"}, + {"name": "Nachname"}, {"name": "PersonId"}, - {"name": "OE"}, - {"name": "Fehlertyp"}, - {"name": "Fehlerstatus"}, - {"name": "Verarbeitet von"}, - {"name": "Verarbeitet am"} + {"name": "Fehlerstatus"} + ], + "filters": [ + { + "name": "Fehlerstatus", + "operation": "ncontains", + "condition": "behoben" + } + ] + } + ', + 'oe_kurzbz' => null, + ), + array( + 'app' => 'core', + 'dataset_name' => 'issues', + 'filter_kurzbz' => 'FehlerLetze7Tage', + 'description' => '{Letzten 7 Tage}', + 'sort' => 2, + 'default_filter' => false, + 'filter' => ' + { + "name": "Alle in den letzten 7 Tagen aufgetretenen Fehler", + "columns": [ + {"name": "Datum"}, + {"name": "Inhalt"}, + {"name": "Vorname"}, + {"name": "Nachname"}, + {"name": "PersonId"}, + {"name": "Fehlerstatus"} ], "filters": [ { @@ -892,6 +916,42 @@ $filters = array( ', 'oe_kurzbz' => null, ), + array( + 'app' => 'core', + 'dataset_name' => 'issues', + 'filter_kurzbz' => 'FehlerLetzte7TageBearbeitet', + 'description' => '{Letzten 7 Tage bearbeitet}', + 'sort' => 3, + 'default_filter' => false, + 'filter' => ' + { + "name": "Alle in den letzten 7 Tagen bearbeiteten Fehler", + "columns": [ + {"name": "Datum"}, + {"name": "Inhalt"}, + {"name": "Vorname"}, + {"name": "Nachname"}, + {"name": "PersonId"}, + {"name": "Fehlerstatus"}, + {"name": "Verarbeitet von"} + ], + "filters": [ + { + "name": "Verarbeitet am", + "operation": "lt", + "condition": "7", + "option": "days" + }, + { + "name": "Fehlerstatus", + "operation": "contains", + "condition": "behoben" + } + ] + } + ', + 'oe_kurzbz' => null, + ) ); // Loop through the filters array