From ba62abc19b9ae8618e206ee37c014bd1feda0fc0 Mon Sep 17 00:00:00 2001 From: ma0068 Date: Wed, 18 Dec 2024 14:57:18 +0100 Subject: [PATCH 1/8] bug stv --- application/controllers/api/frontend/v1/stv/Favorites.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/controllers/api/frontend/v1/stv/Favorites.php b/application/controllers/api/frontend/v1/stv/Favorites.php index 8d7a6cd14..b8fe6f3d7 100644 --- a/application/controllers/api/frontend/v1/stv/Favorites.php +++ b/application/controllers/api/frontend/v1/stv/Favorites.php @@ -48,7 +48,7 @@ class Favorites extends FHCAPI_Controller if (!$data) $this->terminateWithSuccess(null); else - $this->terminateWithSuccess($data['stv_favorites']); + $this->terminateWithSuccess($data['stv_favorites'] ?? null); } public function set() From 39a23693ba2cb274b14ad895f1e18996c0f52536 Mon Sep 17 00:00:00 2001 From: ma0068 Date: Wed, 18 Dec 2024 16:31:39 +0100 Subject: [PATCH 2/8] start Table Mobility --- .../api/frontend/v1/stv/Config.php | 5 + .../api/frontend/v1/stv/Mobility.php | 47 ++ public/js/api/stv.js | 2 + public/js/api/stv/mobility.js | 5 + .../Studentenverwaltung/Details/Mobility.js | 25 + .../Details/Mobility/Mobility.js | 629 ++++++++++++++++++ system/phrasesupdate.php | 25 +- 7 files changed, 737 insertions(+), 1 deletion(-) create mode 100644 application/controllers/api/frontend/v1/stv/Mobility.php create mode 100644 public/js/api/stv/mobility.js create mode 100644 public/js/components/Stv/Studentenverwaltung/Details/Mobility.js create mode 100644 public/js/components/Stv/Studentenverwaltung/Details/Mobility/Mobility.js diff --git a/application/controllers/api/frontend/v1/stv/Config.php b/application/controllers/api/frontend/v1/stv/Config.php index c28c49485..241292ae0 100644 --- a/application/controllers/api/frontend/v1/stv/Config.php +++ b/application/controllers/api/frontend/v1/stv/Config.php @@ -91,6 +91,11 @@ class Config extends FHCAPI_Controller 'title' => $this->p->t('stv', 'tab_resources'), 'component' => './Stv/Studentenverwaltung/Details/Betriebsmittel.js' ]; + $result['mobility'] = [ + 'title' => $this->p->t('stv', 'tab_mobility'), + 'component' => './Stv/Studentenverwaltung/Details/Mobility.js' + ]; + /* TODO(chris): Ausgeblendet für Testing $result['grades'] = [ 'title' => $this->p->t('stv', 'tab_grades'), diff --git a/application/controllers/api/frontend/v1/stv/Mobility.php b/application/controllers/api/frontend/v1/stv/Mobility.php new file mode 100644 index 000000000..49a0ec165 --- /dev/null +++ b/application/controllers/api/frontend/v1/stv/Mobility.php @@ -0,0 +1,47 @@ + ['admin:r', 'assistenz:r'], + 'loadMobility' => ['admin:r', 'assistenz:r'], + 'insertMobility' => ['admin:rw', 'assistenz:rw'], + 'updateMobility' => ['admin:rw', 'assistenz:rw'], + 'deleteMobility' => ['admin:rw', 'assistenz:rw'], + 'getTypenMobility' => ['admin:rw', 'assistenz:rw'], + ]); + + // Load Libraries + $this->load->library('VariableLib', ['uid' => getAuthUID()]); + $this->load->library('form_validation'); + + // Load language phrases + $this->loadPhrases([ + 'ui' + ]); + + // Load models + $this->load->model('codex/Mobilitaet_model', 'MobilitaetModel'); + } + + public function getMobilitaeten($prestudent_id) + { + $this->MobilitaetModel->addJoin('bis.tbl_mobilitaetsprogramm mp', 'ON (mp.mobilitaetsprogramm_code = bis.tbl_mobilitaet.mobilitaetsprogramm_code)', 'LEFT'); + + $result = $this->MobilitaetModel->loadWhere( + array('prestudent_id' => $prestudent_id) + ); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + + } + +} diff --git a/public/js/api/stv.js b/public/js/api/stv.js index 14fcc6661..5f3f52dab 100644 --- a/public/js/api/stv.js +++ b/public/js/api/stv.js @@ -2,12 +2,14 @@ import verband from './stv/verband.js'; import students from './stv/students.js'; import filter from './stv/filter.js'; import konto from './stv/konto.js'; +import mobility from './stv/mobility.js'; export default { verband, students, filter, konto, + mobility, configStudent() { return this.$fhcApi.get('api/frontend/v1/stv/config/student'); }, diff --git a/public/js/api/stv/mobility.js b/public/js/api/stv/mobility.js new file mode 100644 index 000000000..0aee23fb6 --- /dev/null +++ b/public/js/api/stv/mobility.js @@ -0,0 +1,5 @@ +export default { + getMobilitaeten (url, config, params){ + return this.$fhcApi.get('api/frontend/v1/stv/mobility/getMobilitaeten/' + params.id); + }, +} \ No newline at end of file diff --git a/public/js/components/Stv/Studentenverwaltung/Details/Mobility.js b/public/js/components/Stv/Studentenverwaltung/Details/Mobility.js new file mode 100644 index 000000000..16c229235 --- /dev/null +++ b/public/js/components/Stv/Studentenverwaltung/Details/Mobility.js @@ -0,0 +1,25 @@ +import TableMobility from "./Mobility/Mobility.js"; + +export default { + components: { + TableMobility + }, + provide() { + return { + config: this.config + }; + }, + props: { + modelValue: Object, + }, + data(){ + return {} + }, + template: ` +
+ +

TEST Mob

+ + +
` +}; \ No newline at end of file diff --git a/public/js/components/Stv/Studentenverwaltung/Details/Mobility/Mobility.js b/public/js/components/Stv/Studentenverwaltung/Details/Mobility/Mobility.js new file mode 100644 index 000000000..3f13b372c --- /dev/null +++ b/public/js/components/Stv/Studentenverwaltung/Details/Mobility/Mobility.js @@ -0,0 +1,629 @@ +import {CoreFilterCmpt} from "../../../../filter/Filter.js"; +import BsModal from "../../../../Bootstrap/Modal.js"; +import FormForm from '../../../../Form/Form.js'; +import FormInput from '../../../../Form/Input.js'; + +export default { + components: { + CoreFilterCmpt, + BsModal, + FormForm, + FormInput + }, + inject: { + $reloadList: { + from: '$reloadList', + required: true + } + }, + props: { + prestudent: Object + }, + data() { + return { + tabulatorOptions: { + ajaxURL: 'dummy', + ajaxRequestFunc: this.$fhcApi.factory.stv.mobility.getMobilitaeten, + ajaxParams: () => { + return { + id: this.prestudent.prestudent_id + }; + }, + ajaxResponse: (url, params, response) => response.data, + columns: [ + {title: "Kurzbz", field: "kurzbz"}, + {title: "Nation", field: "beurteilung_bezeichnung"}, + {title: "firma_id", field: "firma_id", visible: false}, + // {title: "prueferIn2", field: "p2_nachname", visible: false}, + // {title: "prueferIn3", field: "p3_nachname", visible: false}, + // {title: "datum", field: "format_datum"}, + // {title: "uhrzeit", field: "uhrzeit"}, + // {title: "freigabe", field: "format_freigabedatum"}, + // {title: "pruefungsantritt", field: "antritt_bezeichnung"}, + // {title: "sponsion", field: "format_sponsion"}, + // {title: "anmerkung", field: "anmerkung"}, + // {title: "mobility_id", field: "mobility_id", visible: false}, + // {title: "typ", field: "pruefungstyp_kurzbz", visible: false}, + + { + title: 'Aktionen', field: 'actions', + minWidth: 150, // Ensures Action-buttons will be always fully displayed + formatter: (cell, formatterParams, onRendered) => { + let 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 = ''; + button.title = this.$p.t('ui', 'bearbeiten'); + button.addEventListener('click', (event) => + this.actionEditmobility(cell.getData().mobility_id) + ); + container.append(button); + + button = document.createElement('button'); + button.className = 'btn btn-outline-secondary btn-action'; + button.innerHTML = ''; + button.title = this.$p.t('ui', 'loeschen'); + button.addEventListener('click', () => + this.actionDeletemobility(cell.getData().mobility_id) + ); + container.append(button); + + return container; + }, + frozen: true + }, + ], + layout: 'fitDataFill', + layoutColumnsOnNewData: false, + height: 'auto', + minHeight: '200', + selectable: true, + index: 'mobility_id', + persistenceID: 'stv-details-table_mobiliy' + }, + tabulatorEvents: [ + { + event: 'tableBuilt', + handler: async() => { + await this.$p.loadCategory(['global', 'person', 'stv', 'mobility', 'ui']); + + + let cm = this.$refs.table.tabulator.columnManager; + + // cm.getColumnByField('vorsitz_nachname').component.updateDefinition({ + // title: this.$p.t('mobility', 'vorsitz_header') + // }); + // cm.getColumnByField('beurteilung_bezeichnung').component.updateDefinition({ + // title: this.$p.t('mobility', 'abschlussbeurteilung') + // }); + // cm.getColumnByField('p1_nachname').component.updateDefinition({ + // title: this.$p.t('mobility', 'pruefer1') + // }); + // cm.getColumnByField('p2_nachname').component.updateDefinition({ + // title: this.$p.t('mobility', 'pruefer2') + // }); + // cm.getColumnByField('p3_nachname').component.updateDefinition({ + // title: this.$p.t('mobility', 'pruefer3') + // }); + // cm.getColumnByField('format_datum').component.updateDefinition({ + // title: this.$p.t('global', 'datum') + // }); + // cm.getColumnByField('uhrzeit').component.updateDefinition({ + // title: this.$p.t('global', 'uhrzeit') + // }); + // cm.getColumnByField('format_freigabedatum').component.updateDefinition({ + // title: this.$p.t('mobility', 'freigabe') + // }); + // cm.getColumnByField('antritt_bezeichnung').component.updateDefinition({ + // title: this.$p.t('mobility', 'pruefungsantritt') + // }); + // cm.getColumnByField('format_sponsion').component.updateDefinition({ + // title: this.$p.t('mobility', 'sponsion') + // }); + // cm.getColumnByField('anmerkung').component.updateDefinition({ + // title: this.$p.t('global', 'anmerkung') + // }); + // cm.getColumnByField('pruefungstyp_kurzbz').component.updateDefinition({ + // title: this.$p.t('global', 'typ') + // }); + // cm.getColumnByField('mobility_id').component.updateDefinition({ + // title: this.$p.t('ui', 'mobility_id') + // }); + /* + cm.getColumnByField('actions').component.updateDefinition({ + title: this.$p.t('global', 'aktionen') + }); + */ + } + } + ], + tabulatorData: [], + lastSelected: null, + formData: { + }, + statusNew: true, + arrTypen: [], + arrAntritte: [], + arrBeurteilungen: [], + arrAkadGrad: [], + arrNoten: [], + filteredMitarbeiter: [], + filteredPruefer: [], + abortController: { + mitarbeiter: null, + pruefer: null + }, + stgTyp: null, + stgKz: null, + } + }, + watch: { + student(){ + if (this.$refs.table) { + this.$refs.table.reloadTable(); + } + } + }, + methods: { + getStudiengangsTyp(){ + this.stgTyp = ''; + this.$fhcApi.factory.stv.mobility.getTypStudiengang(this.stg_kz) + .then(result => this.stgTyp = result.data) + .catch(this.$fhcAlert.handleSystemError); + }, + actionNewmobility() { + this.resetForm(); + this.statusNew = true; + this.setDefaultFormData(); + }, + actionEditmobility(mobility_id) { + this.resetForm(); + this.statusNew = false; + this.loadmobility(mobility_id); + }, + actionDeletemobility(mobility_id) { + this.$fhcAlert + .confirmDelete() + .then(result => result + ? mobility_id + : Promise.reject({handled: true})) + .then(this.deletemobility) + .catch(this.$fhcAlert.handleSystemError); + }, + addNewmobility() { + const dataToSend = { + uid: this.student.uid, + formData: this.formData + }; + + return this.$refs.formFinalExam.factory.stv.mobility.addNewmobility(dataToSend) + .then(response => { + this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successSave')); + this.resetForm(); + }) + .catch(this.$fhcAlert.handleSystemError) + .finally(() => { + this.reload(); + }); + }, + reload() { + this.$refs.table.reloadTable(); + }, + loadmobility(mobility_id) { + return this.$fhcApi.factory.stv.mobility.loadmobility(mobility_id) + .then(result => { + this.formData = result.data; + //TODO(Manu) check if cisRoot is okay + this.formData.link = this.cisRoot + 'index.ci.php/lehre/Pruefungsprotokoll/showProtokoll?mobility_id=' + this.formData.mobility_id + '&fhc_controller_id=67481e5ed5490'; + return result; + }) + .catch(this.$fhcAlert.handleSystemError); + }, + updatemobility(mobility_id) { + const dataToSend = { + id: mobility_id, + formData: this.formData + }; + return this.$refs.formFinalExam.factory.stv.mobility.updatemobility(dataToSend) + .then(response => { + this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successSave')); + this.resetForm(); + }) + .catch(this.$fhcAlert.handleSystemError) + .finally(() => { + this.reload(); + }); + }, + deletemobility(mobility_id) { + return this.$fhcApi.factory.stv.mobility.deletemobility(mobility_id) + .then(response => { + this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successDelete')); + }) + .catch(this.$fhcAlert.handleSystemError) + .finally(() => { + this.reload(); + }); + }, + resetForm() { + this.formData = null; + }, + }, + created() { + // this.$fhcApi.factory.stv.mobility.getTypenmobility() + // .then(result => { + // this.arrTypen = result.data; + // }) + // .catch(this.$fhcAlert.handleSystemError); + // this.$fhcApi.factory.stv.mobility.getTypenAntritte() + // .then(result => { + // this.arrAntritte = result.data; + // }) + // .catch(this.$fhcAlert.handleSystemError); + // this.$fhcApi.factory.stv.mobility.getBeurteilungen() + // .then(result => { + // this.arrBeurteilungen = result.data; + // }) + // .catch(this.$fhcAlert.handleSystemError); + // this.$fhcApi.factory.stv.mobility.getNoten() + // .then(result => { + // this.arrNoten = result.data; + // }) + // .catch(this.$fhcAlert.handleSystemError); + // this.$fhcApi.factory.stv.mobility.getAkadGrade(this.student.studiengang_kz) + // .then(result => { + // this.arrAkadGrad = result.data; + // }) + // .catch(this.$fhcAlert.handleSystemError); + // if (!this.student.length) { + // this.$fhcApi.factory.stv.mobility.getTypStudiengang(this.student.studiengang_kz) + // .then(result => { + // this.stgTyp = result.data; + // this.setDefaultFormData(); + // }) + // .catch(this.$fhcAlert.handleSystemError); + // } else + // this.getStudiengangsTyp(); + }, + template: ` +
+

In/out

+ + + + + + + + + + + + +
+` +} + diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php index 201c231a6..038bb5de5 100644 --- a/system/phrasesupdate.php +++ b/system/phrasesupdate.php @@ -37277,7 +37277,30 @@ array( 'insertvon' => 'system' ) ) - ) + ), + // FHC4 Phrases Mobility Start + array( + 'app' => 'core', + 'category' => 'stv', + 'phrase' => 'tab_mobility', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Mobilität', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Mobility', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + // FHC4 Phrases Mobility Start + ); From c980dee96b9fc1a4aa93629808ffb408dd891627 Mon Sep 17 00:00:00 2001 From: ma0068 Date: Thu, 19 Dec 2024 15:25:21 +0100 Subject: [PATCH 3/8] edit select --- .../api/frontend/v1/stv/Mobility.php | 10 ++--- .../Studentenverwaltung/Details/Mobility.js | 2 +- .../Details/Mobility/Mobility.js | 38 ++++--------------- 3 files changed, 13 insertions(+), 37 deletions(-) diff --git a/application/controllers/api/frontend/v1/stv/Mobility.php b/application/controllers/api/frontend/v1/stv/Mobility.php index 49a0ec165..db2ee1486 100644 --- a/application/controllers/api/frontend/v1/stv/Mobility.php +++ b/application/controllers/api/frontend/v1/stv/Mobility.php @@ -27,15 +27,15 @@ class Mobility extends FHCAPI_Controller ]); // Load models - $this->load->model('codex/Mobilitaet_model', 'MobilitaetModel'); + $this->load->model('codex/Bisio_model', 'BisioModel'); } - public function getMobilitaeten($prestudent_id) + public function getMobilitaeten($student_uid) { - $this->MobilitaetModel->addJoin('bis.tbl_mobilitaetsprogramm mp', 'ON (mp.mobilitaetsprogramm_code = bis.tbl_mobilitaet.mobilitaetsprogramm_code)', 'LEFT'); + // $this->BisioModel->addJoin('bis.tbl_Bisiosprogramm mp', 'ON (mp.Bisiosprogramm_code = bis.tbl_Bisio.Bisiosprogramm_code)', 'LEFT'); - $result = $this->MobilitaetModel->loadWhere( - array('prestudent_id' => $prestudent_id) + $result = $this->BisioModel->loadWhere( + array('student_uid' => $student_uid) ); $data = $this->getDataOrTerminateWithError($result); diff --git a/public/js/components/Stv/Studentenverwaltung/Details/Mobility.js b/public/js/components/Stv/Studentenverwaltung/Details/Mobility.js index 16c229235..df6a5612f 100644 --- a/public/js/components/Stv/Studentenverwaltung/Details/Mobility.js +++ b/public/js/components/Stv/Studentenverwaltung/Details/Mobility.js @@ -20,6 +20,6 @@ export default {

TEST Mob

- + ` }; \ No newline at end of file diff --git a/public/js/components/Stv/Studentenverwaltung/Details/Mobility/Mobility.js b/public/js/components/Stv/Studentenverwaltung/Details/Mobility/Mobility.js index 3f13b372c..26a41ec3e 100644 --- a/public/js/components/Stv/Studentenverwaltung/Details/Mobility/Mobility.js +++ b/public/js/components/Stv/Studentenverwaltung/Details/Mobility/Mobility.js @@ -17,7 +17,7 @@ export default { } }, props: { - prestudent: Object + student: Object }, data() { return { @@ -26,25 +26,16 @@ export default { ajaxRequestFunc: this.$fhcApi.factory.stv.mobility.getMobilitaeten, ajaxParams: () => { return { - id: this.prestudent.prestudent_id + id: this.student.student_uid }; }, ajaxResponse: (url, params, response) => response.data, columns: [ {title: "Kurzbz", field: "kurzbz"}, - {title: "Nation", field: "beurteilung_bezeichnung"}, - {title: "firma_id", field: "firma_id", visible: false}, - // {title: "prueferIn2", field: "p2_nachname", visible: false}, - // {title: "prueferIn3", field: "p3_nachname", visible: false}, - // {title: "datum", field: "format_datum"}, - // {title: "uhrzeit", field: "uhrzeit"}, - // {title: "freigabe", field: "format_freigabedatum"}, - // {title: "pruefungsantritt", field: "antritt_bezeichnung"}, - // {title: "sponsion", field: "format_sponsion"}, - // {title: "anmerkung", field: "anmerkung"}, - // {title: "mobility_id", field: "mobility_id", visible: false}, - // {title: "typ", field: "pruefungstyp_kurzbz", visible: false}, - + {title: "Nation", field: "nation_code"}, + {title: "Von", field: "von"}, + {title: "Bis", field: "bis"}, + {title: "bisio_id", field: "bisio_id"}, { title: 'Aktionen', field: 'actions', minWidth: 150, // Ensures Action-buttons will be always fully displayed @@ -139,24 +130,9 @@ export default { } } ], - tabulatorData: [], - lastSelected: null, formData: { }, statusNew: true, - arrTypen: [], - arrAntritte: [], - arrBeurteilungen: [], - arrAkadGrad: [], - arrNoten: [], - filteredMitarbeiter: [], - filteredPruefer: [], - abortController: { - mitarbeiter: null, - pruefer: null - }, - stgTyp: null, - stgKz: null, } }, watch: { @@ -304,7 +280,7 @@ export default { > - + - +
- - - -
- -
- - - - - -
- -
- - - - - - - -
- -
- - - - - -
- -
- +
- +
+ + + +
+ +
+ + + + + + +
+ +
+ + + + + +
- -
-
-

{{$p.t('mobility', 'zurBeurteilung')}}

-
- + +
+ + + +
- - -
--> + + +
diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php index 038bb5de5..a1847f679 100644 --- a/system/phrasesupdate.php +++ b/system/phrasesupdate.php @@ -37299,7 +37299,167 @@ array( ) ) ), - // FHC4 Phrases Mobility Start + array( + 'app' => 'core', + 'category' => 'mobility', + 'phrase' => 'mobilitaetsprogramm', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Mobilitätsprogramm', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Mobility program', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'mobility', + 'phrase' => 'gastnation', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Gastnation', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Host nation', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'mobility', + 'phrase' => 'herkunftsland', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Herkunftsland', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Country of origin', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'mobility', + 'phrase' => 'universitaet', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Universität', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'University', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'mobility', + 'phrase' => 'ects_erworben', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Erworbene ECTS', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'ECTS acquired', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'mobility', + 'phrase' => 'ects_angerechnet', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Angerechnete ECTS', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'ECTS credited', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'mobility', + 'phrase' => 'zweck', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Zweck', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Purpose', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'mobility', + 'phrase' => 'aufenthalt', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Aufenthalt Förderung', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Residency funding', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + // FHC4 Phrases Mobility End ); From c69910a33889dbaaaf18f3bf87d5882831201643 Mon Sep 17 00:00:00 2001 From: ma0068 Date: Fri, 24 Jan 2025 11:00:50 +0100 Subject: [PATCH 5/8] Child component Purpose.js for tableview --- .../api/frontend/v1/stv/Mobility.php | 214 ++++++++++++- .../education/Lehrveranstaltung_model.php | 23 ++ public/js/api/stv/mobility.js | 34 +++ .../Studentenverwaltung/Details/Mobility.js | 5 +- .../Details/Mobility/List/Foerderung.js | 0 .../Details/Mobility/List/Purpose.js | 284 ++++++++++++++++++ .../Details/Mobility/Mobility.js | 240 ++++++++++----- 7 files changed, 728 insertions(+), 72 deletions(-) create mode 100644 public/js/components/Stv/Studentenverwaltung/Details/Mobility/List/Foerderung.js create mode 100644 public/js/components/Stv/Studentenverwaltung/Details/Mobility/List/Purpose.js diff --git a/application/controllers/api/frontend/v1/stv/Mobility.php b/application/controllers/api/frontend/v1/stv/Mobility.php index fa1a62e77..343bc4b9e 100644 --- a/application/controllers/api/frontend/v1/stv/Mobility.php +++ b/application/controllers/api/frontend/v1/stv/Mobility.php @@ -14,7 +14,15 @@ class Mobility extends FHCAPI_Controller 'insertMobility' => ['admin:rw', 'assistenz:rw'], 'updateMobility' => ['admin:rw', 'assistenz:rw'], 'deleteMobility' => ['admin:rw', 'assistenz:rw'], - 'getProgramsMobility' => ['admin:rw', 'assistenz:rw'], + 'getProgramsMobility' => ['admin:r', 'assistenz:r'], + 'getLVList' => ['admin:r', 'assistenz:r'], + 'getPurposes' => ['admin:r', 'assistenz:r'], + 'getListPurposes' => ['admin:r', 'assistenz:r'], + 'getListSupports' => ['admin:r', 'assistenz:r'], + 'deleteMobilityPurpose' => ['admin:r', 'assistenz:r'], + 'addMobilityPurpose' => ['admin:r', 'assistenz:r'], + + ]); // Load Libraries @@ -56,4 +64,208 @@ class Mobility extends FHCAPI_Controller $this->terminateWithSuccess($data); } + public function insertMobility() + { + //TODO(Manu) Validations + //Pflicht gast und herkunftsland + $authUID = getAuthUID(); + + $formData = $this->input->post('formData'); + + $von = (isset($formData['von']) && !empty($formData['von'])) ? $formData['von'] : null; +$nation_code = (isset($formData['nation_code']) && !empty($formData['nation_code'])) ? $formData['nation_code'] : 'A'; +$mobilitaetsprogramm_code = (isset($formData['mobilitaetsprogramm_code']) && !empty($formData['mobilitaetsprogramm_code'])) ? $formData['mobilitaetsprogramm_code'] : null; +$herkunftsland_code = (isset($formData['herkunftsland_code']) && !empty($formData['herkunftsland_code'])) ? $formData['herkunftsland_code'] : 'A'; +$ort = (isset($formData['ort']) && !empty($formData['ort'])) ? $formData['ort'] : null; +$universitaet = (isset($formData['universitaet']) && !empty($formData['universitaet'])) ? $formData['universitaet'] : null; +$ects_erworben = (isset($formData['ects_erworben']) && !empty($formData['ects_erworben'])) ? $formData['ects_erworben'] : null; +$ects_angerechnet = (isset($formData['ects_angerechnet']) && !empty($formData['ects_angerechnet'])) ? $formData['ects_angerechnet'] : null; +$localPurposes = (isset($formData['localPurposes']) && !empty($formData['localPurposes'])) ? $formData['localPurposes'] : null; + + + //strange fields + /* 'zweck_code' => $this->input->post('zweck_code'), + 'aufenthalt_foerderung' => $this->input->post('aufenthalt_foerderung'), + 'lehreinheit_id' => $this->input->post('lehreinheit_id'), + 'lehrveranstaltung_id' => $this->input->post('lehrveranstaltung_id'),*/ + + + $result = $this->BisioModel->insert([ + 'student_uid' => $this->input->post('uid'), + 'von' => $von, + 'bis' => $formData['bis'], + 'mobilitaetsprogramm_code' => $mobilitaetsprogramm_code, + 'nation_code' => $nation_code, + 'herkunftsland_code' => $herkunftsland_code, + 'ort' => $ort, + 'universitaet' => $universitaet, + 'ects_erworben' => $ects_erworben, + 'ects_angerechnet' => $ects_angerechnet, + 'insertamum' => date('c'), + 'insertvon' => $authUID, + ]); + + $bisio_id = $this->getDataOrTerminateWithError($result); + + //check if localData (purposes) + if(count($localPurposes) > 0){ + + // $this->terminateWithError('Speichern von Zweck notwendig mit neuer bisio_id ' . $bisio_id, self::ERROR_TYPE_GENERAL); + + foreach ($localPurposes as $zweck){ + $zweck = (int) $zweck; + $this->addMobilityPurpose($bisio_id, $zweck); + } + } + + $this->terminateWithSuccess(); + } + + public function loadMobility($bisio_id) + { + $result = $this->BisioModel->load($bisio_id); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess(current($data)); + } + + public function updateMobility() + { + $authUID = getAuthUID(); + $formData = $this->input->post('formData'); + + $result = $this->BisioModel->update( + [ + 'bisio_id' => $formData['bisio_id'] + ], + [ + 'student_uid' => $this->input->post('uid'), + 'von' => $formData['von'], + 'bis' => $formData['bis'], + 'mobilitaetsprogramm_code' => $formData['mobilitaetsprogramm_code'], + 'nation_code' => $formData['nation_code'], + 'herkunftsland_code' => $formData['herkunftsland_code'], + 'ort' => $formData['ort'], + 'universitaet' => $formData['universitaet'], + 'ects_erworben' => $formData['ects_erworben'], + 'ects_angerechnet' => $formData['ects_angerechnet'], + 'updateamum' => date('c'), + 'updatevon' => $authUID, + ] + ); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess(current($data)); + } + + public function deleteMobility($bisio_id) + { + // $this->terminateWithError('test ' . $bisio_id, self::ERROR_TYPE_GENERAL); + + $result = $this->BisioModel->delete( + array('bisio_id' => $bisio_id) + ); + + //TODO(Manu) foreign key restraint + //nämlich Extension mo + //fk_mobisioidzuordnung_prestudent_id" on table "tbl_mo_bisioidzuordnung" + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + + public function getLVList($studiengang_kz) + { + $this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel'); + + $result = $this->LehrveranstaltungModel->getLvsByStudiengangkz($studiengang_kz); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + + public function getPurposes($bisio_id) + { + $bisio_id = (int) $bisio_id; + + $this->load->model('codex/Bisiozweck_model', 'BisiozweckModel'); + + $this->BisiozweckModel->addSelect("*"); + $this->BisiozweckModel->addJoin('bis.tbl_zweck zw', 'ON (zw.zweck_code = bis.tbl_bisio_zweck.zweck_code)'); + + $result = $this->BisiozweckModel->loadWhere( + array('bisio_id' => $bisio_id) + ); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + + public function getListPurposes() + { + $this->load->model('codex/Zweck_model', 'ZweckModel'); + + $result = $this->ZweckModel->load(); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + + public function getListSupports() + { + $this->load->model('codex/Aufenthaltfoerderung_model', 'AufenthaltfoerderungModel'); + + $result = $this->AufenthaltfoerderungModel->load(); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + + public function addMobilityPurpose($bisio_id, $local_purpose = null) + { + $zweck_code = $this->input->post('zweck_code'); + + if($local_purpose){ + $zweck_code = $local_purpose; + } + + $this->load->model('codex/Bisiozweck_model', 'BisiozweckModel'); + + $result = $this->BisiozweckModel->insert( + array( + 'bisio_id' => $bisio_id, + 'zweck_code' => $zweck_code + ) + ); + + $data = $this->getDataOrTerminateWithError($result); + + return $this->terminateWithSuccess(current($data)); + } + + public function deleteMobilityPurpose($bisio_id) + { + $zweck_code = $this->input->post('zweck_code'); + + $this->load->model('codex/Bisiozweck_model', 'BisiozweckModel'); + + + $result = $this->BisiozweckModel->delete( + array( + 'bisio_id' => $bisio_id, + 'zweck_code' => $zweck_code + ) + ); + + $data = $this->getDataOrTerminateWithError($result); + + return $this->terminateWithSuccess(current($data)); + } } diff --git a/application/models/education/Lehrveranstaltung_model.php b/application/models/education/Lehrveranstaltung_model.php index 3f02f5ce7..694ec8ca6 100644 --- a/application/models/education/Lehrveranstaltung_model.php +++ b/application/models/education/Lehrveranstaltung_model.php @@ -1012,4 +1012,27 @@ class Lehrveranstaltung_model extends DB_Model $res = $this->execReadOnlyQuery($query); return $res; } + + /** + * Gets lehrveranstaltungen of a studiengang + * @param integer $studiengang_kz + * @return array|null + */ + public function getLvsByStudiengangkz($studiengang_kz) + { + $params = array($studiengang_kz); + + $qry = "SELECT + * + FROM + lehre.tbl_lehrveranstaltung + WHERE lehrveranstaltung_id IN + (SELECT lehrveranstaltung_id + FROM campus.vw_student_lehrveranstaltung + WHERE studiengang_kz = ?"; + + $qry .= ") ORDER BY semester, bezeichnung"; + + return $this->execQuery($qry, $params); + } } diff --git a/public/js/api/stv/mobility.js b/public/js/api/stv/mobility.js index d749f58f3..657256b30 100644 --- a/public/js/api/stv/mobility.js +++ b/public/js/api/stv/mobility.js @@ -5,4 +5,38 @@ export default { getProgramsMobility(){ return this.$fhcApi.get('api/frontend/v1/stv/mobility/getProgramsMobility/'); }, + addNewMobility(data){ + //TODO(Manu) formvalidation + return this.$fhcApi.post('api/frontend/v1/stv/mobility/insertMobility/', data); + }, + loadMobility(bisio_id){ + return this.$fhcApi.get('api/frontend/v1/stv/mobility/loadMobility/' + bisio_id); + }, + updateMobility(data){ + return this.$fhcApi.post('api/frontend/v1/stv/mobility/updateMobility/', data); + }, + deleteMobility(bisio_id){ + return this.$fhcApi.post('api/frontend/v1/stv/mobility/deleteMobility/' + bisio_id); + }, + getLVList(studiengang_kz){ + return this.$fhcApi.get('api/frontend/v1/stv/mobility/getLVList/' + studiengang_kz); + }, + getPurposes(url, config, params){ + console.log("in getPurposes"); + //console.log(params); + return this.$fhcApi.get('api/frontend/v1/stv/mobility/getPurposes/' + params.id); + }, + getListPurposes() { + return this.$fhcApi.get('api/frontend/v1/stv/mobility/getListPurposes/'); + }, + getListSupports() { + return this.$fhcApi.get('api/frontend/v1/stv/mobility/getListSupports/'); + }, + deleteMobilityPurpose(params) { + return this.$fhcApi.post('api/frontend/v1/stv/mobility/deleteMobilityPurpose/' + params.bisio_id, params); + }, + addMobilityPurpose(params) { + return this.$fhcApi.post('api/frontend/v1/stv/mobility/addMobilityPurpose/' + params.bisio_id, params); + }, + } \ No newline at end of file diff --git a/public/js/components/Stv/Studentenverwaltung/Details/Mobility.js b/public/js/components/Stv/Studentenverwaltung/Details/Mobility.js index df6a5612f..d4398bf82 100644 --- a/public/js/components/Stv/Studentenverwaltung/Details/Mobility.js +++ b/public/js/components/Stv/Studentenverwaltung/Details/Mobility.js @@ -16,10 +16,7 @@ export default { return {} }, template: ` -
- -

TEST Mob

- +
` }; \ No newline at end of file diff --git a/public/js/components/Stv/Studentenverwaltung/Details/Mobility/List/Foerderung.js b/public/js/components/Stv/Studentenverwaltung/Details/Mobility/List/Foerderung.js new file mode 100644 index 000000000..e69de29bb diff --git a/public/js/components/Stv/Studentenverwaltung/Details/Mobility/List/Purpose.js b/public/js/components/Stv/Studentenverwaltung/Details/Mobility/List/Purpose.js new file mode 100644 index 000000000..20751fdb0 --- /dev/null +++ b/public/js/components/Stv/Studentenverwaltung/Details/Mobility/List/Purpose.js @@ -0,0 +1,284 @@ +import {CoreFilterCmpt} from "../../../../../filter/Filter.js"; + +import BsModal from "../../../../../Bootstrap/Modal.js"; +import CoreForm from '../../../../../Form/Form.js'; +import FormInput from '../../../../../Form/Input.js'; + +export default { + components: { + CoreFilterCmpt, + BsModal, + CoreForm, + FormInput + }, + props: { + bisio_id: { + type: [Number], + required: true + }, + listPurposes: { + type: Array, + required: true + }, + formDataParent: { + type: Object, + required: true + } + }, + data() { + return { + tabulatorOptions: { + ajaxURL: 'dummy', + ajaxRequestFunc: this.$fhcApi.factory.stv.mobility.getPurposes, + ajaxParams: () => { + return { + id: this.bisio_id + }; + }, + ajaxResponse: (url, params, response) => response.data, + columns: [ + {title: "Zweck_code", field: "zweck_code", visible: false}, + {title: "Kurzbz", field: "kurzbz", visible: false}, + {title: "Bezeichnung", field: "bezeichnung"}, + { + title: 'Aktionen', field: 'actions', + minWidth: 150, + formatter: (cell, formatterParams, onRendered) => { + + let 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 = ''; + button.title = this.$p.t('global', 'loeschen'); + button.addEventListener( + 'click', + () => + this.actionDeletePurpose(cell.getData().zweck_code) + ); + container.append(button); + + return container; + }, + frozen: true + }, + ], + layout: 'fitColumns', + layoutColumnsOnNewData: false, + height: '300', + selectableRangeMode: 'click', + selectable: true, + persistenceID: 'core-mobility-purpose' + }, + tabulatorEvents: [ + { + 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('global', 'status') + }); + cm.getColumnByField('format_datum').component.updateDefinition({ + title: this.$p.t('global', 'datum') + }); + cm.getColumnByField('mitarbeiter_uid').component.updateDefinition({ + title: this.$p.t('person', 'uid') + }); + cm.getColumnByField('vertrag_id').component.updateDefinition({ + title: this.$p.t('ui', 'vertrag_id') + }); + cm.getColumnByField('vertragsstatus_kurzbz').component.updateDefinition({ + title: this.$p.t('vertrag', 'vertragStatus') + }); + cm.getColumnByField('actions').component.updateDefinition({ + title: this.$p.t('global', 'aktionen') + }); + cm.getColumnByField('updatevon').component.updateDefinition({ + title: this.$p.t('global', 'updatevon') + }); + cm.getColumnByField('format_updateamum').component.updateDefinition({ + title: this.$p.t('global', 'updateamum') + }); + cm.getColumnByField('insertvon').component.updateDefinition({ + title: this.$p.t('global', 'insertvon') + }); + cm.getColumnByField('format_insertamum').component.updateDefinition({ + title: this.$p.t('global', 'insertamum') + }); */ + } + } + ], + clickedRows: [], + formData: {}, + localData: [] + } + }, + watch: { +/* bisio_id(newVal) { + if (!newVal) { + console.log("activate local Data"); + // Lokale Daten direkt in die Tabelle laden + this.$refs.table.instance.setData(this.localData); + } else { + console.log("data with api" + newVal); + let params = { + bisio_id: newVal, + }; + // Daten aus der API abrufen und in die Tabelle laden + this.$fhcApi.factory.stv.mobility.getPurposes(params) + .then(result => { + this.$refs.table.instance.setData(result.data); + }) + .catch(this.$fhcAlert.handleSystemError); + } + },*/ + + +/* bisio_id(newVal) { + if (!newVal) { + console.log("activate local Data"); + this.tabulatorOptions.ajaxRequestFunc = null; + this.tabulatorOptions.data = this.localData; + } else { + console.log("data with api" + newVal); + let params = { + bisio_id : newVal, + }; + //this.tabulatorOptions.ajaxRequestFunc = this.$fhcApi.factory.stv.mobility.getPurposes, newVal; + this.$fhcApi.factory.stv.mobility.getPurposes(params) + .then(result => { + this.tabulatorOptions = result.data; + }) + .catch(this.$fhcAlert.handleSystemError); + } + },*/ + bisio_id() { + if (this.$refs.table) { + this.$refs.table.reloadTable(); + } + }, + /* bisio_id() { + //this.reloadTable(); + //this.$refs.table.tabulator.setData('api/frontend/v1/vertraege/vertraege/getStatiOfContract/' + this.vertrag_id); + },*/ + formDataParent: { + handler(newVal, oldVal) + { + this.formData = this.formDataParent; + } + , + deep: true + } + }, + methods: { + actionNewPurpose() { + this.resetModal(); + this.$refs.mobilityPurpose.show(); + }, + actionDeletePurpose(zweck_code) { + this.$emit('deleteMobilityPurpose', { + bisio_id: this.bisio_id, + zweck_code: zweck_code + }); + }, + handleSubmitAction() { + if (this.bisio_id) { + + this.$emit('setMobilityPurpose', { + zweck_code: this.formData.zweck_code, + bisio_id: this.bisio_id + }); + } else { + //not working + // this.$refs.table.addRow({id: 123, zweck_code: this.formData.zweck_code}); + //this.formData.zweck_code + this.localData.push(this.formData.zweck_code); //not working: this.$refs.table.addRow is not a function + console.log("action without Bisio_id " + this.formData.zweck_code); + this.$emit('setMobilityPurposeToNewMobility', { + zweck_code: this.formData.zweck_code, + }); + } + this.closeModal(); + }, + + closeModal(){ + this.$refs.mobilityPurpose.hide(); + this.$emit('close-modal'); + }, + openModal(){ + this.$refs.mobilityPurpose.show(); + this.$emit('open-modal'); + }, + reload() { + this.$refs.table.reloadTable(); + this.$emit('reload'); + }, + resetModal(){ + this.formData = {}; + this.formData.vertragsstatus_kurzbz = null; + this.formData.datum = new Date(); + this.statusNew = true; + } + }, + template: ` +
+
+ + + + bisio: {{bisio_id}} + + + + +
+ + + + +
+ + + + +
+
+ + + +
+
+ +
` + } \ No newline at end of file diff --git a/public/js/components/Stv/Studentenverwaltung/Details/Mobility/Mobility.js b/public/js/components/Stv/Studentenverwaltung/Details/Mobility/Mobility.js index a70897e32..92cbbda08 100644 --- a/public/js/components/Stv/Studentenverwaltung/Details/Mobility/Mobility.js +++ b/public/js/components/Stv/Studentenverwaltung/Details/Mobility/Mobility.js @@ -2,13 +2,17 @@ import {CoreFilterCmpt} from "../../../../filter/Filter.js"; import BsModal from "../../../../Bootstrap/Modal.js"; import FormForm from '../../../../Form/Form.js'; import FormInput from '../../../../Form/Input.js'; +import MobilityPurpose from './List/Purpose.js'; +//import LocalPurpose from './List/PurposesLocal.js'; export default { components: { CoreFilterCmpt, BsModal, FormForm, - FormInput + FormInput, + MobilityPurpose, +// LocalPurpose }, inject: { $reloadList: { @@ -51,7 +55,7 @@ export default { button.innerHTML = ''; button.title = this.$p.t('ui', 'bearbeiten'); button.addEventListener('click', (event) => - this.actionEditMobility(cell.getData().mobility_id) + this.actionEditMobility(cell.getData().bisio_id) ); container.append(button); @@ -60,7 +64,7 @@ export default { button.innerHTML = ''; button.title = this.$p.t('ui', 'loeschen'); button.addEventListener('click', () => - this.actionDeleteMobility(cell.getData().mobility_id) + this.actionDeleteMobility(cell.getData().bisio_id) ); container.append(button); @@ -73,7 +77,7 @@ export default { layoutColumnsOnNewData: false, height: 'auto', selectable: true, - index: 'mobility_id', + index: 'bisio_id', persistenceID: 'stv-details-table_mobiliy' }, tabulatorEvents: [ @@ -121,8 +125,8 @@ export default { // cm.getColumnByField('pruefungstyp_kurzbz').component.updateDefinition({ // title: this.$p.t('global', 'typ') // }); - // cm.getColumnByField('mobility_id').component.updateDefinition({ - // title: this.$p.t('ui', 'mobility_id') + // cm.getColumnByField('bisio_id').component.updateDefinition({ + // title: this.$p.t('ui', 'bisio_id') // }); /* cm.getColumnByField('actions').component.updateDefinition({ @@ -135,12 +139,17 @@ export default { formData: { von: new Date(), bis: new Date(), - mobilitaetsprogramm: 7, + mobilitaetsprogramm_code: 7, gastnation: 'A', herkunftsland: 'A', + bisio_id: null, + localPurposes: [] }, statusNew: true, programsMobility: [], + listLvs: [], + listPurposes: [], + listSupports: [], } }, watch: { @@ -151,38 +160,39 @@ export default { } }, methods: { - getStudiengangsTyp(){ - this.stgTyp = ''; - this.$fhcApi.factory.stv.mobility.getTypStudiengang(this.stg_kz) - .then(result => this.stgTyp = result.data) - .catch(this.$fhcAlert.handleSystemError); - }, actionNewMobility() { this.resetForm(); this.statusNew = true; //this.setDefaultFormData(); }, - actionEditMobility(mobility_id) { + actionEditMobility(bisio_id) { this.resetForm(); + // this.formData.bisio_id = bisio_id; this.statusNew = false; - this.loadMobility(mobility_id); + this.loadMobility(bisio_id); }, - actionDeleteMobility(mobility_id) { + actionDeleteMobility(bisio_id) { this.$fhcAlert .confirmDelete() .then(result => result - ? mobility_id + ? bisio_id : Promise.reject({handled: true})) - .then(this.deletemobility) + .then(this.deleteMobility(bisio_id)) .catch(this.$fhcAlert.handleSystemError); }, addNewMobility() { + //TODO(Manu) um localPurposes erweitern +/* console.log(this.formData.localPurposes[0]); + if(this.formData.localPurposes.length){ + this.$fhcAlert.alertSuccess('nach speichern purposes mit neuer bisio_id zusammenführen'); + return; + }*/ const dataToSend = { uid: this.student.uid, formData: this.formData }; - - return this.$refs.formFinalExam.factory.stv.mobility.addNewmobility(dataToSend) + return this.$fhcApi.factory.stv.mobility.addNewMobility(dataToSend) + //return this.$refs.formMobility.factory.stv.mobility.addNewMobility(dataToSend) .then(response => { this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successSave')); this.resetForm(); @@ -195,22 +205,22 @@ export default { reload() { this.$refs.table.reloadTable(); }, - loadMobility(mobility_id) { - return this.$fhcApi.factory.stv.mobility.loadmobility(mobility_id) + loadMobility(bisio_id) { + return this.$fhcApi.factory.stv.mobility.loadMobility(bisio_id) .then(result => { + this.formData = result.data; - //TODO(Manu) check if cisRoot is okay - this.formData.link = this.cisRoot + 'index.ci.php/lehre/Pruefungsprotokoll/showProtokoll?mobility_id=' + this.formData.mobility_id + '&fhc_controller_id=67481e5ed5490'; - return result; + console.log("after"); + //return result; }) .catch(this.$fhcAlert.handleSystemError); }, - updateMobility(mobility_id) { + updateMobility(bisio_id) { const dataToSend = { - id: mobility_id, - formData: this.formData + formData: this.formData, + uid: this.student.uid, }; - return this.$refs.formFinalExam.factory.stv.mobility.updatemobility(dataToSend) + return this.$fhcApi.factory.stv.mobility.updateMobility(dataToSend) .then(response => { this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successSave')); this.resetForm(); @@ -220,8 +230,9 @@ export default { this.reload(); }); }, - deleteMobility(mobility_id) { - return this.$fhcApi.factory.stv.mobility.deletemobility(mobility_id) + deleteMobility(bisio_id) { + //TODO(Manu) prompt wird nicht abgewartet! + return this.$fhcApi.factory.stv.mobility.deleteMobility(bisio_id) .then(response => { this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successDelete')); }) @@ -231,8 +242,73 @@ export default { }); }, resetForm() { - this.formData = null; + this.formData = {}; + this.formData.von = new Date(); + this.formData.bis = new Date(); + this.formData.mobilitaetsprogramm_code = 7; + this.formData.gastnation = 'A'; + this.formData.herkunftsland = 'A'; + this.formData.bisio_id = null; + this.formData.localPurposes = []; }, + // --- methods purposes --- + addMobilityPurpose({zweck_code, bisio_id}){ + let params = { + bisio_id : bisio_id, + zweck_code: zweck_code + }; + return this.$fhcApi.factory.stv.mobility.addMobilityPurpose(params) + .then(response => { + this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successSave')); + + this.$refs.purposes.reload(); + }) + .catch(this.$fhcAlert.handleSystemError); + }, + deleteMobilityPurpose({zweck_code, bisio_id}){ + let params = { + bisio_id : bisio_id, + zweck_code: zweck_code + }; + return this.$fhcApi.factory.stv.mobility.deleteMobilityPurpose(params) + .then(response => { + this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successDelete')); + + this.$refs.purposes.reload(); + }) + .catch(this.$fhcAlert.handleSystemError); + }, + addPurposeToMobility({zweck_code}){ + + console.log("localPurposes befüllen: " , zweck_code); + this.formData.localPurposes.push(zweck_code); +/* this.formData.firstPurpose = zweck_code; + this.$refs.purposes.closeModal();*/ + }, +/* addPurposeToMobility(purpose) { + this.localPurposes.push(purpose); + },*/ + //lokale Variante +/* async saveAllChanges() { + try { + const savedData = await this.$fhcApi.factory.stv.mobility.savePurposes({ + id: this.bisio_id, + purposes: this.localData.filter(item => !item.zweck_code.startsWith('temp_')) // Nur echte IDs senden + }); + + // Synchronisiere temporäre IDs mit echten Daten + savedData.forEach((item) => { + const localItem = this.localData.find(local => local.zweck_code === item.tempId); + if (localItem) { + localItem.zweck_code = item.zweck_code; // Aktualisiere die echte ID + } + }); + + this.updateTabulatorData(); + } catch (error) { + console.error('Fehler beim Speichern der Änderungen:', error); + } + },*/ }, created() { this.$fhcApi.factory.stv.mobility.getProgramsMobility() @@ -240,12 +316,36 @@ export default { this.programsMobility = result.data; }) .catch(this.$fhcAlert.handleSystemError); + this.$fhcApi.factory.stv.mobility.getLVList(this.student.studiengang_kz) + .then(result => { + this.listLvs = result.data; + }) + .catch(this.$fhcAlert.handleSystemError); + this.$fhcApi.factory.stv.mobility.getListPurposes() + .then(result => { + this.listPurposes = result.data; + }) + .catch(this.$fhcAlert.handleSystemError); + this.$fhcApi.factory.stv.mobility.getListSupports() + .then(result => { + this.listSupports = result.data; + }) + .catch(this.$fhcAlert.handleSystemError); }, template: `

In/out

+ +
{{formData}} + + + + @@ -281,6 +381,7 @@ export default { :teleport="true" > + - + {{lv.bezeichnung}} - Semester {{lv.semester}} +
@@ -333,8 +434,8 @@ export default { container-class="col-6 stv-details-mobility-mobilitaetsprogramm" :label="$p.t('mobility', 'mobilitaetsprogramm')" type="select" - v-model="formData.mobilitaetsprogramm" - name="mobilitaetsprogramm" + v-model="formData.mobilitaetsprogramm_code" + name="mobilitaetsprogramm_code" >
@@ -366,7 +461,7 @@ export default { container-class="col-6 stv-details-mobility-gastnation" :label="$p.t('mobility', 'gastnation')" type="select" - v-model="formData.gastnation" + v-model="formData.nation_code" name="gastnation" >
From d96cc5672e55be87c8a91980140f57c849dc58bb Mon Sep 17 00:00:00 2001 From: ma0068 Date: Tue, 28 Jan 2025 09:39:24 +0100 Subject: [PATCH 6/8] child components Zweck/Purpose and Aufenthaltsfoerderung/Support --- .../api/frontend/v1/stv/Mobility.php | 90 ++++++- public/js/api/stv/mobility.js | 12 +- .../Details/Mobility/List/Foerderung.js | 0 .../Details/Mobility/List/Purpose.js | 174 +++++-------- .../Details/Mobility/List/Support.js | 232 ++++++++++++++++++ .../Details/Mobility/Mobility.js | 203 ++++++--------- system/phrasesupdate.php | 100 ++++++++ 7 files changed, 563 insertions(+), 248 deletions(-) delete mode 100644 public/js/components/Stv/Studentenverwaltung/Details/Mobility/List/Foerderung.js create mode 100644 public/js/components/Stv/Studentenverwaltung/Details/Mobility/List/Support.js diff --git a/application/controllers/api/frontend/v1/stv/Mobility.php b/application/controllers/api/frontend/v1/stv/Mobility.php index 343bc4b9e..be8acfdba 100644 --- a/application/controllers/api/frontend/v1/stv/Mobility.php +++ b/application/controllers/api/frontend/v1/stv/Mobility.php @@ -17,12 +17,13 @@ class Mobility extends FHCAPI_Controller 'getProgramsMobility' => ['admin:r', 'assistenz:r'], 'getLVList' => ['admin:r', 'assistenz:r'], 'getPurposes' => ['admin:r', 'assistenz:r'], + 'getSupports' => ['admin:r', 'assistenz:r'], 'getListPurposes' => ['admin:r', 'assistenz:r'], 'getListSupports' => ['admin:r', 'assistenz:r'], 'deleteMobilityPurpose' => ['admin:r', 'assistenz:r'], 'addMobilityPurpose' => ['admin:r', 'assistenz:r'], - - + 'deleteMobilitySupport' => ['admin:r', 'assistenz:r'], + 'addMobilitySupport' => ['admin:r', 'assistenz:r'], ]); // Load Libraries @@ -73,14 +74,15 @@ class Mobility extends FHCAPI_Controller $formData = $this->input->post('formData'); $von = (isset($formData['von']) && !empty($formData['von'])) ? $formData['von'] : null; -$nation_code = (isset($formData['nation_code']) && !empty($formData['nation_code'])) ? $formData['nation_code'] : 'A'; -$mobilitaetsprogramm_code = (isset($formData['mobilitaetsprogramm_code']) && !empty($formData['mobilitaetsprogramm_code'])) ? $formData['mobilitaetsprogramm_code'] : null; -$herkunftsland_code = (isset($formData['herkunftsland_code']) && !empty($formData['herkunftsland_code'])) ? $formData['herkunftsland_code'] : 'A'; -$ort = (isset($formData['ort']) && !empty($formData['ort'])) ? $formData['ort'] : null; -$universitaet = (isset($formData['universitaet']) && !empty($formData['universitaet'])) ? $formData['universitaet'] : null; -$ects_erworben = (isset($formData['ects_erworben']) && !empty($formData['ects_erworben'])) ? $formData['ects_erworben'] : null; -$ects_angerechnet = (isset($formData['ects_angerechnet']) && !empty($formData['ects_angerechnet'])) ? $formData['ects_angerechnet'] : null; -$localPurposes = (isset($formData['localPurposes']) && !empty($formData['localPurposes'])) ? $formData['localPurposes'] : null; + $nation_code = (isset($formData['nation_code']) && !empty($formData['nation_code'])) ? $formData['nation_code'] : 'A'; + $mobilitaetsprogramm_code = (isset($formData['mobilitaetsprogramm_code']) && !empty($formData['mobilitaetsprogramm_code'])) ? $formData['mobilitaetsprogramm_code'] : null; + $herkunftsland_code = (isset($formData['herkunftsland_code']) && !empty($formData['herkunftsland_code'])) ? $formData['herkunftsland_code'] : 'A'; + $ort = (isset($formData['ort']) && !empty($formData['ort'])) ? $formData['ort'] : null; + $universitaet = (isset($formData['universitaet']) && !empty($formData['universitaet'])) ? $formData['universitaet'] : null; + $ects_erworben = (isset($formData['ects_erworben']) && !empty($formData['ects_erworben'])) ? $formData['ects_erworben'] : null; + $ects_angerechnet = (isset($formData['ects_angerechnet']) && !empty($formData['ects_angerechnet'])) ? $formData['ects_angerechnet'] : null; + $localPurposes = (isset($formData['localPurposes']) && !empty($formData['localPurposes'])) ? $formData['localPurposes'] : null; + $localSupports = (isset($formData['localSupports']) && !empty($formData['localSupports'])) ? $formData['localSupports'] : null; //strange fields @@ -110,14 +112,19 @@ $localPurposes = (isset($formData['localPurposes']) && !empty($formData['localPu //check if localData (purposes) if(count($localPurposes) > 0){ - // $this->terminateWithError('Speichern von Zweck notwendig mit neuer bisio_id ' . $bisio_id, self::ERROR_TYPE_GENERAL); - foreach ($localPurposes as $zweck){ $zweck = (int) $zweck; $this->addMobilityPurpose($bisio_id, $zweck); } } + //check if localData (supports) + if(count($localSupports) > 0){ + foreach ($localSupports as $support){ + $this->addMobilitySupport($bisio_id, $support); + } + } + $this->terminateWithSuccess(); } @@ -169,7 +176,7 @@ $localPurposes = (isset($formData['localPurposes']) && !empty($formData['localPu ); //TODO(Manu) foreign key restraint - //nämlich Extension mo + //check Extension mo //fk_mobisioidzuordnung_prestudent_id" on table "tbl_mo_bisioidzuordnung" $data = $this->getDataOrTerminateWithError($result); @@ -206,6 +213,24 @@ $localPurposes = (isset($formData['localPurposes']) && !empty($formData['localPu $this->terminateWithSuccess($data); } + public function getSupports($bisio_id) + { + $bisio_id = (int) $bisio_id; + + $this->load->model('codex/Bisioaufenthaltfoerderung_model', 'BisioaufenthaltfoerderungModel'); + + $this->BisioaufenthaltfoerderungModel->addSelect("*"); + $this->BisioaufenthaltfoerderungModel->addJoin('bis.tbl_aufenthaltfoerderung af', 'ON (af.aufenthaltfoerderung_code = bis.tbl_bisio_aufenthaltfoerderung.aufenthaltfoerderung_code)'); + + $result = $this->BisioaufenthaltfoerderungModel->loadWhere( + array('bisio_id' => $bisio_id) + ); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + public function getListPurposes() { $this->load->model('codex/Zweck_model', 'ZweckModel'); @@ -268,4 +293,43 @@ $localPurposes = (isset($formData['localPurposes']) && !empty($formData['localPu return $this->terminateWithSuccess(current($data)); } + + public function addMobilitySupport($bisio_id, $local_support = null) + { + $aufenthaltfoerderung_code = $this->input->post('aufenthaltfoerderung_code'); + + if($local_support){ + $aufenthaltfoerderung_code = $local_support; + } + + $this->load->model('codex/Bisioaufenthaltfoerderung_model', 'BisioaufenthaltfoerderungModel'); + + $result = $this->BisioaufenthaltfoerderungModel->insert( + array( + 'bisio_id' => $bisio_id, + 'aufenthaltfoerderung_code' => $aufenthaltfoerderung_code + ) + ); + + $data = $this->getDataOrTerminateWithError($result); + + return $this->terminateWithSuccess(current($data)); + } + + public function deleteMobilitySupport($bisio_id) + { + $aufenthaltfoerderung_code = $this->input->post('aufenthaltfoerderung_code'); + + $this->load->model('codex/Bisioaufenthaltfoerderung_model', 'BisioaufenthaltfoerderungModel'); + + $result = $this->BisioaufenthaltfoerderungModel->delete( + array( + 'bisio_id' => $bisio_id, + 'aufenthaltfoerderung_code' => $aufenthaltfoerderung_code + ) + ); + $data = $this->getDataOrTerminateWithError($result); + + return $this->terminateWithSuccess(current($data)); + } } diff --git a/public/js/api/stv/mobility.js b/public/js/api/stv/mobility.js index 657256b30..1139aa275 100644 --- a/public/js/api/stv/mobility.js +++ b/public/js/api/stv/mobility.js @@ -6,7 +6,6 @@ export default { return this.$fhcApi.get('api/frontend/v1/stv/mobility/getProgramsMobility/'); }, addNewMobility(data){ - //TODO(Manu) formvalidation return this.$fhcApi.post('api/frontend/v1/stv/mobility/insertMobility/', data); }, loadMobility(bisio_id){ @@ -22,10 +21,11 @@ export default { return this.$fhcApi.get('api/frontend/v1/stv/mobility/getLVList/' + studiengang_kz); }, getPurposes(url, config, params){ - console.log("in getPurposes"); - //console.log(params); return this.$fhcApi.get('api/frontend/v1/stv/mobility/getPurposes/' + params.id); }, + getSupports(url, config, params){ + return this.$fhcApi.get('api/frontend/v1/stv/mobility/getSupports/' + params.id); + }, getListPurposes() { return this.$fhcApi.get('api/frontend/v1/stv/mobility/getListPurposes/'); }, @@ -38,5 +38,11 @@ export default { addMobilityPurpose(params) { return this.$fhcApi.post('api/frontend/v1/stv/mobility/addMobilityPurpose/' + params.bisio_id, params); }, + deleteMobilitySupport(params) { + return this.$fhcApi.post('api/frontend/v1/stv/mobility/deleteMobilitySupport/' + params.bisio_id, params); + }, + addMobilitySupport(params) { + return this.$fhcApi.post('api/frontend/v1/stv/mobility/addMobilitySupport/' + params.bisio_id, params); + }, } \ No newline at end of file diff --git a/public/js/components/Stv/Studentenverwaltung/Details/Mobility/List/Foerderung.js b/public/js/components/Stv/Studentenverwaltung/Details/Mobility/List/Foerderung.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/public/js/components/Stv/Studentenverwaltung/Details/Mobility/List/Purpose.js b/public/js/components/Stv/Studentenverwaltung/Details/Mobility/List/Purpose.js index 20751fdb0..b1a80d7b2 100644 --- a/public/js/components/Stv/Studentenverwaltung/Details/Mobility/List/Purpose.js +++ b/public/js/components/Stv/Studentenverwaltung/Details/Mobility/List/Purpose.js @@ -20,29 +20,46 @@ export default { type: Array, required: true }, - formDataParent: { - type: Object, - required: true - } }, data() { return { tabulatorOptions: { ajaxURL: 'dummy', - ajaxRequestFunc: this.$fhcApi.factory.stv.mobility.getPurposes, + ajaxRequestFunc: (url, config, params) => { + if (this.bisio_id) { + //fake params for getting api call with tabulator to run + const config = { + method: "get", + }; + const params = { + id: this.bisio_id, + }; + return this.$fhcApi.factory.stv.mobility.getPurposes('dummy', config, params) + } + else + { + // use local data + return new Promise((resolve) => { + const localData = this.localData; + resolve(localData); + }); + } + }, ajaxParams: () => { return { - id: this.bisio_id + id: this.bisio_id || "local" }; }, - ajaxResponse: (url, params, response) => response.data, + ajaxResponse: (url, params, response) => response.data || this.localData, + + columns: [ {title: "Zweck_code", field: "zweck_code", visible: false}, {title: "Kurzbz", field: "kurzbz", visible: false}, {title: "Bezeichnung", field: "bezeichnung"}, { title: 'Aktionen', field: 'actions', - minWidth: 150, + minWidth: 50, formatter: (cell, formatterParams, onRendered) => { let container = document.createElement('div'); @@ -66,7 +83,7 @@ export default { ], layout: 'fitColumns', layoutColumnsOnNewData: false, - height: '300', + height: '200', selectableRangeMode: 'click', selectable: true, persistenceID: 'core-mobility-purpose' @@ -76,104 +93,35 @@ export default { event: 'tableBuilt', handler: async() => { - await this.$p.loadCategory(['ui', 'global', 'vertrag']); -/* + await this.$p.loadCategory(['ui', 'global', 'mobility']); + let cm = this.$refs.table.tabulator.columnManager; cm.getColumnByField('bezeichnung').component.updateDefinition({ - title: this.$p.t('global', 'status') + title: this.$p.t('ui', 'bezeichnung') }); - cm.getColumnByField('format_datum').component.updateDefinition({ - title: this.$p.t('global', 'datum') + cm.getColumnByField('kurzbz').component.updateDefinition({ + title: this.$p.t('mobility', 'kurzbz') }); - cm.getColumnByField('mitarbeiter_uid').component.updateDefinition({ - title: this.$p.t('person', 'uid') - }); - cm.getColumnByField('vertrag_id').component.updateDefinition({ - title: this.$p.t('ui', 'vertrag_id') - }); - cm.getColumnByField('vertragsstatus_kurzbz').component.updateDefinition({ - title: this.$p.t('vertrag', 'vertragStatus') - }); - cm.getColumnByField('actions').component.updateDefinition({ +/* cm.getColumnByField('actions').component.updateDefinition({ title: this.$p.t('global', 'aktionen') - }); - cm.getColumnByField('updatevon').component.updateDefinition({ - title: this.$p.t('global', 'updatevon') - }); - cm.getColumnByField('format_updateamum').component.updateDefinition({ - title: this.$p.t('global', 'updateamum') - }); - cm.getColumnByField('insertvon').component.updateDefinition({ - title: this.$p.t('global', 'insertvon') - }); - cm.getColumnByField('format_insertamum').component.updateDefinition({ - title: this.$p.t('global', 'insertamum') - }); */ + });*/ } } ], clickedRows: [], - formData: {}, - localData: [] + formData: { + zweck_code: "" + }, + localData: [], } }, watch: { -/* bisio_id(newVal) { - if (!newVal) { - console.log("activate local Data"); - // Lokale Daten direkt in die Tabelle laden - this.$refs.table.instance.setData(this.localData); - } else { - console.log("data with api" + newVal); - let params = { - bisio_id: newVal, - }; - // Daten aus der API abrufen und in die Tabelle laden - this.$fhcApi.factory.stv.mobility.getPurposes(params) - .then(result => { - this.$refs.table.instance.setData(result.data); - }) - .catch(this.$fhcAlert.handleSystemError); - } - },*/ - - -/* bisio_id(newVal) { - if (!newVal) { - console.log("activate local Data"); - this.tabulatorOptions.ajaxRequestFunc = null; - this.tabulatorOptions.data = this.localData; - } else { - console.log("data with api" + newVal); - let params = { - bisio_id : newVal, - }; - //this.tabulatorOptions.ajaxRequestFunc = this.$fhcApi.factory.stv.mobility.getPurposes, newVal; - this.$fhcApi.factory.stv.mobility.getPurposes(params) - .then(result => { - this.tabulatorOptions = result.data; - }) - .catch(this.$fhcAlert.handleSystemError); - } - },*/ bisio_id() { if (this.$refs.table) { this.$refs.table.reloadTable(); } }, - /* bisio_id() { - //this.reloadTable(); - //this.$refs.table.tabulator.setData('api/frontend/v1/vertraege/vertraege/getStatiOfContract/' + this.vertrag_id); - },*/ - formDataParent: { - handler(newVal, oldVal) - { - this.formData = this.formDataParent; - } - , - deep: true - } }, methods: { actionNewPurpose() { @@ -181,10 +129,21 @@ export default { this.$refs.mobilityPurpose.show(); }, actionDeletePurpose(zweck_code) { - this.$emit('deleteMobilityPurpose', { - bisio_id: this.bisio_id, - zweck_code: zweck_code - }); + if (this.bisio_id) + { + this.$emit('deleteMobilityPurpose', { + bisio_id: this.bisio_id, + zweck_code: zweck_code + }); + } + else + { + const index = this.localData.findIndex(item => item.zweck_code === zweck_code); + + if (index !== -1) { + this.localData.splice(index, 1); + } + } }, handleSubmitAction() { if (this.bisio_id) { @@ -194,11 +153,14 @@ export default { bisio_id: this.bisio_id }); } else { - //not working - // this.$refs.table.addRow({id: 123, zweck_code: this.formData.zweck_code}); - //this.formData.zweck_code - this.localData.push(this.formData.zweck_code); //not working: this.$refs.table.addRow is not a function - console.log("action without Bisio_id " + this.formData.zweck_code); + const purpose = this.listPurposes.find(item => item.zweck_code === this.formData.zweck_code); + const newEntry = { + zweck_code: this.formData.zweck_code, + kurzbz: purpose.kurzbz, + bezeichnung: purpose.bezeichnung + }; + this.localData.push(newEntry); + this.$emit('setMobilityPurposeToNewMobility', { zweck_code: this.formData.zweck_code, }); @@ -220,19 +182,13 @@ export default { }, resetModal(){ this.formData = {}; - this.formData.vertragsstatus_kurzbz = null; - this.formData.datum = new Date(); - this.statusNew = true; + this.formData.zweck_code = null; } }, template: ` -
+

- - - bisio: {{bisio_id}} - @@ -259,9 +215,9 @@ export default { type="select" :label="$p.t('mobility/zweck')" v-model="formData.zweck_code" - name="zweck" + name="zweck_code" > - +
diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php index a1847f679..9754398c2 100644 --- a/system/phrasesupdate.php +++ b/system/phrasesupdate.php @@ -37459,6 +37459,106 @@ array( ) ) ), + array( + 'app' => 'core', + 'category' => 'mobility', + 'phrase' => 'zweck_neu', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Mobilitätszweck anlegen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Create motivation for mobility', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'mobility', + 'phrase' => 'foerderung_neu', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Förderung für Aufenthalt anlegen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Create funding for mobility', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'mobility', + 'phrase' => 'kurzbz_program', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Programmkurzbezeichnung', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Program short description', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'mobility', + 'phrase' => 'bisio_id', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Bisio ID', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Bisio ID', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'mobility', + 'phrase' => 'kurzbz', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Kurzbezeichnung', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Short Name', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), // FHC4 Phrases Mobility End ); From 06dcad755b498e42f53414b1d5524853febb4f7c Mon Sep 17 00:00:00 2001 From: ma0068 Date: Wed, 29 Jan 2025 07:38:21 +0100 Subject: [PATCH 7/8] Backendvalidation insert and update, validation local tabulator array --- .../api/frontend/v1/stv/Mobility.php | 183 ++++++++++++++---- .../Details/Mobility/List/Purpose.js | 35 +++- .../Details/Mobility/List/Support.js | 33 +++- .../Details/Mobility/Mobility.js | 6 +- system/phrasesupdate.php | 20 ++ 5 files changed, 221 insertions(+), 56 deletions(-) diff --git a/application/controllers/api/frontend/v1/stv/Mobility.php b/application/controllers/api/frontend/v1/stv/Mobility.php index be8acfdba..01244a34f 100644 --- a/application/controllers/api/frontend/v1/stv/Mobility.php +++ b/application/controllers/api/frontend/v1/stv/Mobility.php @@ -67,42 +67,73 @@ class Mobility extends FHCAPI_Controller public function insertMobility() { - //TODO(Manu) Validations - //Pflicht gast und herkunftsland + $this->load->library('form_validation'); $authUID = getAuthUID(); + $student_uid = $this->input->post('uid'); + + if(!$student_uid) + { + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Student UID']), self::ERROR_TYPE_GENERAL); + } + $formData = $this->input->post('formData'); - $von = (isset($formData['von']) && !empty($formData['von'])) ? $formData['von'] : null; - $nation_code = (isset($formData['nation_code']) && !empty($formData['nation_code'])) ? $formData['nation_code'] : 'A'; - $mobilitaetsprogramm_code = (isset($formData['mobilitaetsprogramm_code']) && !empty($formData['mobilitaetsprogramm_code'])) ? $formData['mobilitaetsprogramm_code'] : null; - $herkunftsland_code = (isset($formData['herkunftsland_code']) && !empty($formData['herkunftsland_code'])) ? $formData['herkunftsland_code'] : 'A'; + $_POST['von'] = (isset($formData['von']) && !empty($formData['von'])) ? $formData['von'] : null; + $_POST['bis'] = (isset($formData['bis']) && !empty($formData['bis'])) ? $formData['bis'] : null; + $_POST['nation_code'] = (isset($formData['nation_code']) && !empty($formData['nation_code'])) ? $formData['nation_code'] : 'A'; + $_POST['mobilitaetsprogramm_code'] = (isset($formData['mobilitaetsprogramm_code']) && !empty($formData['mobilitaetsprogramm_code'])) ? $formData['mobilitaetsprogramm_code'] : null; + $_POST['herkunftsland_code'] = (isset($formData['herkunftsland_code']) && !empty($formData['herkunftsland_code'])) ? $formData['herkunftsland_code'] : 'A'; + $_POST['ects_erworben'] = (isset($formData['ects_erworben']) && !empty($formData['ects_erworben'])) ? $formData['ects_erworben'] : null; + $_POST['ects_angerechnet'] = (isset($formData['ects_angerechnet']) && !empty($formData['ects_angerechnet'])) ? $formData['ects_angerechnet'] : null; + + + $this->form_validation->set_rules('nation_code', 'Nation_code', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Nation_code']) + ]); + $this->form_validation->set_rules('herkunftsland_code', 'Herkunftsland_code', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Herkunftsland_code']) + ]); + $this->form_validation->set_rules('mobilitaetsprogramm_code', 'Mobilitaetsprogramm_code', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Mobilitaetsprogramm_code']) + ]); + $this->form_validation->set_rules('von', 'VonDatum', 'is_valid_date', [ + 'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'VonDatum']) + ]); + + $this->form_validation->set_rules('bis', 'VBisDatum', 'is_valid_date', [ + 'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'VBisDatum']) + ]); + + $this->form_validation->set_rules('ects_erworben', 'Ects_erworben', 'numeric', [ + 'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'Ects_erworben']) + ]); + + $this->form_validation->set_rules('ects_angerechnet', 'Ects_angerechnet', 'numeric', [ + 'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'Ects_angerechnet']) + ]); + + if ($this->form_validation->run() == false) + { + $this->terminateWithValidationErrors($this->form_validation->error_array()); + } + $ort = (isset($formData['ort']) && !empty($formData['ort'])) ? $formData['ort'] : null; $universitaet = (isset($formData['universitaet']) && !empty($formData['universitaet'])) ? $formData['universitaet'] : null; - $ects_erworben = (isset($formData['ects_erworben']) && !empty($formData['ects_erworben'])) ? $formData['ects_erworben'] : null; - $ects_angerechnet = (isset($formData['ects_angerechnet']) && !empty($formData['ects_angerechnet'])) ? $formData['ects_angerechnet'] : null; $localPurposes = (isset($formData['localPurposes']) && !empty($formData['localPurposes'])) ? $formData['localPurposes'] : null; $localSupports = (isset($formData['localSupports']) && !empty($formData['localSupports'])) ? $formData['localSupports'] : null; - - //strange fields - /* 'zweck_code' => $this->input->post('zweck_code'), - 'aufenthalt_foerderung' => $this->input->post('aufenthalt_foerderung'), - 'lehreinheit_id' => $this->input->post('lehreinheit_id'), - 'lehrveranstaltung_id' => $this->input->post('lehrveranstaltung_id'),*/ - - $result = $this->BisioModel->insert([ - 'student_uid' => $this->input->post('uid'), - 'von' => $von, - 'bis' => $formData['bis'], - 'mobilitaetsprogramm_code' => $mobilitaetsprogramm_code, - 'nation_code' => $nation_code, - 'herkunftsland_code' => $herkunftsland_code, + 'student_uid' => $student_uid, + 'von' => $_POST['von'], + 'bis' => $_POST['bis'], + 'mobilitaetsprogramm_code' => $_POST['mobilitaetsprogramm_code'], + 'nation_code' => $_POST['nation_code'], + 'herkunftsland_code' => $_POST['herkunftsland_code'], 'ort' => $ort, 'universitaet' => $universitaet, - 'ects_erworben' => $ects_erworben, - 'ects_angerechnet' => $ects_angerechnet, + 'ects_erworben' => $_POST['ects_erworben'] , + 'ects_angerechnet' => $_POST['ects_angerechnet'], 'insertamum' => date('c'), 'insertvon' => $authUID, ]); @@ -111,7 +142,6 @@ class Mobility extends FHCAPI_Controller //check if localData (purposes) if(count($localPurposes) > 0){ - foreach ($localPurposes as $zweck){ $zweck = (int) $zweck; $this->addMobilityPurpose($bisio_id, $zweck); @@ -139,24 +169,71 @@ class Mobility extends FHCAPI_Controller public function updateMobility() { + $this->load->library('form_validation'); $authUID = getAuthUID(); + + $student_uid = $this->input->post('uid'); + + if(!$student_uid) + { + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Student UID']), self::ERROR_TYPE_GENERAL); + } $formData = $this->input->post('formData'); + $_POST['von'] = (isset($formData['von']) && !empty($formData['von'])) ? $formData['von'] : null; + $_POST['bis'] = (isset($formData['bis']) && !empty($formData['bis'])) ? $formData['bis'] : null; + $_POST['nation_code'] = (isset($formData['nation_code']) && !empty($formData['nation_code'])) ? $formData['nation_code'] : 'A'; + $_POST['mobilitaetsprogramm_code'] = (isset($formData['mobilitaetsprogramm_code']) && !empty($formData['mobilitaetsprogramm_code'])) ? $formData['mobilitaetsprogramm_code'] : null; + $_POST['herkunftsland_code'] = (isset($formData['herkunftsland_code']) && !empty($formData['herkunftsland_code'])) ? $formData['herkunftsland_code'] : 'A'; + $_POST['ects_erworben'] = (isset($formData['ects_erworben']) && !empty($formData['ects_erworben'])) ? $formData['ects_erworben'] : null; + $_POST['ects_angerechnet'] = (isset($formData['ects_angerechnet']) && !empty($formData['ects_angerechnet'])) ? $formData['ects_angerechnet'] : null; + + + $this->form_validation->set_rules('nation_code', 'Nation_code', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Nation_code']) + ]); + $this->form_validation->set_rules('herkunftsland_code', 'Herkunftsland_code', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Herkunftsland_code']) + ]); + $this->form_validation->set_rules('mobilitaetsprogramm_code', 'Mobilitaetsprogramm_code', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Mobilitaetsprogramm_code']) + ]); + $this->form_validation->set_rules('von', 'VonDatum', 'is_valid_date', [ + 'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'VonDatum']) + ]); + + $this->form_validation->set_rules('bis', 'VBisDatum', 'is_valid_date', [ + 'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'VBisDatum']) + ]); + + $this->form_validation->set_rules('ects_erworben', 'Ects_erworben', 'numeric', [ + 'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'Ects_erworben']) + ]); + + $this->form_validation->set_rules('ects_angerechnet', 'Ects_angerechnet', 'numeric', [ + 'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'Ects_angerechnet']) + ]); + + if ($this->form_validation->run() == false) + { + $this->terminateWithValidationErrors($this->form_validation->error_array()); + } + $result = $this->BisioModel->update( [ 'bisio_id' => $formData['bisio_id'] ], [ - 'student_uid' => $this->input->post('uid'), - 'von' => $formData['von'], - 'bis' => $formData['bis'], - 'mobilitaetsprogramm_code' => $formData['mobilitaetsprogramm_code'], - 'nation_code' => $formData['nation_code'], - 'herkunftsland_code' => $formData['herkunftsland_code'], + 'student_uid' => $student_uid, + 'von' => $_POST['von'], + 'bis' => $_POST['bis'], + 'mobilitaetsprogramm_code' => $_POST['mobilitaetsprogramm_code'], + 'nation_code' => $_POST['nation_code'], + 'herkunftsland_code' => $_POST['herkunftsland_code'], 'ort' => $formData['ort'], 'universitaet' => $formData['universitaet'], - 'ects_erworben' => $formData['ects_erworben'], - 'ects_angerechnet' => $formData['ects_angerechnet'], + 'ects_erworben' => $_POST['ects_erworben'] , + 'ects_angerechnet' => $_POST['ects_angerechnet'], 'updateamum' => date('c'), 'updatevon' => $authUID, ] @@ -169,8 +246,6 @@ class Mobility extends FHCAPI_Controller public function deleteMobility($bisio_id) { - // $this->terminateWithError('test ' . $bisio_id, self::ERROR_TYPE_GENERAL); - $result = $this->BisioModel->delete( array('bisio_id' => $bisio_id) ); @@ -262,6 +337,19 @@ class Mobility extends FHCAPI_Controller } $this->load->model('codex/Bisiozweck_model', 'BisiozweckModel'); + if(!$local_purpose) + { + $check = $this->BisiozweckModel->loadWhere( + [ + 'bisio_id' => $bisio_id, + 'zweck_code' => $zweck_code, + ] + ); + if (hasData($check)) + { + $this->terminateWithError( $this->p->t('ui', 'error_entryExisting'), self::ERROR_TYPE_GENERAL); + } + } $result = $this->BisiozweckModel->insert( array( @@ -272,6 +360,11 @@ class Mobility extends FHCAPI_Controller $data = $this->getDataOrTerminateWithError($result); + if($local_purpose) + { + return $data; + } + return $this->terminateWithSuccess(current($data)); } @@ -304,6 +397,20 @@ class Mobility extends FHCAPI_Controller $this->load->model('codex/Bisioaufenthaltfoerderung_model', 'BisioaufenthaltfoerderungModel'); + if(!$local_support) + { + $check = $this->BisioaufenthaltfoerderungModel->loadWhere( + [ + 'bisio_id' => $bisio_id, + 'aufenthaltfoerderung_code' => $aufenthaltfoerderung_code, + ] + ); + if (hasData($check)) + { + $this->terminateWithError( $this->p->t('ui', 'error_entryExisting'), self::ERROR_TYPE_GENERAL); + } + } + $result = $this->BisioaufenthaltfoerderungModel->insert( array( 'bisio_id' => $bisio_id, @@ -313,11 +420,17 @@ class Mobility extends FHCAPI_Controller $data = $this->getDataOrTerminateWithError($result); + if($local_support) + { + return $data; + } + return $this->terminateWithSuccess(current($data)); } public function deleteMobilitySupport($bisio_id) { + //TODO(Manu) Validierung Extension $aufenthaltfoerderung_code = $this->input->post('aufenthaltfoerderung_code'); $this->load->model('codex/Bisioaufenthaltfoerderung_model', 'BisioaufenthaltfoerderungModel'); diff --git a/public/js/components/Stv/Studentenverwaltung/Details/Mobility/List/Purpose.js b/public/js/components/Stv/Studentenverwaltung/Details/Mobility/List/Purpose.js index b1a80d7b2..2515b5865 100644 --- a/public/js/components/Stv/Studentenverwaltung/Details/Mobility/List/Purpose.js +++ b/public/js/components/Stv/Studentenverwaltung/Details/Mobility/List/Purpose.js @@ -83,7 +83,7 @@ export default { ], layout: 'fitColumns', layoutColumnsOnNewData: false, - height: '200', + height: '250', selectableRangeMode: 'click', selectable: true, persistenceID: 'core-mobility-purpose' @@ -138,16 +138,16 @@ export default { } else { - const index = this.localData.findIndex(item => item.zweck_code === zweck_code); + const data = this.$refs.table.tabulator.getData(); + const rowExists = data.some(item => item.zweck_code === zweck_code); - if (index !== -1) { - this.localData.splice(index, 1); + if (rowExists) { + this.$refs.table.tabulator.deleteRow(zweck_code); } } }, handleSubmitAction() { if (this.bisio_id) { - this.$emit('setMobilityPurpose', { zweck_code: this.formData.zweck_code, bisio_id: this.bisio_id @@ -155,15 +155,27 @@ export default { } else { const purpose = this.listPurposes.find(item => item.zweck_code === this.formData.zweck_code); const newEntry = { - zweck_code: this.formData.zweck_code, + id: Number (this.formData.zweck_code), //id necessary due to tabulator deleteRow-Action + zweck_code: Number (this.formData.zweck_code), kurzbz: purpose.kurzbz, bezeichnung: purpose.bezeichnung }; - this.localData.push(newEntry); - this.$emit('setMobilityPurposeToNewMobility', { - zweck_code: this.formData.zweck_code, - }); + const data = this.$refs.table.tabulator.getData(); + const rowExists = data.some(item => item.zweck_code === Number (this.formData.zweck_code)); + + if(rowExists){ + this.$fhcAlert.alertError(this.$p.t('ui', 'error_entryExisting')); + } + else + { + this.localData.push(newEntry); + + this.$emit('setMobilityPurposeToNewMobility', { + zweck_code: this.formData.zweck_code, + }); + } + } this.closeModal(); }, @@ -183,6 +195,9 @@ export default { resetModal(){ this.formData = {}; this.formData.zweck_code = null; + }, + resetLocalData() { + this.$refs.table.tabulator.clearData(); } }, template: ` diff --git a/public/js/components/Stv/Studentenverwaltung/Details/Mobility/List/Support.js b/public/js/components/Stv/Studentenverwaltung/Details/Mobility/List/Support.js index 952d647c4..443fa5098 100644 --- a/public/js/components/Stv/Studentenverwaltung/Details/Mobility/List/Support.js +++ b/public/js/components/Stv/Studentenverwaltung/Details/Mobility/List/Support.js @@ -81,7 +81,7 @@ export default { ], layout: 'fitColumns', layoutColumnsOnNewData: false, - height: '200', + height: '250', selectableRangeMode: 'click', selectable: true, persistenceID: 'core-mobility-support' @@ -133,10 +133,11 @@ export default { } else { - const index = this.localData.findIndex(item => item.aufenthaltfoerderung_code === aufenthaltfoerderung_code); + const data = this.$refs.table.tabulator.getData(); + const rowExists = data.some(item => item.aufenthaltfoerderung_code === aufenthaltfoerderung_code); - if (index !== -1) { - this.localData.splice(index, 1); + if (rowExists) { + this.$refs.table.tabulator.deleteRow(aufenthaltfoerderung_code); } } }, @@ -149,18 +150,29 @@ export default { } else { const support = this.listSupports.find(item => item.aufenthaltfoerderung_code === this.formData.aufenthaltfoerderung_code); const newEntry = { + id: Number (this.formData.aufenthaltfoerderung_code), //id necessary due to tabulator deleteRow-Action aufenthaltfoerderung_code: this.formData.aufenthaltfoerderung_code, bezeichnung: support.bezeichnung }; - this.localData.push(newEntry); - this.$emit('setMobilitySupportToNewMobility', { - aufenthaltfoerderung_code: this.formData.aufenthaltfoerderung_code, - }); + const data = this.$refs.table.tabulator.getData(); + const rowExists = data.some(item => item.aufenthaltfoerderung_code === Number (this.formData.aufenthaltfoerderung_code)); + + if(rowExists){ + this.$fhcAlert.alertError(this.$p.t('ui', 'error_entryExisting')); + } + else + { + this.localData.push(newEntry); + + this.$emit('setMobilitySupportToNewMobility', { + aufenthaltfoerderung_code: this.formData.aufenthaltfoerderung_code, + }); + } + } this.closeModal(); }, - closeModal(){ this.$refs.mobilitySupport.hide(); this.$emit('close-modal'); @@ -176,6 +188,9 @@ export default { resetModal(){ this.formData = {}; this.formData.aufenthaltfoerderung_code = null; + }, + resetLocalData() { + this.$refs.table.tabulator.clearData(); } }, template: ` diff --git a/public/js/components/Stv/Studentenverwaltung/Details/Mobility/Mobility.js b/public/js/components/Stv/Studentenverwaltung/Details/Mobility/Mobility.js index 9471f2eb4..af5b2a7a2 100644 --- a/public/js/components/Stv/Studentenverwaltung/Details/Mobility/Mobility.js +++ b/public/js/components/Stv/Studentenverwaltung/Details/Mobility/Mobility.js @@ -168,7 +168,7 @@ export default { uid: this.student.uid, formData: this.formData }; - return this.$fhcApi.factory.stv.mobility.addNewMobility(dataToSend) + return this.$refs.formMobility.factory.stv.mobility.addNewMobility(dataToSend) .then(response => { this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successSave')); this.resetForm(); @@ -176,6 +176,8 @@ export default { .catch(this.$fhcAlert.handleSystemError) .finally(() => { this.reload(); + this.$refs.purposes.resetLocalData(); + this.$refs.supports.resetLocalData(); }); }, reload() { @@ -193,7 +195,7 @@ export default { formData: this.formData, uid: this.student.uid, }; - return this.$fhcApi.factory.stv.mobility.updateMobility(dataToSend) + this.$refs.formMobility.factory.stv.mobility.updateMobility(dataToSend) .then(response => { this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successSave')); this.resetForm(); diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php index 9754398c2..da0eb1d41 100644 --- a/system/phrasesupdate.php +++ b/system/phrasesupdate.php @@ -37559,6 +37559,26 @@ array( ) ) ), + array( + 'app' => 'core', + 'category' => 'ui', + 'phrase' => 'error_entryExisting', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Eintrag bereits vorhanden', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Entry already existing', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), // FHC4 Phrases Mobility End ); From ec46dbd10d3e37232fc3e32797ebbaa501c3b845 Mon Sep 17 00:00:00 2001 From: ma0068 Date: Thu, 30 Jan 2025 14:56:48 +0100 Subject: [PATCH 8/8] Validation during delete for extension mobility, add field lehreinheit to dropdown and backend --- .../api/frontend/v1/stv/Mobility.php | 108 +++++++++++++++--- application/models/codex/Bisio_model.php | 23 ++++ .../models/education/Lehreinheit_model.php | 53 +++++++++ public/js/api/stv/mobility.js | 6 + .../js/components/Stv/Studentenverwaltung.js | 1 + .../Details/Mobility/Mobility.js | 92 ++++++++++++--- system/phrasesupdate.php | 20 ++++ 7 files changed, 268 insertions(+), 35 deletions(-) diff --git a/application/controllers/api/frontend/v1/stv/Mobility.php b/application/controllers/api/frontend/v1/stv/Mobility.php index 01244a34f..7abe84138 100644 --- a/application/controllers/api/frontend/v1/stv/Mobility.php +++ b/application/controllers/api/frontend/v1/stv/Mobility.php @@ -16,6 +16,8 @@ class Mobility extends FHCAPI_Controller 'deleteMobility' => ['admin:rw', 'assistenz:rw'], 'getProgramsMobility' => ['admin:r', 'assistenz:r'], 'getLVList' => ['admin:r', 'assistenz:r'], + 'getAllLehreinheiten' => ['admin:r', 'assistenz:r'], + 'getLvsandLesByStudent' => ['admin:r', 'assistenz:r'], 'getPurposes' => ['admin:r', 'assistenz:r'], 'getSupports' => ['admin:r', 'assistenz:r'], 'getListPurposes' => ['admin:r', 'assistenz:r'], @@ -32,7 +34,8 @@ class Mobility extends FHCAPI_Controller // Load language phrases $this->loadPhrases([ - 'ui' + 'ui', + 'mobility' ]); // Load models @@ -82,11 +85,11 @@ class Mobility extends FHCAPI_Controller $_POST['von'] = (isset($formData['von']) && !empty($formData['von'])) ? $formData['von'] : null; $_POST['bis'] = (isset($formData['bis']) && !empty($formData['bis'])) ? $formData['bis'] : null; $_POST['nation_code'] = (isset($formData['nation_code']) && !empty($formData['nation_code'])) ? $formData['nation_code'] : 'A'; - $_POST['mobilitaetsprogramm_code'] = (isset($formData['mobilitaetsprogramm_code']) && !empty($formData['mobilitaetsprogramm_code'])) ? $formData['mobilitaetsprogramm_code'] : null; + $_POST['mobilitaetsprogramm_code'] = (isset($formData['mobilitaetsprogramm_code']) && !empty($formData['mobilitaetsprogramm_code'])) ? $formData['mobilitaetsprogramm_code'] : null; $_POST['herkunftsland_code'] = (isset($formData['herkunftsland_code']) && !empty($formData['herkunftsland_code'])) ? $formData['herkunftsland_code'] : 'A'; - $_POST['ects_erworben'] = (isset($formData['ects_erworben']) && !empty($formData['ects_erworben'])) ? $formData['ects_erworben'] : null; + $_POST['ects_erworben'] = (isset($formData['ects_erworben']) && !empty($formData['ects_erworben'])) ? $formData['ects_erworben'] : null; $_POST['ects_angerechnet'] = (isset($formData['ects_angerechnet']) && !empty($formData['ects_angerechnet'])) ? $formData['ects_angerechnet'] : null; - + $_POST['lehreinheit_id'] = (isset($formData['lehreinheit_id']) && !empty($formData['lehreinheit_id'])) ? $formData['lehreinheit_id'] : null; $this->form_validation->set_rules('nation_code', 'Nation_code', 'required', [ 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Nation_code']) @@ -113,6 +116,10 @@ class Mobility extends FHCAPI_Controller 'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'Ects_angerechnet']) ]); + $this->form_validation->set_rules('lehreinheit_id', 'Lehreinheit', 'numeric', [ + 'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'Lehreinheit']) + ]); + if ($this->form_validation->run() == false) { $this->terminateWithValidationErrors($this->form_validation->error_array()); @@ -130,6 +137,7 @@ class Mobility extends FHCAPI_Controller 'mobilitaetsprogramm_code' => $_POST['mobilitaetsprogramm_code'], 'nation_code' => $_POST['nation_code'], 'herkunftsland_code' => $_POST['herkunftsland_code'], + 'lehreinheit_id' => $_POST['lehreinheit_id'], 'ort' => $ort, 'universitaet' => $universitaet, 'ects_erworben' => $_POST['ects_erworben'] , @@ -143,7 +151,7 @@ class Mobility extends FHCAPI_Controller //check if localData (purposes) if(count($localPurposes) > 0){ foreach ($localPurposes as $zweck){ - $zweck = (int) $zweck; + $zweck = (int)$zweck; $this->addMobilityPurpose($bisio_id, $zweck); } } @@ -183,11 +191,11 @@ class Mobility extends FHCAPI_Controller $_POST['von'] = (isset($formData['von']) && !empty($formData['von'])) ? $formData['von'] : null; $_POST['bis'] = (isset($formData['bis']) && !empty($formData['bis'])) ? $formData['bis'] : null; $_POST['nation_code'] = (isset($formData['nation_code']) && !empty($formData['nation_code'])) ? $formData['nation_code'] : 'A'; - $_POST['mobilitaetsprogramm_code'] = (isset($formData['mobilitaetsprogramm_code']) && !empty($formData['mobilitaetsprogramm_code'])) ? $formData['mobilitaetsprogramm_code'] : null; + $_POST['mobilitaetsprogramm_code'] = (isset($formData['mobilitaetsprogramm_code']) && !empty($formData['mobilitaetsprogramm_code'])) ? $formData['mobilitaetsprogramm_code'] : null; $_POST['herkunftsland_code'] = (isset($formData['herkunftsland_code']) && !empty($formData['herkunftsland_code'])) ? $formData['herkunftsland_code'] : 'A'; $_POST['ects_erworben'] = (isset($formData['ects_erworben']) && !empty($formData['ects_erworben'])) ? $formData['ects_erworben'] : null; $_POST['ects_angerechnet'] = (isset($formData['ects_angerechnet']) && !empty($formData['ects_angerechnet'])) ? $formData['ects_angerechnet'] : null; - + $_POST['lehreinheit_id'] = (isset($formData['lehreinheit_id']) && !empty($formData['lehreinheit_id'])) ? $formData['lehreinheit_id'] : null; $this->form_validation->set_rules('nation_code', 'Nation_code', 'required', [ 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Nation_code']) @@ -214,6 +222,10 @@ class Mobility extends FHCAPI_Controller 'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'Ects_angerechnet']) ]); + $this->form_validation->set_rules('lehreinheit_id', 'Lehreinheit', 'numeric', [ + 'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'Lehreinheit']) + ]); + if ($this->form_validation->run() == false) { $this->terminateWithValidationErrors($this->form_validation->error_array()); @@ -230,6 +242,7 @@ class Mobility extends FHCAPI_Controller 'mobilitaetsprogramm_code' => $_POST['mobilitaetsprogramm_code'], 'nation_code' => $_POST['nation_code'], 'herkunftsland_code' => $_POST['herkunftsland_code'], + 'lehreinheit_id' => $_POST['lehreinheit_id'], 'ort' => $formData['ort'], 'universitaet' => $formData['universitaet'], 'ects_erworben' => $_POST['ects_erworben'] , @@ -246,16 +259,34 @@ class Mobility extends FHCAPI_Controller public function deleteMobility($bisio_id) { + //check if extension table exists + $result = $this->BisioModel->tableExists('extension', 'tbl_mo_bisioidzuordnung'); + $data = $this->getDataOrTerminateWithError($result); + + //if table exists check if existing entry + if(!empty($data)) + { + $this->BisioModel->addSelect("count(*)"); + $this->BisioModel->addJoin('extension.tbl_mo_bisioidzuordnung mo', 'ON (mo.bisio_id = bis.tbl_bisio.bisio_id)', 'LEFT'); + + $resultCheckMo = $this->BisioModel->loadWhere( + array('mo.bisio_id' => $bisio_id) + ); + + $resultCheckMo = $this->getDataOrTerminateWithError($resultCheckMo); + $count = current($resultCheckMo)->count; + + $existsInExtension = $count > 0 ? true : false; + + if($existsInExtension) + $this->terminateWithError($this->p->t('mobility', 'error_existingEntryInExtension'), self::ERROR_TYPE_GENERAL); + } + $result = $this->BisioModel->delete( array('bisio_id' => $bisio_id) ); - //TODO(Manu) foreign key restraint - //check Extension mo - //fk_mobisioidzuordnung_prestudent_id" on table "tbl_mo_bisioidzuordnung" - $data = $this->getDataOrTerminateWithError($result); - $this->terminateWithSuccess($data); } @@ -270,9 +301,53 @@ class Mobility extends FHCAPI_Controller $this->terminateWithSuccess($data); } + public function getAllLehreinheiten() + { + $lv_id = $this->input->post('lv_id'); + $studiensemester_kurzbz = $this->input->post('studiensemester_kurzbz'); + + $this->load->model('education/Lehreinheit_model', 'LehreinheitModel'); + + $result = $this->LehreinheitModel->getLesFromLvIds($lv_id, $studiensemester_kurzbz); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + + public function getLvsandLesByStudent($student_uid) + { + $this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel'); + + $result = $this->LehrveranstaltungModel->getLvsByStudent($student_uid); + + $data = $this->getDataOrTerminateWithError($result); + + $lv_ids = array(); + $allData = array(); + + foreach ($data as $lehrveranstaltung) { + $lv_ids[] = $lehrveranstaltung->lehrveranstaltung_id; + } + + $this->load->model('education/Lehreinheit_model', 'LehreinheitModel'); + + foreach ($lv_ids as $id) + { + $result = $this->LehreinheitModel->getLesFromLvIds($id); + $data = $this->getDataOrTerminateWithError($result); + + if (is_array($data)) { + $allData = array_merge($allData, $data); + } + } + + return $this->terminateWithSuccess($allData); + } + public function getPurposes($bisio_id) { - $bisio_id = (int) $bisio_id; + $bisio_id = (int)$bisio_id; $this->load->model('codex/Bisiozweck_model', 'BisiozweckModel'); @@ -290,7 +365,7 @@ class Mobility extends FHCAPI_Controller public function getSupports($bisio_id) { - $bisio_id = (int) $bisio_id; + $bisio_id = (int)$bisio_id; $this->load->model('codex/Bisioaufenthaltfoerderung_model', 'BisioaufenthaltfoerderungModel'); @@ -347,7 +422,7 @@ class Mobility extends FHCAPI_Controller ); if (hasData($check)) { - $this->terminateWithError( $this->p->t('ui', 'error_entryExisting'), self::ERROR_TYPE_GENERAL); + $this->terminateWithError($this->p->t('ui', 'error_entryExisting'), self::ERROR_TYPE_GENERAL); } } @@ -407,7 +482,7 @@ class Mobility extends FHCAPI_Controller ); if (hasData($check)) { - $this->terminateWithError( $this->p->t('ui', 'error_entryExisting'), self::ERROR_TYPE_GENERAL); + $this->terminateWithError($this->p->t('ui', 'error_entryExisting'), self::ERROR_TYPE_GENERAL); } } @@ -430,7 +505,6 @@ class Mobility extends FHCAPI_Controller public function deleteMobilitySupport($bisio_id) { - //TODO(Manu) Validierung Extension $aufenthaltfoerderung_code = $this->input->post('aufenthaltfoerderung_code'); $this->load->model('codex/Bisioaufenthaltfoerderung_model', 'BisioaufenthaltfoerderungModel'); diff --git a/application/models/codex/Bisio_model.php b/application/models/codex/Bisio_model.php index 1cff1dc54..5ecd4bb51 100644 --- a/application/models/codex/Bisio_model.php +++ b/application/models/codex/Bisio_model.php @@ -44,4 +44,27 @@ class Bisio_model extends DB_Model else return success("Bisio not found"); } + + /** + * checks, if an (extension) table exists to avoid later errors + * @param String $schema like 'extension' + * @param String $table like 'tbl_mo_bisiozuordnung' + * @return boolean + */ + public function tableExists($schema, $table) + { + $params = array($schema, $table); + + $qry = "SELECT + 1 + FROM + information_schema.role_table_grants + WHERE + table_schema = ? + AND table_name = ?"; + + $result = $this->execQuery($qry, $params); + + return $result; + } } diff --git a/application/models/education/Lehreinheit_model.php b/application/models/education/Lehreinheit_model.php index afad6870b..c156ac75d 100644 --- a/application/models/education/Lehreinheit_model.php +++ b/application/models/education/Lehreinheit_model.php @@ -244,4 +244,57 @@ EOSQL; $res = $this->execReadOnlyQuery($query); return $res; } + + /** + * Gets Lehreinheiten for Lehrveranstaltungen in a Studiensemester. + * Without using tbl_lehrfach: bezeichnung and kurzbz ALWAYS from lehrveranstaltung + * @param $lehrveranstaltung_id + * @param $studiensemester + * @return array with Lehreinheiten and their Lehreinheitgruppen + */ + public function getLesFromLvIds($lehrveranstaltung_id, $studiensemester_kurzbz = null) + { + $params = array($lehrveranstaltung_id); + + $query = " + SELECT + lv.lehrveranstaltung_id, + le.lehreinheit_id, + le.lehrform_kurzbz, + lv.kurzbz, + lv.bezeichnung, + lv.semester, + ma.mitarbeiter_uid, + ( + SELECT + STRING_AGG(CONCAT(leg.semester, leg.verband, leg.gruppe), ' ') + FROM lehre.tbl_lehreinheitgruppe leg + WHERE leg.lehreinheit_id = le.lehreinheit_id + ) AS gruppe, + tma.kurzbz as kuerzel + FROM + lehre.tbl_lehreinheit le + JOIN + lehre.tbl_lehrveranstaltung lv ON lv.lehrveranstaltung_id = le.lehrveranstaltung_id + JOIN + lehre.tbl_lehreinheitmitarbeiter ma USING (lehreinheit_id) + JOIN + public.tbl_mitarbeiter tma USING (mitarbeiter_uid) + WHERE + lv.lehrveranstaltung_id = ? + "; + + if (isset($studiensemester_kurzbz)) + { + $query .= " AND le.studiensemester_kurzbz = ?"; + $params[] = $studiensemester_kurzbz; + } + + $query .=" + ORDER BY + le.lehreinheit_id; + "; + + return $this->execQuery($query, $params); + } } diff --git a/public/js/api/stv/mobility.js b/public/js/api/stv/mobility.js index 1139aa275..c680dc70b 100644 --- a/public/js/api/stv/mobility.js +++ b/public/js/api/stv/mobility.js @@ -20,6 +20,12 @@ export default { getLVList(studiengang_kz){ return this.$fhcApi.get('api/frontend/v1/stv/mobility/getLVList/' + studiengang_kz); }, + getAllLehreinheiten(data){ + return this.$fhcApi.post('api/frontend/v1/stv/mobility/getAllLehreinheiten/', data) + }, + getLvsandLesByStudent(uid){ + return this.$fhcApi.get('api/frontend/v1/stv/mobility/getLvsandLesByStudent/' + uid); + }, getPurposes(url, config, params){ return this.$fhcApi.get('api/frontend/v1/stv/mobility/getPurposes/' + params.id); }, diff --git a/public/js/components/Stv/Studentenverwaltung.js b/public/js/components/Stv/Studentenverwaltung.js index 8779e4bf1..eaa253c2c 100644 --- a/public/js/components/Stv/Studentenverwaltung.js +++ b/public/js/components/Stv/Studentenverwaltung.js @@ -57,6 +57,7 @@ export default { hasPermissionToSkipStatusCheck: this.permissions['student/keine_studstatuspruefung'], hasPermissionRtAufsicht: this.permissions['lehre/reihungstestAufsicht'], lists: this.lists, + currentSemester: Vue.computed(() => this.studiensemesterKurzbz), defaultSemester: this.defaultSemester, $reloadList: () => { this.$refs.stvList.reload(); diff --git a/public/js/components/Stv/Studentenverwaltung/Details/Mobility/Mobility.js b/public/js/components/Stv/Studentenverwaltung/Details/Mobility/Mobility.js index af5b2a7a2..0cd30ec42 100644 --- a/public/js/components/Stv/Studentenverwaltung/Details/Mobility/Mobility.js +++ b/public/js/components/Stv/Studentenverwaltung/Details/Mobility/Mobility.js @@ -22,7 +22,10 @@ export default { }, lists: { from: 'lists' - } + }, + currentSemester: { + from: 'currentSemester', + }, }, props: { student: Object @@ -132,6 +135,8 @@ export default { statusNew: true, programsMobility: [], listLvs: [], + listLes: [], + listLvsAndLes: [], listPurposes: [], listSupports: [], tabulatorData: [] @@ -142,7 +147,15 @@ export default { if (this.$refs.table) { this.$refs.table.reloadTable(); } - } + }, +/* formData.lehrveranstaltung_id(){ + + }*/ + }, + computed:{ + lv_teile(){ + return this.listLvsAndLes.filter(lv => lv.lehreinheit_id == this.formData.lehreinheit_id); + }, }, methods: { actionNewMobility() { @@ -180,6 +193,22 @@ export default { this.$refs.supports.resetLocalData(); }); }, + loadItems(){ + if(this.formData.lehrveranstaltung) { + this.getLehreinheiten(this.formData.lehrveranstaltung, this.currentSemester); + } + }, + getLehreinheiten(lv_id, studiensemester_kurzbz) { + const data = { + lv_id: lv_id, + studiensemester_kurzbz: studiensemester_kurzbz + }; + return this.$fhcApi.factory.stv.mobility.getAllLehreinheiten(data) + .then(response => { + this.listLes = response.data; + }) + .catch(this.$fhcAlert.handleSystemError); + }, reload() { this.$refs.table.reloadTable(); }, @@ -308,11 +337,16 @@ export default { this.listSupports = result.data; }) .catch(this.$fhcAlert.handleSystemError); + this.$fhcApi.factory.stv.mobility.getLvsandLesByStudent(this.student.uid) + .then(result => { + this.listLvsAndLes = result.data; + }) + .catch(this.$fhcAlert.handleSystemError); }, template: `

In / Out

- + -
+
BIS Outgoing
@@ -352,7 +386,7 @@ export default { :label="$p.t('lehre', 'lehrveranstaltung')" type="select" v-model="formData.lehrveranstaltung" - name="lehrveranstaltung" + name="lehrveranstaltung_id" >
diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php index da0eb1d41..dc666eace 100644 --- a/system/phrasesupdate.php +++ b/system/phrasesupdate.php @@ -37579,6 +37579,26 @@ array( ) ) ), + array( + 'app' => 'core', + 'category' => 'mobility', + 'phrase' => 'error_existingEntryInExtension', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Dieser Datensatz wird von der Mobility Extension verwendet und muss zuerst dort gelöscht werden.', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'This record is used by the Mobility Extension and must first be deleted there.', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), // FHC4 Phrases Mobility End );