diff --git a/application/controllers/api/frontend/v1/MaZeitsperren.php b/application/controllers/api/frontend/v1/MaZeitsperren.php index 8c7abae1c..ad5bf20a2 100644 --- a/application/controllers/api/frontend/v1/MaZeitsperren.php +++ b/application/controllers/api/frontend/v1/MaZeitsperren.php @@ -78,6 +78,10 @@ class MaZeitsperren extends FHCAPI_Controller public function getAllZeitsperrenOes($days, $oe) { + if(!$oe) + { + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'OE Kurzbezeichnung']), self::ERROR_TYPE_GENERAL); + } $von = date('Y-m-d'); $bis = date('Y-m-d', strtotime("+{$days} days")); $result = $this->ZeitsperreModel->getMitarbeiterWithZeitsperren($von, $bis, false, false, $oe, false); @@ -89,6 +93,15 @@ class MaZeitsperren extends FHCAPI_Controller public function loadZeitsperrenLectorStg($days, $stg) { + if(!$stg) + { + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Studiengangskennzahl']), self::ERROR_TYPE_GENERAL); + } + if(!is_numeric($stg)) + { + return $this->terminateWithError($this->p->t('ui', 'error_paramNoNumber', ['param'=> 'Studiengangskennzahl']), self::ERROR_TYPE_GENERAL); + } + $von = date('Y-m-d'); $bis = date('Y-m-d', strtotime("+{$days} days")); $result = $this->ZeitsperreModel->getMitarbeiterWithZeitsperren($von, $bis, false, true, false, false, $stg); @@ -125,6 +138,10 @@ class MaZeitsperren extends FHCAPI_Controller public function loadZeitsperrenMa($days, $uid) { + if ($uid === null || $uid === '') + { + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Mitarbeiter UID']), self::ERROR_TYPE_GENERAL); + } $result = $this->ZeitsperreModel->getZeitsperrenForNextDays($days, $uid); $data = $this->getDataOrTerminateWithError($result); @@ -134,6 +151,10 @@ class MaZeitsperren extends FHCAPI_Controller public function getDetailsMa($uid) { + if ($uid === null || $uid === '') + { + $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Mitarbeiter UID']), self::ERROR_TYPE_GENERAL); + } $this->load->model('ressource/Person_model', 'PersonModel'); $result = $this->PersonModel->getFullName($uid); diff --git a/public/js/apps/Cis/Cis.js b/public/js/apps/Cis/Cis.js index 1d857af6b..4ad855ffd 100644 --- a/public/js/apps/Cis/Cis.js +++ b/public/js/apps/Cis/Cis.js @@ -233,7 +233,7 @@ const router = VueRouter.createRouter({ props: {dashboard: 'CIS'}, }, { - path: `/Cis/Zeitsperren/:type?/:maUid?/:days?`, + path: '/Cis/Zeitsperren/:type(all|fix|lector|ma|oe|stg|ass)?/:id?/:days?', name: 'ZeitsperrenMa', component: ZeitsperrenMa, props: route => { diff --git a/public/js/components/Cis/ZeitsperrenMitarbeiter/Details/ZeitsperrenMitarbeiteruid.js b/public/js/components/Cis/ZeitsperrenMitarbeiter/Details/ZeitsperrenMitarbeiteruid.js index 971e15f54..731c745f6 100644 --- a/public/js/components/Cis/ZeitsperrenMitarbeiter/Details/ZeitsperrenMitarbeiteruid.js +++ b/public/js/components/Cis/ZeitsperrenMitarbeiter/Details/ZeitsperrenMitarbeiteruid.js @@ -18,7 +18,7 @@ export default { name: 'ZeitsperrenMa', params: { type: 'ma', - maUid: maUid, + id: maUid, days: days } }); diff --git a/public/js/components/Cis/ZeitsperrenMitarbeiter/Details/listsZeitsperren.js b/public/js/components/Cis/ZeitsperrenMitarbeiter/Details/listsZeitsperren.js index 72981c672..b5b0bd25f 100644 --- a/public/js/components/Cis/ZeitsperrenMitarbeiter/Details/listsZeitsperren.js +++ b/public/js/components/Cis/ZeitsperrenMitarbeiter/Details/listsZeitsperren.js @@ -23,7 +23,7 @@ export default { 'lector', 'oe', 'ass', - 'lecStg', + 'stg', 'ma' ].includes(value) } @@ -31,9 +31,9 @@ export default { tage: { type: String }, - maUid: { + id: { type: String - } + }, }, data(){ return { @@ -49,7 +49,10 @@ export default { selectedStg: null, studiengang_kz: null, showTable: true, - fullName: null + fullName: null, + maUid: null, + validStgs: [], + validOes: [] } }, methods: { @@ -75,6 +78,14 @@ export default { }) }, loadZeitsperrenOE(days, oe){ + this.$router.push({ + name: 'ZeitsperrenMa', + params: { + type: this.$route.params.type, + id: oe, + days: days + } + }); this.$api .call(ApiMaTimelocks.loadAllZeitsperrenOE(days, oe)) .then(result => { @@ -89,6 +100,14 @@ export default { }) }, loadZeitsperrenStg(days, stg){ + this.$router.push({ + name: 'ZeitsperrenMa', + params: { + type: this.$route.params.type, + id: stg, + days: days + } + }); this.$api .call(ApiMaTimelocks.loadZeitsperrenLectorStg(days, stg)) .then(result => { @@ -128,47 +147,85 @@ export default { createArrayMa(type){ this.showTable = true; if(type == "fix") { + if(this.id && this.isZifferString(this.id)) + this.interval = Number(this.id) < 100 ? Number(this.id) : this.interval; + this.loadZeitsperrenFixeMa(this.interval); } else if(type == "lector") { + if(this.id && this.isZifferString(this.id)) + this.interval = Number(this.id) < 100 ? Number(this.id) : this.interval; this.loadZeitsperrenLector(this.interval); } else if(type == "oe") { - this.showTable = false; - this.selectedOe = null; - this.$api - .call(ApiMaTimelocks.getAllOes()) - .then(result => { - this.listOes = result.data.filter(item => item.aktiv); - }) - .catch(this.$fhcAlert.handleSystemError); + this.loadOes().then(() => { + if(this.id && this.validOes.includes(this.id)) { + const countDays = this.tage ? Number(this.tage) : this.interval; + + this.oe_temp = this.listOes.filter( + item => item.oe_kurzbz === this.id + ); + this.selectedOe = this.oe_temp[0]; + + this.loadZeitsperrenOE( + countDays, + this.selectedOe.oe_kurzbz + ); + } else { + if(this.id) + this.interval = Number(this.id) < 100 + ? Number(this.id) + : this.interval; + + this.showTable = false; + this.selectedOe = null; + } + }); } - else if(type == "lecStg") { - this.showTable = false; - this.selectedStg = null; - this.$api - .call(ApiMaTimelocks.getAllStg()) - .then(result => { - this.listStg = result.data; - }) - .catch(this.$fhcAlert.handleSystemError); + else if(type == "stg") { + this.loadStgs().then(() => { + if(this.id && this.validStgs.includes(Number(this.id))) + { + const countDays= this.tage ? Number(this.tage) : this.interval; + this.stg_temp = this.listStg.filter( + item => item.studiengang_kz === Number(this.id) + ); + this.selectedStg = this.stg_temp[0]; + this.loadZeitsperrenStg(countDays, this.id) + } + else + { + if(this.id && this.isZifferString(this.id)) + this.interval = Number(this.id) < 100 ? Number(this.id) : this.interval; + this.showTable = false; + this.selectedStg = null; + } + }); } else if(type == "all") { + if(this.id && this.isZifferString(this.id)) + this.interval = Number(this.id) < 100 ? Number(this.id) : this.interval; this.loadAllActiveZeitsperren(this.interval); } else if(type == "ass") { + if(this.id && this.isZifferString(this.id)) + this.interval = Number(this.id) < 100 ? Number(this.id) : this.interval; this.loadZeitsperrenAss(this.interval); } else if(type == "ma") { + if(!this.id) + this.$fhcAlert.alertError(this.$p.t('ui', 'error_missingId', {id: "mitarbeiteruid"})); const countDays= this.tage ? this.tage : this.interval; - this.loadZeitsperrenMa(countDays, this.maUid); - this.loadDetailsMa(this.maUid); + this.loadZeitsperrenMa(countDays, this.id); + this.loadDetailsMa(this.id); } else { - this.$fhcAlert.alertError(this.$p.t('ui', 'error_fieldNotFound', {field: "Typ Zeitsperre"})); + //route back if no type found + this.$router.push({ + name: 'ZeitsperrenMa', + }); } - }, isBlocked(mitarbeiter, tag) { if (!mitarbeiter?.sperren) { @@ -213,11 +270,50 @@ export default { ); }, loadDetailsMa(uid){ + if(!uid) + this.$fhcAlert.alertError(this.$p.t('ui', 'error_fieldNotFound', {field: "UID Mitarbeiter"})); + this.$api .call(ApiMaTimelocks.getDetailsMa(uid)) .then(result => { this.fullName = result.data; }) + }, + isZifferString(wert) { + //to check if the wert of the route param is a ziffer or a real String + return typeof wert === 'string' && wert.trim() !== '' && !isNaN(wert); + }, + async loadOes() { + try { + const result = await this.$api.call(ApiMaTimelocks.getAllOes()); + this.listOes = result.data.filter(item => item.aktiv); + this.validOes = this.listOes.map(item => item.oe_kurzbz); + } catch (e) { + this.$fhcAlert.handleSystemError(e); + } + return this.validOes; + }, + async loadStgs() { + try { + const result = await this.$api.call(ApiMaTimelocks.getAllStg()); + this.listStg = result.data; + this.validStgs = this.listStg.map(item => item.studiengang_kz); + } catch (e) { + this.$fhcAlert.handleSystemError(e); + } + return this.validOes; + }, + checkRoute(){ + if (this.type === 'ma' && !this.id) { + //const errorString = this.$p.t('ui', 'successSave'); + const errorString = "Keine ID für Mitarbeiter übergeben"; + return errorString; + } + if (this.type === 'stg' && !this.isZifferString(this.id)) { + //const errorString = this.$p.t('ui', 'successSave'); + const errorString = "Studiengangskennzahl darf nur aus Zahlen bestehen"; + return errorString; + } } }, computed: { @@ -290,7 +386,7 @@ export default { else if(this.type == "ass") { this.loadZeitsperrenAss(newVal); } - else if(this.type == "lecStg") { + else if(this.type == "stg") { if(this.selectedStg ) this.loadZeitsperrenStg(newVal, this.studiengang_kz); } @@ -336,11 +432,26 @@ export default { }, }, created(){ + const error = this.checkRoute(); + if (error) { + console.log(error); + this.$fhcAlert.alertError(error); + return; + } + this.createArrayMa(this.type); - if(this.tage) + if(this.tage && Number(this.tage) < 100) { this.createDays(Number(this.tage)); + this.interval = Number(this.tage); + } else this.createDays(this.interval); + + if (this.type === 'oe') { + this.oe_kurzbz = this.id + } else if (this.type === 'stg'){ + this.studiengang_kz = this.id; + } }, template: `
@@ -349,7 +460,7 @@ export default { {{$p.t('zeitsperren/title_fix')}} {{$p.t('zeitsperren/title_fixLecturers')}} {{$p.t('zeitsperren/title_byOe')}} - {{$p.t('zeitsperren/title_lectStg')}} + {{$p.t('zeitsperren/title_lectStg')}} {{$p.t('zeitsperren/title_ass')}} {{$p.t('zeitsperren/zeitsperrenVon')}} {{fullName}} {{ mondayBeforeToday.toLocaleDateString('de-AT') }} - {{endInterval}} @@ -393,8 +504,8 @@ export default {
- -
+ +
- +
diff --git a/public/js/components/Cis/ZeitsperrenMitarbeiter/ZeitsperrenMa.js b/public/js/components/Cis/ZeitsperrenMitarbeiter/ZeitsperrenMa.js index 85de8781a..2e8223938 100644 --- a/public/js/components/Cis/ZeitsperrenMitarbeiter/ZeitsperrenMa.js +++ b/public/js/components/Cis/ZeitsperrenMitarbeiter/ZeitsperrenMa.js @@ -1,5 +1,6 @@ import listsZeitsperren from './Details/listsZeitsperren.js'; import MitarbeiterZeitsperren from './Details/ZeitsperrenMitarbeiteruid.js'; +export const DEFAULT_INTERVAL_DAYS = 14; export default { name: 'ZeitsperrenMa', @@ -40,7 +41,7 @@ export default { class: 'btn-secondary' }, { - key: 'lecStg', + key: 'stg', title: 'zeitsperren/btn_lect_stg', class: 'btn-secondary' } @@ -51,13 +52,20 @@ export default { show(view) { this.activeView = this.activeView === view ? null : view; }, + route(view) { + this.activeView = this.activeView === view ? null : view; + this.$router.push({ + name: 'ZeitsperrenMa', + params: { + type: this.activeView, + days: DEFAULT_INTERVAL_DAYS + } + }); + }, }, - //TODO(only show main page if there is no prop template: `
- -
diff --git a/public/js/components/Vertraege/Vertragsverwaltung.js b/public/js/components/Vertraege/Vertragsverwaltung.js index 15277e28c..77fc753dc 100644 --- a/public/js/components/Vertraege/Vertragsverwaltung.js +++ b/public/js/components/Vertraege/Vertragsverwaltung.js @@ -4,8 +4,6 @@ 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'; -import ZeitsperrenProv from '../Cis/ZeitsperrenMitarbeiter/ZeitsperrenMa.js'; - export default { name: 'Vertragsverwaltung', @@ -14,8 +12,7 @@ export default { VerticalSplit, MitarbeiterHeader, FhcHeader, - VertraegeMitarbeiter, - ZeitsperrenProv + VertraegeMitarbeiter }, props: { config: Object, @@ -52,9 +49,6 @@ export default { }, template: ` - - -
diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php index c03b43636..b2fbbcd35 100644 --- a/system/phrasesupdate.php +++ b/system/phrasesupdate.php @@ -60681,6 +60681,26 @@ I have been informed that I am under no obligation to consent to the transmissio ) ) ), + array( + 'app' => 'core', + 'category' => 'ui', + 'phrase' => 'error_paramNoNumber', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Parameter {param} muss eine Zahl sein', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Parameter {param} has to be a number', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), // PHRASES ZEITSPERREN END );
UID