From ec46dbd10d3e37232fc3e32797ebbaa501c3b845 Mon Sep 17 00:00:00 2001 From: ma0068 Date: Thu, 30 Jan 2025 14:56:48 +0100 Subject: [PATCH] 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 );