From 35d8f0524d771957727a2b65b33d43f2bbebedcc Mon Sep 17 00:00:00 2001 From: ma0068 Date: Wed, 15 Jan 2025 13:56:00 +0100 Subject: [PATCH] new page vertragsverwaltung with employee header and details components --- .../controllers/Vertragsverwaltung.php | 31 +++ .../api/frontend/v1/vertraege/Vertraege.php | 87 ++++++- .../models/ressource/Mitarbeiter_model.php | 237 ++++++++++++++++++ application/views/Vertragsverwaltung.php | 42 ++++ public/js/api/vertraege/person.js | 13 + public/js/apps/Vertragsverwaltung.js | 27 ++ .../Vertraege/MitarbeiterDetails.js | 105 ++++++++ .../components/Vertraege/MitarbeiterHeader.js | 175 +++++++++++++ public/js/components/Vertraege/Vertraege.js | 21 +- .../Vertraege/Vertragsverwaltung.js | 53 ++++ 10 files changed, 788 insertions(+), 3 deletions(-) create mode 100644 application/controllers/Vertragsverwaltung.php create mode 100644 application/views/Vertragsverwaltung.php create mode 100644 public/js/apps/Vertragsverwaltung.js create mode 100644 public/js/components/Vertraege/MitarbeiterDetails.js create mode 100644 public/js/components/Vertraege/MitarbeiterHeader.js create mode 100644 public/js/components/Vertraege/Vertragsverwaltung.js diff --git a/application/controllers/Vertragsverwaltung.php b/application/controllers/Vertragsverwaltung.php new file mode 100644 index 000000000..f1219335e --- /dev/null +++ b/application/controllers/Vertragsverwaltung.php @@ -0,0 +1,31 @@ +method] = ['admin:r', 'assistenz:r']; + parent::__construct($permissions); + + // Load Libraries + $this->load->library('VariableLib', ['uid' => getAuthUID()]); + } + + /** + * @return void + */ + public function _remap() + { + $this->load->view('Vertragsverwaltung', [ + 'permissions' => [ + 'assistenz_stgs' => $this->permissionlib->getSTG_isEntitledFor('assistenz'), + 'admin' => $this->permissionlib->isBerechtigt('admin'), + 'assistenz_schreibrechte' => $this->permissionlib->isBerechtigt('assistenz','suid'), + ] + ]); + } +} diff --git a/application/controllers/api/frontend/v1/vertraege/Vertraege.php b/application/controllers/api/frontend/v1/vertraege/Vertraege.php index d9564da70..72f49f945 100644 --- a/application/controllers/api/frontend/v1/vertraege/Vertraege.php +++ b/application/controllers/api/frontend/v1/vertraege/Vertraege.php @@ -23,7 +23,12 @@ class Vertraege extends FHCAPI_Controller 'deleteContractStatus' => self::PERM_LOGGED, 'updateContractStatus' => self::PERM_LOGGED, 'deleteLehrauftrag' => self::PERM_LOGGED, - 'deleteBetreuung' => self::PERM_LOGGED + 'deleteBetreuung' => self::PERM_LOGGED, + //TODO(Manu) Berechtigung + 'getMitarbeiter' => self::PERM_LOGGED, + 'getHeader' => self::PERM_LOGGED, + 'getPersonAbteilung' => self::PERM_LOGGED, + 'getLeitungOrg' => self::PERM_LOGGED, ]); //Load Models and Libraries @@ -640,4 +645,84 @@ class Vertraege extends FHCAPI_Controller } return $this->terminateWithSuccess(current(getData($result))); } + + public function getMitarbeiter() + { + $this->load->model('ressource/Mitarbeiter_model', 'Mitarbeitermodel'); + + $result = $this->Mitarbeitermodel->getPersonenWithContractDetails(); + + if (isError($result)) + { + return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); + } + if (!hasData($result)) + { + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id' => 'Id_Lehrauftrag']), self::ERROR_TYPE_GENERAL); + } + return $this->terminateWithSuccess(getData($result)); + } + + public function getPersonAbteilung($person_id) + { + $this->load->model('ressource/Mitarbeiter_model', 'Mitarbeitermodel'); + + $result = $this->Mitarbeitermodel->getPersonAbteilung($person_id); + + if (isError($result)) + { + return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); + } + if (!hasData($result)) + { + //TODO(Manu) rewrite better + return $this->terminateWithSuccess("no benutzerdata", self::ERROR_TYPE_GENERAL); + + // return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id' => 'personID']), self::ERROR_TYPE_GENERAL); + } + return $this->terminateWithSuccess(getData($result)); + } + + public function getLeitungOrg($oekurzbz) + { + $this->load->model('ressource/Mitarbeiter_model', 'Mitarbeitermodel'); + + $result = $this->Mitarbeitermodel->getLeitungOrg($oekurzbz); + + if (isError($result)) + { + return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); + } + if (!hasData($result)) + { + //TODO(Manu) rewrite better + return $this->terminateWithSuccess("no benutzerdata", self::ERROR_TYPE_GENERAL); + + // return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id' => 'personID']), self::ERROR_TYPE_GENERAL); + } + return $this->terminateWithSuccess(getData($result)); + } + + public function getHeader($person_id) + { + $this->load->model('ressource/Mitarbeiter_model', 'Mitarbeitermodel'); + + $result = $this->Mitarbeitermodel->getHeader($person_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' => 'personID']), self::ERROR_TYPE_GENERAL); + } + +/* $result = current(getData($result)); + $header = $result->name;*/ + + //return $this->terminateWithSuccess($header); + return $this->terminateWithSuccess(getData($result)); + } + } diff --git a/application/models/ressource/Mitarbeiter_model.php b/application/models/ressource/Mitarbeiter_model.php index c38fcf054..b616f3fbb 100644 --- a/application/models/ressource/Mitarbeiter_model.php +++ b/application/models/ressource/Mitarbeiter_model.php @@ -98,6 +98,243 @@ class Mitarbeiter_model extends DB_Model return $this->execQuery($qry, $params); } + /** + * gibt Personen mit Übersicht von Vertragsdaten aus + * + * @return array + */ + public function getPersonenWithContractDetails($person_id=null) + { + /* $qry = "SELECT DISTINCT ON(mitarbeiter_uid) mitarbeiter_uid, person_id, titelpost, titelpre, + nachname, vorname, vornamen, + TO_CHAR(gebdatum::timestamp, 'DD.MM.YYYY') AS format_gebdatum + FROM ((public.tbl_mitarbeiter JOIN public.tbl_benutzer ON(mitarbeiter_uid=uid)) + JOIN public.tbl_person USING(person_id)) + LEFT JOIN public.tbl_benutzerfunktion USING(uid) + LEFT JOIN public.tbl_benutzerfunktion akt_funk ON tbl_mitarbeiter.mitarbeiter_uid = akt_funk.uid AND akt_funk.funktion_kurzbz = 'fachzuordnung' + AND (akt_funk.datum_von IS NULL OR akt_funk.datum_von <= now()) AND (akt_funk.datum_bis IS NULL OR akt_funk.datum_bis >= now()) + WHERE true"; + + if ($fix === true) + $qry .= " AND fixangestellt=true"; + elseif ($fix === false) + $qry .= " AND fixangestellt=false"; + + if ($aktiv === true) + $qry .= " AND tbl_benutzer.aktiv=true"; + elseif ($aktiv === false) + $qry .= " AND tbl_benutzer.aktiv=false"; + + if ($verwendung === true) + { + $qry.=" AND EXISTS(SELECT * FROM bis.tbl_bisverwendung WHERE (ende>now() or ende is null) AND tbl_bisverwendung.mitarbeiter_uid=tbl_mitarbeiter.mitarbeiter_uid)"; + } + elseif ($verwendung === false) + { + $qry.=" AND NOT EXISTS(SELECT * FROM bis.tbl_bisverwendung WHERE (ende>now() or ende is null) AND tbl_bisverwendung.mitarbeiter_uid=tbl_mitarbeiter.mitarbeiter_uid)"; + } + + if ($personaccount === true) + $qry .= " AND tbl_mitarbeiter.personalnummer >= 0"; + elseif ($personaccount === false) + $qry .= " AND tbl_mitarbeiter.personalnummer < 0"; + + $params = array(); + if (!isEmptyArray($uids)) + { + $qry .= " AND tbl_mitarbeiter.mitarbeiter_uid IN ?"; + $params[] = $uids; + } + + return $this->execQuery($qry, $params); + */ + + //TODO(Manu) filter nach DV-Art? was, wenn mehrere? oder einfach wenn extern ODER fix? + //TODO(Manu) email: plus dieses @domainzeugs: mohamed.aburaia@c3p0.ma0068.technikum-wien.at + //Standardkostenstelle... + //was wenn 2 echte DV? schmarrn + + $qry = " + SELECT + b.uid , p.person_id, + p.vorname, p.nachname, + TO_CHAR(gebdatum::timestamp, 'DD.MM.YYYY') AS format_gebdatum, + COALESCE(b.alias, b.uid) AS email, + --COALESCE(b.alias, b.uid) AS EMail, + --u.bezeichnung AS Unternehmen, + STRING_AGG(DISTINCT va.bezeichnung, ', ') AS Vertragsarten, + STRING_AGG(DISTINCT u.bezeichnung, ', ') AS Unternehmen, + STRING_AGG(d.dienstverhaeltnis_id::TEXT, ', ') AS ids, + b.aktiv +-- CASE WHEN b.aktiv=true THEN 'aktiv' +-- ELSE 'nicht aktiv' +-- END as status //not working in header filter */ + FROM + hr.tbl_dienstverhaeltnis d + JOIN + public.tbl_benutzer b ON d.mitarbeiter_uid = b.uid + JOIN + public.tbl_person p ON p.person_id = b.person_id + JOIN + public.tbl_organisationseinheit u ON d.oe_kurzbz = u.oe_kurzbz + JOIN + hr.tbl_vertragsart va ON d.vertragsart_kurzbz = va.vertragsart_kurzbz "; + +/* if ($aktiv === true) + $qry .= " WHERE b.aktiv = true"; + elseif ($aktiv === false) + $qry .= " WHERE b.aktiv = false"; + + if($fix) + { + $filterVertragsart = "echterdv"; + + $filterVertragsart = addslashes($filterVertragsart); // Escaping von Sonderzeichen + $qry .= " AND d.vertragsart_kurzbz = '" . $filterVertragsart . "'"; + } + + if($extern) + { + $filterVertragsart2 = "externerlehrender"; + + $filterVertragsart2 = addslashes($filterVertragsart2); // Escaping von Sonderzeichen + $qry .= " AND d.vertragsart_kurzbz = '" . $filterVertragsart2 . "'"; + }*/ + + if($person_id) + { + $qry .= " WHERE p.person_id = ?"; + } + + + $qry.= " + GROUP BY + b.uid, p.person_id, p.vorname, p.nachname, b.alias + ORDER BY + p.nachname, p.vorname; "; + + + + $params = array($person_id); + + return $this->execQuery($qry, $params); + } + + /** + * get current disciplinary Abteilung of person + * + * @param $person_id + * + * @return Array benutzerfunktionsdata + */ + function getPersonAbteilung($person_id) + { +/* + $qry = " + SELECT tbl_benutzer.uid + FROM tbl_mitarbeiter + JOIN tbl_benutzer ON tbl_mitarbeiter.mitarbeiter_uid::text = tbl_benutzer.uid::text + JOIN tbl_person USING (person_id) + WHERE tbl_person.person_id=? + "; + + + $result = $this->execQuery($qry, array($person_id)); + + $uid = current(getData($result)); + $uid = $uid->uid; + + + $qry2 =" + SELECT + bf.benutzerfunktion_id,bf.fachbereich_kurzbz,bf.uid,bf.funktion_kurzbz,bf.updateamum,bf.updatevon,bf.insertamum,bf.insertvon,bf.ext_id,bf.semester,bf.oe_kurzbz,bf.datum_von,bf.datum_bis,bf.bezeichnung,bf.wochenstunden, + oe.oe_kurzbz,oe.oe_parent_kurzbz,oe.bezeichnung,oe.organisationseinheittyp_kurzbz,oe.aktiv,oe.mailverteiler,oe.freigabegrenze,oe.kurzzeichen,oe.lehre,oe.standort,oe.warn_semesterstunden_frei,oe.warn_semesterstunden_fix,oe.standort_id + FROM tbl_benutzerfunktion bf JOIN public.tbl_organisationseinheit oe USING(oe_kurzbz) + WHERE uid = ? AND funktion_kurzbz='oezuordnung' + AND datum_von<=now() AND (datum_bis is null OR datum_bis>=now()) + "; + + $result2 = $this->execQuery($qry2, array($uid)); + + + return $result2;*/ + + // First Query + $qry = " + SELECT tbl_benutzer.uid + FROM tbl_mitarbeiter + JOIN tbl_benutzer ON CAST(tbl_mitarbeiter.mitarbeiter_uid AS TEXT) = CAST(tbl_benutzer.uid AS TEXT) + JOIN tbl_person USING (person_id) + WHERE tbl_person.person_id = ? + "; + $result = $this->execQuery($qry, [$person_id]); + + // Validate and extract UID + $data = getData($result); + if (empty($data)) { + return null; // No UID found + } + + $uid = isset($data[0]->uid) ? $data[0]->uid : null; + // $uid = isset($data[0]['uid']) ? $data[0]['uid'] : null; + + if (!$uid) { + return null; // UID extraction failed + } + + // Second Query + $qry2 = " + SELECT + bf.benutzerfunktion_id, bf.fachbereich_kurzbz, bf.uid, bf.funktion_kurzbz, bf.updateamum, + bf.updatevon, bf.insertamum, bf.insertvon, bf.ext_id, bf.semester, bf.oe_kurzbz, + bf.datum_von, bf.datum_bis, bf.bezeichnung, bf.wochenstunden, + oe.oe_kurzbz, oe.oe_parent_kurzbz, oe.bezeichnung, + oe.organisationseinheittyp_kurzbz, oe.aktiv, oe.mailverteiler, + oe.freigabegrenze, oe.kurzzeichen, oe.lehre, oe.standort, + oe.warn_semesterstunden_frei, oe.warn_semesterstunden_fix, oe.standort_id + FROM tbl_benutzerfunktion bf + JOIN public.tbl_organisationseinheit oe USING(oe_kurzbz) + WHERE uid = ? + AND funktion_kurzbz = 'oezuordnung' + AND datum_von <= NOW() + AND (datum_bis IS NULL OR datum_bis >= NOW()) + "; + $result2 = $this->execQuery($qry2, [$uid]); + + return $result2; + } + + function getLeitungOrg($oe_kurzbz) + { + $qry = " + SELECT bf.benutzerfunktion_id,bf.fachbereich_kurzbz,bf.uid,bf.funktion_kurzbz,bf.updateamum,bf.updatevon,bf.insertamum,bf.insertvon,bf.ext_id,bf.semester,bf.oe_kurzbz,bf.datum_von,bf.datum_bis,bf.bezeichnung,bf.wochenstunden, + p.person_id, p.vorname,p.nachname,p.titelpre,p.titelpost + FROM public.tbl_benutzerfunktion bf JOIN public.tbl_organisationseinheit oe USING(oe_kurzbz) + JOIN public.tbl_benutzer b USING (uid) JOIN public.tbl_mitarbeiter ma ON(b.uid=ma.mitarbeiter_uid) + JOIN public.tbl_person p USING(person_id) + WHERE funktion_kurzbz='Leitung' AND oe.oe_kurzbz = ? + AND datum_von<=now() AND (datum_bis is null OR datum_bis>=now()); + "; + + return $this->execQuery($qry, array($oe_kurzbz)); + } + + function getHeader($person_id) + { + $qry = " + SELECT + * + FROM + public.tbl_person + JOIN public.tbl_benutzer b USING(person_id) + JOIN public.tbl_mitarbeiter ma ON (ma.mitarbeiter_uid = b.uid) + WHERE + person_id = ? + "; + + return $this->execQuery($qry, array($person_id)); + } + /** * Gibt ein Array mit den UIDs der Vorgesetzten zurück * @return object diff --git a/application/views/Vertragsverwaltung.php b/application/views/Vertragsverwaltung.php new file mode 100644 index 000000000..c56da0362 --- /dev/null +++ b/application/views/Vertragsverwaltung.php @@ -0,0 +1,42 @@ + 'Vertragsverwaltung', + 'axios027' => true, + 'bootstrap5' => true, + 'fontawesome6' => true, + 'vue3' => true, + 'primevue3' => true, + #'filtercomponent' => true, + 'tabulator5' => true, + 'tinymce5' => true, + 'phrases' => array( + 'global', + 'ui', + ), + 'customCSSs' => [ + 'public/css/components/vue-datepicker.css', + 'public/css/components/primevue.css', +/* 'public/css/Vertragsverwaltung.css'*/ + ], + 'customJSs' => [ + #'vendor/npm-asset/primevue/tree/tree.min.js', + #'vendor/npm-asset/primevue/toast/toast.min.js' + ], + 'customJSModules' => [ + 'public/js/apps/Vertragsverwaltung.js' + ] +); + +$this->load->view('templates/FHC-Header', $includesArray); +?> + +
+ + +
+ +load->view('templates/FHC-Footer', $includesArray); ?> + diff --git a/public/js/api/vertraege/person.js b/public/js/api/vertraege/person.js index 5c562a273..7e0aee6bd 100644 --- a/public/js/api/vertraege/person.js +++ b/public/js/api/vertraege/person.js @@ -49,5 +49,18 @@ export default { }, deleteBetreuung(params) { return this.$fhcApi.post('api/frontend/v1/vertraege/vertraege/deleteBetreuung/' + params.vertrag_id, params); + }, + getMitarbeiter(params){ + 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); + }, + getPersonAbteilung(person_id){ + return this.$fhcApi.post('api/frontend/v1/vertraege/vertraege/getPersonAbteilung/' + person_id); + }, + getLeitungOrg(oekurzbz){ + return this.$fhcApi.post('api/frontend/v1/vertraege/vertraege/getLeitungOrg/' + oekurzbz); } + } \ No newline at end of file diff --git a/public/js/apps/Vertragsverwaltung.js b/public/js/apps/Vertragsverwaltung.js new file mode 100644 index 000000000..1918345c0 --- /dev/null +++ b/public/js/apps/Vertragsverwaltung.js @@ -0,0 +1,27 @@ +import Vertragsverwaltung from "../components/Vertraege/Vertragsverwaltung.js"; +import fhcapifactory from "./api/fhcapifactory.js"; + +import Phrasen from "../plugin/Phrasen.js"; + +const ciPath = FHC_JS_DATA_STORAGE_OBJECT.app_root.replace(/(https:|)(^|\/\/)(.*?\/)/g, '') + FHC_JS_DATA_STORAGE_OBJECT.ci_router; + +const router = VueRouter.createRouter({ + history: VueRouter.createWebHistory(), + routes: [ + { path: `/${ciPath}/vertragsverwaltung`, component: Vertragsverwaltung }, + ] +}); + + +const app = Vue.createApp(); + +app + .use(router) + //.use(fhcapifactory) //nicht nötig + .use(primevue.config.default, { + zIndex: { + overlay: 1100 + } + }) + .use(Phrasen) + .mount('#main'); diff --git a/public/js/components/Vertraege/MitarbeiterDetails.js b/public/js/components/Vertraege/MitarbeiterDetails.js new file mode 100644 index 000000000..1dbe05402 --- /dev/null +++ b/public/js/components/Vertraege/MitarbeiterDetails.js @@ -0,0 +1,105 @@ +export default { + data() { + return { + headerData: {}, + departmentData: {}, + leitungData: {}, + //TODO(Manu) get from config + domain: 'c3p0.ma0068.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[0]; + }) + .catch(this.$fhcAlert.handleSystemError); + }, + loadDepartmentData(person_id) { + return this.$fhcApi.factory.vertraege.person + .getPersonAbteilung(person_id) + .then(result => { + this.departmentData = result.data[0]; + }) + .catch(this.$fhcAlert.handleSystemError); + }, + getLeitungOrg(oekurzbz){ + return this.$fhcApi.factory.vertraege.person + .getLeitungOrg(oekurzbz) + .then(result => { + this.leitungData = result.data[0]; + }) + .catch(this.$fhcAlert.handleSystemError); + } + }, + template: ` +
+ +
+
+ profilepicture +
+ + +
+
{{headerData.titelpre}} {{headerData.vorname}} {{headerData.nachname}} {{headerData.titelpost}}
+ {{departmentData.organisationseinheittyp_kurzbz}} {{departmentData.bezeichnung}} | Vorgesetzte/e {{leitungData.titelpre}} {{leitungData.vorname}} {{leitungData.nachname}} {{leitungData.titelpost}} +

+ Email + + {{ headerData.uid }}@{{ domain }} + + + {{ headerData.alias }}@{{ domain }} + + | DW {{ headerData?.telefonklappe }} +

+ +
+
+
+ +` +}; \ No newline at end of file diff --git a/public/js/components/Vertraege/MitarbeiterHeader.js b/public/js/components/Vertraege/MitarbeiterHeader.js new file mode 100644 index 000000000..5c6c3330b --- /dev/null +++ b/public/js/components/Vertraege/MitarbeiterHeader.js @@ -0,0 +1,175 @@ +import {CoreFilterCmpt} from "../filter/Filter.js"; +import FormInput from '../Form/Input.js'; + +export default { + components: { + CoreFilterCmpt, + FormInput + }, + inject: { + cisRoot: { + from: 'cisRoot' + }, + }, + emits: [ + "selectedPerson" + ], + props: { + // 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 { + tabulatorOptions: { + ajaxURL: 'dummy', + ajaxRequestFunc: this.$fhcApi.factory.vertraege.person.getMitarbeiter, + ajaxParams: () => { + return { + fix: this.filterMa + }; + }, + ajaxResponse: (url, params, response) => response.data, + columns: [ + {title: "UID", field: "uid", headerFilter:"input"}, + {title: "personID", field: "person_id", visible: false, headerFilter:"input"}, + {title: "Nachname", field: "nachname", headerFilter:"input"}, + {title: "Vorname", field: "vorname", headerFilter:"input"}, + { + title: "Aktiv", field: "aktiv", headerFilter: "input", + formatter:"tickCross", + hozAlign:"center", + formatterParams: { + tickElement: '', + crossElement: '' + } + }, + {title: "Geburtsdatum", field: "format_gebdatum", headerFilter:"input"}, + {title: "Unternehmen", field: "unternehmen", headerFilter:"input"}, + {title: "Vertragsarten", field: "vertragsarten", headerFilter:"input"}, + {title: "Ids Dienstverträge", field: "ids", headerFilter:"input"}, + ], + layout: 'fitColumns', + persistenceID: 'core-mitarbeiter', + selectableRangeMode: 'click', + selectable: true, + }, + tabulatorEvents: [ + { + event: 'rowSelectionChanged', + handler: this.rowSelectionChanged + }, + { +/* event: 'tableBuilt', + handler: async() => { + + await this.$p.loadCategory(['ui', 'global', 'vertrag']); + + let cm = this.$refs.table.tabulator.columnManager; + + cm.getColumnByField('bezeichnung').component.updateDefinition({ + title: this.$p.t('ui', 'bezeichnung') + }); + cm.getColumnByField('lehreinheit_id').component.updateDefinition({ + title: this.$p.t('ui', 'lehreinheit_id') + }); + cm.getColumnByField('betrag').component.updateDefinition({ + title: this.$p.t('ui', 'betrag') + }); + cm.getColumnByField('status').component.updateDefinition({ + title: this.$p.t('global', 'status') + }); + cm.getColumnByField('vertragstyp_bezeichnung').component.updateDefinition({ + title: this.$p.t('vertrag', 'vertragstyp') + }); + cm.getColumnByField('format_vertragsdatum').component.updateDefinition({ + title: this.$p.t('vertrag', 'vertragsdatum') + }); + cm.getColumnByField('vertragsdatum').component.updateDefinition({ + title: this.$p.t('vertrag', 'vertragsdatum_iso') + }); + cm.getColumnByField('vertragsstunden').component.updateDefinition({ + title: this.$p.t('vertrag', 'vertragsstunden') + }); + 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, + isFilterSet: false, + } + }, + methods: { + rowSelectionChanged(data) { + this.selectedPerson = data[0].person_id; + this.$emit('selectedPerson', this.selectedPerson); + }, + onSwitchChange() { + if (this.isFilterSet) { + this.$refs.table.tabulator.setFilter("aktiv", "=", true); + } + else { + this.$refs.table.tabulator.clearFilter("aktiv"); + } + }, + }, + template: ` +
+

Vertragsverwaltung

+ + +
+ + +
+ + + + +
` +} + diff --git a/public/js/components/Vertraege/Vertraege.js b/public/js/components/Vertraege/Vertraege.js index a525f859e..468e73bf8 100644 --- a/public/js/components/Vertraege/Vertraege.js +++ b/public/js/components/Vertraege/Vertraege.js @@ -32,6 +32,11 @@ export default { required: true }, }, + computed: { + appRoot() { + return FHC_JS_DATA_STORAGE_OBJECT.app_root; + } + }, data() { return { tabulatorOptions: { @@ -170,7 +175,7 @@ export default { datum: new Date(), }, childData: {}, - isFilterSet: false + isFilterSet: false, } }, watch: { @@ -434,6 +439,7 @@ export default { this.$nextTick(() => { this.$refs.table.tabulator.on("rowClick", (e, row) => { this.contractSelected = row.getData(); + console.log("selected Row ", this.contractSelected); }); }); this.getFormattedDate(); @@ -442,6 +448,17 @@ export default { template: `
+ + + + +
-
+
diff --git a/public/js/components/Vertraege/Vertragsverwaltung.js b/public/js/components/Vertraege/Vertragsverwaltung.js new file mode 100644 index 000000000..5c92f75ad --- /dev/null +++ b/public/js/components/Vertraege/Vertragsverwaltung.js @@ -0,0 +1,53 @@ +import MitarbeiterHeader from "./MitarbeiterHeader.js"; +import MitarbeiterDetails from "./MitarbeiterDetails.js"; +import Vertraege from "./Vertraege.js"; +import VerticalSplit from "../verticalsplit/verticalsplit.js"; + +export default { + components: { + VerticalSplit, + MitarbeiterHeader, + MitarbeiterDetails, + Vertraege + }, + data() { + //TODO(Manu) props for filter: actually not necessary + return { + person_id: null, +/* filterMa: { + active: true, + hasVertraege: true + },*/ +/* vertragsarten: + [ 'echterdv', 'externerlehrender', 'gastlektor']*/ + } + }, + methods: { + selectPerson(selected){ + this.person_id = selected; + } + }, + template: ` +
+
+
+
+ + + +