Validation during delete for extension mobility, add field lehreinheit to dropdown and backend

This commit is contained in:
ma0068
2025-01-30 14:56:48 +01:00
parent 06dcad755b
commit ec46dbd10d
7 changed files with 268 additions and 35 deletions
@@ -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');
+23
View File
@@ -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;
}
}
@@ -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);
}
}
+6
View File
@@ -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);
},
@@ -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();
@@ -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: `
<div class="stv-details-mobility h-100 pb-3">
<h4>In / Out</h4>
<core-filter-cmpt
ref="table"
:tabulator-options="tabulatorOptions"
@@ -328,7 +362,7 @@ export default {
<form-form v-if="!this.student.length" ref="formMobility" @submit.prevent>
<div class="row mb-3">
<div class="row my-3">
<legend class="col-6">BIS</legend>
<legend class="col-6">Outgoing</legend>
</div>
@@ -352,7 +386,7 @@ export default {
:label="$p.t('lehre', 'lehrveranstaltung')"
type="select"
v-model="formData.lehrveranstaltung"
name="lehrveranstaltung"
name="lehrveranstaltung_id"
>
<option
v-for="lv in listLvs"
@@ -377,21 +411,43 @@ export default {
:teleport="true"
>
</form-input>
<form-input
container-class="col-6 stv-details-mobility-typ"
:label="$p.t('lehre', 'lehreinheit')"
type="select"
v-model="formData.lehreinheit"
name="lehreinheit"
<template v-if="formData.lehreinheit_id && !formData.lehrveranstaltung">
<form-input v-if="formData.lehreinheit_id"
container-class="col-6 stv-details-mobility-typ"
:label="$p.t('lehre', 'lehreinheit')"
type="select"
v-model="formData.lehreinheit_id"
name="lehreinheit_id"
disabled
>
<!-- <option
v-for="typ in arrTypen"
:key="typ.pruefungstyp_kurzbz"
:value="typ.pruefungstyp_kurzbz"
<option
v-for="le in lv_teile"
:key="le.lehreinheit_id"
:value="le.lehreinheit_id"
>
{{ le.kurzbz }}-{{ le.lehrform_kurzbz }} {{ le.bezeichnung }} {{ le.gruppe }} ({{ le.kuerzel }})
</option>
</form-input>
</template>
<template v-else>
<form-input
container-class="col-6 stv-details-mobility-typ"
:label="$p.t('lehre', 'lehreinheit')"
type="select"
v-model="formData.lehreinheit_id"
name="lehreinheit_id"
@focus="loadItems"
>
{{typ.beschreibung}}
</option>-->
</form-input>
<option v-if="!listLes.length" disabled> -- {{ $p.t('exam', 'bitteLvteilWaehlen') }} --</option>
<option
v-for="le in listLes"
:key="le.lehreinheit_id"
:value="le.lehreinheit_id"
>
{{ le.kurzbz }}-{{ le.lehrform_kurzbz }} {{ le.bezeichnung }} {{ le.gruppe }} ({{ le.kuerzel }})
</option>
</form-input>
</template>
</div>
<div class="row mb-3">
+20
View File
@@ -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
);