Merge branch 'feature-60875/FHC4_Studierendenverwaltung_Anrechnungen' into merge_FHC4_55354_55991_55992_60874_60875_61229_61230_61231

This commit is contained in:
Harald Bamberger
2025-05-21 15:42:17 +02:00
12 changed files with 1099 additions and 4 deletions
+5 -1
View File
@@ -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
@@ -0,0 +1,241 @@
<?php
if (! defined('BASEPATH')) exit('No direct script access allowed');
use \DateTime as DateTime;
class Anrechnungen extends FHCAPI_Controller
{
public function __construct()
{
parent::__construct([
'getAnrechnungen' => ['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);
}
}
@@ -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',
@@ -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));
}
}
@@ -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);
}
}
@@ -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);
}
}
+75
View File
@@ -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 <https://www.gnu.org/licenses/>.
*/
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
};
},
}
+2
View File
@@ -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');
},
+29
View File
@@ -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);
},
}
@@ -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: `
<div class="stv-details-anrechnungen h-100 d-flex flex-column">
<anrechnungen-list ref="anrechnungen" :student="modelValue"></anrechnungen-list>
</div>`
};
@@ -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 = '<i class="fa fa-edit"></i>';
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 = '<i class="fa fa-xmark"></i>';
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: `
<div class="stv-details-tab_exemptions h-100 pb-3">
<h5>{{$p.t('lehre', 'anrechnungen')}}</h5>
<div v-if="showNotizen" class="border p-3 overflow-auto" style="height: 200px;">
<div class="justify-content-end pb-3">
<form-input
container-class="form-switch"
type="checkbox"
label="Notizen"
v-model="showNotizen"
@change="onSwitchHide"
>
</form-input>
</div>
<core-notiz
:endpoint="endpoint"
ref="formNotes"
notiz-layout="popupModal"
typeId="anrechnung_id"
:id="currentAnrechnung_id"
show-document
show-tiny-mce
:visibleColumns="['titel','text','verfasser','bearbeiter','dokumente']"
>
</core-notiz>
</div>
<template v-if="config.editableAnrechnungen" >
<core-filter-cmpt
ref="table"
:tabulator-options="tabulatorOptions"
:tabulator-events="tabulatorEvents"
table-only
:side-menu="false"
reload
new-btn-show
:new-btn-label="this.$p.t('lehre', 'anrechnung')"
@click:new="actionNewAnrechnung"
>
</core-filter-cmpt>
</template>
<template v-else>
<core-filter-cmpt
ref="table"
:tabulator-options="tabulatorOptions"
:tabulator-events="tabulatorEvents"
table-only
:side-menu="false"
reload
>
</core-filter-cmpt>
</template>
<bs-modal ref="anrechnungsModal" dialog-class="modal-dialog-scrollable" >
<template #title>
<p v-if="statusNew" class="fw-bold mt-3">{{$p.t('anrechnung', 'neueAnrechnung')}}</p>
<p v-else class="fw-bold mt-3">{{$p.t('anrechnung', 'editAnrechnung')}}</p>
</template>
<core-form ref="formExemptions">
<div class="row mb-3">
<form-input
type="select"
:label="$p.t('lehre/lehrveranstaltung')"
name="lehrveranstaltung"
v-model="formData.lehrveranstaltung_id"
@change="resetLvKompatibel"
>
<option
v-for="entry in listNewLehrveranstaltungen"
:key="entry.lehrveranstaltung_id"
:value="entry.lehrveranstaltung_id"
>
{{entry.bezeichnung}} Semester {{entry.semester}} {{entry.lehrform_kurzbz}}
</option>
</form-input>
</div>
<div class="row mb-3">
<form-input
type="select"
:label="$p.t('anrechnung/begruendung')"
name="begruendung"
v-model="formData.begruendung_id"
@change="handleInput"
>
<option
v-for="entry in listBegruendungen"
:key="entry.begruendung_id"
:value="entry.begruendung_id"
>
{{entry.bezeichnung}}
</option>
</form-input>
</div>
<!--is shown when typ == kompatible LV-->
<div v-if="formData.begruendung_id == '2'" class="row mb-3">
<form-input
type="select"
label="Lehrveranstaltung Kompatibel"
name="lehrveranstaltung_id_kompatibel"
v-model="formData.lehrveranstaltung_id_kompatibel"
>
<option
v-for="entry in listKompatibleLehrveranstaltungen"
:key="entry.lehrveranstaltung_id"
:value="entry.lehrveranstaltung_id"
>
{{entry.bezeichnung}} Semester {{entry.semester}} {{entry.lehrform_kurzbz}}
</option>
</form-input>
</div>
<div class="row mb-3">
<form-input
type="select"
:label="$p.t('anrechnung/genehmigtVon')"
name="genehmigtVon"
v-model="formData.genehmigt_von"
>
<option
v-for="entry in listLektoren"
:key="entry.uid"
:value="entry.uid"
>
{{entry.nachname}} {{entry.vorname}}
</option>
</form-input>
</div>
</core-form>
<template #footer>
<button v-if="statusNew" type="button" class="btn btn-primary" @click="addNewAnrechnung">{{$p.t('ui', 'speichern')}}</button>
<button v-else type="button" class="btn btn-primary" @click="editAnrechnung(formData.anrechnung_id)">{{$p.t('ui', 'speichern')}}</button>
</template>
</bs-modal>
`
}
+142
View File
@@ -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
);