From 541d6d78cc762fe1c5695e84b95ebbe248170040 Mon Sep 17 00:00:00 2001 From: Johann Hoffmann Date: Wed, 3 Dec 2025 11:35:49 +0100 Subject: [PATCH] projektbeurteilung_formular_link event for benotung link AbgabetoolMitarbeiterDetail.js; projektarbeit_is_current event for abstracted logic in Abgabetool; show endupload missing message on benoten if neither old nor new link are eligable; --- application/config/abgabe.php | 5 +- .../controllers/api/frontend/v1/Abgabe.php | 42 ++++++- .../models/education/Projektarbeit_model.php | 108 +----------------- .../Cis/Abgabetool/AbgabeMitarbeiterDetail.js | 33 ++++-- system/phrasesupdate.php | 24 +++- 5 files changed, 90 insertions(+), 122 deletions(-) diff --git a/application/config/abgabe.php b/application/config/abgabe.php index 64cffbd30..b897e92e0 100644 --- a/application/config/abgabe.php +++ b/application/config/abgabe.php @@ -17,4 +17,7 @@ $config['URL_MITARBEITER'] = 'index.ci.php/Cis/Abgabetool/Mitarbeiter'; $config['ALLOWED_ABGABETYPEN_BETREUER'] = ['Zwischenabgabe', 'Quality Gate 1', 'Quality Gate 2']; $config['ALLOWED_NOTEN_ABGABETOOL'] = ['Bestanden', 'Nicht bestanden']; -$config['beurteilung_link_fallback'] = 'addons/fhtw/content/projektbeurteilung/projektbeurteilungDocumentExport.php?projektarbeit_id=?&betreuerart_kurzbz=?&person_id=?'; \ No newline at end of file +$config['beurteilung_link_fallback'] = 'addons/fhtw/content/projektbeurteilung/projektbeurteilungDocumentExport.php?projektarbeit_id=?&betreuerart_kurzbz=?&person_id=?'; + +$config['PROJEKTARBEITSBEURTEILUNG_MAIL_BASELINK_ERSTBEGUTACHTER'] = 'index.ci.php/extensions/FHC-Core-Projektarbeitsbeurteilung/ProjektarbeitsbeurteilungErstbegutachter'; +$config['PROJEKTARBEITSBEURTEILUNG_MAIL_BASELINK_ZWEITBEGUTACHTER'] = 'index.ci.php/extensions/FHC-Core-Projektarbeitsbeurteilung/ProjektarbeitsbeurteilungErstbegutachter'; \ No newline at end of file diff --git a/application/controllers/api/frontend/v1/Abgabe.php b/application/controllers/api/frontend/v1/Abgabe.php index 4a0e6dea7..8b6afef11 100644 --- a/application/controllers/api/frontend/v1/Abgabe.php +++ b/application/controllers/api/frontend/v1/Abgabe.php @@ -114,15 +114,22 @@ class Abgabe extends FHCAPI_Controller $this->terminateWithError($this->p->t('global','projektarbeitNichtGefunden'), 'general'); } - $paIsCurrent = $this->ProjektarbeitModel->projektarbeitIsCurrent($projektarbeit_id); +// $paIsCurrent = $this->ProjektarbeitModel->projektarbeitIsCurrent($projektarbeit_id); + $projektarbeitIsCurrent = false; + $returnFunc = function ($result) use (&$projektarbeitIsCurrent) { + $projektarbeitIsCurrent = $result; + }; + Events::trigger('projektarbeit_is_current', $projektarbeit_id, $returnFunc); +// $this->addMeta('isCurrent', $projektarbeitIsCurrent); + $ret = $this->ProjektarbeitModel->getProjektarbeitAbgabetermine($projektarbeit_id); foreach($ret->retval as $termin) { $this->checkAbgabeSignatur($termin, $projektarbeit); } - $this->terminateWithSuccess(array($ret, $paIsCurrent)); + $this->terminateWithSuccess(array($ret, $projektarbeitIsCurrent)); } /** @@ -415,6 +422,22 @@ class Abgabe extends FHCAPI_Controller $projektarbeiten = $this->ProjektarbeitModel->getMitarbeiterProjektarbeiten(getAuthUID(), $showAllBool); + + forEach($projektarbeiten->retval as $pa) { + + $oldLink = ''; // show this when paIsCurrent == false -> moodle course template + $newLink = ''; // get curated path for betreuer type + $returnFunc = function ( $resultOld, $resultNew) use (&$oldLink, &$newLink) { + $newLink = $resultNew; + $oldLink = $resultOld; + }; + + Events::trigger('projektbeurteilung_formular_link', $pa->betreuerart_kurzbz, APP_ROOT, $returnFunc); + $pa->beurteilungLinkNew = $newLink; + $pa->beurteilungLinkOld = $oldLink; + } + + $this->terminateWithSuccess(array($projektarbeiten, DOMAIN)); } @@ -958,8 +981,16 @@ class Abgabe extends FHCAPI_Controller } else { $this->terminateWithError($this->p->t('global','projektarbeitNichtGefunden'), 'general'); } - - $projektarbeitIsCurrent = $this->ProjektarbeitModel->projektarbeitIsCurrent($projektarbeit_id); + + $projektarbeitIsCurrent = false; + $returnFunc = function ($result) use (&$projektarbeitIsCurrent) { + $projektarbeitIsCurrent = $result; + }; + + Events::trigger('projektarbeit_is_current', $projektarbeit_id, $returnFunc); + $this->addMeta('isCurrent', $projektarbeitIsCurrent); + +// $projektarbeitIsCurrent = $this->ProjektarbeitModel->projektarbeitIsCurrent($projektarbeit_id); if(!$projektarbeitIsCurrent) { $this->terminateWithError($this->p->t('abgabetool','c4fehlerAktualitaetProjektarbeit'), 'general'); } @@ -983,7 +1014,8 @@ class Abgabe extends FHCAPI_Controller $studentUser = $this->ProjektarbeitModel->getProjektarbeitBenutzer($student_uid)->retval[0]; // 1. Begutachter mail ohne Token - $mail_baselink = APP_ROOT."index.ci.php/extensions/FHC-Core-Projektarbeitsbeurteilung/ProjektarbeitsbeurteilungErstbegutachter"; + $mail_baselink = APP_ROOT.$this->config->item('PROJEKTARBEITSBEURTEILUNG_MAIL_BASELINK_ERSTBEGUTACHTER'); +// $mail_baselink = APP_ROOT."index.ci.php/extensions/FHC-Core-Projektarbeitsbeurteilung/ProjektarbeitsbeurteilungErstbegutachter"; $mail_fulllink = "$mail_baselink?projektarbeit_id=".$projektarbeit_id."&uid=".$studentUser->uid; $projekttyp_kurzbz = $projektarbeit->projekttyp_kurzbz; $subject = $projektarbeit->projekttyp_kurzbz == 'Diplom' ? 'Masterarbeitsbetreuung' : 'Bachelorarbeitsbetreuung'; diff --git a/application/models/education/Projektarbeit_model.php b/application/models/education/Projektarbeit_model.php index 361fd71b0..e1b800673 100644 --- a/application/models/education/Projektarbeit_model.php +++ b/application/models/education/Projektarbeit_model.php @@ -437,113 +437,7 @@ class Projektarbeit_model extends DB_Model return $this->execReadOnlyQuery($new_qry, array($studiengang_kz)); } - - /** - * Holt sich Version der Projektarbeit. - * Liefert auch mit, ob die Version die aktuellste ist. - * z.B.: Masterarbeiten waren ab der Änderung zur Gewichtung der Punkte aktuell, - * Bachelorarbeiten waren ab dem Umstieg auf das Online Beurteilungsformular aktuell. - * @param $projektarbeit_id - * @return objekt mit Versionsinfo, null im Fehlerfall - */ - private function getVersion($projektarbeit_id) { - $_versions_query = array( - 'Diplom' => array( - 'SS2025', - 'SS2023', - 'SS2022' - ), - 'Others' => array( - 'SS2025', - 'SS2022', - ) - ); - - $_versions_check = array( - 'Diplom' => array( - 'SS2025' => 3, - 'SS2023' => 2, - 'SS2022' => 1 - ), - 'Others' => array( - 'SS2025' => 2, - 'SS2022' => 1 - ) - ); - - // paarbeit sollte nur ab einem Studiensemester online bewertet werden - $qry=" - SELECT - CASE - WHEN semesters_diplom.studiensemester_kurzbz IS NOT NULL - THEN semesters_diplom.studiensemester_kurzbz - ELSE semesters.studiensemester_kurzbz - END AS version_studiensemester_kurzbz, - pa.projekttyp_kurzbz - FROM - lehre.tbl_projektarbeit pa - JOIN lehre.tbl_lehreinheit USING(lehreinheit_id) - JOIN public.tbl_studiensemester sem USING(studiensemester_kurzbz) - LEFT JOIN ( - SELECT - start, studiensemester_kurzbz - FROM - public.tbl_studiensemester - WHERE - studiensemester_kurzbz IN ? - ) semesters ON sem.start >= semesters.start AND pa.projekttyp_kurzbz <> 'Diplom' - LEFT JOIN ( - SELECT - start, studiensemester_kurzbz - FROM - public.tbl_studiensemester - WHERE - studiensemester_kurzbz IN ? - ) semesters_diplom ON sem.start >= semesters_diplom.start AND pa.projekttyp_kurzbz = 'Diplom' - WHERE - projektarbeit_id = ? - ORDER BY - semesters.start DESC, semesters_diplom.start DESC - LIMIT 1"; - - $resultociniBambini = $this->execReadOnlyQuery($qry, array($_versions_query['Others'], $_versions_query['Diplom'], $projektarbeit_id)); - - if(hasData($resultociniBambini)) { - $data = getData($resultociniBambini); - if(count($data) > 0) { - $row = $data[0]; - - // known project types - if (isset($_versions_check[$row->projekttyp_kurzbz][$row->version_studiensemester_kurzbz])) - { - $row->versionNumber = $_versions_check[$row->projekttyp_kurzbz][$row->version_studiensemester_kurzbz]; - $row->isCurrent = - $_versions_check[$row->projekttyp_kurzbz][$row->version_studiensemester_kurzbz] - == max($_versions_check[$row->projekttyp_kurzbz]); - - } - elseif (isset($_versions_check['Others'][$row->version_studiensemester_kurzbz])) - { - $row->versionNumber = $_versions_check['Others'][$row->version_studiensemester_kurzbz]; - $row->isCurrent = - $_versions_check['Others'][$row->version_studiensemester_kurzbz] - == max($_versions_check['Others']); - } - else - { - $row->isCurrent = false; - $row->versionNumber = 0; - } - return $row; - - } else { - return null; - } - } else { - return null; - } - } - + /** * * @param diff --git a/public/js/components/Cis/Abgabetool/AbgabeMitarbeiterDetail.js b/public/js/components/Cis/Abgabetool/AbgabeMitarbeiterDetail.js index e1ca760ed..2f85b78c5 100644 --- a/public/js/components/Cis/Abgabetool/AbgabeMitarbeiterDetail.js +++ b/public/js/components/Cis/Abgabetool/AbgabeMitarbeiterDetail.js @@ -364,17 +364,36 @@ export const AbgabeMitarbeiterDetail = { const link = this.turnitin_link window.open(link, '_blank') }, - openBenotung() { + async openBenotung() { // old link check ? - if(this.getSemesterBenotbar && this.projektarbeit?.abgabetermine.find(termin => termin.paabgabetyp_kurzbz == 'end' && termin.abgabedatum !== null)) { - // TODO: shouldnt be hardcoded here, at least config in abgabetool -> ideally event sourced from projektarbeitsbeurteilung - - const path = this.projektarbeit?.betreuerart_kurzbz == 'Zweitbegutachter' ? 'ProjektarbeitsbeurteilungZweitbegutachter' : 'ProjektarbeitsbeurteilungErstbegutachter' - const link = FHC_JS_DATA_STORAGE_OBJECT.app_root + 'index.ci.php/extensions/FHC-Core-Projektarbeitsbeurteilung/' + path + if(this.getSemesterBenotbar && this.projektarbeit?.abgabetermine.find(termin => termin.paabgabetyp_kurzbz == 'end' && termin.abgabedatum !== null) && this.projektarbeit?.beurteilungLinkNew) { + const link = this.projektarbeit?.beurteilungLinkNew + window.open(link, '_blank') + } else if(this.projektarbeit?.abgabetermine.find(termin => termin.paabgabetyp_kurzbz == 'end' && termin.abgabedatum !== null) && this.projektarbeit?.beurteilungLinkOld) { + if(await this.$fhcAlert.confirm({ + message: this.$p.t('abgabetool/c4aeltereParbeitBenoten'), + acceptLabel: this.$capitalize(this.$p.t('abgabetool/c4AcceptAndProceed')), + acceptClass: 'btn btn-danger', + rejectLabel: this.$capitalize(this.$p.t('abgabetool/c4Cancel')), + rejectClass: 'btn btn-outline-secondary' + }) === false) { + return false + } + + const link = this.projektarbeit?.beurteilungLinkOld window.open(link, '_blank') } else { - window.open(this.old_abgabe_beurteilung_link, '_blank') + // show info text that no endupload with abgabe has been found + if(await this.$fhcAlert.confirm({ + message: this.$p.t('abgabetool/c4keinEnduploadErfolgt'), + acceptLabel: this.$capitalize(this.$p.t('abgabetool/c4AcceptAndProceed')), + acceptClass: 'btn btn-danger', + rejectLabel: this.$capitalize(this.$p.t('abgabetool/c4Cancel')), + rejectClass: 'btn btn-outline-secondary' + }) === false) { + return false + } } }, formatDate(dateParam) { diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php index bf5267e1c..47402ba32 100644 --- a/system/phrasesupdate.php +++ b/system/phrasesupdate.php @@ -42885,13 +42885,33 @@ array( 'phrases' => array( array( 'sprache' => 'German', - 'text' => 'Projektarbeit für älteres Semester, bitte Word-Formular zur Benotung verwenden!', + 'text' => 'Projektarbeit für älteres Semester, bitte Word-Formular in Moodle zur Benotung verwenden!', 'description' => '', 'insertvon' => 'system' ), array( 'sprache' => 'English', - 'text' => 'Thesis handed in for older semester, please use word form for assessment!', + 'text' => 'Thesis handed in for older semester, please use word form in moodle for assessment!', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'abgabetool', + 'phrase' => 'c4keinEnduploadErfolgt', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Endupload ist noch nicht erfolgt', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Final version not uploaded yet', 'description' => '', 'insertvon' => 'system' )