Add Logic Permission and Phrases

This commit is contained in:
ma0068
2025-01-21 15:34:43 +01:00
parent ffc99379ae
commit 9c0baeacf2
11 changed files with 273 additions and 134 deletions
@@ -4,12 +4,13 @@ if (! defined('BASEPATH')) exit('No direct script access allowed');
class Vertragsverwaltung extends Auth_Controller
{
//TODO(Manu) Permissions
public function __construct()
{
$permissions = [];
$router = load_class('Router');
$permissions[$router->method] = ['admin:r', 'assistenz:r'];
$permissions[$router->method] = ['vertrag/mitarbeiter:r'];
parent::__construct($permissions);
// Load Libraries
@@ -23,9 +24,7 @@ class Vertragsverwaltung extends Auth_Controller
{
$this->load->view('Vertragsverwaltung', [
'permissions' => [
'assistenz_stgs' => $this->permissionlib->getSTG_isEntitledFor('assistenz'),
'admin' => $this->permissionlib->isBerechtigt('admin'),
'assistenz_schreibrechte' => $this->permissionlib->isBerechtigt('assistenz','suid'),
'vertragsverwaltung_schreibrechte' => $this->permissionlib->isBerechtigt('vertrag/mitarbeiter','suid')
]
]);
}
@@ -29,16 +29,8 @@ class Config extends FHCAPI_Controller
{
public function __construct()
{
// TODO(Manu): permissions
parent::__construct([
'printDocument' => ['admin:r', 'assistenz:r'],
]);
// Load Phrases
$this->loadPhrases([
'global',
'person',
'printDocument' => ['vertrag/mitarbeiter:r'],
]);
}
@@ -9,28 +9,27 @@ class Vertraege extends FHCAPI_Controller
public function __construct()
{
parent::__construct([
'getAllVertraege' => ['admin:r', 'assistenz:r'],
'getAllContractsNotAssigned' => ['admin:r', 'assistenz:r'],
'getAllContractsAssigned' => ['admin:r', 'assistenz:r'],
'getAllContractTypes' => ['admin:r', 'assistenz:r'],
'getAllContractStati' => ['admin:r', 'assistenz:r'],
'getStatiOfContract' => ['admin:r', 'assistenz:r'],
'loadContract' => ['admin:r', 'assistenz:r'],
'loadContractStatus' => ['admin:r', 'assistenz:r'],
'updateContract' => self::PERM_LOGGED,
'addNewContract' => self::PERM_LOGGED,
'deleteContract' => self::PERM_LOGGED,
'insertContractStatus' => self::PERM_LOGGED,
'deleteContractStatus' => self::PERM_LOGGED,
'updateContractStatus' => self::PERM_LOGGED,
'deleteLehrauftrag' => self::PERM_LOGGED,
'deleteBetreuung' => self::PERM_LOGGED,
//TODO(Manu) Berechtigungen
'getMitarbeiter' => self::PERM_LOGGED,
'getHeader' => self::PERM_LOGGED,
'getPersonAbteilung' => self::PERM_LOGGED,
'getLeitungOrg' => self::PERM_LOGGED,
'getMitarbeiter_uid' => self::PERM_LOGGED,
'getAllVertraege' => ['vertrag/mitarbeiter:r'],
'getAllContractsNotAssigned' => ['vertrag/mitarbeiter:r'],
'getAllContractsAssigned' => ['vertrag/mitarbeiter:r'],
'getAllContractTypes' => ['vertrag/mitarbeiter:r'],
'getAllContractStati' => ['vertrag/mitarbeiter:r'],
'getStatiOfContract' => ['vertrag/mitarbeiter:r'],
'loadContract' => ['vertrag/mitarbeiter:r'],
'loadContractStatus' => ['vertrag/mitarbeiter:r'],
'updateContract' =>['vertrag/mitarbeiter:w'],
'addNewContract' =>['vertrag/mitarbeiter:w'],
'deleteContract' =>['vertrag/mitarbeiter:w'],
'insertContractStatus' =>['vertrag/mitarbeiter:w'],
'deleteContractStatus' =>['vertrag/mitarbeiter:w'],
'updateContractStatus' =>['vertrag/mitarbeiter:w'],
'deleteLehrauftrag' =>['vertrag/mitarbeiter:w'],
'deleteBetreuung' =>['vertrag/mitarbeiter:w'],
'getMitarbeiter' => ['vertrag/mitarbeiter:r'],
'getHeader' => ['vertrag/mitarbeiter:r'],
'getPersonAbteilung' => ['vertrag/mitarbeiter:r'],
'getLeitungOrg' => ['vertrag/mitarbeiter:r'],
'getMitarbeiter_uid' => ['vertrag/mitarbeiter:r'],
]);
//Load Models and Libraries
-2
View File
@@ -32,9 +32,7 @@ $this->load->view('templates/FHC-Header', $includesArray);
<?php
$configArray = [
'generateAlias' => !defined('GENERATE_ALIAS_STUDENT') ? 'notDefined' : GENERATE_ALIAS_STUDENT,
'domain' => !defined('DOMAIN') ? 'notDefined' : DOMAIN,
'chooseLayout' => !defined('CHOOSE_LAYOUT') ? 'notDefined' : CHOOSE_LAYOUT,
];
?>
+26 -10
View File
@@ -11,6 +11,12 @@ export default {
CoreForm,
FormInput
},
inject: {
hasSchreibrechte: {
from: 'hasSchreibrechte',
default: false
},
},
props: {
person_id: {
type: [Number],
@@ -69,20 +75,30 @@ export default {
let type = cell.getData().type;
if (type == 'Lehrauftrag')
{
button.addEventListener(
'click',
() =>
this.actionDeleteLehrauftrag(cell.getData().vertrag_id, cell.getData().lehreinheit_id, cell.getData().mitarbeiter_uid)
);
if (!this.hasSchreibrechte) {
button.disabled = true;
button.classList.add('disabled');
} else {
button.addEventListener(
'click',
() =>
this.actionDeleteLehrauftrag(cell.getData().vertrag_id, cell.getData().lehreinheit_id, cell.getData().mitarbeiter_uid)
);
}
}
if (type == 'Betreuung')
{
button.addEventListener(
'click',
() =>
this.actionDeleteBetreuung(cell.getData().vertrag_id, cell.getData().projektarbeit_id, cell.getData().betreuerart_kurzbz)
);
if (!this.hasSchreibrechte) {
button.disabled = true;
button.classList.add('disabled');
} else {
button.addEventListener(
'click',
() =>
this.actionDeleteBetreuung(cell.getData().vertrag_id, cell.getData().projektarbeit_id, cell.getData().betreuerart_kurzbz)
);
}
}
container.append(button);
+17 -6
View File
@@ -11,6 +11,12 @@ export default {
CoreForm,
FormInput
},
inject: {
hasSchreibrechte: {
from: 'hasSchreibrechte',
default: false
},
},
props: {
vertrag_id: {
type: [Number],
@@ -69,11 +75,16 @@ export default {
button.className = 'btn btn-outline-secondary btn-action';
button.innerHTML = '<i class="fa fa-xmark"></i>';
button.title = this.$p.t('vertrag', 'deleteStatus');
button.addEventListener(
'click',
() =>
this.actionDeleteStatus(cell.getData().vertrag_id, cell.getData().vertragsstatus_kurzbz)
);
if (!this.hasSchreibrechte) {
button.disabled = true;
button.classList.add('disabled');
} else {
button.addEventListener(
'click',
() =>
this.actionDeleteStatus(cell.getData().vertrag_id, cell.getData().vertragsstatus_kurzbz)
);
}
container.append(button);
@@ -263,7 +274,7 @@ export default {
</core-form>
<template #footer>
<button type="button" class="btn btn-primary" @click="statusNew ? handleSubmit('new') : handleSubmit('edit')">{{$p.t('ui', 'speichern')}}</button>
<button type="button" class="btn btn-primary" :disabled="!this.hasSchreibrechte" @click="statusNew ? handleSubmit('new') : handleSubmit('edit')">{{$p.t('ui', 'speichern')}}</button>
</template>
</bs-modal>
@@ -93,12 +93,12 @@ export default {
<p>
<strong class="text-muted">Email </strong>
<span v-if="!headerData?.alias">
<a :href="'mailto:'+headerData?.uid+'@'+domain">{{ headerData.uid }}@{{ domain }}</a>
<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>
<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>
<span v-if="headerData?.telefonklappe" class="mb-2"> | <strong class="text-muted">DW </strong>{{headerData?.telefonklappe}}</span>
</p>
</div>
@@ -78,53 +78,39 @@ export default {
handler: this.rowSelectionChanged
},
{
/* event: 'tableBuilt',
event: 'tableBuilt',
handler: async() => {
await this.$p.loadCategory(['ui', 'global', 'vertrag']);
await this.$p.loadCategory(['person', 'global', 'vertrag']);
let cm = this.$refs.table.tabulator.columnManager;
cm.getColumnByField('bezeichnung').component.updateDefinition({
title: this.$p.t('ui', 'bezeichnung')
cm.getColumnByField('person_id').component.updateDefinition({
title: this.$p.t('person', 'person_id')
});
cm.getColumnByField('lehreinheit_id').component.updateDefinition({
title: this.$p.t('ui', 'lehreinheit_id')
cm.getColumnByField('nachname').component.updateDefinition({
title: this.$p.t('person', 'nachname')
});
cm.getColumnByField('betrag').component.updateDefinition({
title: this.$p.t('ui', 'betrag')
cm.getColumnByField('vorname').component.updateDefinition({
title: this.$p.t('person', 'vorname')
});
cm.getColumnByField('status').component.updateDefinition({
title: this.$p.t('global', 'status')
cm.getColumnByField('aktiv').component.updateDefinition({
title: this.$p.t('global', 'aktiv')
});
cm.getColumnByField('vertragstyp_bezeichnung').component.updateDefinition({
title: this.$p.t('vertrag', 'vertragstyp')
cm.getColumnByField('format_gebdatum').component.updateDefinition({
title: this.$p.t('person', 'geburtsdatum')
});
cm.getColumnByField('format_vertragsdatum').component.updateDefinition({
title: this.$p.t('vertrag', 'vertragsdatum')
cm.getColumnByField('unternehmen').component.updateDefinition({
title: this.$p.t('person', 'firma')
});
cm.getColumnByField('vertragsdatum').component.updateDefinition({
title: this.$p.t('vertrag', 'vertragsdatum_iso')
cm.getColumnByField('vertragsarten').component.updateDefinition({
title: this.$p.t('vertrag', 'vertragsarten')
});
cm.getColumnByField('vertragsstunden').component.updateDefinition({
title: this.$p.t('vertrag', 'vertragsstunden')
cm.getColumnByField('ids').component.updateDefinition({
title: this.$p.t('vertrag', 'idsDienstverhaeltnisse')
});
cm.getColumnByField('vertragsstunden_studiensemester_kurzbz').component.updateDefinition({
title: this.$p.t('vertrag', 'vertragsstunden_studiensemester')
});
cm.getColumnByField('vertrag_id').component.updateDefinition({
title: this.$p.t('ui', 'vertrag_id')
});
cm.getColumnByField('anmerkung').component.updateDefinition({
title: this.$p.t('global', 'anmerkung')
});
cm.getColumnByField('isabgerechnet').component.updateDefinition({
title: this.$p.t('vertrag', 'abgerechnet')
});
cm.getColumnByField('actions').component.updateDefinition({
title: this.$p.t('global', 'aktionen')
});
} */
}
}
],
selectedPerson: null,
@@ -147,14 +133,14 @@ export default {
},
template: `
<div class="core-mitarbeiter h-100 d-flex flex-column">
<h4>Vertragsverwaltung</h4>
<h4>{{$p.t('vertrag', 'vertragsverwaltung')}}</h4>
<!-- filter: show only active employees-->
<div class="justify-content-end py-3">
<form-input
container-class="form-switch"
type="checkbox"
label="nur aktive Mitarbeiter:innen anzeigen"
:label="$p.t('vertrag/nurAktiveMaAnzeigen')"
v-model="isFilterSet"
@change="onSwitchChange"
>
+38 -33
View File
@@ -21,6 +21,10 @@ export default {
cisRoot: {
from: 'cisRoot'
},
hasSchreibrechte: {
from: 'hasSchreibrechte',
default: false
},
},
props: {
endpoint: {
@@ -94,11 +98,17 @@ export default {
button.className = 'btn btn-outline-secondary btn-action';
button.innerHTML = '<i class="fa fa-xmark"></i>';
button.title = this.$p.t('vertrag', 'deleteVertrag');
button.addEventListener(
'click',
() =>
this.actionDeleteContract(cell.getData().vertrag_id)
);
if (!this.hasSchreibrechte) {
button.disabled = true;
button.classList.add('disabled');
} else {
button.addEventListener(
'click',
() =>
this.actionDeleteContract(cell.getData().vertrag_id)
);
}
container.append(button);
return container;
@@ -443,17 +453,16 @@ export default {
//methods for functionality ADDON KU
printContract(){
this.getMitarbeiter_uid().then(()=> {
//check if at least 2 contracts chosen
if(this.arraySelectedContracts.length < 2) {
this.$fhcAlert.alertError('Bitte mindestens 2 Verträge auswählen');
this.$fhcAlert.alertError(this.$p.t('vertrag', 'alertMindestensZweiVertraege'));
return;
}
//check if status=="Genehmigt"
const statusNotGenehmigtExists = this.arraySelectedContracts.some(([_, status]) => status !== 'Genehmigt');
if(statusNotGenehmigtExists) {
this.$fhcAlert.alertError('Alle Verträge müssen genehmigt sein');
this.$fhcAlert.alertError(this.$p.t('vertrag', 'alertOnlyApprovedContracts'));
return;
}
@@ -507,42 +516,38 @@ export default {
.catch(this.$fhcAlert.handleSystemError);
},
mounted() {
//TODO(Manu) check if necessary
/* this.$nextTick(() => {
//necessary for reloading components Status and Details
this.$nextTick(() => {
this.$refs.table.tabulator.on("rowClick", (e, row) => {
this.contractSelected = row.getData();
console.log("selected Row ", this.contractSelected);
});
});*/
});
this.getFormattedDate();
},
template: `
<div class="core-contracts h-100 d-flex flex-column">
<!-- injected print functionality for KU Linz (printHonorarvertrag) -->
<div v-if="arraySelectedContracts.length >= 2" class="container mt-2">
<!-- injected print functionality for KU Linz (printHonorarvertrag) -->
<template v-if="arraySelectedContracts.length >= 2" class="container mt-2">
<div v-for="item in arraySelectedContracts" :key="item[0]" class="row">
<div class="col-md-6">
<input
class="form-control"
type="text"
:value="item[2] + ' | ' + item[1] + ' (ID: ' + item[0] + ')'"
aria-label="readonly input example"
readonly
>
</div>
<div v-for="item in arraySelectedContracts" :key="item[0]">
<input
class="form-control"
type="text"
:value="item[2] + ' | ' + item[1] + ' (ID: ' + item[0] + ')'"
aria-label="readonly input example"
readonly
>
</div>
<div class="d-flex">
<div class="ms-auto">
</template>
<template v-if="arraySelectedContracts.length >= 2" class="d-flex">
<div class="ms-auto mt-2">
<button type="button" class="btn btn-secondary mx-1" @click="clearSelection()"><i class="fa fa-trash"></i></button>
<button type="button" class="btn btn-primary o" @click="printContract()">Honorarvertrag drucken</button>
<button :disabled="!this.hasSchreibrechte" type="button" class="btn btn-primary" @click="printContract()">{{$p.t('vertrag', 'printHonorarvertrag')}}</button>
</div>
</div>
</div>
</template>
<hr>
<!-- filter: open means no status abgerechnet yet-->
@@ -698,7 +703,7 @@ export default {
<template #footer>
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal" @click="reload()">{{$p.t('ui', 'abbrechen')}}</button>
<button type="button" class="btn btn-primary" @click="statusNew ? addNewContract() : updateContract(formData.vertrag_id)">{{$p.t('vertrag', 'vertragErstellen')}}</button>
<button type="button" class="btn btn-primary" :disabled="!this.hasSchreibrechte" @click="statusNew ? addNewContract() : updateContract(formData.vertrag_id)">{{$p.t('vertrag', 'vertragErstellen')}}</button>
</template>
</bs-modal>
</core-form>
@@ -16,13 +16,8 @@ export default {
},
provide() {
return {
// activeAddonBewerbung: this.activeAddons.split(';').includes('bewerbung'),
// configGenerateAlias: this.config.generateAlias,
// configChooseLayout: this.config.chooseLayout,
configDomain: this.config.domain,
//TODO(Manu) check permissions
hasSchreibrechtAss: this.permissions['assistenz_schreibrechte'],
hasAdminPermission: this.permissions['admin'],
hasSchreibrechte: this.permissions['vertragsverwaltung_schreibrechte'],
}
},
data() {
@@ -45,10 +40,8 @@ export default {
template: `
<div>
<div class="container-fluid overflow-hidden">
<!-- DOM: {{configDomain}} alias {{configAlias}} layout {{configChooseLayout}}-->
<div class="row h-100">
<main class="col-md-8 ms-sm-auto col-lg-9 col-xl-10">
<!--<div class="col-md-12">-->
<vertical-split>
<template #top>
<MitarbeiterHeader :filterMa="filterMa" :vertragsarten="vertragsarten" @selectedPerson="selectPerson" />
@@ -57,7 +50,7 @@ export default {
<div class="col" v-if="person_id!=null">
<mitarbeiter-details :person_id="person_id"></mitarbeiter-details>
<h5>Verträge</h5>
<Vertraege :endpoint="$fhcApi.factory.vertraege.person" :person_id="this.person_id" />
<Vertraege :endpoint="$fhcApi.factory.vertraege.person" :person_id="this.person_id"/>
</div>
<template>
</vertical-split>
+140
View File
@@ -31767,6 +31767,146 @@ array(
)
)
),
array(
'app' => 'core',
'category' => 'vertrag',
'phrase' => 'vertragsverwaltung',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Vertragsverwaltung',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Contract management',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'vertrag',
'phrase' => 'nurAktiveMaAnzeigen',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Nur aktive Mitarbeiter:innen anzeigen',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Show only active employees',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'vertrag',
'phrase' => 'printHonorarvertrag',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Honorarvertrag drucken',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Print fee agreement',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'vertrag',
'phrase' => 'alertMindestensZweiVertraege',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Bitte mindestens 2 Verträge auswählen!',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Please select at least 2 contracts!',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'vertrag',
'phrase' => 'alertOnlyApprovedContracts',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Alle Verträge müssen genehmigt sein.',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'All contracts must be approved.',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'vertrag',
'phrase' => 'vertragsarten',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Vertragsarten',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Types of Contracts',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'vertrag',
'phrase' => 'idsDienstverhaeltnisse',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'IDs Dienstverhältnis',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'IDs employment relationship',
'description' => '',
'insertvon' => 'system'
)
)
),
);