From a924c9d2bbda7ab2ef7d45ee8d9c7c36b2bb2cb9 Mon Sep 17 00:00:00 2001 From: Harald Bamberger Date: Wed, 29 May 2024 11:49:11 +0200 Subject: [PATCH] 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')}}

+
+
+ +
+ +
+ + + +
+
+ +
+ +
+ +
+
+
+ +
+ +
+
+ +
+ +
+ + +
+
+ +
+ +
+ + +
+
+ +
+ +
+ + +
+
+ +
+ +
+ + +
+
+ +
+ +
+ + +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ + +
+ +
+ +
+
+ +
+ +
+
+ +
+ + + + + + +
` +} +