Studierendenverwaltung Projektbetreuer: default Stunden coming from global config, Stundensatz is requested each time BetreuerIn is selected

This commit is contained in:
Alexei Karpenko
2025-12-03 15:32:21 +01:00
parent eb1c3189b5
commit 77a1067ea5
4 changed files with 104 additions and 57 deletions
+9 -4
View File
@@ -83,10 +83,15 @@ if (!defined('ZGV_DOKTOR_ANZEIGEN') || !ZGV_DOKTOR_ANZEIGEN) {
$fieldsZgvDoktor
);
}
$config['tabs']['projektarbeit']['defaultProjektbetreuerStunden'] = '4.0';
$config['tabs']['projektarbeit']['defaultProjektbetreuerStundenDiplom'] = '5.0';
$config['tabs']['projektarbeit']['lvLektroinnenzuteilungFixangestelltStundensatz'] = true;
error_log(print_r(defined(FAS_STUDIERENDE_PROJEKTARBEIT_DEFAULT_BETREUER_STUNDEN_BACHELOR), true));
$config['tabs']['projektarbeit']['defaultProjektbetreuerStunden'] =
defined('FAS_STUDIERENDE_PROJEKTARBEIT_DEFAULT_BETREUER_STUNDEN_BACHELOR')
? FAS_STUDIERENDE_PROJEKTARBEIT_DEFAULT_BETREUER_STUNDEN_BACHELOR
: '0.0';
$config['tabs']['projektarbeit']['defaultProjektbetreuerStundenDiplom'] =
defined('FAS_STUDIERENDE_PROJEKTARBEIT_DEFAULT_BETREUER_STUNDEN_MASTER')
? FAS_STUDIERENDE_PROJEKTARBEIT_DEFAULT_BETREUER_STUNDEN_MASTER
: '0.0';
$config['tabs']['projektarbeit']['defaultProjektbetreuerStundensatz'] = '80.0';
$config['student_tab_order'] = [
@@ -114,18 +114,36 @@ class Projektbetreuer extends FHCAPI_Controller
if (!$this->ProjektarbeitModel->hasBerechtigungForProjektarbeit($projektarbeit_id))
return $this->_outputAuthError([$this->router->method => ['admin:rw', 'assistenz:rw']]);
if (isset($projektbetreuer['stunden']) && !isEmptyString($projektbetreuer['stunden']) && !is_numeric($projektbetreuer['stunden']))
{
return $this->terminateWithError(
$this->p->t('ui', 'error_fieldNotNumeric', ['field'=> 'Stunden', 'Field'=> 'Stunden']), self::ERROR_TYPE_GENERAL
);
}
if (isset($projektbetreuer['stundensatz']) && !isEmptyString($projektbetreuer['stundensatz']) && !is_numeric($projektbetreuer['stundensatz']))
{
return $this->terminateWithError(
$this->p->t('ui', 'error_fieldNotNumeric', ['field'=> 'Stundensatz', 'Field'=> 'Stundensatz']), self::ERROR_TYPE_GENERAL
);
}
$projektbetreuer = $this->input->post('projektbetreuer');
if ($this->_validate($projektbetreuer) == false) $this->terminateWithValidationErrors($this->form_validation->error_array());
$result = null;
$stunden = isset($projektbetreuer['stunden']) && !isEmptyString($projektbetreuer['stunden']) ? $projektbetreuer['stunden'] : null;
$stundensatz =
isset($projektbetreuer['stundensatz']) && !isEmptyString($projektbetreuer['stundensatz']) ? $projektbetreuer['stundensatz'] : null;
$betreuer = [
'projektarbeit_id' => $projektarbeit_id,
'person_id' => $projektbetreuer['person_id'],
'note' => $projektbetreuer['note'],
'stunden' => $projektbetreuer['stunden'],
'stundensatz' => $projektbetreuer['stundensatz'],
'stunden' => $stunden,
'stundensatz' => $stundensatz,
'betreuerart_kurzbz' => $projektbetreuer['betreuerart_kurzbz']
];
@@ -47,7 +47,6 @@ class Stundensatz_model extends DB_Model
{
$this->load->config('stv');
$useFixangestelltStundensatz = $this->config->item('tabs')['projektarbeit']['lvLektroinnenzuteilungFixangestelltStundensatz'];
$defaultStundensatz = $this->config->item('tabs')['projektarbeit']['defaultProjektbetreuerStundensatz'];
$stundensatz = '';
@@ -63,7 +62,7 @@ class Stundensatz_model extends DB_Model
{
$studiensemester = getData($result)[0];
if (isset($useFixangestelltStundensatz) && !$useFixangestelltStundensatz)
if (defined('FAS_LV_LEKTORINNENZUTEILUNG_FIXANGESTELLT_STUNDENSATZ') && !FAS_LV_LEKTORINNENZUTEILUNG_FIXANGESTELLT_STUNDENSATZ)
{
// load Mitarbeiter
$params = [$person_id];
@@ -83,19 +82,30 @@ class Stundensatz_model extends DB_Model
if (hasData($result))
{
foreach (getData($result) as $ma)
{
if (!$ma->fixangestellt)
{
$stundensatzRes = $this->getStundensatzByDatum(
$ma->mitarbeiter_uid, $studiensemester->start, $studiensemester->ende, 'lehre'
);
$ma = getData($result)[0];
if (hasData($stundensatzRes))
$stundensatz = getData($stundensatzRes)[0]->stundensatz;
else
$stundensatz = '0.00';
}
$this->load->model('vertragsbestandteil/Dienstverhaeltnis_model','DienstverhaeltnisModel');
$echterdv_result = $this->DienstverhaeltnisModel->existsDienstverhaeltnis(
$ma->mitarbeiter_uid,
$studiensemester->start,
$studiensemester->ende,
'echterdv'
);
if (hasData($echterdv_result))
{
$stundensatz = null;
}
else
{
$stundensatzRes = $this->getStundensatzByDatum(
$ma->mitarbeiter_uid, $studiensemester->start, $studiensemester->ende, 'lehre'
);
if (hasData($stundensatzRes))
$stundensatz = getData($stundensatzRes)[0]->stundensatz;
else
$stundensatz = '0.00';
}
}
else
@@ -152,6 +152,7 @@ export default {
stunden: null,
stundensatz: null
},
defaultStundensatz: null,
newMode: false,
editMode: false,
initialFormData: null,
@@ -179,45 +180,40 @@ export default {
actionEditProjektbetreuer(projektarbeit_id, person_id, betreuerart_kurzbz) {
this.editMode = true;
this.newMode = false;
this.$api
.call(ApiStvProjektbetreuer.getDefaultStundensaetze(person_id, this.studiensemester_kurzbz))
.then(result => {
this.resetForm();
this.resetForm();
this.getDefaultStundensaetze(person_id).finally(() => {
// get betreuer from tabulator list
let projektbetreuerListe = this.$refs.projektbetreuerTable.tabulator.getData();
const idx = projektbetreuerListe.findIndex(
betr =>
betr.person_id === person_id &&
betr.projektarbeit_id === projektarbeit_id &&
betr.betreuerart_kurzbz === betreuerart_kurzbz
);
// get betreuer from tabulator list
let projektbetreuerListe = this.$refs.projektbetreuerTable.tabulator.getData();
const idx = projektbetreuerListe.findIndex(
betr =>
betr.person_id === person_id &&
betr.projektarbeit_id === projektarbeit_id &&
betr.betreuerart_kurzbz === betreuerart_kurzbz
);
if (idx >= 0) { // if betreuer found
if (idx >= 0) { // if betreuer found
// set currently edited betreuer (deep copy)
this.formData = JSON.parse(JSON.stringify(projektbetreuerListe[idx]));
// set currently edited betreuer (deep copy)
this.formData = JSON.parse(JSON.stringify(projektbetreuerListe[idx]));
// set download link
if (this.formData.beurteilungDownloadLink !== null) this.beurteilungDownloadLink = this.formData.beurteilungDownloadLink;
// set download link
if (this.formData.beurteilungDownloadLink !== null) this.beurteilungDownloadLink = this.formData.beurteilungDownloadLink;
// set betreuer for autocomplete field
this.autocompleteSelectedBetreuer = {
person_id: this.formData.person_id,
name: this.formData.name,
vorname: this.formData.vorname,
nachname: this.formData.nachname,
vertrag_id: this.formData.vertrag_id
};
}
// set betreuer for autocomplete field
this.autocompleteSelectedBetreuer = {
person_id: this.formData.person_id,
name: this.formData.name,
vorname: this.formData.vorname,
nachname: this.formData.nachname,
vertrag_id: this.formData.vertrag_id
};
}
// set default stundensatz (if no other is set yet)
if (this.formData.stundensatz == null) this.formData.stundensatz = result.data;
// capture initial form data for detecting changes
this.captureFormData();
});
// capture initial form data for detecting changes
this.captureFormData();
})
.catch(this.$fhcAlert.handleSystemError);
},
actionDeleteProjektbetreuer(betreuer_id, projektarbeit_id, person_id, betreuerart_kurzbz) {
this.$fhcAlert
@@ -239,6 +235,7 @@ export default {
// default Stundensätze from config
this.defaultFormDataValues.stunden = this.getDefaultStunden(projekttyp_kurzbz);
this.defaultFormDataValues.stundensatz = this.config.defaultProjektbetreuerStundensatz;
this.defaultStundensatz = this.config.defaultProjektbetreuerStundensatz;
// get other initial data
this.$api
@@ -271,7 +268,7 @@ export default {
})
.catch(this.$fhcAlert.handleSystemError);
} else {
this.emptyBetreuer();
this.emptyBetreuerList();
}
},
saveProjektbetreuer() {
@@ -297,11 +294,13 @@ export default {
this.filteredBetreuer = result.data;
});
},
emptyBetreuer() {
emptyBetreuerList() {
this.$refs.projektbetreuerTable.tabulator.clearData();
},
resetForm() {
this.formData = this.getDefaultFormData();
const defaultFormData = this.getDefaultFormData();
this.formData = defaultFormData;
this.defaultStundensatz = defaultFormData.stundensatz;
if (this.beurteilungDownloadLink !== null) this.beurteilungDownloadLink = '';
this.autocompleteSelectedBetreuer = null;
this.initialFormData = null;
@@ -369,6 +368,16 @@ export default {
this.formData.stunden = defaultStunden;
}
},
getDefaultStundensaetze(person_id) {
return this.$api
.call(ApiStvProjektbetreuer.getDefaultStundensaetze(person_id, this.studiensemester_kurzbz))
.then(result => {
// set default stundensatz (if no other is set yet)
this.defaultStundensatz = result.data;
this.formData.stundensatz = result.data;
})
.catch(this.$fhcAlert.handleSystemError);
},
// check if form data has been modified since initial data has been captured
formDataModified() {
if (this.autocompleteSelectedBetreuer != null) return true;
@@ -401,6 +410,9 @@ export default {
// disable fields which are dependent on Vertrag status
disableVertragFields(statusAkzeptiert) {
this.vertragFieldsDisabled = statusAkzeptiert;
},
onBetreuerSelected(ev) {
this.getDefaultStundensaetze(ev.value.person_id);
}
},
template: `
@@ -422,7 +434,7 @@ export default {
>
</core-filter-cmpt>
<form-form ref="formProjektbetreuer" v-show="betreuerFormOpened" @submit.prevent>
<form-form ref="formProjektbetreuer" v-show="betreuerFormOpened" class="mt-3" @submit.prevent >
<div class="row mb-3">
<form-input
container-class="stv-details-projektarbeit-betreuer"
@@ -433,6 +445,8 @@ export default {
name="person_id"
:suggestions="filteredBetreuer"
@complete="searchBetreuer"
@item-select="onBetreuerSelected"
@option-select="onBetreuerSelected"
:min-length="3"
:disabled="vertragFieldsDisabled"
>
@@ -502,7 +516,7 @@ export default {
container-class="stv-details-projektarbeit-stundensatz"
type="text"
name="stundensatz"
:label="$p.t('projektarbeit', 'stundensatz')"
:label="$p.t('projektarbeit', 'stundensatz') + (defaultStundensatz ? ' (Default ' + defaultStundensatz + ')' : '')"
:disabled="vertragFieldsDisabled"
v-model="formData.stundensatz"
>