diff --git a/application/controllers/api/frontend/v1/stv/Projektarbeit.php b/application/controllers/api/frontend/v1/stv/Projektarbeit.php index 168472b62..1752cee92 100644 --- a/application/controllers/api/frontend/v1/stv/Projektarbeit.php +++ b/application/controllers/api/frontend/v1/stv/Projektarbeit.php @@ -55,10 +55,7 @@ class Projektarbeit extends FHCAPI_Controller $result = $this->ProjektarbeitModel->getProjektarbeit($student_uid); - if (isError($result)) - { - $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); - } + if (isError($result)) $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); if (!hasData($result)) $this->terminateWithSuccess([]); diff --git a/application/controllers/api/frontend/v1/stv/Projektbetreuer.php b/application/controllers/api/frontend/v1/stv/Projektbetreuer.php index a84248a35..4eec773c5 100644 --- a/application/controllers/api/frontend/v1/stv/Projektbetreuer.php +++ b/application/controllers/api/frontend/v1/stv/Projektbetreuer.php @@ -50,21 +50,30 @@ class Projektbetreuer extends FHCAPI_Controller if (!isset($projektarbeit_id)) $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Projektarbeit ID']), self::ERROR_TYPE_GENERAL); - $this->ProjektbetreuerModel->addSelect( - 'projektarbeit_id, person_id, nachname, vorname, note, punkte, round(stunden, 1) AS stunden, - stundensatz, betreuerart_kurzbz, vertrag_id, titelpre, titelpost' - ); - $this->ProjektbetreuerModel->addSelect("CASE - WHEN EXISTS - (SELECT 1 FROM public.tbl_benutzer JOIN public.tbl_mitarbeiter ON(uid=mitarbeiter_uid) WHERE person_id=pers.person_id) - THEN 'Mitarbeiter' - WHEN EXISTS - (SELECT 1 FROM public.tbl_benutzer JOIN public.tbl_student ON(uid=student_uid) WHERE person_id=pers.person_id) - THEN 'Student' - ELSE 'Person' - END AS status"); - $this->ProjektbetreuerModel->addJoin('public.tbl_person pers', 'person_id'); - $result = $this->ProjektbetreuerModel->loadWhere(['projektarbeit_id' => $projektarbeit_id]); + $qry = " + SELECT * FROM ( + SELECT + projektarbeit_id, person_id, nachname, vorname, note, punkte, round(stunden, 1) AS stunden, + stundensatz, betreuerart_kurzbz, vertrag_id, titelpre, titelpost, + CASE + WHEN EXISTS + (SELECT 1 FROM public.tbl_benutzer JOIN public.tbl_mitarbeiter ON(uid=mitarbeiter_uid) WHERE person_id=pers.person_id) + THEN 'Mitarbeiter' + WHEN EXISTS + (SELECT 1 FROM public.tbl_benutzer JOIN public.tbl_student ON(uid=student_uid) WHERE person_id=pers.person_id) + THEN 'Student' + ELSE 'Person' + END AS status + FROM + lehre.tbl_projektbetreuer + JOIN public.tbl_person pers USING (person_id) + WHERE + projektarbeit_id = ? + ) betreuer + ORDER BY + CASE WHEN status = 'Mitarbeiter' THEN 0 WHEN status = 'Person' THEN 1 ELSE 2 END"; + + $result = $this->ProjektbetreuerModel->execReadOnlyQuery($qry, [$projektarbeit_id]); if (isError($result)) $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); @@ -245,7 +254,18 @@ class Projektbetreuer extends FHCAPI_Controller if (isError($result)) return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); - return $this->terminateWithSuccess(hasData($result) ? $this->_addFullNameToBetreuer(getData($result)) : []); + // sort persons + if (!hasData($result)) $this->terminateWithSuccess([]); + + $persons = $this->_addFullNameToBetreuer(getData($result)); + usort($persons, function($a, $b) + { + $statusRanks = ['Mitarbeiter' => 0, 'Person' => 1, 'Student' => 2]; + return (isset($statusRanks[$a->status]) ? $statusRanks[$a->status] : count($statusRanks) + 1) + - (isset($statusRanks[$b->status]) ? $statusRanks[$b->status] : count($statusRanks) + 1); + }); + + return $this->terminateWithSuccess($persons); } public function getPerson() diff --git a/application/models/education/Projektarbeit_model.php b/application/models/education/Projektarbeit_model.php index 1ca2a18a8..414d1d1be 100644 --- a/application/models/education/Projektarbeit_model.php +++ b/application/models/education/Projektarbeit_model.php @@ -24,17 +24,28 @@ class Projektarbeit_model extends DB_Model public function getProjektarbeit($student_uid, $studiengang_kz = null, $studiensemester_kurzbz = null, $projekttyp = null, $final = null) { $qry = "SELECT - tbl_projektarbeit.*, tbl_projekttyp.bezeichnung, + pa.*, tbl_projekttyp.bezeichnung, tbl_lehreinheit.studiensemester_kurzbz, tbl_lehrveranstaltung.lehrveranstaltung_id, - tbl_firma.name AS firma_name + tbl_firma.name AS firma_name, + ( + SELECT + STRING_AGG(trim(COALESCE(titelpre,'')||' '||COALESCE(vorname,'')||' '||COALESCE(nachname,'')||' '||COALESCE(titelpost,'')), ', ') + FROM + lehre.tbl_projektbetreuer + JOIN public.tbl_person USING (person_id) + WHERE + projektarbeit_id = pa.projektarbeit_id + AND student_uid = pa.student_uid + GROUP BY projektarbeit_id + ) AS projektbetreuer FROM - lehre.tbl_projektarbeit + lehre.tbl_projektarbeit pa JOIN lehre.tbl_projekttyp USING (projekttyp_kurzbz) JOIN lehre.tbl_lehreinheit USING (lehreinheit_id) JOIN lehre.tbl_lehrveranstaltung USING (lehrveranstaltung_id) LEFT JOIN public.tbl_firma USING (firma_id) WHERE - tbl_projektarbeit.student_uid = ?"; + pa.student_uid = ?"; $params = array($student_uid); diff --git a/public/js/components/Stv/Studentenverwaltung/Details/Projektarbeit/Details.js b/public/js/components/Stv/Studentenverwaltung/Details/Projektarbeit/Details.js index d14f618e1..34dd99c8f 100644 --- a/public/js/components/Stv/Studentenverwaltung/Details/Projektarbeit/Details.js +++ b/public/js/components/Stv/Studentenverwaltung/Details/Projektarbeit/Details.js @@ -195,12 +195,15 @@ export default { ) .catch(this.$fhcAlert.handleSystemError); }, + lvChanged(event) { + this.formData.lehreinheit_id = null; + }, studiensemesterChanged() { this.formData.lehreinheit_id = null; this.getLehrveranstaltungen(); }, - lvChanged(event) { - this.formData.lehreinheit_id = null; + gesperrtBisChanged(newSperrdatum) { + this.formData.freigegeben = newSperrdatum == null || newSperrdatum == ''; }, // enrich and modify data before sending getPreparedFormData() { @@ -400,6 +403,7 @@ export default { format="dd.MM.yyyy" model-type="yyyy-MM-dd" name="gesperrtbis" + @update:model-value="gesperrtBisChanged" >
diff --git a/public/js/components/Stv/Studentenverwaltung/Details/Projektarbeit/Projektarbeit.js b/public/js/components/Stv/Studentenverwaltung/Details/Projektarbeit/Projektarbeit.js index f831ece7d..5c41d6ecc 100644 --- a/public/js/components/Stv/Studentenverwaltung/Details/Projektarbeit/Projektarbeit.js +++ b/public/js/components/Stv/Studentenverwaltung/Details/Projektarbeit/Projektarbeit.js @@ -47,16 +47,25 @@ export default { { event: 'tableBuilt', handler: async() => { - await this.$p.loadCategory(['global', 'person', 'stv', 'ui', 'projektarbeit']); + await this.$p.loadCategory(['global', 'person', 'lehre', 'stv', 'ui', 'projektarbeit']); let cm = this.$refs.table.tabulator.columnManager; cm.getColumnByField('projekttyp_kurzbz').component.updateDefinition({ + title: this.$p.t('projektarbeit', 'typKurzbezeichnung') + }); + cm.getColumnByField('bezeichnung').component.updateDefinition({ title: this.$p.t('projektarbeit', 'typ') }); + cm.getColumnByField('studiensemester_kurzbz').component.updateDefinition({ + title: this.$p.t('lehre', 'studiensemester') + }); cm.getColumnByField('titel').component.updateDefinition({ title: this.$p.t('projektarbeit', 'titel') }); + cm.getColumnByField('note').component.updateDefinition({ + title: this.$p.t('projektarbeit', 'gesamtnote') + }); cm.getColumnByField('beginn').component.updateDefinition({ title: this.$p.t('projektarbeit', 'beginn') }); @@ -78,6 +87,12 @@ export default { cm.getColumnByField('firma_id').component.updateDefinition({ title: this.$p.t('projektarbeit', 'firmaId') }); + cm.getColumnByField('abgabedatum').component.updateDefinition({ + title: this.$p.t('projektarbeit', 'abgabeEndupload') + }); + cm.getColumnByField('actions').component.updateDefinition({ + title: this.$p.t('global', 'aktionen') + }); } }, ], @@ -101,6 +116,7 @@ export default { {title: "Typ Kurzbz", field: "projekttyp_kurzbz", visible: false}, {title: "Studiensemester", field: "studiensemester_kurzbz"}, {title: "Titel", field: "titel"}, + {title: "Gesamtnote", field: "note"}, { title: "Abgabe Enduplad", field: "abgabedatum", @@ -183,6 +199,7 @@ export default { {title: "Anmerkung", field: "anmerkung", visible: false}, {title: "Lehreinheit ID", field: "lehreinheit_id", visible: false}, {title: "Student UID", field: "student_uid", visible: false}, + {title: "Projektbetreuer", field: "projektbetreuer", visible: false}, { title:"Final", field:"final", @@ -388,7 +405,7 @@ export default {
- +
diff --git a/public/js/components/Stv/Studentenverwaltung/Details/Projektarbeit/Projektbetreuer.js b/public/js/components/Stv/Studentenverwaltung/Details/Projektarbeit/Projektbetreuer.js index f847a1e92..a36284f32 100644 --- a/public/js/components/Stv/Studentenverwaltung/Details/Projektarbeit/Projektbetreuer.js +++ b/public/js/components/Stv/Studentenverwaltung/Details/Projektarbeit/Projektbetreuer.js @@ -20,6 +20,7 @@ export default { Contact, Vertrag }, + emits: ['betreuerSaved'], provide() { return { configShowVertragsdetails: this.config.showVertragsdetails @@ -131,7 +132,43 @@ export default { { event: 'tableBuilt', handler: async() => { - await this.$p.loadCategory(['global', 'person', 'stv', 'projektarbeit', 'ui']); + await this.$p.loadCategory(['global', 'person', 'lehre', 'stv', 'projektarbeit', 'ui']); + + let cm = this.$refs.projektbetreuerTable.tabulator.columnManager; + + cm.getColumnByField('nachname').component.updateDefinition({ + title: this.$p.t('person', 'nachname') + }); + cm.getColumnByField('vorname').component.updateDefinition({ + title: this.$p.t('person', 'vorname') + }); + cm.getColumnByField('note').component.updateDefinition({ + title: this.$p.t('projektarbeit', 'note') + }); + cm.getColumnByField('punkte').component.updateDefinition({ + title: this.$p.t('projektarbeit', 'titel') + }); + cm.getColumnByField('stunden').component.updateDefinition({ + title: this.$p.t('projektarbeit', 'stunden') + }); + cm.getColumnByField('stundensatz').component.updateDefinition({ + title: this.$p.t('projektarbeit', 'stundensatz') + }); + cm.getColumnByField('betreuerart_kurzbz').component.updateDefinition({ + title: this.$p.t('projektarbeit', 'betreuerart_kurzbz') + }); + cm.getColumnByField('person_id').component.updateDefinition({ + title: this.$p.t('system', 'person_id') + }); + cm.getColumnByField('vertrag_id').component.updateDefinition({ + title: this.$p.t('projektarbeit', 'vertrag_id') + }); + cm.getColumnByField('projektarbeit_id').component.updateDefinition({ + title: this.$p.t('projektarbeit', 'projektarbeit_id') + }); + cm.getColumnByField('actions').component.updateDefinition({ + title: this.$p.t('global', 'actions') + }); // Force layout recalculation for handling overflow text this.$refs.projektbetreuerTable.tabulator.redraw(true); @@ -173,6 +210,7 @@ export default { methods: { actionNewProjektbetreuer() { this.resetForm(); + this.defaultStundensatz = this.config.defaultProjektbetreuerStundensatz; this.newMode = !this.newMode; this.editMode = false; this.captureFormData(); @@ -279,6 +317,7 @@ export default { this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successSave')); this.getProjektbetreuer(this.projektarbeit_id, this.studiensemester_kurzbz); this.resetModes(); + this.$emit('betreuerSaved'); }) .catch(this.$fhcAlert.handleSystemError); }, @@ -300,7 +339,6 @@ export default { resetForm() { const defaultFormData = this.getDefaultFormData(); this.formData = defaultFormData; - this.defaultStundensatz = defaultFormData.stundensatz; if (this.beurteilungDownloadLink !== null) this.beurteilungDownloadLink = ''; this.autocompleteSelectedBetreuer = null; this.initialFormData = null; @@ -404,6 +442,7 @@ export default { .then(response => { // set the new person in Betreuer autocomplete field this.autocompleteSelectedBetreuer = response.data; + this.getDefaultStundensaetze(this.autocompleteSelectedBetreuer.person_id); }) .catch(this.$fhcAlert.handleSystemError) }, diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php index 257b05c03..61fcc062a 100644 --- a/system/phrasesupdate.php +++ b/system/phrasesupdate.php @@ -51665,6 +51665,126 @@ I have been informed that I am under no obligation to consent to the transmissio ) ) ), + array( + 'app' => 'core', + 'category' => 'projektarbeit', + 'phrase' => 'punkte', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Punkte', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'points', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'projektarbeit', + 'phrase' => 'gesamtnote', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Gesamtnote', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'final grade', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'projektarbeit', + 'phrase' => 'abgabeEndupload', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Abgabe Endupload', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'final submission upload', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'projektarbeit', + 'phrase' => 'vertrag_id', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Vertrag ID', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'contract ID', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'projektarbeit', + 'phrase' => 'projektarbeit_id', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Projektarbeit ID', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'project work ID', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'projektarbeit', + 'phrase' => 'betreuerart_kurzbz', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Betreuerart Kurzbezeichnung', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'project assessor short name', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), // FHC-4 Projektarbeiten & Vertraege ENDE // ### DOKUMENTE ERSTELLEN PHRASEN START ### array(