diff --git a/application/components/filters/Vertragsverwaltung.php b/application/components/filters/Vertragsverwaltung.php
new file mode 100644
index 000000000..b96aee8ea
--- /dev/null
+++ b/application/components/filters/Vertragsverwaltung.php
@@ -0,0 +1,36 @@
+ 'core',
+ 'datasetName' => 'vertragsverwaltung',
+ 'query' => '
+ SELECT
+ uid,
+ person_id,
+ vorname,
+ nachname,
+ gebdatum,
+ vertragsarten,
+ unternehmen,
+ ids,
+ aktiv
+ FROM
+ (
+ SELECT
+ b.uid , p.person_id,
+ p.vorname, p.nachname,
+ gebdatum,
+ STRING_AGG(DISTINCT va.bezeichnung, \', \') AS Vertragsarten,
+ STRING_AGG(DISTINCT u.bezeichnung, \', \') AS Unternehmen,
+ STRING_AGG(d.dienstverhaeltnis_id::TEXT, \', \') AS ids,
+ b.aktiv
+ FROM
+ hr.tbl_dienstverhaeltnis d
+ JOIN public.tbl_benutzer b ON d.mitarbeiter_uid = b.uid
+ JOIN public.tbl_person p ON p.person_id = b.person_id
+ JOIN public.tbl_organisationseinheit u ON d.oe_kurzbz = u.oe_kurzbz
+ JOIN hr.tbl_vertragsart va ON d.vertragsart_kurzbz = va.vertragsart_kurzbz
+ GROUP BY b.uid, p.person_id, p.vorname, p.nachname, b.aktiv
+ ) as vertragsdaten
+ ',
+ 'requiredPermissions' => 'vertrag/mitarbeiter'
+ );
diff --git a/application/config/abgabe.php b/application/config/abgabe.php
index 82782b043..90aedbd8b 100644
--- a/application/config/abgabe.php
+++ b/application/config/abgabe.php
@@ -41,3 +41,5 @@ $config['STG_MOODLE_LINK'] = 'https://moodle.technikum-wien.at/course/view.php?i
$config['ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT'] = true;
$config['ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER'] = true;
+
+$config['BETREUER_SAMMELMAIL_BUTTON_STUDENT'] = true;
diff --git a/application/config/navigation.php b/application/config/navigation.php
index 79a457aad..000eb5a36 100644
--- a/application/config/navigation.php
+++ b/application/config/navigation.php
@@ -163,6 +163,13 @@ $config['navigation_header'] = array(
'expand' => true,
'sort' => 50,
'requiredPermissions' => 'lehre/gruppenmanager:r'
+ ),
+ 'vertragsverwaltung' => array(
+ 'link' => site_url('vertragsverwaltung'),
+ 'description' => 'Vertragsverwaltung',
+ 'expand' => true,
+ 'sort' => 51,
+ 'requiredPermissions' => 'vertrag/mitarbeiter:r'
)
)
),
@@ -342,6 +349,18 @@ $config['navigation_menu']['system/issues/Issues/*'] = array(
'target' => '_blank',
'requiredPermissions' => array('admin:rw')
),
+
+);
+
+$config['navigation_menu']['vertragsverwaltung/*'] = array(
+ 'vertragsverwaltung' => array(
+ 'link' => site_url('vertragsverwaltung'),
+ 'description' => 'Vertragsverwaltung',
+ 'icon' => 'home',
+ 'sort' => 100,
+ 'target' => '_blank',
+ 'requiredPermissions' => array('vertrag/mitarbeiter:r')
+ )
);
$config['navigation_menu']['apps'] = [
diff --git a/application/config/stv.php b/application/config/stv.php
index 8942c35e6..34a30a96e 100644
--- a/application/config/stv.php
+++ b/application/config/stv.php
@@ -130,3 +130,16 @@ $config['students_tab_order'] = [
'combinePeople',
'archive',
];
+
+$config['stv_prestudent_tags'] = [
+ 'prioone' => ['readonly' => false],
+ 'priotwo' => ['readonly' => true],
+ 'hinweis' => ['readonly' => false],
+ 'hinweis_assistenz' => ['readonly' => true],
+ 'hinweis_kf' => ['readonly' => true],
+ 'hinweis_lehrende' => ['readonly' => false],
+ 'hinweis_stg_kf' => ['readonly' => true],
+ 'finished_stg' => ['readonly' => true],
+ 'finished_kf' => ['readonly' => true],
+ 'inwork_kf' => ['readonly' => true],
+];
diff --git a/application/controllers/Cis/MyLv.php b/application/controllers/Cis/MyLv.php
index 49a938553..819d56b05 100644
--- a/application/controllers/Cis/MyLv.php
+++ b/application/controllers/Cis/MyLv.php
@@ -33,9 +33,4 @@ class MyLv extends Auth_Controller
$this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'MyLv']);
}
-
- public function Info($studien_semester,$lvid)
- {
- $this->load->view('Cis/LvInfo',['lvid'=> $lvid, 'studien_semester' => $studien_semester]);
- }
}
diff --git a/application/controllers/Studentenverwaltung.php b/application/controllers/Studentenverwaltung.php
index 36c91d5f6..1699ba740 100644
--- a/application/controllers/Studentenverwaltung.php
+++ b/application/controllers/Studentenverwaltung.php
@@ -28,7 +28,7 @@ class Studentenverwaltung extends Auth_Controller
'basis/prestudentstatus' => $this->permissionlib->isBerechtigt('basis/prestudentstatus'),
'assistenz_stgs' => $this->permissionlib->getSTG_isEntitledFor('assistenz'),
'admin' => $this->permissionlib->isBerechtigt('admin'),
- 'assistenz_schreibrechte' => $this->permissionlib->isBerechtigt('assistenz','suid'),
+ 'assistenz_schreibrechte' => $this->permissionlib->isBerechtigt('assistenz', 'suid'),
'student/keine_studstatuspruefung' => $this->permissionlib->isBerechtigt('student/keine_studstatuspruefung'),
'lehre/reihungstestAufsicht' => $this->permissionlib->isBerechtigt('lehre/reihungstestAufsicht'),
'system/change_outputformat' => $this->permissionlib->getOE_isEntitledFor('system/change_outputformat'),
@@ -43,3 +43,5 @@ class Studentenverwaltung extends Auth_Controller
]);
}
}
+
+
diff --git a/application/controllers/Vertragsverwaltung.php b/application/controllers/Vertragsverwaltung.php
new file mode 100644
index 000000000..f68ed1737
--- /dev/null
+++ b/application/controllers/Vertragsverwaltung.php
@@ -0,0 +1,30 @@
+method] = ['vertrag/mitarbeiter:r'];
+ #$permissions[$router->method] = ['admin:rw'];
+ parent::__construct($permissions);
+
+ // Load Libraries
+ $this->load->library('VariableLib', ['uid' => getAuthUID()]);
+ }
+
+ /**
+ * @return void
+ */
+ public function _remap()
+ {
+ $this->load->view('Vertragsverwaltung', [
+ 'permissions' => [
+ 'vertragsverwaltung_schreibrechte' => $this->permissionlib->isBerechtigt('vertrag/mitarbeiter', 'suid')
+ ]
+ ]);
+ }
+}
diff --git a/application/controllers/api/frontend/v1/Abgabe.php b/application/controllers/api/frontend/v1/Abgabe.php
index b37c64713..43dc18d1c 100644
--- a/application/controllers/api/frontend/v1/Abgabe.php
+++ b/application/controllers/api/frontend/v1/Abgabe.php
@@ -89,13 +89,15 @@ class Abgabe extends FHCAPI_Controller
$abgabetypenBetreuer = $this->config->item('ALLOWED_ABGABETYPEN_BETREUER');
$ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT = $this->config->item('ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT');
$ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER = $this->config->item('ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER');
+ $BETREUER_SAMMELMAIL_BUTTON_STUDENT = $this->config->item('BETREUER_SAMMELMAIL_BUTTON_STUDENT');
$ret = array(
'old_abgabe_beurteilung_link' => $old_abgabe_beurteilung_link,
'turnitin_link' => $turnitin_link,
'abgabetypenBetreuer' => $abgabetypenBetreuer,
'ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT' => $ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT,
- 'ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER' => $ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER
+ 'ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER' => $ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER,
+ 'BETREUER_SAMMELMAIL_BUTTON_STUDENT' => $BETREUER_SAMMELMAIL_BUTTON_STUDENT,
);
$this->terminateWithSuccess($ret);
@@ -373,6 +375,8 @@ class Abgabe extends FHCAPI_Controller
$this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
}
+ $this->checkPaabgabeDeadline($paabgabe_id);
+
$this->checkProjektarbeitForFinishedStatus($projektarbeit_id);
$zugeordnet = $this->checkZuordnung($projektarbeit_id, getAuthUID());
@@ -444,6 +448,36 @@ class Abgabe extends FHCAPI_Controller
}
}
+
+ // validate paabgabe deadline against servertime just in case a student spoofs their local clock and thus
+ // unlocks the upload ui
+ private function checkPaabgabeDeadline($paabgabe_id) {
+ $this->load->model('education/Paabgabe_model', 'PaabgabeModel');
+
+ $result = $this->PaabgabeModel->load($paabgabe_id);
+ $paabgabeArr = $this->getDataOrTerminateWithError($result, 'general');
+
+ if (count($paabgabeArr) > 0) {
+ $paabgabe = $paabgabeArr[0];
+ } else {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4projektabgabeNichtGefunden'), 'general');
+ }
+
+ // in that case any submission date is fine
+ if($paabgabe->fixtermin === false) return;
+
+ $tz = new DateTimeZone('Europe/Berlin');
+ $now = new DateTimeImmutable('now', $tz);
+ $deadline = DateTimeImmutable::createFromFormat(
+ 'Y-m-d H:i:s',
+ $paabgabe->datum . ' 23:59:59',
+ $tz
+ );
+
+ if($now >= $deadline) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4deadlineExceeded'));
+ }
+ }
/**
* tabulator tabledata fetch for abgabetool/mitarbeiter
@@ -473,6 +507,16 @@ class Abgabe extends FHCAPI_Controller
$projektarbeiten = $this->ProjektarbeitModel->getMitarbeiterProjektarbeiten(getAuthUID(), $showAllBool);
+ $mapFunc = function($projektarbeit) {
+ return $projektarbeit->projektarbeit_id;
+ };
+ $projektarbeiten_ids = array_map($mapFunc, $projektarbeiten->retval);
+
+ if(count($projektarbeiten_ids) > 0) {
+ $ret = $this->ProjektarbeitModel->getProjektarbeitenAbgabetermine($projektarbeiten_ids);
+ $projektabgaben = $this->getDataOrTerminateWithError($ret, 'general');
+ }
+
forEach($projektarbeiten->retval as $pa) {
$result = $this->ProjektarbeitModel->getProjektbetreuerAnrede($pa->betreuer_person_id);
@@ -489,6 +533,20 @@ class Abgabe extends FHCAPI_Controller
Events::trigger('projektbeurteilung_formular_link', $pa->betreuerart_kurzbz, APP_ROOT, $pa->projektarbeit_id, $pa->student_uid, $returnFunc);
$pa->beurteilungLinkNew = $newLink;
$pa->beurteilungLinkOld = $oldLink;
+
+ // has previously been retrieved via getStudentProjektabgaben but is fetched in advance to avoid having to reload abgaben
+ $projektarbeitIsCurrent = false;
+ $returnFunc = function ($result) use (&$projektarbeitIsCurrent) {
+ $projektarbeitIsCurrent = $result;
+ };
+ Events::trigger('projektarbeit_is_current', $pa->projektarbeit_id, $returnFunc);
+ $pa->isCurrent = $projektarbeitIsCurrent;
+
+ $filterFunc = function($projektabgabe) use ($pa) {
+ return $projektabgabe->projektarbeit_id == $pa->projektarbeit_id;
+ };
+
+ $pa->abgabetermine = array_values(array_filter($projektabgaben, $filterFunc));
}
@@ -544,7 +602,18 @@ class Abgabe extends FHCAPI_Controller
'insertamum' => date('Y-m-d H:i:s')
)
);
- $this->logLib->logInfoDB(array('paabgabe created',$result, getAuthUID(), getAuthPersonId()));
+ $this->logLib->logInfoDB(array('paabgabe created',array(
+ 'projektarbeit_id' => $projektarbeit_id,
+ 'paabgabetyp_kurzbz' => $paabgabetyp_kurzbz,
+ 'fixtermin' => $fixtermin,
+ 'datum' => $datum,
+ 'kurzbz' => $kurzbz,
+ 'note' => $note,
+ 'beurteilungsnotiz' => $beurteilungsnotiz,
+ 'upload_allowed' => $upload_allowed,
+ 'insertvon' => getAuthUID(),
+ 'insertamum' => date('Y-m-d H:i:s')
+ ), getAuthUID(), getAuthPersonId()));
} else {
// load existing entry of paabgabe and check if note has changed to negativ, to avoid sending when
// only notiz has changed.
@@ -718,7 +787,16 @@ class Abgabe extends FHCAPI_Controller
$abgaben[]= getData($this->PaabgabeModel->load($dataAbgabe))[0];
}
- $this->logLib->logInfoDB(array('serientermin angelegt',$res, getAuthUID(), getAuthPersonId()));
+ $this->logLib->logInfoDB(array('serientermin angelegt',array(
+ 'projektarbeit_id' => $projektarbeit_id,
+ 'paabgabetyp_kurzbz' => $paabgabetyp_kurzbz,
+ 'fixtermin' => $fixtermin,
+ 'datum' => $datum,
+ 'kurzbz' => $kurzbz,
+ 'upload_allowed' => $upload_allowed,
+ 'insertvon' => getAuthUID(),
+ 'insertamum' => date('Y-m-d H:i:s')
+ ), getAuthUID(), getAuthPersonId()));
$this->terminateWithSuccess($abgaben);
}
@@ -769,9 +847,10 @@ class Abgabe extends FHCAPI_Controller
private function getProjektbetreuerEmailByProjektarbeitID($projektarbeit_id) {
$this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
$result = $this->ProjektarbeitModel->getProjektbetreuerEmail($projektarbeit_id);
- $email = $this->getDataOrTerminateWithError($result, 'general');
-
- return $email[0]->uid ? $email[0]->uid.'@'.DOMAIN : $email[0]->private_email;
+ if(count($result->retval) > 0) {
+ $email = getData($result);
+ return $email[0]->uid ? $email[0]->uid.'@'.DOMAIN : $email[0]->private_email;
+ } else return '';
}
@@ -1167,7 +1246,7 @@ class Abgabe extends FHCAPI_Controller
$email = $this->getProjektbetreuerEmailByProjektarbeitID($projektarbeit_id);
- if(!$email) $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailBegutachter'), 'general');
+ if(!$email) $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailBegutachterv2'), 'general');
$mailres = sendSanchoMail(
'ParbeitsbeurteilungEndupload',
@@ -1180,7 +1259,7 @@ class Abgabe extends FHCAPI_Controller
if(!$mailres)
{
- $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailBegutachter'), 'general');
+ $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailBegutachterv2'), 'general');
}
// 2. Begutachter mail, wenn Endabgabe, mit Token wenn extern
@@ -1200,14 +1279,14 @@ class Abgabe extends FHCAPI_Controller
if (!$tokenGenRes)
{
- $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailZweitBegutachter'), 'general');
+ $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailZweitBegutachterv2'), 'general');
}
$begutachterMitTokenRetval = getData($this->ProjektbetreuerModel->getZweitbegutachterWithToken($bperson_id, $projektarbeit_id, $studentUser->uid, $begutachter->person_id));
if (!$begutachterMitTokenRetval && count($begutachterMitTokenRetval) <= 0)
{
- $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailZweitBegutachter'), 'general');
+ $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailZweitBegutachterv2'), 'general');
}
$begutachterMitToken = $begutachterMitTokenRetval[0];
@@ -1241,7 +1320,7 @@ class Abgabe extends FHCAPI_Controller
if (!$mailres)
{
- $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailBegutachter'), 'general');
+ $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailBegutachterv2'), 'general');
}
}
diff --git a/application/controllers/api/frontend/v1/Documents.php b/application/controllers/api/frontend/v1/Documents.php
index 7b2fc4a15..13c0a2eba 100644
--- a/application/controllers/api/frontend/v1/Documents.php
+++ b/application/controllers/api/frontend/v1/Documents.php
@@ -208,7 +208,6 @@ class Documents extends FHCAPI_Controller
$this->load->model('system/Vorlage_model', 'VorlageModel');
$result = $this->VorlageModel->load($xsl);
- $this->addMeta("ress", $result);
$vorlage = current($this->getDataOrTerminateWithError($result));
if (!$vorlage)
show_404();
@@ -221,7 +220,7 @@ class Documents extends FHCAPI_Controller
'gedruckt' => true,
'insertamum' => date('c'),
'insertvon' => getAuthUID(),
- 'uid' => $this->input->post_get('uid') ?: '',
+ 'uid' => $this->input->post_get('uid') ?: null,
'archiv' => true,
'signiert' => !!$sign_user,
'stud_selfservice' => $vorlage->stud_selfservice
@@ -251,6 +250,9 @@ class Documents extends FHCAPI_Controller
'studiensemester_kurzbz' => $ss,
'student_uid' => $akteData['uid']
]);
+
+ if (!hasData($result)) $this->terminateWithError($this->p->t("stv", "error_noLehrverbandAssigned"));
+
$res = current($this->getDataOrTerminateWithError($result));
$studiengang_kz = $res->studiengang_kz;
@@ -332,6 +334,7 @@ class Documents extends FHCAPI_Controller
if ($prestudent_id) {
$this->load->model('crm/prestudent_model', 'PrestudentModel');
$this->PrestudentModel->addJoin('public.tbl_studiengang', 'studiengang_kz', 'LEFT');
+ $this->PrestudentModel->addSelect('tbl_prestudent.*, UPPER(typ || kurzbz) AS kuerzel');
$result = $this->PrestudentModel->load($prestudent_id);
$prestudent = current($this->getDataOrTerminateWithError($result));
diff --git a/application/controllers/api/frontend/v1/detailheader/Detailheader.php b/application/controllers/api/frontend/v1/detailheader/Detailheader.php
new file mode 100644
index 000000000..ada10c5b6
--- /dev/null
+++ b/application/controllers/api/frontend/v1/detailheader/Detailheader.php
@@ -0,0 +1,53 @@
+ ['vertrag/mitarbeiter:r'],
+ 'getPersonAbteilung' => ['vertrag/mitarbeiter:r'],
+ 'getLeitungOrg' => ['vertrag/mitarbeiter:r'],
+ ]);
+ }
+
+ public function getHeader($person_id)
+ {
+ $this->load->model('ressource/Mitarbeiter_model', 'Mitarbeitermodel');
+
+ $result = $this->Mitarbeitermodel->getHeader($person_id);
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess(current($data));
+ }
+
+ public function getPersonAbteilung($mitarbeiter_uid)
+ {
+ $this->load->model('ressource/Mitarbeiter_model', 'Mitarbeitermodel');
+
+ $result = $this->Mitarbeitermodel->getPersonAbteilung($mitarbeiter_uid);
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess(current($data));
+ }
+
+ public function getLeitungOrg($oekurzbz)
+ {
+ $this->load->model('ressource/Mitarbeiter_model', 'Mitarbeitermodel');
+
+ $result = $this->Mitarbeitermodel->getLeitungOrg($oekurzbz);
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess(current($data));
+ }
+
+}
+
+
diff --git a/application/controllers/api/frontend/v1/fotoHandling/Foto.php b/application/controllers/api/frontend/v1/fotoHandling/Foto.php
new file mode 100644
index 000000000..4945ddd85
--- /dev/null
+++ b/application/controllers/api/frontend/v1/fotoHandling/Foto.php
@@ -0,0 +1,237 @@
+ ['admin:r', 'assistenz:r'],
+ 'deleteFoto' => ['admin:r', 'assistenz:r'],
+ ]);
+
+ //Load Models and Libraries
+ $this->load->model('person/Person_model', 'PersonModel');
+ $this->load->model("crm/Akte_model", "AkteModel");
+ $this->load->model('person/Fotostatusperson_model', 'FotostatusPersonModel');
+
+ $this->loadPhrases([
+ 'ui',
+ 'header'
+ ]);
+ }
+
+ public function uploadFoto($person_id)
+ {
+ if(!$person_id)
+ {
+ return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Person_id']), self::ERROR_TYPE_GENERAL);
+ }
+
+ $data = json_decode(file_get_contents("php://input"), true);
+
+ if (!empty($data['image']))
+ {
+ $base64 = $data['image'];
+ $resizedImage1 = $this->_resize($base64, 827, 1063);
+
+ if (is_null($resizedImage1))
+ return $this->terminateWithError($this->p->t('header', 'error_fotoupload'), self::ERROR_TYPE_GENERAL);
+
+ $akte = $this->AkteModel->loadWhere(array('person_id' => $person_id, 'dokument_kurzbz' => 'Lichtbil'));
+
+ $akteUpdateData = array(
+ 'dokument_kurzbz' => 'Lichtbil',
+ 'person_id' => $person_id,
+ 'inhalt' => $resizedImage1,
+ 'mimetype' => 'image/jpg',
+ 'erstelltam' => date('c'),
+ 'gedruckt' => false,
+ 'titel' => 'Lichtbild_' . $person_id . '.jpg',
+ 'bezeichnung' => 'Lichtbild gross',
+ 'insertamum' => date('c'),
+ 'insertvon' => getAuthUID(),
+ );
+
+ if (hasData($akte)) {
+ $akte_id = getData($akte)[0]->akte_id;
+
+ $akteUpdateData['updateamum'] = date('c');
+ $akteUpdateData['updatevon'] = getAuthUID();
+ $akteResult = $this->AkteModel->update(array('akte_id' => $akte_id), $akteUpdateData);
+ } else {
+ $akteResult = $this->AkteModel->insert($akteUpdateData);
+ }
+
+ if (isError($akteResult)) {
+ return $this->terminateWithError(getError($akteResult), self::ERROR_TYPE_GENERAL);
+ }
+
+ $resizedImage2 = $this->_resize($base64, 101, 130);
+
+ if (is_null($resizedImage2))
+ return $this->terminateWithError($this->p->t('header', 'error_fotoupload'), self::ERROR_TYPE_GENERAL);
+
+ $result = $this->_updateFoto($person_id, $resizedImage2);
+
+ if (!isError($result)) {
+ $this->FotostatusPersonModel->insert(array(
+ 'person_id' => $person_id,
+ 'fotostatus_kurzbz' => 'hochgeladen',
+ 'datum' => date('Y-m-d'),
+ 'updateamum' => date('c'),
+ 'updatevon' => getAuthUID(),
+ 'insertamum' => date('c'),
+ 'insertvon' => getAuthUID(),
+ ));
+
+ return $this->terminateWithSuccess($base64);
+ }
+ }
+ else
+ {
+ $this->terminateWithError($this->p->t('header', 'error_noPhoto'), self::ERROR_TYPE_GENERAL);
+ }
+ }
+
+ public function deleteFoto($person_id)
+ {
+ if(!$person_id)
+ {
+ return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Person_id']), self::ERROR_TYPE_GENERAL);
+ }
+
+ $result = $this->_deleteFoto($person_id);
+
+ if (isError($result))
+ {
+ return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
+ }
+ return $this->terminateWithSuccess($result);
+ }
+
+ private function _resize($imageData, $maxwidth, $maxheight, $quality = 90)
+ {
+ $meta = getimagesize($imageData);
+ if (!$meta)
+ {
+ return null;
+ }
+
+ $src_width = $meta[0];
+ $src_height = $meta[1];
+ $mime = $meta['mime'];
+
+ switch ($mime) {
+ case 'image/jpeg':
+ case 'image/jpg':
+ $imagecreated = imagecreatefromjpeg($imageData);
+ break;
+ case 'image/png':
+ $imagecreated = imagecreatefrompng($imageData);
+ break;
+ case 'image/gif':
+ $imagecreated = imagecreatefromgif($imageData);
+ break;
+ default:
+ return null;
+ }
+
+
+ if (!$imagecreated)
+ {
+ return null;
+ }
+
+ $src_aspect_ratio = $src_width / $src_height;
+ $thu_aspect_ratio = $maxwidth / $maxheight;
+
+ if ($src_width <= $maxwidth && $src_height <= $maxheight)
+ {
+ $thu_width = $src_width;
+ $thu_height = $src_height;
+ }
+ elseif ($thu_aspect_ratio > $src_aspect_ratio)
+ {
+ $thu_width = (int) ($maxheight * $src_aspect_ratio);
+ $thu_height = $maxheight;
+ }
+ else
+ {
+ $thu_width = $maxwidth;
+ $thu_height = (int) ($maxwidth / $src_aspect_ratio);
+ }
+
+ $imageScaled = imagecreatetruecolor($thu_width, $thu_height);
+
+ if ($mime === 'image/png')
+ {
+ $background = imagecolorallocate($imageScaled , 0, 0, 0);
+ imagecolortransparent($imageScaled, $background);
+ imagealphablending($imageScaled, false);
+ imagesavealpha($imageScaled, true);
+ }
+
+ imagecopyresampled($imageScaled, $imagecreated, 0, 0, 0, 0, $thu_width, $thu_height, $src_width, $src_height);
+
+ if ($mime === "image/gif")
+ {
+ $background = imagecolorallocate($imageScaled, 0, 0, 0);
+ imagecolortransparent($imageScaled, $background);
+ }
+
+ if (!empty($imageScaled))
+ {
+ ob_start();
+
+ if ($mime == 'image/png')
+ imagepng($imageScaled, NULL);
+ else if ($mime === 'image/gif')
+ imagegif($imageScaled, NULL);
+ else
+ imagejpeg($imageScaled, NULL, $quality);
+
+ $resizedImageData = ob_get_contents();
+ ob_end_clean();
+ @imagedestroy($imagecreated);
+ @imagedestroy($imageScaled);
+
+
+ if (!empty($resizedImageData))
+ {
+ return base64_encode($resizedImageData);
+ }
+ return null;
+ }
+ return null;
+ }
+
+ private function _updateFoto($person_id, $foto)
+ {
+ $personJson['foto'] = $foto;
+ $result = $this->PersonModel->update($person_id, $personJson);
+
+ if (isError($result))
+ {
+ return error($result->msg, EXIT_ERROR);
+ }
+
+ return $result;
+ }
+
+ private function _deleteFoto($person_id)
+ {
+ $personJson['foto'] = null;
+ $result = $this->PersonModel->update($person_id, $personJson);
+
+ if (isError($result))
+ {
+ return error($result->msg, EXIT_ERROR);
+ }
+
+ return $result;
+ }
+}
diff --git a/application/controllers/api/frontend/v1/notiz/NotizAnrechnung.php b/application/controllers/api/frontend/v1/notiz/NotizAnrechnung.php
new file mode 100644
index 000000000..30dae9a50
--- /dev/null
+++ b/application/controllers/api/frontend/v1/notiz/NotizAnrechnung.php
@@ -0,0 +1,44 @@
+ ['admin:r', 'assistenz:r'],
+ ]);
+
+ //Load Models
+ $this->load->model('person/Notiz_model', 'NotizModel');
+ $this->load->model('person/Notizzuordnung_model', 'NotizzuordnungModel');
+
+ // Load Libraries
+ $this->load->library('VariableLib', ['uid' => getAuthUID()]);
+
+ // Load language phrases
+ $this->loadPhrases([
+ 'ui'
+ ]);
+ }
+
+ public function isBerechtigt($id, $typeId)
+ {
+ if($typeId != "anrechnung_id")
+ {
+ $this->terminateWithError($this->p->t('ui','error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL);
+ }
+
+ //TODO define permission
+ if(!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid'))
+ {
+ $result = $this->p->t('lehre','error_keineSchreibrechte');
+
+ $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
+ }
+ $this->terminateWithSuccess("berechtigt in überschreibender Funktion");
+ }
+}
\ No newline at end of file
diff --git a/application/controllers/api/frontend/v1/notiz/NotizBestellung.php b/application/controllers/api/frontend/v1/notiz/NotizBestellung.php
new file mode 100644
index 000000000..e30628f33
--- /dev/null
+++ b/application/controllers/api/frontend/v1/notiz/NotizBestellung.php
@@ -0,0 +1,43 @@
+ ['admin:r', 'assistenz:r'],
+ ]);
+
+ //Load Models
+ $this->load->model('person/Notiz_model', 'NotizModel');
+ $this->load->model('person/Notizzuordnung_model', 'NotizzuordnungModel');
+
+ // Load Libraries
+ $this->load->library('VariableLib', ['uid' => getAuthUID()]);
+
+ // Load language phrases
+ $this->loadPhrases([
+ 'ui'
+ ]);
+ }
+
+ public function isBerechtigt($id, $typeId)
+ {
+ if($typeId != "bestellung_id")
+ {
+ $this->terminateWithError($this->p->t('ui','error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL);
+ }
+ //TODO define permission
+ if(!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid'))
+ {
+ $result = $this->p->t('lehre','error_keineSchreibrechte');
+
+ $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
+ }
+ $this->terminateWithSuccess("berechtigt in überschreibender Funktion");
+ }
+}
\ No newline at end of file
diff --git a/application/controllers/api/frontend/v1/notiz/NotizLehreinheit.php b/application/controllers/api/frontend/v1/notiz/NotizLehreinheit.php
index f8e1f816b..a3b96d477 100644
--- a/application/controllers/api/frontend/v1/notiz/NotizLehreinheit.php
+++ b/application/controllers/api/frontend/v1/notiz/NotizLehreinheit.php
@@ -17,5 +17,106 @@ class NotizLehreinheit extends Notiz_Controller
'getMitarbeiter' => ['admin:r', 'assistenz:r'],
'isBerechtigt' => ['admin:r', 'assistenz:r'],
]);
+
+ //Load Models
+ $this->load->model('person/Notiz_model', 'NotizModel');
+ $this->load->model('person/Notizzuordnung_model', 'NotizzuordnungModel');
+ $this->load->model('education/Lehreinheit_model', 'LehreinheitModel');
+
+ // Load Libraries
+ $this->load->library('VariableLib', ['uid' => getAuthUID()]);
+
+ //Permission checks for allowed Oes
+ $allowedOes = $this->permissionlib->getOE_isEntitledFor('assistenz') ?: [];
+
+ if ($this->router->method == 'addNewNotiz')
+ {
+ $json = $this->input->post('data');
+ $post_data = json_decode($json, true);
+ $lehreinheit_id = $post_data['id'];
+
+ if(!$lehreinheit_id)
+ {
+ return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Lehreinheit ID']), self::ERROR_TYPE_GENERAL);
+ }
+ $this->_checkAllowedOesFromLehreinheit($lehreinheit_id, $allowedOes);
+ }
+
+ if ($this->router->method == 'updateNotiz')
+ {
+ $json = $this->input->post('data');
+ $post_data = json_decode($json, true);
+ $notiz_id = $post_data['notiz_id'];
+
+ if(!$notiz_id)
+ {
+ return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Notiz ID']), self::ERROR_TYPE_GENERAL);
+ }
+
+ //get lehreinheit_id
+ $result = $this->NotizzuordnungModel->loadWhere(['notiz_id' => $notiz_id]);
+
+ $data = $this->getDataOrTerminateWithError($result);
+ $lehreinheit_id = current($data)->lehreinheit_id;
+
+ if(!$lehreinheit_id)
+ {
+ return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Lehreinheit ID']), self::ERROR_TYPE_GENERAL);
+ }
+ $this->_checkAllowedOesFromLehreinheit($lehreinheit_id, $allowedOes);
+ }
+
+ if ($this->router->method == 'deleteNotiz')
+ {
+ $notiz_id = $this->input->post('notiz_id');
+ $lehreinheit_id = $this->input->post('id');
+
+ if(!$notiz_id)
+ {
+ return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Notiz ID']), self::ERROR_TYPE_GENERAL);
+ }
+
+ if(!$lehreinheit_id)
+ {
+ return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Lehreinheit ID']), self::ERROR_TYPE_GENERAL);
+ }
+ $this->_checkAllowedOesFromLehreinheit($lehreinheit_id, $allowedOes);
+ }
+
+ // Load language phrases
+ $this->loadPhrases([
+ 'ui'
+ ]);
}
-}
\ No newline at end of file
+
+ private function _checkAllowedOesFromLehreinheit($lehreinheit_id, $allowedOes)
+ {
+ //get oe from lehreinheit
+ $result = $this->LehreinheitModel->getOes($lehreinheit_id);
+ $data = $this->getDataOrTerminateWithError($result);
+ $oes = current($data);
+
+ if (!in_array($oes, $allowedOes))
+ {
+ return $this->terminateWithError($this->p->t('ui', 'error_keineBerechtigungStg') . " " . $oes, self::ERROR_TYPE_GENERAL);
+ }
+ }
+
+ public function isBerechtigt($id, $typeId)
+ {
+ if($typeId != "lehreinheit_id")
+ {
+ $this->terminateWithError($this->p->t('ui','error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL);
+ }
+
+ if(!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid'))
+ {
+ $result = $this->p->t('lehre','error_keineSchreibrechte');
+
+ $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
+ }
+ $this->terminateWithSuccess("berechtigt in überschreibender Funktion");
+ }
+
+
+}
diff --git a/application/controllers/api/frontend/v1/notiz/NotizMitarbeiter.php b/application/controllers/api/frontend/v1/notiz/NotizMitarbeiter.php
new file mode 100644
index 000000000..f7de4b47b
--- /dev/null
+++ b/application/controllers/api/frontend/v1/notiz/NotizMitarbeiter.php
@@ -0,0 +1,44 @@
+ ['admin:r', 'assistenz:r'],
+ ]);
+
+ //Load Models
+ $this->load->model('person/Notiz_model', 'NotizModel');
+ $this->load->model('person/Notizzuordnung_model', 'NotizzuordnungModel');
+
+ // Load Libraries
+ $this->load->library('VariableLib', ['uid' => getAuthUID()]);
+
+ // Load language phrases
+ $this->loadPhrases([
+ 'ui'
+ ]);
+ }
+
+ public function isBerechtigt($id, $typeId)
+ {
+ if($typeId != "mitarbeiter_uid")
+ {
+ $this->terminateWithError($this->p->t('ui','error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL);
+ }
+
+ //TODO define permission
+ if(!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid'))
+ {
+ $result = $this->p->t('lehre','error_keineSchreibrechte');
+
+ $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
+ }
+ $this->terminateWithSuccess("berechtigt in überschreibender Funktion");
+ }
+}
\ No newline at end of file
diff --git a/application/controllers/api/frontend/v1/notiz/NotizPerson.php b/application/controllers/api/frontend/v1/notiz/NotizPerson.php
index 23a8fd199..a047129d7 100644
--- a/application/controllers/api/frontend/v1/notiz/NotizPerson.php
+++ b/application/controllers/api/frontend/v1/notiz/NotizPerson.php
@@ -20,33 +20,100 @@ class NotizPerson extends Notiz_Controller
'isBerechtigt' => ['admin:r', 'assistenz:r'],
'getCountNotes' => ['admin:r', 'assistenz:r'],
]);
+
+ //Load Models
+ $this->load->model('person/Benutzer_model', 'BenutzerModel');
+ $this->load->model('crm/Student_model', 'StudentModel');
+ $this->load->model('crm/Prestudent_model', 'PrestudentModel');
+
+ //Permission checks for allowed Oes
+ if ($this->router->method == 'addNewNotiz')
+ {
+ $json = $this->input->post('data');
+ $post_data = json_decode($json, true);
+ $person_id = $post_data['id'];
+
+ $allowedStgs = $this->permissionlib->getSTG_isEntitledFor('assistenz') ?: [];
+
+ if(!$person_id)
+ {
+ return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Person ID']), self::ERROR_TYPE_GENERAL);
+ }
+ $this->_checkIfBerechtigungForOnePrestudentExists($person_id, $allowedStgs);
+ }
+
+ if ( $this->router->method == 'updateNotiz')
+ {
+ $json = $this->input->post('data');
+ $post_data = json_decode($json, true);
+ $notiz_id = $post_data['notiz_id'];
+
+ if(!$notiz_id)
+ {
+ return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Notiz ID']), self::ERROR_TYPE_GENERAL);
+ }
+
+ //get person_id
+ $result = $this->NotizzuordnungModel->loadWhere(['notiz_id' => $notiz_id]);
+
+ $data = $this->getDataOrTerminateWithError($result);
+ $person_id = current($data)->person_id;
+
+ $allowedStgs = $this->permissionlib->getSTG_isEntitledFor('assistenz') ?: [];
+ $this->_checkIfBerechtigungForOnePrestudentExists($person_id, $allowedStgs);
+ }
+
+ if ($this->router->method == 'deleteNotiz' )
+ {
+ $notiz_id = $this->input->post('notiz_id');
+ $person_id = $this->input->post('id');
+
+ if(!$notiz_id)
+ {
+ return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Notiz ID']), self::ERROR_TYPE_GENERAL);
+ }
+
+ if(!$person_id)
+ {
+ return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'person ID']), self::ERROR_TYPE_GENERAL);
+ }
+
+ $allowedStgs = $this->permissionlib->getSTG_isEntitledFor('assistenz') ?: [];
+ $this->_checkIfBerechtigungForOnePrestudentExists($person_id, $allowedStgs);
+ }
}
public function isBerechtigt($id, $typeId)
{
if($typeId != "person_id")
{
- return $this->terminateWithError($this->p->t('ui', 'error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL);
+ $this->terminateWithError($this->p->t('ui', 'error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL);
}
- //TODO define permission
if (!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid'))
{
$result = $this->p->t('lehre', 'error_keineSchreibrechte');
-
- return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
+ $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
}
- return $this->outputJsonSuccess(true);
+ $this->terminateWithSuccess("berechtigt in überschreibender Funktion");
}
- public function loadDokumente()
+ //stv: if person has permission of one studiengang of person -> permission to add/update/delete Note
+ private function _checkIfBerechtigungForOnePrestudentExists($person_id, $allowedStgs)
{
- $notiz_id = $this->input->post('notiz_id');
+ $result = $this->PrestudentModel->loadWhere(['person_id' => $person_id]);
+ $data = $this->getDataOrTerminateWithError($result);
- // TODO(chris): make CI variant of endpoint
- $this->NotizModel->addSelect($this->NotizModel->escape(base_url('content/notizdokdownload.php?id=')) . ' || campus.tbl_dms_version.dms_id AS preview');
-
- return parent::loadDokumente();
+ $checkarray = [];
+ foreach ($data as $item)
+ {
+ if(in_array($item->studiengang_kz, $allowedStgs))
+ {
+ return true;
+ }
+ }
+
+ $this->terminateWithError($this->p->t('ui', 'error_keineBerechtigungStg'), self::ERROR_TYPE_GENERAL);
}
-}
\ No newline at end of file
+}
diff --git a/application/controllers/api/frontend/v1/notiz/NotizPrestudent.php b/application/controllers/api/frontend/v1/notiz/NotizPrestudent.php
new file mode 100644
index 000000000..5e6cd747c
--- /dev/null
+++ b/application/controllers/api/frontend/v1/notiz/NotizPrestudent.php
@@ -0,0 +1,117 @@
+ ['admin:r', 'assistenz:r'],
+ ]);
+
+ //Load Models
+ $this->load->model('person/Notiz_model', 'NotizModel');
+ $this->load->model('person/Notizzuordnung_model', 'NotizzuordnungModel');
+ $this->load->model('crm/Student_model', 'StudentModel');
+
+ // Load Libraries
+ $this->load->library('VariableLib', ['uid' => getAuthUID()]);
+
+ // Load language phrases
+ $this->loadPhrases([
+ 'ui'
+ ]);
+
+ //Permission checks for Studiengangsarray
+ $allowedStgs = $this->permissionlib->getSTG_isEntitledFor('assistenz') ?: [];
+
+ if ($this->router->method == 'addNewNotiz')
+ {
+ $json = $this->input->post('data');
+ $post_data = json_decode($json, true);
+ $prestudent_id = $post_data['id'];
+
+ if(!$prestudent_id)
+ {
+ return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Lehreinheit ID']), self::ERROR_TYPE_GENERAL);
+ }
+ $this->_checkAllowedOesFromPrestudent($prestudent_id, $allowedStgs);
+ }
+
+ if ($this->router->method == 'updateNotiz')
+ {
+ $json = $this->input->post('data');
+ $post_data = json_decode($json, true);
+ $notiz_id = $post_data['notiz_id'];
+
+ if(!$notiz_id)
+ {
+ return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Notiz ID']), self::ERROR_TYPE_GENERAL);
+ }
+
+ //get prestudent_id
+ $result = $this->NotizzuordnungModel->loadWhere(['notiz_id' => $notiz_id]);
+
+ $data = $this->getDataOrTerminateWithError($result);
+ $prestudent_id = current($data)->prestudent_id;
+
+ if(!$prestudent_id)
+ {
+ return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Prestudent ID']), self::ERROR_TYPE_GENERAL);
+ }
+ $this->_checkAllowedOesFromPrestudent($prestudent_id, $allowedStgs);
+ }
+
+ if ($this->router->method == 'deleteNotiz')
+ {
+ $notiz_id = $this->input->post('notiz_id');
+ $prestudent_id = $this->input->post('id');
+
+ if(!$notiz_id)
+ {
+ return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Notiz ID']), self::ERROR_TYPE_GENERAL);
+ }
+
+ if(!$prestudent_id)
+ {
+ return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Prestudent ID']), self::ERROR_TYPE_GENERAL);
+ }
+ $this->_checkAllowedOesFromPrestudent($prestudent_id, $allowedStgs);
+ }
+ }
+
+ public function isBerechtigt($id, $typeId)
+ {
+ if($typeId != "prestudent_id")
+ {
+ $this->terminateWithError($this->p->t('ui','error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL);
+ }
+
+ if(!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid'))
+ {
+ $result = $this->p->t('lehre','error_keineSchreibrechte');
+
+ $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
+ }
+ $this->terminateWithSuccess("berechtigt in überschreibender Funktion");
+ }
+
+ private function _checkAllowedOesFromPrestudent($prestudent_id, $allowedStgs)
+ {
+ $student_uid = $this->StudentModel->getUID($prestudent_id);
+
+ $result = $this->StudentModel->loadWhere(['student_uid' => $student_uid]);
+
+ $data = $this->getDataOrTerminateWithError($result);
+ $studiengang_kz = current($data)->studiengang_kz;
+
+ if (!in_array($studiengang_kz, $allowedStgs))
+ {
+ return $this->terminateWithError($this->p->t('ui', 'error_keineBerechtigungStg'), self::ERROR_TYPE_GENERAL);
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/application/controllers/api/frontend/v1/notiz/NotizProjekt.php b/application/controllers/api/frontend/v1/notiz/NotizProjekt.php
new file mode 100644
index 000000000..9cdde36ae
--- /dev/null
+++ b/application/controllers/api/frontend/v1/notiz/NotizProjekt.php
@@ -0,0 +1,32 @@
+ ['admin:r', 'assistenz:r'],
+ ]);
+ }
+
+ public function isBerechtigt($id, $typeId)
+ {
+ if($typeId != "projekt_kurzbz")
+ {
+ $this->terminateWithError($this->p->t('ui','error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL);
+ }
+
+ //TODO define permission
+ if(!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid'))
+ {
+ $result = $this->p->t('lehre','error_keineSchreibrechte');
+
+ $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
+ }
+ $this->terminateWithSuccess("berechtigt in überschreibender Funktion");
+ }
+}
\ No newline at end of file
diff --git a/application/controllers/api/frontend/v1/notiz/NotizProjektphase.php b/application/controllers/api/frontend/v1/notiz/NotizProjektphase.php
new file mode 100644
index 000000000..7a82c658e
--- /dev/null
+++ b/application/controllers/api/frontend/v1/notiz/NotizProjektphase.php
@@ -0,0 +1,32 @@
+ ['admin:r', 'assistenz:r'],
+ ]);
+ }
+
+ public function isBerechtigt($id, $typeId)
+ {
+ if($typeId != "projektphase_id")
+ {
+ $this->terminateWithError($this->p->t('ui','error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL);
+ }
+
+ //TODO define permission
+ if(!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid'))
+ {
+ $result = $this->p->t('lehre','error_keineSchreibrechte');
+
+ $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
+ }
+ $this->terminateWithSuccess("berechtigt in überschreibender Funktion");
+ }
+}
\ No newline at end of file
diff --git a/application/controllers/api/frontend/v1/notiz/NotizProjekttask.php b/application/controllers/api/frontend/v1/notiz/NotizProjekttask.php
new file mode 100644
index 000000000..aadb04f40
--- /dev/null
+++ b/application/controllers/api/frontend/v1/notiz/NotizProjekttask.php
@@ -0,0 +1,32 @@
+ ['admin:r', 'assistenz:r'],
+ ]);
+ }
+
+ public function isBerechtigt($id, $typeId)
+ {
+ if($typeId != "projekttask_id")
+ {
+ $this->terminateWithError($this->p->t('ui','error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL);
+ }
+
+ //TODO define permission
+ if(!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid'))
+ {
+ $result = $this->p->t('lehre','error_keineSchreibrechte');
+
+ $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
+ }
+ $this->terminateWithSuccess("berechtigt in überschreibender Funktion");
+ }
+}
\ No newline at end of file
diff --git a/application/controllers/api/frontend/v1/studstatus/Unterbrechung.php b/application/controllers/api/frontend/v1/studstatus/Unterbrechung.php
index abf58cf4f..72d5dbccc 100644
--- a/application/controllers/api/frontend/v1/studstatus/Unterbrechung.php
+++ b/application/controllers/api/frontend/v1/studstatus/Unterbrechung.php
@@ -127,9 +127,9 @@ class Unterbrechung extends FHCAPI_Controller
$this->form_validation->set_rules(
'datum_wiedereinstieg',
'Datum Wiedereinstieg',
- 'required|callback_isValidDate|callback_isDateInFuture',
+ 'required|is_valid_date|callback_isDateInFuture',
[
- 'isValidDate' => $this->p->t('ui', 'error_invalid_date'),
+ 'is_valid_date' => $this->p->t('ui', 'error_invalid_date'),
'isDateInFuture' => $this->p->t('ui', 'error_invalid_date')
]
);
@@ -209,18 +209,9 @@ class Unterbrechung extends FHCAPI_Controller
$this->terminateWithSuccess(getData($result));
}
- public function isValidDate($date)
- {
- try {
- new DateTime($date);
- } catch (Exception $e) {
- return false;
- }
- return true;
- }
-
public function isDateInFuture($date)
{
return new DateTime() < new DateTime($date);
}
}
+
diff --git a/application/controllers/api/frontend/v1/stv/Aufnahmetermine.php b/application/controllers/api/frontend/v1/stv/Aufnahmetermine.php
index 26033908d..437ba42ad 100644
--- a/application/controllers/api/frontend/v1/stv/Aufnahmetermine.php
+++ b/application/controllers/api/frontend/v1/stv/Aufnahmetermine.php
@@ -36,15 +36,44 @@ class Aufnahmetermine extends FHCAPI_Controller
// Load models
$this->load->model('crm/Reihungstest_model', 'ReihungstestModel');
$this->load->model('crm/RtPerson_model', 'RtPersonModel');
+ $this->load->model('organisation/Studienplan_model', 'StudienplanModel');
+ $this->load->model('organisation/Studienordnung_model', 'StudienordnungModel');
+ $this->load->model('organisation/Studiengang_model', 'StudiengangModel');
}
public function getAufnahmetermine($person_id)
{
$result = $this->ReihungstestModel->getReihungstestPerson($person_id);
+ $arrayRt = $this->getDataOrTerminateWithError($result);
- $data = $this->getDataOrTerminateWithError($result);
+ foreach ($arrayRt as $item) {
+ //Studienplan
+ $result = $this->StudienplanModel->loadWhere([
+ 'studienplan_id' => $item->studienplan_id
+ ]);
+ $data = $this->getDataOrTerminateWithError($result);
+ $studienordnung_id_ber = current($data)->studienordnung_id;
- $this->terminateWithSuccess($data);
+ //Studienordnung
+ $result = $this->StudienordnungModel->loadWhere([
+ 'studienordnung_id' => $studienordnung_id_ber
+ ]);
+ $data = $this->getDataOrTerminateWithError($result);
+ $studiengang_kz_ber = current($data)->studiengang_kz;
+
+ //Studiengang von studiengang_kz_ber
+ $result = $this->StudiengangModel->load($studiengang_kz_ber);
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $studiengangkurzbzlang_ber = current($data)->kurzbzlang;
+ $typ_ber = current($data)->typ;
+
+ //add to Array
+ $item->studiengang_kz_ber = $studiengang_kz_ber;
+ $item->studiengangkurzbzlang_ber = $studiengangkurzbzlang_ber;
+ $item->studiengangtyp_ber = $typ_ber;
+ }
+ $this->terminateWithSuccess($arrayRt);
}
public function insertAufnahmetermin()
@@ -60,7 +89,6 @@ class Aufnahmetermine extends FHCAPI_Controller
return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Person ID']), self::ERROR_TYPE_GENERAL);
}
-
$rt_id = (isset($formData['rt_id']) && !empty($formData['rt_id'])) ? $formData['rt_id'] : null;
$anmeldedatum = (isset($formData['anmeldedatum']) && !empty($formData['anmeldedatum'])) ? $formData['anmeldedatum'] : null;
$teilgenommen = (isset($formData['teilgenommen']) && !empty($formData['teilgenommen'])) ? $formData['teilgenommen'] : false;
@@ -224,7 +252,11 @@ class Aufnahmetermine extends FHCAPI_Controller
)
);
- $data = $this->getDataOrTerminateWithError($result);
+ //check if existing placementtest
+ if(!hasData($result))
+ $this->terminateWithSuccess([]);
+ else
+ $data = getData($result);
$studienplan_arr = [];
$include_ids = [];
@@ -233,12 +265,18 @@ class Aufnahmetermine extends FHCAPI_Controller
if($item->studienplan_id != null)
$studienplan_arr[] = $item->studienplan_id;
}
+ if(!hasData($studienplan_arr))
+ $this->terminateWithSuccess([]);
//get Placementtests Person
$person_id = $this->_getPersonId($prestudent_id);
$resultRt = $this->ReihungstestModel->getReihungstestPerson($person_id);
- $dataRt = $this->getDataOrTerminateWithError($resultRt);
+ //check if existing placementtest
+ if(!hasData($result))
+ $this->terminateWithSuccess([]);
+ else
+ $dataRt = getData($resultRt);
foreach ($dataRt as $item)
{
@@ -354,6 +392,7 @@ class Aufnahmetermine extends FHCAPI_Controller
$person_id = $this->input->get('person_id');
$punkte = $this->input->get('punkte');
$reihungstest_id = $this->input->get('reihungstest_id');
+ $has_excluded_gebiete = $this->input->get('hasExcludedAreas');
if(!$reihungstest_id)
{
@@ -364,22 +403,27 @@ class Aufnahmetermine extends FHCAPI_Controller
$studiengang_kz = $this->input->get('studiengang_kz');
$this->load->model('testtool/Ablauf_model', 'AblaufModel');
- $result = $this->AblaufModel->getAblaufGebieteAndGewichte($studiengang_kz);
+ $result = $this->AblaufModel->getAblaufGebieteAndGewichte($studiengang_kz, 1);
$data = $this->getDataOrTerminateWithError($result);
$weightedArray = [];
+ $basis_gebiet_id_arr = [];
+ $basis_gebiet_id_toString = '';
foreach ($data as $abl)
{
$weightedArray[$abl->gebiet_id] = $abl->gewicht;
+ $basis_gebiet_id_arr[]= $abl->gebiet_id;
}
+ $basis_gebiet_id_toString = implode(', ', $basis_gebiet_id_arr);
- $result = $this->ReihungstestModel->getReihungstestErgebnisPerson($person_id, $punkte, $reihungstest_id, $weightedArray);
-
-/* if (isError($result))
- {
- $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
- }*/
-
+ $result = $this->ReihungstestModel->getReihungstestErgebnisPerson(
+ $person_id,
+ $punkte,
+ $reihungstest_id,
+ $weightedArray,
+ $has_excluded_gebiete,
+ $basis_gebiet_id_toString
+ );
$this->terminateWithSuccess($result);
}
diff --git a/application/controllers/api/frontend/v1/stv/Config.php b/application/controllers/api/frontend/v1/stv/Config.php
index c787381f0..bc1fbebfe 100644
--- a/application/controllers/api/frontend/v1/stv/Config.php
+++ b/application/controllers/api/frontend/v1/stv/Config.php
@@ -200,7 +200,8 @@ class Config extends FHCAPI_Controller
'type' => 'select',
'values' => $buchungstyp_kurzbz_plus_all,
'value_key' => 'buchungstyp_kurzbz',
- 'label_key' => 'beschreibung'
+ 'label_key' => 'beschreibung',
+ 'default' => 'all'
],
'samestg' => [
'type' => 'bool',
@@ -226,7 +227,8 @@ class Config extends FHCAPI_Controller
'type' => 'select',
'values' => $buchungstyp_kurzbz_plus_all,
'value_key' => 'buchungstyp_kurzbz',
- 'label_key' => 'beschreibung'
+ 'label_key' => 'beschreibung',
+ 'default' => 'all'
],
'samestg' => [
'type' => 'bool',
diff --git a/application/controllers/api/frontend/v1/stv/Dokumente.php b/application/controllers/api/frontend/v1/stv/Dokumente.php
index 9f54d0aa4..b8c7830bd 100644
--- a/application/controllers/api/frontend/v1/stv/Dokumente.php
+++ b/application/controllers/api/frontend/v1/stv/Dokumente.php
@@ -753,6 +753,10 @@ class Dokumente extends FHCAPI_Controller
);
$data = $this->getDataOrTerminateWithError($result);
+ if(!(is_array($data) && count($data) > 0))
+ {
+ return null;
+ }
$student = current($data);
return $student->student_uid;
diff --git a/application/controllers/api/frontend/v1/stv/Student.php b/application/controllers/api/frontend/v1/stv/Student.php
index 2721bbd6f..7694807e7 100644
--- a/application/controllers/api/frontend/v1/stv/Student.php
+++ b/application/controllers/api/frontend/v1/stv/Student.php
@@ -108,6 +108,10 @@ class Student extends FHCAPI_Controller
$this->PrestudentModel->addSelect('p.matr_nr');
$this->PrestudentModel->addSelect('p.anrede');
$this->PrestudentModel->addSelect('p.zugangscode');
+ if($this->permissionlib->isBerechtigt('student/bpk'))
+ {
+ $this->PrestudentModel->addSelect('p.bpk');
+ }
if (defined('ACTIVE_ADDONS') && strpos(ACTIVE_ADDONS, 'bewerbung') !== false) {
$this->PrestudentModel->addSelect(
@@ -542,6 +546,7 @@ class Student extends FHCAPI_Controller
$this->_validate();
+ // TODO(chris): This should be in a library
$this->load->model('crm/Student_model', 'StudentModel');
$this->load->model('crm/Prestudent_model', 'PrestudentModel');
$this->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel');
@@ -793,8 +798,8 @@ class Student extends FHCAPI_Controller
$this->form_validation->set_rules('geschlecht', 'Geschlecht', 'callback_requiredIfNotPersonId', [
'requiredIfNotPersonId' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('person', 'geschlecht')])
]);
- $this->form_validation->set_rules('gebdatum', 'Geburtsdatum', ['isValidDate', function($value) { return isValidDate($value); }], [
- 'isValidDate' => $this->p->t('ui', 'error_invalid_date')
+ $this->form_validation->set_rules('gebdatum', 'Geburtsdatum', 'is_valid_date', [
+ 'is_valid_date' => $this->p->t('ui', 'error_invalid_date')
]);
//$this->form_validation->set_rules('address[checked]', 'Address', 'required');
$this->form_validation->set_rules('address[plz]', 'PLZ', 'callback_requiredIfAddressFunc', [
diff --git a/application/controllers/api/frontend/v1/stv/Students.php b/application/controllers/api/frontend/v1/stv/Students.php
index acacca052..55f4b8976 100644
--- a/application/controllers/api/frontend/v1/stv/Students.php
+++ b/application/controllers/api/frontend/v1/stv/Students.php
@@ -611,7 +611,7 @@ class Students extends FHCAPI_Controller
if (!$verband && !$gruppe && $orgform_kurzbz !== null) {
$this->PrestudentModel->db->where(
"(
- SELECT orgform_kurzbz
+ SELECT orgform_kurzbz
FROM public.tbl_prestudentstatus
WHERE prestudent_id=tbl_prestudent.prestudent_id
AND studiensemester_kurzbz=" . $this->PrestudentModel->escape($studiensemester_kurzbz) . "
@@ -850,6 +850,41 @@ class Students extends FHCAPI_Controller
{
$stdsemEsc = $studiensemester_kurzbz ? $this->PrestudentModel->escape($studiensemester_kurzbz) : 'NULL';
+ $this->load->config('stv');
+ $tags = $this->config->item('stv_prestudent_tags');
+
+ $whereTags = '';
+ if (is_array($tags) && !isEmptyArray($tags)) {
+ $tags = array_keys($tags);
+
+ foreach ($tags as $key => $tag) {
+ $tags[$key] = $this->db->escape($tag);
+ }
+ $whereTags = " AND nt.typ_kurzbz IN (" . implode(",", $tags) . ")";
+ }
+ $subQueryTag = "
+ (
+ SELECT
+ tag.prestudent_id,
+ COALESCE(json_agg(tag ORDER BY tag.done), '[]'::json) AS tags
+ FROM (
+ SELECT DISTINCT ON (n.notiz_id)
+ n.notiz_id AS id,
+ nt.typ_kurzbz,
+ array_to_json(nt.bezeichnung_mehrsprachig)->>0 AS beschreibung,
+ n.text AS notiz,
+ nt.style,
+ n.erledigt AS done,
+ nz.prestudent_id
+ FROM public.tbl_notizzuordnung AS nz
+ JOIN public.tbl_notiz AS n ON nz.notiz_id = n.notiz_id
+ JOIN public.tbl_notiz_typ AS nt ON n.typ = nt.typ_kurzbz "
+ . $whereTags .
+ "
+ ) AS tag
+ GROUP BY tag.prestudent_id
+ ) AS tag_data_agg
+ ";
$this->PrestudentModel->addJoin('public.tbl_studiengang stg', 'studiengang_kz', 'LEFT');
$this->PrestudentModel->addJoin('public.tbl_person p', 'person_id');
@@ -872,8 +907,11 @@ class Students extends FHCAPI_Controller
AND ps.studiensemester_kurzbz=public.get_stdsem_prestudent(tbl_prestudent.prestudent_id, ' . $stdsemEsc . ')
AND ps.ausbildungssemester=public.get_absem_prestudent(tbl_prestudent.prestudent_id, ' . $stdsemEsc . ')', 'LEFT');
+ $this->PrestudentModel->addJoin($subQueryTag, 'tag_data_agg.prestudent_id = tbl_prestudent.prestudent_id', 'LEFT');
+
$this->PrestudentModel->addSelect("b.uid");
+ $this->PrestudentModel->addSelect('tag_data_agg.tags');
$this->PrestudentModel->addSelect('titelpre');
$this->PrestudentModel->addSelect('nachname');
$this->PrestudentModel->addSelect('vorname');
@@ -931,6 +969,7 @@ class Students extends FHCAPI_Controller
$this->PrestudentModel->addSelect('mentor');
$this->PrestudentModel->addSelect('b.aktiv AS bnaktiv');
+ $this->PrestudentModel->addSelect('unruly');
$this->PrestudentModel->db->where_in('tbl_prestudent.studiengang_kz', $this->allowedStgs);
diff --git a/application/controllers/api/frontend/v1/stv/Tags.php b/application/controllers/api/frontend/v1/stv/Tags.php
new file mode 100644
index 000000000..3004a1f3b
--- /dev/null
+++ b/application/controllers/api/frontend/v1/stv/Tags.php
@@ -0,0 +1,48 @@
+ self::BERECHTIGUNG_KURZBZ,
+ 'getTags' => self::BERECHTIGUNG_KURZBZ,
+ 'addTag' => self::BERECHTIGUNG_KURZBZ,
+ 'updateTag' => self::BERECHTIGUNG_KURZBZ,
+ 'doneTag' => self::BERECHTIGUNG_KURZBZ,
+ 'deleteTag' => self::BERECHTIGUNG_KURZBZ
+ ]);
+
+ $this->config->load('stv');
+ }
+
+ public function getTag($readonly_tags = null)
+ {
+ parent::getTag($this->config->item('stv_prestudent_tags'));
+ }
+ public function getTags($tags = null)
+ {
+ parent::getTags($this->config->item('stv_prestudent_tags'));
+ }
+ public function addTag($withZuordnung = true, $updatable_tags = null)
+ {
+ parent::addTag(true, $this->config->item('stv_prestudent_tags'));
+ }
+ public function updateTag($updatable_tags = null)
+ {
+ parent::updateTag($this->config->item('stv_prestudent_tags'));
+ }
+ public function deleteTag($withZuordnung = true, $updatable_tags = null)
+ {
+ parent::deleteTag(true, $this->config->item('stv_prestudent_tags'));
+ }
+ public function doneTag($updatable_tags = null)
+ {
+ parent::doneTag($this->config->item('stv_prestudent_tags'));
+ }
+}
diff --git a/application/controllers/api/frontend/v1/vertraege/Config.php b/application/controllers/api/frontend/v1/vertraege/Config.php
new file mode 100644
index 000000000..a4ebd8c48
--- /dev/null
+++ b/application/controllers/api/frontend/v1/vertraege/Config.php
@@ -0,0 +1,62 @@
+.
+ */
+
+if (!defined('BASEPATH')) exit('No direct script access allowed');
+
+use CI3_Events as Events;
+
+/**
+ * This controller operates between (interface) the JS (GUI) and the back-end
+ * Provides data to the ajax get calls about the VV Config
+ * This controller works with JSON calls on the HTTP GET or POST and the output is always JSON
+ */
+class Config extends FHCAPI_Controller
+{
+ public function __construct()
+ {
+ parent::__construct([
+ 'printDocument' => ['vertrag/mitarbeiter:r'],
+ ]);
+ }
+
+ public function printDocument()
+ {
+ $params = [];
+ $menu = [];
+
+ Events::trigger(
+ 'multiActionPrintHonorarvertrag',
+ // passing $menu per reference
+ function & () use (&$menu) {
+ return $menu;
+ },
+ $params
+ );
+
+ if (is_array($menu) && isset($menu[0]))
+ {
+ $this->terminateWithSuccess($menu[0]);
+ }
+ else
+ {
+ // $this->terminateWithError('Error with Event 'multiActionPrintHonorarvertrag');
+ $this->terminateWithSuccess();
+
+ }
+ }
+}
diff --git a/application/controllers/api/frontend/v1/vertraege/Vertraege.php b/application/controllers/api/frontend/v1/vertraege/Vertraege.php
index bb14bc511..c0683e999 100644
--- a/application/controllers/api/frontend/v1/vertraege/Vertraege.php
+++ b/application/controllers/api/frontend/v1/vertraege/Vertraege.php
@@ -26,9 +26,6 @@ class Vertraege extends FHCAPI_Controller
'deleteLehrauftrag' =>['vertrag/mitarbeiter:w'],
'deleteBetreuung' =>['vertrag/mitarbeiter:w'],
'getMitarbeiter' => ['vertrag/mitarbeiter:r'],
- 'getHeader' => ['vertrag/mitarbeiter:r'],
- 'getPersonAbteilung' => ['vertrag/mitarbeiter:r'],
- 'getLeitungOrg' => ['vertrag/mitarbeiter:r'],
]);
//Load Models and Libraries
@@ -241,7 +238,7 @@ class Vertraege extends FHCAPI_Controller
}
}
$this->db->trans_complete();
- $this->terminateWithSuccess(true);
+ $this->terminateWithSuccess($vertrag_id);
}
public function updateContract()
@@ -358,7 +355,7 @@ class Vertraege extends FHCAPI_Controller
}
$this->db->trans_complete();
- $this->terminateWithSuccess(true);
+ $this->terminateWithSuccess($vertrag_id);
}
public function loadContract($vertrag_id)
@@ -684,37 +681,4 @@ class Vertraege extends FHCAPI_Controller
}
return $this->terminateWithSuccess(getData($result));
}
-
- public function getPersonAbteilung($mitarbeiter_uid)
- {
- $this->load->model('ressource/Mitarbeiter_model', 'Mitarbeitermodel');
-
- $result = $this->Mitarbeitermodel->getPersonAbteilung($mitarbeiter_uid);
-
- $data = $this->getDataOrTerminateWithError($result);
-
- $this->terminateWithSuccess(current($data));
- }
-
- public function getLeitungOrg($oekurzbz)
- {
- $this->load->model('ressource/Mitarbeiter_model', 'Mitarbeitermodel');
-
- $result = $this->Mitarbeitermodel->getLeitungOrg($oekurzbz);
-
- $data = $this->getDataOrTerminateWithError($result);
-
- $this->terminateWithSuccess(current($data));
- }
-
- public function getHeader($person_id)
- {
- $this->load->model('ressource/Mitarbeiter_model', 'Mitarbeitermodel');
-
- $result = $this->Mitarbeitermodel->getHeader($person_id);
-
- $data = $this->getDataOrTerminateWithError($result);
-
- $this->terminateWithSuccess(current($data));
- }
}
diff --git a/application/controllers/jobs/AbgabetoolJob.php b/application/controllers/jobs/AbgabetoolJob.php
index 51b2b4920..b81053032 100644
--- a/application/controllers/jobs/AbgabetoolJob.php
+++ b/application/controllers/jobs/AbgabetoolJob.php
@@ -22,11 +22,272 @@ class AbgabetoolJob extends JOB_Controller
$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 .= '
+
+
+
+ | Datum |
+ Abgabe/Bezeichnung |
+ Status |
+
+
+ ';
+
+ $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 .= "
+
+ | {$abgabedatumFormatted} |
+
+ {$abgabe->bezeichnung}
+ |
+
+
+ {$sigLabel}
+
+ |
+
";
+ }
+
+ $abgabenString .= '
';
+ }
+
+ $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() {
@@ -234,8 +495,7 @@ class AbgabetoolJob extends JOB_Controller
// get all new or changed termine in interval
$result = $this->_ci->PaabgabeModel->findAbgabenNewOrUpdatedSince($interval, $relevantTypes);
$retval = getData($result);
-
- if(count($retval) == 0) {
+ if(!$retval) {
$this->_ci->logInfo("Keine Emails an Betreuer über neue oder veränderte Termine versandt");
return;
}
@@ -248,17 +508,29 @@ class AbgabetoolJob extends JOB_Controller
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) {
@@ -289,6 +561,8 @@ class AbgabetoolJob extends JOB_Controller
$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];
@@ -307,6 +581,8 @@ class AbgabetoolJob extends JOB_Controller
continue;
}
+ $relevantCounter++;
+
// format the Student Name
$s = $relevantAbgaben[0];
$nameParts = [];
@@ -365,6 +641,11 @@ class AbgabetoolJob extends JOB_Controller
// 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;
@@ -377,6 +658,11 @@ class AbgabetoolJob extends JOB_Controller
);
$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(
@@ -500,6 +786,12 @@ class AbgabetoolJob extends JOB_Controller
$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',
diff --git a/application/core/CI3_Events.php b/application/core/CI3_Events.php
index 37f6c3f21..ad4aea729 100644
--- a/application/core/CI3_Events.php
+++ b/application/core/CI3_Events.php
@@ -35,7 +35,7 @@ class CI3_Events
});
self::$eventsSorted[$event] = true;
}
-
+
foreach (self::$events[$event] as $conf) {
$conf[1](...$args);
}
diff --git a/application/core/Notiz_Controller.php b/application/core/Notiz_Controller.php
index cfc54d5f5..923970923 100644
--- a/application/core/Notiz_Controller.php
+++ b/application/core/Notiz_Controller.php
@@ -8,7 +8,7 @@ abstract class Notiz_Controller extends FHCAPI_Controller
{
const DEFAULT_PERMISSION_R = 'admin:r';
const DEFAULT_PERMISSION_RW = 'admin:rw';
- //public function __construct($zuordnung = 'person/Notizzuordnung_model')
+
public function __construct($permissions)
{
$default_permissions = [
@@ -97,13 +97,13 @@ abstract class Notiz_Controller extends FHCAPI_Controller
if (isError($result)) {
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
}
- return $this->terminateWithSuccess(getData($result) ?: []);
+ $this->terminateWithSuccess(getData($result) ?: []);
}
//Override function
protected function isBerechtigt($id, $typeId){
- return $this->terminateWithError("in abstract function: define right in extension", self::ERROR_TYPE_GENERAL);
+ $this->terminateWithError("in abstract function: define right in extension", self::ERROR_TYPE_GENERAL);
}
public function loadNotiz()
@@ -112,7 +112,6 @@ abstract class Notiz_Controller extends FHCAPI_Controller
$notiz_id = $this->input->post('notiz_id');
- //$this->load->model('person/Notiz_model', 'NotizModel');
$this->NotizModel->addJoin('public.tbl_notiz_dokument', 'notiz_id', 'LEFT');
$this->NotizModel->addSelect('*');
$this->NotizModel->addSelect("TO_CHAR(CASE WHEN public.tbl_notiz.updateamum >= public.tbl_notiz.insertamum
@@ -143,14 +142,9 @@ abstract class Notiz_Controller extends FHCAPI_Controller
$uid = getAuthUID();
- if (isset($_POST['data']))
- {
- $data = json_decode($_POST['data']);
- unset($_POST['data']);
- foreach ($data as $k => $v) {
- $_POST[$k] = $v;
- }
- }
+ $json = $this->input->post('data');
+ $post_data = json_decode($json, true);
+ $this->form_validation->set_data($post_data);
//Form Validation
$this->form_validation->set_rules('titel', 'Titel', 'required', [
@@ -166,26 +160,25 @@ abstract class Notiz_Controller extends FHCAPI_Controller
$this->terminateWithValidationErrors($this->form_validation->error_array());
}
- $titel = $this->input->post('titel');
- $text = $this->input->post('text');
- $erledigt = $this->input->post('erledigt');
- $verfasser_uid = isset($_POST['verfasser']) ? $_POST['verfasser'] : $uid;
- $bearbeiter_uid = isset($_POST['bearbeiter']) ? $_POST['bearbeiter'] : null;
- $type = $this->input->post('typeId');
- $start = $this->input->post('start');
- $ende = $this->input->post('ende');
+ $titel = $post_data['titel'];
+ $text = $post_data['text'];
+ $erledigt = $post_data['erledigt'];
+ $bearbeiter_uid = isset($post_data['bearbeiter']) ? $post_data['bearbeiter'] : null;
+ $type = $post_data['typeId'];
+ $start = isset($post_data['start']) ? $post_data['start'] : null;
+ $ende = isset($post_data['ende']) ? $post_data['ende'] : null;
// Start DB transaction
$this->db->trans_start();
//Save note
- $result = $this->NotizModel->insert(array('titel' => $titel, 'text' => $text, 'erledigt' => $erledigt, 'verfasser_uid' => $verfasser_uid,
- "insertvon" => $verfasser_uid, 'start' => $start, 'ende' => $ende, 'bearbeiter_uid' => $bearbeiter_uid));
+ $result = $this->NotizModel->insert(array('titel' => $titel, 'text' => $text, 'erledigt' => $erledigt, 'verfasser_uid' => $uid,
+ "insertvon" => $uid, 'start' => $start, 'ende' => $ende, 'bearbeiter_uid' => $bearbeiter_uid));
if (isError($result))
{
$this->db->trans_rollback();
- return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
+ $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
}
$notiz_id = $result->retval;
@@ -220,7 +213,7 @@ abstract class Notiz_Controller extends FHCAPI_Controller
if (isError($result))
{
$this->db->trans_rollback();
- return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
+ $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
}
$dms_id_arr[] = $result->retval['dms_id'];
}
@@ -235,34 +228,28 @@ abstract class Notiz_Controller extends FHCAPI_Controller
if (isError($result))
{
$this->db->trans_rollback();
- return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
+ $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
}
}
}
$this->db->trans_commit();
- return $this->terminateWithSuccess($result);
+ $this->terminateWithSuccess($result);
}
public function updateNotiz()
{
+
$this->load->library('form_validation');
$this->load->library('DmsLib');
- if (isset($_POST['data']))
- {
- $data = json_decode($_POST['data']);
- unset($_POST['data']);
- foreach ($data as $k => $v) {
- $_POST[$k] = $v;
- }
- }
+ $json = $this->input->post('data');
+ $post_data = json_decode($json, true);
- $notiz_id = $this->input->post('notiz_id');
+ $this->form_validation->set_data($post_data);
- if(!$notiz_id)
- {
- $this->terminateWithError($this->p->t('ui','error_missingId',['id'=>'Notiz_id']), self::ERROR_TYPE_GENERAL);
- }
+ $this->form_validation->set_rules('notiz_id', 'Notiz ID', 'required', [
+ 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'notiz_id'])
+ ]);
//Form Validation
$this->form_validation->set_rules('titel', 'Titel', 'required', [
@@ -280,25 +267,23 @@ abstract class Notiz_Controller extends FHCAPI_Controller
//update Notiz
$uid = getAuthUID();
- $titel = $this->input->post('titel');
- $text = $this->input->post('text');
- $verfasser_uid = isset($_POST['verfasser']) ? $_POST['verfasser'] : $uid;
- $bearbeiter_uid = isset($_POST['bearbeiter']) ? $_POST['bearbeiter'] : $uid;
- $erledigt = $this->input->post('erledigt');
- $start = $this->input->post('start');
- $ende = $this->input->post('ende');
+ $titel = $post_data['titel'];
+ $text = $post_data['text'];
+ $bearbeiter_uid = isset($post_data['bearbeiter']) ? $post_data['bearbeiter'] : $post_data['bearbeiter_uid'];
+ $erledigt = $post_data['erledigt'];
+ $start = $post_data['start'];
+ $ende = $post_data['ende'];
$result = $this->NotizModel->update(
[
- 'notiz_id' => $notiz_id
+ 'notiz_id' => $post_data['notiz_id'],
],
[
'titel' => $titel,
'updatevon' => $uid,
'updateamum' => date('c'),
'text' => $text,
- 'verfasser_uid' => $verfasser_uid,
- 'bearbeiter_uid' => $bearbeiter_uid,
+ 'bearbeiter_uid' => isEmptyString($bearbeiter_uid) ? null : $bearbeiter_uid,
'start' => $start,
'ende' => $ende,
'erledigt' => $erledigt
@@ -306,7 +291,7 @@ abstract class Notiz_Controller extends FHCAPI_Controller
);
if (isError($result))
{
- return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
+ $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
}
//update(1) loading all dms-entries with this notiz_id
@@ -314,7 +299,7 @@ abstract class Notiz_Controller extends FHCAPI_Controller
$this->load->model('person/Notizdokument_model', 'NotizdokumentModel');
$this->NotizdokumentModel->addJoin('campus.tbl_dms_version', 'dms_id');
- $result = $this->NotizdokumentModel->loadWhere(array('notiz_id' => $notiz_id));
+ $result = $this->NotizdokumentModel->loadWhere(array('notiz_id' => $post_data['notiz_id']));
$result = $this->getDataOrTerminateWithError($result);
foreach ($result as $doc) {
$dms_id_arr[$doc->dms_id] = array(
@@ -351,7 +336,7 @@ abstract class Notiz_Controller extends FHCAPI_Controller
$result = $this->getDataOrTerminateWithError($result);
$dms_id = $result['dms_id'];
- $result = $this->NotizdokumentModel->insert(array('notiz_id' => $notiz_id, 'dms_id' => $dms_id));
+ $result = $this->NotizdokumentModel->insert(array('notiz_id' => $post_data['notiz_id'], 'dms_id' => $dms_id));
$this->getDataOrTerminateWithError($result);
}
@@ -365,7 +350,7 @@ abstract class Notiz_Controller extends FHCAPI_Controller
$this->getDataOrTerminateWithError($result);
}
- return $this->terminateWithSuccess($result);
+ $this->terminateWithSuccess($result);
}
public function deleteNotiz()
@@ -416,15 +401,15 @@ abstract class Notiz_Controller extends FHCAPI_Controller
if (isError($result))
{
$this->db->trans_rollback();
- return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
+ $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
}
if(!hasData($result))
{
- return $this->terminateWithError($this->p->t('ui','error_missingId', ['id'=> 'Notiz_id']), self::ERROR_TYPE_GENERAL);
+ $this->terminateWithError($this->p->t('ui','error_missingId', ['id'=> 'Notiz_id']), self::ERROR_TYPE_GENERAL);
}
$this->db->trans_complete();
- return $this->terminateWithSuccess(getData($result));
+ $this->terminateWithSuccess(getData($result));
}
public function loadDokumente()
@@ -440,14 +425,14 @@ abstract class Notiz_Controller extends FHCAPI_Controller
array('public.tbl_notiz.notiz_id' => $notiz_id)
);
if (isError($result)) {
- return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
+ $this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
}
if(!hasData($result))
{
- return $this->terminateWithError($this->p->t('ui','error_missingId', ['id'=> 'Notiz_id']), self::ERROR_TYPE_GENERAL);
+ $this->terminateWithError($this->p->t('ui','error_missingId', ['id'=> 'Notiz_id']), self::ERROR_TYPE_GENERAL);
}
- return $this->terminateWithSuccess(getData($result));
+ $this->terminateWithSuccess(getData($result));
}
public function getMitarbeiter($searchString)
@@ -457,7 +442,7 @@ abstract class Notiz_Controller extends FHCAPI_Controller
if (isError($result)) {
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
}
- return $this->terminateWithSuccess($result);
+ $this->terminateWithSuccess($result);
}
public function getCountNotes($person_id)
@@ -476,4 +461,4 @@ abstract class Notiz_Controller extends FHCAPI_Controller
return $this->terminateWithSuccess($anzahl->anzahl ?: 0);
}
-}
\ No newline at end of file
+}
diff --git a/application/helpers/hlp_common_helper.php b/application/helpers/hlp_common_helper.php
index b13d9d44d..06cfa1cfd 100644
--- a/application/helpers/hlp_common_helper.php
+++ b/application/helpers/hlp_common_helper.php
@@ -91,7 +91,7 @@ function var_dump_to_error_log($parameter)
var_dump($parameter); // KEEP IT!!!
$ob_get_contents = ob_get_contents();
ob_end_clean();
- error_log(str_replace("\n", '', $ob_get_contents)); // KEEP IT!!!
+ error_log(str_replace("\n", '', $ob_get_contents) . ', referer: ' . "http".(!empty($_SERVER['HTTPS'])?"s":"")."://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']); // KEEP IT!!!
}
/**
@@ -408,22 +408,6 @@ function findResource($path, $resource, $subdir = false, $extraDir = null)
return null;
}
-/**
- * check if String can be converted to a date
- */
-function isValidDate($dateString)
-{
- try
- {
- return (new DateTime($dateString)) !== false;
- }
- catch(Exception $e)
- {
- return false;
- }
-}
-
-
// ------------------------------------------------------------------------
// PHP functions that don't exist in older versions
// ------------------------------------------------------------------------
@@ -446,7 +430,8 @@ if (!function_exists('array_is_list')) {
// ------------------------------------------------------------------------
/**
- * check if string can be converted to a date
+ * Check if the provided parameter is a string containing a valid date
+ * NOTE: the name is in the "snake case" format because othewise the CI form validation _cannot_ use it
*/
function is_valid_date($dateString)
{
diff --git a/application/helpers/hlp_header_helper.php b/application/helpers/hlp_header_helper.php
index c8b70d722..9b2570e3f 100644
--- a/application/helpers/hlp_header_helper.php
+++ b/application/helpers/hlp_header_helper.php
@@ -273,3 +273,199 @@ function absoluteJsImportUrl($relurl)
return $url;
}
+/*
+ * Manipulate CI views includes Array to load
+ * - public/js/FhcApps.js via customJSs and
+ * - app customisation js and/or css from extensions via customJSModules
+ * if customJSModules contains at least one vuejs app and customisation files
+ * exist in extensions
+ */
+class ExtendableAppsHelper
+{
+ private static $instance = null;
+
+ protected $extensions;
+
+ protected $customCSSs;
+ protected $customJSs;
+ protected $customJSModules;
+
+ protected $initialised;
+ protected $appscount;
+
+ protected $extCustomCSSs;
+ protected $extCustomJSs;
+ protected $extCustomJSModules;
+
+ private function __construct()
+ {
+ $this->extensions = array();
+ $this->customCSSs = null;
+ $this->customJSs = null;
+ $this->customJSModules = null;
+
+ $this->initialised = false;
+ $this->appscount = 0;
+
+ $this->extCustomCSSs = null;
+ $this->extCustomJSs = null;
+ $this->extCustomJSModules = null;
+ }
+
+ public static function getInstance()
+ {
+ if(self::$instance === null)
+ {
+ self::$instance = new ExtendableAppsHelper();
+ }
+ return self::$instance;
+ }
+
+ public function init($customCSSs, $customJSs, $customJSModules)
+ {
+ if($this->initialised)
+ {
+ return;
+ }
+
+ $this->customCSSs = $customCSSs;
+ $this->customJSs = $customJSs;
+ $this->customJSModules = $customJSModules;
+ $this->initialised = true;
+
+ if(!isset($this->customJSModules))
+ {
+ return;
+ }
+
+ if(!is_array($this->customJSModules))
+ {
+ $this->customJSModules = array($this->customJSModules);
+ }
+
+ if(count($this->customJSModules) < 1)
+ {
+ return;
+ }
+
+ $this->buildExtensionsList();
+ $this->prepareExtendedArrays();
+ }
+
+ public function getCustomCSSs()
+ {
+ if(is_null($this->extCustomCSSs))
+ {
+ return $this->customCSSs;
+ }
+ return $this->extCustomCSSs;
+ }
+
+ public function getCustomJSs()
+ {
+ if(is_null($this->extCustomJSs))
+ {
+ return $this->customJSs;
+ }
+ return $this->extCustomJSs;
+ }
+
+ public function getCustomJSModules()
+ {
+ if(is_null($this->extCustomJSModules))
+ {
+ return $this->customJSModules;
+ }
+ return $this->extCustomJSModules;
+ }
+
+ protected function buildExtensionsList()
+ {
+ $this->extensions = array();
+ $fsiterator = new FilesystemIterator(FHCPATH . 'application/extensions');
+ foreach ($fsiterator as $fsitem)
+ {
+ if(preg_match('/^FHC-Core-/', $fsitem->getBasename()))
+ {
+ $this->extensions[] = $fsitem->getBasename();
+ }
+ }
+ }
+
+ protected function prepareExtendedArrays()
+ {
+ $this->appscount = 0;
+ $this->initExtCustomCSSs();
+ $this->extCustomJSModules = array();
+ foreach($this->customJSModules as $item)
+ {
+ $matches = array();
+ if(preg_match('#^public/(extensions/FHC-Core-.+)?js/apps/(.*)\.js$#', $item, $matches))
+ {
+ $this->appscount++;
+
+ $fhcextension = $matches[1];
+ $app = $matches[2];
+
+ $extend_js_suffix = 'js/extend_app/' . $fhcextension . $app . '.js';
+ $extend_css_suffix = 'css/extend_app/' . $fhcextension . $app . '.css';
+
+ foreach($this->extensions as $extension)
+ {
+ $extend_js = 'public/extensions/' . $extension . '/' . $extend_js_suffix;
+ $extend_css = 'public/extensions/' . $extension . '/' . $extend_css_suffix;
+
+ if(is_readable(FHCPATH . $extend_js))
+ {
+ array_push($this->extCustomJSModules, $extend_js);
+ }
+
+ if(is_readable(FHCPATH . $extend_css))
+ {
+ array_push($this->extCustomCSSs, $extend_css);
+ }
+ }
+ }
+ array_push($this->extCustomJSModules, $item);
+ }
+
+ if($this->appscount > 0)
+ {
+ $this->addFhcAppsJs();
+ }
+ }
+
+ protected function initExtCustomCSSs()
+ {
+ if(!isset($this->customCSSs))
+ {
+ $this->extCustomCSSs = array();
+ }
+ elseif(!is_array($this->customCSSs))
+ {
+ $this->extCustomCSSs = array($this->customCSSs);
+ }
+ else
+ {
+ $this->extCustomCSSs = $this->customCSSs;
+ }
+ }
+
+ protected function addFhcAppsJs()
+ {
+ if(!isset($this->customJSs))
+ {
+ $this->extCustomJSs = array();
+ }
+ elseif(!is_array($this->customJSs))
+ {
+ $this->extCustomJSs = array($this->customJSs);
+ }
+ else
+ {
+ $this->extCustomJSs = $this->customJSs;
+ }
+ array_push($this->extCustomJSs, 'public/js/FhcApps.js');
+ }
+}
+
diff --git a/application/libraries/DocsboxLib.php b/application/libraries/DocsboxLib.php
index f9167c379..184855ad8 100644
--- a/application/libraries/DocsboxLib.php
+++ b/application/libraries/DocsboxLib.php
@@ -180,7 +180,8 @@ class DocsboxLib
}
// Just started or still working on it
elseif ($getStatusResponse->body->status == self::STATUS_WORKING
- || $getStatusResponse->body->status == self::STATUS_STARTED)
+ || $getStatusResponse->body->status == self::STATUS_STARTED
+ || $getStatusResponse->body->status == self::STATUS_QUEUED)
{
// go on!
}
diff --git a/application/models/accounting/Vertrag_model.php b/application/models/accounting/Vertrag_model.php
index 4c036369b..97b5c72b6 100644
--- a/application/models/accounting/Vertrag_model.php
+++ b/application/models/accounting/Vertrag_model.php
@@ -490,6 +490,175 @@ class Vertrag_model extends DB_Model
return $bezeichnung;
}
+ /**
+ * Loads all Contracts of a Person
+ * @param $person_id
+ * @return array of objects
+ */
+ public function loadContractsOfPerson($person_id)
+ {
+ $query = "
+ SELECT
+ *,
+ tbl_vertrag.bezeichnung as bezeichnung,
+ tbl_vertragstyp.bezeichnung as vertragstyp_bezeichnung,
+ tbl_vertrag.vertragsdatum,
+ (SELECT bezeichnung FROM lehre.tbl_vertragsstatus
+ JOIN lehre.tbl_vertrag_vertragsstatus USING(vertragsstatus_kurzbz)
+ WHERE vertrag_id=tbl_vertrag.vertrag_id ORDER BY datum desc limit 1) as status, anmerkung,
+ CASE
+ WHEN EXISTS (
+ SELECT 1
+ FROM lehre.tbl_vertrag_vertragsstatus
+ WHERE vertrag_id = tbl_vertrag.vertrag_id
+ AND vertragsstatus_kurzbz = 'abgerechnet'
+ ) THEN true
+ ELSE false
+ END AS isAbgerechnet
+ FROM
+ lehre.tbl_vertrag
+ LEFT JOIN lehre.tbl_vertragstyp USING(vertragstyp_kurzbz)
+ WHERE person_id= ?";
+
+
+ return $this->execQuery($query, array($person_id));
+ }
+
+ /**
+ * Loads all Contracts of a Person that are not assigned yet
+ * @param $person_id
+ * @return array of objects
+ */
+ public function loadContractsOfPersonNotAssigned($person_id)
+ {
+ $query = "
+SELECT
+ 'Lehrauftrag' as type,
+ lehreinheit_id,
+ mitarbeiter_uid,
+ null as pruefung_id,
+ null as projektarbeit_id,
+ (tbl_lehreinheitmitarbeiter.semesterstunden*tbl_lehreinheitmitarbeiter.stundensatz) as betrag1,
+ tbl_lehreinheit.studiensemester_kurzbz,
+ null as betreuerart_kurzbz,
+ ( SELECT
+ upper(tbl_studiengang.typ || tbl_studiengang.kurzbz) || tbl_lehrveranstaltung.semester || '-' || tbl_lehrveranstaltung.kurzbz || '-' || tbl_lehreinheit.lehrform_kurzbz
+ FROM
+ lehre.tbl_lehrveranstaltung
+ JOIN public.tbl_studiengang USING(studiengang_kz)
+ WHERE
+ lehrveranstaltung_id=tbl_lehreinheit.lehrveranstaltung_id)
+ as bezeichnung
+ FROM
+ lehre.tbl_lehreinheitmitarbeiter
+ JOIN lehre.tbl_lehreinheit USING(lehreinheit_id)
+ WHERE
+ mitarbeiter_uid IN (SELECT uid FROM public.tbl_benutzer WHERE person_id=?)
+ AND vertrag_id IS NULL
+ UNION
+ SELECT
+ 'Betreuung' as type,
+ tbl_projektarbeit.lehreinheit_id as lehreinheit_id,
+ null as mitarbeiter_uid,
+ null::integer as pruefung_id,
+ projektarbeit_id,
+ (tbl_projektbetreuer.stunden*tbl_projektbetreuer.stundensatz) as betrag1,
+ tbl_lehreinheit.studiensemester_kurzbz,
+ tbl_projektbetreuer.betreuerart_kurzbz,
+ (SELECT nachname || ' ' || vorname FROM public.tbl_person JOIN public.tbl_benutzer USING(person_id) WHERE uid=tbl_projektarbeit.student_uid)
+ as bezeichnung
+ FROM
+ lehre.tbl_projektbetreuer
+ JOIN lehre.tbl_projektarbeit USING(projektarbeit_id)
+ JOIN lehre.tbl_lehreinheit USING(lehreinheit_id)
+ WHERE
+ tbl_projektbetreuer.person_id=?
+ AND vertrag_id IS NULL
+ ";
+
+ return $this->execQuery($query, array($person_id, $person_id));
+ }
+
+ /**
+ * Loads all Contracts of a Person that are assigned yet
+ * @param $person_id, $vertrag_id
+ * @return array of objects
+ */
+
+ public function loadContractsOfPersonAssigned($person_id, $vertrag_id)
+ {
+ $query = "
+ SELECT
+ 'Lehrauftrag' as type,
+ lehreinheit_id,
+ mitarbeiter_uid,
+ null as pruefung_id,
+ null as projektarbeit_id,
+ (tbl_lehreinheitmitarbeiter.semesterstunden * tbl_lehreinheitmitarbeiter.stundensatz) as betrag,
+ tbl_lehreinheit.studiensemester_kurzbz,
+ null as betreuerart_kurzbz,
+ ( SELECT
+ upper(tbl_studiengang.typ || tbl_studiengang.kurzbz) || tbl_lehrveranstaltung.semester || '-' || tbl_lehrveranstaltung.kurzbz || '-' || tbl_lehreinheit.lehrform_kurzbz
+ FROM
+ lehre.tbl_lehrveranstaltung
+ JOIN public.tbl_studiengang USING(studiengang_kz)
+ WHERE
+ lehrveranstaltung_id=tbl_lehreinheit.lehrveranstaltung_id)
+ as bezeichnung, vertrag_id
+ FROM
+ lehre.tbl_lehreinheitmitarbeiter
+ JOIN lehre.tbl_lehreinheit USING(lehreinheit_id)
+ WHERE
+ mitarbeiter_uid IN (SELECT uid FROM public.tbl_benutzer WHERE person_id=?)
+ AND vertrag_id = ?
+ UNION
+ SELECT
+ 'Betreuung' as type,
+ tbl_projektarbeit.lehreinheit_id as lehreinheit_id,
+ null as mitarbeiter_uid,
+ null::integer as pruefung_id,
+ projektarbeit_id,
+ (tbl_projektbetreuer.stunden * tbl_projektbetreuer.stundensatz) as betrag,
+ tbl_lehreinheit.studiensemester_kurzbz,
+ tbl_projektbetreuer.betreuerart_kurzbz,
+ (SELECT nachname || ' ' || vorname FROM public.tbl_person JOIN public.tbl_benutzer USING(person_id) WHERE uid=tbl_projektarbeit.student_uid)
+ as bezeichnung, vertrag_id
+ FROM
+ lehre.tbl_projektbetreuer
+ JOIN lehre.tbl_projektarbeit USING(projektarbeit_id)
+ JOIN lehre.tbl_lehreinheit USING(lehreinheit_id)
+ WHERE
+ tbl_projektbetreuer.person_id=?
+ AND vertrag_id = ?
+ ";
+
+ return $this->execQuery($query, array($person_id, $vertrag_id, $person_id, $vertrag_id));
+ }
+
+ /**
+ * Returns all stati of a contract
+ *
+ * @param $vertrag_id
+ * @return array
+ */
+ public function getStatiOfContract($vertrag_id)
+ {
+ $query = "
+ SELECT
+ *,
+ tbl_vertrag_vertragsstatus.datum,
+ tbl_vertrag_vertragsstatus.insertamum,
+ tbl_vertrag_vertragsstatus.updateamum
+ FROM
+ lehre.tbl_vertrag_vertragsstatus
+ JOIN lehre.tbl_vertragsstatus USING(vertragsstatus_kurzbz)
+ WHERE
+ tbl_vertrag_vertragsstatus.vertrag_id = ?
+ ORDER BY tbl_vertrag_vertragsstatus.datum DESC";
+
+ return $this->execQuery($query, array($vertrag_id));
+ }
+
private function _updateVertragRelevant($vertrag_id)
{
$this->LehreinheitmitarbeiterModel->update(
diff --git a/application/models/accounting/Vertragstyp_model.php b/application/models/accounting/Vertragstyp_model.php
index 42d248217..a3275af6e 100644
--- a/application/models/accounting/Vertragstyp_model.php
+++ b/application/models/accounting/Vertragstyp_model.php
@@ -11,4 +11,5 @@ class Vertragstyp_model extends DB_Model
$this->dbTable = 'lehre.tbl_vertragstyp';
$this->pk = 'vertragstyp_kurzbz';
}
+
}
diff --git a/application/models/accounting/Vertragvertragsstatus_model.php b/application/models/accounting/Vertragvertragsstatus_model.php
index 78a065540..75b0794cc 100644
--- a/application/models/accounting/Vertragvertragsstatus_model.php
+++ b/application/models/accounting/Vertragvertragsstatus_model.php
@@ -190,4 +190,6 @@ class Vertragvertragsstatus_model extends DB_Model
return $this->loadWhere($condition);
}
+
+
}
diff --git a/application/models/crm/Reihungstest_model.php b/application/models/crm/Reihungstest_model.php
index a685b01cd..efef0a8fa 100644
--- a/application/models/crm/Reihungstest_model.php
+++ b/application/models/crm/Reihungstest_model.php
@@ -10,7 +10,7 @@ class Reihungstest_model extends DB_Model
parent::__construct();
$this->dbTable = 'public.tbl_reihungstest';
$this->pk = 'reihungstest_id';
- }
+ }
/**
* Gets a test from a test id only if it is available
@@ -42,8 +42,8 @@ class Reihungstest_model extends DB_Model
/**
* Checks if there are active studyplans which have no public placement tests assigned yet.
* Only check assignment to studyplans that are
- * - Bachelor,
- * - active,
+ * - Bachelor,
+ * - active,
* - set as online application
* - valid for 1st terms
* @return array Returns object array with studyplans that have no public placement tests assigned yet.
@@ -97,7 +97,7 @@ class Reihungstest_model extends DB_Model
USING (reihungstest_id)
WHERE
datum >= now()
- AND
+ AND
oeffentlich = \'t\'
)
';
@@ -105,7 +105,7 @@ class Reihungstest_model extends DB_Model
return $this->execQuery($query);
}
- /**
+ /**
* Gets amount of free places.
* @return array Returns object array with faculty and amount of free places
* for each public actual placement test date.
@@ -432,10 +432,10 @@ class Reihungstest_model extends DB_Model
}
/**
- * Loads all applicants of a placement test
- * @param integer $reihungstest_id ID of placement test
- * @return array Returns object array with data of applicants.
- */
+ * Loads all applicants of a placement test
+ * @param integer $reihungstest_id ID of placement test
+ * @return array Returns object array with data of applicants.
+ */
public function getApplicantsOfPlacementTest($reihungstest_id)
{
$query = '
@@ -556,13 +556,22 @@ class Reihungstest_model extends DB_Model
* Calculates Result of Placement Test for a given Person and given placementtest
* and with taking account of weighting per area
*
- * @param $person_id ID of Person
- * @param $punkte if true result is points else result is percentage of sum
- * @param $reihungstest_id ID of Placementtest
- * @param $weightedArray array of weighting per area (gewicht per gebiet_id)
- * @return float result
+ * @param Number $person_id ID of Person
+ * @param Boolean $punkte if true result is points else result is percentage of sum
+ * @param Number $reihungstest_id ID of Placementtest
+ * @param Array $weightedArray array of weighting per area (gewicht per gebiet_id)
+ * @param Boolean $has_excluded_gebiete if true, areas in the configArray will be excluded
+ * @param Array $basis_gebiet_id_toString areas to exclude
+ * @return float result points of RT
*/
- public function getReihungstestErgebnisPerson($person_id, $punkte, $reihungstest_id, $weightedArray = null)
+ public function getReihungstestErgebnisPerson(
+ $person_id,
+ $punkte,
+ $reihungstest_id,
+ $weightedArray = null,
+ $has_excluded_gebiete = false,
+ $basis_gebiet_id_toString = null
+ )
{
$parametersArray = array($reihungstest_id);
@@ -577,6 +586,35 @@ class Reihungstest_model extends DB_Model
WHERE
reihungstest_id = ? ";
+ //areas of Studiengang
+ if (!empty($basis_gebiet_id_toString))
+ {
+ $qry .= "
+ AND
+ gebiet_id IN (". $basis_gebiet_id_toString. ")
+ ";
+ }
+
+ //areas to exclude
+ if($has_excluded_gebiete)
+ {
+ if (defined('FAS_REIHUNGSTEST_EXCLUDE_GEBIETE') && !empty(FAS_REIHUNGSTEST_EXCLUDE_GEBIETE))
+ {
+ $excluded_gebiete = unserialize(FAS_REIHUNGSTEST_EXCLUDE_GEBIETE);
+ $exclude_gebiet_id_arr = $excluded_gebiete;
+ if (is_array($exclude_gebiet_id_arr) && count($exclude_gebiet_id_arr) > 0)
+ {
+ $exclude_gebiet_id_toString = implode(', ', $exclude_gebiet_id_arr);
+ $qry .= "
+ AND
+ gebiet_id NOT IN (". $exclude_gebiet_id_toString. ")
+ -- AND
+ -- typ = 'b'
+ ";
+ }
+ }
+ }
+
//using prestudent Status to avoid to get the sum of more than 1 placement tests
$qry .= "
AND prestudent_id = (
diff --git a/application/models/education/Paabgabe_model.php b/application/models/education/Paabgabe_model.php
index a883043d3..be42b7660 100644
--- a/application/models/education/Paabgabe_model.php
+++ b/application/models/education/Paabgabe_model.php
@@ -86,27 +86,38 @@ class Paabgabe_model extends DB_Model
return $this->execQuery($query, [$interval, $interval, $relevantTypes]);
}
- 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,
- public.tbl_person.anrede, public.tbl_person.titelpre, public.tbl_person.vorname, public.tbl_person.nachname, public.tbl_person.titelpost
+ public function findAbgabenNewOrUpdatedSinceByAbgabedatum($interval, $relevantTypes = null) {
+
+ $queryParams = [$interval];
+ $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, public.tbl_studiengang.studiengang_kz,
+ public.tbl_studiengang.oe_kurzbz as stg_oe_kurzbz, tbl_lehreinheit.studiensemester_kurzbz,
+ lehre.tbl_projektbetreuer.betreuerart_kurzbz, lehre.tbl_projektbetreuer.person_id,
+ 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_projektbetreuer USING (projektarbeit_id)
- JOIN public.tbl_benutzer ON (public.tbl_benutzer.uid = student_uid)
- JOIN public.tbl_person ON (public.tbl_benutzer.person_id = public.tbl_person.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)
+ 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_benutzer ON (public.tbl_benutzer.uid = student_uid)
+ JOIN public.tbl_person ON (public.tbl_benutzer.person_id = public.tbl_person.person_id)
WHERE campus.tbl_paabgabe.abgabedatum IS NOT NULL
- AND campus.tbl_paabgabe.abgabedatum >= NOW() - INTERVAL ?
- ORDER BY abgabedatum DESC
- ";
+ AND campus.tbl_paabgabe.abgabedatum >= NOW() - INTERVAL ?";
+
+ if($relevantTypes !== null) {
+ $query .= " AND campus.tbl_paabgabe.paabgabetyp_kurzbz IN ?";
+ $queryParams[]= $relevantTypes;
+ }
- return $this->execQuery($query, [$interval]);
+ $query .= " ORDER BY abgabedatum DESC";
+
+ return $this->execQuery($query, $queryParams);
}
public function loadByIDs($paabgabe_ids) {
diff --git a/application/models/education/Projektarbeit_model.php b/application/models/education/Projektarbeit_model.php
index 5e453056d..3b1ea55e5 100644
--- a/application/models/education/Projektarbeit_model.php
+++ b/application/models/education/Projektarbeit_model.php
@@ -354,8 +354,10 @@ class Projektarbeit_model extends DB_Model
student_person.nachname as student_nachname,
tbl_student.matrikelnr, tbl_lehreinheit.studiensemester_kurzbz,
betreuer_benutzer.uid as betreuer_benutzer_uid,
+ betreuer_person.titelpre as betreuer_titelpre,
betreuer_person.vorname as betreuer_vorname,
betreuer_person.nachname as betreuer_nachname,
+ betreuer_person.titelpost as betreuer_titelpost,
lehre.tbl_projektbetreuer.betreuerart_kurzbz as betreuerart,
lehre.tbl_projektbetreuer.person_id as betreuer_person_id,
lehre.tbl_projektarbeit.sprache as sprache,
@@ -415,6 +417,50 @@ class Projektarbeit_model extends DB_Model
LIMIT 1
)
as zweitbetreuer_full_name,
+ (
+ SELECT titelpre
+ 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 projektarbeit_id = tbl_projektarbeit.projektarbeit_id
+ AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied')
+ LIMIT 1
+ )
+ as zweitbetreuer_titelpre,
+ (
+ SELECT vorname
+ 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 projektarbeit_id = tbl_projektarbeit.projektarbeit_id
+ AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied')
+ LIMIT 1
+ )
+ as zweitbetreuer_vorname,
+ (
+ SELECT nachname
+ 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 projektarbeit_id = tbl_projektarbeit.projektarbeit_id
+ AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied')
+ LIMIT 1
+ )
+ as zweitbetreuer_nachname,
+ (
+ SELECT titelpost
+ 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 projektarbeit_id = tbl_projektarbeit.projektarbeit_id
+ AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied')
+ LIMIT 1
+ )
+ as zweitbetreuer_titelpost,
(
SELECT
COALESCE(tbl_studienplan.orgform_kurzbz,
diff --git a/application/models/ressource/Mitarbeiter_model.php b/application/models/ressource/Mitarbeiter_model.php
index a650643f1..d8bbd7d63 100644
--- a/application/models/ressource/Mitarbeiter_model.php
+++ b/application/models/ressource/Mitarbeiter_model.php
@@ -209,7 +209,7 @@ class Mitarbeiter_model extends DB_Model
{
$qry = "
SELECT
- titelpre, vorname, nachname, titelpost, foto, foto_sperre, person_id, alias, telefonklappe
+ titelpre, vorname, nachname, titelpost, foto, foto_sperre, person_id, alias, telefonklappe, personalnummer, mitarbeiter_uid
FROM
public.tbl_person
JOIN public.tbl_benutzer b USING(person_id)
@@ -363,14 +363,14 @@ class Mitarbeiter_model extends DB_Model
$returnwert .= ", ma.mitarbeiter_uid, CONCAT(p.nachname, ' ', p.vorname, ' (', ma.mitarbeiter_uid , ')') as mitarbeiter";
$qry = "
- SELECT " . $returnwert . "
- FROM
+ SELECT " . $returnwert . "
+ FROM
public.tbl_mitarbeiter ma
- JOIN
+ JOIN
public.tbl_benutzer b on (ma.mitarbeiter_uid = b.uid)
- JOIN
+ JOIN
public.tbl_person p on (p.person_id = b.person_id)
- WHERE
+ WHERE
lower (p.nachname) LIKE '%". $this->db->escape_like_str($filter)."%'
OR
lower (p.vorname) LIKE '%". $this->db->escape_like_str($filter)."%'
@@ -393,14 +393,14 @@ class Mitarbeiter_model extends DB_Model
public function getMitarbeiterFromLV($lehrveranstaltung_id)
{
$qry = "SELECT DISTINCT
- lehrveranstaltung_id, uid, vorname, wahlname, vornamen, nachname, titelpre, titelpost, kurzbz, mitarbeiter_uid
- FROM
+ lehrveranstaltung_id, uid, vorname, wahlname, vornamen, nachname, titelpre, titelpost, kurzbz, mitarbeiter_uid
+ FROM
lehre.tbl_lehreinheitmitarbeiter, campus.vw_mitarbeiter, lehre.tbl_lehreinheit
- WHERE
+ WHERE
lehrveranstaltung_id= ?
- AND
- mitarbeiter_uid=uid
- AND
+ AND
+ mitarbeiter_uid=uid
+ AND
tbl_lehreinheitmitarbeiter.lehreinheit_id=tbl_lehreinheit.lehreinheit_id;";
$parametersArray = array($lehrveranstaltung_id);
diff --git a/application/models/system/Message_model.php b/application/models/system/Message_model.php
index 19129b606..3e59d7250 100644
--- a/application/models/system/Message_model.php
+++ b/application/models/system/Message_model.php
@@ -276,6 +276,8 @@ class Message_model extends DB_Model
s.message_id, s.person_id, MAX(s.insertamum) as lastinserted
from
public.tbl_msg_status s
+ join
+ filtered_messages fm on fm.message_id = s.message_id and fm.recipient_id = s.person_id
group by
s.message_id, s.person_id
) ls
diff --git a/application/phrases/abgabetool.php b/application/phrases/abgabetool.php
index 24836444f..2b4a93dec 100644
--- a/application/phrases/abgabetool.php
+++ b/application/phrases/abgabetool.php
@@ -3991,4 +3991,604 @@ array (
),
),
)
+,
+array (
+ 'app' => 'core',
+ 'category' => 'abgabetool',
+ 'phrase' => 'c4betreuerv2',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'BetreuerIn',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'Reviewer',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'core',
+ 'category' => 'abgabetool',
+ 'phrase' => 'c4zieldatumv2',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'Zieldatum',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'Deadline',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'core',
+ 'category' => 'abgabetool',
+ 'phrase' => 'c4abgabekurzbzv2',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'Kurzbeschreibung der Abgabe',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'Short description of the submitted document',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'core',
+ 'category' => 'abgabetool',
+ 'phrase' => 'c4betreuerartv2',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'Betreuerart',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'Reviewer type',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'core',
+ 'category' => 'abgabetool',
+ 'phrase' => 'c4betreuerEmailKontaktv2',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'E-Mail BetreuerIn',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'Email Reviewer',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'core',
+ 'category' => 'abgabetool',
+ 'phrase' => 'c4downloadBeurteilungErstbetreuerv2',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'ErstbetreuerIn Beurteilung herunterladen',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'Download evaluation of first reviewer',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'core',
+ 'category' => 'abgabetool',
+ 'phrase' => 'c4downloadBeurteilungZweitbetreuerv2',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'ZweitbetreuerIn Beurteilung herunterladen',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'Download evaluation of second reviewer',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'core',
+ 'category' => 'abgabetool',
+ 'phrase' => 'c4downloadLatestAbgabe',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'Zuletzt getätigte Abgabe herunterladen',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'Download latest uploaded File',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'core',
+ 'category' => 'abgabetool',
+ 'phrase' => 'c4termineTimeLine',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'Zeitstrahl Termine',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'Timeline Deadlines',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'core',
+ 'category' => 'abgabetool',
+ 'phrase' => 'c4erstbetreuerv2',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'ErstbetreuerIn',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'First Reviewer',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'core',
+ 'category' => 'abgabetool',
+ 'phrase' => 'c4zweitbetreuerv2',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'ZweitbetreuerIn',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'Second Reviewer',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'core',
+ 'category' => 'abgabetool',
+ 'phrase' => 'c4sendEmailBetreuerv3',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'Email an {0} Betreuende schicken',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'Send Email to {0} reviewers',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'core',
+ 'category' => 'abgabetool',
+ 'phrase' => 'c4fehlerMailBegutachterv2',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'Fehler beim Versenden des Mails an den Erstbegutachter!',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'Error sending E-Mail to first Reviewer!',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'core',
+ 'category' => 'abgabetool',
+ 'phrase' => 'c4fehlerMailZweitBegutachterv2',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'Fehler beim Versenden des Mails an den Zweitbegutachter!',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'Error sending E-Mail to second Reviewer!',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'core',
+ 'category' => 'abgabetool',
+ 'phrase' => 'c4deadlineExceeded',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'Nicht rechtzeitig abgegeben!',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'Deadline exceeded!',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'core',
+ 'category' => 'abgabetool',
+ 'phrase' => 'c4missingSignatureNotification',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'Abgabetool: Fehlende Signatur bei Endupload',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'Submission tool: Missing signature at final upload',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'core',
+ 'category' => 'abgabetool',
+ 'phrase' => 'c4erstbetreuerTitelPre',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'ErstbetreuerIn Titel Pre',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'First Reviewer Title Pre',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'core',
+ 'category' => 'abgabetool',
+ 'phrase' => 'c4erstbetreuerVorname',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'ErstbetreuerIn Vorname',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'First Reviewer First Name',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'core',
+ 'category' => 'abgabetool',
+ 'phrase' => 'c4erstbetreuerNachname',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'ErstbetreuerIn Nachname',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'First Reviewer Last Name',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'core',
+ 'category' => 'abgabetool',
+ 'phrase' => 'c4erstbetreuerTitelPost',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'ErstbetreuerIn Titel Post',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'First Reviewer Title Post',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'core',
+ 'category' => 'abgabetool',
+ 'phrase' => 'c4zweitbetreuerTitelPre',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'ZweitbetreuerIn Titel Pre',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'Second Reviewer Title Pre',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'core',
+ 'category' => 'abgabetool',
+ 'phrase' => 'c4zweitbetreuerVorname',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'ZweitbetreuerIn Vorname',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'Second Reviewer First Name',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'core',
+ 'category' => 'abgabetool',
+ 'phrase' => 'c4zweitbetreuerNachname',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'ZweitbetreuerIn Nachname',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'Second Reviewer Last Name',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'core',
+ 'category' => 'abgabetool',
+ 'phrase' => 'c4zweitbetreuerTitelPost',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'ZweitbetreuerIn Titel Post',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'Second Reviewer Title Post',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'core',
+ 'category' => 'abgabetool',
+ 'phrase' => 'c4noZuordnungBetreuerStudent',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'Keine Zuordnung oder Berechtigung für die Projektarbeit gefunden!',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'No assignment or authorization found for the project!',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
);
diff --git a/application/phrases/filter.php b/application/phrases/filter.php
index a2184f993..3ec07df71 100644
--- a/application/phrases/filter.php
+++ b/application/phrases/filter.php
@@ -103,5 +103,53 @@ $phrases = array(
)
)
)
+,
+array (
+ 'app' => 'core',
+ 'category' => 'filter',
+ 'phrase' => 'filterDelete',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'Filter zurücksetzen',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'delete filter',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'core',
+ 'category' => 'filter',
+ 'phrase' => 'filterActive',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'Filter aktiv',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'filter active',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
);
diff --git a/application/phrases/header.php b/application/phrases/header.php
new file mode 100644
index 000000000..c1349187b
--- /dev/null
+++ b/application/phrases/header.php
@@ -0,0 +1,75 @@
+ 'core',
+ 'category' => 'header',
+ 'phrase' => 'error_fotoupload',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'Fehler beim Speichern des Fotos',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'Error saving photo',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'core',
+ 'category' => 'header',
+ 'phrase' => 'alert_chooseFoto',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'Bitte zuerst ein Bild auswählen!',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'Please select an image first!',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'core',
+ 'category' => 'header',
+ 'phrase' => 'error_noPhoto',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'Kein Bild empfangen',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'No picture received',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+);
\ No newline at end of file
diff --git a/application/phrases/stv.php b/application/phrases/stv.php
index d6545c590..9c6646062 100644
--- a/application/phrases/stv.php
+++ b/application/phrases/stv.php
@@ -2616,4 +2616,28 @@ array (
),
),
)
+,
+array (
+ 'app' => 'core',
+ 'category' => 'stv',
+ 'phrase' => 'error_noLehrverbandAssigned',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'StudentIn ist in diesem Semester keinem Lehrverband zugeteilt',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'Student has no assignment to any teaching association',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
);
diff --git a/application/phrases/ui.php b/application/phrases/ui.php
index 1484e63da..20bcb2ca5 100644
--- a/application/phrases/ui.php
+++ b/application/phrases/ui.php
@@ -5049,5 +5049,297 @@ array (
),
),
)
+,
+array (
+ 'app' => 'pep',
+ 'category' => 'ui',
+ 'phrase' => 'geplZeitraum',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'geplanter Zeitraum',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'planned Period',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'pep',
+ 'category' => 'ui',
+ 'phrase' => 'bitteAuswaehlen',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'Bitte auswählen...',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'Please select...',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'pep',
+ 'category' => 'ui',
+ 'phrase' => 'hinweisLehrende',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'Hinweis für Lehrende',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'Note for Lecturers',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'pep',
+ 'category' => 'ui',
+ 'phrase' => 'lehreinheiten',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'Lehreinheiten',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'Teaching Units',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'pep',
+ 'category' => 'ui',
+ 'phrase' => 'lead',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'Leitung',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'Lead',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'pep',
+ 'category' => 'ui',
+ 'phrase' => 'teamlead',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'Team / Leitung',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'Team / Lead',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'pep',
+ 'category' => 'ui',
+ 'phrase' => 'ausblick_lvplanung',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'Ausblick auf Ihre mögliche LV-Planung',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'Preview of Your Potential Course Planning',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'pep',
+ 'category' => 'ui',
+ 'phrase' => 'detailselfoverview',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'Achtung: die vorliegenden Informationen stellen eine Vorabplanung dar und sind als Anfrage an Sie gedacht.
+ Die Beauftragung der tatsächlichen Lehrveranstaltungen erfolgt durch Ihre Kompetenzfeldleitung.
+ Ihre aktuell gültigen Lehraufträge und den LV Plan des aktuellen Semesters (Termine) finden Sie wie gewohnt unter „mein CIS“ -> „LV-Plan Hauptmenü“ bzw. „Lehrauftragsverwaltung“.',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'Please note: The information provided represents a preliminary planning and is intended as an inquiry to you.
+ The official assignment of the actual courses will be carried out by your Competence Field Manager.
+ Your currently valid teaching assignments and the course schedule for the current semester (dates) can be found as usual under “My CIS” → “Schedule Main Menu” or “Teaching Assignment Administration”',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'core',
+ 'category' => 'ui',
+ 'phrase' => 'error_typeNotizIdIncorrect',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'Id-Typ der Notiz ist nicht korrekt',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'Id type of note is incorrect',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'core',
+ 'category' => 'ui',
+ 'phrase' => 'error_fieldNotValidDate',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'Das Eingabefeld {field} hat kein gültiges Datumsformat',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'The input field {field} does not have a valid date format',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'core',
+ 'category' => 'ui',
+ 'phrase' => 'vertrag_id',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'Vertrag ID',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'Contract ID',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'core',
+ 'category' => 'ui',
+ 'phrase' => 'successFotoUpload',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'Foto erfolgreich hochgeladen',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'Photoupload successful',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
);
diff --git a/application/phrases/vertrag.php b/application/phrases/vertrag.php
new file mode 100644
index 000000000..a5b6cc87b
--- /dev/null
+++ b/application/phrases/vertrag.php
@@ -0,0 +1,699 @@
+ 'core',
+ 'category' => 'vertrag',
+ 'phrase' => 'addVertrag',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'Neuen Vertrag erstellen',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'Add new contract',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'core',
+ 'category' => 'vertrag',
+ 'phrase' => 'editVertrag',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'Vertrag bearbeiten',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'Edit contract',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'core',
+ 'category' => 'vertrag',
+ 'phrase' => 'deleteVertrag',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'Vertrag löschen',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'Delete contract',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'core',
+ 'category' => 'vertrag',
+ 'phrase' => 'addStatus',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'Vertragstatus hinzufügen',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'Add contract status',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'core',
+ 'category' => 'vertrag',
+ 'phrase' => 'editStatus',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'Vertragstatus bearbeiten',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'Edit contract status',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'core',
+ 'category' => 'vertrag',
+ 'phrase' => 'deleteStatus',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'Vertragstatus löschen',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'Delete contract status',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'core',
+ 'category' => 'vertrag',
+ 'phrase' => 'deleteLehrauftrag',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'Lehrauftrag löschen',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'Delete teaching assignment',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'core',
+ 'category' => 'vertrag',
+ 'phrase' => 'datum_vertrag',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'Vertragsdatum',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'contract date',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'core',
+ 'category' => 'vertrag',
+ 'phrase' => 'vertrag_urfassung',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'Vertrags-Urfassung',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'original version of the contract',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'core',
+ 'category' => 'vertrag',
+ 'phrase' => 'filter_offeneVertraege',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'Nur offene Verträge anzeigen',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'Show only open contracts',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'core',
+ 'category' => 'vertrag',
+ 'phrase' => 'error_addOrUpdateLehrauftraege',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'Fehler beim Hinzufügen bzw. Aktualisieren von Lehraufträgen',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'Error while adding or updating teaching assignments',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'core',
+ 'category' => 'vertrag',
+ 'phrase' => 'error_insertOrUpdateStatusVertrag',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'Fehler beim Hinzufügen bzw. Aktualisieren des Vertragsstatus',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'Error while adding or updating the contract status',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'core',
+ 'category' => 'vertrag',
+ 'phrase' => 'error_statusVorhanden',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'Status bereits vorhanden',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'Status already existing',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'core',
+ 'category' => 'vertrag',
+ 'phrase' => 'vertragErstellen',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'Vertrag erstellen',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'Create contract',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'core',
+ 'category' => 'vertrag',
+ 'phrase' => 'vertragDetails',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'Vertragdetails',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'Contract Details',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'core',
+ 'category' => 'vertrag',
+ 'phrase' => 'text_explainLehrauftrag',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'Die folgenden Lehraufträge sind noch keinem Vertrag zugeordnet. Markieren Sie die Lehraufträge um diese dem Vertrag zuzuordnen:',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'The following teaching assignments have not yet been assigned to a contract. Mark the teaching assignments to assign them to the contract:',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'core',
+ 'category' => 'vertrag',
+ 'phrase' => 'text_addLehrauftrag',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'Folgende Lehraufträge werden hinzugefügt:',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'The following teaching assignments will be added:',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'core',
+ 'category' => 'vertrag',
+ 'phrase' => 'vertragsverwaltung',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'Vertragsverwaltung',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'Contract management',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'core',
+ 'category' => 'vertrag',
+ 'phrase' => 'nurAktiveMaAnzeigen',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'Nur aktive Mitarbeiter:innen anzeigen',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'Show only active employees',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'core',
+ 'category' => 'vertrag',
+ 'phrase' => 'printHonorarvertrag',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'Honorarvertrag drucken',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'Print fee agreement',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'core',
+ 'category' => 'vertrag',
+ 'phrase' => 'alertMindestensZweiVertraege',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'Bitte mindestens 2 Verträge auswählen!',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'Please select at least 2 contracts!',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'core',
+ 'category' => 'vertrag',
+ 'phrase' => 'alertOnlyApprovedContracts',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'Alle Verträge müssen genehmigt sein.',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'All contracts must be approved.',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'core',
+ 'category' => 'vertrag',
+ 'phrase' => 'vertragsarten',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'Vertragsarten',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'Types of Contracts',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'core',
+ 'category' => 'vertrag',
+ 'phrase' => 'idsDienstverhaeltnisse',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'IDs Dienstverhältnis',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'IDs employment relationship',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'core',
+ 'category' => 'vertrag',
+ 'phrase' => 'vertragstyp',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'Vertragstyp',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'Contract Type',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'core',
+ 'category' => 'vertrag',
+ 'phrase' => 'vertragsdatum_iso',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'Vertragsdatum Iso',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'Contract Date Iso',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'core',
+ 'category' => 'vertrag',
+ 'phrase' => 'vertragsstunden',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'Vertragsstunden',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'Contract hours',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'core',
+ 'category' => 'vertrag',
+ 'phrase' => 'vertragsstunden_studiensemester',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'vertragsstunden Studiensemester',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'Contract hours study semester',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+,
+array (
+ 'app' => 'core',
+ 'category' => 'vertrag',
+ 'phrase' => 'abgerechnet',
+ 'insertvon' => 'system',
+ 'phrases' =>
+ array (
+ 0 =>
+ array (
+ 'sprache' => 'German',
+ 'text' => 'abgerechnet',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ 1 =>
+ array (
+ 'sprache' => 'English',
+ 'text' => 'billed',
+ 'description' => '',
+ 'insertvon' => 'system',
+ ),
+ ),
+)
+);
\ No newline at end of file
diff --git a/application/views/Cis/LvInfo.php b/application/views/Cis/LvInfo.php
deleted file mode 100644
index 49a7b7a85..000000000
--- a/application/views/Cis/LvInfo.php
+++ /dev/null
@@ -1,15 +0,0 @@
- 'LvInfo',
- 'customJSModules' => ['public/js/apps/Cis/LvInfo.js']
-);
-
-$this->load->view('templates/CISVUE-Header', $includesArray);
-?>
-
-
-
-
-
-
-load->view('templates/CISVUE-Footer', $includesArray); ?>
diff --git a/application/views/Cis/Profil.php b/application/views/Cis/Profil.php
deleted file mode 100644
index f66ebf8a9..000000000
--- a/application/views/Cis/Profil.php
+++ /dev/null
@@ -1,18 +0,0 @@
- 'Profil',
- 'customJSModules' => ['public/js/apps/Cis/Profil.js'],
- 'tabulator5' => true,
- 'primevue3' => true,
- 'customCSSs' => ['public/css/components/calendar.css', 'public/css/components/FilterComponent.css','public/css/components/Profil.css','public/css/components/FormUnderline.css'],
-
-);
-
-$this->load->view('templates/CISVUE-Header', $includesArray);
-?>
-
-
-
-
-
-load->view('templates/CISVUE-Footer', $includesArray); ?>
diff --git a/application/views/Studentenverwaltung.php b/application/views/Studentenverwaltung.php
index 1cd28d735..8dd2dd93d 100644
--- a/application/views/Studentenverwaltung.php
+++ b/application/views/Studentenverwaltung.php
@@ -7,19 +7,21 @@
'vue3' => true,
'primevue3' => true,
#'filtercomponent' => true,
- 'tabulator5' => true,
+ 'tabulator6' => true,
'tinymce5' => true,
'phrases' => array(
'global',
'ui',
'notiz',
),
+ 'tags' => true,
'customCSSs' => [
#datepicker fuer component functions
'public/css/components/vue-datepicker.css',
'public/css/components/primevue.css',
'public/css/Studentenverwaltung.css',
- 'public/css/components/function.css'
+ 'public/css/components/function.css',
+ 'public/css/components/Detailheader.css'
],
'customJSs' => [
'vendor/vuejs/vuedatepicker_js/vue-datepicker.iife.js',
@@ -45,6 +47,8 @@ $configArray = [
'showAufnahmegruppen' => !defined('FAS_REIHUNGSTEST_AUFNAHMEGRUPPEN') ? false : FAS_REIHUNGSTEST_AUFNAHMEGRUPPEN,
'allowUebernahmePunkte' => !defined('FAS_REIHUNGSTEST_PUNKTEUEBERNAHME') ? true : FAS_REIHUNGSTEST_PUNKTEUEBERNAHME,
'useReihungstestPunkte' => !defined('FAS_REIHUNGSTEST_PUNKTE') ? true : FAS_REIHUNGSTEST_PUNKTE,
+ 'hasExcludedAreas' => defined('FAS_REIHUNGSTEST_EXCLUDE_GEBIETE') && !empty(FAS_REIHUNGSTEST_EXCLUDE_GEBIETE),
+ 'stvTagsEnabled' => defined('STV_TAGS_ENABLED') ? STV_TAGS_ENABLED : false,
];
?>
diff --git a/application/views/Vertragsverwaltung.php b/application/views/Vertragsverwaltung.php
new file mode 100644
index 000000000..8fa6dff27
--- /dev/null
+++ b/application/views/Vertragsverwaltung.php
@@ -0,0 +1,50 @@
+ 'Vertragsverwaltung',
+ 'axios027' => true,
+ 'bootstrap5' => true,
+ 'fontawesome6' => true,
+ 'vue3' => true,
+ 'primevue3' => true,
+ 'filtercomponent' => true,
+ 'navigationcomponent' => true,
+ 'tabulator6' => true,
+ 'tinymce5' => true,
+ 'phrases' => array(
+ 'global',
+ 'ui',
+ ),
+ 'customCSSs' => [
+ 'public/css/components/vue-datepicker.css',
+ 'public/css/components/primevue.css',
+ 'public/css/Vertragsverwaltung.css',
+ 'public/css/components/Detailheader.css'
+ ],
+ 'customJSs' => [
+ #'vendor/npm-asset/primevue/tree/tree.min.js',
+ #'vendor/npm-asset/primevue/toast/toast.min.js'
+ ],
+ 'customJSModules' => [
+ 'public/js/apps/Vertragsverwaltung.js'
+ ]
+);
+
+$this->load->view('templates/FHC-Header', $includesArray);
+?>
+
+ !defined('DOMAIN') ? 'notDefined' : DOMAIN,
+];
+?>
+
+
+
+
+
+
+load->view('templates/FHC-Footer', $includesArray); ?>
+
diff --git a/application/views/templates/FHC-Footer.php b/application/views/templates/FHC-Footer.php
index c816ebf2e..d2eb229f1 100644
--- a/application/views/templates/FHC-Footer.php
+++ b/application/views/templates/FHC-Footer.php
@@ -17,6 +17,7 @@
$use_vuejs_dev_version = $this->config->item('use_vuejs_dev_version');
// By default set the parameters to null
+ $customCSSs = isset($customCSSs) ? $customCSSs : null;
$customJSs = isset($customJSs) ? $customJSs : null;
$customJSModules = isset($customJSModules) ? $customJSModules : null;
@@ -191,12 +192,13 @@
// NOTE: keep it as the last but one
if ($addons === true) generateAddonsJSsInclude($calledPath.'/'.$calledMethod);
-
-
+ $extapphelper = ExtendableAppsHelper::getInstance();
+ $extapphelper->init($customCSSs, $customJSs, $customJSModules);
+
// Eventually required JS
// NOTE: keep it as the latest
- generateJSsInclude($customJSs);
- generateJSModulesInclude($customJSModules);
+ generateJSsInclude($extapphelper->getCustomJSs());
+ generateJSModulesInclude($extapphelper->getCustomJSModules());
?>