- fix error with Event 'multiActionPrintHonorarvertrag'

- Naming components Vertragsverwaltung, MitarbeiterHeader, CoreListMitarbeiter
- link to Vorgesetzter, show Vorgesetzter without postTitel
- Foto: if foto_sperre: show foto with lock
This commit is contained in:
ma0068
2025-06-11 13:46:23 +02:00
parent a8f47fad45
commit a56a804692
7 changed files with 213 additions and 224 deletions
@@ -37,6 +37,7 @@ class Config extends FHCAPI_Controller
public function printDocument()
{
$params = [];
$menu = [];
Events::trigger(
'multiActionPrintHonorarvertrag',
@@ -47,7 +48,15 @@ class Config extends FHCAPI_Controller
$params
);
//TODO(Manu) check warning
$this->terminateWithSuccess($menu[0]);
if (is_array($menu) && isset($menu[0]))
{
$this->terminateWithSuccess($menu[0]);
}
else
{
// $this->terminateWithError('Error with Event 'multiActionPrintHonorarvertrag');
$this->terminateWithSuccess();
}
}
}
+13 -12
View File
@@ -22,12 +22,6 @@ export default {
url: 'api/frontend/v1/vertraege/Vertraege/getAllVertraege/' + person_id
};
},
/* getAllContractsNotAssigned2(person_id) {
return {
method: 'get',
url: 'api/frontend/v1/vertraege/Vertraege/getAllContractsNotAssigned/' + person_id
};
},*/
getAllContractsNotAssigned(person_id) {
return {
method: 'get',
@@ -134,25 +128,32 @@ export default {
},
getMitarbeiter(){
return {
method: 'post',
method: 'get',
url: 'api/frontend/v1/vertraege/vertraege/getMitarbeiter/',
};
//return this.$fhcApi.post('api/frontend/v1/vertraege/vertraege/getMitarbeiter/');
},
getHeader(person_id){
return this.$fhcApi.post('api/frontend/v1/vertraege/vertraege/getHeader/' + person_id);
return {
method: 'get',
url: 'api/frontend/v1/vertraege/vertraege/getHeader/' + person_id,
};
},
getPersonAbteilung(person_id){
return this.$fhcApi.post('api/frontend/v1/vertraege/vertraege/getPersonAbteilung/' + person_id);
return {
method: 'get',
url: 'api/frontend/v1/vertraege/vertraege/getPersonAbteilung/' + person_id,
};
},
getLeitungOrg(oekurzbz){
return this.$fhcApi.post('api/frontend/v1/vertraege/vertraege/getLeitungOrg/' + oekurzbz);
return {
method: 'get',
url: 'api/frontend/v1/vertraege/vertraege/getLeitungOrg/' + oekurzbz,
};
},
getMitarbeiterUid(person_id){
return {
method: 'get',
url: 'api/frontend/v1/vertraege/vertraege/getMitarbeiterUid/' + person_id
};
// return this.$fhcApi.get('api/frontend/v1/vertraege/vertraege/getMitarbeiterUid/' + person_id);
},
};
+172 -70
View File
@@ -1,9 +1,21 @@
import ApiCoreVertraege from "../../api/factory/vertraege/vertraege.js";
export default {
name: 'DetailHeader',
inject: {
domain: {
from: 'configDomain',
default: 'technikum-wien.at'
},
},
props: {
headerData: {
type: Object,
required: true
required: false
},
person_id: {
type: Number,
required: false
},
typeHeader: {
type: String,
@@ -20,87 +32,177 @@ export default {
appRoot() {
return FHC_JS_DATA_STORAGE_OBJECT.app_root;
},
validatedHeaderData() {
if (this.typeHeader === 'student') return this.headerData;
if (this.typeHeader === 'mitarbeiter') return this.person_id;
return null;
}
},
created(){
if(this.person_id) {
this.getHeader(this.person_id);
this.loadDepartmentData(this.person_id)
.then(() => {
// Call getLeitungOrg only after departmentData is loaded
this.getLeitungOrg(this.departmentData.oe_kurzbz);
})
.catch((error) => {
console.error("Error loading department data:", error);
});
}
},
watch: {
person_id: {
handler(newVal) {
if (newVal) {
this.getHeader(this.person_id);
this.loadDepartmentData(this.person_id).
then(() => {
this.getLeitungOrg(this.departmentData.oe_kurzbz);
});
}
},
deep: true,
},
},
data(){
return{};
return{
headerDataMa: {},
departmentData: {},
leitungData: {},
};
},
methods: {
//TODO(Manu) finish for Vertragsverwaltung
getVorgesetzer(){},
getHeader(person_id) {
return this.$api
.call(ApiCoreVertraege.getHeader(person_id))
.then(result => {
this.headerDataMa = result.data;
})
.catch(this.$fhcAlert.handleSystemError);
},
loadDepartmentData(person_id) {
return this.$api
.call(ApiCoreVertraege.getPersonAbteilung(person_id))
.then(result => {
this.departmentData = result.data;
})
.catch(this.$fhcAlert.handleSystemError);
},
getLeitungOrg(oekurzbz){
return this.$api
.call(ApiCoreVertraege.getLeitungOrg(oekurzbz))
.then(result => {
this.leitungData = result.data;
})
.catch(this.$fhcAlert.handleSystemError);
},
redirectToLeitung(){
this.$emit('redirectToLeitung', {
person_id: this.leitungData.person_id});
}
},
template: `
<div class="core-header d-flex justify-content-start align-items-center w-100 overflow-auto pb-3 gap-3" style="max-height:9rem; min-width: 37.5rem;">
<template v-if="typeHeader==='student'">
<div
v-for="person in headerData"
:key="person.person_id"
class="d-flex flex-column align-items-center h-100"
class="position-relative d-inline-block"
>
<img
class="d-block h-100 rounded"
alt="Profilbild"
:src="'data:image/jpeg;base64,' + person.foto"
/>
<div
v-for="person in headerData"
:key="person.person_id"
class="d-flex flex-column align-items-center h-100"
class="position-relative d-inline-block"
>
<img
class="d-block h-100 rounded"
alt="Profilbild"
:src="'data:image/jpeg;base64,' + person.foto"
/>
<template v-if="person.foto_sperre">
<i
class=" fa fa-lock text-secondary bg-light rounded d-flex justify-content-center align-items-center position-absolute top-0 end-0"
style="z-index: 1; font-size: 1rem; width: 1.25rem; height: 1.25rem;"
></i>
</template>
<small class="text-muted">{{person.uid}}</small>
</div>
<template v-if="person.foto_sperre">
<i
class=" fa fa-lock text-secondary bg-light rounded d-flex justify-content-center align-items-center position-absolute top-0 end-0"
style="z-index: 1; font-size: 1rem; width: 1.25rem; height: 1.25rem;"
></i>
</template>
<small class="text-muted">{{person.uid}}</small>
</div>
<div v-if="headerData.length == 1">
<h2 class="h4">
{{headerData[0].titelpre}}
{{headerData[0].vorname}}
{{headerData[0].nachname}},
{{headerData[0].titelpost}}
</h2>
<div v-if="headerData.length == 1">
<h2 class="h4">
{{headerData[0].titelpre}}
{{headerData[0].vorname}}
{{headerData[0].nachname}}
{{headerData[0].titelpost}}
</h2>
<h5 class="h6">
<strong class="text-muted">Person ID </strong>
{{headerData[0].person_id}}
<strong class="text-muted">| {{$p.t('lehre', 'studiengang')}} </strong>
{{headerData[0].stg_bezeichnung}} ({{headerData[0].studiengang}})
<strong v-if="headerData[0].semester" class="text-muted"> | {{$p.t('lehre', 'semester')}} </strong>
{{headerData[0].semester}}
<strong v-if="headerData[0].verband" class="text-muted"> | {{$p.t('lehre', 'verband')}}</strong>
{{headerData[0].verband}}
<strong v-if="headerData[0].gruppe" class="text-muted"> | {{$p.t('lehre', 'gruppe')}} </strong>
{{headerData[0].gruppe}}
</h5>
<h5 v-if="typeHeader==='student'" class="h6">
<strong class="text-muted">Person ID </strong>
{{headerData[0].person_id}}
<strong class="text-muted">| {{$p.t('lehre', 'studiengang')}} </strong>
{{headerData[0].stg_bezeichnung}} ({{headerData[0].studiengang}})
<strong v-if="headerData[0].semester" class="text-muted"> | {{$p.t('lehre', 'semester')}} </strong>
{{headerData[0].semester}}
<strong v-if="headerData[0].verband" class="text-muted"> | {{$p.t('lehre', 'verband')}}</strong>
{{headerData[0].verband}}
<strong v-if="headerData[0].gruppe" class="text-muted"> | {{$p.t('lehre', 'gruppe')}} </strong>
{{headerData[0].gruppe}}
</h5>
<h5 v-if="typeHeader==='mitarbeiter'" class="h6">
<strong class="text-muted">Team / {{$p.t('lehre', 'kompetenzfeld')}}</strong>
{{headerData[0].studiengang}}
<strong v-if="headerData[0].semester" class="text-muted"> | Vorgesetzte*r </strong>
{{headerData[0].semester}}
</h5>
<h5 class="h6">
<strong class="text-muted">Email </strong>
<span>
<a :href="'mailto:'+headerData[0]?.mail_intern">{{headerData[0].mail_intern}}</a>
</span>
<strong class="text-muted"> | Status </strong>
{{headerData[0].status}}
<strong class="text-muted"> | {{$p.t('person', 'matrikelnummer')}} </strong>
{{headerData[0].matr_nr}}
</h5>
<h5 v-if="typeHeader==='student'" class="h6">
<strong class="text-muted">Email </strong>
<span>
<a :href="'mailto:'+headerData[0]?.mail_intern">{{headerData[0].mail_intern}}</a>
</span>
<strong class="text-muted"> | Status </strong>
{{headerData[0].status}}
<strong class="text-muted"> | {{$p.t('person', 'matrikelnummer')}} </strong>
{{headerData[0].matr_nr}}
</h5>
<h5 v-if="typeHeader==='mitarbeiter'" class="h6">
<strong class="text-muted">Email </strong>
<span>
<a :href="'mailto:'+headerData[0]?.mail_intern">{{headerData[0].mail_intern}}</a>
</span>
<strong class="text-muted"> | {{$p.t('kvp', 'op.label.phone')}} </strong>
{{headerData[0].status}}
</h5>
</div>
</div>
</template>
</div>
</div>
<template v-if="typeHeader==='mitarbeiter'">
<div class="row">
<div class="col-md-2 d-flex justify-content-start align-items-center w-30 pb-3 gap-3 position-relative"
style="max-height: 8rem; max-width: 6rem; overflow: hidden;">
<img
class="d-block h-100 rounded"
alt="Profilbild"
:src="'data:image/jpeg;base64,' + headerDataMa.foto"
/>
<template v-if="headerDataMa.foto_sperre">
<i
class=" fa fa-lock text-secondary bg-light rounded d-flex justify-content-center align-items-center position-absolute top-0 end-0"
style="z-index: 1; font-size: 1rem; width: 1.25rem; height: 1.25rem;"
></i>
</template>
</div>
<!--show Ma-Details-->
<div class="col-md-10">
<h5>{{headerDataMa.titelpre}} {{headerDataMa.vorname}} {{headerDataMa.nachname}}<span v-if="headerDataMa?.titelpost">, </span> {{headerDataMa.titelpost}}
</h5>
<strong class="text-muted">{{departmentData.organisationseinheittyp_kurzbz}}</strong>
{{departmentData.bezeichnung}}
<span v-if="leitungData.uid"> | </span>
<strong v-if="leitungData.uid" class="text-muted">Vorgesetzte*r </strong>
<a href="#" @click.prevent="redirectToLeitung">
{{leitungData.titelpre}} {{leitungData.vorname}} {{leitungData.nachname}}
</a>
<p>
<strong class="text-muted">Email </strong>
<span v-if="!headerDataMa?.alias">
<a :href="'mailto:'+headerDataMa?.uid+'@'+domain">{{headerDataMa.uid}}@{{domain}}</a>
</span>
<span v-if="headerDataMa?.alias">
<a :href="'mailto:'+headerDataMa?.alias+'@'+domain">{{headerDataMa.alias}}@{{domain}}</a>
</span>
<span v-if="headerDataMa?.telefonklappe" class="mb-2"> | <strong class="text-muted">DW </strong>{{headerDataMa?.telefonklappe}}</span>
</p>
</div>
</template>
`
}
}
@@ -1,110 +0,0 @@
export default {
data() {
return {
headerData: {},
departmentData: {},
leitungData: {},
};
},
inject: {
domain: {
from: 'configDomain',
default: 'technikum-wien.at'
},
},
props: {
person_id: Number
},
computed: {
appRoot() {
return FHC_JS_DATA_STORAGE_OBJECT.app_root;
},
},
created(){
this.getHeader(this.person_id);
// Ensure loadDepartmentData is awaited
this.loadDepartmentData(this.person_id)
.then(() => {
// Call getLeitungOrg only after departmentData is loaded
this.getLeitungOrg(this.departmentData.oe_kurzbz);
})
.catch((error) => {
console.error("Error loading department data:", error);
});
},
watch: {
person_id: {
handler(newVal) {
if (newVal) {
this.getHeader(this.person_id);
this.loadDepartmentData(this.person_id).
then(() => {
this.getLeitungOrg(this.departmentData.oe_kurzbz);
});
}
},
deep: true,
},
},
methods: {
getHeader(person_id) {
return this.$fhcApi.factory.vertraege.person
.getHeader(person_id)
.then(result => {
this.headerData = result.data;
})
.catch(this.$fhcAlert.handleSystemError);
},
loadDepartmentData(person_id) {
return this.$fhcApi.factory.vertraege.person
.getPersonAbteilung(person_id)
.then(result => {
this.departmentData = result.data;
})
.catch(this.$fhcAlert.handleSystemError);
},
getLeitungOrg(oekurzbz){
return this.$fhcApi.factory.vertraege.person
.getLeitungOrg(oekurzbz)
.then(result => {
this.leitungData = result.data;
})
.catch(this.$fhcAlert.handleSystemError);
}
},
template: `
<div class="core-mitarbeiter-details">
<!--show Picture-->
<div class="row">
<div class="col-md-2 d-flex justify-content-start align-items-center w-30 pb-3 gap-3"
style="max-height: 8rem; max-width: 6rem; overflow: hidden;">
<img
class="d-block h-100 rounded"
alt="profilepicture"
style="object-fit: cover; max-width: 100%;"
:src="appRoot + 'cis/public/bild.php?src=person&person_id=' + person_id">
</div>
<!--show Ma-Details-->
<div class="col-md-10">
<h5>{{headerData.titelpre}} {{headerData.vorname}} {{headerData.nachname}} {{headerData.titelpost}} </h5>
<strong class="text-muted">{{departmentData.organisationseinheittyp_kurzbz}}</strong> {{departmentData.bezeichnung}} <span v-if="leitungData.uid"> | </span><strong v-if="leitungData.uid" class="text-muted">Vorgesetzte/e </strong>{{leitungData.titelpre}} {{leitungData.vorname}} {{leitungData.nachname}} {{leitungData.titelpost}}
<p>
<strong class="text-muted">Email </strong>
<span v-if="!headerData?.alias">
<a :href="'mailto:'+headerData?.uid+'@'+domain">{{headerData.uid}}@{{domain}}</a>
</span>
<span v-if="headerData?.alias">
<a :href="'mailto:'+headerData?.alias+'@'+domain">{{headerData.alias}}@{{domain}}</a>
</span>
<span v-if="headerData?.telefonklappe" class="mb-2"> | <strong class="text-muted">DW </strong>{{headerData?.telefonklappe}}</span>
</p>
</div>
</div>
</div>
`
};
@@ -2,15 +2,11 @@ import {CoreFilterCmpt} from "../filter/Filter.js";
import FormInput from '../Form/Input.js';
export default {
name: 'CoreListMitarbeiter',
components: {
CoreFilterCmpt,
FormInput
},
/* inject: {
cisRoot: {
from: 'cisRoot'
},
},*/
emits: [
"selectedPerson"
],
@@ -19,27 +15,6 @@ export default {
type: Object,
required: true
},
// maybe later nur fixe oder alle Mitarbeiter: gleich funktionsaufruf
//oder Mitarbeiter mit Verträgen
/* filterMa: {
type: Object,
required: true,
default: function () {
return {
active: true,
hasVertraege: false
};
},
},*/
/* vertragsarten: {
type: Array,
required: false,
default: function (){
return {
['echterdv']
}
}
}*/
},
data() {
return {
@@ -9,6 +9,7 @@ import ContractStati from './List/Status.js';
export default {
name:'CoreVertraege',
components: {
CoreFilterCmpt,
BsModal,
@@ -1,15 +1,16 @@
import MitarbeiterHeader from "./MitarbeiterHeader.js";
import MitarbeiterDetails from "./MitarbeiterDetails.js";
import FhcHeader from "../DetailHeader/DetailHeader.js";
import VertraegeMitarbeiter from "./Vertraege.js";
import VerticalSplit from "../verticalsplit/verticalsplit.js";
import ApiCoreVertraege from '../../api/factory/vertraege/vertraege.js';
export default {
name: 'Vertragsverwaltung',
components: {
VerticalSplit,
MitarbeiterHeader,
MitarbeiterDetails,
FhcHeader,
VertraegeMitarbeiter
},
props: {
@@ -26,11 +27,15 @@ export default {
return {
person_id: null,
endpoint: ApiCoreVertraege
//<mitarbeiter-details-old :person_id="person_id"></mitarbeiter-details-old>
}
},
methods: {
selectPerson(selected){
this.person_id = selected;
},
redirectToLeitung(leitung){
this.person_id = leitung.person_id;
}
},
template: `
@@ -40,12 +45,18 @@ export default {
<vertical-split ref="vsplit">
<template #top>
<div class="d-flex flex-column" style="height: 100%;">
<mitarbeiter-header :endpoint="endpoint" @selectedPerson="selectPerson" />
<mitarbeiter-header
:endpoint="endpoint"
@selectedPerson="selectPerson"/>
</div>
</template>
<template #bottom>
<div class="col" v-if="person_id!=null">
<mitarbeiter-details :person_id="person_id"></mitarbeiter-details>
<fhc-header
:person_id="person_id"
typeHeader="mitarbeiter"
@redirectToLeitung="redirectToLeitung"
></fhc-header>
<vertraege-mitarbeiter :endpoint="endpoint" :person_id="this.person_id"/>
</div>
</template>