Logik Inventar, Validierungen

This commit is contained in:
ma0068
2024-04-09 15:03:43 +02:00
parent 53e44b9df5
commit d63c7c3457
4 changed files with 188 additions and 138 deletions
@@ -14,7 +14,8 @@ class Betriebsmittel extends FHCAPI_Controller
'updateBetriebsmittel' => ['admin:r', 'assistenz:r'],
'loadBetriebsmittel' => ['admin:r', 'assistenz:r'],
'deleteBetriebsmittel' => ['admin:r', 'assistenz:r'],
'getTypenBetriebsmittel' => ['admin:r', 'assistenz:r']
'getTypenBetriebsmittel' => ['admin:r', 'assistenz:r'],
'loadInventarliste' => ['admin:r', 'assistenz:r']
]);
//Load Models
@@ -34,17 +35,16 @@ class Betriebsmittel extends FHCAPI_Controller
public function getAllBetriebsmittel($uid, $person_id)
{
//uid
//$result = $this->BetriebsmittelpersonModel->getBetriebsmittelByUid($uid);
//$result = $this->BetriebsmittelpersonModel->getBetriebsmittelData($uid, 'uid');
//person_id
$result = $this->BetriebsmittelpersonModel->getBetriebsmittel($person_id);
$result = $this->BetriebsmittelpersonModel->getBetriebsmittelData($person_id, 'person');
if (isError($result))
{
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
}
//all
$this->terminateWithSuccess((getData($result) ?: []));
}
@@ -61,10 +61,29 @@ class Betriebsmittel extends FHCAPI_Controller
$_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');
@@ -73,26 +92,46 @@ class Betriebsmittel extends FHCAPI_Controller
$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("Eine Zutrittskarte muss eine Nummer haben. Um die Zuordnung zu dieser Karte zu loeschen entfernen Sie bitte den ganzen Datensatz", self::ERROR_TYPE_GENERAL);
}
if($retouram && $retouram < $ausgegebenam)
return $this->terminateWithError("Retourdatum darf nicht vor Datum der Ausgabe liegen", self::ERROR_TYPE_GENERAL);
if($betriebsmitteltyp == "Inventar" && !($inventarData['inventarnummer']))
return $this->terminateWithError("Bitte wählen Sie das entsprechende Inventar aus dem Drop Down Menü aus", self::ERROR_TYPE_GENERAL);
// Start DB transaction
$this->db->trans_begin();
$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))
if(!$inventarData)
{
$this->db->trans_rollback();
return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
$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;
}
$betriebsmittel_id = $result->retval;
$result = $this->BetriebsmittelpersonModel->insert(
[
@@ -147,6 +186,33 @@ class Betriebsmittel extends FHCAPI_Controller
$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("Eine Zutrittskarte muss eine Nummer haben. Um die Zuordnung zu dieser Karte zu loeschen entfernen Sie bitte den ganzen Datensatz", self::ERROR_TYPE_GENERAL);
}
if($retouram && $retouram < $ausgegebenam)
return $this->terminateWithError("Retourdatum darf nicht vor Datum der Ausgabe liegen", self::ERROR_TYPE_GENERAL);
// Start DB transaction
$this->db->trans_begin();
@@ -162,8 +228,8 @@ class Betriebsmittel extends FHCAPI_Controller
'anmerkung' => $anmerkung,
'ausgegebenam' => $ausgegebenam,
'retouram ' => $retouram,
'insertvon' => $uid_user,
'insertamum' => date('c')
'updatevon' => $uid_user,
'updateamum' => date('c')
]
);
@@ -199,35 +265,13 @@ class Betriebsmittel extends FHCAPI_Controller
}
//TODO(Manu) defaultmässig ersten Eintrag in Edit Modus
public function getFirstBetriebsmittel($uid, $person_id)
{
//uid
//$result = $this->BetriebsmittelpersonModel->getFirstBetriebsmittelByUid($uid);
//person_id
$result = $this->BetriebsmittelpersonModel->getFirstBetriebsmittelByUid($person_id);
if (isError($result))
{
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
}
$this->terminateWithSuccess((getData($result) ?: []));
}
public function loadBetriebsmittel()
{
$_POST = json_decode(utf8_encode($this->input->raw_input_stream), true);
$betriebsmittelperson_id = $this->input->post('betriebsmittelperson_id');
//$this->terminateWithError("id in function api: " . $betriebsmittelperson_id, self::ERROR_TYPE_GENERAL);
$this->BetriebsmittelpersonModel->addJoin('wawi.tbl_betriebsmittel', 'betriebsmittel_id');
$result = $this->BetriebsmittelpersonModel->loadWhere(
array('betriebsmittelperson_id' => $betriebsmittelperson_id));
$result = $this->BetriebsmittelpersonModel->getBetriebsmittelData($betriebsmittelperson_id, 'betriebsmittelperson_id');
if (isError($result))
{
@@ -239,23 +283,17 @@ class Betriebsmittel extends FHCAPI_Controller
$this->terminateWithError("no Betriebsmittelperson with ID found: " . $betriebsmittelperson_id, self::ERROR_TYPE_GENERAL);
}
// var_dump($result);
$this->terminateWithSuccess(current(getData($result)));
}
public function deleteBetriebsmittel()
{
//var_dump($betriebsmittelperson_id);
$_POST = json_decode(utf8_encode($this->input->raw_input_stream), true);
$betriebsmittelperson_id = $this->input->post('betriebsmittelperson_id');
//return $this->terminateWithError("Betriebsmittelperson " . $betriebsmittelperson_id . " wird gelöscht",self::ERROR_TYPE_GENERAL);
$result = $this->BetriebsmittelpersonModel->delete(
array('betriebsmittelperson_id' => $betriebsmittelperson_id,
)
@@ -277,7 +315,9 @@ class Betriebsmittel extends FHCAPI_Controller
{
$this->load->model('ressource/Betriebsmitteltyp_model', 'BetriebsmitteltypModel');
$result = $this->BetriebsmitteltypModel->load();
$this->BetriebsmitteltypModel->addOrder('beschreibung', 'ASC');
$result = $this->BetriebsmitteltypModel->load(); // load All
if (isError($result))
{
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
@@ -285,6 +325,14 @@ class Betriebsmittel extends FHCAPI_Controller
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 ?: []);
}
}
@@ -13,17 +13,22 @@ class Betriebsmittel_model extends DB_Model
}
/**
* getBetriebsmittelById
* load Liste Inventarnummern
*/
/* public function loadBetriebsmittel($betriebsmittelperson_id){
$query = "
SELECT *
FROM wawi.tbl_betriebsmittelperson
JOIN wawi.tbl_betriebsmittel ON (wawi.tbl_betriebsmittelperson.betriebsmittel_id = wawi.tbl_betriebsmittel.betriebsmittel_id)
WHERE wawi.tbl_betriebsmittelperson.betriebsmittelperson_id = ?
";
public function loadInventarliste($filter)
{
$filter = strtoLower($filter);
return $this->execQuery($query, array($betriebsmittelperson_id));
}*/
$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);
}
}
@@ -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, bm.beschreibung, bmp.ausgegebenam, bmp.uid, bmp.kaution, bm.betriebsmittel_id, bmp.betriebsmittelperson_id, bm.inventarnummer --bm.*
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));
}
}
@@ -1,5 +1,7 @@
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";
import FormForm from '../Form/Form.js';
import FormInput from '../Form/Input.js';
@@ -11,6 +13,7 @@ export default {
BsModal,
FormForm,
FormInput,
PvAutoComplete
},
inject: {
cisRoot: {
@@ -31,13 +34,10 @@ export default {
{title: "Nummer", field: "nummer"},
{title: "PersonId", field: "person_id"},
{title: "Typ", field: "betriebsmitteltyp"},
// {title: "insertVon", field: "insertvon"}, //Test
// {title: "insertAmUm", field: "insertamum"}, //TESt
// {title: "Betriebsmittelperson_id", field: "betriebsmittelperson_id"},
{title: "Anmerkung", field: "anmerkung", visible: false},
{title: "Retourdatum", field: "retouram"},
{title: "Beschreibung", field: "beschreibung"},
{title: "Uid", field: "uid"},
{title: "Anmerkung", field: "anmerkung", visible: false},
{title: "Kaution", field: "kaution", visible: false},
{title: "Ausgabedatum", field: "ausgegebenam", visible: false},
{title: "Betriebsmittel_id", field: "betriebsmittel_id", visible: false},
@@ -97,79 +97,31 @@ export default {
selectableRangeMode: 'click',
selectable: true
},
//tableData: [],
tabulatorEvents: [
{
/* //TODO Manu phrases
}*/
//TODO(manu)für editieren mit click: conflict with action buttons
/* event: 'rowSelectionChanged',
handler: this.rowSelectionChanged*/
/* handler: (e, row.getData().betriebsmittelperson_id) => {
// HandlerFunktion, die aufgerufen wird, wenn das Ereignis ausgelöst wird
//this.rowSelectionChanged(row.getData().betriebsmittelperson_id);
// console.log("Selected Row Data:", row.getData());
//console.log(cell.getData().betriebsmittelperson_id);
*/
},
],
tabulatorEvents: [],
betriebsmittelData: {},
betriebsmittelperson_id : null,
listBetriebsmitteltyp: [],
formData: {
ausgegebenam : this.getDefaultDate(),
betriebsmitteltyp: 'Zutrittskarte'
},
statusNew: true,
changesDetected: false
};
},
computed: {
deltaLength() {
return Object.keys(this.formData).length;
}
},
watch: {
formData: {
handler: function(newVal) {
//console.log('Das Objekt wurde geändert:', newVal);
this.changesDetected = true;
},
deep: true // Hiermit wird auch die Veränderung von Eigenschaften des Objekts überwacht
filteredInventar: []
}
},
methods: {
rowSelectionChanged(data) {
//console.log("Selected Row Data:", data[0].betriebsmittelperson_id);
this.param_id = {
'betriebsmittelperson_id': data[0].betriebsmittelperson_id};
this.loadBetriebsmittel(this.param_id);
},
actionEditBetriebsmittel(betriebsmittelperson_id){
console.log("action EditBM: id: " + betriebsmittelperson_id);
this.statusNew = false;
this.loadBetriebsmittel(betriebsmittelperson_id);
this.changesDetected = false;
},
actionNewBetriebsmittel(){
console.log("action newBM: person " + this.person_id);
this.resetModal();
this.statusNew = true;
this.formData.ausgegebenam = this.getDefaultDate();
//this.changesDetected = false;
this.reload();
},
actionDeleteBetriebsmittel(betriebsmittelperson_id){
console.log("Löschen von Datensatz mit id: " + betriebsmittelperson_id);
this.loadBetriebsmittel(betriebsmittelperson_id).then(() => {
/* if(this.formData) {
this.$refs.deleteBetriebsmittelModal.show();
}*/
console.log("nach load" + betriebsmittelperson_id);
this.$refs.deleteBetriebsmittelModal.show();
});
},
@@ -184,17 +136,14 @@ export default {
).then(response => {
console.log(response);
this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successSave'));
// this.hideModal('newBetriebsmittelModal');
this.resetModal();
}).catch(this.$fhcAlert.handleSystemError)
.finally(() => {
window.scrollTo(0, 0);
this.reload();
});
//this.changesDetected = false; //not working
},
deleteBetriebsmittel(betriebsmittelperson_id){
console.log("Delete mit id: " + betriebsmittelperson_id);
this.param = {
'betriebsmittelperson_id': betriebsmittelperson_id
};
@@ -221,7 +170,6 @@ export default {
this.$fhcApi.post('api/frontend/v1/stv/betriebsmittel/updateBetriebsmittel/',
this.param
).then(response => {
//console.log(response);
this.$fhcAlert.alertSuccess(this.$p.t('ui', 'editSave'));
// this.hideModal('newBetriebsmittelModal');
this.resetModal();
@@ -232,7 +180,6 @@ export default {
});
},
loadBetriebsmittel(betriebsmittelperson_id){
console.log("loadBetriebsmittel id:" + betriebsmittelperson_id);
this.resetModal();
this.statusNew = false;
this.param = {
@@ -245,11 +192,16 @@ export default {
this.formData = result;
})
.catch(this.$fhcAlert.handleSystemError);
// this.changesDetected = false;
},
searchInventar(event){
return this.$fhcApi
.get('api/frontend/v1/stv/betriebsmittel/loadInventarliste/' + event.query)
.then(result => {
this.filteredInventar = result.data.retval;
});
},
reload(){
this.$refs.table.reloadTable();
//this.changesDetected = false;
},
hideModal(modalRef){
this.$refs[modalRef].hide();
@@ -257,10 +209,15 @@ export default {
resetModal(){
this.formData = {};
this.formData.ausgegebenam = this.getDefaultDate();
this.formData.listBetriebsmitteltyp = null;
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;
//this.changesDetected = false;
},
getDefaultDate() {
const today = new Date();
@@ -323,7 +280,7 @@ export default {
<BsModal ref="deleteBetriebsmittelModal">
<template #title>Betriebsmittel löschen</template>
<template #default>
<p>Betriebsmittel ({{formData.betriebsmitteltyp}} / {{formData.betriebsmittelperson_id}}) wirklich löschen?</p>
<p>Betriebsmittel {{formData.betriebsmitteltyp}} wirklich löschen?</p>
</template>
<template #footer>
<!-- <button type="button" class="btn btn-secondary" data-bs-dismiss="modal" @click="resetModal">Abbrechen</button>-->
@@ -344,9 +301,7 @@ export default {
>
</core-filter-cmpt>
<br>
{{cisRoot}}
{{formData}} {{changesDetected}}
<hr>
<form-form class="row g-3 col-6" ref="betriebsmittelData">
<legend>Details</legend>
@@ -364,13 +319,28 @@ export default {
type="select"
name="typ"
v-model="formData.betriebsmitteltyp"
:disabled="!statusNew"
>
<option v-for="entry in listBetriebsmitteltyp" :key="entry.betriebsmitteltyp" :value="entry.betriebsmitteltyp">{{entry.betriebsmitteltyp}}</option>
<option v-for="entry in listBetriebsmitteltyp" :key="entry.betriebsmitteltyp" :value="entry.betriebsmitteltyp">{{entry.beschreibung}}</option>
</form-input>
</div>
</div>
<div class="row mb-3">
<div v-if="formData.betriebsmitteltyp == 'Inventar'" class="row mb-3">
<label for="inventarnummer" class="form-label col-sm-4">Inventarnummer</label>
<div class="col-sm-6">
<PvAutoComplete v-model="formData['inventarData']" optionLabel="dropdowntext" :suggestions="filteredInventar" @complete="searchInventar" minLength="3"/>
</div>
</div>
<div v-else-if="formData.inventarnummer" class="row mb-3">
<label for="inventarnummer" class="form-label col-sm-4">Inventarnummer</label>
<div class="col-sm-6">
<input type="text" :readonly="readonly" class="form-control" id="inventarnummer" v-model="formData.inventarnummer" :disabled="!statusNew">
</div>
</div>
<div v-if="formData.betriebsmitteltyp!='Inventar' && !formData.inventarnummer" class="row mb-3">
<label for="nummer" class="form-label col-sm-4">Nummer</label>
<div class="col-sm-6">
<form-input
@@ -382,7 +352,7 @@ export default {
</div>
</div>
<div class="row mb-3">
<div v-if="formData.betriebsmitteltyp!='Inventar' && !formData.inventarnummer" class="row mb-3">
<label for="nummer2" class="form-label col-sm-4">Nummer2</label>
<div class="col-sm-6">
<form-input
@@ -394,13 +364,14 @@ export default {
</div>
</div>
<div class="row mb-3">
<div v-if="formData.betriebsmitteltyp!='Inventar'" class="row mb-3">
<label for="beschreibung" class="form-label col-sm-4">Beschreibung</label>
<div class="col-sm-6">
<form-input
type="textarea"
name="beschreibung"
v-model="formData['beschreibung']"
:disabled="formData.inventarnummer"
>
</form-input>
</div>
@@ -462,19 +433,16 @@ export default {
:teleport="true"
></form-input>
</div>
<!-- <div class="position-sticky top-0 z-1">
<button type="submit" class="btn btn-primary position-absolute top-0 end-0" :disabled="!deltaLength">Speichern2</button>
</div>-->
</div>
<div class="row mb-3">
<label class="form-label col-sm-8"></label>
<div v-if="statusNew" class="col-sm-4">
<button ref="Close" type="button" class="btn btn-primary" @click="addNewBetriebsmittel()" :disabled="!changesDetected">Speichern</button>
<button ref="Close" type="button" class="btn btn-primary" @click="addNewBetriebsmittel()">Speichern</button>
</div>
<div v-else class="col-sm-4">
<button ref="Close" type="button" class="btn btn-warning" @click="updateBetriebsmittel()" :disabled="!changesDetected">Aktualisieren</button>
<button ref="Close" type="button" class="btn btn-warning" @click="updateBetriebsmittel()">Aktualisieren</button>
</div>
</div>