diff --git a/application/config/stv.php b/application/config/stv.php index 31ce3f521..1fdd5b28a 100644 --- a/application/config/stv.php +++ b/application/config/stv.php @@ -52,7 +52,11 @@ $config['tabs'] = ], ], ], - ] + ], + 'exemptions' => [ + //if true, Anrechnungen can be added and edited in tab Anrechnungen + 'editableAnrechnungen' => false, + ], ]; // List of fields to show when ZGV_DOKTOR_ANZEIGEN is defined diff --git a/application/controllers/api/frontend/v1/stv/Anrechnungen.php b/application/controllers/api/frontend/v1/stv/Anrechnungen.php new file mode 100644 index 000000000..85019334f --- /dev/null +++ b/application/controllers/api/frontend/v1/stv/Anrechnungen.php @@ -0,0 +1,241 @@ + ['admin:r', 'assistenz:r'], + 'deleteAnrechnung' => ['admin:rw', 'assistenz:rw'], + 'getLehrveranstaltungen' => ['admin:r', 'assistenz:r'], + 'getBegruendungen' => ['admin:r', 'assistenz:r'], + 'getLektoren' => ['admin:r', 'assistenz:r'], + 'getLvsKompatibel' => ['admin:r', 'assistenz:r'], + 'insertAnrechnung' => ['admin:rw', 'assistenz:rw'], + 'loadAnrechnung' => ['admin:rw', 'assistenz:rw'], + 'updateAnrechnung' => ['admin:rw', 'assistenz:rw'], + ]); + + // Load Libraries + $this->load->library('VariableLib', ['uid' => getAuthUID()]); + + // Load language phrases + $this->loadPhrases([ + 'ui', 'lehre' + ]); + + // Load models + $this->load->model('education/Anrechnung_model', 'AnrechnungsModel'); + } + + public function getAnrechnungen($prestudent_id) + { + $result = $this->AnrechnungsModel->getAnrechnungsData($prestudent_id); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + + public function getBegruendungen() + { + $this->load->model('education/Anrechnungbegruendung_model', 'AnrechnungbegrueundungsModel'); + + $result = $this->AnrechnungbegrueundungsModel->load(); + if (isError($result)) { + $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); + } + $this->terminateWithSuccess(getData($result) ?: []); + } + + public function getLehrveranstaltungen($prestudent_id) + { + $this->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel'); + $result = $this->PrestudentstatusModel->getLastStatus($prestudent_id); + + $data = $this->getDataOrTerminateWithError($result); + $studienplan_id = current($data)->studienplan_id; + + $this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel'); + $result = $this->LehrveranstaltungModel->getLvsByStudienplanId($studienplan_id); + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + + public function getLvsKompatibel($lehrveranstaltung_id) + { + $this->AnrechnungsModel->addJoin('lehre.tbl_lehrveranstaltung lv', 'ON (lv.lehrveranstaltung_id = lehre.tbl_anrechnung.lehrveranstaltung_id)'); + $result = $this->AnrechnungsModel->loadWhere( + ['lehrveranstaltung_id_kompatibel' => $lehrveranstaltung_id] + ); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + + public function getLektoren($studiengang_kz) + { + $this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel'); + + $result = $this->MitarbeiterModel->getLektoren($studiengang_kz); + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + + public function insertAnrechnung() + { + $this->load->library('form_validation'); + + $prestudent_id = $this->input->post('prestudent_id'); + + if(!$prestudent_id) + { + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Student UID']), self::ERROR_TYPE_GENERAL); + } + + $formData = $this->input->post('formData'); + $_POST['lehrveranstaltung_id'] = + (isset($formData['lehrveranstaltung_id']) && !empty($formData['lehrveranstaltung_id'])) + ? $formData['lehrveranstaltung_id'] + : null; + $_POST['lehrveranstaltung_id_kompatibel'] = + (isset($formData['lehrveranstaltung_id_kompatibel']) && !empty($formData['lehrveranstaltung_id_kompatibel'])) + ? $formData['lehrveranstaltung_id_kompatibel'] + : null; + $_POST['begruendung'] = + (isset($formData['begruendung_id']) && !empty($formData['begruendung_id'])) + ? $formData['begruendung_id'] + : null; + $_POST['genehmigtVon'] = (isset($formData['genehmigt_von']) && !empty($formData['genehmigt_von'])) + ? $formData['genehmigt_von'] + : null; + + $this->form_validation->set_rules('lehrveranstaltung_id', 'Lehrveranstaltung_id', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Lehrveranstaltung']) + ]); + + $this->form_validation->set_rules('begruendung', 'Begruendung', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Begruendung']) + ]); + + if($_POST['begruendung'] == 2) + { + $this->form_validation->set_rules('lehrveranstaltung_id_kompatibel', 'Lehrveranstaltung_id', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Lehrveranstaltung Kompatibel']) + ]); + } + + $this->form_validation->set_rules('genehmigtVon', 'GenehmigtVon', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'GenehmigtVon']) + ]); + + if ($this->form_validation->run() == false) + { + $this->terminateWithValidationErrors($this->form_validation->error_array()); + } + + $result = $this->AnrechnungsModel->insert( + [ + 'prestudent_id' => $prestudent_id, + 'lehrveranstaltung_id' => $_POST['lehrveranstaltung_id'], + 'lehrveranstaltung_id_kompatibel' => $_POST['lehrveranstaltung_id_kompatibel'], + 'begruendung_id' => $_POST['begruendung'], + 'genehmigt_von' => $_POST['genehmigtVon'] + ] + ); + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + + public function loadAnrechnung($anrechnung_id) + { + $result = $this->AnrechnungsModel->loadWhere( + array('anrechnung_id' => $anrechnung_id) + ); + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess(current($data)); + } + + public function updateAnrechnung() + { + $this->load->library('form_validation'); + + $anrechnung_id = $this->input->post('anrechnung_id'); + + if(!$anrechnung_id) + { + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Anrechnung UID']), self::ERROR_TYPE_GENERAL); + } + + $formData = $this->input->post('formData'); + $_POST['lehrveranstaltung_id'] = + (isset($formData['lehrveranstaltung_id']) && !empty($formData['lehrveranstaltung_id'])) + ? $formData['lehrveranstaltung_id'] + : null; + $_POST['lehrveranstaltung_id_kompatibel'] = + (isset($formData['lehrveranstaltung_id_kompatibel']) && !empty($formData['lehrveranstaltung_id_kompatibel'])) + ? $formData['lehrveranstaltung_id_kompatibel'] + : null; + $_POST['begruendung'] = (isset($formData['begruendung_id']) && !empty($formData['begruendung_id'])) ? $formData['begruendung_id'] : null; + $_POST['genehmigtVon'] = (isset($formData['genehmigt_von']) && !empty($formData['genehmigt_von'])) ? $formData['genehmigt_von'] : null; + + $this->form_validation->set_rules('lehrveranstaltung_id', 'Lehrveranstaltung_id', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Lehrveranstaltung']) + ]); + + $this->form_validation->set_rules('begruendung', 'Begruendung', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Begruendung']) + ]); + + if($_POST['begruendung'] == 2) + { + $this->form_validation->set_rules('lehrveranstaltung_id_kompatibel', 'Lehrveranstaltung_id', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Lehrveranstaltung Kompatibel']) + ]); + } + + $this->form_validation->set_rules('genehmigtVon', 'GenehmigtVon', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'GenehmigtVon']) + ]); + + if ($this->form_validation->run() == false) + { + $this->terminateWithValidationErrors($this->form_validation->error_array()); + } + + $result = $this->AnrechnungsModel->update( + [ + 'anrechnung_id' => $anrechnung_id, + ], + [ + + 'lehrveranstaltung_id' => $_POST['lehrveranstaltung_id'], + 'lehrveranstaltung_id_kompatibel' => $_POST['lehrveranstaltung_id_kompatibel'], + 'begruendung_id' => $_POST['begruendung'], + 'genehmigt_von' => $_POST['genehmigtVon'] + ] + ); + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + + public function deleteAnrechnung($anrechnung_id) + { + $result = $this->AnrechnungsModel->delete( + array('anrechnung_id' => $anrechnung_id) + ); + + $data = $this->getDataOrTerminateWithError($result); + $this->terminateWithSuccess($data); + } +} diff --git a/application/controllers/api/frontend/v1/stv/Config.php b/application/controllers/api/frontend/v1/stv/Config.php index bcea93fb5..f717137a2 100644 --- a/application/controllers/api/frontend/v1/stv/Config.php +++ b/application/controllers/api/frontend/v1/stv/Config.php @@ -130,6 +130,12 @@ class Config extends FHCAPI_Controller 'component' => './Stv/Studentenverwaltung/Details/Pruefung.js' ]; + $result['exemptions'] = [ + 'title' => $this->p->t('lehre', 'anrechnungen'), + 'component' => './Stv/Studentenverwaltung/Details/Anrechnungen.js', + 'config' => $config['exemptions'] + ]; + $result['finalexam'] = [ 'title' => $this->p->t('stv', 'tab_finalexam'), 'component' => './Stv/Studentenverwaltung/Details/Abschlusspruefung.js', diff --git a/application/models/education/Anrechnung_model.php b/application/models/education/Anrechnung_model.php index cbfdb6607..0b81be80c 100644 --- a/application/models/education/Anrechnung_model.php +++ b/application/models/education/Anrechnung_model.php @@ -202,4 +202,66 @@ class Anrechnung_model extends DB_Model return success(); } + + /** + * Get Anrechnungsdata for Table Anrechnungen + * + * @param $prestudent_id + * @return array + */ + public function getAnrechnungsData($prestudent_id) + { + $qry = ' + SELECT + lehre.tbl_anrechnung.anrechnung_id, + lehre.tbl_anrechnung.prestudent_id, + lehre.tbl_anrechnung.lehrveranstaltung_id, + lehre.tbl_lehrveranstaltung.bezeichnung AS bez_lehrveranstaltung, + lehre.tbl_anrechnung_begruendung.bezeichnung AS begruendung, + lehre.tbl_anrechnung_anrechnungstatus.status_kurzbz AS status, + genehmigt_von, + lehre.tbl_anrechnung.insertamum, + lehre.tbl_anrechnung.insertvon, + lehre.tbl_anrechnung.updateamum, + lehre.tbl_anrechnung.updatevon, + lehrveranstaltung_id_kompatibel, + lv_comp.bezeichnung as lehrveranstaltung_bez_kompatibel, + count(nz.notizzuordnung_id) AS notizen_anzahl + FROM + lehre.tbl_anrechnung + JOIN lehre.tbl_lehrveranstaltung USING (lehrveranstaltung_id) + LEFT JOIN lehre.tbl_lehrveranstaltung lv_comp ON (lehre.tbl_anrechnung.lehrveranstaltung_id_kompatibel = lv_comp.lehrveranstaltung_id) + JOIN lehre.tbl_anrechnung_begruendung USING (begruendung_id) + LEFT JOIN lehre.tbl_anrechnung_anrechnungstatus ON (lehre.tbl_anrechnung_anrechnungstatus.anrechnung_id = lehre.tbl_anrechnung.anrechnung_id) + AND lehre.tbl_anrechnung_anrechnungstatus.insertamum = ( + SELECT MAX(insertamum) + FROM lehre.tbl_anrechnung_anrechnungstatus + WHERE anrechnung_id = lehre.tbl_anrechnung.anrechnung_id + ) + LEFT JOIN lehre.tbl_anrechnungstatus USING (status_kurzbz) + LEFT JOIN public.tbl_notizzuordnung nz ON (nz.anrechnung_id = lehre.tbl_anrechnung.anrechnung_id) + WHERE + lehre.tbl_anrechnung.prestudent_id = ? + GROUP BY + nz.anrechnung_id, + lehre.tbl_anrechnung.anrechnung_id, + lehre.tbl_anrechnung.prestudent_id, + lehre.tbl_anrechnung.lehrveranstaltung_id, + bez_lehrveranstaltung, + begruendung, + status, + genehmigt_von, + lehre.tbl_anrechnung.insertamum, + lehre.tbl_anrechnung.insertvon, + lehre.tbl_anrechnung.updateamum, + lehre.tbl_anrechnung.updatevon, + lehrveranstaltung_id_kompatibel, + lehrveranstaltung_bez_kompatibel + ORDER BY + lehre.tbl_anrechnung.updateamum ASC + '; + + return $this->execQuery($qry, array($prestudent_id)); + + } } diff --git a/application/models/education/Lehrveranstaltung_model.php b/application/models/education/Lehrveranstaltung_model.php index 056fb45d7..77ed7b4b0 100644 --- a/application/models/education/Lehrveranstaltung_model.php +++ b/application/models/education/Lehrveranstaltung_model.php @@ -988,4 +988,41 @@ class Lehrveranstaltung_model extends DB_Model return $this->execQuery($qry, $params); } + + /** + * Gets lehrveranstaltungen of Studienplan + * @param $studienplan_id ID des Studienplans + * @param $semester Semester optional + * @return array|null + */ + public function getLvsByStudienplanId($studienplan_id, $semester = null) + { + $params = array($studienplan_id); + + $qry = "SELECT tbl_lehrveranstaltung.*, + tbl_studienplan_lehrveranstaltung.studienplan_lehrveranstaltung_id, + tbl_studienplan_lehrveranstaltung.semester as stpllv_semester, + tbl_studienplan_lehrveranstaltung.pflicht as stpllv_pflicht, + tbl_studienplan_lehrveranstaltung.koordinator as stpllv_koordinator, + tbl_studienplan_lehrveranstaltung.studienplan_lehrveranstaltung_id_parent, + tbl_studienplan_lehrveranstaltung.sort stpllv_sort, + tbl_studienplan_lehrveranstaltung.curriculum, + tbl_studienplan_lehrveranstaltung.export, + tbl_studienplan_lehrveranstaltung.genehmigung + FROM lehre.tbl_lehrveranstaltung + JOIN lehre.tbl_studienplan_lehrveranstaltung + USING(lehrveranstaltung_id) + WHERE tbl_studienplan_lehrveranstaltung.studienplan_id = ? + "; + + if ($semester !== null) + { + $qry.= " AND tbl_studienplan_lehrveranstaltung.semester = ?"; + $params[] = $semester; + } + + $qry .= " ORDER BY stpllv_sort, semester, sort"; + + return $this->execQuery($qry, $params); + } } diff --git a/application/models/ressource/Mitarbeiter_model.php b/application/models/ressource/Mitarbeiter_model.php index 836f5d65a..2b652c65b 100644 --- a/application/models/ressource/Mitarbeiter_model.php +++ b/application/models/ressource/Mitarbeiter_model.php @@ -261,9 +261,9 @@ class Mitarbeiter_model extends DB_Model * @param $lehrveranstaltung_id * @return array with Mitarbeiter and their Lehreinheiten */ - public function getMitarbeiterFromLV($lehrveranstaltung_id){ - //TODO(manu) maybe filter that in pruefungslist.js ? - $qry = "SELECT DISTINCT + public function getMitarbeiterFromLV($lehrveranstaltung_id) + { + $qry = "SELECT DISTINCT lehrveranstaltung_id, uid, vorname, wahlname, vornamen, nachname, titelpre, titelpost, kurzbz, mitarbeiter_uid FROM lehre.tbl_lehreinheitmitarbeiter, campus.vw_mitarbeiter, lehre.tbl_lehreinheit @@ -278,4 +278,33 @@ class Mitarbeiter_model extends DB_Model return $this->execQuery($qry, $parametersArray); } + + /** + * Get Lektoren by studiengang_kz + * + * @param $studiengang_kz + * @return array with Mitarbeiter + */ + public function getLektoren($studiengang_kz) + { + $qry = " + SELECT DISTINCT + campus.vw_mitarbeiter.uid, + campus.vw_mitarbeiter.vorname, + campus.vw_mitarbeiter.nachname, + studiengang_kz, + tbl_studiengang.typ, + tbl_studiengang.kurzbz AS stg_kurzbz + FROM + campus.vw_mitarbeiter + JOIN public.tbl_benutzerfunktion USING (uid) + JOIN public.tbl_studiengang USING(oe_kurzbz) + WHERE studiengang_kz = ? + AND lektor is true + ORDER BY campus.vw_mitarbeiter.nachname"; + + $parametersArray = array($studiengang_kz); + + return $this->execQuery($qry, $parametersArray); + } } diff --git a/public/js/api/factory/stv/exemptions.js b/public/js/api/factory/stv/exemptions.js new file mode 100644 index 000000000..2bf8ee610 --- /dev/null +++ b/public/js/api/factory/stv/exemptions.js @@ -0,0 +1,75 @@ +/** + * Copyright (C) 2025 fhcomplete.org + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +export default { + getAnrechnungen(id) { + return { + method: 'get', + url: 'api/frontend/v1/stv/anrechnungen/getAnrechnungen/' + id + }; + }, + getLehrveranstaltungen(prestudent_id){ + return { + method: 'get', + url: 'api/frontend/v1/stv/anrechnungen/getLehrveranstaltungen/' + prestudent_id + }; + }, + getBegruendungen(){ + return { + method: 'get', + url: 'api/frontend/v1/stv/anrechnungen/getBegruendungen/' + }; + }, + getLvsKompatibel(lv_id){ + return { + method: 'get', + url: 'api/frontend/v1/stv/anrechnungen/getLvsKompatibel/' + lv_id + }; + }, + getLektoren(studiengang_kz){ + return { + method: 'get', + url: 'api/frontend/v1/stv/anrechnungen/getLektoren/' + studiengang_kz + }; + }, + addNewAnrechnung(params){ + return { + method: 'post', + url: 'api/frontend/v1/stv/anrechnungen/insertAnrechnung/', + params + }; + }, + loadAnrechnung(anrechnung_id){ + return { + method: 'get', + url: 'api/frontend/v1/stv/anrechnungen/loadAnrechnung/' + anrechnung_id + }; + }, + editAnrechnung(params){ + return { + method: 'post', + url: 'api/frontend/v1/stv/anrechnungen/updateAnrechnung/', + params + }; + }, + deleteAnrechnung(anrechnung_id){ + return { + method: 'post', + url: 'api/frontend/v1/stv/anrechnungen/deleteAnrechnung/' + anrechnung_id + }; + }, +} diff --git a/public/js/api/stv.js b/public/js/api/stv.js index 6120a5828..7a6022fb9 100644 --- a/public/js/api/stv.js +++ b/public/js/api/stv.js @@ -13,6 +13,7 @@ import grades from './stv/grades.js'; import mobility from './stv/mobility.js'; import archiv from './stv/archiv.js'; import documents from './stv/documents.js'; +import exemptions from './stv/exemptions.js'; export default { verband, @@ -30,6 +31,7 @@ export default { mobility, archiv, documents, + exemptions, configStudent() { return this.$fhcApi.get('api/frontend/v1/stv/config/student'); }, diff --git a/public/js/api/stv/exemptions.js b/public/js/api/stv/exemptions.js new file mode 100644 index 000000000..f8b421200 --- /dev/null +++ b/public/js/api/stv/exemptions.js @@ -0,0 +1,29 @@ +export default { + getAnrechnungen(url, config, params) { + return this.$fhcApi.get('api/frontend/v1/stv/anrechnungen/getAnrechnungen/' + params.id); + }, + getLehrveranstaltungen(prestudent_id){ + return this.$fhcApi.get('api/frontend/v1/stv/anrechnungen/getLehrveranstaltungen/' + prestudent_id); + }, + getBegruendungen(){ + return this.$fhcApi.get('api/frontend/v1/stv/anrechnungen/getBegruendungen/'); + }, + getLvsKompatibel(lv_id){ + return this.$fhcApi.get('api/frontend/v1/stv/anrechnungen/getLvsKompatibel/' + lv_id); + }, + getLektoren(studiengang_kz){ + return this.$fhcApi.get('api/frontend/v1/stv/anrechnungen/getLektoren/' + studiengang_kz); + }, + addNewAnrechnung(form, data){ + return this.$fhcApi.post(form, 'api/frontend/v1/stv/anrechnungen/insertAnrechnung/', data); + }, + loadAnrechnung(anrechnung_id){ + return this.$fhcApi.get('api/frontend/v1/stv/anrechnungen/loadAnrechnung/' + anrechnung_id); + }, + editAnrechnung(form, data){ + return this.$fhcApi.post(form, 'api/frontend/v1/stv/anrechnungen/updateAnrechnung/', data); + }, + deleteAnrechnung(anrechnung_id){ + return this.$fhcApi.post('api/frontend/v1/stv/anrechnungen/deleteAnrechnung/' + anrechnung_id); + }, +} \ No newline at end of file diff --git a/public/js/components/Stv/Studentenverwaltung/Details/Anrechnungen.js b/public/js/components/Stv/Studentenverwaltung/Details/Anrechnungen.js new file mode 100644 index 000000000..c98f0598f --- /dev/null +++ b/public/js/components/Stv/Studentenverwaltung/Details/Anrechnungen.js @@ -0,0 +1,26 @@ +import AnrechnungenList from './Anrechnungen/Anrechnungen.js'; + +export default { + name: "TabExemptions", + components: { + AnrechnungenList + }, + provide() { + return { + config: this.config + }; + }, + props: { + modelValue: Object, + config: Object + }, + methods: { + reload() { + this.$refs.anrechnungen.$refs.table.reloadTable(); + } + }, + template: ` +
+ +
` +}; \ No newline at end of file diff --git a/public/js/components/Stv/Studentenverwaltung/Details/Anrechnungen/Anrechnungen.js b/public/js/components/Stv/Studentenverwaltung/Details/Anrechnungen/Anrechnungen.js new file mode 100644 index 000000000..1d6bd20df --- /dev/null +++ b/public/js/components/Stv/Studentenverwaltung/Details/Anrechnungen/Anrechnungen.js @@ -0,0 +1,442 @@ +import {CoreFilterCmpt} from "../../../../filter/Filter.js"; +import BsModal from "../../../../Bootstrap/Modal.js"; +import CoreForm from "../../../../Form/Form.js"; +import FormInput from "../../../../Form/Input.js"; +import CoreNotiz from "../../../../Notiz/Notiz.js"; + +import ApiStvExemptions from "../../../../../api/factory/stv/exemptions.js"; +import ApiNotizPerson from '../../../../../api/factory/notiz/person.js'; + +export default { + name: "ExemptionComponent", + components: { + CoreFilterCmpt, + BsModal, + CoreForm, + FormInput, + CoreNotiz + }, + inject: { + $reloadList: { + from: '$reloadList', + required: true + }, + config: { + from: 'config', + required: true + }, + }, + props: { + student: Object + }, + data() { + return { + tabulatorOptions: { + ajaxURL: 'dummy', + ajaxRequestFunc: () => this.$api.call( + ApiStvExemptions.getAnrechnungen(this.student.prestudent_id) + ), + ajaxResponse: (url, params, response) => response.data, + columns: [ + {title: "anrechnung_id", field: "anrechnung_id", visible: false}, + {title: "lehrveranstaltung_id", field: "lehrveranstaltung_id", visible: false}, + {title: "Lehrveranstaltung", field: "bez_lehrveranstaltung"}, + {title: "Begründung", field: "begruendung"}, + {title: "lehrveranstaltung_id_kompatibel", field: "lehrveranstaltung_id_kompatibel", visible: false}, + {title: "lehrveranstaltung_bez_kompatibel", field: "lehrveranstaltung_bez_kompatibel"}, + {title: "status", field: "status"}, + {title: "genehmigt_von", field: "genehmigt_von"}, + {title: "notizen_anzahl", field: "notizen_anzahl", visible: false}, + {title: "Datum", field: "insertamum", + formatter: function (cell) { + const dateStr = cell.getValue(); + if (!dateStr) return ""; + + const date = new Date(dateStr); + return date.toLocaleString("de-DE", { + day: "2-digit", + month: "2-digit", + year: "numeric", + }); + } + }, + { + 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"; + + if(this.config.editableAnrechnungen){ + let buttonEdit = document.createElement('button'); + buttonEdit.className = 'btn btn-outline-secondary btn-action'; + buttonEdit.innerHTML = ''; + buttonEdit.title = this.$p.t('ui', 'bearbeiten'); + buttonEdit.addEventListener('click', (event) => + this.actionEditAnrechnung(cell.getData().anrechnung_id) + ); + container.append(buttonEdit); + } + + let 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.actionDeleteAnrechnung(cell.getData().anrechnung_id) + ); + container.append(button); + + let countNotizen = cell.getData().notizen_anzahl; + let buttonNotes = document.createElement('button'); + buttonNotes.className = 'btn btn-outline-secondary btn-action'; + if (countNotizen > 0){ + buttonNotes.innerHTML = countNotizen + this.$p.t('anrechnung', 'existingNotes'); + } + else + buttonNotes.innerHTML = '+' + this.$p.t('global', 'notiz'); + + buttonNotes.addEventListener('click', (event) => + this.addNote(cell.getData().anrechnung_id) + ); + container.append(buttonNotes); + + return container; + }, + frozen: true + }, + ], + layout: 'fitDataFill', + height: '500', + index: 'anrechnung_id', + persistenceID: 'stv-details-anrechnungen' + }, + tabulatorEvents: [ + { + event: 'tableBuilt', + handler: async () => { + + await this.$p.loadCategory(['anrechnungen', 'global', 'ui', 'lehre']); + + let cm = this.$refs.table.tabulator.columnManager; + + cm.getColumnByField('anrechnung_id').component.updateDefinition({ + title: this.$p.t('ui', 'anrechnung_id'), + }); + cm.getColumnByField('lehrveranstaltung_id').component.updateDefinition({ + title: this.$p.t('lehre', 'lehrveranstaltung_id'), + }); + cm.getColumnByField('bez_lehrveranstaltung').component.updateDefinition({ + title: this.$p.t('lehre', 'lehrveranstaltung'), + }); + cm.getColumnByField('begruendung').component.updateDefinition({ + title: this.$p.t('global', 'begruendung'), + }); + cm.getColumnByField('lehrveranstaltung_id_kompatibel').component.updateDefinition({ + title: this.$p.t('anrechnung', 'lehrveranstaltung_id_kompatibel'), + }); + cm.getColumnByField('lehrveranstaltung_bez_kompatibel').component.updateDefinition({ + title: this.$p.t('anrechnung', 'lehrveranstaltung_bez_kompatibel'), + }); + cm.getColumnByField('genehmigt_von').component.updateDefinition({ + title: this.$p.t('anrechnung', 'genehmigtVon'), + }); + cm.getColumnByField('notizen_anzahl').component.updateDefinition({ + title: this.$p.t('anrechnung', 'existingNotes'), + }); + cm.getColumnByField('insertamum').component.updateDefinition({ + title: this.$p.t('global', 'datum'), + }); + + } + } + ], + formData: {}, + listBegruendungen: [], + listNewLehrveranstaltungen: [], + listLektoren: [], + listKompatibleLehrveranstaltungen: [], + statusNew: true, + showNotizen: false, + currentAnrechnung_id: null, + endpoint: ApiNotizPerson + } + }, + watch: { + student(){ + if (this.$refs.table) { + this.$refs.table.reloadTable(); + } + }, + }, + methods: { + actionNewAnrechnung(){ + this.statusNew = true; + this.$refs.anrechnungsModal.show(); + }, + actionEditAnrechnung(anrechnung_id){ + this.resetForm(); + this.statusNew = false; + this.loadAnrechnung(anrechnung_id); + this.$refs.anrechnungsModal.show(); + }, + addNote(anrechnung_id){ + this.currentAnrechnung_id = anrechnung_id; + this.showNotizen = true; + }, + addNewAnrechnung(){ + const dataToSend = { + prestudent_id: this.student.prestudent_id, + formData: this.formData + }; + + return this.$refs.formExemptions + .call(ApiStvExemptions.addNewAnrechnung(dataToSend)) + .then(response => { + this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successSave')); + this.$refs.anrechnungsModal.hide(); + this.resetForm(); + }) + .catch(this.$fhcAlert.handleSystemError) + .finally(() => { + this.reload(); + }); + }, + editAnrechnung(anrechnung_id){ + const dataToSend = { + anrechnung_id: anrechnung_id, + formData: this.formData + }; + return this.$refs.formExemptions + .call(ApiStvExemptions.editAnrechnung(dataToSend)) + .then(response => { + this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successSave')); + this.$refs.anrechnungsModal.hide(); + this.resetForm(); + }) + .catch(this.$fhcAlert.handleSystemError) + .finally(() => { + this.reload(); + }); + }, + actionDeleteAnrechnung(anrechnung_id) { + this.$fhcAlert + .confirmDelete() + .then(result => result + ? anrechnung_id + : Promise.reject({handled: true})) + .then(this.deleteAnrechnung) + .catch(this.$fhcAlert.handleSystemError); + }, + deleteAnrechnung(anrechnung_id){ + return this.$api + .call(ApiStvExemptions.deleteAnrechnung(anrechnung_id)) + .then(response => { + this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successDelete')); + }) + .catch(this.$fhcAlert.handleSystemError) + .finally(() => { + this.reload(); + }); + }, + getLvsKompatibel(){ + if(this.formData.lehrveranstaltung_id) { + this.$api + .call(ApiStvExemptions.getLvsKompatibel(this.formData.lehrveranstaltung_id)) + .then(result => { + this.listKompatibleLehrveranstaltungen = result.data; + }) + .catch(this.$fhcAlert.handleSystemError); + } + }, + handleInput(){ + if(this.formData.begruendung == 2) { + this.getLvsKompatibel(); + } + }, + loadAnrechnung(anrechnung_id){ + return this.$api + .call(ApiStvExemptions.loadAnrechnung(anrechnung_id)) + .then(result => { + this.formData = result.data; + this.getLvsKompatibel(); + }) + .catch(this.$fhcAlert.handleSystemError); + }, + reload() { + this.$refs.table.reloadTable(); + }, + resetForm(){ + this.formData = {}; + this.statusNew = true; + }, + resetLvKompatibel(){ + this.formData.lehrveranstaltung_id_kompatibel = null; + this.handleInput(); + } + }, + created() { + this.$api + .call(ApiStvExemptions.getLehrveranstaltungen(this.student.prestudent_id)) + .then(result => { + this.listNewLehrveranstaltungen = result.data; + }) + .catch(this.$fhcAlert.handleSystemError); + + this.$api + .call(ApiStvExemptions.getBegruendungen()) + .then(result => { + this.listBegruendungen = result.data; + }) + .catch(this.$fhcAlert.handleSystemError); + + this.$api + .call(ApiStvExemptions.getLektoren(this.student.studiengang_kz)) + .then(result => { + this.listLektoren = result.data; + }) + .catch(this.$fhcAlert.handleSystemError); + + }, + template: ` +
+
{{$p.t('lehre', 'anrechnungen')}}
+ +
+
+ + +
+ + + +
+ + + + + + + + +
+ + + +
+ +
+ + + +
+ + +
+ + + +
+ +
+ + + +
+
+ + + +
+ ` +} \ No newline at end of file diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php index 7ce22f0a0..b91294817 100644 --- a/system/phrasesupdate.php +++ b/system/phrasesupdate.php @@ -42805,6 +42805,148 @@ and represent the current state of research on the topic. The prescribed citatio ) ), // FHC4 Studierendenverwaltung Dokumente END + // FHC4 Phrases Anrechnungen Start + array( + 'app' => 'core', + 'category' => 'anrechnung', + 'phrase' => 'begruendung', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Begründung', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Reason', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'anrechnung', + 'phrase' => 'genehmigtVon', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'genehmigt von', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'approved by', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'anrechnung', + 'phrase' => 'editAnrechnung', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => "Anrechnung bearbeiten", + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => "Edit Exemption", + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'anrechnung', + 'phrase' => 'existingNotes', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => " Notiz(en)", + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => " note(s)", + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'ui', + 'phrase' => 'anrechnung_id', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Anrechnung ID', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Exemption ID', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'anrechnung', + 'phrase' => 'lehrveranstaltung_id_kompatibel', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'LV kompatibel ID', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Course compatible ID', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'anrechnung', + 'phrase' => 'lehrveranstaltung_bez_kompatibel', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'LV kompatibel', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Course compatible', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + // FHC4 Phrases Anrechnungen End );