update childcomponent vertragstati

This commit is contained in:
ma0068
2024-11-05 16:06:14 +01:00
parent b1452698f8
commit 40baa7e08c
6 changed files with 248 additions and 48 deletions
@@ -13,12 +13,14 @@ class Vertraege extends FHCAPI_Controller
'getAllContractsNotAssigned' => ['admin:r', 'assistenz:r'],
'getAllContractsAssigned' => ['admin:r', 'assistenz:r'],
'getAllContractTypes' => self::PERM_LOGGED,
'getAllContractStati' => self::PERM_LOGGED,
'getStatiOfContract' => self::PERM_LOGGED,
'loadContract' => ['admin:r', 'assistenz:r'],
'updateContract' => ['admin:r', 'assistenz:r'],
'addNewContract' => ['admin:r', 'assistenz:r'],
'deleteContract' => ['admin:r', 'assistenz:r'],
'insertContractStatus' => ['admin:r', 'assistenz:r'],
'deleteContractStatus' => ['admin:r', 'assistenz:r'],
]);
//Load Models
@@ -82,6 +84,17 @@ class Vertraege extends FHCAPI_Controller
$this->terminateWithSuccess(getData($result) ?: []);
}
public function getAllContractStati()
{
//TODO(MANUU)
$result = $this->VertragsstatusModel->load();
if (isError($result))
{
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
}
$this->terminateWithSuccess(getData($result) ?: []);
}
public function addNewContract($person_id)
{
//$this->validateNewOrUpdate();
@@ -221,4 +234,51 @@ class Vertraege extends FHCAPI_Controller
}
return $this->outputJsonSuccess(current(getData($result)));
}
public function insertContractStatus ($vertrag_id, $datum, $status){
$result = $this->VertragvertragsstatusModel->loadWhere(
array(
'vertrag_id' => $vertrag_id,
'vertragsstatus_kurzbz' => $status
)
);
if (hasData($result)) {
$this->terminateWithError("status bereits vorhanden", self::ERROR_TYPE_GENERAL);
// $this->terminateWithError($this->p->t('ui', 'error_status_existing', ['id' => 'Vertrag_id']), self::ERROR_TYPE_GENERAL);
}
$status_result = $this->VertragvertragsstatusModel->insert([
'vertrag_id' => $vertrag_id,
'uid' => getAuthUID(),
'vertragsstatus_kurzbz' => $status,
'insertamum' => date('c'),
'insertvon' => getAuthUID(),
'datum' => $datum
]);
if (!$status_result) {
$this->terminateWithError('Fehler beim Hinzufügen des Vertragsstatus.');
}
return $this->outputJsonSuccess(current(getData($status_result)));
}
public function deleteContractStatus($vertrag_id, $status){
//return $this->terminateWithError($vertrag_id . " - " . $status, self::ERROR_TYPE_GENERAL);
$result = $this->VertragvertragsstatusModel->delete(
array(
'vertrag_id' => $vertrag_id,
'vertragsstatus_kurzbz' => $status
)
);
if (isError($result)) {
return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
}
if (!hasData($result)) {
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id' => 'vertragsstatus_kurzb']), self::ERROR_TYPE_GENERAL);
}
return $this->outputJsonSuccess(current(getData($result)));
}
}
@@ -477,7 +477,9 @@ SELECT
{
$query = "
SELECT
*
*,
TO_CHAR(tbl_vertrag_vertragsstatus.datum::timestamp, 'DD.MM.YYYY HH24:MI') AS format_datum,
TO_CHAR(tbl_vertrag_vertragsstatus.insertamum::timestamp, 'DD.MM.YYYY HH24:MI') AS format_insertamum
FROM
lehre.tbl_vertrag_vertragsstatus
JOIN lehre.tbl_vertragsstatus USING(vertragsstatus_kurzbz)
+10
View File
@@ -18,6 +18,9 @@ export default {
getAllContractTypes(){
return this.$fhcApi.get('api/frontend/v1/vertraege/vertraege/getAllContractTypes/');
},
getAllContractStati(){
return this.$fhcApi.get('api/frontend/v1/vertraege/vertraege/getAllContractStati/');
},
addNewContract(person_id, formData) {
return this.$fhcApi.post('api/frontend/v1/vertraege/vertraege/addNewContract/' +
person_id, formData
@@ -33,4 +36,11 @@ export default {
deleteContract(vertrag_id){
return this.$fhcApi.post('api/frontend/v1/vertraege/vertraege/deleteContract/' + vertrag_id);
},
insertContractStatus(params) {
return this.$fhcApi.post('api/frontend/v1/vertraege/vertraege/insertContractStatus/' + params.vertrag_id + '/' + params.datum + '/' + Object.values(params.status).join('/'));
},
deleteContractStatus(params) {
console.log("API", params.vertrag_id, params.status);
return this.$fhcApi.post('api/frontend/v1/vertraege/vertraege/deleteContractStatus/' + Object.values(params.vertrag_id).join('/') + '/' + Object.values(params.status).join('/'));
}
}
+122 -14
View File
@@ -16,6 +16,10 @@ export default {
type: [Number],
required: true
},
listContractStati: {
type: Array,
required: true
},
},
data() {
return {
@@ -29,17 +33,40 @@ export default {
},
ajaxResponse: (url, params, response) => response.data,
columns: [
{title: "Status", field: "status", width: 125},
{title: "Datum", field: "datum", width: 150},
{title: "Status", field: "vertragsstatus_kurzbz"},
{title: "Datum", field: "format_datum"},
{title: "vertrag_id", field: "vertrag_id", visible: false},
{title: "User", field: "bezeichnung", width: 150},
{title: "Vertragsstatus_kurzbz", field: "studiensemester_kurzbz"},
// {title: "User", field: "bezeichnung", visible: false},
// {title: "Vertragsstatus_kurzbz", field: "Vertragsstatus_kurzbz", visible: false},
{title: "insertvon", field: "insertvon", visible: false},
{title: "insertamum", field: "insertamum", visible: false},
{title: "updatevon", field: "updatevon", visible: false},
{title: "updateamum", field: "updateamum", visible: true},
// {title: "insertamum", field: "insertamum", visible: false},
{title: "insertamum", field: "format_insertamum", visible: false},
{title: "betreuerart_kurzbz", field: "betreuerart_kurzbz", visible: false},
{title: "Vertragsstunden", field: "vertragsstunden", visible: false},
{
title: 'Aktionen', field: 'actions',
minWidth: 150,
formatter: (cell, formatterParams, onRendered) => {
const 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 = '<i class="fa fa-xmark"></i>';
button.title = 'Status löschen';
button.addEventListener(
'click',
() =>
this.actionDeleteStatus(cell.getData().vertrag_id, cell.getData().vertragsstatus_kurzbz)
);
container.append(button);
return container;
},
frozen: true
},
],
layout: 'fitColumns',
layoutColumnsOnNewData: false,
@@ -47,7 +74,11 @@ export default {
selectableRangeMode: 'click',
selectable: true,
},
clickedRows: []
clickedRows: [],
formContractData: {
vertragsstatus_kurzbz: null,
datum: new Date()
},
}
},
watch: {
@@ -55,21 +86,98 @@ export default {
this.$refs.table.tabulator.setData('api/frontend/v1/vertraege/vertraege/getStatiOfContract/' + this.vertrag_id);
}
},
methods: { },
methods: {
actionNewStatus() {
console.log("actionNewStatus");
this.$refs.contractStatus.show();
},
actionDeleteStatus(vertrag_id, status) {
console.log("action: deleteStatus " + status + " from Vertrag" + vertrag_id);
this.$emit('deleteContractStatus', {
status: status,
vertrag_id: vertrag_id
});
},
handleSubmit(){
this.$emit('setContractStatus', {
status: this.formContractData.vertragsstatus_kurzbz,
datum: this.formContractData.datum
});
},
closeModal(){
this.$refs.contractStatus.hide();
this.$emit('close-modal');
},
reload() {
this.$refs.table.reloadTable();
this.$emit('reload');
},
},
template: `
<!--TODO(Manu) check filter (akzeptiert, neu, erteilt?), design -->
<div class="core-vertraege h-50 d-flex flex-column w-100">
<!-- person_id: {{person_id}}-->
<br>
vertrag_id: {{vertrag_id}} !
<h4>Vertragstatus</h4>
<h4>Vertragsstatus</h4>
<core-filter-cmpt
ref="table"
:tabulator-options="tabulatorOptions"
table-only
:side-menu="false"
:side-menu="false"
reload
new-btn-show
new-btn-label="Status"
@click:new="actionNewStatus"
>
</core-filter-cmpt>
</core-filter-cmpt>
<div >
<bs-modal ref="contractStatus">
<template #title>
<p class="fw-bold mt-3">{{$p.t('ui', 'add_Status')}}</p>
</template>
<core-form>
<div class="row mb-3">
<form-input
type="DatePicker"
:label="$p.t('global/datum')"
name="datum"
v-model="formContractData.datum"
auto-apply
:enable-time-picker="false"
format="dd.MM.yyyy"
preview-format="dd.MM.yyyy"
:teleport="true"
>
</form-input>
</div>
<div class="row mb-3">
<form-input
type="select"
:label="$p.t('global/typ')"
v-model="formContractData.vertragsstatus_kurzbz"
name="vertragsstatus_kurzbz"
>
<option :value="null">{{$p.t('ui', 'bitteWaehlen')}}</option>
<option
v-for="entry in listContractStati"
:key="entry.vertragsstatus_kurzbz"
:value="entry.vertragsstatus_kurzbz"
>
{{entry.bezeichnung}}
</option>
</form-input>
</div>
</core-form>
<template #footer>
<button type="button" class="btn btn-primary" @click="handleSubmit()">{{$p.t('ui', 'speichern')}}</button>
</template>
</bs-modal>
</div>
</div>`
}
@@ -3,7 +3,6 @@ import {CoreFilterCmpt} from "../../filter/Filter.js";
import BsModal from "../../Bootstrap/Modal.js";
import CoreForm from '../../Form/Form.js';
import FormInput from '../../Form/Input.js';
import {BismeldestichtagHelper} from "../../../apps/Bismeldestichtag/BismeldestichtagHelper";
export default {
components: {
+52 -31
View File
@@ -130,22 +130,20 @@ export default {
formData: {},
listContractsUnassigned: [],
listContractTypes: [],
contractSelected: []
contractSelected: [],
listContractStati: [],
// isContractModalVisible: true,
}
},
methods: {
actionNewContract() {
console.log("actionNewContract");
this.resetModal();
//this.loadContractsNotAssigned(this.person_id);
this.$refs.contractModal.show();
},
actionEditContract(vertrag_id) {
console.log("actionEditContract " + vertrag_id);
this.statusNew = false;
this
.loadContract(vertrag_id)
this.loadContract(vertrag_id)
.then(this.$refs.contractModal.show);
},
actionDeleteContract(vertrag_id) {
@@ -175,6 +173,43 @@ export default {
})
.catch(this.$fhcAlert.handleSystemError);
},
addNewContractStatus({status, datum}) {
const date = new Date();
//TODO(Manu) refactor this
const formattedDate = datum.toLocaleDateString('en-CA');
let params = {
vertrag_id : this.contractSelected.vertrag_id,
status: {status},
datum: formattedDate
}
return this.endpoint
.insertContractStatus(params)
.then(response => {
this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successSave'));
this.$refs.contractstati.closeModal();
window.scrollTo(0, 0);
this.$refs.contractstati.reload();
})
.catch(this.$fhcAlert.handleSystemError);
},
deleteContractStatus({status, vertrag_id}){
let params = {
vertrag_id : {vertrag_id},
status: {status}
}
return this.endpoint
.deleteContractStatus(params)
.then(response => {
this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successDelete'));
window.scrollTo(0, 0);
this.$refs.contractstati.reload();
})
.catch(this.$fhcAlert.handleSystemError);
},
updateContract(vertrag_id) {
return this.endpoint
.updateContract(vertrag_id, this.formData)
@@ -210,11 +245,13 @@ export default {
created() {
Promise.all([
this.endpoint.getAllContractTypes(),
this.endpoint.getAllContractsNotAssigned2(this.person_id)
this.endpoint.getAllContractsNotAssigned2(this.person_id),
this.endpoint.getAllContractStati(),
])
.then(([result1, result2]) => {
.then(([result1, result2, result3]) => {
this.listContractTypes = result1.data;
this.listContractsUnassigned = result2.data;
this.listContractStati = result3.data;
})
.catch(this.$fhcAlert.handleSystemError);
},
@@ -230,10 +267,6 @@ export default {
<div class="core-vertraege h-100 d-flex flex-column">
{{formData}}
{{contractSelected}}
<core-filter-cmpt
ref="table"
:tabulator-options="tabulatorOptions"
@@ -253,35 +286,23 @@ export default {
<div class="col-sm-6">
<!-- ContractDetails -->
<div class="md-4" v-if="contractSelected.vertrag_id !=null">
<ContractDetails :person_id="person_id" :vertrag_id="contractSelected.vertrag_id"></ContractDetails>
<contract-details :person_id="person_id" :vertrag_id="contractSelected.vertrag_id"></contract-details>
</div>
</div>
<div class="col-sm-6">
<!-- ContractStati -->
<div class="md-4" v-if="contractSelected.vertrag_id !=null">
<ContractStati :vertrag_id="contractSelected.vertrag_id"></ContractStati>
<contract-stati :vertrag_id="contractSelected.vertrag_id" :listContractStati="listContractStati"
@setContractStatus="addNewContractStatus"
@deleteContractStatus="deleteContractStatus"
ref="contractstati"
></contract-stati>
</div>
</div>
</div>
<!-- <hr>
<div>
&lt;!&ndash; ContractDetails &ndash;&gt;
<div class="row md-4" v-if="contractSelected.vertrag_id !=null">
<ContractDetails :person_id="person_id" :vertrag_id="contractSelected.vertrag_id"></ContractDetails>
</div>
</div>
<div>
&lt;!&ndash; ContractStati &ndash;&gt;
<div class="row md-4" v-if="contractSelected.vertrag_id !=null">
<ContractStati :vertrag_id="contractSelected.vertrag_id"></ContractStati>
</div>
</div>-->
<!--Modal: contractModal-->
<bs-modal ref="contractModal" dialog-class="modal-xl">
<template #title>
@@ -291,7 +312,7 @@ export default {
<core-form class="row g-3" ref="unassignedData">
<ListUnassigned :endpoint="$fhcApi.factory.vertraege.person" :person_id="person_id"></ListUnassigned>
<list-unassigned :endpoint="$fhcApi.factory.vertraege.person" :person_id="person_id"></list-unassigned>
<div class="row mb-3">
<form-input