From f89a53b156e5afe90bb432253073b480a901651f Mon Sep 17 00:00:00 2001 From: Johann Hoffmann Date: Mon, 17 Nov 2025 11:47:00 +0100 Subject: [PATCH] fix getProjektbetreuerAnrede function since betreuer are not necessarily mitarbeiter with such an uid; notify students config from milliseconds to pgsql interval '1 day'; ported notifyBetreuerMail & notifyStudentMail to AbgabetoolJob.php; --- application/config/abgabe.php | 3 +- .../controllers/api/frontend/v1/Abgabe.php | 396 ++++++++++-------- .../controllers/jobs/AbgabetoolJob.php | 125 ++++-- .../models/education/Paabgabe_model.php | 23 +- .../models/education/Projektarbeit_model.php | 9 +- 5 files changed, 338 insertions(+), 218 deletions(-) diff --git a/application/config/abgabe.php b/application/config/abgabe.php index beacb2b87..9265c70be 100644 --- a/application/config/abgabe.php +++ b/application/config/abgabe.php @@ -7,5 +7,4 @@ $config['turnitin_link'] = 'https://technikum-wien.turnitin.com/sso/sp/redwood/s $config['old_abgabe_beurteilung_link'] = 'https://moodle.technikum-wien.at/mod/page/view.php?id=1005052'; -//$config['PAABGABE_EMAIL_THRESHOLD_MS'] = 86400000; // 1 day -$config['PAABGABE_EMAIL_THRESHOLD_MS'] = 864000000; // 10 day \ No newline at end of file +$config['PAABGABE_EMAIL_JOB_INTERVAL'] = '1 day'; \ 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 c3dd3f06d..f25b30e83 100644 --- a/application/controllers/api/frontend/v1/Abgabe.php +++ b/application/controllers/api/frontend/v1/Abgabe.php @@ -41,8 +41,9 @@ class Abgabe extends FHCAPI_Controller 'getNoten' => self::PERM_LOGGED, 'getProjektarbeitenForStudiengang' =>array('basis/abgabe_assistenz:rw'), 'getStudiengaenge' => array('basis/abgabe_assistenz:rw'), - 'getStudentProjektarbeitAbgabeFile' => array('basis/abgabe_student:rw', 'basis/abgabe_lektor:rw', 'basis/abgabe_assistenz:rw'), - 'notifyStudentMail' => self::PERM_LOGGED + 'getStudentProjektarbeitAbgabeFile' => array('basis/abgabe_student:rw', 'basis/abgabe_lektor:rw', 'basis/abgabe_assistenz:rw') +// 'notifyStudentMail' => self::PERM_LOGGED, +// 'notifyBetreuerMail' => self::PERM_LOGGED ]); $this->load->library('PhrasesLib'); @@ -396,6 +397,17 @@ class Abgabe extends FHCAPI_Controller $this->terminateWithError($this->p->t('abgabetool','c4fehlerAktualitaetProjektarbeit'), 'general'); } + // Link to Abgabetool + if (defined('CIS4') && CIS4) { + $ci3BootstrapFilePath = "cis.php"; + } else { + $ci3BootstrapFilePath = "index.ci.php"; + } + $url = APP_ROOT . $ci3BootstrapFilePath . '/Cis/Abgabetool/Mitarbeiter'; + + $this->addMeta('betreuerArray', $resBetr->retval); + + // getProjektbetreuerAnrede fetches distinct on person_id, so there should be one row. zweitbetreuer is handled seperately afterwards foreach($resBetr->retval as $betreuerRow) { // query student benutzer view for every betreuer row @@ -415,7 +427,7 @@ class Abgabe extends FHCAPI_Controller $maildata['student_anrede'] = $studentUser->anrede; $maildata['student_voller_name'] = trim($studentUser->titelpre." ".$studentUser->vorname." ".$studentUser->nachname." ".$studentUser->titelpost); $maildata['abgabetyp'] = $abgabetyp; - $maildata['parbeituebersichtlink'] = "

Zur Projektarbeitsรผbersicht

"; + $maildata['parbeituebersichtlink'] = "

Zur Projektarbeitsรผbersicht

"; $maildata['bewertunglink'] = $projektarbeitIsCurrent && $paabgabetyp_kurzbz == 'end' ? "

Zur Beurteilung der Arbeit

" : ""; $maildata['token'] = ""; @@ -424,38 +436,20 @@ class Abgabe extends FHCAPI_Controller if(!$email) $this->terminateWithError($this->p->t('abgabetool', 'fehlerMailBegutachter'), 'general'); $this->addMeta('$maildata', $maildata); - // TODO: dont acutally send the mail but save it somewhere for job to send later? - $sanchoData = array('ParbeitsbeurteilungEndupload', $maildata, $email, $subject, 'sancho_header_min_bw.jpg', 'sancho_footer_min_bw.jpg', get_uid()."@".DOMAIN); - -// $this->logLib->logInfoDB( -// array( -// 'zwischenupload', -// $sanchoData, -// array( -// 'abgabedatum' => date('Y-m-d'), -// 'updatevon' => getAuthUID(), -// 'updateamum' => date('Y-m-d H:i:s') -// ), -// getAuthUID(), -// getAuthPersonId(), -// $student_uid -// ) -// ); + $mailres = sendSanchoMail( + 'ParbeitsbeurteilungEndupload', + $maildata, + $email, + $subject, + 'sancho_header_min_bw.jpg', + 'sancho_footer_min_bw.jpg', + get_uid()."@".DOMAIN); -// $mailres = sendSanchoMail( -// 'ParbeitsbeurteilungEndupload', -// $maildata, -// $email, -// $subject, -// 'sancho_header_min_bw.jpg', -// 'sancho_footer_min_bw.jpg', -// get_uid()."@".DOMAIN); - -// if(!$mailres) -// { -// $this->terminateWithError($this->p->t('abgabetool', 'fehlerMailBegutachter'), 'general'); -// } + if(!$mailres) + { + $this->terminateWithError($this->p->t('abgabetool', 'fehlerMailBegutachter'), 'general'); + } // 2. Begutachter mail, wenn Endabgabe, mit Token wenn extern if ($paabgabetyp_kurzbz == 'end') @@ -468,7 +462,6 @@ class Abgabe extends FHCAPI_Controller if ($zweitbegutachterRetval && count($zweitbegutachterRetval) > 0) { -// $zweitbegutachterResults = $zweitbegutachterRetval[0]; foreach ($zweitbegutachterRetval as $begutachter) { @@ -482,56 +475,50 @@ class Abgabe extends FHCAPI_Controller $begutachterMitTokenRetval = getData($this->ProjektbetreuerModel->getZweitbegutachterWithToken($bperson_id, $projektarbeit_id, $studentUser->uid, $begutachter->person_id)); - $this->addMeta('$begutachterMitTokenRes', $begutachterMitTokenRetval); + $this->addMeta('$begutachterMitTokenRetval', $begutachterMitTokenRetval); -// $begutachterMitTokenRes = $zweitbegutachterMitToken->getZweitbegutachterWithToken($bperson_id, $projektarbeit_id, $studentUser->uid, $begutachter->person_id); - if (!$begutachterMitTokenRetval && count($begutachterMitTokenRetval) <= 0) { $this->terminateWithError($this->p->t('abgabetool', 'fehlerMailZweitBegutachter'), 'general'); } - - // was this check ever necessary? -// // Email an Zweitbegutachter senden -// if (isset($zweitbegutachterMitToken->result[0])) -// { - $begutachterMitToken = $begutachterMitTokenRetval[0]; - - $path = $begutachterMitToken->betreuerart_kurzbz == 'Zweitbegutachter' ? 'ProjektarbeitsbeurteilungZweitbegutachter' : 'ProjektarbeitsbeurteilungErstbegutachter'; - $mail_baselink = APP_ROOT."index.ci.php/extensions/FHC-Core-Projektarbeitsbeurteilung/$path"; - $mail_fulllink = "$mail_baselink?projektarbeit_id=".$projektarbeit_id."&uid=".$studentUser->uid; - $intern = isset($begutachterMitToken->uid); - $mail_link = $intern ? $mail_fulllink : $mail_baselink; - - $zweitbetmaildata = array(); - $zweitbetmaildata['geehrt'] = "geehrte" . ($begutachterMitToken->anrede == "Herr" ? "r" : ""); - $zweitbetmaildata['anrede'] = $begutachterMitToken->anrede; - $zweitbetmaildata['betreuer_voller_name'] = $begutachterMitToken->voller_name; - $zweitbetmaildata['student_anrede'] = $maildata['student_anrede']; - $zweitbetmaildata['student_voller_name'] = $maildata['student_voller_name']; - $zweitbetmaildata['abgabetyp'] = $abgabetyp; - $zweitbetmaildata['parbeituebersichtlink'] = $intern ? $maildata['parbeituebersichtlink'] : ""; - $zweitbetmaildata['bewertunglink'] = $projektarbeitIsCurrent ? "

Zur Beurteilung der Arbeit

" : ""; - $zweitbetmaildata['token'] = $projektarbeitIsCurrent && isset($begutachterMitToken->zugangstoken) && !$intern ? "

Zugangstoken: " . $begutachterMitToken->zugangstoken . "

" : ""; - - $this->addMeta('$zweitbetmaildata', $zweitbetmaildata); - -// TODO: persist email event somehow, let job bundle the updates later? -// $mailres = sendSanchoMail( -// 'ParbeitsbeurteilungEndupload', -// $zweitbetmaildata, -// $begutachterMitToken->email, -// $subject, -// 'sancho_header_min_bw.jpg', -// 'sancho_footer_min_bw.jpg', -// get_uid()."@".DOMAIN -// ); -// -// if (!$mailres) -// { -// $this->terminateWithError($this->p->t('abgabetool', 'fehlerMailBegutachter'), 'general'); -// } + $begutachterMitToken = $begutachterMitTokenRetval[0]; + + $path = $begutachterMitToken->betreuerart_kurzbz == 'Zweitbegutachter' ? 'ProjektarbeitsbeurteilungZweitbegutachter' : 'ProjektarbeitsbeurteilungErstbegutachter'; + $mail_baselink = APP_ROOT."index.ci.php/extensions/FHC-Core-Projektarbeitsbeurteilung/$path"; + $mail_fulllink = "$mail_baselink?projektarbeit_id=".$projektarbeit_id."&uid=".$studentUser->uid; + $intern = isset($begutachterMitToken->uid); + $mail_link = $intern ? $mail_fulllink : $mail_baselink; + + $zweitbetmaildata = array(); + $zweitbetmaildata['geehrt'] = "geehrte" . ($begutachterMitToken->anrede == "Herr" ? "r" : ""); + $zweitbetmaildata['anrede'] = $begutachterMitToken->anrede; + $zweitbetmaildata['betreuer_voller_name'] = $begutachterMitToken->voller_name; + $zweitbetmaildata['student_anrede'] = $maildata['student_anrede']; + $zweitbetmaildata['student_voller_name'] = $maildata['student_voller_name']; + $zweitbetmaildata['abgabetyp'] = $abgabetyp; + $zweitbetmaildata['parbeituebersichtlink'] = $intern ? $maildata['parbeituebersichtlink'] : ""; + $zweitbetmaildata['bewertunglink'] = $projektarbeitIsCurrent ? "

Zur Beurteilung der Arbeit

" : ""; + $zweitbetmaildata['token'] = $projektarbeitIsCurrent && isset($begutachterMitToken->zugangstoken) && !$intern ? "

Zugangstoken: " . $begutachterMitToken->zugangstoken . "

" : ""; + + $this->addMeta('$zweitbetmaildata', $zweitbetmaildata); + +// TODO: persist email event somehow, let job bundle the updates later? + $mailres = sendSanchoMail( + 'ParbeitsbeurteilungEndupload', + $zweitbetmaildata, + $begutachterMitToken->email, + $subject, + 'sancho_header_min_bw.jpg', + 'sancho_footer_min_bw.jpg', + get_uid()."@".DOMAIN + ); + + if (!$mailres) + { + $this->terminateWithError($this->p->t('abgabetool', 'fehlerMailBegutachter'), 'general'); + } + } } } @@ -998,94 +985,171 @@ class Abgabe extends FHCAPI_Controller } } - - - // test method for abgabe nightly email job - public function notifyStudentMail() - { - // send all new projektarbeit abgabe since the last job run to the related student - -// $this->logInfo('Start job queue scheduler FHC-Core->notifyBetreuerMail'); - $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); - $this->load->model('education/Paabgabe_model', 'PaabgabeModel'); - $this->load->model('crm/Student_model', 'StudentModel'); - - $milliseconds = $this->config->item('PAABGABE_EMAIL_THRESHOLD_MS'); - - $result = $this->PaabgabeModel->findAbgabenNewOrUpdatedSince($milliseconds); - $retval = getData($result); - - // group results per projektarbeit/student_uid - $student_uids = []; - forEach($retval as $paabgabe) { - if(!isset($student_uids[$paabgabe->student_uid])) { - $student_uids[$paabgabe->student_uid] = []; - } - - $student_uids[$paabgabe->student_uid][] = $paabgabe; - } - - foreach ($student_uids as $uid => $abgaben) { - // $uid is the student's UID - $result = $this->StudentModel->getEmailAnredeForStudentUID($uid); - $data = getData($result)[0]; - - // $abgabe is the array of paabgabe objects - $anredeFillString = $data->anrede=="Herr"?"r":""; - $fullFormattedNameString = trim($data->titelpre." ".$data->vorname." ".$data->vornamen." ".$data->nachname." ".$data->titelpost); - - // https://www.php.net/manual/en/migration70.new-features.php#migration70.new-features.spaceship-op - // php has spaceships ๐Ÿš€๐Ÿš€๐Ÿš€๐Ÿš€๐Ÿš€ - usort($abgaben, function($a, $b) { - return strtotime($a->datum) <=> strtotime($b->datum); - }); - - $projektarbeit_titel = $abgaben[0]->titel; - $abgabenString = '

'; - forEach($abgaben as $abgabe) { - $datetime = new DateTime($abgabe->datum); - $dateEmailFormatted = $datetime->format('d.m.Y'); - - $abgabenString .= $dateEmailFormatted.' '.$abgabe->bezeichnung.' '.$abgabe->kurzbz.'
'; - } - - // Link to Entschuldigungsmanagement - if(defined('CIS4') && CIS4) { - $ci3BootstrapFilePath = "cis.php"; - } else { - $ci3BootstrapFilePath = "index.ci.php"; - } - $url = APP_ROOT.$ci3BootstrapFilePath.'/Cis/Abgabetool/Student'; - -// $linkAbgabetool = ''; - $body_fields = array( - 'anrede' => $data->anrede, - 'anredeFillString' => $anredeFillString, - 'fullFormattedNameString' => $fullFormattedNameString, - 'paTitel' => $projektarbeit_titel, - 'abgabenString' => $abgabenString, - 'linkAbgabetool' => $url - ); - - // send email with bundled info - sendSanchoMail( - 'paabgabeUpdatesSammelmail', - $body_fields, - $uid.'@'.DOMAIN, - $this->p->t('abgabetool', 'changedAbgabeterminev2') - ); - - } - - $this->terminateWithSuccess( - array( - 'student_uids' => $student_uids, - 'result' => $result, - 'body_fields' => $body_fields - ) - ); - - } +// public function notifyBetreuerMail() { +// // send all new projektarbeit abgabe UPLOADS since the last job run to the related betreuer +// // this job gathers all new or changed file uploads via field 'abgabedatum', enduploads still +// // send an email directly after happening since they are kind of important +// +//// $this->logInfo('Start job queue scheduler FHC-Core->notifyBetreuerMail'); +// $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); +// $this->load->model('education/Paabgabe_model', 'PaabgabeModel'); +// $this->load->model('crm/Student_model', 'StudentModel'); +// +// $interval = $this->config->item('PAABGABE_EMAIL_JOB_INTERVAL'); +// +// $result = $this->PaabgabeModel->findAbgabenNewOrUpdatedSinceByAbgabedatum($interval); +// $retval = getData($result); +// +// // retval are paabgaben joined with projektarbeit and betreuer +// if(count($retval) == 0) return; // TODO: terminate appropriately +// +// // group contents per betreuer person_id +// $betreuer_uids = []; +// forEach($retval as $paabgabe) { +// if(!isset($betreuer_uids[$paabgabe->person_id])) { +// $betreuer_uids[$paabgabe->person_id] = []; +// } +// +// $betreuer_uids[$paabgabe->person_id][] = $paabgabe; +// } +// +// forEach ($betreuer_uids as $person_id => $abgaben) { +// // $person_id is from betreuer +// +// $result = $this->ProjektarbeitModel->getProjektbetreuerAnrede($person_id); +// $data = getData($result)[0]; +// +// // $abgabe is the array of paabgabe objects +// $anrede = $data->anrede; +// $anredeFillString = $data->anrede == "Herr" ? "r" : ""; +// $fullFormattedNameString = $data->first; +// +// $result = $this->ProjektarbeitModel->getProjektbetreuerEmail($paabgabe->projektarbeit_id); +// $data = getData($result)[0]; +// +// // https://www.php.net/manual/en/migration70.new-features.php#migration70.new-features.spaceship-op +// // php has spaceships ๐Ÿš€๐Ÿš€๐Ÿš€๐Ÿš€๐Ÿš€ +// usort($abgaben, function ($a, $b) { +// return strtotime($a->datum) <=> strtotime($b->datum); +// }); +// +// $projektarbeit_titel = $abgaben[0]->titel; +// $abgabenString = '

'; +// foreach ($abgaben as $abgabe) { +// $datetime = new DateTime($abgabe->datum); +// $dateEmailFormatted = $datetime->format('d.m.Y'); +// +// $datetimeAbgabe = new DateTime($abgabe->abgabedatum); +// $abgabedatumFormatted = $datetimeAbgabe->format('d.m.Y'); +// +// $abgabenString .= 'Abgabedatum: '.$abgabedatumFormatted.' Zieldatum: '.$dateEmailFormatted . ' ' . $abgabe->bezeichnung . '
' . $abgabe->kurzbz . '
'; +// } +// +// // Link to Abgabetool +// if (defined('CIS4') && CIS4) { +// $ci3BootstrapFilePath = "cis.php"; +// } else { +// $ci3BootstrapFilePath = "index.ci.php"; +// } +// $url = APP_ROOT . $ci3BootstrapFilePath . '/Cis/Abgabetool/Mitarbeiter'; +// +// $body_fields = array( +// 'anrede' => $anrede, +// 'anredeFillString' => $anredeFillString, +// 'fullFormattedNameString' => $fullFormattedNameString, +// 'paTitel' => $projektarbeit_titel, +// 'abgabenString' => $abgabenString, +// 'linkAbgabetool' => $url +// ); +// +// // send email with bundled info +// sendSanchoMail( +// 'paabgabeUpdatesBetSM', +// $body_fields, +// $data->private_email, +// $this->p->t('abgabetool', 'changedAbgabeterminev2') +// ); +// } +// } +// +// public function notifyStudentMail() +// { +// // send all new projektarbeit abgabe since the last job run to the related student +// +//// $this->logInfo('Start job queue scheduler FHC-Core->notifyBetreuerMail'); +// $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); +// $this->load->model('education/Paabgabe_model', 'PaabgabeModel'); +// $this->load->model('crm/Student_model', 'StudentModel'); +// +// $interval = $this->config->item('PAABGABE_EMAIL_JOB_INTERVAL'); +// +// $result = $this->PaabgabeModel->findAbgabenNewOrUpdatedSince($interval); +// $retval = getData($result); +// +// if(count($retval) == 0) return; // TODO: terminate appropriately +// +// // group results per projektarbeit/student_uid +// $student_uids = []; +// forEach($retval as $paabgabe) { +// if(!isset($student_uids[$paabgabe->student_uid])) { +// $student_uids[$paabgabe->student_uid] = []; +// } +// +// $student_uids[$paabgabe->student_uid][] = $paabgabe; +// } +// +// foreach ($student_uids as $uid => $abgaben) { +// // $uid is the student's UID +// $result = $this->StudentModel->getEmailAnredeForStudentUID($uid); +// $data = getData($result)[0]; +// +// // $abgabe is the array of paabgabe objects +// $anredeFillString = $data->anrede=="Herr"?"r":""; +// $fullFormattedNameString = trim($data->titelpre." ".$data->vorname." ".$data->vornamen." ".$data->nachname." ".$data->titelpost); +// +// // https://www.php.net/manual/en/migration70.new-features.php#migration70.new-features.spaceship-op +// // php has spaceships ๐Ÿš€๐Ÿš€๐Ÿš€๐Ÿš€๐Ÿš€ +// usort($abgaben, function($a, $b) { +// return strtotime($a->datum) <=> strtotime($b->datum); +// }); +// +// $projektarbeit_titel = $abgaben[0]->titel; +// $abgabenString = '

'; +// forEach($abgaben as $abgabe) { +// $datetime = new DateTime($abgabe->datum); +// $dateEmailFormatted = $datetime->format('d.m.Y'); +// +// $abgabenString .= $dateEmailFormatted.' '.$abgabe->bezeichnung.' '.$abgabe->kurzbz.'
'; +// } +// +// // Link to Entschuldigungsmanagement +// if(defined('CIS4') && CIS4) { +// $ci3BootstrapFilePath = "cis.php"; +// } else { +// $ci3BootstrapFilePath = "index.ci.php"; +// } +// $url = APP_ROOT.$ci3BootstrapFilePath.'/Cis/Abgabetool/Student'; +// +//// $linkAbgabetool = ''; +// $body_fields = array( +// 'anrede' => $data->anrede, +// 'anredeFillString' => $anredeFillString, +// 'fullFormattedNameString' => $fullFormattedNameString, +// 'paTitel' => $projektarbeit_titel, +// 'abgabenString' => $abgabenString, +// 'linkAbgabetool' => $url +// ); +// +// // send email with bundled info +// sendSanchoMail( +// 'paabgabeUpdatesSammelmail', +// $body_fields, +// $uid.'@'.DOMAIN, +// $this->p->t('abgabetool', 'changedAbgabeterminev2') +// ); +// +// } +// } private function checkAbgabeSignatur($abgabe, $projektarbeit) { if($abgabe->paabgabetyp_kurzbz != 'end') { diff --git a/application/controllers/jobs/AbgabetoolJob.php b/application/controllers/jobs/AbgabetoolJob.php index 24c32db11..17eff0f74 100644 --- a/application/controllers/jobs/AbgabetoolJob.php +++ b/application/controllers/jobs/AbgabetoolJob.php @@ -15,76 +15,117 @@ class AbgabetoolJob extends JOB_Controller $this->_ci =& get_instance(); $this->_ci->load->helper('hlp_sancho_helper'); - + $this->_ci->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); $this->_ci->load->model('education/Paabgabe_model', 'PaabgabeModel'); - - // signatur fehlt mail $this->_ci->load->model('crm/Student_model', 'StudentModel'); - $this->_ci->load->model('organisation/Studiengang_model', 'StudiengangModel'); - - - // 2. begutachter mail - $this->_ci->load->model('education/Projektbetreuer_model', 'ProjektbetreuerModel'); $this->loadPhrases([ 'abgabetool' ]); - -// $this->_ci->load->model('extensions/FHC-Core-Anwesenheiten/QR_model', 'QRModel'); -// $this->_ci->load->config('extensions/FHC-Core-Anwesenheiten/qrsettings'); } - public function notifyBetreuerMail() - { - // send all new projektarbeit abgabe since the lat job run to the related betreuer - -// $this->logInfo('Start job queue scheduler FHC-Core->notifyBetreuerMail'); + public function notifyBetreuerMail() { + // send all new projektarbeit abgabe UPLOADS since the last job run to the related betreuer + // this job gathers all new or changed file uploads via field 'abgabedatum', enduploads still + // send an email directly after happening since they are kind of important - $milliseconds = $this->_ci->config->item('PAABGABE_UPDATEAMUM_EMAIL_THRESHOLD_MILLISECONDS'); + $this->_ci->logInfo('Start job queue scheduler FHC-Core->notifyBetreuerMail'); - $result = $this->PaabgabeModel->findAbgabenNewOrUpdatedSince($milliseconds); + $interval = $this->_ci->config->item('PAABGABE_EMAIL_JOB_INTERVAL'); + + $result = $this->_ci->PaabgabeModel->findAbgabenNewOrUpdatedSinceByAbgabedatum($interval); $retval = getData($result); - // group results per projektarbeit/student_uid - $student_uids = []; + // retval are paabgaben joined with projektarbeit and betreuer + if(count($retval) == 0) return; // TODO: terminate appropriately + + // group contents per betreuer person_id + $betreuer_uids = []; forEach($retval as $paabgabe) { - if(!in_array($paabgabe->student_uid, $student_uids, true)) { - $student_uids[$paabgabe->student_uid] = [$paabgabe]; - } else { - $student_uids[$paabgabe->student_uid][] = $paabgabe; + if(!isset($betreuer_uids[$paabgabe->person_id])) { + $betreuer_uids[$paabgabe->person_id] = []; } + + $betreuer_uids[$paabgabe->person_id][] = $paabgabe; } - - - - // send emails with bundled info - -// $rows_affected = $this->QRModel->db->affected_rows(); -// -// if (isError($result)) -// { -// $this->logError(getError($result), $milliseconds); -// } else { -// $this->logInfo($rows_affected." QR Codes deleted."); -// } -// -// $this->logInfo('End job queue scheduler FHC-Core->notifyBetreuerMail'); + + forEach ($betreuer_uids as $person_id => $abgaben) { + // $person_id is from betreuer + + $result = $this->_ci->ProjektarbeitModel->getProjektbetreuerAnrede($person_id); + $data = getData($result)[0]; + + // $abgabe is the array of paabgabe objects + $anrede = $data->anrede; + $anredeFillString = $data->anrede == "Herr" ? "r" : ""; + $fullFormattedNameString = $data->first; + + $result = $this->_ci->ProjektarbeitModel->getProjektbetreuerEmail($paabgabe->projektarbeit_id); + $data = getData($result)[0]; + + // https://www.php.net/manual/en/migration70.new-features.php#migration70.new-features.spaceship-op + // php has spaceships ๐Ÿš€๐Ÿš€๐Ÿš€๐Ÿš€๐Ÿš€ + usort($abgaben, function ($a, $b) { + return strtotime($a->datum) <=> strtotime($b->datum); + }); + + $projektarbeit_titel = $abgaben[0]->titel; + $abgabenString = '

'; + foreach ($abgaben as $abgabe) { + $datetime = new DateTime($abgabe->datum); + $dateEmailFormatted = $datetime->format('d.m.Y'); + + $datetimeAbgabe = new DateTime($abgabe->abgabedatum); + $abgabedatumFormatted = $datetimeAbgabe->format('d.m.Y'); + + $abgabenString .= 'Abgabedatum: '.$abgabedatumFormatted.' Zieldatum: '.$dateEmailFormatted . ' ' . $abgabe->bezeichnung . '
' . $abgabe->kurzbz . '
'; + } + + // Link to Abgabetool + if (defined('CIS4') && CIS4) { + $ci3BootstrapFilePath = "cis.php"; + } else { + $ci3BootstrapFilePath = "index.ci.php"; + } + $url = APP_ROOT . $ci3BootstrapFilePath . '/Cis/Abgabetool/Mitarbeiter'; + + $body_fields = array( + 'anrede' => $anrede, + 'anredeFillString' => $anredeFillString, + 'fullFormattedNameString' => $fullFormattedNameString, + 'paTitel' => $projektarbeit_titel, + 'abgabenString' => $abgabenString, + 'linkAbgabetool' => $url + ); + + // send email with bundled info + sendSanchoMail( + 'paabgabeUpdatesBetSM', + $body_fields, + $data->private_email, + $this->p->t('abgabetool', 'changedAbgabeterminev2') + ); + } + + $this->_ci->logInfo('End job queue scheduler FHC-Core->notifyBetreuerMail'); } public function notifyStudentMail() { // send all new projektarbeit abgabe since the last job run to the related student - $this->logInfo('Start job queue scheduler FHC-Core->notifyStudentMail'); + $this->_ci->logInfo('Start job queue scheduler FHC-Core->notifyStudentMail'); - $milliseconds = $this->_ci->config->item('PAABGABE_EMAIL_THRESHOLD_MS'); + $interval = $this->_ci->config->item('PAABGABE_EMAIL_JOB_INTERVAL'); - $result = $this->_ci->PaabgabeModel->findAbgabenNewOrUpdatedSince($milliseconds); + $result = $this->_ci->PaabgabeModel->findAbgabenNewOrUpdatedSince($interval); $retval = getData($result); + if(count($retval) == 0) return; // TODO: terminate appropriately + // group results per projektarbeit/student_uid $student_uids = []; forEach($retval as $paabgabe) { diff --git a/application/models/education/Paabgabe_model.php b/application/models/education/Paabgabe_model.php index e2ccfaaca..9edfc68ac 100644 --- a/application/models/education/Paabgabe_model.php +++ b/application/models/education/Paabgabe_model.php @@ -61,9 +61,9 @@ class Paabgabe_model extends DB_Model return $this->execReadOnlyQuery($qry, array($person_id)); } - public function findAbgabenNewOrUpdatedSince($milliseconds) + public function findAbgabenNewOrUpdatedSince($interval) { - $interval = $milliseconds . ' milliseconds'; + $query = "SELECT projektarbeit_id, paabgabe_id, paabgabetyp_kurzbz, fixtermin, datum, kurzbz, campus.tbl_paabgabetyp.bezeichnung, campus.tbl_paabgabe.abgabedatum, campus.tbl_paabgabe.insertvon, campus.tbl_paabgabe.insertamum, campus.tbl_paabgabe.updatevon, campus.tbl_paabgabe.updateamum, campus.tbl_paabgabe.note, upload_allowed, beurteilungsnotiz, student_uid, tbl_projektarbeit.note, lehre.tbl_projektarbeit.titel @@ -77,4 +77,23 @@ class Paabgabe_model extends DB_Model return $this->execQuery($query, [$interval, $interval]); } + + public function findAbgabenNewOrUpdatedSinceByAbgabedatum($interval) { + + $query = "SELECT projektarbeit_id, paabgabe_id, paabgabetyp_kurzbz, fixtermin, datum, kurzbz, campus.tbl_paabgabetyp.bezeichnung, campus.tbl_paabgabe.abgabedatum, + campus.tbl_paabgabe.insertvon, campus.tbl_paabgabe.insertamum, campus.tbl_paabgabe.updatevon, campus.tbl_paabgabe.updateamum, + campus.tbl_paabgabe.note, upload_allowed, beurteilungsnotiz, student_uid, tbl_projektarbeit.note, lehre.tbl_projektarbeit.titel, + lehre.tbl_projektbetreuer.betreuerart_kurzbz, lehre.tbl_projektbetreuer.person_id + FROM campus.tbl_paabgabe + JOIN campus.tbl_paabgabetyp USING (paabgabetyp_kurzbz) + JOIN lehre.tbl_projektarbeit USING (projektarbeit_id) + JOIN lehre.tbl_projektbetreuer USING (projektarbeit_id) + + WHERE campus.tbl_paabgabe.abgabedatum IS NOT NULL + AND campus.tbl_paabgabe.abgabedatum >= NOW() - INTERVAL ? + ORDER BY abgabedatum DESC + "; + + return $this->execQuery($query, [$interval]); + } } diff --git a/application/models/education/Projektarbeit_model.php b/application/models/education/Projektarbeit_model.php index 9def13ddb..bd1a06b60 100644 --- a/application/models/education/Projektarbeit_model.php +++ b/application/models/education/Projektarbeit_model.php @@ -204,12 +204,9 @@ class Projektarbeit_model extends DB_Model } public function getProjektbetreuerAnrede($bperson_id) { - $qry_betr="SELECT DISTINCT trim(COALESCE(titelpre,'')||' '||COALESCE(vorname,'')||' '||COALESCE(nachname,'')||' '||COALESCE(titelpost,'')) as first, - public.tbl_mitarbeiter.mitarbeiter_uid, anrede - FROM public.tbl_person JOIN lehre.tbl_projektbetreuer ON(lehre.tbl_projektbetreuer.person_id=public.tbl_person.person_id) - LEFT JOIN public.tbl_benutzer ON(public.tbl_benutzer.person_id=public.tbl_person.person_id) - LEFT JOIN public.tbl_mitarbeiter ON(public.tbl_benutzer.uid=public.tbl_mitarbeiter.mitarbeiter_uid) - WHERE public.tbl_person.person_id= ?"; + $qry_betr="SELECT DISTINCT ON(public.tbl_person.person_id) trim(COALESCE(titelpre,'')||' '||COALESCE(vorname,'')||' '||COALESCE(nachname,'')||' '||COALESCE(titelpost,'')) as first, anrede + FROM public.tbl_person JOIN lehre.tbl_projektbetreuer ON(lehre.tbl_projektbetreuer.person_id=public.tbl_person.person_id) + WHERE public.tbl_person.person_id= ?"; return $this->execReadOnlyQuery($qry_betr, [$bperson_id]); }