diff --git a/application/config/navigation.php b/application/config/navigation.php
index 42d9b94e1..b788dc40c 100644
--- a/application/config/navigation.php
+++ b/application/config/navigation.php
@@ -133,6 +133,13 @@ $config['navigation_header'] = array(
'expand' => true,
'sort' => 20,
'requiredPermissions' => 'system/developer:r'
+ ),
+ 'errormonitoring' => array(
+ 'link' => site_url('system/issues/Issues'),
+ 'description' => 'Fehler Monitoring',
+ 'expand' => true,
+ 'sort' => 20,
+ 'requiredPermissions' => 'system/issues_verwalten:r'
)
)
)
diff --git a/application/controllers/system/issues/Issues.php b/application/controllers/system/issues/Issues.php
new file mode 100644
index 000000000..9ae390418
--- /dev/null
+++ b/application/controllers/system/issues/Issues.php
@@ -0,0 +1,120 @@
+ array(self::BERECHTIGUNG_KURZBZ.':r'),
+ 'changeIssueStatus' => array(self::BERECHTIGUNG_KURZBZ.':r')
+ )
+ );
+
+ // Load libraries
+ $this->load->library('IssuesLib');
+ $this->load->library('PermissionLib');
+ $this->load->library('WidgetLib');
+
+ $this->loadPhrases(
+ array(
+ 'global',
+ 'ui',
+ 'filter'
+ )
+ );
+
+ // Load models
+ $this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel');
+
+ $this->_setAuthUID(); // sets property uid
+ }
+
+ public function index()
+ {
+ $oes_for_issues = $this->_getOesForIssues();
+
+ $this->load->view(
+ 'system/issues/issues',
+ $oes_for_issues
+ );
+ }
+
+ /**
+ * Initializes issues status change
+ */
+ public function changeIssueStatus()
+ {
+ $issue_ids = $this->input->post('issue_ids');
+ $status_kurzbz = $this->input->post('status_kurzbz');
+ $verarbeitetvon = $this->_uid;
+
+ $errors = array();
+ foreach ($issue_ids as $issue_id)
+ {
+ $issueRes = $this->issueslib->changeIssueStatus($issue_id, $status_kurzbz, $verarbeitetvon);
+
+ if (isError($issueRes))
+ $errors[] = getError($issueRes);
+ }
+
+ if (!isEmptyArray($errors))
+ $this->outputJsonError(implode(", ", $errors));
+ else
+ $this->outputJsonSuccess("Status erfolgreich aktualisiert");
+ }
+
+ /**
+ * Retrieve the UID of the logged user and checks if it is valid
+ */
+ private function _setAuthUID()
+ {
+ $this->_uid = getAuthUID();
+
+ if (!$this->_uid) show_error('User authentification failed');
+ }
+
+ /**
+ * Gets oes of logged in user, which are needed to display issues of the user.
+ * This includes oes assigned by a funktio and as the issue permission.
+ * @return array
+ */
+ private function _getOesForIssues()
+ {
+ // get oes of uid for which there is a current funktion
+ $all_oe_kurzbz_with_funktionen = array();
+ $oe_kurzbz_for_funktion = array();
+ $benutzerfunktionRes = $this->BenutzerfunktionModel->getBenutzerFunktionByUid($this->_uid, null, date('Y-m-d'), date('Y-m-d'));
+
+ if (isError($benutzerfunktionRes))
+ show_error(getError($benutzerfunktionRes));
+
+ if (hasData($benutzerfunktionRes))
+ {
+ 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
+ $oe_kurzbz_for_funktion[] = $benutzerfunktion->oe_kurzbz;
+ }
+ }
+
+ // add oes for which there is the issues_verwalten Berechtigung
+ if (!$oe_kurzbz_berechtigt = $this->permissionlib->getOE_isEntitledFor(self::BERECHTIGUNG_KURZBZ))
+ show_error('Keine Berechtigung oder Fehler bei Berechtigungsprüfung');
+
+ $all_oe_kurzbz_berechtigt = array_unique(array_merge($oe_kurzbz_for_funktion, $oe_kurzbz_berechtigt));
+
+ return array(
+ 'all_oe_kurzbz_with_funktionen' => $all_oe_kurzbz_with_funktionen,
+ 'all_oe_kurzbz_berechtigt' => $all_oe_kurzbz_berechtigt
+ );
+ }
+}
diff --git a/application/libraries/IssuesLib.php b/application/libraries/IssuesLib.php
new file mode 100644
index 000000000..ade2c6078
--- /dev/null
+++ b/application/libraries/IssuesLib.php
@@ -0,0 +1,231 @@
+_ci =& get_instance();
+
+ // Properties default values
+ $this->_app = 'core';
+ $this->_insertvon = 'system';
+ $this->_fallbackFehlercode = 'UNKNOWN_ERROR';
+
+ // If parameters are given then overwrite the default values
+ if (!isEmptyArray($params)) $this->setConfigs($params);
+
+ // load models
+ $this->_ci->load->model('system/Issue_model', 'IssueModel');
+ $this->_ci->load->model('system/Fehler_model', 'FehlerModel');
+ }
+
+ // --------------------------------------------------------------------------------------------------------------
+ // Public methods
+
+ /**
+ * Store configuration parameters for this lib
+ */
+ public function setConfigs($params)
+ {
+ // If parameters are given then overwrite the default values
+ if (!isEmptyArray($params))
+ {
+ if (isset($params[self::APP_INDEX])) $this->_app = $params[self::APP_INDEX];
+ if (isset($params[self::INSERTVON_INDEX])) $this->_insertvon = $params[self::INSERTVON_INDEX];
+ if (isset($params[self::FALLBACK_FEHLERCODE_INDEX])) $this->_fallbackFehlercode = $params[self::FALLBACK_FEHLERCODE_INDEX];
+ }
+ }
+
+ /**
+ * Adds an Fhc issue, i.e. an internal, self-defined issue.
+ * @param string $fehler_kurzbz short unique text name of the issue
+ * @param int $person_id
+ * @param string $oe_kurzbz
+ * @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)
+ {
+ $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);
+ }
+ else
+ return error("Fehler nicht gefunden");
+ }
+
+ /**
+ * Adds an external issue, already defined externally by another system.
+ * @param string $fehlercode_extern the error code in the external system
+ * @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
+ * @return object success or error
+ */
+ 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");
+
+ // 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));
+
+ if (isError($fehlerRes))
+ return $fehlerRes;
+
+ // 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;
+ }
+ else
+ {
+ // if predefined error is not found, insert with fallback code
+ $fehlercode = $this->_fallbackFehlercode;
+ }
+
+ // add external issue
+ return $this->_addIssue($fehlercode, $person_id, $oe_kurzbz, $fehlertext_params, $fehlercode_extern, $inhalt_extern);
+ }
+
+ /**
+ * 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)
+ * @return success or error
+ */
+ public function changeIssueStatus($issue_id, $status_kurzbz, $verarbeitetvon = null)
+ {
+ if (!isset($issue_id) || !is_numeric($issue_id))
+ return error("Issue Id muss korrekt gesetzt sein.");
+
+ // check if given status is same as existing
+ $this->_ci->IssueModel->addSelect('status_kurzbz');
+ $currStatus = $this->_ci->IssueModel->load($issue_id);
+
+ if (hasData($currStatus))
+ {
+ if (getData($currStatus)[0]->status_kurzbz == $status_kurzbz)
+ return success("Gleicher Status bereits gesetzt");
+ }
+ else
+ return error("Fehler beim Holen des 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');
+
+ return $this->_ci->IssueModel->update(
+ array(
+ 'issue_id' => $issue_id
+ ),
+ $data
+ );
+ }
+
+ /**
+ * Adds an issue.
+ * @param $fehlercode
+ * @param int $person_id
+ * @param string $oe_kurzbz
+ * @param array $fehlertext_params
+ * @param string $fehlercode_extern
+ * @param string $inhalt_extern
+ * @return array|stdClass
+ */
+ private function _addIssue($fehlercode, $person_id = null, $oe_kurzbz = null, $fehlertext_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.");
+
+ // get fehlertextVorlage and replace it with params
+ $fehlerRes = $this->_ci->FehlerModel->load($fehlercode);
+
+ if (hasData($fehlerRes))
+ {
+ $fehlertextVorlage = getData($fehlerRes)[0]->fehlertext;
+ $fehlertext = isEmptyArray($fehlertext_params) ? $fehlertextVorlage : vsprintf($fehlertextVorlage, $fehlertext_params);
+
+ $openIssuesCountRes = $this->_ci->IssueModel->getOpenIssueCount($fehlercode, $person_id, $oe_kurzbz, $fehlercode_extern);
+
+ if (hasData($openIssuesCountRes))
+ {
+ // don't insert if issue is already open
+ // already open - status new with same fehlercode or same fehlercode-extern (if set)
+ $openIssueCount = getData($openIssuesCountRes)[0]->anzahl_open_issues;
+
+ if ($openIssueCount == 0)
+ {
+ return $this->_ci->IssueModel->insert(
+ array(
+ 'fehlercode' => $fehlercode,
+ 'fehlercode_extern' => $fehlercode_extern,
+ 'inhalt' => $fehlertext,
+ 'inhalt_extern' => $inhalt_extern,
+ 'person_id' => $person_id,
+ 'oe_kurzbz' => $oe_kurzbz,
+ 'datum' => date('Y-m-d H:i:s'),
+ 'status_kurzbz' => self::STATUS_NEU,
+ 'insertvon' => $this->_insertvon
+ )
+ );
+ }
+ else
+ return success($openIssueCount);
+ }
+ else
+ return error("Anzahl offener Issues konnte nicht ermittelt werden.");
+ }
+ else
+ return error("Fehler nicht gefunden");
+ }
+}
diff --git a/application/models/system/Fehler_model.php b/application/models/system/Fehler_model.php
new file mode 100644
index 000000000..28618f6d9
--- /dev/null
+++ b/application/models/system/Fehler_model.php
@@ -0,0 +1,14 @@
+dbTable = 'system.tbl_fehler';
+ $this->pk = 'fehlercode';
+ }
+}
diff --git a/application/models/system/Issue_model.php b/application/models/system/Issue_model.php
new file mode 100644
index 000000000..5dac85066
--- /dev/null
+++ b/application/models/system/Issue_model.php
@@ -0,0 +1,51 @@
+dbTable = 'system.tbl_issue';
+ $this->pk = 'issue_id';
+ }
+
+ /**
+ * Gets number of open (non-resolved) issues.
+ * @param string $fehlercode unique error code
+ * @param int $person_id if provided, only issues with this person_id are counted.
+ * @param string $oe_kurzbz if provided, only issues with this oe_kurzbz are counted.
+ * @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)
+ {
+ $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
+ WHERE fehlercode = ?
+ 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);
+ }
+}
diff --git a/application/views/system/issues/issues.php b/application/views/system/issues/issues.php
new file mode 100644
index 000000000..ebe92012d
--- /dev/null
+++ b/application/views/system/issues/issues.php
@@ -0,0 +1,48 @@
+load->view(
+ 'templates/FHC-Header',
+ array(
+ 'title' => 'Fehler Monitoring',
+ 'jquery' => true,
+ 'jqueryui' => true,
+ 'jquerycheckboxes' => true,
+ 'bootstrap' => true,
+ 'fontawesome' => true,
+ 'sbadmintemplate' => true,
+ 'tablesorter' => true,
+ 'ajaxlib' => true,
+ 'filterwidget' => true,
+ 'navigationwidget' => true,
+ 'dialoglib' => true,
+ 'phrases' => array(
+ 'ui' => array('bitteEintragWaehlen')
+ ),
+ 'customCSSs' => array('public/css/issues/issuesDataset.css', 'public/css/sbadmin2/tablesort_bootstrap.css'),
+ 'customJSs' => array('public/js/issues/issuesDataset.js', 'public/js/bootstrapper.js')
+ )
+);
+?>
+
+
+
+
+ widgetlib->widget('NavigationWidget'); ?>
+
+
+
+
+
+ load->view('system/issues/issuesData.php'); ?>
+
+
+
+
+
+
+load->view('templates/FHC-Footer'); ?>
diff --git a/application/views/system/issues/issuesData.php b/application/views/system/issues/issuesData.php
new file mode 100644
index 000000000..82e6fa409
--- /dev/null
+++ b/application/views/system/issues/issuesData.php
@@ -0,0 +1,161 @@
+ $funktionen_kurzbz)
+ {
+ foreach ($funktionen_kurzbz as $funktion_kurzbz)
+ {
+ $query .= " OR (oe_kurzbz = '$oe_kurzbz' AND funktion_kurzbz = '$funktion_kurzbz')";
+ }
+ }
+}
+
+$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 (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)
+ WHERE person_id = iss.person_id
+ AND stg.oe_kurzbz IN $ALL_OE_KURZBZ_BERECHTIGT
+ AND pss.status_kurzbz IN $RELEVANT_PRESTUDENT_STATUS
+ AND NOT EXISTS (SELECT 1
+ FROM public.tbl_prestudentstatus ps_finished
+ 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)
+ 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)
+ )
+ )
+ )";
+}
+
+$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";
+
+$filterWidgetArray = array(
+ 'query' => $query,
+ 'app' => 'core',
+ 'datasetName' => 'issues',
+ 'filter_id' => $this->input->get('filter_id'),
+ 'tableUniqueId' => 'issues',
+ 'requiredPermissions' => 'admin',
+ 'datasetRepresentation' => 'tablesorter',
+ 'checkboxes' => 'issue_id',
+ 'columnsAliases' => array(
+ 'ID',
+ 'Fehlercode',
+ 'Fehlercode extern',
+ 'Datum',
+ 'Inhalt',
+ 'Inhalt extern',
+ 'PersonId',
+ 'OE',
+ 'Fehlertyp',
+ 'Fehlerstatus',
+ 'Verarbeitet von',
+ 'Verarbeitet am',
+ 'Applikation',
+ 'Fehlertypcode',
+ 'Statuscode',
+ ),
+ 'formatRow' => function($datasetRaw) {
+
+ if ($datasetRaw->{'Fehlercode extern'} == null)
+ {
+ $datasetRaw->{'Fehlercode extern'} = '-';
+ }
+
+ if ($datasetRaw->{'Inhalt'} == null)
+ {
+ $datasetRaw->{'Inhalt'} = '-';
+ }
+
+ if ($datasetRaw->{'Inhalt extern'} == null)
+ {
+ $datasetRaw->{'Inhalt extern'} = '-';
+ }
+
+ if ($datasetRaw->{'PersonId'} == null)
+ {
+ $datasetRaw->{'PersonId'} = '-';
+ }
+
+ if ($datasetRaw->{'OE'} == null)
+ {
+ $datasetRaw->{'OE'} = '-';
+ }
+
+ if ($datasetRaw->{'Verarbeitet am'} == null)
+ {
+ $datasetRaw->{'Verarbeitet am'} = '-';
+ }
+
+ if ($datasetRaw->{'Verarbeitet von'} == null)
+ {
+ $datasetRaw->{'Verarbeitet von'} = '-';
+ }
+
+ return $datasetRaw;
+ },
+ 'markRow' => function($datasetRaw) {
+
+ $mark = '';
+
+ if ($datasetRaw->Statuscode == IssuesLib::STATUS_BEHOBEN)
+ $mark = "text-success";
+ elseif ($datasetRaw->Statuscode == IssuesLib::STATUS_NEU || $datasetRaw->Statuscode == IssuesLib::STATUS_IN_BEARBEITUNG)
+ {
+ if ($datasetRaw->Fehlertypcode == IssuesLib::ERRORTYPE_CODE)
+ {
+ $mark = "text-danger";
+ }
+ elseif ($datasetRaw->Fehlertypcode == IssuesLib::WARNINGTYPE_CODE)
+ {
+ $mark = "text-warning";
+ }
+ }
+
+ return $mark;
+ }
+);
+
+echo $this->widgetlib->widget('FilterWidget', $filterWidgetArray);
diff --git a/public/css/issues/issuesDataset.css b/public/css/issues/issuesDataset.css
new file mode 100644
index 000000000..f05066b96
--- /dev/null
+++ b/public/css/issues/issuesDataset.css
@@ -0,0 +1,8 @@
+.datasetActionsTopBottomText {
+ padding-top: 1em;
+}
+
+.datasetActionsHorizontalLine {
+ margin-top: 5px;
+ margin-bottom: 5px;
+}
\ No newline at end of file
diff --git a/public/js/issues/issuesDataset.js b/public/js/issues/issuesDataset.js
new file mode 100644
index 000000000..385a1d0ed
--- /dev/null
+++ b/public/js/issues/issuesDataset.js
@@ -0,0 +1,151 @@
+/**
+ * Javascript file for issues overview page
+ */
+
+var IssuesDataset = {
+
+ /**
+ * adds person table additional actions html (above and beneath it)
+ */
+ appendTableActionsHtml: function()
+ {
+ let auswahlStatus =
+ '' +
+ '' +
+ '' +
+ '' +
+ '' +
+ '
';
+
+ let selectAllHtml =
+ '' +
+ ' Alle ' +
+ '' +
+ ' Keinen ';
+
+ let issuescount = 0;
+
+ FHC_AjaxClient.ajaxCallGet(
+ 'widgets/Filters/rowNumber',
+ {
+ filterUniqueId: FHC_FilterWidget.getFilterUniqueIdPrefix()
+ },
+ {
+ successCallback: function(data, textStatus, jqXHR) {
+ if (FHC_AjaxClient.hasData(data))
+ {
+ issuescount = FHC_AjaxClient.getData(data);
+
+ if (issuescount > 0)
+ {
+ var countHtml = issuescount + " Fehler";
+
+ // Count Records after Filtering
+ $("#filterTableDataset").bind("filterEnd", function() {
+ var cnt = $("#filterTableDataset tr:visible").length - 2;
+ $(".filterTableDatasetCntFiltered").html(cnt + ' / ');
+ });
+
+ $("#datasetActionsTop, #datasetActionsBottom").append(
+ ""+
+ "
" + selectAllHtml + "
"+
+ "
" + auswahlStatus + "
"+
+ "
" +
+ "" +
+ countHtml + "
"+
+ "
"+
+ ""+
+ "
"+
+ ""
+ );
+ $("#datasetActionsBottom").append("
");
+
+ IssuesDataset.setTableActions();
+ }
+ }
+ },
+ errorCallback: function(jqXHR, textStatus, errorThrown) {
+ FHC_DialogLib.alertError(textStatus);
+ }
+ }
+ );
+ },
+
+ /**
+ * sets functionality for the actions above and beneath the person table
+ */
+ setTableActions: function()
+ {
+ $(".setStatus").click(function()
+ {
+ let status_kurzbz = $(".auswahlStatus").val();
+ let issue_ids_sel = $("#filterTableDataset input:checked[name=issue_id\\[\\]]");
+
+ if(status_kurzbz.length <= 0)
+ return FHC_DialogLib.alertInfo("Bitte wählen Sie den Status aus.");
+
+ if(issue_ids_sel.length <= 0)
+ return FHC_DialogLib.alertInfo("Bitte wählen Sie die Fehler aus.");
+
+ let issue_ids = [];
+
+ for (let i = 0; i < issue_ids_sel.length; i++)
+ {
+ issue_ids.push($(issue_ids_sel[i]).val());
+ }
+
+ FHC_AjaxClient.ajaxCallPost(
+ 'system/issues/Issues/changeIssueStatus',
+ {
+ "issue_ids": issue_ids,
+ "status_kurzbz": status_kurzbz
+ },
+ {
+ successCallback: function(data, textStatus, jqXHR) {
+ if (FHC_AjaxClient.isError(data))
+ FHC_DialogLib.alertError("Fehler beim Status Ändern: " + FHC_AjaxClient.getError(data));
+ else if (FHC_AjaxClient.hasData(data))
+ {
+ FHC_FilterWidget.reloadDataset();
+ FHC_DialogLib.alertSuccess(FHC_AjaxClient.getData(data));
+ }
+ else
+ FHC_DialogLib.alertError("Unbekannter Fehler beim Status Ändern");
+ },
+ errorCallback: function(jqXHR, textStatus, errorThrown) {
+ FHC_DialogLib.alertError("Fehler beim Status Ändern: " + textStatus);
+ }
+ }
+ );
+ }
+ );
+
+ $(".selectAll").click(function()
+ {
+ //select only trs if not filtered by tablesorter
+ var trs = $("#filterTableDataset tbody tr").not(".filtered");
+ trs.find("input[name=issue_id\\[\\]]").prop("checked", true);
+ }
+ );
+
+ $(".unselectAll").click(function()
+ {
+ var trs = $("#filterTableDataset tbody tr").not(".filtered");
+ trs.find("input[name=issue_id\\[\\]]").prop("checked", false);
+ }
+ );
+ }
+};
+
+/**
+ * When JQuery is up
+ */
+$(document).ready(function() {
+
+ IssuesDataset.appendTableActionsHtml();
+
+});
diff --git a/system/dbupdate_3.3.php b/system/dbupdate_3.3.php
index 415c00e65..7707a22a5 100644
--- a/system/dbupdate_3.3.php
+++ b/system/dbupdate_3.3.php
@@ -5076,67 +5076,291 @@ if (!$result = @$db->db_query("SELECT foerderrelevant, standort_code FROM public
echo '
public.tbl_prestudent: Neue Spalten foerderrelevant, standort_code hinzugefuegt.';
}
-// Add table issues
-if(!$result = @$db->db_query("SELECT 1 FROM system.tbl_issues LIMIT 1;"))
+// App 'dvuh' hinzufügen
+if($result = $db->db_query("SELECT 1 FROM system.tbl_app WHERE app='dvuh'"))
{
- $qry = "CREATE TABLE system.tbl_issues (
- id integer NOT NULL,
- app character varying(32),
- inhalt text,
- datum timestamp without time zone NOT NULL,
- verarbeitetvon character varying(32),
- verarbeitetamum timestamp without time zone,
- fehlercode character varying(64) NOT NULL,
- person_id integer,
- oe_kurzbz character varying(32),
- status character varying(32) NOT NULL,
- schweregrad character varying(32) NOT NULL,
- insertvon character varying(32),
- insertamum timestamp without time zone DEFAULT now(),
- updatevon character varying(32),
- updateamum timestamp without time zone
+ if($db->db_num_rows($result)==0)
+ {
+ $qry = "INSERT INTO system.tbl_app(app) VALUES('dvuh');";
+
+ if(!$db->db_query($qry))
+ echo 'App: '.$db->db_last_error().'
';
+ else
+ echo ' Neue App dvuh in system.tbl_app hinzugefügt
';
+ }
+}
+
+// Add table issue_status
+if(!$result = @$db->db_query("SELECT 1 FROM system.tbl_issue_status LIMIT 1;"))
+{
+ $qry = "CREATE TABLE system.tbl_issue_status (
+ status_kurzbz character varying(32),
+ bezeichnung_mehrsprachig varchar(32)[]
+ );
+
+ COMMENT ON TABLE system.tbl_issue_status IS 'Tabelle zur Pflege von Bearbeitungsstatus von issues.';
+
+ ALTER TABLE system.tbl_issue_status ADD CONSTRAINT pk_tbl_issue_status PRIMARY KEY (status_kurzbz);
+
+ INSERT INTO system.tbl_issue_status (status_kurzbz, bezeichnung_mehrsprachig) VALUES('new', '{\"neu\",\"new\"}');
+ INSERT INTO system.tbl_issue_status (status_kurzbz, bezeichnung_mehrsprachig) VALUES('inProgress', '{\"in Bearbeitung\",\"in progress\"}');
+ INSERT INTO system.tbl_issue_status (status_kurzbz, bezeichnung_mehrsprachig) VALUES('resolved', '{\"behoben\",\"resolved\"}');";
+
+ if(!$db->db_query($qry))
+ echo 'system.tbl_issue_status: '.$db->db_last_error().'
';
+ else
+ echo '
system.tbl_issue_status: Tabelle hinzugefuegt';
+
+ // GRANT SELECT ON TABLE bis.tbl_bisstandort TO web;
+ $qry = 'GRANT SELECT ON TABLE system.tbl_issue_status TO web;';
+ if (!$db->db_query($qry))
+ echo 'system.tbl_issue_status '.$db->db_last_error().'
';
+ else
+ echo '
Granted privileges to web on system.tbl_issue_status';
+
+ // GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE bis.tbl_issue_status TO vilesci;
+ $qry = 'GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE system.tbl_issue_status TO vilesci;';
+ if (!$db->db_query($qry))
+ echo 'system.tbl_issue_status '.$db->db_last_error().'
';
+ else
+ echo '
Granted privileges to vilesci on system.tbl_issue_status';
+}
+
+// Add table fehlertyp
+if(!$result = @$db->db_query("SELECT 1 FROM system.tbl_fehlertyp LIMIT 1;"))
+{
+ $qry = "CREATE TABLE system.tbl_fehlertyp (
+ fehlertyp_kurzbz character varying(32),
+ bezeichnung_mehrsprachig varchar(32)[]
);
- COMMENT ON TABLE system.tbl_issues IS 'Tabelle zur Verfolgung von Problemen/Fehlern von verschiedenen Systemen';
- COMMENT ON COLUMN system.tbl_issues.id IS 'Primärschlüssel';
- COMMENT ON COLUMN system.tbl_issues.app IS 'Ursprungsapp des Problems';
- COMMENT ON COLUMN system.tbl_issues.inhalt IS 'Beschreibungstext, Fehlertext';
- COMMENT ON COLUMN system.tbl_issues.datum IS 'Tag und Zeit des Auftritts des Problems';
- COMMENT ON COLUMN system.tbl_issues.verarbeitetvon IS 'uid des Nutzers, der das Problem verarbeitet hat';
- COMMENT ON COLUMN system.tbl_issues.verarbeitetamum IS 'Tag und Zeit der Problemverarbeitung';
- COMMENT ON COLUMN system.tbl_issues.fehlercode IS 'Identifikationscode des Problems/Fehlers, kann von anderem System kommen oder eigens definiert sein';
- COMMENT ON COLUMN system.tbl_issues.person_id IS 'Id der betreffenden Person';
- COMMENT ON COLUMN system.tbl_issues.oe_kurzbz IS 'Betroffene Organisationseinheit';
- COMMENT ON COLUMN system.tbl_issues.status IS 'Verarbeitsungsstatus';
+ COMMENT ON TABLE system.tbl_fehlertyp IS 'Tabelle mit fehlertyp für tbl_fehler';
+
+ ALTER TABLE system.tbl_fehlertyp ADD CONSTRAINT pk_tbl_fehlertyp PRIMARY KEY (fehlertyp_kurzbz);
- CREATE SEQUENCE system.seq_issues_id
+ INSERT INTO system.tbl_fehlertyp (fehlertyp_kurzbz, bezeichnung_mehrsprachig) VALUES('warning', '{\"warnung\",\"warning\"}');
+ INSERT INTO system.tbl_fehlertyp (fehlertyp_kurzbz, bezeichnung_mehrsprachig) VALUES('error', '{\"fehler\",\"error\"}');
+ INSERT INTO system.tbl_fehlertyp (fehlertyp_kurzbz, bezeichnung_mehrsprachig) VALUES('info', '{\"info\",\"info\"}');";
+
+ if(!$db->db_query($qry))
+ echo 'system.tbl_fehlertyp: '.$db->db_last_error().'
';
+ else
+ echo '
system.tbl_fehlertyp: Tabelle hinzugefuegt';
+
+ // GRANT SELECT ON TABLE bis.tbl_bisstandort TO web;
+ $qry = 'GRANT SELECT ON TABLE system.tbl_fehlertyp TO web;';
+ if (!$db->db_query($qry))
+ echo 'system.tbl_fehlertyp '.$db->db_last_error().'
';
+ else
+ echo '
Granted privileges to web on system.tbl_fehlertyp';
+
+ // GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE bis.tbl_bisstandort TO vilesci;
+ $qry = 'GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE system.tbl_fehlertyp TO vilesci;';
+ if (!$db->db_query($qry))
+ echo 'system.tbl_fehlertyp '.$db->db_last_error().'
';
+ else
+ echo '
Granted privileges to vilesci on system.tbl_fehlertyp';
+}
+
+// Add table fehler
+if(!$result = @$db->db_query("SELECT 1 FROM system.tbl_fehler LIMIT 1;"))
+{
+ $qry = "CREATE TABLE system.tbl_fehler (
+ fehlercode character varying(64),
+ fehler_kurzbz character varying(64) UNIQUE,
+ fehlercode_extern character varying(64),
+ fehlertext text,
+ fehlertyp_kurzbz character varying(32) NOT NULL,
+ app character varying(32) NOT NULL
+ );
+
+ COMMENT ON TABLE system.tbl_fehler IS 'Tabelle zur Pflege von Fehlerfällen';
+ COMMENT ON COLUMN system.tbl_fehler.fehlercode IS 'Eindeutiger interner Fehlercode';
+ COMMENT ON COLUMN system.tbl_fehler.fehler_kurzbz IS 'Eindeutige Kurzbezeichnung für den Fehler';
+ COMMENT ON COLUMN system.tbl_fehler.fehlercode_extern IS 'Code für von vordefinierte, von externen Systemen produzierte Fehler';
+ COMMENT ON COLUMN system.tbl_fehler.fehlertext IS 'Interner, eigens definierter Fehlertext mit Platzhaltern für Parameter';
+ COMMENT ON COLUMN system.tbl_fehler.fehlertyp_kurzbz IS 'Typ bzw Schweregrad (z.B. warnung, fehler)';
+ COMMENT ON COLUMN system.tbl_fehler.app IS 'Ursprungsapp des Fehlers';
+
+ ALTER TABLE system.tbl_fehler ADD CONSTRAINT pk_tbl_fehler PRIMARY KEY (fehlercode);
+ ALTER TABLE system.tbl_fehler ADD CONSTRAINT fk_tbl_fehler_fehlertyp_kurzbz FOREIGN KEY (fehlertyp_kurzbz) REFERENCES system.tbl_fehlertyp(fehlertyp_kurzbz) ON UPDATE CASCADE ON DELETE RESTRICT;
+ ALTER TABLE system.tbl_fehler ADD CONSTRAINT fk_tbl_fehler_app FOREIGN KEY (app) REFERENCES system.tbl_app(app) ON UPDATE CASCADE ON DELETE RESTRICT;
+ ALTER TABLE system.tbl_fehler ADD CONSTRAINT uk_tbl_fehler_fehlercode_fehler_kurzbz UNIQUE (fehlercode, fehler_kurzbz); -- for upsert ON CONFLICT
+ ALTER TABLE system.tbl_fehler ADD CONSTRAINT uk_tbl_fehler_fehlercode_extern_app UNIQUE (fehlercode_extern, app); -- for recognizing external errors
+
+ INSERT INTO system.tbl_fehler (fehlercode, fehlertext, fehlertyp_kurzbz, app) VALUES ('UNKNOWN_ERROR', 'Fehler ist aufgetreten', 'error', 'core');
+ ";
+
+
+ if(!$db->db_query($qry))
+ echo 'system.tbl_fehler: '.$db->db_last_error().'
';
+ else
+ echo '
system.tbl_fehler: Tabelle hinzugefuegt';
+
+ // GRANT SELECT ON TABLE bis.tbl_issue TO web;
+ $qry = 'GRANT SELECT, UPDATE ON TABLE system.tbl_fehler TO web;';
+ if (!$db->db_query($qry))
+ echo 'system.tbl_fehler '.$db->db_last_error().'
';
+ else
+ echo '
Granted privileges to web on system.tbl_fehler';
+
+ // GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE bis.tbl_issue TO vilesci;
+ $qry = 'GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE system.tbl_fehler TO vilesci;';
+ if (!$db->db_query($qry))
+ echo 'system.tbl_fehler '.$db->db_last_error().'
';
+ else
+ echo '
Granted privileges to vilesci on system.tbl_fehler';
+}
+
+// Add table fehler_zustaendigkeiten
+if(!$result = @$db->db_query("SELECT 1 FROM system.tbl_fehler_zustaendigkeiten LIMIT 1;"))
+{
+ $qry = "CREATE TABLE system.tbl_fehler_zustaendigkeiten (
+ fehlerzustaendigkeiten_id character varying(64) NOT NULL,
+ fehlercode character varying(64),
+ person_id integer,
+ oe_kurzbz character varying(32),
+ funktion_kurzbz character varying(16)
+ );
+
+ COMMENT ON TABLE system.tbl_fehler_zustaendigkeiten IS 'Tabelle zum Hinzufügen für Zuständigkeiten für einzelne Fehler';
+ COMMENT ON COLUMN system.tbl_fehler_zustaendigkeiten.fehlercode IS 'Eindeutiger interner Fehlercode';
+ COMMENT ON COLUMN system.tbl_fehler_zustaendigkeiten.person_id IS 'person_id der zuständigen Person';
+ COMMENT ON COLUMN system.tbl_fehler_zustaendigkeiten.oe_kurzbz IS 'Zuständigkeit für einen fehlercode für eine ganze OE';
+ COMMENT ON COLUMN system.tbl_fehler_zustaendigkeiten.funktion_kurzbz IS 'Zusätzliche Einschränkung der OE Zuständigkeit nach funktion';
+
+
+ CREATE SEQUENCE system.seq_fehlerzustaendigkeiten_id
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
- ALTER TABLE ONLY system.tbl_issues ALTER COLUMN id SET DEFAULT nextval('system.seq_jobsqueue_jobid'::regclass);
+ ALTER TABLE ONLY system.tbl_fehler_zustaendigkeiten ALTER COLUMN fehlerzustaendigkeiten_id SET DEFAULT nextval('system.seq_fehlerzustaendigkeiten_id'::regclass);
- GRANT SELECT, UPDATE ON SEQUENCE system.seq_issues_id TO vilesci;
- GRANT SELECT, UPDATE ON SEQUENCE system.seq_issues_id TO fhcomplete;
-
- ALTER TABLE system.tbl_issues ADD CONSTRAINT pk_issues PRIMARY KEY (id);
-
- ALTER TABLE system.tbl_issues ADD CONSTRAINT fk_issues_app FOREIGN KEY (app) REFERENCES system.tbl_app(app) ON UPDATE CASCADE ON DELETE RESTRICT;
- ALTER TABLE system.tbl_issues ADD CONSTRAINT fk_issues_verarbeitetvon FOREIGN KEY (verarbeitetvon) REFERENCES public.tbl_benutzer(uid) ON UPDATE CASCADE ON DELETE RESTRICT;
- ALTER TABLE system.tbl_issues ADD CONSTRAINT fk_issues_person_id FOREIGN KEY (person_id) REFERENCES public.tbl_person(person_id) ON UPDATE CASCADE ON DELETE RESTRICT;
- ALTER TABLE system.tbl_issues ADD CONSTRAINT fk_issues_oe_kurzbz FOREIGN KEY (oe_kurzbz) REFERENCES public.tbl_organisationseinheit(oe_kurzbz) ON UPDATE CASCADE ON DELETE RESTRICT;
-
- ALTER TABLE system.tbl_issues ADD CONSTRAINT chk_issues_person_id_oe_kurzbz CHECK (person_id IS NOT NULL OR oe_kurzbz IS NOT NULL);
+ GRANT SELECT, UPDATE ON SEQUENCE system.seq_fehlerzustaendigkeiten_id TO vilesci;
+ GRANT SELECT, UPDATE ON SEQUENCE system.seq_fehlerzustaendigkeiten_id TO fhcomplete;
- CREATE INDEX idx_tbl_issues_person_id ON system.tbl_issues USING btree (person_id);
- CREATE INDEX idx_tbl_issues_oe_kurzbz ON system.tbl_issues USING btree (oe_kurzbz);";
+ ALTER TABLE system.tbl_fehler_zustaendigkeiten ADD CONSTRAINT pk_tbl_fehler_zustaendigkeiten PRIMARY KEY (fehlerzustaendigkeiten_id);
+ ALTER TABLE system.tbl_fehler_zustaendigkeiten ADD CONSTRAINT fk_tbl_fehler_zustaendigkeiten_fehlercode FOREIGN KEY (fehlercode) REFERENCES system.tbl_fehler(fehlercode) ON UPDATE CASCADE ON DELETE RESTRICT;
+ ALTER TABLE system.tbl_fehler_zustaendigkeiten ADD CONSTRAINT fk_tbl_fehler_zustaendigkeiten_person_id FOREIGN KEY (person_id) REFERENCES public.tbl_person(person_id) ON UPDATE CASCADE ON DELETE RESTRICT;
+ ALTER TABLE system.tbl_fehler_zustaendigkeiten ADD CONSTRAINT fk_tbl_fehler_zustaendigkeiten_oe_kurzbz FOREIGN KEY (oe_kurzbz) REFERENCES public.tbl_organisationseinheit(oe_kurzbz) ON UPDATE CASCADE ON DELETE RESTRICT;
+ ALTER TABLE system.tbl_fehler_zustaendigkeiten ADD CONSTRAINT fk_tbl_fehler_zustaendigkeiten_funktion_kurzbz FOREIGN KEY (funktion_kurzbz) REFERENCES public.tbl_funktion(funktion_kurzbz) ON UPDATE CASCADE ON DELETE RESTRICT;
+
+ ALTER TABLE system.tbl_fehler_zustaendigkeiten ADD CONSTRAINT uk_tbl_fehler_zustaendigkeiten_fehlercode_person_id UNIQUE (fehlercode, person_id);
+ ALTER TABLE system.tbl_fehler_zustaendigkeiten ADD CONSTRAINT uk_tbl_fehler_zustaendigkeiten_fehlercode_oe_kurzbz_funktion_kurzbz UNIQUE (fehlercode, oe_kurzbz, funktion_kurzbz);";
if(!$db->db_query($qry))
- echo 'system.tbl_issues: '.$db->db_last_error().'
';
+ echo 'system.tbl_fehler_zustaendigkeiten: '.$db->db_last_error().'
';
else
- echo ' system.tbl_issues: Tabelle hinzugefuegt
';
+ echo '
system.tbl_fehler_zustaendigkeiten: Tabelle hinzugefuegt';
+
+ // GRANT SELECT ON TABLE bis.tbl_issue TO web;
+ $qry = 'GRANT SELECT ON TABLE system.tbl_fehler_zustaendigkeiten TO web;';
+ if (!$db->db_query($qry))
+ echo 'system.tbl_fehler_zustaendigkeiten '.$db->db_last_error().'
';
+ else
+ echo '
Granted privileges to web on system.tbl_fehler_zustaendigkeiten';
+
+ // GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE bis.tbl_issue TO vilesci;
+ $qry = 'GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE system.tbl_fehler_zustaendigkeiten TO vilesci;';
+ if (!$db->db_query($qry))
+ echo 'system.tbl_fehler_zustaendigkeiten '.$db->db_last_error().'
';
+ else
+ echo '
Granted privileges to vilesci on system.tbl_fehler_zustaendigkeiten';
+}
+
+// Add table issue
+if(!$result = @$db->db_query("SELECT 1 FROM system.tbl_issue LIMIT 1;"))
+{
+ $qry = "CREATE TABLE system.tbl_issue (
+ issue_id integer,
+ fehlercode character varying(64) NOT NULL,
+ inhalt text,
+ fehlercode_extern character varying(64),
+ inhalt_extern text,
+ person_id integer,
+ oe_kurzbz character varying(32),
+ datum timestamp without time zone NOT NULL,
+ verarbeitetvon character varying(32),
+ verarbeitetamum timestamp without time zone,
+ status_kurzbz character varying(32) NOT NULL,
+ insertvon character varying(32),
+ insertamum timestamp without time zone DEFAULT now(),
+ updatevon character varying(32),
+ updateamum timestamp without time zone
+ );
+
+ COMMENT ON TABLE system.tbl_issue IS 'Tabelle zur Verfolgung von Problemen/Fehlern von verschiedenen Systemen';
+ COMMENT ON COLUMN system.tbl_issue.issue_id IS 'Primärschlüssel';
+ COMMENT ON COLUMN system.tbl_issue.fehlercode IS 'Identifikationscode des Problems/Fehlers, kann von anderem System kommen oder eigens definiert sein';
+ COMMENT ON COLUMN system.tbl_issue.inhalt IS 'Fehlertext';
+ COMMENT ON COLUMN system.tbl_issue.fehlercode_extern IS 'Externer, von App geschriebener Fehlercode. Zum Auseinanderhalten der externen Fehler, die nicht in tbl_fehler definiert sind.';
+ COMMENT ON COLUMN system.tbl_issue.inhalt_extern IS 'von externem System kommender Fehlermeldungstext';
+ COMMENT ON COLUMN system.tbl_issue.datum IS 'Tag und Zeit des Auftritts des Problems';
+ COMMENT ON COLUMN system.tbl_issue.verarbeitetvon IS 'uid des Nutzers, der das Problem verarbeitet hat';
+ COMMENT ON COLUMN system.tbl_issue.verarbeitetamum IS 'Tag und Zeit der Problemverarbeitung';
+ COMMENT ON COLUMN system.tbl_issue.person_id IS 'Id der Person, für welche das issue besteht';
+ COMMENT ON COLUMN system.tbl_issue.oe_kurzbz IS 'Betroffene Organisationseinheit';
+ COMMENT ON COLUMN system.tbl_issue.status_kurzbz IS 'Verarbeitsungsstatus';
+
+ CREATE SEQUENCE system.seq_issue_id
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ ALTER TABLE ONLY system.tbl_issue ALTER COLUMN issue_id SET DEFAULT nextval('system.seq_issue_id'::regclass);
+
+ GRANT SELECT, UPDATE ON SEQUENCE system.seq_issue_id TO vilesci;
+ GRANT SELECT, UPDATE ON SEQUENCE system.seq_issue_id TO fhcomplete;
+
+ ALTER TABLE system.tbl_issue ADD CONSTRAINT pk_tbl_issue PRIMARY KEY (issue_id);
+
+ ALTER TABLE system.tbl_issue ADD CONSTRAINT fk_tbl_issue_fehlercode FOREIGN KEY (fehlercode) REFERENCES system.tbl_fehler(fehlercode) ON UPDATE CASCADE ON DELETE RESTRICT;
+ ALTER TABLE system.tbl_issue ADD CONSTRAINT fk_tbl_issue_verarbeitetvon FOREIGN KEY (verarbeitetvon) REFERENCES public.tbl_benutzer(uid) ON UPDATE CASCADE ON DELETE RESTRICT;
+ ALTER TABLE system.tbl_issue ADD CONSTRAINT fk_tbl_issue_person_id FOREIGN KEY (person_id) REFERENCES public.tbl_person(person_id) ON UPDATE CASCADE ON DELETE RESTRICT;
+ ALTER TABLE system.tbl_issue ADD CONSTRAINT fk_tbl_issue_oe_kurzbz FOREIGN KEY (oe_kurzbz) REFERENCES public.tbl_organisationseinheit(oe_kurzbz) ON UPDATE CASCADE ON DELETE RESTRICT;
+
+ ALTER TABLE system.tbl_issue ADD CONSTRAINT chk_tbl_issue_person_id_oe_kurzbz CHECK (person_id IS NOT NULL OR oe_kurzbz IS NOT NULL);
+
+ CREATE INDEX idx_tbl_issue_person_id ON system.tbl_issue USING btree (person_id);
+ CREATE INDEX idx_tbl_issue_oe_kurzbz ON system.tbl_issue USING btree (oe_kurzbz);";
+
+ if(!$db->db_query($qry))
+ echo 'system.tbl_issue: '.$db->db_last_error().'
';
+ else
+ echo '
system.tbl_issue: Tabelle hinzugefuegt';
+
+ // GRANT SELECT ON TABLE bis.tbl_issue TO web;
+ $qry = 'GRANT SELECT, UPDATE ON TABLE system.tbl_issue TO web;';
+ if (!$db->db_query($qry))
+ echo 'system.tbl_issue '.$db->db_last_error().'
';
+ else
+ echo '
Granted privileges to web on system.tbl_issue';
+
+ // GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE bis.tbl_issue TO vilesci;
+ $qry = 'GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE system.tbl_issue TO vilesci;';
+ if (!$db->db_query($qry))
+ echo 'system.tbl_issue '.$db->db_last_error().'
';
+ else
+ echo '
Granted privileges to vilesci on system.tbl_issue';
+}
+
+// Add permission to manage issues
+if($result = @$db->db_query("SELECT 1 FROM system.tbl_berechtigung WHERE berechtigung_kurzbz = 'system/issues_verwalten';"))
+{
+ if($db->db_num_rows($result) == 0)
+ {
+ $qry = "INSERT INTO system.tbl_berechtigung(berechtigung_kurzbz, beschreibung) VALUES('system/issues_verwalten', 'Issues verwalten');";
+
+ if(!$db->db_query($qry))
+ echo 'system.tbl_berechtigung '.$db->db_last_error().'
';
+ else
+ echo '
system.tbl_berechtigung: Added permission for system/issues_verwalten';
+ }
}
// *** Pruefung und hinzufuegen der neuen Attribute und Tabellen
@@ -5400,7 +5624,11 @@ $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_issues" => array("id","app","inhalt","datum","verarbeitetvon","verarbeitetamum","fehlercode","person_id","oe_kurzbz","status","insertvon","insertamum","updatevon","updateamum"),
+ "system.tbl_fehler" => array("fehlercode","fehler_kurzbz","fehlercode_extern","fehlertext","fehlertyp_kurzbz","app"),
+ "system.tbl_fehlertyp" => array("fehlertyp_kurzbz","bezeichnung_mehrsprachig"),
+ "system.tbl_fehler_zustaendigkeiten" => array("fehlerzustaendigkeiten_id","fehlercode","person_id","oe_kurzbz","funktion_kurzbz"),
+ "system.tbl_issue" => array("issue_id","fehlercode","fehlercode_extern","inhalt","inhalt_extern","person_id","oe_kurzbz","datum","verarbeitetvon","verarbeitetamum","status_kurzbz","insertvon","insertamum","updatevon","updateamum"),
+ "system.tbl_issue_status" => array("status_kurzbz","bezeichnung_mehrsprachig"),
"system.tbl_log" => array("log_id","person_id","zeitpunkt","app","oe_kurzbz","logtype_kurzbz","logdata","insertvon","taetigkeit_kurzbz"),
"system.tbl_logtype" => array("logtype_kurzbz", "data_schema"),
"system.tbl_filters" => array("filter_id","app","dataset_name","filter_kurzbz","person_id","description","sort","default_filter","filter","oe_kurzbz","statistik_kurzbz"),
diff --git a/system/filtersupdate.php b/system/filtersupdate.php
index 77e0c3e3a..037d303eb 100644
--- a/system/filtersupdate.php
+++ b/system/filtersupdate.php
@@ -856,7 +856,42 @@ $filters = array(
}
',
'oe_kurzbz' => null,
- )
+ ),
+ array(
+ 'app' => 'core',
+ 'dataset_name' => 'issues',
+ 'filter_kurzbz' => 'last7Days',
+ 'description' => '{Fehler letzte 7 Tage}',
+ 'sort' => 1,
+ 'default_filter' => true,
+ 'filter' => '
+ {
+ "name": "Alle in den letzten 7 Tagen aufgetretenen Fehler ",
+ "columns": [
+ {"name": "Fehlercode"},
+ {"name": "Fehlercode extern"},
+ {"name": "Datum"},
+ {"name": "Inhalt"},
+ {"name": "Inhalt extern"},
+ {"name": "PersonId"},
+ {"name": "OE"},
+ {"name": "Fehlertyp"},
+ {"name": "Fehlerstatus"},
+ {"name": "Verarbeitet von"},
+ {"name": "Verarbeitet am"}
+ ],
+ "filters": [
+ {
+ "name": "Datum",
+ "operation": "lt",
+ "condition": "7",
+ "option": "days"
+ }
+ ]
+ }
+ ',
+ 'oe_kurzbz' => null,
+ ),
);
// Loop through the filters array