diff --git a/application/controllers/jobs/AbgabetoolJob.php b/application/controllers/jobs/AbgabetoolJob.php
index 332116844..3316e17dc 100644
--- a/application/controllers/jobs/AbgabetoolJob.php
+++ b/application/controllers/jobs/AbgabetoolJob.php
@@ -20,6 +20,8 @@ class AbgabetoolJob extends JOB_Controller
$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->config('abgabe');
$this->loadPhrases([
@@ -27,6 +29,200 @@ class AbgabetoolJob extends JOB_Controller
]);
}
+ public function notifyAssistenzAboutChangedAbgaben() {
+
+ $this->_ci->logInfo('Start job FHC-Core->notifyBetreuerAboutChangedAbgaben');
+
+ $interval = $this->_ci->config->item('PAABGABE_EMAIL_JOB_INTERVAL');
+ // get all new or changed termine in interval
+ $result = $this->_ci->PaabgabeModel->findAbgabenNewOrUpdatedSince($interval);
+ $retval = getData($result);
+
+ if(count($retval) == 0) {
+ $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;
+
+ // 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 .= '
+
+
+
+ | Zieldatum |
+ Bezeichnung |
+ Abgabe bis |
+
+
+ ';
+
+ 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 .= "
+
+ | {$dateEmailFormatted} |
+
+ {$abgabe->bezeichnung}{$kurzbzLine}
+ |
+ {$abgabedatumFormatted} |
+
";
+ }
+
+ $abgabenString .= '
';
+ }
+
+ $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_MITARBEITER');
+ $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->notifyBetreuerAboutChangedAbgaben');
+ }
+
public function notifyBetreuerAboutChangedAbgaben() {
$this->_ci->logInfo('Start job FHC-Core->notifyBetreuerAboutChangedAbgaben');
diff --git a/application/models/education/Paabgabe_model.php b/application/models/education/Paabgabe_model.php
index 7661663f7..a50c3ea95 100644
--- a/application/models/education/Paabgabe_model.php
+++ b/application/models/education/Paabgabe_model.php
@@ -67,14 +67,15 @@ class Paabgabe_model extends DB_Model
$query = "SELECT projektarbeit_id, paabgabe_id, paabgabetyp_kurzbz, fixtermin, datum, campus.tbl_paabgabe.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,
- UPPER(tbl_studiengang.typ) as stgtyp, UPPER(tbl_studiengang.kurzbz) as stgkz, tbl_lehreinheit.studiensemester_kurzbz,
+ UPPER(tbl_studiengang.typ) as stgtyp, UPPER(tbl_studiengang.kurzbz) as stgkz, public.tbl_studiengang.studiengang_kz,
+ public.tbl_studiengang.oe_kurzbz as stg_oe_kurzbz, tbl_lehreinheit.studiensemester_kurzbz,
public.tbl_person.anrede, public.tbl_person.titelpre, public.tbl_person.vorname, public.tbl_person.nachname, public.tbl_person.titelpost
FROM campus.tbl_paabgabe
JOIN campus.tbl_paabgabetyp USING (paabgabetyp_kurzbz)
JOIN lehre.tbl_projektarbeit USING (projektarbeit_id)
JOIN lehre.tbl_lehreinheit using(lehreinheit_id)
JOIN lehre.tbl_lehrveranstaltung using(lehrveranstaltung_id)
- JOIN public.tbl_studiengang on(lehre.tbl_lehrveranstaltung.studiengang_kz=public.tbl_studiengang.studiengang_kz)
+ JOIN public.tbl_studiengang on(lehre.tbl_lehrveranstaltung.studiengang_kz = public.tbl_studiengang.studiengang_kz)
JOIN public.tbl_benutzer ON (public.tbl_benutzer.uid = student_uid)
JOIN public.tbl_person USING (person_id)
diff --git a/application/models/organisation/Organisationseinheit_model.php b/application/models/organisation/Organisationseinheit_model.php
index db56c1930..9f64580a9 100644
--- a/application/models/organisation/Organisationseinheit_model.php
+++ b/application/models/organisation/Organisationseinheit_model.php
@@ -243,4 +243,20 @@ class Organisationseinheit_model extends DB_Model
return $this->execReadOnlyQuery($qry, array($oe_kurzbz));
}
+
+ public function getAssistenzForOE($oe_kurzbz) {
+ $qry = "
+ SELECT person_id, uid, benutzerfunktion_id, funktion_kurzbz, oe_kurzbz, alias,
+ anrede, trim(COALESCE(titelpre,'')||' '||COALESCE(vorname,'')||' '||COALESCE(nachname,'')||' '||COALESCE(titelpost,'')) as first
+ FROM tbl_benutzerfunktion
+ JOIN public.tbl_benutzer USING(uid)
+ JOIN public.tbl_person USING(person_id)
+ WHERE funktion_kurzbz = 'ass'
+ AND oe_kurzbz = ?
+ AND (datum_bis IS NULL OR NOW() <= datum_bis)
+ AND public.tbl_benutzer.aktiv = true
+ ";
+
+ return $this->execReadOnlyQuery($qry, array($oe_kurzbz));
+ }
}
diff --git a/application/models/organisation/Studiengang_model.php b/application/models/organisation/Studiengang_model.php
index 660657f28..02c1d2a36 100644
--- a/application/models/organisation/Studiengang_model.php
+++ b/application/models/organisation/Studiengang_model.php
@@ -657,37 +657,7 @@ class Studiengang_model extends DB_Model
$this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel');
$this->load->model('person/Person_model', 'PersonModel');
$this->load->model('crm/Student_model', 'StudentModel');
-
- $addEmailProperty= function(&$benutzerfunktionen){
- if(count($benutzerfunktionen) && defined('DOMAIN'))
- {
- $benutzerfunktionen = array_map(function($benutzer)
- {
- $benutzer->email = $benutzer->alias."@".DOMAIN;
- return $benutzer;
- },$benutzerfunktionen) ;
- }
-
- };
- $addFotoProperty= function(&$collection){
- $collection = array_map(function($item){
- $person_id = $this->PersonModel->getByUid($item->uid);
- if(isError($person_id))
- return error($person_id);
- $person_id = current(getData($person_id))->person_id;
- $this->PersonModel->addSelect('foto');
- $foto = $this->PersonModel->loadWhere(array('person_id'=>$person_id));
- if(isError($foto))
- return error($foto);
- $foto = current(getData($foto))->foto;
- $item->foto = $foto;
- return $item;
- },$collection);
- };
-
- $this->load->model('crm/Student_model', 'StudentModel');
-
$student = $this->StudentModel->loadWhere(['student_uid' => getAuthUID()]);
if (isError($student))
return error($student);
@@ -712,7 +682,7 @@ class Studiengang_model extends DB_Model
$stg_ltg = array_values(array_filter($stg_ltg, function($stg_leitung){
return $stg_leitung->aktiv;
}));
- $addFotoProperty($stg_ltg);
+ $this->addFotoProperty($stg_ltg);
$gf_ltg = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('gLtg', $stg_obj->oe_kurzbz);
if (isError($gf_ltg))
@@ -721,8 +691,8 @@ class Studiengang_model extends DB_Model
$gf_ltg = array_values(array_filter($gf_ltg, function($gf_leitung){
return $gf_leitung->aktiv;
}));
- $addEmailProperty($gf_ltg);
- $addFotoProperty($gf_ltg);
+ $this->addEmailProperty($gf_ltg);
+ $this->addFotoProperty($gf_ltg);
$stv_ltg = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('stvLtg', $stg_obj->oe_kurzbz);
if (isError($stv_ltg))
@@ -731,8 +701,8 @@ class Studiengang_model extends DB_Model
$stv_ltg = array_values(array_filter($stv_ltg, function($stv_leitung){
return $stv_leitung->aktiv;
}));
- $addEmailProperty($stv_ltg);
- $addFotoProperty($stv_ltg);
+ $this->addEmailProperty($stv_ltg);
+ $this->addFotoProperty($stv_ltg);
$ass = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('ass', $stg_obj->oe_kurzbz);
if (isError($ass))
@@ -741,8 +711,8 @@ class Studiengang_model extends DB_Model
$ass = array_values(array_filter($ass, function($assistenz){
return $assistenz->aktiv;
}));
- $addEmailProperty($ass);
- $addFotoProperty($ass);
+ $this->addEmailProperty($ass);
+ $this->addFotoProperty($ass);
$hochschulvertr = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('hsv');
if (isError($hochschulvertr))
@@ -751,7 +721,7 @@ class Studiengang_model extends DB_Model
$hochschulvertr = array_values(array_filter($hochschulvertr, function($hochschul_vertreter){
return $hochschul_vertreter->aktiv;
}));
- $addEmailProperty($hochschulvertr);
+ $this->addEmailProperty($hochschulvertr);
$stdv = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('stdv', $stg_obj->oe_kurzbz);
@@ -761,7 +731,7 @@ class Studiengang_model extends DB_Model
$stdv = array_values(array_filter($stdv, function($std_vertreter){
return $std_vertreter->aktiv;
}));
- $addEmailProperty($stdv);
+ $this->addEmailProperty($stdv);
$jahrgangsvertr = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('jgv', $stg_obj->oe_kurzbz, $semester);
@@ -771,7 +741,7 @@ class Studiengang_model extends DB_Model
$jahrgangsvertr = array_values(array_filter($jahrgangsvertr, function($jahrgang_vertreter){
return $jahrgang_vertreter->aktiv;
}));
- $addEmailProperty($jahrgangsvertr);
+ $this->addEmailProperty($jahrgangsvertr);
$result_object = new stdClass();
@@ -818,4 +788,55 @@ class Studiengang_model extends DB_Model
return $this->execReadOnlyQuery($query, [$allowed_stg]);
}
+
+ public function getAssistenzForStudiengangKZ($stg_kz) {
+ $this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel');
+
+ $stg_obj = $this->load($stg_kz);
+ if(isError($stg_obj))
+ return error($stg_obj);
+ if(getData($stg_obj))
+ {
+ $stg_obj = current(getData($stg_obj));
+ }
+
+ $ass = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('ass', $stg_obj->oe_kurzbz);
+ if (isError($ass))
+ return $ass;
+ $ass = getData($ass) ?: [];
+ $ass = array_values(array_filter($ass, function($assistenz){
+ return $assistenz->aktiv;
+ }));
+
+ $this->addEmailProperty($ass);
+
+ return success($ass);
+ }
+
+ private function addEmailProperty(&$benutzerfunktionen) {
+ if(count($benutzerfunktionen) && defined('DOMAIN'))
+ {
+ $benutzerfunktionen = array_map(function($benutzer)
+ {
+ $benutzer->email = $benutzer->alias."@".DOMAIN;
+ return $benutzer;
+ },$benutzerfunktionen) ;
+ }
+ }
+
+ private function addFotoProperty (&$collection) {
+ $collection = array_map(function($item){
+ $person_id = $this->PersonModel->getByUid($item->uid);
+ if(isError($person_id))
+ return error($person_id);
+ $person_id = current(getData($person_id))->person_id;
+ $this->PersonModel->addSelect('foto');
+ $foto = $this->PersonModel->loadWhere(array('person_id'=>$person_id));
+ if(isError($foto))
+ return error($foto);
+ $foto = current(getData($foto))->foto;
+ $item->foto = $foto;
+ return $item;
+ },$collection);
+ }
}
diff --git a/public/js/components/Cis/Renderer/Lehreinheit/calendarEvent.js b/public/js/components/Cis/Renderer/Lehreinheit/calendarEvent.js
index badbf537f..387f083f7 100644
--- a/public/js/components/Cis/Renderer/Lehreinheit/calendarEvent.js
+++ b/public/js/components/Cis/Renderer/Lehreinheit/calendarEvent.js
@@ -31,7 +31,7 @@ export default {
this.event.lektor.slice(0, 3).map(lektor => lektor.kurzbz).join("\n")
+ "\n" + this.$p.t('lehre/weitereLektoren', [this.event.lektor.length - 3])
].join(": "));
- } else {console.log(this.event.lektor);
+ } else {;
tooltipArray.push([
this.$p.t('lehre/lektor'),
this.event.lektor.map(lektor => lektor.kurzbz).join("\n")
diff --git a/public/js/components/Dashboard/Item.js b/public/js/components/Dashboard/Item.js
index 42aeca0b6..d2ad4ae75 100644
--- a/public/js/components/Dashboard/Item.js
+++ b/public/js/components/Dashboard/Item.js
@@ -143,8 +143,6 @@ export default {
},
},
async created() {
- debugger
-
this.widget = await CachedWidgetLoader.loadWidget(this.id);
let component = (await import("../" + this.widget.setup.file)).default;
this.$options.components["widget" + this.widget.widget_id] = component;