_ci =& get_instance(); $this->_ci->load->helper('hlp_sancho_helper'); $this->_ci->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); $this->_ci->load->model('education/Projektbetreuer_model', 'ProjektbetreuerModel'); $this->_ci->load->model('education/Paabgabe_model', 'PaabgabeModel'); $this->_ci->load->model('crm/Student_model', 'StudentModel'); $this->_ci->load->model('organisation/Studiengang_model', 'StudiengangModel'); $this->_ci->load->model('organisation/Organisationseinheit_model', 'OrganisationseinheitModel'); $this->_ci->load->library('SignatureLib'); $this->_ci->load->config('abgabe'); $this->loadPhrases([ 'abgabetool' ]); } // basically the notifyBetreuerMail function but email goes to assistenz // and new abgaben are further evaluated for missing signature status public function notifyAssistenzAboutMissingSignatureUploads() { $this->_ci->logInfo('Start job FHC-Core->notifyAssistenzAboutMissingSignatureUploads'); $interval = $this->_ci->config->item('PAABGABE_EMAIL_JOB_INTERVAL'); $relevantTypes = $this->_ci->config->item('RELEVANT_PAABGABETYPEN_SAMMELMAIL_ASSISTENZ'); $result = $this->_ci->PaabgabeModel->findAbgabenNewOrUpdatedSinceByAbgabedatum($interval, $relevantTypes); $retval = getData($result); // retval are paabgaben joined with projektarbeit and betreuer if(count($retval) == 0) { $this->logInfo("Keine Emails über neue Paabgaben an Assistenzen versandt"); return; } // group changed/new abgaben for projektarbeiten $projektarbeiten = []; foreach($retval as $abgabeWithNewUpload) { // Check if the current item has a 'projektarbeit_id' field. // Replace 'projektarbeit_id' with the actual key name if it's different. if (isset($abgabeWithNewUpload->projektarbeit_id)) { $projektarbeitId = $abgabeWithNewUpload->projektarbeit_id; // If the 'projektarbeit_id' is not yet a key in $projektarbeiten, // initialize it as an empty array. if (!isset($projektarbeiten[$projektarbeitId])) { $projektarbeiten[$projektarbeitId] = []; } // check signature for that abgabe, main point of this job $this->checkAbgabeSignatur($abgabeWithNewUpload, $abgabeWithNewUpload->student_uid); // Add the current row to the array associated with its 'projektarbeit_id'. $projektarbeiten[$projektarbeitId][] = $abgabeWithNewUpload; } } // for each projektarbeit fetch their assistenz and same them in their own dictionary to avoid too many mails $assistenzMap = []; // for each projektarbeit fetch their betreuer and save them in their own dictionary to avoid too many mails $projektarbeitBetreuerMap = []; forEach($projektarbeiten as $projektarbeit_id => $abgaben) { $assistenzResult = $this->_ci->OrganisationseinheitModel->getAssistenzForOE($abgaben[0]->stg_oe_kurzbz); forEach($assistenzResult->retval as $assistenzRow) { if (!isset($assistenzMap[$assistenzRow->person_id])) { $assistenzMap[$assistenzRow->person_id] = []; } // Add the current $assistenzRow to the $assistenzMap as an array associated with its projektarbeit_id. $assistenzMap[$assistenzRow->person_id][] = [$projektarbeit_id, $assistenzRow]; } $betreuerResult = $this->_ci->ProjektbetreuerModel->getAllBetreuerOfProjektarbeit($projektarbeit_id); forEach($betreuerResult->retval as $betreuerRow) { if (!isset($projektarbeitBetreuerMap[$projektarbeit_id])) { $projektarbeitBetreuerMap[$projektarbeit_id] = []; } // Add the current betreuerRow to the betreuerMap as an array associated with its projektarbeit_id. $projektarbeitBetreuerMap[$projektarbeit_id][] = $betreuerRow; } } $count = 0; foreach($assistenzMap as $assistenz_person_id => $tupelArr) { $abgabenString = '
'; $hasIssues = false; // Track if this assistant actually needs an email foreach($tupelArr as $tupel) { $projektarbeit_id = $tupel[0]; $assistenzRow = $tupel[1]; $betreuerArray = $projektarbeitBetreuerMap[$projektarbeit_id] ?? []; $allAbgaben = $projektarbeiten[$projektarbeit_id]; // only keep abgaben that are not correctly signed $issueAbgaben = array_filter($allAbgaben, function($abgabe) { // We only care about cases where it's explicitly NOT true (false, error, or null) return $abgabe->signatur !== true; }); // if this specific project has no signature issues, skip to the next project if(empty($issueAbgaben)) { continue; } // If we reached here, we have at least one issue to report $hasIssues = true; // Format the Student Name (using the first available abgabe object) $s = reset($issueAbgaben); $nameParts = array_filter([$s->titelpre, $s->vorname, $s->nachname, $s->titelpost]); $studentFullName = implode(' ', $nameParts); // Format the Supervisors string $betreuerStrings = []; foreach($betreuerArray as $b) { $bNameParts = array_filter([$b->titelpre, $b->vorname, $b->nachname, $b->titelpost]); $bFullName = implode(' ', $bNameParts); $betreuerStrings[] = "{$bFullName} ({$b->betreuerart_kurzbz})"; } $allBetreuerFormatted = implode(', ', $betreuerStrings); $projektarbeit_titel = $s->titel ?? 'Kein Titel vergeben'; // Project Header Section $abgabenString .= "
Projekt: {$projektarbeit_titel}
Studierende/r: {$studentFullName}
Betreuer: {$allBetreuerFormatted}
ID: {$projektarbeit_id} | Stg: {$s->stgtyp}{$s->stgkz} ({$s->studiensemester_kurzbz})
"; // Start Table $abgabenString .= ' '; $printed = []; // lazy hack to avoid duplicate rows foreach ($issueAbgaben as $abgabe) { // if we had this paabgabe already (erstbetreuer/zweitbetreuer fetch achieves duplicates if(in_array($abgabe->paabgabe_id, $printed)) { continue; // skip this forEach iteration } $printed[] = $abgabe->paabgabe_id; $abgabedatumFormatted = (new DateTime($abgabe->abgabedatum))->format('d.m.Y'); // label and color if ($abgabe->signatur === false) { $sigLabel = "FEHLENDE SIGNATUR"; $sigBg = "#dc3545"; } elseif ($abgabe->signatur === 'error') { $sigLabel = "PRÜFUNG FEHLGESCHLAGEN"; $sigBg = "#fd7e14"; } else { $sigLabel = "DATEI NICHT GEFUNDEN"; $sigBg = "#6c757d"; } $abgabenString .= " "; } $abgabenString .= '
Datum Abgabe/Bezeichnung Status
{$abgabedatumFormatted} {$abgabe->bezeichnung} {$sigLabel}
'; } $abgabenString .= '
'; // only send the email if at least one project had an issue if ($hasIssues) { $assistenzRow = $tupelArr[0][1]; $anrede = $assistenzRow->anrede; $anredeFillString = $assistenzRow->anrede == "Herr" ? "r" : ""; $fullFormattedNameString = $assistenzRow->first; $path = $this->_ci->config->item('URL_ASSISTENZ'); $url = CIS_ROOT . $path; $body_fields = array( 'anrede' => $anrede, 'anredeFillString' => $anredeFillString, 'fullFormattedNameString' => $fullFormattedNameString, 'abgabenString' => $abgabenString, 'linkAbgabetool' => $url ); $email = $assistenzRow->uid . "@" . DOMAIN; sendSanchoMail( 'PAANoSigAssSM', $body_fields, $email, $this->p->t('abgabetool', 'c4missingSignatureNotification') ); $count++; } } $this->_ci->logInfo($count . " Emails bezüglich fehlender Signaturen erfolgreich versandt"); $this->_ci->logInfo('End job FHC-Core->notifyAssistenzAboutMissingSignatureUploads'); } /** * helper function to check the signature status of uploaded files for zwischenabgabe & endupload */ private function checkAbgabeSignatur($abgabe, $student_uid) { $paabgabetypenToCheck = $this->config->item('SIGNATUR_CHECK_PAABGABETYPEN'); if(!in_array($abgabe->paabgabetyp_kurzbz, $paabgabetypenToCheck)) { return; } if (!defined('SIGNATUR_URL')) { $abgabe->signatur = 'error'; return; } $path = PAABGABE_PATH.$abgabe->paabgabe_id.'_'.$student_uid.'.pdf'; $signaturVorhanden = null; // if frontend receives null -> indicates no file found at path if(file_exists($path)) { // Check if the document is signed $signList = SignatureLib::list($path); if (is_array($signList) && count($signList) > 0) { // The document is signed $signaturVorhanden = true; } elseif ($signList === null) { // frontend knows to handle it this way for signatures $signaturVorhanden = 'error'; } else { $signaturVorhanden = false; } $abgabe->signatur = $signaturVorhanden; } } public function notifyAssistenzAboutChangedAbgaben() { $this->_ci->logInfo('Start job FHC-Core->notifyAssistenzAboutChangedAbgaben'); $interval = $this->_ci->config->item('PAABGABE_EMAIL_JOB_INTERVAL'); $relevantTypes = $this->_ci->config->item('RELEVANT_PAABGABETYPEN_SAMMELMAIL_ASSISTENZ'); // get all new or changed termine in interval $result = $this->_ci->PaabgabeModel->findAbgabenNewOrUpdatedSince($interval, $relevantTypes); $retval = getData($result); if(count($retval) == 0) { $this->_ci->logInfo("Keine Emails an Assistenzen über neue oder veränderte Termine versandt"); return; } // group changed/new abgaben for projektarbeiten $projektarbeiten = []; foreach($retval as $newOrChangedAbgabe) { // Check if the current item has a 'projektarbeit_id' field. // Replace 'projektarbeit_id' with the actual key name if it's different. if (isset($newOrChangedAbgabe->projektarbeit_id)) { $projektarbeitId = $newOrChangedAbgabe->projektarbeit_id; // If the 'projektarbeit_id' is not yet a key in $projektarbeiten, // initialize it as an empty array. if (!isset($projektarbeiten[$projektarbeitId])) { $projektarbeiten[$projektarbeitId] = []; } // Add the current row to the array associated with its 'projektarbeit_id'. $projektarbeiten[$projektarbeitId][] = $newOrChangedAbgabe; } } // for each projektarbeit fetch their assistenz and same them in their own dictionary to avoid too many mails $assistenzMap = []; // for each projektarbeit fetch their betreuer and save them in their own dictionary to avoid too many mails $projektarbeitBetreuerMap = []; forEach($projektarbeiten as $projektarbeit_id => $abgaben) { $assistenzResult = $this->_ci->OrganisationseinheitModel->getAssistenzForOE($abgaben[0]->stg_oe_kurzbz); forEach($assistenzResult->retval as $assistenzRow) { if (!isset($assistenzMap[$assistenzRow->person_id])) { $assistenzMap[$assistenzRow->person_id] = []; } // Add the current $assistenzRow to the $assistenzMap as an array associated with its projektarbeit_id. $assistenzMap[$assistenzRow->person_id][] = [$projektarbeit_id, $assistenzRow]; } $betreuerResult = $this->_ci->ProjektbetreuerModel->getAllBetreuerOfProjektarbeit($projektarbeit_id); forEach($betreuerResult->retval as $betreuerRow) { if (!isset($projektarbeitBetreuerMap[$projektarbeit_id])) { $projektarbeitBetreuerMap[$projektarbeit_id] = []; } // Add the current betreuerRow to the betreuerMap as an array associated with its projektarbeit_id. $projektarbeitBetreuerMap[$projektarbeit_id][] = $betreuerRow; } } $count = 0; foreach($assistenzMap as $assistenz_person_id => $tupelArr) { $abgabenString = '
'; foreach($tupelArr as $tupel) { $projektarbeit_id = $tupel[0]; $assistenzRow = $tupel[1]; $betreuerArray = $projektarbeitBetreuerMap[$projektarbeit_id] ?? []; $changedAbgaben = $projektarbeiten[$projektarbeit_id]; $relevantAbgaben = array_values(array_filter($changedAbgaben, function($abgabetermin) use ($assistenzRow) { if($abgabetermin->updatevon == null && $abgabetermin->insertvon != $assistenzRow->uid) { return $abgabetermin; } else if($abgabetermin->updatevon != null && $abgabetermin->updatevon != $assistenzRow->uid) { return $abgabetermin; } })); if(count($relevantAbgaben) == 0) { continue; } // Format the Student Name $s = $relevantAbgaben[0]; $nameParts = []; if (!empty($s->titelpre)) $nameParts[] = $s->titelpre; $nameParts[] = $s->vorname; $nameParts[] = $s->nachname; if (!empty($s->titelpost)) $nameParts[] = $s->titelpost; $studentFullName = implode(' ', $nameParts); // Format the Supervisors string $betreuerStrings = []; foreach($betreuerArray as $b) { $bNameParts = []; if (!empty($b->titelpre)) $bNameParts[] = $b->titelpre; $bNameParts[] = $b->vorname; $bNameParts[] = $b->nachname; if (!empty($b->titelpost)) $bNameParts[] = $b->titelpost; $bFullName = implode(' ', $bNameParts); $betreuerStrings[] = "{$bFullName} ({$b->betreuerart_kurzbz})"; } $allBetreuerFormatted = implode(', ', $betreuerStrings); $projektarbeit_titel = $s->titel ?? 'Kein Titel vergeben'; // Project Header Section $abgabenString .= "
Projekt: {$projektarbeit_titel}
Studierende/r: {$studentFullName}
Betreuer: {$allBetreuerFormatted}
ID: {$projektarbeit_id} | Stg: {$s->stgtyp}{$s->stgkz} ({$s->studiensemester_kurzbz})
"; // Start Table $abgabenString .= ' '; foreach ($relevantAbgaben as $abgabe) { $dateEmailFormatted = (new DateTime($abgabe->datum))->format('d.m.Y'); $abgabedatumFormatted = (new DateTime($abgabe->abgabedatum))->format('d.m.Y'); $kurzbzLine = !empty($abgabe->kurzbz) ? "
{$abgabe->kurzbz}" : ""; $abgabenString .= " "; } $abgabenString .= '
Zieldatum Bezeichnung
{$dateEmailFormatted} {$abgabe->bezeichnung}{$kurzbzLine}
'; } $abgabenString .= '
'; // done with building the change list, now send it $assistenzRow = $tupelArr[0][1]; $anrede = $assistenzRow->anrede; $anredeFillString = $assistenzRow->anrede == "Herr" ? "r" : ""; $fullFormattedNameString = $assistenzRow->first; $path = $this->_ci->config->item('URL_ASSISTENZ'); $url = CIS_ROOT.$path; $body_fields = array( 'anrede' => $anrede, 'anredeFillString' => $anredeFillString, 'fullFormattedNameString' => $fullFormattedNameString, 'abgabenString' => $abgabenString, 'linkAbgabetool' => $url ); $email = $assistenzRow->uid."@".DOMAIN; // send email with bundled info sendSanchoMail( 'PAAChangesAssSM', $body_fields, $email, $this->p->t('abgabetool', 'changedAbgabeterminev2') ); $count++; } $this->_ci->logInfo($count . " Emails erfolgreich versandt"); $this->_ci->logInfo('End job FHC-Core->notifyAssistenzAboutChangedAbgaben'); } public function notifyBetreuerAboutChangedAbgaben() { $this->_ci->logInfo('Start job FHC-Core->notifyBetreuerAboutChangedAbgaben'); $interval = $this->_ci->config->item('PAABGABE_EMAIL_JOB_INTERVAL'); $relevantTypes = $this->_ci->config->item('RELEVANT_PAABGABETYPEN_SAMMELMAIL_BETREUER'); // get all new or changed termine in interval $result = $this->_ci->PaabgabeModel->findAbgabenNewOrUpdatedSince($interval, $relevantTypes); $retval = getData($result); if(!$retval) { $this->_ci->logInfo("Keine Emails an Betreuer über neue oder veränderte Termine versandt"); return; } // group changed/new abgaben for projektarbeiten $projektarbeiten = []; foreach($retval as $newOrChangedAbgabe) { // Check if the current item has a 'projektarbeit_id' field. // Replace 'projektarbeit_id' with the actual key name if it's different. if (isset($newOrChangedAbgabe->projektarbeit_id)) { $projektarbeitId = $newOrChangedAbgabe->projektarbeit_id; // check if the updatevon field is NOT the same as the student the projektarbeit is assigned to // since uploading a file to a paabgabe is also putting updateamum & updatevon // we have our own "student has uploaded a file" emailjob anyways if($newOrChangedAbgabe->student_uid === $newOrChangedAbgabe->updatevon) { continue; } // If the 'projektarbeit_id' is not yet a key in $projektarbeiten, // initialize it as an empty array. if (!isset($projektarbeiten[$projektarbeitId])) { $projektarbeiten[$projektarbeitId] = []; } // Add the current row to the array associated with its 'projektarbeit_id'. $projektarbeiten[$projektarbeitId][] = $newOrChangedAbgabe; } } if(count($projektarbeiten) == 0) { $this->_ci->logInfo("Keine Emails an Betreuer über neue oder veränderte Termine versandt"); return; } // for each projektarbeit fetch their betreuer and save them in their own dictionary to avoid too many mails $betreuerMap = []; forEach($projektarbeiten as $projektarbeit_id => $abgaben) { $betreuerResult = $this->_ci->ProjektbetreuerModel->getAllBetreuerOfProjektarbeit($projektarbeit_id); forEach($betreuerResult->retval as $betreuerRow) { if (!isset($betreuerMap[$betreuerRow->person_id])) { $betreuerMap[$betreuerRow->person_id] = []; } // Add the current betreuerRow to the betreuerMap as an array associated with its projektarbeit_id. $betreuerMap[$betreuerRow->person_id][] = [$projektarbeit_id, $betreuerRow]; } } $count = 0; // now iterate over the betreuerMap and build 1 email about all projektarbeiten and their new/changed termine // $tupel = [$projektarbeit_id, $betreuerRow], each betreuer has 0..n [projektarbeit_id, changedAbgaben] tupel forEach($betreuerMap as $betreuer_person_id => $tupelArr) { // start the container $abgabenString = '
'; $result = $this->_ci->ProjektarbeitModel->getProjektbetreuerAnrede($betreuer_person_id); $data = getData($result)[0]; $anrede = $data->anrede; $anredeFillString = $data->anrede == "Herr" ? "r" : ""; $fullFormattedNameString = $data->first; $relevantCounter = 0; // workaround to check if a betreuer needs to have any notification about relevant // abgaben at all to avoid sending empty emails since we filter on certain conditions forEach($tupelArr as $tupel) { $projektarbeit_id = $tupel[0]; $betreuerRow = $tupel[1]; $changedAbgaben = $projektarbeiten[$projektarbeit_id]; $relevantAbgaben = array_values(array_filter($changedAbgaben, function($abgabetermin) use ($betreuerRow) { if($abgabetermin->updatevon == null && $abgabetermin->insertvon != $betreuerRow->uid) { return $abgabetermin; } else if($abgabetermin->updatevon != null && $abgabetermin->updatevon != $betreuerRow->uid) { return $abgabetermin; } })); if(count($relevantAbgaben) == 0) { continue; } $relevantCounter++; // format the Student Name $s = $relevantAbgaben[0]; $nameParts = []; if (!empty($s->titelpre)) $nameParts[] = $s->titelpre; $nameParts[] = $s->vorname; $nameParts[] = $s->nachname; if (!empty($s->titelpost)) $nameParts[] = $s->titelpost; $studentFullName = implode(' ', $nameParts); $projektarbeit_titel = $s->titel ?? 'Kein Titel vergeben'; // project header section $abgabenString .= "
Projekt: {$projektarbeit_titel}
Studierende/r: {$studentFullName}
ID: {$projektarbeit_id} | Rolle: {$betreuerRow->betreuerart_kurzbz} | Stg: {$s->stgtyp}{$s->stgkz} ({$s->studiensemester_kurzbz})
"; // start table $abgabenString .= ' '; foreach ($relevantAbgaben as $abgabe) { $dateEmailFormatted = (new DateTime($abgabe->datum))->format('d.m.Y'); $abgabedatumFormatted = (new DateTime($abgabe->abgabedatum))->format('d.m.Y'); $kurzbzLine = !empty($abgabe->kurzbz) ? "
{$abgabe->kurzbz}" : ""; $abgabenString .= " "; } $abgabenString .= '
Zieldatum Bezeichnung
{$dateEmailFormatted} {$abgabe->bezeichnung}{$kurzbzLine}
'; } // close container $abgabenString .= '
'; // done with building the change list, now send it $betreuerRow = $tupelArr[0][1]; if($relevantCounter == 0) { $this->_ci->logInfo('No Relevant Abgaben to notify Betreuer PersonID: "'.$betreuerRow->person_id.'".'); continue; } $path = $this->_ci->config->item('URL_MITARBEITER'); $url = CIS_ROOT.$path; $body_fields = array( 'anrede' => $anrede, 'anredeFillString' => $anredeFillString, 'fullFormattedNameString' => $fullFormattedNameString, 'abgabenString' => $abgabenString, 'linkAbgabetool' => $url ); $email = $betreuerRow->uid ? $betreuerRow->uid."@".DOMAIN : $betreuerRow->private_email; if(!$email) { $this->_ci->logInfo('Could not send Email for Betreuer PersonID: "'.$data->person_id.'".'); continue; } // send email with bundled info sendSanchoMail( 'PAAChangesBetSM', $body_fields, $email, $this->p->t('abgabetool', 'changedAbgabeterminev2') ); $count++; } $this->_ci->logInfo($count . " Emails erfolgreich versandt"); $this->_ci->logInfo('End job FHC-Core->notifyBetreuerAboutChangedAbgaben'); } 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->_ci->logInfo('Start job FHC-Core->notifyBetreuerMail'); // dont filter for relevant types since this mail should gather all UPLOAD info $interval = $this->_ci->config->item('PAABGABE_EMAIL_JOB_INTERVAL'); $result = $this->_ci->PaabgabeModel->findAbgabenNewOrUpdatedSinceByAbgabedatum($interval); $retval = getData($result); // retval are paabgaben joined with projektarbeit and betreuer if(count($retval) == 0) { $this->logInfo("Keine Emails über neue Paabgaben an Betreuer versandt"); return; } // 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; } $count = 0; forEach ($betreuer_uids as $person_id => $abgaben) { // $person_id is from betreuer $result = $this->_ci->ProjektarbeitModel->getProjektbetreuerAnrede($person_id); $data = getData($result)[0]; $anrede = $data->anrede; $anredeFillString = $data->anrede == "Herr" ? "r" : ""; $fullFormattedNameString = $data->first; // sorting $abgaben array by datum usort($abgaben, function ($a, $b) { return strtotime($a->datum) <=> strtotime($b->datum); }); $projektarbeit_titel = $abgaben[0]->titel; // initialize the table and headers $abgabenString = ' '; foreach ($abgaben as $abgabe) { // format the student name $nameParts = []; if (!empty($abgabe->titelpre)) $nameParts[] = $abgabe->titelpre; $nameParts[] = $abgabe->vorname; $nameParts[] = $abgabe->nachname; if (!empty($abgabe->titelpost)) $nameParts[] = $abgabe->titelpost; $studentFullName = implode(' ', $nameParts); // format dates inline $dateEmailFormatted = (new DateTime($abgabe->datum))->format('d.m.Y'); $abgabedatumFormatted = (new DateTime($abgabe->abgabedatum))->format('d.m.Y'); // handle the optional Kurzbezeichnung $kurzbzLine = !empty($abgabe->kurzbz) ? "
{$abgabe->kurzbz}" : ""; $abgabenString .= " "; } $abgabenString .= '
Zieldatum Studierende/r Bezeichnung Abgabedatum
{$dateEmailFormatted} {$studentFullName} {$abgabe->bezeichnung}{$kurzbzLine} {$abgabedatumFormatted}
'; $path = $this->_ci->config->item('URL_MITARBEITER'); $url = CIS_ROOT.$path; $body_fields = array( 'anrede' => $anrede, 'anredeFillString' => $anredeFillString, 'fullFormattedNameString' => $fullFormattedNameString, 'paTitel' => $projektarbeit_titel, 'abgabenString' => $abgabenString, 'linkAbgabetool' => $url ); $result = $this->_ci->ProjektbetreuerModel->getBetreuerOfProjektarbeit($abgaben[0]->projektarbeit_id, $abgaben[0]->betreuerart_kurzbz); $data = getData($result)[0]; $email = $data->uid ? $data->uid."@".DOMAIN : $data->private_email; // in rare cases there are betreuer (often zweitbetreuer) without uid and without private email if(!$email) { $this->_ci->logInfo('Could not send Email for Betreuer PersonID: "'.$data->person_id.'".'); continue; } // send email with bundled info sendSanchoMail( 'PaabgabeUpdatesBetSM', $body_fields, $email, $this->p->t('abgabetool', 'changedAbgabeterminev2') ); $count++; } $this->_ci->logInfo($count . " Emails erfolgreich versandt"); $this->_ci->logInfo('End job FHC-Core->notifyBetreuerMail'); } public function notifyStudentMail() { // send all new projektarbeit abgabe since the last job run to the related student $this->_ci->logInfo('Start job FHC-Core->notifyStudentMail'); $interval = $this->_ci->config->item('PAABGABE_EMAIL_JOB_INTERVAL'); $relevantTypes = $this->_ci->config->item('RELEVANT_PAABGABETYPEN_SAMMELMAIL_STUDENT'); $result = $this->_ci->PaabgabeModel->findAbgabenNewOrUpdatedSince($interval, $relevantTypes); $retval = getData($result); if(count($retval) == 0) { $this->_ci->logInfo("Keine Emails an Studenten versandt"); return; } // 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; } $count = 0; foreach ($student_uids as $uid => $abgaben) { // $uid is the student's UID $result = $this->_ci->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; // initialize the table and headers $abgabenString = ' '; foreach ($abgaben as $abgabe) { $dateEmailFormatted = (new DateTime($abgabe->datum))->format('d.m.Y'); // handle the optional Kurzbezeichnung $kurzbzLine = !empty($abgabe->kurzbz) ? "
{$abgabe->kurzbz}" : ""; $abgabenString .= " "; } $abgabenString .= '
Zieldatum Bezeichnung / Hinweis
{$dateEmailFormatted} {$abgabe->bezeichnung}{$kurzbzLine}
'; $route = $this->_ci->config->item('URL_STUDENTS'); $url = CIS_ROOT.$route; $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') ); $count++; } $this->_ci->logInfo($count . " Emails erfolgreich versandt"); $this->_ci->logInfo('End job FHC-Core->notifyStudentMail'); } }