From 14f5a651a4144e5da535426db8bf620124568364 Mon Sep 17 00:00:00 2001 From: Johann Hoffmann Date: Mon, 22 Sep 2025 10:47:12 +0200 Subject: [PATCH] abgabetool rechte; WIP magic modal for next QG Termin logic handling; --- .../controllers/api/frontend/v1/Abgabe.php | 61 +++++++++++++------ .../models/education/Projektarbeit_model.php | 41 ++++++------- .../Cis/Abgabetool/AbgabeMitarbeiterDetail.js | 52 +++++++++++++++- .../61164_abgabetool_quality_gates.php | 44 ++++++++++++- system/phrasesupdate.php | 20 ++++++ 5 files changed, 174 insertions(+), 44 deletions(-) diff --git a/application/controllers/api/frontend/v1/Abgabe.php b/application/controllers/api/frontend/v1/Abgabe.php index a4384a890..c87d3609d 100644 --- a/application/controllers/api/frontend/v1/Abgabe.php +++ b/application/controllers/api/frontend/v1/Abgabe.php @@ -36,16 +36,16 @@ class Abgabe extends FHCAPI_Controller public function __construct() { parent::__construct([ - 'getConfig' => self::PERM_LOGGED, - 'getStudentProjektarbeiten' => self::PERM_LOGGED, // TODO: abgabetool berechtigung? - 'getStudentProjektabgaben' => self::PERM_LOGGED, - 'postStudentProjektarbeitZwischenabgabe' => self::PERM_LOGGED, - 'postStudentProjektarbeitEndupload' => self::PERM_LOGGED, - 'getMitarbeiterProjektarbeiten' => self::PERM_LOGGED, - 'postProjektarbeitAbgabe' => self::PERM_LOGGED, - 'deleteProjektarbeitAbgabe' => self::PERM_LOGGED, - 'postSerientermin' => self::PERM_LOGGED, - 'fetchDeadlines' => self::PERM_LOGGED, // TODO: mitarbeiter recht prüfen + 'getConfig' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_lektor:rw'), + 'getStudentProjektarbeiten' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_student:rw', 'basis/abgabe_lektor:rw'), + 'getStudentProjektabgaben' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_student:rw', 'basis/abgabe_lektor:rw'), + 'postStudentProjektarbeitZwischenabgabe' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_student:rw'), + 'postStudentProjektarbeitEndupload' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_student:rw'), + 'getMitarbeiterProjektarbeiten' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_lektor:rw'), + 'postProjektarbeitAbgabe' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_lektor:rw'), + 'deleteProjektarbeitAbgabe' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_lektor:rw'), + 'postSerientermin' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_lektor:rw'), + 'fetchDeadlines' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_lektor:rw'), 'getPaAbgabetypen' => self::PERM_LOGGED, 'getNoten' => self::PERM_LOGGED ]); @@ -88,7 +88,7 @@ class Abgabe extends FHCAPI_Controller } /** - * fetches all projektabgabetermine for a given projektarbeit_id used in cis4 student abgabetool + * fetches all projektabgabetermine for a given projektarbeit_id used in cis4 student abgabetool & lektor abgabetool */ public function getStudentProjektabgaben() { $projektarbeit_id = $this->input->get("projektarbeit_id",TRUE); @@ -467,8 +467,6 @@ class Abgabe extends FHCAPI_Controller $showAllBool = true; } elseif (in_array($boolParamStrLower, $falseStrings, true)) { $showAllBool = false; - } else { -// $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general'); } $projektarbeiten = $this->ProjektarbeitModel->getMitarbeiterProjektarbeiten(getAuthUID(), $showAllBool); @@ -498,6 +496,7 @@ class Abgabe extends FHCAPI_Controller $this->load->model('education/Paabgabe_model', 'PaabgabeModel'); + $existingPaabgabe = null; if($paabgabe_id == -1) { $result = $this->PaabgabeModel->insert( array( @@ -513,9 +512,15 @@ class Abgabe extends FHCAPI_Controller 'insertamum' => date('Y-m-d H:i:s') ) ); - - } else { + // load existing entry of paabgabe and check if note has changed to negativ, to avoid sending when + // only notiz has changed. + + // TODO: what if paabgabe is a qualgate1, is benotet negativ and then its type is changed to gate2? + + $existingResult = $this->PaabgabeModel->load($paabgabe_id); + $existingPaabgabe = getData($existingResult); + $result = $this->PaabgabeModel->update( $paabgabe_id, array( @@ -529,7 +534,6 @@ class Abgabe extends FHCAPI_Controller 'updateamum' => date('Y-m-d H:i:s') ) ); - } // check if $paaabgabe is a qual gate and its note is deemed negative @@ -539,7 +543,7 @@ class Abgabe extends FHCAPI_Controller $result = $this->PaabgabeModel->load($paabgabe_id); $paabgabeArr = $this->getDataOrTerminateWithError($result); $paabgabe = $paabgabeArr[0]; - $this->addMeta('paabgabe', $paabgabeArr); +// $this->addMeta('paabgabe', $paabgabeArr); // check if abgabe even has note if($paabgabe->note) { @@ -548,13 +552,30 @@ class Abgabe extends FHCAPI_Controller $noteArr = $this->getDataOrTerminateWithError($result); $note = $noteArr[0]; if($note->positiv === false) { - $this->addMeta('noteNegativ', true); +// $this->addMeta('noteNegativ', true); + // TODO: somewhere in here check if there has been an existingPaabgabe and if that existing abgabe was + // already negativ -> dont send mail + + + if($existingPaabgabe && $existingPaabgabe->note) { + $result = $this->NoteModel->load($paabgabe->note); + $noteArr = $this->getDataOrTerminateWithError($result); + $note = $noteArr[0]; + if($note->positiv === false) { + // do nothing since this means $notiz change or smth else + } else { // benotung legitimately changed -> email + $this->sendQualGateNegativEmail($projektarbeit_id, $betreuer_person_id, $paabgabe); + } - $this->sendQualGateNegativEmail($projektarbeit_id, $betreuer_person_id, $paabgabe); + } else { // nothing existing previously -> send that mail + $this->sendQualGateNegativEmail($projektarbeit_id, $betreuer_person_id, $paabgabe); + } + + } } - $this->terminateWithSuccess($paabgabe); + $this->terminateWithSuccess([$paabgabe, $existingPaabgabe]); } public function deleteProjektarbeitAbgabe() { diff --git a/application/models/education/Projektarbeit_model.php b/application/models/education/Projektarbeit_model.php index a6eaf7fd2..ab0ebdcd5 100644 --- a/application/models/education/Projektarbeit_model.php +++ b/application/models/education/Projektarbeit_model.php @@ -97,8 +97,7 @@ class Projektarbeit_model extends DB_Model */ public function getStudentProjektarbeitenWithBetreuer($studentUID) { - $betreuerQuery = " - SELECT + $betreuerQuery = "SELECT DISTINCT ON(projektarbeit_id) vorname as bvorname, nachname as bnachname, titelpre as btitelpre, @@ -106,19 +105,19 @@ class Projektarbeit_model extends DB_Model titelpost AS btitelpost, tbl_betreuerart.beschreibung AS betreuerart_beschreibung, - (SELECT person_id - FROM lehre.tbl_projektbetreuer + (SELECT person_id + FROM lehre.tbl_projektbetreuer WHERE projektarbeit_id=tbl_projektarbeit.projektarbeit_id - AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter') LIMIT 1) AS zweitbetreuer_person_id, - (SELECT betreuerart_kurzbz - FROM lehre.tbl_projektbetreuer + AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter') LIMIT 1) AS zweitbetreuer_person_id, + (SELECT betreuerart_kurzbz + FROM lehre.tbl_projektbetreuer WHERE projektarbeit_id=tbl_projektarbeit.projektarbeit_id - AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter') LIMIT 1) AS zweitbetreuer_betreuerart_kurzbz, - (SELECT tbl_betreuerart.beschreibung - FROM lehre.tbl_projektbetreuer JOIN lehre.tbl_betreuerart USING(betreuerart_kurzbz) + AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter') LIMIT 1) AS zweitbetreuer_betreuerart_kurzbz, + (SELECT tbl_betreuerart.beschreibung + FROM lehre.tbl_projektbetreuer JOIN lehre.tbl_betreuerart USING(betreuerart_kurzbz) WHERE projektarbeit_id=tbl_projektarbeit.projektarbeit_id - AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied') LIMIT 1) AS zweitbetreuer_betreuerart_beschreibung, - + AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied') LIMIT 1) AS zweitbetreuer_betreuerart_beschreibung, + tbl_betreuerart.betreuerart_kurzbz, person_id as bperson_id, projektarbeit_id, @@ -135,7 +134,7 @@ class Projektarbeit_model extends DB_Model lehre.tbl_projektarbeit.schlagwoerter as schlagwoerter, lehre.tbl_projektarbeit.schlagwoerter_en as schlagwoerter_en, lehre.tbl_projektarbeit.abstract as abstract, - lehre.tbl_projektarbeit.abstract_en as abstract_en, + lehre.tbl_projektarbeit.abstract_en as abstract_en, (SELECT abgeschicktvon FROM extension.tbl_projektarbeitsbeurteilung WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id AND betreuer_person_id = tbl_projektbetreuer.person_id) AS babgeschickt, (SELECT abgeschicktvon FROM extension.tbl_projektarbeitsbeurteilung WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter') LIMIT 1) AS zweitbetreuer_abgeschickt, (SELECT datum FROM campus.tbl_paabgabe WHERE paabgabetyp_kurzbz = 'end' AND abgabedatum IS NOT NULL AND projektarbeit_id = tbl_projektarbeit.projektarbeit_id LIMIT 1) AS abgegeben @@ -146,15 +145,15 @@ class Projektarbeit_model extends DB_Model LEFT JOIN public.tbl_benutzer USING(person_id) LEFT JOIN lehre.tbl_projekttyp USING (projekttyp_kurzbz) LEFT JOIN lehre.tbl_betreuerart USING(betreuerart_kurzbz) - LEFT JOIN lehre.tbl_lehreinheit USING(lehreinheit_id) - LEFT JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id) - LEFT JOIN public.tbl_mitarbeiter ON(public.tbl_mitarbeiter.mitarbeiter_uid = public.tbl_benutzer.uid) - LEFT JOIN public.tbl_studiengang USING(studiengang_kz) - WHERE - tbl_projektarbeit.student_uid = ? AND + LEFT JOIN lehre.tbl_lehreinheit USING(lehreinheit_id) + LEFT JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id) + LEFT JOIN public.tbl_mitarbeiter ON(public.tbl_mitarbeiter.mitarbeiter_uid = public.tbl_benutzer.uid) + LEFT JOIN public.tbl_studiengang USING(studiengang_kz) + WHERE + tbl_projektarbeit.student_uid = ? AND mitarbeiter_uid IS NOT NULL AND (projekttyp_kurzbz='Bachelor' OR projekttyp_kurzbz='Diplom') - AND betreuerart_kurzbz IN ('Betreuer', 'Begutachter', 'Erstbegutachter', 'Senatsvorsitz')"; - + AND betreuerart_kurzbz IN ('Betreuer', 'Begutachter', 'Erstbegutachter', 'Senatsvorsitz')"; + return $this->execReadOnlyQuery($betreuerQuery, array($studentUID)); } diff --git a/public/js/components/Cis/Abgabetool/AbgabeMitarbeiterDetail.js b/public/js/components/Cis/Abgabetool/AbgabeMitarbeiterDetail.js index 6fa929dec..20d71ae0a 100644 --- a/public/js/components/Cis/Abgabetool/AbgabeMitarbeiterDetail.js +++ b/public/js/components/Cis/Abgabetool/AbgabeMitarbeiterDetail.js @@ -25,6 +25,7 @@ export const AbgabeMitarbeiterDetail = { }, data() { return { + showAutomagicModalPhrase: false, sdModel: [], eidAkzeptiert: false, enduploadTermin: null, @@ -73,7 +74,46 @@ export const AbgabeMitarbeiterDetail = { paabgabetyp_kurzbz: termin.bezeichnung?.paabgabetyp_kurzbz } - this.projektarbeit.abgabetermine.push(newTerminRes) + // only insert new abgabe if we actually created a new one, not when saving/editing existing + if(!this.projektarbeit.abgabetermine.find(abgabe => abgabe.paabgabe_id == newTerminRes.paabgabe_id)){ + this.projektarbeit.abgabetermine.push(newTerminRes) + } + + + + // negative abgabe -> automagically open new termin modal + // really bad feature idea by management people that think + // they know better lmao that will be so annoying to deal with + + // TODO fix the note changed check + // check if the abgabe existed beforehand and thus if the note even changed -> dont spam modal open + // when editing text of negative abgabe + // const savedExistingTermin = termin.paabgabe_id == newTerminRes.paabgabe_id + // const noteChanged = savedExistingTermin && termin.note_pk !== newTerminRes.note + const newTerminResNoteOpt = this.allowedNotenOptions.find(opt => opt.note == newTerminRes.note) + if(newTerminResNoteOpt && !newTerminResNoteOpt.positiv) { + + this.newTermin = { + 'paabgabe_id': -1, + 'projektarbeit_id': this.projektarbeit.projektarbeit_id, + 'fixtermin': false, + 'kurzbz': '', + 'datum': new Date().toISOString().split('T')[0], + 'note': this.allowedNotenOptions.find(opt => opt.note == 9), + 'notiz': '', + 'upload_allowed': false, + 'paabgabetyp_kurzbz': '', + 'bezeichnung': this.abgabeTypeOptions.find(opt => opt.paabgabetyp_kurzbz === newTerminRes.paabgabetyp_kurzbz), + 'abgabedatum': null, + 'insertvon': this.viewData?.uid ?? '' + } + + this.showAutomagicModalPhrase = true + + this.$refs.modalContainerCreateNewAbgabe.show() + } + + // if(paabgabe_id === -1) { // new abgabe has been inserted // termin.paabgabe_id = res?.data?.paabgabe_id @@ -282,13 +322,21 @@ export const AbgabeMitarbeiterDetail = { }, template: ` - +