diff --git a/application/controllers/api/frontend/v1/Abgabe.php b/application/controllers/api/frontend/v1/Abgabe.php index 61a3b4c44..86f248c84 100644 --- a/application/controllers/api/frontend/v1/Abgabe.php +++ b/application/controllers/api/frontend/v1/Abgabe.php @@ -27,7 +27,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); //require_once('../../../include/projektarbeit.class.php'); //require_once('../../../include/projektbetreuer.class.php'); -class Lehre extends FHCAPI_Controller +class Abgabe extends FHCAPI_Controller { /** @@ -45,7 +45,8 @@ class Lehre extends FHCAPI_Controller 'deleteProjektarbeitAbgabe' => self::PERM_LOGGED, 'postSerientermin' => self::PERM_LOGGED, 'fetchDeadlines' => self::PERM_LOGGED, // TODO: mitarbeiter recht prüfen - 'getPaAbgabetypen' => self::PERM_LOGGED + 'getPaAbgabetypen' => self::PERM_LOGGED, + 'getNoten' => self::PERM_LOGGED ]); $this->load->library('PhrasesLib'); @@ -100,8 +101,10 @@ class Lehre extends FHCAPI_Controller /** * fetches all projektarbeiten and betreuer for a given student_uid used in cis4 student abgabetool */ - public function getStudentProjektarbeiten($uid) + public function getStudentProjektarbeiten() { + $uid = $this->input->get("uid",TRUE); + $this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel'); $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); @@ -254,8 +257,7 @@ class Lehre extends FHCAPI_Controller } private function signaturFehltEmail($student_uid) { - - + // Mail an Studiengang wenn keine Signatur gefunden wurde $student = new student(); if(!$student->load($student_uid)) @@ -326,6 +328,10 @@ class Lehre extends FHCAPI_Controller $maildata['bewertunglink'] = $num_rows_sem >= 1 && $paabgabetyp_kurzbz == 'end' ? "
" : ""; $maildata['token'] = ""; + // TODO: clarify if all betreuer are mitarbeiter and have benutzer entries + // or if uid = null has to be checked WITH + // 'CASE WHEN tbl_benutzer.uid IS NULL THEN kontakt ELSE tbl_benutzer.uid || '@".DOMAIN."' END AS email' + $email = $this->getBetreuerEmail($bperson_id); if(!$email) $this->terminateWithError($this->p->t('abgabetool', 'fehlerMailBegutachter'), 'general'); @@ -334,7 +340,6 @@ class Lehre extends FHCAPI_Controller 'ParbeitsbeurteilungEndupload', $maildata, $email, -// $betreuerRow->mitarbeiter_uid."@".DOMAIN, $subject, 'sancho_header_min_bw.jpg', 'sancho_footer_min_bw.jpg', @@ -397,6 +402,12 @@ class Lehre extends FHCAPI_Controller $zweitbetmaildata['bewertunglink'] = $num_rows_sem >= 1 ? "" : ""; $zweitbetmaildata['token'] = $num_rows_sem >= 1 && isset($begutachterMitToken->zugangstoken) && !$intern ? "Zugangstoken: " . $begutachterMitToken->zugangstoken . "
" : ""; + + $email = $this->getBetreuerEmail($bperson_id); + + if(!$email) $this->terminateWithError($this->p->t('abgabetool', 'fehlerMailBegutachter'), 'general'); + + $mailres = sendSanchoMail( 'ParbeitsbeurteilungEndupload', $zweitbetmaildata, @@ -443,7 +454,8 @@ class Lehre extends FHCAPI_Controller $this->terminateWithSuccess(array($projektarbeiten, DOMAIN)); } - + + // called by abgabetool/mitarbeiter when adding a new termin public function postProjektarbeitAbgabe() { $projektarbeit_id = $_POST['projektarbeit_id']; $paabgabe_id = $_POST['paabgabe_id']; @@ -451,6 +463,8 @@ class Lehre extends FHCAPI_Controller $datum = $_POST['datum']; $fixtermin = $_POST['fixtermin']; $kurzbz = $_POST['kurzbz']; + $note = $_POST['note']; + $upload_required = $_POST['upload_required']; if (!isset($projektarbeit_id) || isEmptyString($projektarbeit_id) || !isset($paabgabe_id) || isEmptyString($paabgabe_id) @@ -469,12 +483,14 @@ class Lehre extends FHCAPI_Controller 'fixtermin' => $fixtermin, 'datum' => $datum, 'kurzbz' => $kurzbz, + 'note' => $note, + 'upload_required' => $upload_required, 'insertvon' => getAuthUID(), 'insertamum' => date('Y-m-d H:i:s') ) ); - $this->terminateWithSuccess($result); + } else { $result = $this->PaabgabeModel->update( $paabgabe_id, @@ -482,13 +498,25 @@ class Lehre extends FHCAPI_Controller 'paabgabetyp_kurzbz' => $paabgabetyp_kurzbz, 'datum' => $datum, 'kurzbz' => $kurzbz, + 'note' => $note, + 'upload_required' => $upload_required, 'updatevon' => getAuthUID(), 'updateamum' => date('Y-m-d H:i:s') ) ); - - $this->terminateWithSuccess($result); + } + + $paabgabe_id = $this->getDataOrTerminateWithError($result); + + $paabgabe = $this->PaabgabeModel->load($paabgabe_id); + + // check if $paaabgabe is a qual gate and its note is deemed negative + // -> send email to student with that info + + // TODO: DEFAULT NOTE 9 OR DEFAULT NOTE NULL? 9 COUNTS AS NEGATIV :/ + + $this->terminateWithSuccess($result); } public function deleteProjektarbeitAbgabe() { @@ -631,17 +659,58 @@ class Lehre extends FHCAPI_Controller $result = $this->PaabgabetypModel->getAll(); $paabgabetypen = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($paabgabetypen); } private function getBetreuerEmail($person_id) { - // check if betreuer is intern (fixangestellt = true) - // -> email: uid@DOMAIN - - // if betreuer is extern, check if there are private email contacts - // in tbl_kontakt. if so, return them - - return null; + $this->load->model('education/Projektbetreuer_model', 'ProjektbetreuerModel'); + $result = $this->ProjektbetreuerModel->getBetreuerEmail($person_id); + $email = $this->getDataOrTerminateWithError($result); + return $email[0]->email; } -} + //TODO: SWITCH TO NOTEN API ONCE NOTENTOOL IS IN MASTER TO AVOID DUPLICATE API + + /** + * GET METHOD + * returns List of all available & active NotenOptions + */ + public function getNoten() { + $this->load->model('education/Note_model', 'NoteModel'); + + $result = $this->NoteModel->getAllActive(); + $noten = $this->getDataOrTerminateWithError($result); + $this->terminateWithSuccess($noten); + } + + private function sendQualGateNegativEmail($student_uid) { + // Mail an Student wenn Qualgate negativ beurteilt wurde + $student = new student(); + if(!$student->load($student_uid)) + $this->terminateWithError($this->p->t('global','userNichtGefunden'), 'general'); + + // TODO: frasen + $subject = 'Quality Gate Negativ'; + $tomail = $student_uid.'@'.DOMAIN; + + + // TODO: emaildata + $data = array( + 'betreuerfullname' => $student->vorname, + 'qualgatebezeichnung' => $student->nachname, + 'datum' => $datum, + 'projektarbeitname' => $name + ); + + $mailres = sendSanchoMail( + 'QualGateNegativ', + $data, + $tomail, + $subject + ); + + return $mailres; + } +} \ No newline at end of file diff --git a/application/models/education/Note_model.php b/application/models/education/Note_model.php index 80b454398..87a1501e0 100644 --- a/application/models/education/Note_model.php +++ b/application/models/education/Note_model.php @@ -11,4 +11,12 @@ class Note_model extends DB_Model $this->dbTable = 'lehre.tbl_note'; $this->pk = 'note'; } + + public function getAllActive() { + $qry ="SELECT * + FROM lehre.tbl_note + WHERE aktiv = true"; + + return $this->execReadOnlyQuery($qry); + } } \ No newline at end of file diff --git a/application/models/education/Projektarbeit_model.php b/application/models/education/Projektarbeit_model.php index 4083dbf6e..b1971cea7 100644 --- a/application/models/education/Projektarbeit_model.php +++ b/application/models/education/Projektarbeit_model.php @@ -167,6 +167,8 @@ class Projektarbeit_model extends DB_Model campus.tbl_paabgabe.fixtermin, campus.tbl_paabgabe.kurzbz, campus.tbl_paabgabe.datum, + campus.tbl_paabgabe.note, + campus.tbl_paabgabe.upload_required, campus.tbl_paabgabetyp.paabgabetyp_kurzbz, campus.tbl_paabgabetyp.bezeichnung, campus.tbl_paabgabe.abgabedatum, diff --git a/application/models/education/Projektbetreuer_model.php b/application/models/education/Projektbetreuer_model.php index 95950bf95..ae78b96d9 100644 --- a/application/models/education/Projektbetreuer_model.php +++ b/application/models/education/Projektbetreuer_model.php @@ -231,4 +231,40 @@ class Projektbetreuer_model extends DB_Model return $this->execQuery($qry, array($projektarbeit_id, $betreuer_person_id)); } + + /** + * Gets email of a Betreuer for a Projektarbeit. + * Projektarbeitbetreuer can be external employees, which should be contacted on their private + * email contact, if they have one. Internal Betreuer should be contacted on their "uid@DOMAIN" adress. + * @param int betreuer_person_id + * @return object success or error + */ + public function getBetreuerEmail($betreuer_person_id) { + // TODO: check if benutzer uid exists, not fixangestellt + + $qry =" + SELECT uid, + CASE + WHEN public.tbl_mitarbeiter.fixangestellt = false + THEN ( + SELECT kontakt AS email + FROM public.tbl_kontakt + WHERE + public.tbl_kontakt.person_id = ? AND + kontakttyp = 'email' + ) + + ELSE ( + SELECT public.tbl_benutzer.uid || '@' || '".DOMAIN."' AS email + FROM public.tbl_benutzer + WHERE person_id = ? + ) + END AS email + FROM public.tbl_benutzer + JOIN public.tbl_mitarbeiter ON (public.tbl_benutzer.uid = public.tbl_mitarbeiter.mitarbeiter_uid) + WHERE person_id = ? + "; + + return $this->execReadOnlyQuery($qry, array($betreuer_person_id, $betreuer_person_id, $betreuer_person_id)); + } } diff --git a/public/js/api/factory/abgabe.js b/public/js/api/factory/abgabe.js index 15c7dee43..0602a218c 100644 --- a/public/js/api/factory/abgabe.js +++ b/public/js/api/factory/abgabe.js @@ -17,25 +17,17 @@ export default { return { method: 'post', url: '/api/frontend/v1/Abgabe/postStudentProjektarbeitEndupload', - params: { formData }, + params: formData, config: {Headers: { "Content-Type": "multipart/form-data" }} }; - - // const url = '/api/frontend/v1/Lehre/postStudentProjektarbeitEndupload'; - // const headers = {Headers: { "Content-Type": "multipart/form-data" }} - // return this.$fhcApi.post(url, formData, headers) }, postStudentProjektarbeitZwischenabgabe(formData) { return { method: 'post', url: '/api/frontend/v1/Abgabe/postStudentProjektarbeitZwischenabgabe', - params: { formData }, + params: formData, config: {Headers: { "Content-Type": "multipart/form-data" }} }; - - // const url = '/api/frontend/v1/Lehre/postStudentProjektarbeitZwischenabgabe'; - // const headers = {Headers: { "Content-Type": "multipart/form-data" }} - // return this.$fhcApi.post(url, formData, headers) }, getStudentProjektarbeitAbgabeFile(paabgabe_id, student_uid) { // TODO: check if this is fine with new api scheme @@ -59,6 +51,8 @@ export default { paabgabe_id: termin.paabgabe_id, paabgabetyp_kurzbz: termin.bezeichnung.paabgabetyp_kurzbz, datum: termin.datum, + note: termin.note, + upload_required: termin.upload_required, fixtermin: termin.fixtermin, insertvon: termin.insertvon, kurzbz: termin.kurzbz, @@ -92,5 +86,12 @@ export default { method: 'get', url: '/api/frontend/v1/Abgabe/getPaAbgabetypen' }; - } + }, + //TODO: SWITCH TO NOTEN API ONCE NOTENTOOL IS IN MASTER TO AVOID DUPLICATE API + getNoten(){ + return { + method: 'get', + url: '/api/frontend/v1/Abgabe/getNoten' + }; + }, }; \ No newline at end of file diff --git a/public/js/components/Cis/Abgabetool/AbgabeMitarbeiterDetail.js b/public/js/components/Cis/Abgabetool/AbgabeMitarbeiterDetail.js index 70b86e60f..c70c40ba7 100644 --- a/public/js/components/Cis/Abgabetool/AbgabeMitarbeiterDetail.js +++ b/public/js/components/Cis/Abgabetool/AbgabeMitarbeiterDetail.js @@ -1,5 +1,6 @@ import BsModal from '../../Bootstrap/Modal.js'; import VueDatePicker from '../../vueDatepicker.js.php'; +import ApiAbgabe from '../../../api/factory/abgabe.js' const today = new Date() export const AbgabeMitarbeiterDetail = { @@ -12,6 +13,7 @@ export const AbgabeMitarbeiterDetail = { Textarea: primevue.textarea, VueDatePicker }, + inject: ['abgabeTypeOptions', 'allowedNotenOptions'], props: { projektarbeit: { type: Object, @@ -23,30 +25,7 @@ export const AbgabeMitarbeiterDetail = { oldPaBeurteilungLink: 'https://moodle.technikum-wien.at/mod/page/view.php?id=1005052', // TODO: inject from app & app provide link from config eidAkzeptiert: false, enduploadTermin: null, - allActiveLanguages: FHC_JS_DATA_STORAGE_OBJECT.server_languages, - // TODO: fetch types - allAbgabeTypes: [ - { - paabgabetyp_kurzbz: 'abstract', - bezeichnung: 'Entwurf' - }, - { - paabgabetyp_kurzbz: 'zwischen', - bezeichnung: 'Zwischenabgabe' - }, - { - paabgabetyp_kurzbz: 'note', - bezeichnung: 'Benotung' - }, - { - paabgabetyp_kurzbz: 'end', - bezeichnung: 'Endupload' - }, - { - paabgabetyp_kurzbz: 'enda', - bezeichnung: 'Endabgabe im Sekretariat' - } - ] + allActiveLanguages: FHC_JS_DATA_STORAGE_OBJECT.server_languages } }, methods: { @@ -55,6 +34,9 @@ export const AbgabeMitarbeiterDetail = { }, saveTermin(termin) { const paabgabe_id = termin.paabgabe_id + // 9 => magic number for "noch nicht eingetragen" + termin.note = termin.note?.note ?? 9 + this.$api.call(ApiAbgabe.postProjektarbeitAbgabe(termin)).then( (res) => { if(res?.meta?.status == 'success') { this.$fhcAlert.alertSuccess(this.$p.t('ui/gespeichert')) @@ -69,8 +51,10 @@ export const AbgabeMitarbeiterDetail = { 'fixtermin': false, 'kurzbz': '', 'datum': new Date().toISOString().split('T')[0], - 'paabgabetyp_kurzbz': '', - 'bezeichnung': '', + 'paabgabetyp_kurzbz': termin.paabgabetyp_kurzbz, + 'note': this.allowedNotenOptions.find(opt => opt.note == termin.note?.note), + 'upload_required': termin.upload_required, + 'bezeichnung': this.abgabeTypeOptions.find(opt => opt.paabgabetyp_kurzbz === termin.paabgabetyp_kurzbz), 'abgabedatum': null, 'insertvon': this.viewData?.uid ?? '', 'allowedToSave': true, @@ -149,6 +133,9 @@ export const AbgabeMitarbeiterDetail = { getOptionLabelAbgabetyp(option){ return option.bezeichnung }, + getNotenOptionLabel(option) { + return option.bezeichnung + }, formatDate(dateParam) { const date = new Date(dateParam) // handle missing leading 0 @@ -200,10 +187,8 @@ export const AbgabeMitarbeiterDetail = { template: `{{projektarbeit?.student}}
@@ -248,7 +233,9 @@ export const AbgabeMitarbeiterDetail = {