From a924c9d2bbda7ab2ef7d45ee8d9c7c36b2bb2cb9 Mon Sep 17 00:00:00 2001 From: Harald Bamberger Date: Wed, 29 May 2024 11:49:11 +0200 Subject: [PATCH 1/8] backport Betriebsmittel Component from feature-30660/FHC4_StudierendenGUI_Prototyp Branch --- .../v1/betriebsmittel/Betriebsmittel.php | 324 ++++++++++++ .../Betriebsmittel/Betriebsmittel.js | 462 ++++++++++++++++++ 2 files changed, 786 insertions(+) create mode 100644 application/controllers/api/frontend/v1/betriebsmittel/Betriebsmittel.php create mode 100644 public/js/components/Betriebsmittel/Betriebsmittel.js diff --git a/application/controllers/api/frontend/v1/betriebsmittel/Betriebsmittel.php b/application/controllers/api/frontend/v1/betriebsmittel/Betriebsmittel.php new file mode 100644 index 000000000..cb6c4a3aa --- /dev/null +++ b/application/controllers/api/frontend/v1/betriebsmittel/Betriebsmittel.php @@ -0,0 +1,324 @@ + ['admin:r', 'assistenz:r'], + 'addNewBetriebsmittel' => ['admin:r', 'assistenz:r'], + 'updateBetriebsmittel' => ['admin:r', 'assistenz:r'], + 'loadBetriebsmittel' => ['admin:r', 'assistenz:r'], + 'deleteBetriebsmittel' => ['admin:r', 'assistenz:r'], + 'getTypenBetriebsmittel' => ['admin:r', 'assistenz:r'], + 'loadInventarliste' => ['admin:r', 'assistenz:r'] + ]); + + //Load Models + $this->load->model('ressource/Betriebsmittel_model', 'BetriebsmittelModel'); + $this->load->model('ressource/Betriebsmittelperson_model', 'BetriebsmittelpersonModel'); + + // Load Libraries + $this->load->library('VariableLib', ['uid' => getAuthUID()]); + $this->load->library('form_validation'); + + // Load language phrases + $this->loadPhrases([ + 'ui' + ]); + } + + public function getAllBetriebsmittel($uid, $person_id) + { + //uid + //$result = $this->BetriebsmittelpersonModel->getBetriebsmittelData($uid, 'uid'); + + //person_id + $result = $this->BetriebsmittelpersonModel->getBetriebsmittelData($person_id, 'person'); + + if (isError($result)) + { + $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); + } + + $this->terminateWithSuccess((getData($result) ?: [])); + } + + public function addNewBetriebsmittel() + { + $_POST = json_decode(utf8_encode($this->input->raw_input_stream), true); + + $this->form_validation->set_rules('kaution', 'Kaution', 'numeric', [ + 'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'Kaution']) + ]); + + $this->form_validation->set_rules('betriebsmitteltyp', 'TYP', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Typ']) + ]); + + $this->form_validation->set_rules('ausgegebenam', 'Ausgegeben am', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Ausgegeben am']) + ]); + + + if ($this->form_validation->run() == false) + { + $this->terminateWithValidationErrors($this->form_validation->error_array()); + } + + $uid_user = getAuthUID(); + $betriebsmitteltyp = $this->input->post('betriebsmitteltyp'); + $nummer = $this->input->post('nummer'); + $nummer2 = $this->input->post('nummer2'); + $inventarData = $this->input->post('inventarData'); + $beschreibung = $this->input->post('beschreibung'); + $kaution = $this->input->post('kaution'); + $anmerkung = $this->input->post('anmerkung'); + $ausgegebenam = $this->input->post('ausgegebenam'); + $retouram = $this->input->post('retouram'); + $person_id = $this->input->post('person_id'); + $uid = $this->input->post('uid'); + + if($inventarData) + { + $betriebsmitteltyp = $inventarData['betriebsmitteltyp']; + $betriebsmittel_id = $inventarData['betriebsmittel_id']; + } + + if($betriebsmitteltyp == 'Zutrittskarte' && !$nummer) + { + return $this->terminateWithError($this->p->t('wawi', 'error_zutrittskarteOhneNummer'), self::ERROR_TYPE_GENERAL); + } + + if($retouram && $retouram < $ausgegebenam) + { + return $this->terminateWithError($this->p->t('wawi', 'error_retourdatumVorAusgabe'), self::ERROR_TYPE_GENERAL); + } + + if($betriebsmitteltyp == "Inventar" && !($inventarData['inventarnummer'])) + { + return $this->terminateWithError($this->p->t('wawi', 'error_inventarWaehlen'), self::ERROR_TYPE_GENERAL); + } + + + // Start DB transaction + $this->db->trans_begin(); + + $betriebsmitteltyp = utf8_decode($betriebsmitteltyp); + + if(!$inventarData) + { + $result = $this->BetriebsmittelModel->insert( + [ + 'betriebsmitteltyp' => $betriebsmitteltyp, + 'nummer' => $nummer, + 'nummer2' => $nummer2, + 'beschreibung' => $beschreibung, + 'anmerkung' => $anmerkung, + 'insertvon' => $uid_user, + 'insertamum' => date('c') + ] + ); + if($this->db->trans_status() === false || isError($result)) + { + $this->db->trans_rollback(); + return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); + } + $betriebsmittel_id = $result->retval; + } + + $result = $this->BetriebsmittelpersonModel->insert( + [ + 'betriebsmittel_id' => $betriebsmittel_id, + 'person_id' => $person_id, + 'kaution' => $kaution, + 'anmerkung' => $anmerkung, + 'ausgegebenam' => $ausgegebenam, + 'retouram ' => $retouram, + 'insertvon' => $uid_user, + 'insertamum' => date('c'), + 'uid' => $uid + ] + ); + + if($this->db->trans_status() === false || isError($result)) + { + $this->db->trans_rollback(); + return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); + } + + $this->db->trans_commit(); + return $this->terminateWithSuccess(true); + } + + public function updateBetriebsmittel() + { + $_POST = json_decode(utf8_encode($this->input->raw_input_stream), true); + + $uid_user = getAuthUID(); + + $betriebsmittel_id = $this->input->post('betriebsmittel_id'); + $betriebsmittelperson_id = $this->input->post('betriebsmittelperson_id'); + $betriebsmitteltyp = $this->input->post('betriebsmitteltyp'); + $nummer = $this->input->post('nummer'); + $nummer2 = $this->input->post('nummer2'); + $beschreibung = $this->input->post('beschreibung'); + $kaution = $this->input->post('kaution'); + $anmerkung = $this->input->post('anmerkung'); + $ausgegebenam = $this->input->post('ausgegebenam'); + $retouram = $this->input->post('retouram'); + $person_id = $this->input->post('person_id'); + $uid = $this->input->post('uid'); + + $this->form_validation->set_rules('kaution', 'Kaution', 'numeric', [ + 'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'Kaution']) + ]); + + $this->form_validation->set_rules('betriebsmitteltyp', 'TYP', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Typ']) + ]); + + $this->form_validation->set_rules('ausgegebenam', 'Ausgegeben am', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Ausgegeben am']) + ]); + + + if ($this->form_validation->run() == false) + { + $this->terminateWithValidationErrors($this->form_validation->error_array()); + } + + if($betriebsmitteltyp == 'Zutrittskarte' && !$nummer) + { + return $this->terminateWithError($this->p->t('wawi', 'error_zutrittskarteOhneNummer'), self::ERROR_TYPE_GENERAL); + } + + if($retouram && $retouram < $ausgegebenam) + { + return $this->terminateWithError($this->p->t('wawi', 'error_retourdatumVorAusgabe'), self::ERROR_TYPE_GENERAL); + } + + + // Start DB transaction + $this->db->trans_begin(); + + $result = $this->BetriebsmittelpersonModel->update( + [ + 'betriebsmittelperson_id' => $betriebsmittelperson_id, + + ], + [ + 'person_id' => $person_id, + 'uid' => $uid, + 'kaution' => $kaution, + 'anmerkung' => $anmerkung, + 'ausgegebenam' => $ausgegebenam, + 'retouram ' => $retouram, + 'updatevon' => $uid_user, + 'updateamum' => date('c') + ] + ); + + if($this->db->trans_status() === false || isError($result)) + { + $this->db->trans_rollback(); + return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); + } + + $result = $this->BetriebsmittelModel->update( + [ + 'betriebsmittel_id' => $betriebsmittel_id + ], + [ + 'betriebsmitteltyp' => $betriebsmitteltyp, + 'nummer' => $nummer, + 'nummer2' => $nummer2, + 'beschreibung' => $beschreibung, + 'anmerkung' => $anmerkung, + 'updatevon' => $uid_user, + 'updateamum' => date('c') + ] + ); + if($this->db->trans_status() === false || isError($result)) + { + $this->db->trans_rollback(); + return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); + } + + $this->db->trans_commit(); + return $this->terminateWithSuccess(true); + } + + public function loadBetriebsmittel() + { + $_POST = json_decode(utf8_encode($this->input->raw_input_stream), true); + + $betriebsmittelperson_id = $this->input->post('betriebsmittelperson_id'); + + $result = $this->BetriebsmittelpersonModel->getBetriebsmittelData($betriebsmittelperson_id, 'betriebsmittelperson_id'); + + if (isError($result)) + { + $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); + } + + if (!hasData($result)) + { + $this->terminateWithError("no Betriebsmittelperson with ID found: " . $betriebsmittelperson_id, self::ERROR_TYPE_GENERAL); + } + + $this->terminateWithSuccess(current(getData($result))); + } + + public function deleteBetriebsmittel() + { + + $_POST = json_decode(utf8_encode($this->input->raw_input_stream), true); + + $betriebsmittelperson_id = $this->input->post('betriebsmittelperson_id'); + + $result = $this->BetriebsmittelpersonModel->delete( + array('betriebsmittelperson_id' => $betriebsmittelperson_id, + ) + ); + + if (isError($result)) + { + return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); + } + if (!hasData($result)) + { + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Betriebsmittelperson_id']), self::ERROR_TYPE_GENERAL); + } + return $this->outputJsonSuccess(current(getData($result))); + } + + public function getTypenBetriebsmittel() + { + $this->load->model('ressource/Betriebsmitteltyp_model', 'BetriebsmitteltypModel'); + + $this->BetriebsmitteltypModel->addOrder('beschreibung', 'ASC'); + $result = $this->BetriebsmitteltypModel->load(); // load All + + if (isError($result)) + { + $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); + } + return $this->terminateWithSuccess(getData($result) ?: []); + } + + public function loadInventarliste($searchString) + { + $result = $this->BetriebsmittelModel->loadInventarliste($searchString); + if (isError($result)) { + $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); + } + $this->terminateWithSuccess($result ?: []); + } +} + + diff --git a/public/js/components/Betriebsmittel/Betriebsmittel.js b/public/js/components/Betriebsmittel/Betriebsmittel.js new file mode 100644 index 000000000..05fe74c3d --- /dev/null +++ b/public/js/components/Betriebsmittel/Betriebsmittel.js @@ -0,0 +1,462 @@ +import VueDatePicker from '../vueDatepicker.js.php'; +import {CoreFilterCmpt} from "../filter/Filter.js"; +import PvAutoComplete from "../../../../index.ci.php/public/js/components/primevue/autocomplete/autocomplete.esm.min.js"; + +import BsModal from "../Bootstrap/Modal.js"; +import FormForm from '../Form/Form.js'; +import FormInput from '../Form/Input.js'; + +export default { + components: { + CoreFilterCmpt, + VueDatePicker, + BsModal, + FormForm, + FormInput, + PvAutoComplete + }, + inject: { + cisRoot: { + from: 'cisRoot' + }, + }, + props: [ + 'person_id', + 'uid' + ], + data() { + return { + tabulatorOptions: { + ajaxURL: 'api/frontend/v1/betriebsmittel/Betriebsmittel/getAllBetriebsmittel/' + this.uid + '/' + this.person_id, + ajaxRequestFunc: this.$fhcApi.get, + ajaxResponse: (url, params, response) => response.data, + columns: [ + {title: "Nummer", field: "nummer"}, + {title: "PersonId", field: "person_id", visible: false}, + {title: "Typ", field: "betriebsmitteltyp"}, + {title: "Anmerkung", field: "anmerkung", visible: false}, + {title: "Retourdatum", field: "format_retour", visible: false}, + {title: "Beschreibung", field: "beschreibung"}, + {title: "Uid", field: "uid", visible: false}, + {title: "Kaution", field: "kaution", visible: false}, + {title: "Ausgabedatum", field: "format_ausgabe"}, + {title: "Betriebsmittel_id", field: "betriebsmittel_id", visible: false}, + {title: "Betriebsmittelperson_id", field: "betriebsmittelperson_id", visible: false}, + { + title: 'Aktionen', field: 'actions', + minWidth: 150, // Ensures Action-buttons will be always fully displayed + maxWidth: 150, + formatter: (cell, formatterParams, onRendered) => { + let container = document.createElement('div'); + container.className = "d-flex gap-2"; + + let button = document.createElement('button'); + button.className = 'btn btn-outline-secondary btn-action'; + button.innerHTML = ''; + button.title = 'Übernahmebestätigung drucken'; + let cellData = cell.getData(); + button.addEventListener( + 'click', + (event) => + { + let linkToPdf = this.cisRoot + + '/content/pdfExport.php?xml=betriebsmittelperson.rdf.php&xsl=Uebernahme&id=' + cellData.betriebsmittelperson_id + '&output=pdf'; + + window.open(linkToPdf, '_blank'); + }); + container.append(button); + + button = document.createElement('button'); + button.className = 'btn btn-outline-secondary btn-action'; + button.innerHTML = ''; + button.title = 'Betriebsmittel bearbeiten'; + button.addEventListener( + 'click', + (event) => + this.actionEditBetriebsmittel(cell.getData().betriebsmittelperson_id) + ); + container.append(button); + + button = document.createElement('button'); + button.className = 'btn btn-outline-secondary btn-action'; + button.innerHTML = ''; + button.title = 'Betriebsmittel löschen'; + button.addEventListener( + 'click', + () => + this.actionDeleteBetriebsmittel(cell.getData().betriebsmittelperson_id) + ); + container.append(button); + + return container; + }, + frozen: true + }], + layout: 'fitColumns', + layoutColumnsOnNewData: false, + height: '550', + selectableRangeMode: 'click', + selectable: true + }, + tabulatorEvents: [ + { + event: 'tableBuilt', + handler: async() => { + + await this.$p.loadCategory(['wawi', 'global', 'infocenter']); + + let cm = this.$refs.table.tabulator.columnManager; + + cm.getColumnByField('nummer').component.updateDefinition({ + title: this.$p.t('wawi', 'nummer') + }); + cm.getColumnByField('anmerkung').component.updateDefinition({ + title: this.$p.t('global', 'anmerkung') + }); + cm.getColumnByField('format_retour').component.updateDefinition({ + title: this.$p.t('wawi', 'retourdatum') + }); + cm.getColumnByField('kaution').component.updateDefinition({ + title: this.$p.t('infocenter', 'kaution') + }); + cm.getColumnByField('format_ausgabe').component.updateDefinition({ + title: this.$p.t('wawi', 'ausgabedatum') + }); + + } + } + ], + betriebsmittelData: {}, + betriebsmittelperson_id : null, + listBetriebsmitteltyp: [], + formData: { + ausgegebenam : this.getDefaultDate(), + betriebsmitteltyp: 'Zutrittskarte' + }, + statusNew: true, + filteredInventar: [] + } + }, + watch: { + uid() { + this.$refs.table.tabulator.setData('api/frontend/v1/betriebsmittel/Betriebsmittel/getAllBetriebsmittel/' + this.uid + '/' + this.person_id); + } + }, + methods: { + actionEditBetriebsmittel(betriebsmittelperson_id) { + this.statusNew = false; + this.loadBetriebsmittel(betriebsmittelperson_id); + }, + actionNewBetriebsmittel() { + this.resetModal(); + this.statusNew = true; + this.formData.ausgegebenam = this.getDefaultDate(); + this.reload(); + }, + actionDeleteBetriebsmittel(betriebsmittelperson_id) { + this.loadBetriebsmittel(betriebsmittelperson_id).then(() => { + this.$refs.deleteBetriebsmittelModal.show(); + }); + }, + addNewBetriebsmittel() { + this.param = { + 'uid': this.uid, + 'person_id': this.person_id, + ...this.formData + }; + this.$fhcApi.post('api/frontend/v1/betriebsmittel/Betriebsmittel/addNewBetriebsmittel/', + this.param + ).then(response => { + this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successSave')); + this.resetModal(); + }).catch(this.$fhcAlert.handleSystemError) + .finally(() => { + window.scrollTo(0, 0); + this.reload(); + }); + }, + deleteBetriebsmittel(betriebsmittelperson_id) { + this.param = { + 'betriebsmittelperson_id': betriebsmittelperson_id + }; + return this.$fhcApi.post('api/frontend/v1/betriebsmittel/betriebsmittel/deleteBetriebsmittel/', + this.param) + .then( + result => { + this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successDelete')); + this.hideModal('deleteBetriebsmittelModal'); + this.resetModal(); + }) + .catch(this.$fhcAlert.handleSystemError) + .finally(() => { + window.scrollTo(0, 0); + this.reload(); + }); + }, + updateBetriebsmittel() { + this.param = { + 'uid': this.uid, + 'person_id': this.person_id, + ...this.formData + }; + this.$fhcApi.post('api/frontend/v1/betriebsmittel/Betriebsmittel/updateBetriebsmittel/', + this.param + ).then(response => { + this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successSave')); + this.resetModal(); + }).catch(this.$fhcAlert.handleSystemError) + .finally(() => { + window.scrollTo(0, 0); + this.reload(); + }); + }, + loadBetriebsmittel(betriebsmittelperson_id) { + this.resetModal(); + this.statusNew = false; + this.param = { + 'betriebsmittelperson_id': betriebsmittelperson_id + }; + return this.$fhcApi.post('api/frontend/v1/betriebsmittel/Betriebsmittel/loadBetriebsmittel/', + this.param) + .then(result => result.data) + .then(result => { + this.formData = result; + }) + .catch(this.$fhcAlert.handleSystemError); + }, + searchInventar(event) { + return this.$fhcApi + .get('api/frontend/v1/betriebsmittel/Betriebsmittel/loadInventarliste/' + event.query) + .then(result => { + this.filteredInventar = result.data.retval; + }); + }, + reload() { + this.$refs.table.reloadTable(); + }, + hideModal(modalRef) { + this.$refs[modalRef].hide(); + }, + resetModal() { + this.formData = {}; + this.formData.ausgegebenam = this.getDefaultDate(); + this.formData.retouram = null; + this.formData.betriebsmitteltyp = null; + this.formData.nummer = null; + this.formData.nummer2 = null; + this.formData.kaution = null; + this.formData.anmerkung = null; + this.formData.beschreibung = null; + this.betriebsmittelperson_id = {}; + this.statusNew = true; + }, + getDefaultDate() { + const today = new Date(); + return today; + } + }, + created(){ + this.$fhcApi + .get('api/frontend/v1/betriebsmittel/Betriebsmittel/getTypenBetriebsmittel') + .then(result => result.data) + .then(result => { + this.listBetriebsmitteltyp = result; + }) + .catch(this.$fhcAlert.handleSystemError); + }, + template: ` +
+ + + + + + + + + + +
+
+ + + + +
+ + + + + Details + +
+
+

{{$p.t('ui', 'add_betriebsmittel')}}

+

{{$p.t('ui', 'edit_betriebsmittel')}}

+
+
+ +
+ +
+ + + +
+
+ +
+ +
+ +
+
+
+ +
+ +
+
+ +
+ +
+ + +
+
+ +
+ +
+ + +
+
+ +
+ +
+ + +
+
+ +
+ +
+ + +
+
+ +
+ +
+ + +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ + +
+ +
+ +
+
+ +
+ +
+
+ +
+ + + + + + +
` +} + From 9454bde14aed361ee912e860e850a3fcd46a8bb3 Mon Sep 17 00:00:00 2001 From: Harald Bamberger Date: Wed, 29 May 2024 15:19:23 +0200 Subject: [PATCH 2/8] backport Betriebsmittel Component from feature-30660/FHC4_StudierendenGUI_Prototyp Branch --- .../models/ressource/Betriebsmittel_model.php | 20 +++++++++++++ .../ressource/Betriebsmittelperson_model.php | 29 +++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/application/models/ressource/Betriebsmittel_model.php b/application/models/ressource/Betriebsmittel_model.php index 849a9199f..69aa962c1 100644 --- a/application/models/ressource/Betriebsmittel_model.php +++ b/application/models/ressource/Betriebsmittel_model.php @@ -11,4 +11,24 @@ class Betriebsmittel_model extends DB_Model $this->dbTable = 'wawi.tbl_betriebsmittel'; $this->pk = 'betriebsmittel_id'; } + + /** + * load Liste Inventarnummern + */ + public function loadInventarliste($filter) + { + $filter = strtoLower($filter); + + $qry = " + SELECT + bm.inventarnummer, bm.betriebsmitteltyp, bm.betriebsmittel_id, CONCAT(bm.inventarnummer, ' ', bm.beschreibung) as dropdowntext + FROM + wawi.tbl_betriebsmittel bm + WHERE + upper(bm.inventarnummer) LIKE '%" .$this->db->escape_like_str($filter)."%' + OR + lower(bm.inventarnummer) LIKE '%" .$this->db->escape_like_str($filter)."%'"; + + return $this->execQuery($qry); + } } diff --git a/application/models/ressource/Betriebsmittelperson_model.php b/application/models/ressource/Betriebsmittelperson_model.php index 04878a9ad..bffa82501 100644 --- a/application/models/ressource/Betriebsmittelperson_model.php +++ b/application/models/ressource/Betriebsmittelperson_model.php @@ -96,4 +96,33 @@ class Betriebsmittelperson_model extends DB_Model return $this->loadWhere($condition); } + + public function getBetriebsmittelData($id, $type_id) + { + switch ($type_id) { + case 'person': + $cond = 'bmp.person_id'; + break; + case 'uid': + $cond = 'bmp.uid'; + break; + case 'betriebsmittelperson_id': + $cond = 'bmp.betriebsmittelperson_id'; + break; + default: + return error("ID nicht gültig"); + } + + $query = " + SELECT + bm.nummer, bmp.person_id, bm.betriebsmitteltyp, bmp.anmerkung as anmerkung, bmp.retouram, TO_CHAR(bmp.retouram::timestamp, 'DD.MM.YYYY') AS format_retour, bmp.ausgegebenam, TO_CHAR(bmp.ausgegebenam::timestamp, 'DD.MM.YYYY') AS format_ausgabe, bm.beschreibung, bmp.uid, bmp.kaution, bm.betriebsmittel_id, bmp.betriebsmittelperson_id, bm.inventarnummer + FROM + wawi.tbl_betriebsmittelperson bmp + JOIN + wawi.tbl_betriebsmittel bm ON (bmp.betriebsmittel_id = bm.betriebsmittel_id) + WHERE + " . $cond . " = ? "; + + return $this->execQuery($query, array($id)); + } } From cd8fffd2f7fd11ce8fd5a6993a9a24e504c3db0f Mon Sep 17 00:00:00 2001 From: Werner Masik Date: Tue, 4 Jun 2024 16:20:43 +0200 Subject: [PATCH 3/8] added filter update for Handyverwaltung --- system/filtersupdate.php | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/system/filtersupdate.php b/system/filtersupdate.php index a65c510eb..73c316dc4 100644 --- a/system/filtersupdate.php +++ b/system/filtersupdate.php @@ -1305,7 +1305,39 @@ $filters = array( } ', 'oe_kurzbz' => null - ) + ), + array( + 'app' => 'personalverwaltung', + 'dataset_name' => 'handyverwaltung', + 'filter_kurzbz' => 'ma4handyverwaltung', + 'description' => '{MA Handyverwaltung}', + 'sort' => 1, + 'default_filter' => true, + 'filter' => ' + { + "name": "MA Handyverwaltung", + "columns": [ + {"name": "PersonId"}, + {"name": "Vorname"}, + {"name": "Nachname"}, + {"name": "Alias"}, + {"name": "Aktiv"}, + {"name": "Raum"}, + {"name": "Geschlecht"}, + {"name": "Standardkostenstelle"} + ], + "filters": [ + { + "name": "Nachname", + "option": "", + "operation": "", + "condition": "" + } + ] + } + ', + 'oe_kurzbz' => null, + ), ); // Loop through the filters array From eb327c3adc4a88aa10f8f7d0ff1baaa23d6ce8dd Mon Sep 17 00:00:00 2001 From: Werner Masik Date: Wed, 12 Jun 2024 14:52:22 +0200 Subject: [PATCH 4/8] update Handyverwaltung filter --- system/filtersupdate.php | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/system/filtersupdate.php b/system/filtersupdate.php index 73c316dc4..8687f5ddf 100644 --- a/system/filtersupdate.php +++ b/system/filtersupdate.php @@ -1317,13 +1317,18 @@ $filters = array( { "name": "MA Handyverwaltung", "columns": [ + {"name": "UID"}, {"name": "PersonId"}, {"name": "Vorname"}, {"name": "Nachname"}, - {"name": "Alias"}, - {"name": "Aktiv"}, - {"name": "Raum"}, - {"name": "Geschlecht"}, + {"name": "EMail"}, + {"name": "Unternehmen"}, + {"name": "Vertragsart"}, + {"name": "DV_von"}, + {"name": "DV_bis"}, + {"name": "Wochenstunden"}, + {"name": "WS_von"}, + {"name": "WS_bis"}, {"name": "Standardkostenstelle"} ], "filters": [ From dd0bdddbc6fb36987f223900528c62053d56fe52 Mon Sep 17 00:00:00 2001 From: Harald Bamberger Date: Mon, 1 Jul 2024 14:12:48 +0200 Subject: [PATCH 5/8] backport recent changes of Betriebsmittel component and phrases from feature-30660/FHC4_StudierendenGUI_Prototyp Branch --- ...Betriebsmittel.php => BetriebsmittelP.php} | 104 ++---- .../models/ressource/Betriebsmittel_model.php | 2 +- .../ressource/Betriebsmittelperson_model.php | 4 +- public/js/api/fhcapifactory.js | 4 +- .../Betriebsmittel/Betriebsmittel.js | 278 +++++++------- system/phrasesupdate.php | 344 +++++++++++++++++- 6 files changed, 507 insertions(+), 229 deletions(-) rename application/controllers/api/frontend/v1/betriebsmittel/{Betriebsmittel.php => BetriebsmittelP.php} (77%) diff --git a/application/controllers/api/frontend/v1/betriebsmittel/Betriebsmittel.php b/application/controllers/api/frontend/v1/betriebsmittel/BetriebsmittelP.php similarity index 77% rename from application/controllers/api/frontend/v1/betriebsmittel/Betriebsmittel.php rename to application/controllers/api/frontend/v1/betriebsmittel/BetriebsmittelP.php index cb6c4a3aa..8a6d7e340 100644 --- a/application/controllers/api/frontend/v1/betriebsmittel/Betriebsmittel.php +++ b/application/controllers/api/frontend/v1/betriebsmittel/BetriebsmittelP.php @@ -1,10 +1,10 @@ loadPhrases([ - 'ui' + 'ui', + 'wawi' ]); } - public function getAllBetriebsmittel($uid, $person_id) + public function getAllBetriebsmittel($type_id, $id) { - //uid - //$result = $this->BetriebsmittelpersonModel->getBetriebsmittelData($uid, 'uid'); + $result = $this->BetriebsmittelpersonModel->getBetriebsmittelData($id, $type_id); - //person_id - $result = $this->BetriebsmittelpersonModel->getBetriebsmittelData($person_id, 'person'); - - if (isError($result)) - { + if (isError($result)) { $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); } $this->terminateWithSuccess((getData($result) ?: [])); } - public function addNewBetriebsmittel() + public function addNewBetriebsmittel($person_id) { - $_POST = json_decode(utf8_encode($this->input->raw_input_stream), true); - $this->form_validation->set_rules('kaution', 'Kaution', 'numeric', [ 'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'Kaution']) ]); @@ -64,9 +58,7 @@ class Betriebsmittel extends FHCAPI_Controller 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Ausgegeben am']) ]); - - if ($this->form_validation->run() == false) - { + if ($this->form_validation->run() == false) { $this->terminateWithValidationErrors($this->form_validation->error_array()); } @@ -80,38 +72,31 @@ class Betriebsmittel extends FHCAPI_Controller $anmerkung = $this->input->post('anmerkung'); $ausgegebenam = $this->input->post('ausgegebenam'); $retouram = $this->input->post('retouram'); - $person_id = $this->input->post('person_id'); $uid = $this->input->post('uid'); - if($inventarData) - { + if ($inventarData) { $betriebsmitteltyp = $inventarData['betriebsmitteltyp']; $betriebsmittel_id = $inventarData['betriebsmittel_id']; } - if($betriebsmitteltyp == 'Zutrittskarte' && !$nummer) - { + if ($betriebsmitteltyp == 'Zutrittskarte' && !$nummer) { return $this->terminateWithError($this->p->t('wawi', 'error_zutrittskarteOhneNummer'), self::ERROR_TYPE_GENERAL); } - if($retouram && $retouram < $ausgegebenam) - { + if ($retouram && $retouram < $ausgegebenam) { return $this->terminateWithError($this->p->t('wawi', 'error_retourdatumVorAusgabe'), self::ERROR_TYPE_GENERAL); } - if($betriebsmitteltyp == "Inventar" && !($inventarData['inventarnummer'])) - { + if ($betriebsmitteltyp == "Inventar" && !($inventarData['inventarnummer'])) { return $this->terminateWithError($this->p->t('wawi', 'error_inventarWaehlen'), self::ERROR_TYPE_GENERAL); } - // Start DB transaction $this->db->trans_begin(); $betriebsmitteltyp = utf8_decode($betriebsmitteltyp); - if(!$inventarData) - { + if (!$inventarData) { $result = $this->BetriebsmittelModel->insert( [ 'betriebsmitteltyp' => $betriebsmitteltyp, @@ -123,8 +108,7 @@ class Betriebsmittel extends FHCAPI_Controller 'insertamum' => date('c') ] ); - if($this->db->trans_status() === false || isError($result)) - { + if ($this->db->trans_status() === false || isError($result)) { $this->db->trans_rollback(); return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); } @@ -145,8 +129,7 @@ class Betriebsmittel extends FHCAPI_Controller ] ); - if($this->db->trans_status() === false || isError($result)) - { + if ($this->db->trans_status() === false || isError($result)) { $this->db->trans_rollback(); return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); } @@ -155,14 +138,10 @@ class Betriebsmittel extends FHCAPI_Controller return $this->terminateWithSuccess(true); } - public function updateBetriebsmittel() + public function updateBetriebsmittel($betriebsmittelperson_id) { - $_POST = json_decode(utf8_encode($this->input->raw_input_stream), true); - $uid_user = getAuthUID(); - $betriebsmittel_id = $this->input->post('betriebsmittel_id'); - $betriebsmittelperson_id = $this->input->post('betriebsmittelperson_id'); $betriebsmitteltyp = $this->input->post('betriebsmitteltyp'); $nummer = $this->input->post('nummer'); $nummer2 = $this->input->post('nummer2'); @@ -187,18 +166,15 @@ class Betriebsmittel extends FHCAPI_Controller ]); - if ($this->form_validation->run() == false) - { + if ($this->form_validation->run() == false) { $this->terminateWithValidationErrors($this->form_validation->error_array()); } - if($betriebsmitteltyp == 'Zutrittskarte' && !$nummer) - { + if ($betriebsmitteltyp == 'Zutrittskarte' && !$nummer) { return $this->terminateWithError($this->p->t('wawi', 'error_zutrittskarteOhneNummer'), self::ERROR_TYPE_GENERAL); } - if($retouram && $retouram < $ausgegebenam) - { + if ($retouram && $retouram < $ausgegebenam) { return $this->terminateWithError($this->p->t('wawi', 'error_retourdatumVorAusgabe'), self::ERROR_TYPE_GENERAL); } @@ -223,8 +199,7 @@ class Betriebsmittel extends FHCAPI_Controller ] ); - if($this->db->trans_status() === false || isError($result)) - { + if ($this->db->trans_status() === false || isError($result)) { $this->db->trans_rollback(); return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); } @@ -243,8 +218,7 @@ class Betriebsmittel extends FHCAPI_Controller 'updateamum' => date('c') ] ); - if($this->db->trans_status() === false || isError($result)) - { + if ($this->db->trans_status() === false || isError($result)) { $this->db->trans_rollback(); return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); } @@ -253,46 +227,33 @@ class Betriebsmittel extends FHCAPI_Controller return $this->terminateWithSuccess(true); } - public function loadBetriebsmittel() + public function loadBetriebsmittel($betriebsmittelperson_id) { - $_POST = json_decode(utf8_encode($this->input->raw_input_stream), true); - - $betriebsmittelperson_id = $this->input->post('betriebsmittelperson_id'); - $result = $this->BetriebsmittelpersonModel->getBetriebsmittelData($betriebsmittelperson_id, 'betriebsmittelperson_id'); - if (isError($result)) - { + if (isError($result)) { $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); } - if (!hasData($result)) - { - $this->terminateWithError("no Betriebsmittelperson with ID found: " . $betriebsmittelperson_id, self::ERROR_TYPE_GENERAL); + if (!hasData($result)) { + $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id' => 'Betriebsmittelperson_id']), self::ERROR_TYPE_GENERAL); } $this->terminateWithSuccess(current(getData($result))); } - public function deleteBetriebsmittel() + public function deleteBetriebsmittel($betriebsmittelperson_id) { - - $_POST = json_decode(utf8_encode($this->input->raw_input_stream), true); - - $betriebsmittelperson_id = $this->input->post('betriebsmittelperson_id'); - $result = $this->BetriebsmittelpersonModel->delete( array('betriebsmittelperson_id' => $betriebsmittelperson_id, - ) + ) ); - if (isError($result)) - { + if (isError($result)) { return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); } - if (!hasData($result)) - { - return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Betriebsmittelperson_id']), self::ERROR_TYPE_GENERAL); + if (!hasData($result)) { + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id' => 'Betriebsmittelperson_id']), self::ERROR_TYPE_GENERAL); } return $this->outputJsonSuccess(current(getData($result))); } @@ -304,8 +265,7 @@ class Betriebsmittel extends FHCAPI_Controller $this->BetriebsmitteltypModel->addOrder('beschreibung', 'ASC'); $result = $this->BetriebsmitteltypModel->load(); // load All - if (isError($result)) - { + if (isError($result)) { $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); } return $this->terminateWithSuccess(getData($result) ?: []); diff --git a/application/models/ressource/Betriebsmittel_model.php b/application/models/ressource/Betriebsmittel_model.php index 69aa962c1..290c3491d 100644 --- a/application/models/ressource/Betriebsmittel_model.php +++ b/application/models/ressource/Betriebsmittel_model.php @@ -17,7 +17,7 @@ class Betriebsmittel_model extends DB_Model */ public function loadInventarliste($filter) { - $filter = strtoLower($filter); + $filter = urldecode(strtoLower($filter)); $qry = " SELECT diff --git a/application/models/ressource/Betriebsmittelperson_model.php b/application/models/ressource/Betriebsmittelperson_model.php index bffa82501..48c35381f 100644 --- a/application/models/ressource/Betriebsmittelperson_model.php +++ b/application/models/ressource/Betriebsmittelperson_model.php @@ -100,7 +100,7 @@ class Betriebsmittelperson_model extends DB_Model public function getBetriebsmittelData($id, $type_id) { switch ($type_id) { - case 'person': + case 'person_id': $cond = 'bmp.person_id'; break; case 'uid': @@ -115,7 +115,7 @@ class Betriebsmittelperson_model extends DB_Model $query = " SELECT - bm.nummer, bmp.person_id, bm.betriebsmitteltyp, bmp.anmerkung as anmerkung, bmp.retouram, TO_CHAR(bmp.retouram::timestamp, 'DD.MM.YYYY') AS format_retour, bmp.ausgegebenam, TO_CHAR(bmp.ausgegebenam::timestamp, 'DD.MM.YYYY') AS format_ausgabe, bm.beschreibung, bmp.uid, bmp.kaution, bm.betriebsmittel_id, bmp.betriebsmittelperson_id, bm.inventarnummer + bm.nummer, bmp.person_id, bm.betriebsmitteltyp, bmp.anmerkung as anmerkung, bmp.retouram, TO_CHAR(bmp.retouram::timestamp, 'DD.MM.YYYY') AS format_retour, bmp.ausgegebenam, TO_CHAR(bmp.ausgegebenam::timestamp, 'DD.MM.YYYY') AS format_ausgabe, bm.beschreibung, bmp.uid, bmp.kaution, bm.betriebsmittel_id, bmp.betriebsmittelperson_id, bm.inventarnummer, bm.nummer2 FROM wawi.tbl_betriebsmittelperson bmp JOIN diff --git a/public/js/api/fhcapifactory.js b/public/js/api/fhcapifactory.js index 41c89ef50..f496cd491 100644 --- a/public/js/api/fhcapifactory.js +++ b/public/js/api/fhcapifactory.js @@ -20,11 +20,13 @@ import phrasen from "./phrasen.js"; import navigation from "./navigation.js"; import filter from "./filter.js"; import studstatus from "./studstatus.js"; +import betriebsmittel from "./betriebsmittel.js"; export default { search, phrasen, navigation, filter, - studstatus + studstatus, + betriebsmittel }; diff --git a/public/js/components/Betriebsmittel/Betriebsmittel.js b/public/js/components/Betriebsmittel/Betriebsmittel.js index 05fe74c3d..38563633f 100644 --- a/public/js/components/Betriebsmittel/Betriebsmittel.js +++ b/public/js/components/Betriebsmittel/Betriebsmittel.js @@ -20,26 +20,41 @@ export default { from: 'cisRoot' }, }, - props: [ - 'person_id', - 'uid' - ], + props: { + endpoint: { + type: Object, + required: true + }, + typeId: String, + id: { + type: [Number, String], + required: true + }, + uid: { + type: [Number, String], + required: true + } + }, data() { return { tabulatorOptions: { - ajaxURL: 'api/frontend/v1/betriebsmittel/Betriebsmittel/getAllBetriebsmittel/' + this.uid + '/' + this.person_id, - ajaxRequestFunc: this.$fhcApi.get, + ajaxURL: 'dummy', + ajaxRequestFunc: this.endpoint.getAllBetriebsmittel, + ajaxParams: { + type: this.typeId, + id: this.id + }, ajaxResponse: (url, params, response) => response.data, columns: [ - {title: "Nummer", field: "nummer"}, + {title: "Nummer", field: "nummer", width: 150}, {title: "PersonId", field: "person_id", visible: false}, - {title: "Typ", field: "betriebsmitteltyp"}, + {title: "Typ", field: "betriebsmitteltyp", width: 125}, {title: "Anmerkung", field: "anmerkung", visible: false}, - {title: "Retourdatum", field: "format_retour", visible: false}, + {title: "Retourdatum", field: "format_retour", width: 128}, {title: "Beschreibung", field: "beschreibung"}, - {title: "Uid", field: "uid", visible: false}, + {title: "Uid", field: "uid", width: 87}, {title: "Kaution", field: "kaution", visible: false}, - {title: "Ausgabedatum", field: "format_ausgabe"}, + {title: "Ausgabedatum", field: "format_ausgabe", width: 144}, {title: "Betriebsmittel_id", field: "betriebsmittel_id", visible: false}, {title: "Betriebsmittelperson_id", field: "betriebsmittelperson_id", visible: false}, { @@ -96,7 +111,8 @@ export default { layoutColumnsOnNewData: false, height: '550', selectableRangeMode: 'click', - selectable: true + selectable: true, + persistenceID: 'core-betriebsmittel' }, tabulatorEvents: [ { @@ -139,16 +155,18 @@ export default { }, watch: { uid() { - this.$refs.table.tabulator.setData('api/frontend/v1/betriebsmittel/Betriebsmittel/getAllBetriebsmittel/' + this.uid + '/' + this.person_id); + this.$refs.table.tabulator.setData(this.endpoint.getAllBetriebsmittel + '/' + this.typeId + '/' + this.id); } }, methods: { actionEditBetriebsmittel(betriebsmittelperson_id) { this.statusNew = false; this.loadBetriebsmittel(betriebsmittelperson_id); + this.$refs.betriebsmittelModal.show(); }, actionNewBetriebsmittel() { this.resetModal(); + this.$refs.betriebsmittelModal.show(); this.statusNew = true; this.formData.ausgegebenam = this.getDefaultDate(); this.reload(); @@ -159,28 +177,21 @@ export default { }); }, addNewBetriebsmittel() { - this.param = { - 'uid': this.uid, - 'person_id': this.person_id, - ...this.formData - }; - this.$fhcApi.post('api/frontend/v1/betriebsmittel/Betriebsmittel/addNewBetriebsmittel/', - this.param - ).then(response => { - this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successSave')); - this.resetModal(); - }).catch(this.$fhcAlert.handleSystemError) + //just append uid to formdata + this.formData.uid = this.uid; + return this.endpoint.addNewBetriebsmittel(this.id, this.formData) + .then(response => { + this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successSave')); + this.hideModal('betriebsmittelModal'); + this.resetModal(); + }).catch(this.$fhcAlert.handleSystemError) .finally(() => { window.scrollTo(0, 0); this.reload(); }); }, deleteBetriebsmittel(betriebsmittelperson_id) { - this.param = { - 'betriebsmittelperson_id': betriebsmittelperson_id - }; - return this.$fhcApi.post('api/frontend/v1/betriebsmittel/betriebsmittel/deleteBetriebsmittel/', - this.param) + return this.endpoint.deleteBetriebsmittel(betriebsmittelperson_id) .then( result => { this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successDelete')); @@ -193,16 +204,12 @@ export default { this.reload(); }); }, - updateBetriebsmittel() { - this.param = { - 'uid': this.uid, - 'person_id': this.person_id, - ...this.formData - }; - this.$fhcApi.post('api/frontend/v1/betriebsmittel/Betriebsmittel/updateBetriebsmittel/', - this.param - ).then(response => { + updateBetriebsmittel(betriebsmittelperson_id) { + this.formData.uid = this.uid; + return this.endpoint.updateBetriebsmittel(betriebsmittelperson_id, this.formData) + .then(response => { this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successSave')); + this.hideModal('betriebsmittelModal'); this.resetModal(); }).catch(this.$fhcAlert.handleSystemError) .finally(() => { @@ -213,11 +220,7 @@ export default { loadBetriebsmittel(betriebsmittelperson_id) { this.resetModal(); this.statusNew = false; - this.param = { - 'betriebsmittelperson_id': betriebsmittelperson_id - }; - return this.$fhcApi.post('api/frontend/v1/betriebsmittel/Betriebsmittel/loadBetriebsmittel/', - this.param) + return this.endpoint.loadBetriebsmittel(betriebsmittelperson_id) .then(result => result.data) .then(result => { this.formData = result; @@ -225,8 +228,8 @@ export default { .catch(this.$fhcAlert.handleSystemError); }, searchInventar(event) { - return this.$fhcApi - .get('api/frontend/v1/betriebsmittel/Betriebsmittel/loadInventarliste/' + event.query) + const encodedQuery = encodeURIComponent(event.query); + return this.endpoint.loadInventarliste(encodedQuery) .then(result => { this.filteredInventar = result.data.retval; }); @@ -256,8 +259,7 @@ export default { } }, created(){ - this.$fhcApi - .get('api/frontend/v1/betriebsmittel/Betriebsmittel/getTypenBetriebsmittel') + return this.endpoint.getTypenBetriebsmittel() .then(result => result.data) .then(result => { this.listBetriebsmitteltyp = result; @@ -265,57 +267,44 @@ export default { .catch(this.$fhcAlert.handleSystemError); }, template: ` -
- - +
+ - + + + -
-
- - - - -
- - - - + + + + + Details - -
-
-

{{$p.t('ui', 'add_betriebsmittel')}}

-

{{$p.t('ui', 'edit_betriebsmittel')}}

-
-
- -
- -
+ +
-
- -
- -
- -
-
-
- -
- -
-
-
- -
+
+ + +
+
+ +
+ +
+
-
- -
- -
+ +
-
- -
- -
+ +
-
- -
- -
+ +
-
- -
- -
+ +
-
- -
- -
+ +
-
- -
- -
+ +
-
+ + -
- - -
- - - - - - + +
` } diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php index 12e251133..34862d600 100644 --- a/system/phrasesupdate.php +++ b/system/phrasesupdate.php @@ -24698,7 +24698,349 @@ array( 'insertvon' => 'system' ) ) - ) + ), + // Betriebsmittel begin + array( + 'app' => 'core', + 'category' => 'ui', + 'phrase' => 'successSave', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Speichern erfolgreich', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Successfully saved', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'ui', + 'phrase' => 'successDelete', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Löschen erfolgreich', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Delete successful', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'ui', + 'phrase' => 'successAdvance', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Vorrückung Status erfolgreich', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Advance status successful', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'ui', + 'phrase' => 'successConfirm', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Bestätigung Status erfolgreich', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Confirmation status successful', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'ui', + 'phrase' => 'betriebsmittel', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Betriebsmittel', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Resources', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'ui', + 'phrase' => 'betriebsmittel_delete', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Betriebsmittel löschen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'delete operating resource', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'ui', + 'phrase' => 'betriebsmittel_confirm_delete', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Betriebsmittel wirklich löschen?', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Really delete operating resource?', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'ui', + 'phrase' => 'add_betriebsmittel', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Betriebsmittel anlegen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'create operating resource', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'ui', + 'phrase' => 'edit_betriebsmittel', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Betriebsmittel bearbeiten', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'edit operating resource', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'wawi', + 'phrase' => 'nummer', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Nummer', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'number', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'wawi', + 'phrase' => 'ausgegebenam', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Ausgegeben am', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'issued on', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'wawi', + 'phrase' => 'retouram', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Retour am', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'returned on', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'wawi', + 'phrase' => 'retourdatum', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Retourdatum', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'return date', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'wawi', + 'phrase' => 'ausgabedatum', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Ausgabedatum', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'issue date', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'wawi', + 'phrase' => 'error_zutrittskarteOhneNummer', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Eine Zutrittskarte muss eine Nummer haben. Um die Zuordnung zu dieser Karte zu löschen entfernen Sie bitte den ganzen Datensatz!', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'An access card must have a number. To delete the assignment to this card, please remove the entire data record!', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'wawi', + 'phrase' => 'error_inventarWaehlen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Bitte wählen Sie das entsprechende Inventar aus dem Drop Down Menü Inventarnummer aus!', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Please select the appropriate inventory from the inventory number drop down menu!', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'wawi', + 'phrase' => 'error_retourdatumVorAusgabe', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Retourdatum darf nicht vor Datum der Ausgabe liegen!', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'The return date must not be before the issue date!', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + // Betriebsmittel end ); From 115151473a795f5188e8018f0a814b5ece668ebf Mon Sep 17 00:00:00 2001 From: Harald Bamberger Date: Thu, 11 Jul 2024 11:57:45 +0200 Subject: [PATCH 6/8] backport recent changes of Betriebsmittel component and phrases from feature-30660/FHC4_StudierendenGUI_Prototyp Branch --- .../v1/betriebsmittel/BetriebsmittelP.php | 387 +++++++++++------- application/core/Auth_Controller.php | 62 +++ application/helpers/hlp_common_helper.php | 76 ++++ .../language/english/form_validation_lang.php | 43 ++ application/libraries/PermissionLib.php | 32 +- .../ressource/Betriebsmittelperson_model.php | 18 +- .../Betriebsmittel/Betriebsmittel.js | 358 ++++++++-------- system/phrasesupdate.php | 100 +++++ 8 files changed, 726 insertions(+), 350 deletions(-) create mode 100644 application/language/english/form_validation_lang.php diff --git a/application/controllers/api/frontend/v1/betriebsmittel/BetriebsmittelP.php b/application/controllers/api/frontend/v1/betriebsmittel/BetriebsmittelP.php index 8a6d7e340..8e44b2326 100644 --- a/application/controllers/api/frontend/v1/betriebsmittel/BetriebsmittelP.php +++ b/application/controllers/api/frontend/v1/betriebsmittel/BetriebsmittelP.php @@ -6,14 +6,16 @@ use \DateTime as DateTime; class BetriebsmittelP extends FHCAPI_Controller { + private $person_id = null; + public function __construct() { parent::__construct([ 'getAllBetriebsmittel' => ['admin:r', 'assistenz:r'], - 'addNewBetriebsmittel' => ['admin:r', 'assistenz:r'], - 'updateBetriebsmittel' => ['admin:r', 'assistenz:r'], + 'addNewBetriebsmittel' => self::PERM_LOGGED, + 'updateBetriebsmittel' => self::PERM_LOGGED, 'loadBetriebsmittel' => ['admin:r', 'assistenz:r'], - 'deleteBetriebsmittel' => ['admin:r', 'assistenz:r'], + 'deleteBetriebsmittel' => self::PERM_LOGGED, 'getTypenBetriebsmittel' => ['admin:r', 'assistenz:r'], 'loadInventarliste' => ['admin:r', 'assistenz:r'] ]); @@ -22,6 +24,29 @@ class BetriebsmittelP extends FHCAPI_Controller $this->load->model('ressource/Betriebsmittel_model', 'BetriebsmittelModel'); $this->load->model('ressource/Betriebsmittelperson_model', 'BetriebsmittelpersonModel'); + // Additional Permission Checks + if ($this->router->method == 'addNewBetriebsmittel') { + $this->person_id = current(array_slice($this->uri->rsegments, 2)); + + $this->checkPermissionsForPerson( + $this->person_id, + ['admin:rw', 'mitarbeiter:rw', 'basis/betriebsmittel:rw'], + ['admin:rw', 'assistenz:rw', 'basis/betriebsmittel:rw'] + ); + } elseif ($this->router->method == 'updateBetriebsmittel' || $this->router->method == 'deleteBetriebsmittel') { + $betriebsmittelperson_id = current(array_slice($this->uri->rsegments, 2)); + $result = $this->BetriebsmittelpersonModel->load($betriebsmittelperson_id); + if (!hasData($result)) + show_404(); + $this->person_id = current(getData($result))->person_id; + + $this->checkPermissionsForPerson( + $this->person_id, + ['admin:rw', 'mitarbeiter:rw', 'basis/betriebsmittel:rw'], + ['admin:rw', 'assistenz:rw', 'basis/betriebsmittel:rw'] + ); + } + // Load Libraries $this->load->library('VariableLib', ['uid' => getAuthUID()]); $this->load->library('form_validation'); @@ -44,187 +69,265 @@ class BetriebsmittelP extends FHCAPI_Controller $this->terminateWithSuccess((getData($result) ?: [])); } - public function addNewBetriebsmittel($person_id) + protected function validateNewOrUpdate() { - $this->form_validation->set_rules('kaution', 'Kaution', 'numeric', [ - 'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'Kaution']) + $this->form_validation->set_rules('betriebsmitteltyp', 'Typ', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired') ]); - $this->form_validation->set_rules('betriebsmitteltyp', 'TYP', 'required', [ - 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Typ']) + $this->form_validation->set_rules('kaution', 'Kaution', 'numeric|less_than_equal_to[9999.99]', [ + 'numeric' => $this->p->t('ui', 'error_fieldNotNumeric') ]); - $this->form_validation->set_rules('ausgegebenam', 'Ausgegeben am', 'required', [ - 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Ausgegeben am']) + $this->form_validation->set_rules('ausgegebenam', 'Ausgegeben am', 'required|is_valid_date', [ + 'required' => $this->p->t('ui', 'error_fieldRequired') ]); - if ($this->form_validation->run() == false) { - $this->terminateWithValidationErrors($this->form_validation->error_array()); + if ($this->input->post('ausgegebenam') && $this->input->post('retouram')) { + $this->form_validation->set_rules('retouram', 'Retour am', [ + 'is_valid_date', + ['is_not_before_ausgegebenam', function ($value) { + return (new DateTime($value) >= new DateTime($this->input->post('ausgegebenam'))); + }] + ], [ + 'is_not_before_ausgegebenam' => $this->p->t('wawi', 'error_retourdatumVorAusgabe') + ]); + } else { + $this->form_validation->set_rules('retouram', 'Retour am', 'is_valid_date'); } - $uid_user = getAuthUID(); + $this->form_validation->set_rules('anmerkung', 'Anmerkung', 'max_length[256]'); + + if ($this->input->post('betriebsmitteltyp') == 'Inventar') { + // Inventar + $this->form_validation->set_rules('betriebsmittel_id', 'Inventarnummer', 'required'); + } elseif ($this->input->post('betriebsmitteltyp') == 'Zutrittskarte') { + // Zutrittskarte + if ($this->input->post('nummer') === null && $this->input->post('nummer') === null) { + $this->form_validation->set_rules('nummer', 'Nummer', 'required', [ + 'required' => $this->p->t('wawi', 'error_zutrittskarteOhneNummer') + ]); + $this->form_validation->set_rules('nummer2', 'Nummer2', 'required', [ + 'required' => $this->p->t('wawi', 'error_zutrittskarteOhneNummer') + ]); + } else { + if ($this->input->post('nummer') === null) { + $result = $this->BetriebsmittelpersonModel->loadViewWhere([ + 'betriebsmitteltyp' => $this->input->post('betriebsmitteltyp'), + 'nummer2' => $this->input->post('nummer2'), + 'person_id !=' => $this->person_id, + 'retouram IS NULL' => null + ]); + if (hasData($result)) + $this->form_validation->set_rules('nummer2', 'Nummer2', 'is_array', [ + 'is_array' => $this->p->t('wawi', 'error_bmZutrittskarteOccupied', (array)current(getData($result))) + ]); + } else { + $result = $this->BetriebsmittelpersonModel->loadViewWhere([ + 'betriebsmitteltyp' => $this->input->post('betriebsmitteltyp'), + 'nummer' => $this->input->post('nummer'), + 'person_id !=' => $this->person_id, + 'retouram IS NULL' => null + ]); + if (hasData($result)) + $this->form_validation->set_rules('nummer', 'Nummer', 'is_array', [ + 'is_array' => $this->p->t('wawi', 'error_bmZutrittskarteOccupied', (array)current(getData($result))) + ]); + } + } + } + + if (!$this->form_validation->run()) + $this->terminateWithValidationErrors($this->form_validation->error_array()); + } + + public function addNewBetriebsmittel($person_id) + { + $this->form_validation->set_rules('uid', 'UID', [ + ['uid_in_person', function ($value) use ($person_id) { + if ($value === null) + return true; + $this->load->model('person/Benutzer_model', 'BenutzerModel'); + $result = $this->BenutzerModel->loadWhere([ + 'uid' => $value, + 'person_id' => $person_id + ]); + + return hasData($result); + }] + ], [ + 'uid_in_person' => $this->p->t('person', 'error_uidNotInPerson') + ]); + $this->validateNewOrUpdate(); + $betriebsmitteltyp = $this->input->post('betriebsmitteltyp'); $nummer = $this->input->post('nummer'); $nummer2 = $this->input->post('nummer2'); - $inventarData = $this->input->post('inventarData'); $beschreibung = $this->input->post('beschreibung'); - $kaution = $this->input->post('kaution'); + $betriebsmittel_id = $this->input->post('betriebsmittel_id'); $anmerkung = $this->input->post('anmerkung'); + $kaution = $this->input->post('kaution'); $ausgegebenam = $this->input->post('ausgegebenam'); $retouram = $this->input->post('retouram'); $uid = $this->input->post('uid'); - if ($inventarData) { - $betriebsmitteltyp = $inventarData['betriebsmitteltyp']; - $betriebsmittel_id = $inventarData['betriebsmittel_id']; - } + // NOTE(chris): transform_kartennummer + if ($betriebsmitteltyp == 'Zutrittskarte' && $nummer) + $nummer = is_numeric($nummer) ? ltrim($nummer, "0") : hexdec(implode("", array_reverse(str_split(trim($nummer))))); - if ($betriebsmitteltyp == 'Zutrittskarte' && !$nummer) { - return $this->terminateWithError($this->p->t('wawi', 'error_zutrittskarteOhneNummer'), self::ERROR_TYPE_GENERAL); - } + $this->db->trans_start(); - if ($retouram && $retouram < $ausgegebenam) { - return $this->terminateWithError($this->p->t('wawi', 'error_retourdatumVorAusgabe'), self::ERROR_TYPE_GENERAL); - } + if ($betriebsmitteltyp != 'Inventar') { + $this->BetriebsmittelModel->addOrder('updateamum', 'DESC'); + if ($betriebsmitteltyp == 'Zutrittskarte' && $nummer === null) { + $result = $this->BetriebsmittelModel->loadWhere([ + 'betriebsmitteltyp' => $betriebsmitteltyp, + 'nummer2' => $nummer2 + ]); + } else { + $result = $this->BetriebsmittelModel->loadWhere([ + 'betriebsmitteltyp' => $betriebsmitteltyp, + 'nummer' => $nummer + ]); + } + $data = $this->getDataOrTerminateWithError($result); - if ($betriebsmitteltyp == "Inventar" && !($inventarData['inventarnummer'])) { - return $this->terminateWithError($this->p->t('wawi', 'error_inventarWaehlen'), self::ERROR_TYPE_GENERAL); - } - - // Start DB transaction - $this->db->trans_begin(); - - $betriebsmitteltyp = utf8_decode($betriebsmitteltyp); - - if (!$inventarData) { - $result = $this->BetriebsmittelModel->insert( - [ + if ($data) { + $data = current($data); + if ($data->nummer !== $nummer || $data->nummer2 !== $nummer2 || $data->beschreibung !== $beschreibung) { + $result = $this->BetriebsmittelModel->update($data->betriebsmittel_id, [ + 'nummer' => $nummer, + 'nummer2' => $nummer2, + 'beschreibung' => $beschreibung, + 'updateamum' => date('c'), + 'updatevon' => getAuthUID() + ]); + $this->getDataOrTerminateWithError($result); + } + $betriebsmittel_id = $data->betriebsmittel_id; + } else { + $result = $this->BetriebsmittelModel->insert([ 'betriebsmitteltyp' => $betriebsmitteltyp, 'nummer' => $nummer, 'nummer2' => $nummer2, 'beschreibung' => $beschreibung, - 'anmerkung' => $anmerkung, - 'insertvon' => $uid_user, - 'insertamum' => date('c') - ] - ); - if ($this->db->trans_status() === false || isError($result)) { - $this->db->trans_rollback(); - return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); + 'reservieren' => false, + 'ort_kurzbz' => null, + 'insertamum' => date('c'), + 'insertvon' => getAuthUID(), + ]); + $betriebsmittel_id = $this->getDataOrTerminateWithError($result); } - $betriebsmittel_id = $result->retval; } - $result = $this->BetriebsmittelpersonModel->insert( - [ - 'betriebsmittel_id' => $betriebsmittel_id, - 'person_id' => $person_id, - 'kaution' => $kaution, - 'anmerkung' => $anmerkung, - 'ausgegebenam' => $ausgegebenam, - 'retouram ' => $retouram, - 'insertvon' => $uid_user, - 'insertamum' => date('c'), - 'uid' => $uid - ] - ); + $result = $this->BetriebsmittelpersonModel->insert([ + 'person_id' => $person_id, + 'betriebsmittel_id' => $betriebsmittel_id, + 'anmerkung' => $anmerkung, + 'kaution' => $kaution, + 'ausgegebenam' => $ausgegebenam, + 'retouram' => $retouram, + 'uid' => $uid, + 'insertamum' => date('c'), + 'insertvon' => getAuthUID() + ]); - if ($this->db->trans_status() === false || isError($result)) { - $this->db->trans_rollback(); - return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); - } + $data = $this->getDataOrTerminateWithError($result); - $this->db->trans_commit(); - return $this->terminateWithSuccess(true); + $this->db->trans_complete(); + + $this->terminateWithSuccess(true); } public function updateBetriebsmittel($betriebsmittelperson_id) { - $uid_user = getAuthUID(); - $betriebsmittel_id = $this->input->post('betriebsmittel_id'); + $this->validateNewOrUpdate(); + $betriebsmitteltyp = $this->input->post('betriebsmitteltyp'); $nummer = $this->input->post('nummer'); $nummer2 = $this->input->post('nummer2'); $beschreibung = $this->input->post('beschreibung'); - $kaution = $this->input->post('kaution'); + $betriebsmittel_id = $this->input->post('betriebsmittel_id'); $anmerkung = $this->input->post('anmerkung'); + $kaution = $this->input->post('kaution'); $ausgegebenam = $this->input->post('ausgegebenam'); $retouram = $this->input->post('retouram'); - $person_id = $this->input->post('person_id'); - $uid = $this->input->post('uid'); - $this->form_validation->set_rules('kaution', 'Kaution', 'numeric', [ - 'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'Kaution']) + // NOTE(chris): transform_kartennummer + if ($betriebsmitteltyp == 'Zutrittskarte' && $nummer) + $nummer = is_numeric($nummer) ? ltrim($nummer, "0") : hexdec(implode("", array_reverse(str_split(trim($nummer))))); + + $this->db->trans_start(); + + if ($betriebsmitteltyp != 'Inventar') { + $found = false; + if ($nummer !== null && $betriebsmittel_id !== null) { + $result = $this->BetriebsmittelModel->load($betriebsmittel_id); + $data = $this->getDataOrTerminateWithError($result); + if ($data && current($data)->nummer == $nummer) { + $found = true; + } + } + + if (!$found) { + $this->BetriebsmittelModel->addOrder('updateamum', 'DESC'); + if ($betriebsmitteltyp == 'Zutrittskarte' && $nummer === null) { + $result = $this->BetriebsmittelModel->loadWhere([ + 'betriebsmitteltyp' => $betriebsmitteltyp, + 'nummer2' => $nummer2 + ]); + } else { + $result = $this->BetriebsmittelModel->loadWhere([ + 'betriebsmitteltyp' => $betriebsmitteltyp, + 'nummer' => $nummer + ]); + } + $data = $this->getDataOrTerminateWithError($result); + } + + if ($data) { + $data = current($data); + if ($data->nummer !== $nummer || $data->nummer2 !== $nummer2 || $data->beschreibung !== $beschreibung) { + $result = $this->BetriebsmittelModel->update($data->betriebsmittel_id, [ + 'nummer' => $nummer, + 'nummer2' => $nummer2, + 'beschreibung' => $beschreibung, + 'updateamum' => date('c'), + 'updatevon' => getAuthUID() + ]); + $this->getDataOrTerminateWithError($result); + } + $betriebsmittel_id = $data->betriebsmittel_id; + } else { + $result = $this->BetriebsmittelModel->insert([ + 'betriebsmitteltyp' => $betriebsmitteltyp, + 'nummer' => $nummer, + 'nummer2' => $nummer2, + 'beschreibung' => $beschreibung, + 'reservieren' => false, + 'ort_kurzbz' => null, + 'insertamum' => date('c'), + 'insertvon' => getAuthUID(), + ]); + $betriebsmittel_id = $this->getDataOrTerminateWithError($result); + } + } + + $result = $this->BetriebsmittelpersonModel->update($betriebsmittelperson_id, [ + 'betriebsmittel_id' => $betriebsmittel_id, + 'anmerkung' => $anmerkung, + 'kaution' => $kaution, + 'ausgegebenam' => $ausgegebenam, + 'retouram' => $retouram, + 'updateamum' => date('c'), + 'updatevon' => getAuthUID() ]); - $this->form_validation->set_rules('betriebsmitteltyp', 'TYP', 'required', [ - 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Typ']) - ]); + $data = $this->getDataOrTerminateWithError($result); - $this->form_validation->set_rules('ausgegebenam', 'Ausgegeben am', 'required', [ - 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Ausgegeben am']) - ]); + $this->db->trans_complete(); - - if ($this->form_validation->run() == false) { - $this->terminateWithValidationErrors($this->form_validation->error_array()); - } - - if ($betriebsmitteltyp == 'Zutrittskarte' && !$nummer) { - return $this->terminateWithError($this->p->t('wawi', 'error_zutrittskarteOhneNummer'), self::ERROR_TYPE_GENERAL); - } - - if ($retouram && $retouram < $ausgegebenam) { - return $this->terminateWithError($this->p->t('wawi', 'error_retourdatumVorAusgabe'), self::ERROR_TYPE_GENERAL); - } - - - // Start DB transaction - $this->db->trans_begin(); - - $result = $this->BetriebsmittelpersonModel->update( - [ - 'betriebsmittelperson_id' => $betriebsmittelperson_id, - - ], - [ - 'person_id' => $person_id, - 'uid' => $uid, - 'kaution' => $kaution, - 'anmerkung' => $anmerkung, - 'ausgegebenam' => $ausgegebenam, - 'retouram ' => $retouram, - 'updatevon' => $uid_user, - 'updateamum' => date('c') - ] - ); - - if ($this->db->trans_status() === false || isError($result)) { - $this->db->trans_rollback(); - return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); - } - - $result = $this->BetriebsmittelModel->update( - [ - 'betriebsmittel_id' => $betriebsmittel_id - ], - [ - 'betriebsmitteltyp' => $betriebsmitteltyp, - 'nummer' => $nummer, - 'nummer2' => $nummer2, - 'beschreibung' => $beschreibung, - 'anmerkung' => $anmerkung, - 'updatevon' => $uid_user, - 'updateamum' => date('c') - ] - ); - if ($this->db->trans_status() === false || isError($result)) { - $this->db->trans_rollback(); - return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); - } - - $this->db->trans_commit(); - return $this->terminateWithSuccess(true); + $this->terminateWithSuccess(true); } public function loadBetriebsmittel($betriebsmittelperson_id) @@ -274,10 +377,10 @@ class BetriebsmittelP extends FHCAPI_Controller public function loadInventarliste($searchString) { $result = $this->BetriebsmittelModel->loadInventarliste($searchString); - if (isError($result)) { - $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); - } - $this->terminateWithSuccess($result ?: []); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); } } diff --git a/application/core/Auth_Controller.php b/application/core/Auth_Controller.php index d170a7eca..e9621332f 100644 --- a/application/core/Auth_Controller.php +++ b/application/core/Auth_Controller.php @@ -67,6 +67,68 @@ abstract class Auth_Controller extends FHC_Controller } } + /** + * Checks for Permissions depending if the given person is a + * Mitarbeiter and/or Student + * and exits/outputs an error if they are not met. + * + * @param integer $person_id + * @param array $permMa Perms if the person is a Mitarbeiter + * @param array $permStud Perms if the person is a Student + * + * @return void + */ + protected function checkPermissionsForPerson($person_id, $permMa, $permStud) + { + $res = $this->hasPermissionsForPerson($person_id, $permMa, $permStud); + + if ($res) { + $perm = array_keys(array_flip(array_merge($res|1 ? $permMa : [], $res|2 ? $permStud : []))); + $this->_outputAuthError([$this->router->method => $perm]); + } + } + + /** + * Checks for Permissions depending if the given person is a + * Mitarbeiter and/or Student + * and returns the result. + * + * @param integer $person_id + * @param array $permMa Perms if the person is a Mitarbeiter + * @param array $permStud Perms if the person is a Student + * + * @return boolean + */ + protected function hasPermissionsForPerson($person_id, $permMa, $permStud) + { + $res = 0; + $this->load->model('person/Person_model', 'PersonModel'); + $this->PersonModel->addJoin('public.tbl_benutzer', 'person_id'); + $this->PersonModel->addJoin('public.tbl_mitarbeiter', 'uid = mitarbeiter_uid'); + $result = $this->PersonModel->load($person_id); + if (hasData($result)) { + if ($this->permissionlib->isEntitled(['a' => $permMa], 'a')) + return 0; + $res = 1; + } + $this->PersonModel->addJoin('public.tbl_prestudent', 'person_id'); + $result = $this->PersonModel->load($person_id); + if (hasData($result)) { + $permStudConverted = []; + foreach (getData($result) as $row) { + foreach ($permStud as $k => $v) { + if (!isset($permStudConverted[$k])) { + $permStudConverted[$k] = $this->permissionlib->convertAccessType($v); + } + if ($this->permissionlib->isBerechtigt($permStudConverted[$k][0], $permStudConverted[$k][1], $row->studiengang_kz)) + return 0; + } + } + $res += 2; + } + return $res; + } + /** * Outputs an error message and sets the HTTP Header. * This function is protected so that it can be overwritten. diff --git a/application/helpers/hlp_common_helper.php b/application/helpers/hlp_common_helper.php index 3e682e56c..40aed007c 100644 --- a/application/helpers/hlp_common_helper.php +++ b/application/helpers/hlp_common_helper.php @@ -422,3 +422,79 @@ function isValidDate($dateString) return false; } } + + +// ------------------------------------------------------------------------ +// Collection of utility functions for form validation purposes +// ------------------------------------------------------------------------ + +/** + * check if string can be converted to a date + */ +function is_valid_date($dateString) +{ + try + { + return (new DateTime($dateString)) !== false; + } + catch(Exception $e) + { + return false; + } +} + +/** + * check if given permissions are met + */ +function has_write_permissions($value, $permissions = '') +{ + if (!$permissions) + $permissions = $value; + $permissions = explode(',', $permissions); + + $CI =& get_instance(); + $CI->load->library('AuthLib'); + $CI->load->library('PermissionLib'); + + return $CI->permissionlib->hasAtLeastOne( + $permissions, + 'sometable', + PermissionLib::WRITE_RIGHT + ); +} + +/** + * check if has permissions for a studiengang_kz + */ +function has_permissions_for_stg($studiengang_kz, $permissions = '') +{ + if (!$permissions) + return false; + $permissions = explode(',', $permissions); + + $CI =& get_instance(); + $CI->load->library('AuthLib'); + $CI->load->library('PermissionLib'); + + foreach ($permissions as $perm) { + if (strpos($perm, PermissionLib::PERMISSION_SEPARATOR) === false) { + $CI->addError( + 'The given permission does not use the correct format', + FHCAPI_Controller::ERROR_TYPE_GENERAL + ); + return false; + } + + list($perm, $accesstype) = explode(PermissionLib::PERMISSION_SEPARATOR, $perm); + $at = ''; + if (strpos($accesstype, PermissionLib::READ_RIGHT) !== false) + $at = PermissionLib::SELECT_RIGHT; // S + if (strpos($accesstype, PermissionLib::WRITE_RIGHT) !== false) + $at .= PermissionLib::REPLACE_RIGHT.PermissionLib::DELETE_RIGHT; // UID + + if ($CI->permissionlib->isBerechtigt($perm, $at, $studiengang_kz)) + return true; + } + + return false; +} diff --git a/application/language/english/form_validation_lang.php b/application/language/english/form_validation_lang.php new file mode 100644 index 000000000..b8918a721 --- /dev/null +++ b/application/language/english/form_validation_lang.php @@ -0,0 +1,43 @@ +convertAccessType($permissions[$pCounter]); if (!isEmptyString($accessType)) // if compliant { @@ -209,6 +197,24 @@ class PermissionLib return $checkPermissions; } + /** + * Retrieves permission and required access type from the newly formatted permission string + * + * @param string $permission + * + * @return array + */ + public function convertAccessType($permission) + { + list($permission, $reqAccessType) = explode(PermissionLib::PERMISSION_SEPARATOR, $permission); + $accessType = ''; + if (strpos($reqAccessType, PermissionLib::READ_RIGHT) !== false) + $accessType = PermissionLib::SELECT_RIGHT; + if (strpos($reqAccessType, PermissionLib::WRITE_RIGHT) !== false) + $accessType = PermissionLib::REPLACE_RIGHT.PermissionLib::DELETE_RIGHT; + return [$permission, $accessType]; + } + /** * Checks if at least one of the permissions given as parameter (requiredPermissions) belongs to the authenticated user * It checks the given permissions against a given method (controller method name) and a given permission type (R and/or W) diff --git a/application/models/ressource/Betriebsmittelperson_model.php b/application/models/ressource/Betriebsmittelperson_model.php index 48c35381f..39f08b5cd 100644 --- a/application/models/ressource/Betriebsmittelperson_model.php +++ b/application/models/ressource/Betriebsmittelperson_model.php @@ -109,7 +109,7 @@ class Betriebsmittelperson_model extends DB_Model case 'betriebsmittelperson_id': $cond = 'bmp.betriebsmittelperson_id'; break; - default: + default: return error("ID nicht gültig"); } @@ -125,4 +125,20 @@ class Betriebsmittelperson_model extends DB_Model return $this->execQuery($query, array($id)); } + + /** + * Perform a loadWhere on the vw_betriebsmittelperson DB View + * + * @param array $where + * + * @return stdClass + */ + public function loadViewWhere($where) + { + $table = $this->dbTable; + $this->dbTable = 'public.vw_betriebsmittelperson'; + $result = $this->loadWhere($where); + $this->dbTable = $table; + return $result; + } } diff --git a/public/js/components/Betriebsmittel/Betriebsmittel.js b/public/js/components/Betriebsmittel/Betriebsmittel.js index 38563633f..211455dbf 100644 --- a/public/js/components/Betriebsmittel/Betriebsmittel.js +++ b/public/js/components/Betriebsmittel/Betriebsmittel.js @@ -1,19 +1,15 @@ -import VueDatePicker from '../vueDatepicker.js.php'; import {CoreFilterCmpt} from "../filter/Filter.js"; -import PvAutoComplete from "../../../../index.ci.php/public/js/components/primevue/autocomplete/autocomplete.esm.min.js"; import BsModal from "../Bootstrap/Modal.js"; -import FormForm from '../Form/Form.js'; +import CoreForm from '../Form/Form.js'; import FormInput from '../Form/Input.js'; export default { components: { CoreFilterCmpt, - VueDatePicker, BsModal, - FormForm, - FormInput, - PvAutoComplete + CoreForm, + FormInput }, inject: { cisRoot: { @@ -52,11 +48,11 @@ export default { {title: "Anmerkung", field: "anmerkung", visible: false}, {title: "Retourdatum", field: "format_retour", width: 128}, {title: "Beschreibung", field: "beschreibung"}, - {title: "Uid", field: "uid", width: 87}, + {title: "UID", field: "uid", width: 87}, {title: "Kaution", field: "kaution", visible: false}, - {title: "Ausgabedatum", field: "format_ausgabe", width: 144}, - {title: "Betriebsmittel_id", field: "betriebsmittel_id", visible: false}, - {title: "Betriebsmittelperson_id", field: "betriebsmittelperson_id", visible: false}, + {title: "Ausgabedatum", field: "format_ausgabe", width: 144, visible: false}, + {title: "Betriebsmittel ID", field: "betriebsmittel_id", visible: false}, + {title: "Betriebsmittelperson ID", field: "betriebsmittelperson_id", visible: false}, { title: 'Aktionen', field: 'actions', minWidth: 150, // Ensures Action-buttons will be always fully displayed @@ -142,11 +138,9 @@ export default { } } ], - betriebsmittelData: {}, - betriebsmittelperson_id : null, listBetriebsmitteltyp: [], formData: { - ausgegebenam : this.getDefaultDate(), + ausgegebenam : new Date(), betriebsmitteltyp: 'Zutrittskarte' }, statusNew: true, @@ -154,95 +148,89 @@ export default { } }, watch: { - uid() { - this.$refs.table.tabulator.setData(this.endpoint.getAllBetriebsmittel + '/' + this.typeId + '/' + this.id); + id() { + this.$refs.table.tabulator.setData('dummy', {type: this.typeId, id: this.id}); } }, methods: { actionEditBetriebsmittel(betriebsmittelperson_id) { this.statusNew = false; - this.loadBetriebsmittel(betriebsmittelperson_id); - this.$refs.betriebsmittelModal.show(); + this + .loadBetriebsmittel(betriebsmittelperson_id) + .then(this.$refs.betriebsmittelModal.show); }, actionNewBetriebsmittel() { this.resetModal(); this.$refs.betriebsmittelModal.show(); - this.statusNew = true; - this.formData.ausgegebenam = this.getDefaultDate(); - this.reload(); }, actionDeleteBetriebsmittel(betriebsmittelperson_id) { - this.loadBetriebsmittel(betriebsmittelperson_id).then(() => { - this.$refs.deleteBetriebsmittelModal.show(); - }); + this.$fhcAlert + .confirmDelete() + .then(result => result + ? betriebsmittelperson_id + : Promise.reject({handled: true})) + .then(this.endpoint.deleteBetriebsmittel) + .then(result => { + this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successDelete')); + window.scrollTo(0, 0); + this.reload(); + }) + .catch(this.$fhcAlert.handleSystemError); }, addNewBetriebsmittel() { //just append uid to formdata this.formData.uid = this.uid; - return this.endpoint.addNewBetriebsmittel(this.id, this.formData) + if (this.formData.betriebsmitteltyp == 'Inventar') + this.formData.betriebsmittel_id = this.formData.inventarData?.betriebsmittel_id; + return this.endpoint + .addNewBetriebsmittel(this.$refs.betriebsmittelData, this.id, this.formData) .then(response => { this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successSave')); - this.hideModal('betriebsmittelModal'); + this.$refs.betriebsmittelModal.hide(); this.resetModal(); - }).catch(this.$fhcAlert.handleSystemError) - .finally(() => { window.scrollTo(0, 0); this.reload(); - }); - }, - deleteBetriebsmittel(betriebsmittelperson_id) { - return this.endpoint.deleteBetriebsmittel(betriebsmittelperson_id) - .then( - result => { - this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successDelete')); - this.hideModal('deleteBetriebsmittelModal'); - this.resetModal(); - }) - .catch(this.$fhcAlert.handleSystemError) - .finally(() => { - window.scrollTo(0, 0); - this.reload(); - }); + }) + .catch(this.$fhcAlert.handleSystemError); }, updateBetriebsmittel(betriebsmittelperson_id) { - this.formData.uid = this.uid; - return this.endpoint.updateBetriebsmittel(betriebsmittelperson_id, this.formData) - .then(response => { - this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successSave')); - this.hideModal('betriebsmittelModal'); - this.resetModal(); - }).catch(this.$fhcAlert.handleSystemError) - .finally(() => { + if (this.formData.betriebsmitteltyp == 'Inventar') + this.formData.betriebsmittel_id = this.formData.inventarData?.betriebsmittel_id; + return this.endpoint + .updateBetriebsmittel(this.$refs.betriebsmittelData, betriebsmittelperson_id, this.formData) + .then(response => { + this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successSave')); + this.$refs.betriebsmittelModal.hide(); + this.resetModal(); window.scrollTo(0, 0); this.reload(); - }); + }) + .catch(this.$fhcAlert.handleSystemError); }, loadBetriebsmittel(betriebsmittelperson_id) { this.resetModal(); this.statusNew = false; - return this.endpoint.loadBetriebsmittel(betriebsmittelperson_id) - .then(result => result.data) + return this.endpoint + .loadBetriebsmittel(betriebsmittelperson_id) .then(result => { - this.formData = result; + this.formData = result.data; }) .catch(this.$fhcAlert.handleSystemError); }, searchInventar(event) { const encodedQuery = encodeURIComponent(event.query); - return this.endpoint.loadInventarliste(encodedQuery) + return this.endpoint + .loadInventarliste(encodedQuery) .then(result => { - this.filteredInventar = result.data.retval; + this.filteredInventar = result.data; }); }, reload() { this.$refs.table.reloadTable(); }, - hideModal(modalRef) { - this.$refs[modalRef].hide(); - }, resetModal() { this.formData = {}; - this.formData.ausgegebenam = this.getDefaultDate(); + this.formData.ausgegebenam = new Date(); this.formData.retouram = null; this.formData.betriebsmitteltyp = null; this.formData.nummer = null; @@ -250,34 +238,19 @@ export default { this.formData.kaution = null; this.formData.anmerkung = null; this.formData.beschreibung = null; - this.betriebsmittelperson_id = {}; this.statusNew = true; - }, - getDefaultDate() { - const today = new Date(); - return today; } }, - created(){ - return this.endpoint.getTypenBetriebsmittel() - .then(result => result.data) + created() { + return this.endpoint + .getTypenBetriebsmittel() .then(result => { - this.listBetriebsmitteltyp = result; + this.listBetriebsmitteltyp = result.data; }) .catch(this.$fhcAlert.handleSystemError); }, template: `
- - - - - - - - {{$p.t('ui', 'add_betriebsmittel')}}

{{$p.t('ui', 'edit_betriebsmittel')}}

- - + + Details - -
- + @@ -316,121 +288,119 @@ export default { > {{entry.beschreibung}} - -
+ +
+ +
+ + +
+
+ + +
-
- + - -
-
- - -
- -
- - -
- -
- - -
+ +
-
- + - -
- -
- +
+ +
+ - -
- -
- - -
- -
- -
- -
- -
- + +
- - +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ + + -
` } diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php index 34862d600..994003998 100644 --- a/system/phrasesupdate.php +++ b/system/phrasesupdate.php @@ -2261,6 +2261,26 @@ $phrases = array( ) ) ), + array( + 'app' => 'core', + 'category' => 'person', + 'phrase' => 'error_uidNotInPerson', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Die angegebene UID passt nicht zu der angegebenen Person', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Given UID is not assigned to the given Person', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), //**************** CORE/lehre array( @@ -22890,6 +22910,66 @@ array( ) ) ), + array( + 'app' => 'core', + 'category' => 'ui', + 'phrase' => 'error_fieldRequired', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Das Eingabefeld {field} ist erforderlich', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'The Input Field {field} is required', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'ui', + 'phrase' => 'error_fieldNotNumeric', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Das Eingabefeld {field} darf nur Zahlen enthalten.', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'The Field {Field} must contain only numbers.', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'ui', + 'phrase' => 'error_fieldNoValidEmail', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Das Eingabefeld {field} muss eine gültige Email-Adresse enthalten.', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'The field {field} must contain a valid email address.', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), // Personalverwaltung begin array( 'app' => 'core', @@ -25000,6 +25080,26 @@ array( ) ) ), + array( + 'app' => 'core', + 'category' => 'wawi', + 'phrase' => 'error_bmZutrittskarteOccupied', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Diese Zutrittskarte ist bereits ausgegeben an: {vorname} {nachname} ({uid})', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'This access card has already been issued to: {vorname} {nachname} ({uid})', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), array( 'app' => 'core', 'category' => 'wawi', From 9d455c35d0b26bfd954003384ad0204a1f4b77eb Mon Sep 17 00:00:00 2001 From: Harald Bamberger Date: Thu, 11 Jul 2024 18:32:47 +0200 Subject: [PATCH 7/8] Betriebsmittel.js: use arrow function for dynamic ajaxParams, Filter.js: remove required from filterType --- .../js/components/Betriebsmittel/Betriebsmittel.js | 12 +++++++----- public/js/components/filter/Filter.js | 3 +-- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/public/js/components/Betriebsmittel/Betriebsmittel.js b/public/js/components/Betriebsmittel/Betriebsmittel.js index 211455dbf..05ea141d1 100644 --- a/public/js/components/Betriebsmittel/Betriebsmittel.js +++ b/public/js/components/Betriebsmittel/Betriebsmittel.js @@ -36,10 +36,12 @@ export default { tabulatorOptions: { ajaxURL: 'dummy', ajaxRequestFunc: this.endpoint.getAllBetriebsmittel, - ajaxParams: { - type: this.typeId, - id: this.id - }, + ajaxParams: () => { + return { + type: this.typeId, + id: this.id + } + }, ajaxResponse: (url, params, response) => response.data, columns: [ {title: "Nummer", field: "nummer", width: 150}, @@ -149,7 +151,7 @@ export default { }, watch: { id() { - this.$refs.table.tabulator.setData('dummy', {type: this.typeId, id: this.id}); + this.$refs.table.tabulator.setData('dummy'); } }, methods: { diff --git a/public/js/components/filter/Filter.js b/public/js/components/filter/Filter.js index a7d93523e..5d8954d36 100644 --- a/public/js/components/filter/Filter.js +++ b/public/js/components/filter/Filter.js @@ -48,8 +48,7 @@ export const CoreFilterCmpt = { default: true }, filterType: { - type: String, - required: true + type: String }, tabulatorOptions: Object, tabulatorEvents: Array, From 464dbba457d7af9df3100c8c84f3b7af0b4fac0c Mon Sep 17 00:00:00 2001 From: Harald Bamberger Date: Thu, 11 Jul 2024 18:43:31 +0200 Subject: [PATCH 8/8] add missing api js files --- public/js/api/betriebsmittel.js | 5 +++++ public/js/api/betriebsmittel/person.js | 26 ++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 public/js/api/betriebsmittel.js create mode 100644 public/js/api/betriebsmittel/person.js diff --git a/public/js/api/betriebsmittel.js b/public/js/api/betriebsmittel.js new file mode 100644 index 000000000..bd088b195 --- /dev/null +++ b/public/js/api/betriebsmittel.js @@ -0,0 +1,5 @@ +import person from "./betriebsmittel/person.js"; + +export default { + person +} \ No newline at end of file diff --git a/public/js/api/betriebsmittel/person.js b/public/js/api/betriebsmittel/person.js new file mode 100644 index 000000000..7ad6d49b7 --- /dev/null +++ b/public/js/api/betriebsmittel/person.js @@ -0,0 +1,26 @@ +export default { + getAllBetriebsmittel(url, config, params){ + return this.$fhcApi.get('api/frontend/v1/betriebsmittel/betriebsmittelP/getAllBetriebsmittel/' + params.type + '/' + params.id); + }, + addNewBetriebsmittel(form, person_id, formData) { + return this.$fhcApi.post(form, 'api/frontend/v1/betriebsmittel/betriebsmittelP/addNewBetriebsmittel/' + + person_id, formData + ); + }, + loadBetriebsmittel(betriebsmittelperson_id){ + return this.$fhcApi.post('api/frontend/v1/betriebsmittel/betriebsmittelP/loadBetriebsmittel/' + betriebsmittelperson_id); + }, + updateBetriebsmittel(form, betriebsmittelperson_id, formData) { + return this.$fhcApi.post(form, 'api/frontend/v1/betriebsmittel/betriebsmittelP/updateBetriebsmittel/' + betriebsmittelperson_id, + formData); + }, + deleteBetriebsmittel(betriebsmittelperson_id){ + return this.$fhcApi.post('api/frontend/v1/betriebsmittel/betriebsmittelP/deleteBetriebsmittel/' + betriebsmittelperson_id); + }, + getTypenBetriebsmittel(){ + return this.$fhcApi.get('api/frontend/v1/betriebsmittel/betriebsmittelP/getTypenBetriebsmittel/'); + }, + loadInventarliste(query){ + return this.$fhcApi.get('api/frontend/v1/betriebsmittel/betriebsmittelP/loadInventarliste/' + query); + } +} \ No newline at end of file