diff --git a/application/config/abgabe.php b/application/config/abgabe.php
new file mode 100644
index 000000000..82782b043
--- /dev/null
+++ b/application/config/abgabe.php
@@ -0,0 +1,43 @@
+ cis4
+$config['URL_STUDENTS'] = 'cis.php/Cis/Abgabetool/Student';
+// used as APP_ROOT.URL_MITARBEITER -> old cis
+$config['URL_MITARBEITER'] = 'index.ci.php/Cis/Abgabetool/Mitarbeiter';
+// used as APP_ROOT.URL_MITARBEITER -> old cis
+$config['URL_ASSISTENZ'] = 'index.ci.php/Cis/Abgabetool/Assistenz';
+
+// lehre.tbl_paabgabetyp bezeichnung
+//$config['ALLOWED_ABGABETYPEN_BETREUER'] = ['Zwischenabgabe', 'Quality Gate 1', 'Quality Gate 2'];
+$config['ALLOWED_ABGABETYPEN_BETREUER'] = ['abstract','zwischen', 'qualgate1', 'qualgate2']; // tbl_paabgabetyp pk
+// paabgabetypen for which betreuer is benachrichtigt via sammelmail
+$config['RELEVANT_PAABGABETYPEN_SAMMELMAIL_BETREUER'] = ['qualgate1', 'qualgate2', 'end'];
+// paabgabetypen for which assistenz is benachrichtigt via sammelmail
+$config['RELEVANT_PAABGABETYPEN_SAMMELMAIL_ASSISTENZ'] = ['end'];
+// paabgabetypen for which student is benachrichtigt via sammelmail -> basically all of them but still defined for consistency
+$config['RELEVANT_PAABGABETYPEN_SAMMELMAIL_STUDENT'] = ['qualgate1', 'qualgate2', 'zwischen', 'note', 'abstract', 'end', 'enda'];
+//$config['ALLOWED_NOTEN_ABGABETOOL'] = ['Bestanden', 'Nicht bestanden'];
+$config['ALLOWED_NOTEN_ABGABETOOL'] = [10, 14]; // tbl_note pk
+// benotete projektarbeiten sperren weitere terminanlage & bearbeitung, diese noten sind ausnahmen dieser Regel
+// wie zB "Nicht beurteilt" & "Noch nicht eingetragen"
+$config['NONFINAL_NOTEN_ABGABETOOL'] = [9];
+$config['beurteilung_link_fallback'] = 'addons/fhtw/content/projektbeurteilung/projektbeurteilungDocumentExport.php?projektarbeit_id=?&betreuerart_kurzbz=?&person_id=?';
+
+$config['PROJEKTARBEITSBEURTEILUNG_MAIL_BASELINK_ERSTBEGUTACHTER'] = 'index.ci.php/extensions/FHC-Core-Projektarbeitsbeurteilung/ProjektarbeitsbeurteilungErstbegutachter';
+$config['PROJEKTARBEITSBEURTEILUNG_MAIL_BASELINK_ZWEITBEGUTACHTER'] = 'index.ci.php/extensions/FHC-Core-Projektarbeitsbeurteilung/ProjektarbeitsbeurteilungErstbegutachter';
+
+$config['SIGNATUR_CHECK_PAABGABETYPEN'] = ['end'];
+
+// to be used as "https://moodle.technikum-wien.at/course/view.php?idnumber=dl{$stg_kz}" for stg specific moodle routing
+$config['STG_MOODLE_LINK'] = 'https://moodle.technikum-wien.at/course/view.php?idnumber=dl';
+
+$config['ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT'] = true;
+$config['ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER'] = true;
diff --git a/application/config/cis.php b/application/config/cis.php
index 8d3bc347e..430539392 100644
--- a/application/config/cis.php
+++ b/application/config/cis.php
@@ -4,7 +4,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed');
// CMS Content Id for CIS4 Menu Root
-$config['cis_menu_root_content_id'] = 11087;
+$config['cis_menu_root_content_id'] = 11091;
// send Mails for ProfilUpdate
$config['cis_send_profil_update_mails'] = true;
// Vilesci CI BaseUrl
diff --git a/application/config/routes.php b/application/config/routes.php
index 3ed3c8323..475168141 100644
--- a/application/config/routes.php
+++ b/application/config/routes.php
@@ -68,6 +68,13 @@ $route['Cis/MyLv/.*'] = 'Cis/MyLv/index/$1';
$route['Cis/StgOrgLvPlan/.*'] = 'Cis/StgOrgLvPlan/index/$1';
$route['Cis/OverviewLvPlan/.*'] = 'Cis/OverviewLvPlan/index/$1';
+$route['Abgabetool/Assistenz'] = 'Cis/Abgabetool/Assistenz';
+$route['Abgabetool/Assistenz/(:any)'] = 'Cis/Abgabetool/Assistenz/$1';
+$route['Abgabetool/Mitarbeiter'] = 'Cis/Abgabetool/Mitarbeiter';
+$route['Abgabetool/Student'] = 'Cis/Abgabetool/Student';
+$route['Abgabetool/Student/(:any)'] = 'Cis/Abgabetool/Student/$1';
+$route['Abgabetool/Deadlines'] = 'Cis/Abgabetool/Deadlines';
+
// Studierendenverwaltung List Routes
$route['api/frontend/v1/stv/[sS]tudents/inout'] = 'api/frontend/v1/stv/Students/index';
$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})'] = 'api/frontend/v1/stv/Students/index';
diff --git a/application/controllers/Cis/Abgabetool.php b/application/controllers/Cis/Abgabetool.php
index 1895f7472..04338b1a9 100644
--- a/application/controllers/Cis/Abgabetool.php
+++ b/application/controllers/Cis/Abgabetool.php
@@ -14,10 +14,10 @@ class Abgabetool extends Auth_Controller
{
parent::__construct([
'index' => self::PERM_LOGGED,
- 'getStudentProjektarbeitAbgabeFile' => self::PERM_LOGGED,
- 'Mitarbeiter' => self::PERM_LOGGED,
- 'Student' => self::PERM_LOGGED,
- 'Deadlines' => self::PERM_LOGGED
+ 'Mitarbeiter' => array('basis/abgabe_lektor:rw', 'basis/abgabe_assistenz:rw'),
+ 'Assistenz' => array('basis/abgabe_assistenz:rw'),
+ 'Student' => array('basis/abgabe_student:rw', 'basis/abgabe_lektor:rw', 'basis/abgabe_assistenz:rw'),
+ 'Deadlines' => array('basis/abgabe_lektor:rw', 'basis/abgabe_assistenz:rw')
]);
}
@@ -29,80 +29,69 @@ class Abgabetool extends Auth_Controller
*/
public function index()
{
+ // TODO: routing from index based on berechtigung?
$viewData = array(
'uid'=>getAuthUID(),
);
- $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'Abgabetool']);
+ if(defined('CIS4') && CIS4) {
+ $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'Abgabetool']);
+ } else {
+ $this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'Abgabetool']);
+ }
}
- public function Student()
+ public function Student($student_uid_prop = '')
{
-
$viewData = array(
'uid'=>getAuthUID(),
);
-
- $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'AbgabetoolStudent']);
+
+ if(defined('CIS4') && CIS4) {
+ $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'AbgabetoolStudent']);
+ } else {
+ $this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'AbgabetoolStudent', 'student_uid_prop' => $student_uid_prop]);
+ }
}
public function Mitarbeiter()
{
-
$viewData = array(
'uid'=>getAuthUID(),
);
- $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'AbgabetoolMitarbeiter']);
+ if(defined('CIS4') && CIS4) {
+ $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'AbgabetoolMitarbeiter']);
+ } else {
+ $this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'AbgabetoolMitarbeiter']);
+ }
}
+ public function Assistenz($stg_kz_prop = '')
+ {
+
+ $viewData = array(
+ 'uid'=>getAuthUID(),
+ );
+
+ if(defined('CIS4') && CIS4) {
+ $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'AbgabetoolAssistenz']);
+ } else {
+ $this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'AbgabetoolAssistenz', 'stg_kz_prop' => $stg_kz_prop]);
+ }
+ }
+
public function Deadlines()
{
-
$viewData = array(
'uid'=>getAuthUID(),
);
- $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'DeadlinesOverview']);
- }
-
-
- public function getStudentProjektarbeitAbgabeFile()
- {
- $this->_ci =& get_instance();
- $this->_ci->load->helper('download');
-
- $paabgabe_id = $this->_ci->input->get('paabgabe_id');
- $student_uid = $this->_ci->input->get('student_uid');
-
- if (!isset($paabgabe_id) || isEmptyString($paabgabe_id) || !isset($student_uid) || isEmptyString($student_uid))
- $this->terminateWithJsonError($this->p->t('global', 'wrongParameters'), 'general');
-
- $this->_ci->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
-
- $isZugeteilterBetreuer = count($this->_ci->ProjektarbeitModel->checkZuordnung($student_uid, getAuthUID())->retval) > 0;
-
- if(getAuthUID() == $student_uid || $isZugeteilterBetreuer) {
- $file_path = PAABGABE_PATH.$paabgabe_id.'_'.$student_uid.'.pdf';
- if(file_exists($file_path)) {
-
- header('Content-Description: File Transfer');
- header('Content-Type: application/octet-stream');
- header('Expires: 0');
- header('Cache-Control: must-revalidate');
- header('Pragma: public');
- header('Content-Disposition: attachment; filename="'.basename($file_path).'"');
- header('Content-Length: ' . filesize($file_path));
-
- flush(); // send headers first just in case
- readfile($file_path); // read file content to output buffer
-
- } else {
- $this->terminateWithJsonError('File not found');
- }
+ if(defined('CIS4') && CIS4) {
+ $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'DeadlinesOverview']);
} else {
- $this->terminateWithJsonError('Keine Zuordnung!');
+ $this->load->view('Cis/Abgabetool.php', ['uid' => getAuthUID(), 'route' => 'DeadlinesOverview']);
}
}
}
diff --git a/application/controllers/api/frontend/v1/Abgabe.php b/application/controllers/api/frontend/v1/Abgabe.php
new file mode 100644
index 000000000..b37c64713
--- /dev/null
+++ b/application/controllers/api/frontend/v1/Abgabe.php
@@ -0,0 +1,1339 @@
+.
+ */
+
+if (! defined('BASEPATH')) exit('No direct script access allowed');
+
+use CI3_Events as Events;
+
+class Abgabe extends FHCAPI_Controller
+{
+
+ /**
+ * Object initialization
+ */
+ public function __construct()
+ {
+ parent::__construct([
+ 'getConfig' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_lektor:rw'),
+ 'getConfigStudent' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_student:rw', 'basis/abgabe_lektor:rw'),
+ 'getStudentProjektarbeiten' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_student:rw', 'basis/abgabe_lektor:rw'),
+ 'getStudentProjektabgaben' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_student:rw', 'basis/abgabe_lektor:rw'),
+ 'postStudentProjektarbeitZwischenabgabe' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_student:rw'),
+ 'postStudentProjektarbeitEndupload' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_student:rw'),
+ 'getMitarbeiterProjektarbeiten' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_lektor:rw'),
+ 'postProjektarbeitAbgabe' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_lektor:rw'),
+ 'deleteProjektarbeitAbgabe' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_lektor:rw'),
+ 'postSerientermin' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_lektor:rw'),
+ 'fetchDeadlines' => array('basis/abgabe_assistenz:rw', 'basis/abgabe_lektor:rw'),
+ 'getPaAbgabetypen' => self::PERM_LOGGED,
+ 'getNoten' => self::PERM_LOGGED,
+ 'getProjektarbeitenForStudiengang' =>array('basis/abgabe_assistenz:rw'),
+ 'getStudiengaenge' => array('basis/abgabe_assistenz:rw'),
+ 'getStudentProjektarbeitAbgabeFile' => array('basis/abgabe_student:rw', 'basis/abgabe_lektor:rw', 'basis/abgabe_assistenz:rw'),
+ 'postStudentProjektarbeitZusatzdaten' => array('basis/abgabe_lektor:rw', 'basis/abgabe_assistenz:rw'),
+ 'getSignaturStatusForProjektarbeitAbgaben' => array('basis/abgabe_lektor:rw', 'basis/abgabe_assistenz:rw')
+ ]);
+
+ $this->load->library('PhrasesLib');
+ $this->load->library('SignatureLib');
+
+ // Loads LogLib with different debug trace levels to get data of the job that extends this class
+ // It also specify parameters to set database fields
+ $this->load->library('LogLib', array(
+ 'classIndex' => 5,
+ 'functionIndex' => 5,
+ 'lineIndex' => 4,
+ 'dbLogType' => 'API', // required
+ 'dbExecuteUser' => 'RESTful API',
+ 'requestId' => 'API',
+ 'requestDataFormatter' => function ($data) {
+ return json_encode($data);
+ }
+ ), 'logLib');
+
+ $this->loadPhrases(
+ array(
+ 'global',
+ 'ui',
+ 'abgabetool'
+ )
+ );
+ $this->load->config('abgabe');
+ $this->load->helper('hlp_sancho_helper');
+ }
+
+ //------------------------------------------------------------------------------------------------------------------
+ // Public methods
+
+ /**
+ * loads config related to abgabetool, found in application/config/abgabe
+ */
+ public function getConfig() {
+ $old_abgabe_beurteilung_link =$this->config->item('old_abgabe_beurteilung_link');
+ $turnitin_link = $this->config->item('turnitin_link');
+ $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');
+
+ $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
+ );
+
+ $this->terminateWithSuccess($ret);
+ }
+
+ /**
+ * loads config related to abgabetool for students to avoid handing out links reserved for employees
+ */
+ public function getConfigStudent() {
+ $moodle_link =$this->config->item('STG_MOODLE_LINK');
+
+ $ret = array(
+ 'moodle_link' => $moodle_link,
+ );
+
+ $this->terminateWithSuccess($ret);
+ }
+
+ /**
+ * fetches all projektabgabetermine for a given projektarbeit_id used in cis4 student abgabetool & lektor abgabetool
+ */
+ public function getStudentProjektabgaben() {
+ $projektarbeit_id = $this->input->get("projektarbeit_id",TRUE);
+ $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
+
+ if ($projektarbeit_id === NULL || trim((string)$projektarbeit_id) === '') {
+ $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
+ }
+
+ $result = $this->ProjektarbeitModel->load($projektarbeit_id);
+ $projektarbeitArr = $this->getDataOrTerminateWithError($result, 'general');
+
+ if(count($projektarbeitArr) > 0) {
+ $projektarbeit = $projektarbeitArr[0];
+ } else {
+ $this->terminateWithError($this->p->t('abgabetool','c4projektarbeitNichtGefunden'), 'general');
+ }
+
+ $res = $this->ProjektarbeitModel->getStudentInfoForProjektarbeitId($projektarbeit_id);
+ if(isError($res)) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4errorLoadingStudentForProjektarbeitID'), 'general');
+ }
+
+ if(!hasData($res)) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4noAssignedStudentForProjektarbeitID'), 'general');
+ }
+ $data = getData($res)[0];
+ $student_uid = $data->uid;
+
+ $zugeordnet = $this->checkZuordnung($projektarbeit_id, getAuthUID());
+ if(getAuthUID() == $student_uid || $zugeordnet) {
+ $projektarbeitIsCurrent = false;
+ $returnFunc = function ($result) use (&$projektarbeitIsCurrent) {
+ $projektarbeitIsCurrent = $result;
+ };
+ Events::trigger('projektarbeit_is_current', $projektarbeit_id, $returnFunc);
+
+ $ret = $this->ProjektarbeitModel->getProjektarbeitAbgabetermine($projektarbeit_id);
+
+ foreach ($ret->retval as $termin) {
+ $this->checkAbgabeSignatur($termin, $projektarbeit->student_uid);
+ }
+
+ $this->terminateWithSuccess(array($ret, $projektarbeitIsCurrent));
+ }
+ }
+
+ /**
+ * fetches all projektarbeiten and betreuer for a given student_uid used in cis4 student abgabetool
+ */
+ public function getStudentProjektarbeiten()
+ {
+ $uid = $this->input->get("uid",TRUE);
+
+ $this->load->model('person/Person_model', 'PersonModel');
+ $this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel');
+ $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
+
+ // if uid is missing or empty, fall back to getAuthUID()
+ if ($uid === NULL || trim((string)$uid) === '') {
+ $uid = getAuthUID();
+ }
+
+ $isMitarbeiter = $this->MitarbeiterModel->isMitarbeiter(getAuthUID());
+ if ($isMitarbeiter) {
+ $result = $this->ProjektarbeitModel->getStudentProjektarbeitenWithBetreuer($uid);
+ } else {
+ $result = $this->ProjektarbeitModel->getStudentProjektarbeitenWithBetreuer(getAuthUID());
+ }
+
+ $projektarbeiten = getData($result);
+
+ if(count($projektarbeiten)) {
+ foreach($projektarbeiten as $pa) {
+
+ $pa->student = getData($this->PersonModel->getFullName($uid));
+
+ $downloadPaFunc = function ($babgeschickt, $zweitbetreuer_abgeschickt) use ($pa) {
+ $pa->babgeschickt = $babgeschickt;
+ $pa->zweitbetreuer_abgeschickt = $zweitbetreuer_abgeschickt;
+ };
+
+ Events::trigger('projektbeurteilung_check_available', $pa->projektarbeit_id, $pa->bperson_id, $downloadPaFunc);
+
+ if(isset($pa->babgeschickt) && $pa->babgeschickt) {
+ $downloadLink1 = '';
+ $downloadLinkFunc1 = function ($link) use (&$downloadLink1) {
+ $downloadLink1 = $link;
+ };
+
+ Events::trigger('projektbeurteilung_download_link', $pa->projektarbeit_id, $pa->betreuerart_kurzbz, $pa->bperson_id, $downloadLinkFunc1);
+
+ // use config fallback in case the event fails
+ if($downloadLink1 == '') {
+ $fallback = $this->config->item('beurteilung_link_fallback');
+
+ $search = array(
+ 'betreuerart_kurzbz=?',
+ 'projektarbeit_id=?',
+ 'person_id=?'
+ );
+
+ $replace = array(
+ 'betreuerart_kurzbz=' . $pa->betreuerart_kurzbz,
+ 'projektarbeit_id=' . $pa->projektarbeit_id,
+ 'person_id=' . $pa->bperson_id
+ );
+
+ $fallback = str_replace($search, $replace, $fallback);
+ $downloadLink1 = APP_ROOT.$fallback;
+
+ }
+ $pa->downloadLink1 = $downloadLink1;
+ }
+
+ $pa->email = $pa->mitarbeiter_uid.'@'.DOMAIN;
+
+ if($pa->zweitbetreuer_person_id !== null) {
+
+ if($pa->zweitbetreuer_abgeschickt) {
+ $downloadLink2 = '';
+ $downloadLinkFunc2 = function ($link) use (&$downloadLink2) {
+ $downloadLink2 = $link;
+ };
+
+ Events::trigger('projektbeurteilung_download_link', $pa->projektarbeit_id, $pa->zweitbetreuer_betreuerart_kurzbz, $pa->zweitbetreuer_person_id, $downloadLinkFunc2);
+
+ // use config fallback in case the event fails
+ if($downloadLink2 == '') {
+ $fallback = $this->config->item('beurteilung_link_fallback');
+
+ $search = array(
+ 'betreuerart_kurzbz=?',
+ 'projektarbeit_id=?',
+ 'person_id=?'
+ );
+
+ $replace = array(
+ 'betreuerart_kurzbz=' . $pa->zweitbetreuer_betreuerart_kurzbz,
+ 'projektarbeit_id=' . $pa->projektarbeit_id,
+ 'person_id=' . $pa->zweitbetreuer_person_id
+ );
+
+ $fallback = str_replace($search, $replace, $fallback);
+ $downloadLink2 = APP_ROOT.$fallback;
+
+ }
+
+ $pa->downloadLink2 = $downloadLink2;
+ }
+
+ $result = $this->ProjektarbeitModel->getProjektbetreuerAnrede($pa->zweitbetreuer_person_id);
+
+ $data = getData($result);
+ if(count($data) > 0) {
+ $pa->zweitbetreuer = $data[0];
+ }
+ }
+ }
+ }
+
+ $this->terminateWithSuccess(array($projektarbeiten));
+ }
+
+
+
+ /**
+ * projektarbeit - upload for zwischenabgaben in cis4 student abgabetool
+ */
+ public function postStudentProjektarbeitZwischenabgabe()
+ {
+ $this->checkUploadSize();
+
+ $projektarbeit_id = $this->input->post('projektarbeit_id');
+ $paabgabe_id = $this->input->post('paabgabe_id');
+ $student_uid = $this->input->post('student_uid');
+ $bperson_id = $this->input->post('bperson_id');
+ $paabgabetyp_kurzbz = $this->input->post('paabgabetyp_kurzbz');
+
+ if ($projektarbeit_id === NULL || trim((string)$projektarbeit_id) === ''
+ || $paabgabe_id === NULL || trim((string)$paabgabe_id) === ''
+ || $student_uid === NULL || trim((string)$student_uid) === ''
+ || $paabgabetyp_kurzbz === NULL || trim((string)$paabgabetyp_kurzbz) === '') {
+ $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
+ }
+
+ $this->checkProjektarbeitForFinishedStatus($projektarbeit_id);
+
+ $zugeordnet = $this->checkZuordnung($projektarbeit_id, getAuthUID());
+ if(getAuthUID() == $student_uid || $zugeordnet) {
+
+
+ $path = PAABGABE_PATH.$paabgabe_id.'_'.$student_uid.'.pdf';
+
+ if ((isset($_FILES) and isset($_FILES['file']) and ! $_FILES['file']['error'])) {
+ move_uploaded_file($_FILES['file']['tmp_name'], $path);
+
+ if(file_exists($path)) {
+
+ chmod($path, 0640);
+
+ $this->load->model('education/Paabgabe_model', 'PaabgabeModel');
+ $res = $this->PaabgabeModel->update($paabgabe_id, array(
+ 'abgabedatum' => date('Y-m-d'),
+ 'updatevon' => getAuthUID(),
+ 'updateamum' => date('Y-m-d H:i:s')
+ ));
+
+ $this->logLib->logInfoDB(array('zwischenupload',$res, array(
+ 'abgabedatum' => date('Y-m-d'),
+ 'updatevon' => getAuthUID(),
+ 'updateamum' => date('Y-m-d H:i:s')
+ ), getAuthUID(), getAuthPersonId(), $student_uid));
+
+ $this->terminateWithSuccess($res);
+ } else {
+ $this->terminateWithError('Error moving File', 'general');
+ }
+
+ } else {
+ $this->terminateWithError('File missing', 'general');
+ }
+ } else {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent'));
+ }
+
+}
+
+ /**
+ * upload für finale abgaben aka Endupload in cis4 student abgabetool
+ */
+ public function postStudentProjektarbeitEndupload()
+ {
+ $this->checkUploadSize();
+
+ $projektarbeit_id = $this->input->post('projektarbeit_id');
+ $paabgabe_id = $this->input->post('paabgabe_id');
+ $student_uid = $this->input->post('student_uid');
+ $sprache = $this->input->post('sprache');
+ $abstract = $this->input->post('abstract');
+ $abstract_en = $this->input->post('abstract_en');
+ $schlagwoerter = $this->input->post('schlagwoerter');
+ $schlagwoerter_en = $this->input->post('schlagwoerter_en');
+ $seitenanzahl = $this->input->post('seitenanzahl');
+ $bperson_id = $this->input->post('bperson_id');
+ $paabgabetyp_kurzbz = $this->input->post('paabgabetyp_kurzbz');
+
+ if ($projektarbeit_id === NULL || trim((string)$projektarbeit_id) === ''
+ || $paabgabe_id === NULL || trim((string)$paabgabe_id) === ''
+ || $student_uid === NULL || trim((string)$student_uid) === ''
+ || $paabgabetyp_kurzbz === NULL || trim((string)$paabgabetyp_kurzbz) === ''
+ || $abstract === NULL || $abstract_en === NULL
+ || $schlagwoerter === NULL || $schlagwoerter_en === NULL
+ || $seitenanzahl === NULL || $sprache === NULL) {
+ $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
+ }
+
+ $this->checkProjektarbeitForFinishedStatus($projektarbeit_id);
+
+ $zugeordnet = $this->checkZuordnung($projektarbeit_id, getAuthUID());
+ if(getAuthUID() == $student_uid || $zugeordnet) {
+ if ((isset($_FILES) and isset($_FILES['file']) and !$_FILES['file']['error'])) {
+ move_uploaded_file($_FILES['file']['tmp_name'], PAABGABE_PATH . $paabgabe_id . '_' . $student_uid . '.pdf');
+
+ if (file_exists(PAABGABE_PATH . $paabgabe_id . '_' . $student_uid . '.pdf')) {
+
+ $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
+
+ $result = $this->ProjektarbeitModel->load($projektarbeit_id);
+ $projektarbeitArr = $this->getDataOrTerminateWithError($result, 'general');
+
+ if (count($projektarbeitArr) > 0) {
+ $projektarbeit = $projektarbeitArr[0];
+ } else {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4projektarbeitNichtGefunden'), 'general');
+ }
+
+ $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');
+ }
+
+ $this->checkAbgabeSignatur($paabgabe, $projektarbeit->student_uid);
+ $signaturstatus = $paabgabe->signatur;
+
+ // update projektarbeit cols
+ $this->ProjektarbeitModel->updateProjektarbeit($projektarbeit_id, $sprache, $abstract, $abstract_en
+ , $schlagwoerter, $schlagwoerter_en, $seitenanzahl);
+
+
+ // update paabgabe datum
+ $res = $this->PaabgabeModel->update($paabgabe_id, array(
+ 'abgabedatum' => date('Y-m-d'),
+ 'updatevon' => getAuthUID(),
+ 'updateamum' => date('Y-m-d H:i:s')
+ ));
+
+ $res = $this->PaabgabeModel->load($res->retval);
+ $abgabe = getData($res)[0];
+ $abgabe->signatur = $signaturstatus;
+
+ $this->sendUploadEmail($bperson_id, $projektarbeit_id, $paabgabetyp_kurzbz, $student_uid);
+
+ $this->logLib->logInfoDB(array('endupload', $res, array(
+ 'abgabedatum' => date('Y-m-d'),
+ 'updatevon' => getAuthUID(),
+ 'updateamum' => date('Y-m-d H:i:s')
+ ), getAuthUID(), getAuthPersonId(), array($projektarbeit_id, $sprache, $abstract, $abstract_en
+ , $schlagwoerter, $schlagwoerter_en, $seitenanzahl)));
+
+ $this->terminateWithSuccess($abgabe);
+ } else {
+ $this->terminateWithError('Error moving File', 'general');
+ }
+
+ } else {
+ $this->terminateWithError('File missing', 'general');
+ }
+ } else {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent'));
+ }
+
+ }
+
+ /**
+ * tabulator tabledata fetch for abgabetool/mitarbeiter
+ * initially fetches all currently active projektarbeiten with assigned mentorship
+ * showAll functionality also retrieves older finished projektarbeiten
+ */
+ public function getMitarbeiterProjektarbeiten() {
+ $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
+
+ $boolParamStr = $this->input->get('showall');
+ $trueStrings = ['true', '1'];
+ $falseStrings = ['false', '0'];
+
+ // Handle missing or invalid parameter
+ if ($boolParamStr === null) {
+ $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
+ }
+ $boolParamStrLower = strtolower($boolParamStr);
+
+ $showAllBool = false; // fallback if input strings are anything else for whatever reason
+ if (in_array($boolParamStrLower, $trueStrings, true)) {
+ $showAllBool = true;
+ } elseif (in_array($boolParamStrLower, $falseStrings, true)) {
+ $showAllBool = false;
+ }
+
+ $projektarbeiten = $this->ProjektarbeitModel->getMitarbeiterProjektarbeiten(getAuthUID(), $showAllBool);
+
+
+ forEach($projektarbeiten->retval as $pa) {
+
+ $result = $this->ProjektarbeitModel->getProjektbetreuerAnrede($pa->betreuer_person_id);
+ $anredeArr = $this->getDataOrTerminateWithError($result, 'general');
+ $pa->betreuer = $anredeArr[0];
+
+ $oldLink = ''; // show this when paIsCurrent == false -> moodle course template
+ $newLink = ''; // get curated path for betreuer type
+ $returnFunc = function ( $resultOld, $resultNew) use (&$oldLink, &$newLink) {
+ $newLink = $resultNew;
+ $oldLink = $resultOld;
+ };
+
+ Events::trigger('projektbeurteilung_formular_link', $pa->betreuerart_kurzbz, APP_ROOT, $pa->projektarbeit_id, $pa->student_uid, $returnFunc);
+ $pa->beurteilungLinkNew = $newLink;
+ $pa->beurteilungLinkOld = $oldLink;
+ }
+
+
+ $this->terminateWithSuccess(array($projektarbeiten, DOMAIN));
+ }
+
+ /**
+ * called by abgabetool/mitarbeiter in mitarbeiterdetail.js when adding a single new abgabetermin
+ * initially fetches all
+ */
+ public function postProjektarbeitAbgabe() {
+ $projektarbeit_id = $this->input->post('projektarbeit_id');
+ $paabgabe_id = $this->input->post('paabgabe_id');
+ $paabgabetyp_kurzbz = $this->input->post('paabgabetyp_kurzbz');
+ $datum = $this->input->post('datum');
+ $fixtermin = $this->input->post('fixtermin');
+ $kurzbz = $this->input->post('kurzbz');
+ $note = $this->input->post('note');
+ $beurteilungsnotiz = $this->input->post('beurteilungsnotiz');
+ $upload_allowed = $this->input->post('upload_allowed');
+ $betreuer_person_id = $this->input->post('betreuer_person_id');
+
+ if ($projektarbeit_id === NULL || trim((string)$projektarbeit_id) === ''
+ || $paabgabe_id === NULL || trim((string)$paabgabe_id) === ''
+ || $datum === NULL || trim((string)$datum) === ''
+ || $kurzbz === NULL
+ || $paabgabetyp_kurzbz === NULL || trim((string)$paabgabetyp_kurzbz) === '') {
+ $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
+ }
+
+ $this->checkProjektarbeitForFinishedStatus($projektarbeit_id);
+
+ $zugeordnet = $this->checkZuordnung($projektarbeit_id, getAuthUID());
+ if(!$zugeordnet) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent'));
+ }
+
+ $this->load->model('education/Paabgabe_model', 'PaabgabeModel');
+
+ $existingPaabgabe = null;
+ if($paabgabe_id == -1) {
+ $result = $this->PaabgabeModel->insert(
+ 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')
+ )
+ );
+ $this->logLib->logInfoDB(array('paabgabe created',$result, getAuthUID(), getAuthPersonId()));
+ } else {
+ // load existing entry of paabgabe and check if note has changed to negativ, to avoid sending when
+ // only notiz has changed.
+
+ // TODO: what if paabgabe is a qualgate1, is benotet negativ and then its type is changed to gate2?
+
+ $existingResult = $this->PaabgabeModel->load($paabgabe_id);
+ $existingPaabgabeArr = getData($existingResult);
+ if(count($existingPaabgabeArr) > 0) $existingPaabgabe = $existingPaabgabeArr[0];
+
+ $result = $this->PaabgabeModel->update(
+ $paabgabe_id,
+ array(
+ 'paabgabetyp_kurzbz' => $paabgabetyp_kurzbz,
+ 'datum' => $datum,
+ 'kurzbz' => $kurzbz,
+ 'note' => $note,
+ 'fixtermin' => $fixtermin,
+ 'beurteilungsnotiz' => $beurteilungsnotiz,
+ 'upload_allowed' => $upload_allowed,
+ 'updatevon' => getAuthUID(),
+ 'updateamum' => date('Y-m-d H:i:s')
+ )
+ );
+
+ $this->logLib->logInfoDB(array('paabgabe updated',$result, array(
+ 'paabgabetyp_kurzbz' => $paabgabetyp_kurzbz,
+ 'datum' => $datum,
+ 'kurzbz' => $kurzbz,
+ 'note' => $note,
+ 'fixtermin' => $fixtermin,
+ 'beurteilungsnotiz' => $beurteilungsnotiz,
+ 'upload_allowed' => $upload_allowed,
+ 'updatevon' => getAuthUID(),
+ 'updateamum' => date('Y-m-d H:i:s')
+ ), getAuthUID(), getAuthPersonId()));
+ }
+
+ // check if $paaabgabe is a qual gate and its note is deemed negative
+ // -> send email to student with that info
+ $paabgabe_id = $this->getDataOrTerminateWithError($result, 'general');
+
+ $result = $this->PaabgabeModel->load($paabgabe_id);
+ $paabgabeArr = $this->getDataOrTerminateWithError($result, 'general');
+ $paabgabe = $paabgabeArr[0];
+
+ // check if abgabe even has note
+ if($paabgabe->note) {
+ $this->load->model('education/Note_model', 'NoteModel');
+ $result = $this->NoteModel->load($paabgabe->note);
+ $noteArr = $this->getDataOrTerminateWithError($result, 'general');
+ $note = $noteArr[0];
+ if($note->positiv === false) {
+
+ if($existingPaabgabe && $existingPaabgabe->note) {
+ $result = $this->NoteModel->load($paabgabe->note);
+ $noteArr = $this->getDataOrTerminateWithError($result, 'general');
+ $note = $noteArr[0];
+ if($note->positiv === false) {
+ // do nothing since this means $beurteilungsnotiz change or smth else
+ } else { // benotung legitimately changed -> email
+ $this->sendQualGateNegativEmail($projektarbeit_id, $betreuer_person_id, $paabgabe);
+ }
+ } else { // nothing existing previously -> send that mail
+ $this->sendQualGateNegativEmail($projektarbeit_id, $betreuer_person_id, $paabgabe);
+ }
+
+ }
+ }
+
+ $this->terminateWithSuccess([$paabgabe, $existingPaabgabe]);
+ }
+
+ /**
+ * called by abgabetool/mitarbeiter in mitarbeiterdetail.js when deleting an abgabetermin
+ * deletion is only possible if user is assistenz OR betreuer deletes their own custom termin
+ * none of these roles are allowed to delete if students uploaded something for that termin
+ */
+ public function deleteProjektarbeitAbgabe() {
+ $paabgabe_id = $this->input->post('paabgabe_id');
+
+ if ($paabgabe_id === NULL || trim((string)$paabgabe_id) === '') {
+ $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
+ }
+
+ $this->checkProjektarbeitForFinishedStatus($this->getProjektarbeitIDForPaabgabeID($paabgabe_id));
+
+ $zugeordnet = $this->checkZuordnungByPaabgabe($paabgabe_id, getAuthUID());
+
+ if(!$zugeordnet) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent'), 'general');
+ }
+
+ $this->load->model('education/Paabgabe_model', 'PaabgabeModel');
+
+ $paabgabeResult = $this->PaabgabeModel->load($paabgabe_id);
+ $paabgabeArr = $this->getDataOrTerminateWithError($paabgabeResult, 'general');
+
+ if(count($paabgabeArr) == 0) {
+ $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
+ }
+
+ $result = $this->PaabgabeModel->delete($paabgabe_id);
+ $result = $this->getDataOrTerminateWithError($result, 'general');
+
+ // TODO: consider this in nightly email job
+ $this->logLib->logInfoDB(array($paabgabeArr[0], getAuthUID(), getAuthPersonId()));
+ $this->terminateWithSuccess($result);
+ }
+
+ /**
+ * endpoint for adding the same paabgabe for multiple projektarbeiten
+ * can be slow for large n since it queries twice per projektarbeit_id
+ */
+ public function postSerientermin() {
+ $projektarbeit_ids = $this->input->post('projektarbeit_ids');
+ $datum = $this->input->post('datum');
+ $paabgabetyp_kurzbz = $this->input->post('paabgabetyp_kurzbz');
+ $bezeichnung = $this->input->post('bezeichnung');
+ $kurzbz = $this->input->post('kurzbz');
+ $fixtermin = $this->input->post('fixtermin');
+ $upload_allowed = $this->input->post('upload_allowed');
+
+ if ($projektarbeit_ids === NULL || !is_array($projektarbeit_ids) || empty($projektarbeit_ids)
+ || $datum === NULL || trim((string)$datum) === ''
+ || $kurzbz === NULL
+ || $bezeichnung === NULL || trim((string)$bezeichnung) === ''
+ || $paabgabetyp_kurzbz === NULL || trim((string)$paabgabetyp_kurzbz) === '') {
+ $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
+ }
+
+ // old script checks if there already are tbl_paabgabe entries with exact date, type & kurzbz
+ // for each termin - good to check that in principle but should not matter in this place. if necessary
+ // duplicate abgabetermine can be easily deleted manually, also via cronjob@night.
+
+ // since this entry includes the kurzbz string match, it should have only ever mattered when there were
+ // multiple users entering the exact same set of (date, type, kurzbz) - which is a much more narrow case than the
+ // general "saveMultiple" function should handle
+
+ // old script afterwards again queries if user is not the zweitbetreuer of any id - this is blocked in the ui
+ // and should never unintentionally happen
+ $this->load->model('education/Paabgabe_model', 'PaabgabeModel');
+ $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
+
+ $res = [];
+ $abgaben = [];
+ foreach ($projektarbeit_ids as $projektarbeit_id) {
+
+ $this->checkProjektarbeitForFinishedStatus($projektarbeit_id);
+
+ $zugeordnet = $this->checkZuordnung($projektarbeit_id, getAuthUID());
+ if(!$zugeordnet) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent'), 'general');
+ }
+
+ $result = $this->PaabgabeModel->insert(
+ 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')
+ )
+ );
+
+ $dataAbgabe = $this->getDataOrTerminateWithError($result, 'general');
+
+ $abgaben[]= getData($this->PaabgabeModel->load($dataAbgabe))[0];
+ }
+
+ $this->logLib->logInfoDB(array('serientermin angelegt',$res, getAuthUID(), getAuthPersonId()));
+
+ $this->terminateWithSuccess($abgaben);
+ }
+
+ /**
+ * called by Abgabetool/Deadlines
+ * fetches the next upcoming abgabtermine for a given betreuer person_id
+ * resembles the legacy abgabetool functionality of "show deadlines"
+ */
+ public function fetchDeadlines() {
+ $person_id = $this->input->post('person_id');
+
+ if ($person_id === NULL || trim((string)$person_id) === '') {
+ $person_id = getAuthPersonId();
+ }
+
+ if($person_id !== getAuthPersonId()) {
+ $this->load->library('PermissionLib');
+ $isAdmin = $this->permissionlib->isBerechtigt('admin');
+ if(!$isAdmin) $this->terminateWithError($this->p->t('ui', 'keineBerechtigung'), 'general');
+ }
+
+ $this->load->model('education/Paabgabe_model', 'PaabgabeModel');
+ $result = $this->PaabgabeModel->getDeadlines($person_id);
+ $data = $this->getDataOrTerminateWithError($result, 'general');
+
+ $this->terminateWithSuccess($data);
+ }
+
+ /**
+ * called by Abgabetool/Mitarbeiter & Abgabetool/Assistenz
+ * fetches all available paabgabetypen to enable a logical selection of them
+ * based on active status and role assistenz/betreuer
+ */
+ public function getPaAbgabetypen() {
+ $this->load->model('education/Paabgabetyp_model', 'PaabgabetypModel');
+
+ $result = $this->PaabgabetypModel->getAll();
+ $paabgabetypen = $this->getDataOrTerminateWithError($result, 'general');
+
+
+ $this->terminateWithSuccess($paabgabetypen);
+ }
+
+ /**
+ * helper function to fetch the correct email for a projektarbeits erstbetreuer
+ */
+ 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;
+
+ }
+
+ /**
+ * helper function to fetch the correct email for a projektarbeits zweitbetreuer by their person id
+ * can be used for erstbetreuer aswell if necessary
+ */
+ private function getProjektbetreuerEmailByPersonID($person_id) {
+ $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
+ $result = $this->ProjektarbeitModel->getProjektbetreuerEmailByPersonID($person_id);
+ $email = $this->getDataOrTerminateWithError($result, 'general');
+
+ return $email[0]->uid ? $email[0]->uid.'@'.DOMAIN : $email[0]->private_email;
+ }
+
+ //TODO: SWITCH TO NOTEN API ONCE NOTENTOOL IS IN MASTER TO AVOID DUPLICATE API
+
+ /**
+ * GET METHOD
+ * returns List of all available & active NotenOptions
+ */
+ public function getNoten() {
+ $this->load->model('education/Note_model', 'NoteModel');
+
+ $result = $this->NoteModel->getAllActive();
+ $noten = $this->getDataOrTerminateWithError($result, 'general');
+
+ $allowed_noten_abgabetool = $this->config->item('ALLOWED_NOTEN_ABGABETOOL');
+
+ $nonfinal_noten_abgabetool = $this->config->item('NONFINAL_NOTEN_ABGABETOOL');
+
+
+ $this->terminateWithSuccess(array($noten, $allowed_noten_abgabetool, $nonfinal_noten_abgabetool));
+ }
+
+ /**
+ * helper function to send a sancho mail to students if a betreuer or assistenz grades a quality gate
+ * termin as negative (nicht bestanden)
+ */
+ private function sendQualGateNegativEmail($projektarbeit_id, $betreuer_person_id, $paabgabe) {
+ $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
+
+ $result = $this->ProjektarbeitModel->load($projektarbeit_id);
+ $projektarbeitArr = $this->getDataOrTerminateWithError($result, 'general');
+ $projektarbeit = $projektarbeitArr[0];
+
+ $result = $this->ProjektarbeitModel->getProjektbetreuerAnrede($betreuer_person_id);
+ $anredeArr = $this->getDataOrTerminateWithError($result, 'general');
+ $anrede = $anredeArr[0];
+
+ $student_uid = $projektarbeit->student_uid;
+
+ $this->load->model('education/Paabgabetyp_model', 'PaabgabetypModel');
+ $result = $this->PaabgabetypModel->load($paabgabe->paabgabetyp_kurzbz);
+ $paabgabetyp_kurzbzArr = $this->getDataOrTerminateWithError($result, 'general');
+ $paabgabetyp_kurzbz = $paabgabetyp_kurzbzArr[0];
+
+ // Mail an Student wenn Qualgate negativ beurteilt wurde
+ $this->load->model('crm/Student_model', 'StudentModel');
+ $result = $this->StudentModel->load([$student_uid]);
+ $studentArr = $this->getDataOrTerminateWithError($result, 'general');
+ $student = $studentArr[0];
+
+ if(!$student) {
+ $this->terminateWithError($this->p->t('abgabetool','c4userNichtGefunden'), 'general');
+ }
+
+ $subject = $this->p->t('abgabetool', 'c4qualgateNegativEmailSubjectv2');
+ $tomail = $student_uid.'@'.DOMAIN;
+
+ $datetime = new DateTime($paabgabe->datum);
+ $dateEmailFormatted = $datetime->format('d.m.Y');
+
+ $data = array(
+ 'betreuerfullname' => $anrede->first,
+ 'qualgatebezeichnung' => $paabgabetyp_kurzbz->bezeichnung,
+ 'datum' => $dateEmailFormatted,
+ 'projektarbeitname' => $projektarbeit->titel
+ );
+
+ // students still get theirs on event, since it is very unlikely that this
+ // leads to spam on their end
+
+ $mailres = sendSanchoMail(
+ 'QualGateNegativ',
+ $data,
+ $tomail,
+ $subject
+ );
+
+ }
+
+ /**
+ * tabulator tabledata fetch for abgabetool/assistenz
+ * initially fetches all ungraded projektarbeiten with all their abgabetermine
+ */
+ public function getProjektarbeitenForStudiengang() {
+ $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
+
+ $studiengang_kz = $this->input->get("studiengang_kz", TRUE);
+ $benotet = $this->input->get("benotet", TRUE);
+
+ if ($studiengang_kz === NULL || trim((string)$studiengang_kz) === '') {
+ $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
+ }
+
+ // TODO: recheck getSTGEntitlement here!
+ $stg_allowed = $this->permissionlib->getSTG_isEntitledFor('basis/abgabe_assistenz:rw');
+ if($stg_allowed == false) {
+ $this->terminateWithError($this->p->t('ui', 'keineBerechtigung'), 'general');
+ }
+
+ // check if provided studiengang_kz is included in stg_allowed to proceed
+ if(!in_array($studiengang_kz, $stg_allowed)) {
+ $this->terminateWithError($this->p->t('ui', 'keineBerechtigung'), 'general');
+ }
+
+ $result = $this->ProjektarbeitModel->getProjektarbeitenForStudiengang($studiengang_kz, $benotet);
+ $projektarbeiten = $this->getDataOrTerminateWithError($result, 'general');
+
+ if(count($projektarbeiten) == 0) { // avoid further abgabetermin queries if the are no projektarbeiten
+ $this->terminateWithSuccess(array($projektarbeiten, DOMAIN));
+ }
+
+ $mapFunc = function($projektarbeit) {
+ return $projektarbeit->projektarbeit_id;
+ };
+ $projektarbeiten_ids = array_map($mapFunc, $projektarbeiten);
+
+ $ret = $this->ProjektarbeitModel->getProjektarbeitenAbgabetermine($projektarbeiten_ids);
+ $projektabgaben = $this->getDataOrTerminateWithError($ret, 'general');
+
+ // map the abgaben into projektarbeiten
+ foreach($projektarbeiten as $projektarbeit) {
+ $projektarbeit->betreuer_mail = $this->getProjektbetreuerEmailByProjektarbeitID($projektarbeit->projektarbeit_id);
+
+ if($projektarbeit->zweitbetreuer_person_id !== null) {
+ $projektarbeit->zweitbetreuer_mail = $this->getProjektbetreuerEmailByPersonID($projektarbeit->zweitbetreuer_person_id);
+ }
+
+ $filterFunc = function($projektabgabe) use ($projektarbeit) {
+ return $projektabgabe->projektarbeit_id == $projektarbeit->projektarbeit_id;
+ };
+
+ $projektarbeit->abgabetermine = array_values(array_filter($projektabgaben, $filterFunc));
+ }
+
+ $this->terminateWithSuccess(array($projektarbeiten, DOMAIN));
+ }
+
+ // TODO: this could be in a generic info controller and reused
+ /**
+ * GET METHOD
+ * returns List of all studiengang_kz a user has the assigned permission 'basis/abgabe_assistenz:rw' for
+ * used in Abgabetool/Assistenz to populate Studiengang Dropdown
+ */
+ public function getStudiengaenge() {
+ $this->load->library('PermissionLib');
+
+ $stg_allowed = $this->permissionlib->getSTG_isEntitledFor('basis/abgabe_assistenz:rw');
+
+ if($stg_allowed == false) {
+ $this->terminateWithError($this->p->t('ui', 'keineBerechtigung'), 'general');
+ }
+
+ $this->load->model('organisation/Studiengang_model', 'StudiengangModel');
+
+ $result = $this->StudiengangModel->getStudiengaengeFiltered($stg_allowed);
+ $data = $this->getDataOrTerminateWithError($result, 'general');
+
+ $this->terminateWithSuccess($data);
+ }
+
+ /**
+ * GET METHOD
+ * endpoint to download the abgabe of a paabgabe termin zwischenabgabe or endupload
+ */
+ public function getStudentProjektarbeitAbgabeFile()
+ {
+ $this->load->helper('download');
+
+ $projektarbeit_id = $this->input->get('projektarbeit_id');
+ $paabgabe_id = $this->input->get('paabgabe_id');
+ $student_uid = $this->input->get('student_uid');
+
+ if ($paabgabe_id === NULL || trim((string)$paabgabe_id) === ''
+ || $projektarbeit_id === NULL || trim((string)$projektarbeit_id) === ''
+ || $student_uid === NULL || trim((string)$student_uid) === '') {
+ $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
+ }
+
+ $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
+
+ // zuordnung function is supposed for mitarbeiter_uids, students should be allowed to download their own files
+ // without adapting zuordnung logic
+ $zugeordnet = $this->checkZuordnung($projektarbeit_id, getAuthUID());
+ if(getAuthUID() == $student_uid || $zugeordnet) {
+ $file_path = PAABGABE_PATH.$paabgabe_id.'_'.$student_uid.'.pdf';
+
+
+ if(file_exists($file_path)) {
+ $this->terminateWithFileOutput('application/octet-stream', file_get_contents($file_path), basename($file_path));
+ } else {
+ $this->terminateWithError('File not found', 'general');
+ }
+ } else {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent'), 'general');
+ }
+ }
+
+ /**
+ * POST METHOD
+ * endpoint to enable Assistenz/Betreuer to edit the zusatzdate of a projektarbeit, in case the student somehow
+ * can't do it themself
+ */
+ public function postStudentProjektarbeitZusatzdaten(){
+ $projektarbeit_id = $this->input->post('projektarbeit_id');
+ $sprache = $this->input->post('sprache');
+ $abstract = $this->input->post('abstract');
+ $abstract_en = $this->input->post('abstract_en');
+ $schlagwoerter = $this->input->post('schlagwoerter');
+ $schlagwoerter_en = $this->input->post('schlagwoerter_en');
+ $seitenanzahl = $this->input->post('seitenanzahl');
+
+ if ($projektarbeit_id === NULL || trim((string)$projektarbeit_id) === ''
+ || $sprache === NULL || trim((string)$sprache) === ''
+ || $seitenanzahl === NULL || trim((string)$seitenanzahl) === ''
+ || $abstract === NULL || trim((string)$abstract) === ''
+ || $abstract_en === NULL || trim((string)$abstract_en) === ''
+ || $schlagwoerter === NULL || trim((string)$schlagwoerter) === ''
+ || $schlagwoerter_en === NULL || trim((string)$schlagwoerter_en) === '') {
+
+ $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
+ }
+
+ $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
+
+
+
+ $result = $this->ProjektarbeitModel->load($projektarbeit_id);
+ $projektarbeitArr = $this->getDataOrTerminateWithError($result, 'general');
+
+ if(count($projektarbeitArr) > 0) {
+ $projektarbeit = $projektarbeitArr[0];
+ } else {
+ $this->terminateWithError($this->p->t('abgabetool','c4projektarbeitNichtGefunden'), 'general');
+ }
+
+ $this->checkProjektarbeitForFinishedStatus($projektarbeit_id);
+
+ $zugeordnet = $this->checkZuordnung($projektarbeit_id, getAuthUID());
+ if(!$zugeordnet) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4noZuordnungBetreuerStudent'), 'general');
+ }
+
+ // update projektarbeit cols
+ $this->ProjektarbeitModel->updateProjektarbeit($projektarbeit_id,$sprache,$abstract,$abstract_en
+ ,$schlagwoerter, $schlagwoerter_en, $seitenanzahl);
+
+ $this->logLib->logInfoDB(array('zusatzdatenEditMitarbeiter', array(
+ 'updatevon' => getAuthUID(),
+ 'updateamum' => date('Y-m-d H:i:s')
+ ), getAuthUID(), getAuthPersonId(), array($projektarbeit_id,$sprache,$abstract,$abstract_en
+ ,$schlagwoerter, $schlagwoerter_en, $seitenanzahl)));
+
+ $result = $this->ProjektarbeitModel->load($projektarbeit_id);
+
+ $this->terminateWithSuccess($result);
+ }
+
+ // used to lazy load signatur status for assistenzen, since they could run into very long fetch times
+ // since they fetch the projektarbeiten with paabgaben included and could have a lot of huge endupload files
+ // in their stg resulting in huge loading times -> use this api call on opening detail component instead
+ public function getSignaturStatusForProjektarbeitAbgaben() {
+ $paabgabe_ids = $this->input->post('paabgabe_ids');
+ $student_uid = $this->input->post('student_uid');
+
+ if ($paabgabe_ids === NULL || $student_uid === NULL || trim((string)$student_uid) === '') {
+ $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
+ }
+
+ $this->load->model('education/Paabgabe_model', 'PaabgabeModel');
+
+ $result = $this->PaabgabeModel->loadByIDs($paabgabe_ids);
+ $data = $this->getDataOrTerminateWithError($result);
+
+ foreach($data as $paabgabetermin) {
+ $this->checkAbgabeSignatur($paabgabetermin, $student_uid);
+ }
+
+ $this->terminateWithSuccess($data);
+ }
+
+ /**
+ * 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;
+ }
+ }
+
+ private function sendUploadEmail($bperson_id, $projektarbeit_id, $paabgabetyp_kurzbz, $student_uid) {
+ $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
+
+ $resBetr = $this->ProjektarbeitModel->getProjektbetreuerAnrede($bperson_id);
+
+
+ $result = $this->ProjektarbeitModel->load($projektarbeit_id);
+ $projektarbeitArr = $this->getDataOrTerminateWithError($result, 'general');
+
+ if(count($projektarbeitArr) > 0) {
+ $projektarbeit = $projektarbeitArr[0];
+ } else {
+ $this->terminateWithError($this->p->t('abgabetool','c4projektarbeitNichtGefunden'), 'general');
+ }
+
+ $projektarbeitIsCurrent = false;
+ $returnFunc = function ($result) use (&$projektarbeitIsCurrent) {
+ $projektarbeitIsCurrent = $result;
+ };
+ Events::trigger('projektarbeit_is_current', $projektarbeit_id, $returnFunc);
+ if(!$projektarbeitIsCurrent) {
+ $this->terminateWithError($this->p->t('abgabetool','c4fehlerAktualitaetProjektarbeit'), 'general');
+ }
+
+ // Link to Abgabetool
+ if (defined('CIS4') && CIS4) {
+ $ci3BootstrapFilePath = "cis.php";
+ } else {
+ $ci3BootstrapFilePath = "index.ci.php";
+ }
+
+ $path = $this->config->item('URL_MITARBEITER');
+ $url = APP_ROOT.$path;
+
+ // getProjektbetreuerAnrede fetches distinct on person_id, so there should be one row. zweitbetreuer is handled seperately afterwards
+ foreach($resBetr->retval as $betreuerRow) {
+
+ // query student benutzer view for every betreuer row
+ $studentUser = $this->ProjektarbeitModel->getProjektarbeitBenutzer($student_uid)->retval[0];
+
+ // 1. Begutachter mail ohne Token
+ $mail_baselink = APP_ROOT.$this->config->item('PROJEKTARBEITSBEURTEILUNG_MAIL_BASELINK_ERSTBEGUTACHTER');
+// $mail_baselink = APP_ROOT."index.ci.php/extensions/FHC-Core-Projektarbeitsbeurteilung/ProjektarbeitsbeurteilungErstbegutachter";
+ $mail_fulllink = "$mail_baselink?projektarbeit_id=".$projektarbeit_id."&uid=".$studentUser->uid;
+ $projekttyp_kurzbz = $projektarbeit->projekttyp_kurzbz;
+ $subject = $projektarbeit->projekttyp_kurzbz == 'Diplom' ? 'Masterarbeitsbetreuung' : 'Bachelorarbeitsbetreuung';
+ $abgabetyp = $paabgabetyp_kurzbz == 'end' ? 'Endabgabe' : 'Zwischenabgabe';
+
+ $maildata = array();
+ $maildata['geehrt'] = "geehrte".($betreuerRow->anrede=="Herr"?"r":"");
+ $maildata['anrede'] = $betreuerRow->anrede;
+ $maildata['betreuer_voller_name'] = $betreuerRow->first;
+ $maildata['student_anrede'] = $studentUser->anrede;
+ $maildata['student_voller_name'] = trim($studentUser->titelpre." ".$studentUser->vorname." ".$studentUser->nachname." ".$studentUser->titelpost);
+ $maildata['abgabetyp'] = $abgabetyp;
+ $maildata['parbeituebersichtlink'] = "
Zur Projektarbeitsübersicht
";
+ $maildata['bewertunglink'] = $projektarbeitIsCurrent && $paabgabetyp_kurzbz == 'end' ? "Zur Beurteilung der Arbeit
" : "";
+ $maildata['token'] = "";
+
+ $email = $this->getProjektbetreuerEmailByProjektarbeitID($projektarbeit_id);
+
+ if(!$email) $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailBegutachter'), 'general');
+
+ $mailres = sendSanchoMail(
+ 'ParbeitsbeurteilungEndupload',
+ $maildata,
+ $email,
+ $subject,
+ 'sancho_header_min_bw.jpg',
+ 'sancho_footer_min_bw.jpg',
+ get_uid()."@".DOMAIN);
+
+ if(!$mailres)
+ {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailBegutachter'), 'general');
+ }
+
+ // 2. Begutachter mail, wenn Endabgabe, mit Token wenn extern
+ if ($paabgabetyp_kurzbz == 'end')
+ {
+ // Zweitbegutachter holen
+ $this->load->model('education/Projektbetreuer_model', 'ProjektbetreuerModel');
+ $zweitbegutachterRetval = getData($this->ProjektbetreuerModel->getZweitbegutachterWithToken($bperson_id, $projektarbeit_id, $studentUser->uid));
+
+ if ($zweitbegutachterRetval && count($zweitbegutachterRetval) > 0)
+ {
+
+ foreach ($zweitbegutachterRetval as $begutachter)
+ {
+ // token generieren, wenn noch nicht vorhanden und notwendig (wird in methode überprüft)
+ $tokenGenRes = $this->ProjektbetreuerModel->generateZweitbegutachterToken($begutachter->person_id, $projektarbeit_id);
+
+ if (!$tokenGenRes)
+ {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailZweitBegutachter'), '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');
+ }
+
+ $begutachterMitToken = $begutachterMitTokenRetval[0];
+
+ $path = $begutachterMitToken->betreuerart_kurzbz == 'Zweitbegutachter' ? 'ProjektarbeitsbeurteilungZweitbegutachter' : 'ProjektarbeitsbeurteilungErstbegutachter';
+ $mail_baselink = APP_ROOT."index.ci.php/extensions/FHC-Core-Projektarbeitsbeurteilung/$path";
+ $mail_fulllink = "$mail_baselink?projektarbeit_id=".$projektarbeit_id."&uid=".$studentUser->uid;
+ $intern = isset($begutachterMitToken->uid);
+ $mail_link = $intern ? $mail_fulllink : $mail_baselink;
+
+ $zweitbetmaildata = array();
+ $zweitbetmaildata['geehrt'] = "geehrte" . ($begutachterMitToken->anrede == "Herr" ? "r" : "");
+ $zweitbetmaildata['anrede'] = $begutachterMitToken->anrede;
+ $zweitbetmaildata['betreuer_voller_name'] = $begutachterMitToken->voller_name;
+ $zweitbetmaildata['student_anrede'] = $maildata['student_anrede'];
+ $zweitbetmaildata['student_voller_name'] = $maildata['student_voller_name'];
+ $zweitbetmaildata['abgabetyp'] = $abgabetyp;
+ $zweitbetmaildata['parbeituebersichtlink'] = $intern ? $maildata['parbeituebersichtlink'] : "";
+ $zweitbetmaildata['bewertunglink'] = $projektarbeitIsCurrent ? "Zur Beurteilung der Arbeit
" : "";
+ $zweitbetmaildata['token'] = $projektarbeitIsCurrent && isset($begutachterMitToken->zugangstoken) && !$intern ? "Zugangstoken: " . $begutachterMitToken->zugangstoken . "
" : "";
+
+ $mailres = sendSanchoMail(
+ 'ParbeitsbeurteilungEndupload',
+ $zweitbetmaildata,
+ $begutachterMitToken->email,
+ $subject,
+ 'sancho_header_min_bw.jpg',
+ 'sancho_footer_min_bw.jpg',
+ get_uid()."@".DOMAIN
+ );
+
+ if (!$mailres)
+ {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailBegutachter'), 'general');
+ }
+
+ }
+ }
+ }
+ }
+ }
+
+ private function checkZuordnung($projektarbeit_id, $betreuer_uid) {
+ // check if authenticated user is zugewiesen as betreuer to projektarbeit or has admin/assistenz berechtigung
+ // over the studiengang of the student working on that projektarbeit_id
+
+ $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
+
+ $res = $this->ProjektarbeitModel->getStudentInfoForProjektarbeitId($projektarbeit_id);
+ if(isError($res)) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4errorLoadingStudentForProjektarbeitID'), 'general');
+ }
+
+ if(!hasData($res)) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4noAssignedStudentForProjektarbeitID'), 'general');
+ }
+ $data = getData($res)[0];
+ $student_uid = $data->uid;
+ $studiengang_kz = $data->studiengang_kz;
+
+ $res = $this->ProjektarbeitModel->checkZuordnung($student_uid, $betreuer_uid);
+ if(isError($res)) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4errorLoadingBetreuerStudentZuordnung'), 'general');
+ }
+
+ // if this is true betreuer has zuordnung to the given $projektarbeit_id and conversely the $student_uid
+ // assigned to that project
+ if(hasData($res)) {
+ return true;
+ } else {
+ $berechtigt = $this->ProjektarbeitModel->hasBerechtigungForProjektarbeit($projektarbeit_id);
+ if($berechtigt) {
+ return true;
+ }
+
+ // otherwhise if there is no zuordnung via global admin or assistenz berechtigung,
+ // check if the given uid has permissions over the studiengang of the student
+ // via the abgabetool specific berechtigungen
+ // 'basis/abgabe_assistenz:rw' OR 'basis/abgabe_lektor:rw'
+
+ if ($this->permissionlib->isBerechtigt('basis/abgabe_assistenz', 'suid', $studiengang_kz)) {
+ return true;
+ }
+
+ if ($this->permissionlib->isBerechtigt('basis/abgabe_lektor', 'suid', $studiengang_kz)){
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ private function getProjektarbeitIDForPaabgabeID($paabgabe_id) {
+ $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
+
+ $res = $this->ProjektarbeitModel->getProjektarbeitByPaabgabeID($paabgabe_id);
+ if(isError($res)) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4errorLoadingProjektarbeitForPaabgabeID'), 'general');
+ }
+
+ if(!hasData($res)) {
+ $this->terminateWithError($this->p->t('abgabetool', 'c4noAssignedProjektarbeitForPaabgabeID'), 'general');
+ }
+ $data = getData($res)[0];
+ return $data->projektarbeit_id;
+ }
+
+ private function checkZuordnungByPaabgabe($paabgabe_id, $betreuer_uid) {
+ $projektarbeit_id = $this->getProjektarbeitIDForPaabgabeID($paabgabe_id);
+ return $this->checkZuordnung($projektarbeit_id, $betreuer_uid);
+ }
+
+ // loads a projektarbeit table row by id and looks if a note has been set. A non null note field
+ // currently indicates that a projektarbeit has been finished and should not accept further crud manipulation
+ private function checkProjektarbeitForFinishedStatus($projektarbeit_id) {
+ $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
+ $res = $this->ProjektarbeitModel->load($projektarbeit_id);
+
+ if(isError($res) || !hasData($res)) {
+ $this->terminateWithError($this->p->t('abgabetool','c4projektarbeitNichtGefunden'), 'general');
+ }
+
+ $data = getData($res)[0];
+ if($data->note !== NULL) {
+ $this->terminateWithError($this->p->t('abgabetool','c4fehlerAktualitaetProjektarbeit'), 'general');
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/application/controllers/api/frontend/v1/Lehre.php b/application/controllers/api/frontend/v1/Lehre.php
index d5d0282bd..10d945a3e 100644
--- a/application/controllers/api/frontend/v1/Lehre.php
+++ b/application/controllers/api/frontend/v1/Lehre.php
@@ -38,34 +38,9 @@ class Lehre extends FHCAPI_Controller
parent::__construct([
'lvStudentenMail' => self::PERM_LOGGED,
'LV' => self::PERM_LOGGED,
- 'Pruefungen' => self::PERM_LOGGED,
- 'getStudentProjektarbeiten' => self::PERM_LOGGED, // TODO: abgabetool berechtigung?
- 'getStudentProjektabgaben' => self::PERM_LOGGED,
- 'postStudentProjektarbeitZwischenabgabe' => self::PERM_LOGGED,
- 'postStudentProjektarbeitEndupload' => self::PERM_LOGGED,
- 'getMitarbeiterProjektarbeiten' => self::PERM_LOGGED,
- 'postProjektarbeitAbgabe' => self::PERM_LOGGED,
- 'deleteProjektarbeitAbgabe' => self::PERM_LOGGED,
- 'postSerientermin' => self::PERM_LOGGED,
- 'fetchDeadlines' => self::PERM_LOGGED // TODO: mitarbeiter recht prüfen
+ 'Pruefungen' => self::PERM_LOGGED
]);
-
- $this->load->library('PhrasesLib');
-
- $this->loadPhrases(
- array(
- 'global',
- 'ui',
- 'abgabetool'
- )
- );
-
- $this->load->helper('hlp_sancho_helper');
- require_once(FHCPATH . 'include/studiengang.class.php');
- require_once(FHCPATH . 'include/student.class.php');
- require_once(FHCPATH . 'include/projektarbeit.class.php');
- require_once(FHCPATH . 'include/projektbetreuer.class.php');
}
//------------------------------------------------------------------------------------------------------------------
@@ -125,557 +100,5 @@ class Lehre extends FHCAPI_Controller
$this->terminateWithSuccess($result);
}
-
- /**
- * fetches all projektabgabetermine for a given projektarbeit_id used in cis4 student abgabetool
- */
- public function getStudentProjektabgaben() {
- $projektarbeit_id = $this->input->get("projektarbeit_id",TRUE);
-
- // TODO: error messages
-
- if (!isset($projektarbeit_id) || isEmptyString($projektarbeit_id))
- $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
-
- $projektarbeit_obj = new projektarbeit();
- if($projektarbeit_id==-1)
- $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
-
- if(!$projektarbeit_obj->load($projektarbeit_id))
- $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
-
- $paIsCurrent = $projektarbeit_obj->projektarbeitIsCurrent($projektarbeit_id);
-
- $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
- $ret = $this->ProjektarbeitModel->getProjektarbeitAbgabetermine($projektarbeit_id);
-
- // TODO: fetch zweitbetreuer
-
- $this->terminateWithSuccess(array($ret, $paIsCurrent));
- }
-
- /**
- * fetches all projektarbeiten and betreuer for a given student_uid used in cis4 student abgabetool
- */
- public function getStudentProjektarbeiten($uid)
- {
- $this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel');
- $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
-
- if (!isset($uid) || isEmptyString($uid))
- $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
-
- $isZugeteilterBetreuer = count($this->ProjektarbeitModel->checkZuordnung($uid, getAuthUID())->retval) > 0;
- $this->addMeta('isZugeteilterBetreuer', $isZugeteilterBetreuer);
- $isMitarbeiter = $this->MitarbeiterModel->isMitarbeiter(getAuthUID());
-
- if ($isMitarbeiter && $isZugeteilterBetreuer){
- $projektarbeiten = $this->ProjektarbeitModel->getStudentProjektarbeitenWithBetreuer($uid);
- } else {
- $projektarbeiten = $this->ProjektarbeitModel->getStudentProjektarbeitenWithBetreuer(getAuthUID());
- }
-
- $this->terminateWithSuccess(array($projektarbeiten, DOMAIN, $uid));
- }
-
-
-
- /**
- * projektarbeit - upload for zwischenabgaben in cis4 student abgabetool
- */
- public function postStudentProjektarbeitZwischenabgabe()
- {
-
- $projektarbeit_id = $_POST['projektarbeit_id'];
- $paabgabe_id = $_POST['paabgabe_id'];
- $student_uid = $_POST['student_uid'];
- $bperson_id = $_POST['bperson_id'];
- $paabgabetyp_kurzbz = $_POST['paabgabetyp_kurzbz'];
-
- if (!isset($projektarbeit_id) || isEmptyString($projektarbeit_id)
- || !isset($paabgabe_id) || isEmptyString($paabgabe_id)
- || !isset($student_uid) || isEmptyString($student_uid)
- || !isset($paabgabetyp_kurzbz) || isEmptyString($paabgabetyp_kurzbz))
- $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
-
- if ((isset($_FILES) and isset($_FILES['file']) and ! $_FILES['file']['error'])) {
- move_uploaded_file($_FILES['file']['tmp_name'], PAABGABE_PATH.$paabgabe_id.'_'.$student_uid.'.pdf');
-
- if(file_exists(PAABGABE_PATH.$paabgabe_id.'_'.$student_uid.'.pdf')) {
-
- exec('chmod 640 "'.PAABGABE_PATH.$paabgabe_id.'_'.$student_uid.'.pdf'.'"');
-
- $this->load->model('education/Paabgabe_model', 'PaabgabeModel');
- $res = $this->PaabgabeModel->update($paabgabe_id, array(
- 'abgabedatum' => date('Y-m-d'),
- 'updatevon' => getAuthUID(),
- 'updateamum' => date('Y-m-d H:i:s')
- ));
-
- $this->sendUploadEmail($bperson_id, $projektarbeit_id, $paabgabetyp_kurzbz, $student_uid);
- $this->terminateWithSuccess($res);
- } else {
- $this->terminateWithError('Error moving File');
- }
-
- } else {
- $this->terminateWithError('File missing');
- }
-
- }
-
- /**
- * upload für finale abgaben aka Endupload in cis4 student abgabetool
- */
- public function postStudentProjektarbeitEndupload()
- {
-
- $projektarbeit_id = $_POST['projektarbeit_id'];
- $paabgabe_id = $_POST['paabgabe_id'];
- $student_uid = $_POST['student_uid'];
- $sprache = $_POST['sprache'];
- $abstract = $_POST['abstract'];
- $abstract_en = $_POST['abstract_en'];
- $schlagwoerter = $_POST['schlagwoerter'];
- $schlagwoerter_en = $_POST['schlagwoerter_en'];
- $seitenanzahl = $_POST['seitenanzahl'];
- $bperson_id = $_POST['bperson_id'];
- $paabgabetyp_kurzbz = $_POST['paabgabetyp_kurzbz'];
-
- if (!isset($projektarbeit_id) || isEmptyString($projektarbeit_id)
- || !isset($paabgabe_id) || isEmptyString($paabgabe_id)
- || !isset($student_uid) || isEmptyString($student_uid)
- || !isset($paabgabetyp_kurzbz) || isEmptyString($paabgabetyp_kurzbz))
- $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
-
- // TODO: maybe check for other params aswell?
-
- if ((isset($_FILES) and isset($_FILES['file']) and ! $_FILES['file']['error'])) {
- move_uploaded_file($_FILES['file']['tmp_name'], PAABGABE_PATH.$paabgabe_id.'_'.$student_uid.'.pdf');
-
- if(file_exists(PAABGABE_PATH.$paabgabe_id.'_'.$student_uid.'.pdf')) {
-
- // Loads Libraries
- $this->load->library('SignatureLib');
-
- // Check if the document is signed
- $signaturVorhanden = true;
- $signList = SignatureLib::list(PAABGABE_PATH.$paabgabe_id.'_'.$student_uid.'.pdf');
- if (is_array($signList) && count($signList) > 0)
- {
- // The document is signed
- $uploadedDocumentSigned = 'The document is signed';
- }
- elseif ($signList === null)
- {
- $uploadedDocumentSigned = 'WARNING: signature server error';
- }
- else
- {
- $signaturVorhanden = false;
- $uploadedDocumentSigned = 'No document signature found';
- }
- $this->addMeta('signaturInfo', $uploadedDocumentSigned);
-
- if ($signaturVorhanden === false)
- {
- $this->signaturFehltEmail($student_uid);
- }
-
- // TODO error handle get data has data the updates
- // update projektarbeit cols
- $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
- $this->ProjektarbeitModel->updateProjektarbeit($projektarbeit_id,$sprache,$abstract,$abstract_en
- ,$schlagwoerter, $schlagwoerter_en, $seitenanzahl);
-
-
- // update paabgabe datum
- $this->load->model('education/Paabgabe_model', 'PaabgabeModel');
- $res = $this->PaabgabeModel->update($paabgabe_id, array(
- 'abgabedatum' => date('Y-m-d'),
- 'updatevon' => getAuthUID(),
- 'updateamum' => date('Y-m-d H:i:s')
- ));
-
- $this->sendUploadEmail($bperson_id, $projektarbeit_id, $paabgabetyp_kurzbz, $student_uid);
-
- $this->terminateWithSuccess($res);
- } else {
- $this->terminateWithError('Error moving File');
- }
-
- } else {
- $this->terminateWithError('File missing');
- }
-
- }
-
- private function signaturFehltEmail($student_uid) {
-
-
- // Mail an Studiengang wenn keine Signatur gefunden wurde
- $student = new student();
- if(!$student->load($student_uid))
- $this->terminateWithError($this->p->t('global','userNichtGefunden'), 'general');
-
- $stg_obj = new studiengang();
- if(!$stg_obj->load($student->studiengang_kz))
- $this->terminateWithError($this->p->t('global','fehlerBeimLesenAusDatenbank'), 'general');
-
- $subject = 'Abgabe ohne Signatur';
- $tomail = $stg_obj->email;
- $data = array(
- 'vorname' => $student->vorname,
- 'nachname' => $student->nachname,
- 'studiengang' => $stg_obj->bezeichnung
- );
-
- $mailres = sendSanchoMail(
- 'ParbeitsbeurteilungSiganturFehlt',
- $data,
- $tomail,
- $subject,
- 'sancho_header_min_bw.jpg',
- 'sancho_footer_min_bw.jpg'
- );
- }
-
- private function sendUploadEmail($bperson_id, $projektarbeit_id, $paabgabetyp_kurzbz, $student_uid) {
-
- $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
-
- $resBetr = $this->ProjektarbeitModel->getProjektbetreuerAnrede($bperson_id);
-
- $projektarbeit_obj = new projektarbeit();
-
- if(!$projektarbeit_obj->load($projektarbeit_id))
- $this->terminateWithError('Ungueltiger Eintrag');
-
- $num_rows_sem = $projektarbeit_obj->projektarbeitIsCurrent($projektarbeit_id);
-
- if( null === $num_rows_sem || false === $num_rows_sem )
- {
- $this->terminateWithError($this->p->t('abgabetool','fehlerAktualitaetProjektarbeit'), 'general');
- }
-
- foreach($resBetr->retval as $betreuerRow) {
-
- // query student benutzer view for every betreuer row
- $studentUser = $this->ProjektarbeitModel->getProjektarbeitBenutzer($student_uid)->retval[0];
-
- // TODO: hasdata, getData etc
-
- // 1. Begutachter mail ohne Token
- $mail_baselink = APP_ROOT."index.ci.php/extensions/FHC-Core-Projektarbeitsbeurteilung/ProjektarbeitsbeurteilungErstbegutachter";
- $mail_fulllink = "$mail_baselink?projektarbeit_id=".$projektarbeit_id."&uid=".$studentUser->uid;
- $projekttyp_kurzbz = $projektarbeit_obj->projekttyp_kurzbz;
- $subject = $projektarbeit_obj->projekttyp_kurzbz == 'Diplom' ? 'Masterarbeitsbetreuung' : 'Bachelorarbeitsbetreuung';
- $abgabetyp = $paabgabetyp_kurzbz == 'end' ? 'Endabgabe' : 'Zwischenabgabe';
-
- $maildata = array();
- $maildata['geehrt'] = "geehrte".($betreuerRow->anrede=="Herr"?"r":"");
- $maildata['anrede'] = $betreuerRow->anrede;
- $maildata['betreuer_voller_name'] = $betreuerRow->first;
- $maildata['student_anrede'] = $studentUser->anrede;
- $maildata['student_voller_name'] = trim($studentUser->titelpre." ".$studentUser->vorname." ".$studentUser->nachname." ".$studentUser->titelpost);
- $maildata['abgabetyp'] = $abgabetyp;
- $maildata['parbeituebersichtlink'] = "Zur Projektarbeitsübersicht
";
- $maildata['bewertunglink'] = $num_rows_sem >= 1 && $paabgabetyp_kurzbz == 'end' ? "Zur Beurteilung der Arbeit
" : "";
- $maildata['token'] = "";
-
- $mailres = sendSanchoMail(
- 'ParbeitsbeurteilungEndupload',
- $maildata,
- $betreuerRow->mitarbeiter_uid."@".DOMAIN,
- $subject,
- 'sancho_header_min_bw.jpg',
- 'sancho_footer_min_bw.jpg',
- get_uid()."@".DOMAIN);
-
- if(!$mailres)
- {
- $this->terminateWithError($this->p->t('abgabetool', 'fehlerMailBegutachter'), 'general');
- }
-
- // 2. Begutachter mail, wenn Endabgabe, mit Token wenn extern
- if ($paabgabetyp_kurzbz == 'end')
- {
- // Zweitbegutachter holen
- $zweitbegutachter = new projektbetreuer();
- $zweitbegutachterRes = $zweitbegutachter->getZweitbegutachterWithToken($bperson_id, $projektarbeit_id, $studentUser->uid);
-
- if ($zweitbegutachterRes)
- {
- $zweitbegutachterResults = $zweitbegutachter->result;
-
- foreach ($zweitbegutachterResults as $begutachter)
- {
- // token generieren, wenn noch nicht vorhanden und notwendig (wird in methode überprüft)
- $tokenGenRes = $zweitbegutachter->generateZweitbegutachterToken($begutachter->person_id, $projektarbeit_id);
-
- if (!$tokenGenRes)
- {
- $this->terminateWithError($this->p->t('abgabetool', 'fehlerMailZweitBegutachter'), 'general');
- }
-
- // Zweitbegutachter (evtl. mit Token) holen
- $zweitbegutachterMitToken = new projektbetreuer();
- $begutachterMitTokenRes = $zweitbegutachterMitToken->getZweitbegutachterWithToken($bperson_id, $projektarbeit_id, $studentUser->uid, $begutachter->person_id);
-
- if (!$begutachterMitTokenRes)
- {
- $this->terminateWithError($this->p->t('abgabetool', 'fehlerMailZweitBegutachter'), 'general');
- }
-
- // Email an Zweitbegutachter senden
- if (isset($zweitbegutachterMitToken->result[0]))
- {
- $begutachterMitToken = $zweitbegutachterMitToken->result[0];
-
- $path = $begutachterMitToken->betreuerart_kurzbz == 'Zweitbegutachter' ? 'ProjektarbeitsbeurteilungZweitbegutachter' : 'ProjektarbeitsbeurteilungErstbegutachter';
- $mail_baselink = APP_ROOT."index.ci.php/extensions/FHC-Core-Projektarbeitsbeurteilung/$path";
- $mail_fulllink = "$mail_baselink?projektarbeit_id=".$projektarbeit_id."&uid=".$studentUser->uid;
- $intern = isset($begutachterMitToken->uid);
- $mail_link = $intern ? $mail_fulllink : $mail_baselink;
-
- $zweitbetmaildata = array();
- $zweitbetmaildata['geehrt'] = "geehrte" . ($begutachterMitToken->anrede == "Herr" ? "r" : "");
- $zweitbetmaildata['anrede'] = $begutachterMitToken->anrede;
- $zweitbetmaildata['betreuer_voller_name'] = $begutachterMitToken->voller_name;
- $zweitbetmaildata['student_anrede'] = $maildata['student_anrede'];
- $zweitbetmaildata['student_voller_name'] = $maildata['student_voller_name'];
- $zweitbetmaildata['abgabetyp'] = $abgabetyp;
- $zweitbetmaildata['parbeituebersichtlink'] = $intern ? $maildata['parbeituebersichtlink'] : "";
- $zweitbetmaildata['bewertunglink'] = $num_rows_sem >= 1 ? "Zur Beurteilung der Arbeit
" : "";
- $zweitbetmaildata['token'] = $num_rows_sem >= 1 && isset($begutachterMitToken->zugangstoken) && !$intern ? "Zugangstoken: " . $begutachterMitToken->zugangstoken . "
" : "";
-
- $mailres = sendSanchoMail(
- 'ParbeitsbeurteilungEndupload',
- $zweitbetmaildata,
- $begutachterMitToken->email,
- $subject,
- 'sancho_header_min_bw.jpg',
- 'sancho_footer_min_bw.jpg',
- get_uid()."@".DOMAIN
- );
-
- if (!$mailres)
- {
- $this->terminateWithError($this->p->t('abgabetool', 'fehlerMailBegutachter'), 'general');
- }
- }
- }
- }
- }
- }
- }
-
- public function getMitarbeiterProjektarbeiten() {
- $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
-
- $boolParamStr = $this->input->get('showall');
- $trueStrings = ['true', '1'];
- $falseStrings = ['false', '0'];
-
- // Handle missing or invalid parameter
- if ($boolParamStr === null) {
- $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
- }
- $boolParamStrLower = strtolower($boolParamStr);
-
- if (in_array($boolParamStrLower, $trueStrings, true)) {
- $showAllBool = true;
- } elseif (in_array($boolParamStrLower, $falseStrings, true)) {
- $showAllBool = false;
- } else {
-// $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
- }
-
- $projektarbeiten = $this->ProjektarbeitModel->getMitarbeiterProjektarbeiten(getAuthUID(), $showAllBool);
-
- $this->terminateWithSuccess(array($projektarbeiten, DOMAIN));
- }
-
- public function postProjektarbeitAbgabe() {
- $projektarbeit_id = $_POST['projektarbeit_id'];
- $paabgabe_id = $_POST['paabgabe_id'];
- $paabgabetyp_kurzbz = $_POST['paabgabetyp_kurzbz'];
- $datum = $_POST['datum'];
- $fixtermin = $_POST['fixtermin'];
- $kurzbz = $_POST['kurzbz'];
-
- if (!isset($projektarbeit_id) || isEmptyString($projektarbeit_id)
- || !isset($paabgabe_id) || isEmptyString($paabgabe_id)
- || !isset($datum) || isEmptyString($datum)
- || !isset($datum) || isEmptyString($datum)
- || !isset($paabgabetyp_kurzbz) || isEmptyString($paabgabetyp_kurzbz))
- $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
-
- $this->load->model('education/Paabgabe_model', 'PaabgabeModel');
-
- if($paabgabe_id == -1) {
- $result = $this->PaabgabeModel->insert(
- array(
- 'projektarbeit_id' => $projektarbeit_id,
- 'paabgabetyp_kurzbz' => $paabgabetyp_kurzbz,
- 'fixtermin' => $fixtermin,
- 'datum' => $datum,
- 'kurzbz' => $kurzbz,
- 'insertvon' => getAuthUID(),
- 'insertamum' => date('Y-m-d H:i:s')
- )
- );
-
- $this->terminateWithSuccess($result);
- } else {
- $result = $this->PaabgabeModel->update(
- $paabgabe_id,
- array(
- 'paabgabetyp_kurzbz' => $paabgabetyp_kurzbz,
- 'datum' => $datum,
- 'kurzbz' => $kurzbz,
- 'updatevon' => getAuthUID(),
- 'updateamum' => date('Y-m-d H:i:s')
- )
- );
-
- $this->terminateWithSuccess($result);
- }
- }
-
- public function deleteProjektarbeitAbgabe() {
- $paabgabe_id = $_POST['paabgabe_id'];
-
- if (!isset($paabgabe_id) || isEmptyString($paabgabe_id))
- $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
-
- $this->load->model('education/Paabgabe_model', 'PaabgabeModel');
-
- $result = $this->PaabgabeModel->load($paabgabe_id);
- $result = $this->getDataOrTerminateWithError($result);
-
- if(count($result) == 0)
- $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
-
- // TODO: berechtigung?
- if($result[0]->insertvon === getAuthUID()) {
- $result = $this->PaabgabeModel->delete($paabgabe_id);
- $result = $this->getDataOrTerminateWithError($result);
- $this->terminateWithSuccess($result);
- }
-
- $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
- }
-
- /**
- * endpoint for adding the same paabgabe for multiple projektarbeiten
- * can be slow for large n since it queries twice per projektarbeit_id
- */
- public function postSerientermin() {
- $projektarbeit_ids = $_POST['projektarbeit_ids'];
- $datum = $_POST['datum'];
- $paabgabetyp_kurzbz = $_POST['paabgabetyp_kurzbz'];
- $bezeichnung = $_POST['bezeichnung'];
- $kurzbz = $_POST['kurzbz'];
-
- if (!isset($projektarbeit_ids) || !is_array($projektarbeit_ids) || empty($projektarbeit_ids)
- || !isset($datum) || isEmptyString($datum)
- || !isset($kurzbz) || isEmptyString($kurzbz)
- || !isset($bezeichnung) || isEmptyString($bezeichnung)
- || !isset($paabgabetyp_kurzbz) || isEmptyString($paabgabetyp_kurzbz))
- $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general');
-
- // old script checks if there already are tbl_paabgabe entries with exact date, type & kurzbz
- // for each termin - good to check that in principle but should not matter in this place. if necessary
- // duplicate abgabetermine can be easily deleted manually, also via cronjob@night.
-
- // since this entry includes the kurzbz string match, it should have only ever mattered when there were
- // multiple users entering the exact same set of (date, type, kurzbz) - which is a much more narrow case than the
- // general "saveMultiple" function should handle
-
- // old script afterwards again queries if user is not the zweitbetreuer of any id - this is blocked in the ui
- // and should never unintentionally happen
-
- // TODO: check berechtigung &/|| zuordnung?
-
- $this->load->model('education/Paabgabe_model', 'PaabgabeModel');
- $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
-
- $res = [];
- foreach ($projektarbeit_ids as $projektarbeit_id) {
-
- $result = $this->PaabgabeModel->insert(
- array(
- 'projektarbeit_id' => $projektarbeit_id,
- 'paabgabetyp_kurzbz' => $paabgabetyp_kurzbz,
- 'fixtermin' => false,
- 'datum' => $datum,
- 'kurzbz' => $kurzbz,
- 'insertvon' => getAuthUID(),
- 'insertamum' => date('Y-m-d H:i:s')
- )
- );
-
- $data = $this->getDataOrTerminateWithError($result);
-
-// $res[] = $data;
-
- // send mail to student
- $result = $this->ProjektarbeitModel->getStudentInfoForProjektarbeitId($projektarbeit_id);
- $data = $this->getDataOrTerminateWithError($result);
-
-// $this->addMeta('emaildata'.$projektarbeit_id, $data);
-
- $datetime = new DateTime($datum);
- $dateEmailFormatted = $datetime->format('d.m.Y');
-
- $anredeFillString = $data[0]->anrede=="Herr"?"r":"";
-
- $fullFormattedNameString = trim($data[0]->titelpre." ".$data[0]->vorname." ".$data[0]->nachname." ".$data[0]->titelpost);
- $res[] = $fullFormattedNameString;
-
- // Prepare mail content
- $body_fields = array(
- 'anrede' => $data[0]->anrede,
- 'anredeFillString' => $anredeFillString,
- 'datum' => $dateEmailFormatted,
- 'bezeichnung' => $bezeichnung,
- 'fullFormattedNameString' => $fullFormattedNameString,
- 'kurzbz' => $kurzbz
- );
-
- $email = $data[0]->uid."@".DOMAIN;
-
- sendSanchoMail(
- 'neuerAbgabetermin',
- $body_fields,
- $email,
- $this->p->t('abgabetool', 'neuerTerminBachelorMasterbetreuung')
- );
- }
-
- $this->terminateWithSuccess($res);
-
- }
-
- public function fetchDeadlines() {
- $person_id = $_POST['person_id'];
-
- if (!isset($person_id) || isEmptyString($person_id))
- $person_id = getAuthPersonId();
-
-
- if($person_id !== getAuthPersonId()) {
- $this->load->library('PermissionLib');
- $isAdmin = $this->permissionlib->isBerechtigt('admin');
- if(!$isAdmin) $this->terminateWithError($this->p->t('ui', 'keineBerechtigung'), 'general');
- }
-
- $this->load->model('education/Paabgabe_model', 'PaabgabeModel');
- $result = $this->PaabgabeModel->getDeadlines($person_id);
- $data = $this->getDataOrTerminateWithError($result);
-
- $this->terminateWithSuccess($data);
- }
}
diff --git a/application/controllers/api/frontend/v1/organisation/Studiensemester.php b/application/controllers/api/frontend/v1/organisation/Studiensemester.php
index bb56ea71a..3c6b72d2f 100644
--- a/application/controllers/api/frontend/v1/organisation/Studiensemester.php
+++ b/application/controllers/api/frontend/v1/organisation/Studiensemester.php
@@ -25,7 +25,8 @@ class Studiensemester extends FHCAPI_Controller
array(
'getAll' => self::PERM_LOGGED,
'getAktNext' => self::PERM_LOGGED,
- 'getStudienjahrByStudiensemester' => self::PERM_LOGGED
+ 'getStudienjahrByStudiensemester' => self::PERM_LOGGED,
+ 'getAllStudiensemesterAndAktOrNext' => self::PERM_LOGGED
)
);
// Load model StudiensemesterModel
@@ -152,4 +153,17 @@ class Studiensemester extends FHCAPI_Controller
$this->terminateWithSuccess((getData(success($studienjahrObj))));
}
+
+ public function getAllStudiensemesterAndAktOrNext() {
+ $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
+
+ $this->StudiensemesterModel->addOrder("start", "DESC");
+ $result = $this->StudiensemesterModel->getAktOrNextSemester();
+ $aktuell = getData($result)[0];
+ $this->StudiensemesterModel->addSelect('*');
+ $result = $this->StudiensemesterModel->load();
+ $studiensemester = getData($result);
+
+ $this->terminateWithSuccess(array($studiensemester, $aktuell));
+ }
}
diff --git a/application/controllers/api/frontend/v1/stv/Student.php b/application/controllers/api/frontend/v1/stv/Student.php
index 943577bb3..2721bbd6f 100644
--- a/application/controllers/api/frontend/v1/stv/Student.php
+++ b/application/controllers/api/frontend/v1/stv/Student.php
@@ -136,14 +136,9 @@ class Student extends FHCAPI_Controller
);
}
$this->PrestudentModel->addSelect(
- "(
- SELECT status_kurzbz
- FROM public.tbl_prestudentstatus pss
- WHERE pss.prestudent_id = public.tbl_prestudent.prestudent_id
- AND pss.studiensemester_kurzbz = " . $this->PrestudentModel->escape($studiensemester_kurzbz) . "
- ORDER BY GREATEST(pss.datum, '0001-01-01') DESC
- LIMIT 1
- ) AS statusofsemester"
+ "public.get_rolle_prestudent(public.tbl_prestudent.prestudent_id, "
+ . $this->PrestudentModel->escape($studiensemester_kurzbz)
+ . ") AS statusofsemester"
);
$this->PrestudentModel->addJoin('public.tbl_student s', 'prestudent_id', 'LEFT');
diff --git a/application/controllers/api/frontend/v1/stv/Students.php b/application/controllers/api/frontend/v1/stv/Students.php
index 9dbea65f2..acacca052 100644
--- a/application/controllers/api/frontend/v1/stv/Students.php
+++ b/application/controllers/api/frontend/v1/stv/Students.php
@@ -801,14 +801,9 @@ class Students extends FHCAPI_Controller
//add status per semester
$this->PrestudentModel->addSelect(
- "(
- SELECT status_kurzbz
- FROM public.tbl_prestudentstatus pss
- WHERE pss.prestudent_id = public.tbl_prestudent.prestudent_id
- AND pss.studiensemester_kurzbz = " . $this->PrestudentModel->escape($studiensemester_kurzbz) . "
- ORDER BY GREATEST(pss.datum, '0001-01-01') DESC
- LIMIT 1
- ) AS statusofsemester"
+ "public.get_rolle_prestudent(public.tbl_prestudent.prestudent_id, "
+ . $this->PrestudentModel->escape($studiensemester_kurzbz)
+ . ") AS statusofsemester"
);
$this->addSelectPrioRel();
@@ -897,14 +892,9 @@ class Students extends FHCAPI_Controller
//add status per semester
$this->PrestudentModel->addSelect(
- "(
- SELECT status_kurzbz
- FROM public.tbl_prestudentstatus pss
- WHERE pss.prestudent_id = public.tbl_prestudent.prestudent_id
- AND pss.studiensemester_kurzbz = " . $this->PrestudentModel->escape($studiensemester_kurzbz) . "
- ORDER BY GREATEST(pss.datum, '0001-01-01') DESC
- LIMIT 1
- ) AS statusofsemester"
+ "public.get_rolle_prestudent(public.tbl_prestudent.prestudent_id, "
+ . $this->PrestudentModel->escape($studiensemester_kurzbz)
+ . ") AS statusofsemester"
);
$this->PrestudentModel->addSelect('UPPER(stg.typ || stg.kurzbz) AS studiengang');
diff --git a/application/controllers/api/frontend/v1/stv/Vertrag.php b/application/controllers/api/frontend/v1/stv/Vertrag.php
index f94fe795e..c2b0f713c 100644
--- a/application/controllers/api/frontend/v1/stv/Vertrag.php
+++ b/application/controllers/api/frontend/v1/stv/Vertrag.php
@@ -76,9 +76,7 @@ class Vertrag extends FHCAPI_Controller
if (isError($allOe)) $this->terminateWithError(getError($allOe), self::ERROR_TYPE_GENERAL);
- $allOe = hasData($allOe) ? getData($allOe) : [];
-
- $this->addMeta('oe', $allOe);
+ $allOe = hasData($allOe) ? array_column(getData($allOe), 'oe_kurzbz') : [];
// * then check if the user has permissions to cancel the corresponding lv-organisational units
if (!$this->permissionlib->isBerechtigtMultipleOe('admin', $allOe, 'suid') &&
diff --git a/application/controllers/jobs/AbgabetoolJob.php b/application/controllers/jobs/AbgabetoolJob.php
new file mode 100644
index 000000000..51b2b4920
--- /dev/null
+++ b/application/controllers/jobs/AbgabetoolJob.php
@@ -0,0 +1,621 @@
+_ci =& get_instance();
+
+ $this->_ci->load->helper('hlp_sancho_helper');
+
+ $this->_ci->load->model('education/Projektarbeit_model', 'ProjektarbeitModel');
+ $this->_ci->load->model('education/Projektbetreuer_model', 'ProjektbetreuerModel');
+ $this->_ci->load->model('education/Paabgabe_model', 'PaabgabeModel');
+ $this->_ci->load->model('crm/Student_model', 'StudentModel');
+ $this->_ci->load->model('organisation/Studiengang_model', 'StudiengangModel');
+ $this->_ci->load->model('organisation/Organisationseinheit_model', 'OrganisationseinheitModel');
+
+ $this->_ci->load->config('abgabe');
+ $this->loadPhrases([
+ 'abgabetool'
+ ]);
+ }
+
+ public function notifyAssistenzAboutChangedAbgaben() {
+
+ $this->_ci->logInfo('Start job FHC-Core->notifyAssistenzAboutChangedAbgaben');
+
+ $interval = $this->_ci->config->item('PAABGABE_EMAIL_JOB_INTERVAL');
+ $relevantTypes = $this->_ci->config->item('RELEVANT_PAABGABETYPEN_SAMMELMAIL_ASSISTENZ');
+ // get all new or changed termine in interval
+ $result = $this->_ci->PaabgabeModel->findAbgabenNewOrUpdatedSince($interval, $relevantTypes);
+
+ $retval = getData($result);
+
+ if(count($retval) == 0) {
+ $this->_ci->logInfo("Keine Emails an Assistenzen über neue oder veränderte Termine versandt");
+ return;
+ }
+
+ // group changed/new abgaben for projektarbeiten
+ $projektarbeiten = [];
+ foreach($retval as $newOrChangedAbgabe) {
+ // Check if the current item has a 'projektarbeit_id' field.
+ // Replace 'projektarbeit_id' with the actual key name if it's different.
+ if (isset($newOrChangedAbgabe->projektarbeit_id)) {
+ $projektarbeitId = $newOrChangedAbgabe->projektarbeit_id;
+
+ // If the 'projektarbeit_id' is not yet a key in $projektarbeiten,
+ // initialize it as an empty array.
+ if (!isset($projektarbeiten[$projektarbeitId])) {
+ $projektarbeiten[$projektarbeitId] = [];
+ }
+
+ // Add the current row to the array associated with its 'projektarbeit_id'.
+ $projektarbeiten[$projektarbeitId][] = $newOrChangedAbgabe;
+ }
+ }
+
+ // for each projektarbeit fetch their assistenz and same them in their own dictionary to avoid too many mails
+ $assistenzMap = [];
+ // for each projektarbeit fetch their betreuer and save them in their own dictionary to avoid too many mails
+ $projektarbeitBetreuerMap = [];
+ forEach($projektarbeiten as $projektarbeit_id => $abgaben) {
+
+ $assistenzResult = $this->_ci->OrganisationseinheitModel->getAssistenzForOE($abgaben[0]->stg_oe_kurzbz);
+
+ forEach($assistenzResult->retval as $assistenzRow) {
+ if (!isset($assistenzMap[$assistenzRow->person_id])) {
+ $assistenzMap[$assistenzRow->person_id] = [];
+ }
+
+ // Add the current $assistenzRow to the $assistenzMap as an array associated with its projektarbeit_id.
+ $assistenzMap[$assistenzRow->person_id][] = [$projektarbeit_id, $assistenzRow];
+ }
+
+ $betreuerResult = $this->_ci->ProjektbetreuerModel->getAllBetreuerOfProjektarbeit($projektarbeit_id);
+
+ forEach($betreuerResult->retval as $betreuerRow) {
+ if (!isset($projektarbeitBetreuerMap[$projektarbeit_id])) {
+ $projektarbeitBetreuerMap[$projektarbeit_id] = [];
+ }
+
+ // Add the current betreuerRow to the betreuerMap as an array associated with its projektarbeit_id.
+ $projektarbeitBetreuerMap[$projektarbeit_id][] = $betreuerRow;
+ }
+ }
+
+ $count = 0;
+ foreach($assistenzMap as $assistenz_person_id => $tupelArr) {
+
+ $abgabenString = '';
+
+ foreach($tupelArr as $tupel) {
+ $projektarbeit_id = $tupel[0];
+ $assistenzRow = $tupel[1];
+
+ $betreuerArray = $projektarbeitBetreuerMap[$projektarbeit_id] ?? [];
+ $changedAbgaben = $projektarbeiten[$projektarbeit_id];
+
+ $relevantAbgaben = array_values(array_filter($changedAbgaben, function($abgabetermin) use ($assistenzRow) {
+ if($abgabetermin->updatevon == null && $abgabetermin->insertvon != $assistenzRow->uid) {
+ return $abgabetermin;
+ } else if($abgabetermin->updatevon != null && $abgabetermin->updatevon != $assistenzRow->uid) {
+ return $abgabetermin;
+ }
+ }));
+
+ if(count($relevantAbgaben) == 0) {
+ continue;
+ }
+
+ // Format the Student Name
+ $s = $relevantAbgaben[0];
+ $nameParts = [];
+ if (!empty($s->titelpre)) $nameParts[] = $s->titelpre;
+ $nameParts[] = $s->vorname;
+ $nameParts[] = $s->nachname;
+ if (!empty($s->titelpost)) $nameParts[] = $s->titelpost;
+ $studentFullName = implode(' ', $nameParts);
+
+ // Format the Supervisors string
+ $betreuerStrings = [];
+ foreach($betreuerArray as $b) {
+ $bNameParts = [];
+ if (!empty($b->titelpre)) $bNameParts[] = $b->titelpre;
+ $bNameParts[] = $b->vorname;
+ $bNameParts[] = $b->nachname;
+ if (!empty($b->titelpost)) $bNameParts[] = $b->titelpost;
+
+ $bFullName = implode(' ', $bNameParts);
+ $betreuerStrings[] = "{$bFullName} ({$b->betreuerart_kurzbz})";
+ }
+ $allBetreuerFormatted = implode(', ', $betreuerStrings);
+
+ $projektarbeit_titel = $s->titel ?? 'Kein Titel vergeben';
+
+ // Project Header Section
+ $abgabenString .= "
+
+
Projekt: {$projektarbeit_titel}
+
+ Studierende/r: {$studentFullName}
+
+
+ Betreuer: {$allBetreuerFormatted}
+
+
+ ID: {$projektarbeit_id} | Stg: {$s->stgtyp}{$s->stgkz} ({$s->studiensemester_kurzbz})
+
+
";
+
+ // Start Table
+ $abgabenString .= '
+
+
+
+ Zieldatum
+ Bezeichnung
+
+
+ ';
+
+ foreach ($relevantAbgaben as $abgabe) {
+ $dateEmailFormatted = (new DateTime($abgabe->datum))->format('d.m.Y');
+ $abgabedatumFormatted = (new DateTime($abgabe->abgabedatum))->format('d.m.Y');
+ $kurzbzLine = !empty($abgabe->kurzbz) ? "{$abgabe->kurzbz} " : "";
+
+ $abgabenString .= "
+
+ {$dateEmailFormatted}
+
+ {$abgabe->bezeichnung} {$kurzbzLine}
+
+ ";
+ }
+
+ $abgabenString .= '
';
+ }
+
+ $abgabenString .= '
';
+
+ // done with building the change list, now send it
+ $assistenzRow = $tupelArr[0][1];
+ $anrede = $assistenzRow->anrede;
+ $anredeFillString = $assistenzRow->anrede == "Herr" ? "r" : "";
+ $fullFormattedNameString = $assistenzRow->first;
+
+
+
+ $path = $this->_ci->config->item('URL_ASSISTENZ');
+ $url = CIS_ROOT.$path;
+
+ $body_fields = array(
+ 'anrede' => $anrede,
+ 'anredeFillString' => $anredeFillString,
+ 'fullFormattedNameString' => $fullFormattedNameString,
+ 'abgabenString' => $abgabenString,
+ 'linkAbgabetool' => $url
+ );
+
+ $email = $assistenzRow->uid."@".DOMAIN;
+
+ // send email with bundled info
+ sendSanchoMail(
+ 'PAAChangesAssSM',
+ $body_fields,
+ $email,
+ $this->p->t('abgabetool', 'changedAbgabeterminev2')
+ );
+
+ $count++;
+ }
+
+ $this->_ci->logInfo($count . " Emails erfolgreich versandt");
+ $this->_ci->logInfo('End job FHC-Core->notifyAssistenzAboutChangedAbgaben');
+ }
+
+ public function notifyBetreuerAboutChangedAbgaben() {
+
+ $this->_ci->logInfo('Start job FHC-Core->notifyBetreuerAboutChangedAbgaben');
+
+ $interval = $this->_ci->config->item('PAABGABE_EMAIL_JOB_INTERVAL');
+
+ $relevantTypes = $this->_ci->config->item('RELEVANT_PAABGABETYPEN_SAMMELMAIL_BETREUER');
+
+ // get all new or changed termine in interval
+ $result = $this->_ci->PaabgabeModel->findAbgabenNewOrUpdatedSince($interval, $relevantTypes);
+ $retval = getData($result);
+
+ if(count($retval) == 0) {
+ $this->_ci->logInfo("Keine Emails an Betreuer über neue oder veränderte Termine versandt");
+ return;
+ }
+
+ // group changed/new abgaben for projektarbeiten
+ $projektarbeiten = [];
+ foreach($retval as $newOrChangedAbgabe) {
+ // Check if the current item has a 'projektarbeit_id' field.
+ // Replace 'projektarbeit_id' with the actual key name if it's different.
+ if (isset($newOrChangedAbgabe->projektarbeit_id)) {
+ $projektarbeitId = $newOrChangedAbgabe->projektarbeit_id;
+
+ // If the 'projektarbeit_id' is not yet a key in $projektarbeiten,
+ // initialize it as an empty array.
+ if (!isset($projektarbeiten[$projektarbeitId])) {
+ $projektarbeiten[$projektarbeitId] = [];
+ }
+
+ // Add the current row to the array associated with its 'projektarbeit_id'.
+ $projektarbeiten[$projektarbeitId][] = $newOrChangedAbgabe;
+ }
+ }
+
+ // for each projektarbeit fetch their betreuer and save them in their own dictionary to avoid too many mails
+ $betreuerMap = [];
+ forEach($projektarbeiten as $projektarbeit_id => $abgaben) {
+ $betreuerResult = $this->_ci->ProjektbetreuerModel->getAllBetreuerOfProjektarbeit($projektarbeit_id);
+
+ forEach($betreuerResult->retval as $betreuerRow) {
+ if (!isset($betreuerMap[$betreuerRow->person_id])) {
+ $betreuerMap[$betreuerRow->person_id] = [];
+ }
+
+ // Add the current betreuerRow to the betreuerMap as an array associated with its projektarbeit_id.
+ $betreuerMap[$betreuerRow->person_id][] = [$projektarbeit_id, $betreuerRow];
+ }
+ }
+
+ $count = 0;
+ // now iterate over the betreuerMap and build 1 email about all projektarbeiten and their new/changed termine
+ // $tupel = [$projektarbeit_id, $betreuerRow], each betreuer has 0..n [projektarbeit_id, changedAbgaben] tupel
+ forEach($betreuerMap as $betreuer_person_id => $tupelArr) {
+
+ // start the container
+ $abgabenString = '';
+
+ $result = $this->_ci->ProjektarbeitModel->getProjektbetreuerAnrede($betreuer_person_id);
+ $data = getData($result)[0];
+
+ $anrede = $data->anrede;
+ $anredeFillString = $data->anrede == "Herr" ? "r" : "";
+ $fullFormattedNameString = $data->first;
+
+ forEach($tupelArr as $tupel) {
+ $projektarbeit_id = $tupel[0];
+ $betreuerRow = $tupel[1];
+
+ $changedAbgaben = $projektarbeiten[$projektarbeit_id];
+
+ $relevantAbgaben = array_values(array_filter($changedAbgaben, function($abgabetermin) use ($betreuerRow) {
+ if($abgabetermin->updatevon == null && $abgabetermin->insertvon != $betreuerRow->uid) {
+ return $abgabetermin;
+ } else if($abgabetermin->updatevon != null && $abgabetermin->updatevon != $betreuerRow->uid) {
+ return $abgabetermin;
+ }
+ }));
+
+ if(count($relevantAbgaben) == 0) {
+ continue;
+ }
+
+ // format the Student Name
+ $s = $relevantAbgaben[0];
+ $nameParts = [];
+ if (!empty($s->titelpre)) $nameParts[] = $s->titelpre;
+ $nameParts[] = $s->vorname;
+ $nameParts[] = $s->nachname;
+ if (!empty($s->titelpost)) $nameParts[] = $s->titelpost;
+ $studentFullName = implode(' ', $nameParts);
+
+ $projektarbeit_titel = $s->titel ?? 'Kein Titel vergeben';
+
+ // project header section
+ $abgabenString .= "
+
+
Projekt: {$projektarbeit_titel}
+
+ Studierende/r: {$studentFullName}
+
+
+ ID: {$projektarbeit_id} | Rolle: {$betreuerRow->betreuerart_kurzbz} |
+ Stg: {$s->stgtyp}{$s->stgkz} ({$s->studiensemester_kurzbz})
+
+
";
+
+ // start table
+ $abgabenString .= '
+
+
+
+ Zieldatum
+ Bezeichnung
+
+
+ ';
+
+ foreach ($relevantAbgaben as $abgabe) {
+ $dateEmailFormatted = (new DateTime($abgabe->datum))->format('d.m.Y');
+ $abgabedatumFormatted = (new DateTime($abgabe->abgabedatum))->format('d.m.Y');
+ $kurzbzLine = !empty($abgabe->kurzbz) ? "{$abgabe->kurzbz} " : "";
+
+ $abgabenString .= "
+
+ {$dateEmailFormatted}
+
+ {$abgabe->bezeichnung} {$kurzbzLine}
+
+ ";
+ }
+
+ $abgabenString .= '
';
+ }
+
+ // close container
+ $abgabenString .= '
';
+
+ // done with building the change list, now send it
+ $betreuerRow = $tupelArr[0][1];
+
+ $path = $this->_ci->config->item('URL_MITARBEITER');
+ $url = CIS_ROOT.$path;
+
+ $body_fields = array(
+ 'anrede' => $anrede,
+ 'anredeFillString' => $anredeFillString,
+ 'fullFormattedNameString' => $fullFormattedNameString,
+ 'abgabenString' => $abgabenString,
+ 'linkAbgabetool' => $url
+ );
+
+ $email = $betreuerRow->uid ? $betreuerRow->uid."@".DOMAIN : $betreuerRow->private_email;
+
+ // send email with bundled info
+ sendSanchoMail(
+ 'PAAChangesBetSM',
+ $body_fields,
+ $email,
+ $this->p->t('abgabetool', 'changedAbgabeterminev2')
+ );
+
+ $count++;
+ }
+
+ $this->_ci->logInfo($count . " Emails erfolgreich versandt");
+ $this->_ci->logInfo('End job FHC-Core->notifyBetreuerAboutChangedAbgaben');
+ }
+
+ public function notifyBetreuerMail() {
+ // send all new projektarbeit abgabe UPLOADS since the last job run to the related betreuer
+ // this job gathers all new or changed file uploads via field 'abgabedatum', enduploads still
+ // send an email directly after happening since they are kind of important
+
+ $this->_ci->logInfo('Start job FHC-Core->notifyBetreuerMail');
+
+ // dont filter for relevant types since this mail should gather all UPLOAD info
+
+ $interval = $this->_ci->config->item('PAABGABE_EMAIL_JOB_INTERVAL');
+
+ $result = $this->_ci->PaabgabeModel->findAbgabenNewOrUpdatedSinceByAbgabedatum($interval);
+ $retval = getData($result);
+
+ // retval are paabgaben joined with projektarbeit and betreuer
+ if(count($retval) == 0) {
+ $this->logInfo("Keine Emails über neue Paabgaben an Betreuer versandt");
+ return;
+ }
+
+ // group contents per betreuer person_id
+ $betreuer_uids = [];
+ forEach($retval as $paabgabe) {
+ if(!isset($betreuer_uids[$paabgabe->person_id])) {
+ $betreuer_uids[$paabgabe->person_id] = [];
+ }
+
+ $betreuer_uids[$paabgabe->person_id][] = $paabgabe;
+ }
+
+ $count = 0;
+ forEach ($betreuer_uids as $person_id => $abgaben) {
+ // $person_id is from betreuer
+
+ $result = $this->_ci->ProjektarbeitModel->getProjektbetreuerAnrede($person_id);
+ $data = getData($result)[0];
+
+ $anrede = $data->anrede;
+ $anredeFillString = $data->anrede == "Herr" ? "r" : "";
+ $fullFormattedNameString = $data->first;
+
+ // sorting $abgaben array by datum
+ usort($abgaben, function ($a, $b) {
+ return strtotime($a->datum) <=> strtotime($b->datum);
+ });
+
+ $projektarbeit_titel = $abgaben[0]->titel;
+
+ // initialize the table and headers
+ $abgabenString = '
+
+
+
+ Zieldatum
+ Studierende/r
+ Bezeichnung
+ Abgabedatum
+
+
+ ';
+
+ foreach ($abgaben as $abgabe) {
+ // format the student name
+ $nameParts = [];
+ if (!empty($abgabe->titelpre)) $nameParts[] = $abgabe->titelpre;
+ $nameParts[] = $abgabe->vorname;
+ $nameParts[] = $abgabe->nachname;
+ if (!empty($abgabe->titelpost)) $nameParts[] = $abgabe->titelpost;
+ $studentFullName = implode(' ', $nameParts);
+
+ // format dates inline
+ $dateEmailFormatted = (new DateTime($abgabe->datum))->format('d.m.Y');
+ $abgabedatumFormatted = (new DateTime($abgabe->abgabedatum))->format('d.m.Y');
+
+ // handle the optional Kurzbezeichnung
+ $kurzbzLine = !empty($abgabe->kurzbz) ? "{$abgabe->kurzbz} " : "";
+
+ $abgabenString .= "
+
+ {$dateEmailFormatted}
+ {$studentFullName}
+
+ {$abgabe->bezeichnung} {$kurzbzLine}
+
+ {$abgabedatumFormatted}
+ ";
+ }
+
+ $abgabenString .= '
';
+
+ $path = $this->_ci->config->item('URL_MITARBEITER');
+ $url = CIS_ROOT.$path;
+
+ $body_fields = array(
+ 'anrede' => $anrede,
+ 'anredeFillString' => $anredeFillString,
+ 'fullFormattedNameString' => $fullFormattedNameString,
+ 'paTitel' => $projektarbeit_titel,
+ 'abgabenString' => $abgabenString,
+ 'linkAbgabetool' => $url
+ );
+
+ $result = $this->_ci->ProjektbetreuerModel->getBetreuerOfProjektarbeit($abgaben[0]->projektarbeit_id, $abgaben[0]->betreuerart_kurzbz);
+ $data = getData($result)[0];
+
+ $email = $data->uid ? $data->uid."@".DOMAIN : $data->private_email;
+
+ // send email with bundled info
+ sendSanchoMail(
+ 'PaabgabeUpdatesBetSM',
+ $body_fields,
+ $email,
+ $this->p->t('abgabetool', 'changedAbgabeterminev2')
+ );
+
+ $count++;
+ }
+
+ $this->_ci->logInfo($count . " Emails erfolgreich versandt");
+ $this->_ci->logInfo('End job FHC-Core->notifyBetreuerMail');
+ }
+
+ public function notifyStudentMail()
+ {
+ // send all new projektarbeit abgabe since the last job run to the related student
+
+ $this->_ci->logInfo('Start job FHC-Core->notifyStudentMail');
+
+ $interval = $this->_ci->config->item('PAABGABE_EMAIL_JOB_INTERVAL');
+
+ $relevantTypes = $this->_ci->config->item('RELEVANT_PAABGABETYPEN_SAMMELMAIL_STUDENT');
+
+ $result = $this->_ci->PaabgabeModel->findAbgabenNewOrUpdatedSince($interval, $relevantTypes);
+ $retval = getData($result);
+
+ if(count($retval) == 0) {
+ $this->_ci->logInfo("Keine Emails an Studenten versandt");
+ return;
+ }
+
+ // group results per projektarbeit/student_uid
+ $student_uids = [];
+ forEach($retval as $paabgabe) {
+ if(!isset($student_uids[$paabgabe->student_uid])) {
+ $student_uids[$paabgabe->student_uid] = [];
+ }
+
+ $student_uids[$paabgabe->student_uid][] = $paabgabe;
+ }
+
+ $count = 0;
+ foreach ($student_uids as $uid => $abgaben) {
+ // $uid is the student's UID
+ $result = $this->_ci->StudentModel->getEmailAnredeForStudentUID($uid);
+ $data = getData($result)[0];
+
+ // $abgabe is the array of paabgabe objects
+ $anredeFillString = $data->anrede=="Herr"?"r":"";
+ $fullFormattedNameString = trim($data->titelpre." ".$data->vorname." ".$data->vornamen." ".$data->nachname." ".$data->titelpost);
+
+ // https://www.php.net/manual/en/migration70.new-features.php#migration70.new-features.spaceship-op
+ // php has spaceships 🚀🚀🚀🚀🚀
+ usort($abgaben, function($a, $b) {
+ return strtotime($a->datum) <=> strtotime($b->datum);
+ });
+
+ $projektarbeit_titel = $abgaben[0]->titel;
+
+ // initialize the table and headers
+ $abgabenString = '
+
+
+
+ Zieldatum
+ Bezeichnung / Hinweis
+
+
+ ';
+
+ foreach ($abgaben as $abgabe) {
+ $dateEmailFormatted = (new DateTime($abgabe->datum))->format('d.m.Y');
+
+ // handle the optional Kurzbezeichnung
+ $kurzbzLine = !empty($abgabe->kurzbz) ? "{$abgabe->kurzbz} " : "";
+
+ $abgabenString .= "
+
+
+ {$dateEmailFormatted}
+
+
+ {$abgabe->bezeichnung} {$kurzbzLine}
+
+ ";
+ }
+
+ $abgabenString .= '
';
+
+ $route = $this->_ci->config->item('URL_STUDENTS');
+ $url = CIS_ROOT.$route;
+
+ $body_fields = array(
+ 'anrede' => $data->anrede,
+ 'anredeFillString' => $anredeFillString,
+ 'fullFormattedNameString' => $fullFormattedNameString,
+ 'paTitel' => $projektarbeit_titel,
+ 'abgabenString' => $abgabenString,
+ 'linkAbgabetool' => $url
+ );
+
+ // send email with bundled info
+ sendSanchoMail(
+ 'PaabgabeUpdatesSammelmail',
+ $body_fields,
+ $uid.'@'.DOMAIN,
+ $this->p->t('abgabetool', 'changedAbgabeterminev2')
+ );
+
+ $count++;
+
+ }
+
+ $this->_ci->logInfo($count . " Emails erfolgreich versandt");
+ $this->_ci->logInfo('End job FHC-Core->notifyStudentMail');
+ }
+}
\ No newline at end of file
diff --git a/application/core/FHCAPI_Controller.php b/application/core/FHCAPI_Controller.php
index dad56334d..e81506d4b 100644
--- a/application/core/FHCAPI_Controller.php
+++ b/application/core/FHCAPI_Controller.php
@@ -266,7 +266,7 @@ class FHCAPI_Controller extends Auth_Controller
}
// ---------------------------------------------------------------
- // Security
+ // Security Begin
// ---------------------------------------------------------------
/**
@@ -287,4 +287,31 @@ class FHCAPI_Controller extends Auth_Controller
'required_permissions' => $this->_rpsToString($requiredPermissions, $this->router->method)
], self::ERROR_TYPE_AUTH);
}
+
+ // ---------------------------------------------------------------
+ // Security End
+ // ---------------------------------------------------------------
+
+ /**
+ * Checks the client's total request size (Content-Length) against the minimum
+ * effective PHP limit (min of upload_max_filesize, post_max_size, memory_limit).
+ * This preempts failures that result in vague "missing parameters" errors on large files.
+ *
+ * @return void
+ */
+ protected function checkUploadSize() {
+ // this number represents bytes
+ $content_length_bytes = (int)$this->input->server('CONTENT_LENGTH');
+ $content_length = $content_length_bytes / 1000000;
+
+ //get max serverside size upload -> this comes in megabytes
+ $max_upload = (int)(ini_get('upload_max_filesize'));
+ $max_post = (int)(ini_get('post_max_size'));
+ $memory_limit = (int)(ini_get('memory_limit'));
+ $max_upload_mb = min($max_upload, $max_post, $memory_limit); // smallest of 3 config values
+
+ if($content_length >= $max_upload_mb) {
+ $this->terminateWithError($this->p->t('global', 'filesizeExceeded'), 'general');
+ }
+ }
}
diff --git a/application/models/crm/Student_model.php b/application/models/crm/Student_model.php
index ca9cfe4c3..ab073996f 100644
--- a/application/models/crm/Student_model.php
+++ b/application/models/crm/Student_model.php
@@ -279,4 +279,12 @@ class Student_model extends DB_Model
{
return $student_uid . '@' . DOMAIN;
}
+
+ public function getEmailAnredeForStudentUID($student_uid) {
+ $qry = "SELECT anrede, titelpre, vorname, vornamen, nachname, titelpost
+ FROM campus.vw_student
+ WHERE uid = ?";
+
+ return $this->execReadOnlyQuery($qry, array($student_uid));
+ }
}
diff --git a/application/models/education/Note_model.php b/application/models/education/Note_model.php
index 80b454398..87a1501e0 100644
--- a/application/models/education/Note_model.php
+++ b/application/models/education/Note_model.php
@@ -11,4 +11,12 @@ class Note_model extends DB_Model
$this->dbTable = 'lehre.tbl_note';
$this->pk = 'note';
}
+
+ public function getAllActive() {
+ $qry ="SELECT *
+ FROM lehre.tbl_note
+ WHERE aktiv = true";
+
+ return $this->execReadOnlyQuery($qry);
+ }
}
\ No newline at end of file
diff --git a/application/models/education/Paabgabe_model.php b/application/models/education/Paabgabe_model.php
index 343a86706..a883043d3 100644
--- a/application/models/education/Paabgabe_model.php
+++ b/application/models/education/Paabgabe_model.php
@@ -60,5 +60,58 @@ class Paabgabe_model extends DB_Model
return $this->execReadOnlyQuery($qry, array($person_id));
}
+
+ public function findAbgabenNewOrUpdatedSince($interval, $relevantTypes)
+ {
+
+ $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,
+ public.tbl_person.anrede, public.tbl_person.titelpre, public.tbl_person.vorname, public.tbl_person.nachname, public.tbl_person.titelpost
+ FROM campus.tbl_paabgabe
+ JOIN campus.tbl_paabgabetyp USING (paabgabetyp_kurzbz)
+ JOIN lehre.tbl_projektarbeit USING (projektarbeit_id)
+ JOIN lehre.tbl_lehreinheit using(lehreinheit_id)
+ JOIN lehre.tbl_lehrveranstaltung using(lehrveranstaltung_id)
+ JOIN public.tbl_studiengang on(lehre.tbl_lehrveranstaltung.studiengang_kz = public.tbl_studiengang.studiengang_kz)
+ JOIN public.tbl_benutzer ON (public.tbl_benutzer.uid = student_uid)
+ JOIN public.tbl_person USING (person_id)
+
+ WHERE (campus.tbl_paabgabe.insertamum >= NOW() - INTERVAL ?
+ OR campus.tbl_paabgabe.updateamum >= NOW() - INTERVAL ?)
+ AND campus.tbl_paabgabe.paabgabetyp_kurzbz IN ?";
+
+ 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
+
+ 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)
+
+ WHERE campus.tbl_paabgabe.abgabedatum IS NOT NULL
+ AND campus.tbl_paabgabe.abgabedatum >= NOW() - INTERVAL ?
+ ORDER BY abgabedatum DESC
+ ";
+
+ return $this->execQuery($query, [$interval]);
+ }
+ public function loadByIDs($paabgabe_ids) {
+ $qry = "SELECT * FROM campus.tbl_paabgabe WHERE paabgabe_id IN ?";
+
+ return $this->execReadOnlyQuery($qry, [$paabgabe_ids]);
+ }
}
diff --git a/application/models/education/Paabgabetyp_model.php b/application/models/education/Paabgabetyp_model.php
index b672a3f0e..034daca44 100644
--- a/application/models/education/Paabgabetyp_model.php
+++ b/application/models/education/Paabgabetyp_model.php
@@ -11,4 +11,10 @@ class Paabgabetyp_model extends DB_Model
$this->dbTable = 'campus.tbl_paabgabetyp';
$this->pk = 'paabgabetyp_kurzbz';
}
+
+ public function getAll() {
+ $qry = "SELECT * FROM campus.tbl_paabgabetyp ORDER BY bezeichnung";
+
+ return $this->execReadOnlyQuery($qry);
+ }
}
diff --git a/application/models/education/Projektarbeit_model.php b/application/models/education/Projektarbeit_model.php
index 193446402..5e453056d 100644
--- a/application/models/education/Projektarbeit_model.php
+++ b/application/models/education/Projektarbeit_model.php
@@ -109,36 +109,36 @@ class Projektarbeit_model extends DB_Model
*/
public function getStudentProjektarbeitenWithBetreuer($studentUID)
{
- $betreuerQuery = "
- SELECT
+ $betreuerQuery = "SELECT * FROM (SELECT DISTINCT ON(projektarbeit_id)
vorname as bvorname,
nachname as bnachname,
titelpre as btitelpre,
titelpost AS btitelpost,
- titelpost AS btitelpost,
tbl_betreuerart.beschreibung AS betreuerart_beschreibung,
- (SELECT person_id
- FROM lehre.tbl_projektbetreuer
+ (SELECT person_id
+ FROM lehre.tbl_projektbetreuer
WHERE projektarbeit_id=tbl_projektarbeit.projektarbeit_id
- AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter') LIMIT 1) AS zweitbetreuer_person_id,
- (SELECT betreuerart_kurzbz
- FROM lehre.tbl_projektbetreuer
+ AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter') LIMIT 1) AS zweitbetreuer_person_id,
+ (SELECT betreuerart_kurzbz
+ FROM lehre.tbl_projektbetreuer
WHERE projektarbeit_id=tbl_projektarbeit.projektarbeit_id
- AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter') LIMIT 1) AS zweitbetreuer_betreuerart_kurzbz,
- (SELECT tbl_betreuerart.beschreibung
- FROM lehre.tbl_projektbetreuer JOIN lehre.tbl_betreuerart USING(betreuerart_kurzbz)
+ AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter') LIMIT 1) AS zweitbetreuer_betreuerart_kurzbz,
+ (SELECT tbl_betreuerart.beschreibung
+ FROM lehre.tbl_projektbetreuer JOIN lehre.tbl_betreuerart USING(betreuerart_kurzbz)
WHERE projektarbeit_id=tbl_projektarbeit.projektarbeit_id
- AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied') LIMIT 1) AS zweitbetreuer_betreuerart_beschreibung,
-
+ AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied') LIMIT 1) AS zweitbetreuer_betreuerart_beschreibung,
+
tbl_betreuerart.betreuerart_kurzbz,
person_id as bperson_id,
projektarbeit_id,
lehre.tbl_projekttyp.bezeichnung as projekttypbezeichnung,
+ lehre.tbl_projekttyp.projekttyp_kurzbz as projekttypkurzbz,
lehre.tbl_lehreinheit.studiensemester_kurzbz,
lehre.tbl_lehrveranstaltung.studiengang_kz,
public.tbl_studiengang.kurzbzlang,
- lehre.tbl_projektbetreuer.note as note,
+ lehre.tbl_projektarbeit.note as note,
+ lehre.tbl_note.bezeichnung as note_bezeichnung,
public.tbl_mitarbeiter.mitarbeiter_uid,
lehre.tbl_projektarbeit.titel as titel,
lehre.tbl_projektarbeit.sprache as sprache,
@@ -147,9 +147,8 @@ class Projektarbeit_model extends DB_Model
lehre.tbl_projektarbeit.schlagwoerter as schlagwoerter,
lehre.tbl_projektarbeit.schlagwoerter_en as schlagwoerter_en,
lehre.tbl_projektarbeit.abstract as abstract,
- lehre.tbl_projektarbeit.abstract_en as abstract_en,
- (SELECT abgeschicktvon FROM extension.tbl_projektarbeitsbeurteilung WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id AND betreuer_person_id = tbl_projektbetreuer.person_id) AS babgeschickt,
- (SELECT abgeschicktvon FROM extension.tbl_projektarbeitsbeurteilung WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter') LIMIT 1) AS zweitbetreuer_abgeschickt,
+ lehre.tbl_projektarbeit.abstract_en as abstract_en,
+ lehre.tbl_projektarbeit.insertamum as insertamum,
(SELECT datum FROM campus.tbl_paabgabe WHERE paabgabetyp_kurzbz = 'end' AND abgabedatum IS NOT NULL AND projektarbeit_id = tbl_projektarbeit.projektarbeit_id LIMIT 1) AS abgegeben
FROM lehre.tbl_projektarbeit
@@ -158,15 +157,17 @@ class Projektarbeit_model extends DB_Model
LEFT JOIN public.tbl_benutzer USING(person_id)
LEFT JOIN lehre.tbl_projekttyp USING (projekttyp_kurzbz)
LEFT JOIN lehre.tbl_betreuerart USING(betreuerart_kurzbz)
- LEFT JOIN lehre.tbl_lehreinheit USING(lehreinheit_id)
- LEFT JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id)
- LEFT JOIN public.tbl_mitarbeiter ON(public.tbl_mitarbeiter.mitarbeiter_uid = public.tbl_benutzer.uid)
- LEFT JOIN public.tbl_studiengang USING(studiengang_kz)
- WHERE
- tbl_projektarbeit.student_uid = ? AND
+ LEFT JOIN lehre.tbl_lehreinheit USING(lehreinheit_id)
+ LEFT JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id)
+ LEFT JOIN public.tbl_mitarbeiter ON(public.tbl_mitarbeiter.mitarbeiter_uid = public.tbl_benutzer.uid)
+ LEFT JOIN public.tbl_studiengang USING(studiengang_kz)
+ LEFT JOIN lehre.tbl_note ON(lehre.tbl_projektarbeit.note = lehre.tbl_note.note)
+ WHERE
+ tbl_projektarbeit.student_uid = ? AND mitarbeiter_uid IS NOT NULL AND
(projekttyp_kurzbz='Bachelor' OR projekttyp_kurzbz='Diplom')
- AND betreuerart_kurzbz IN ('Betreuer', 'Begutachter', 'Erstbegutachter', 'Senatsvorsitz')";
-
+ AND betreuerart_kurzbz IN ('Betreuer', 'Begutachter', 'Erstbegutachter', 'Senatsvorsitz')) as base
+ ORDER BY insertamum DESC";
+
return $this->execReadOnlyQuery($betreuerQuery, array($studentUID));
}
@@ -179,8 +180,12 @@ class Projektarbeit_model extends DB_Model
campus.tbl_paabgabe.fixtermin,
campus.tbl_paabgabe.kurzbz,
campus.tbl_paabgabe.datum,
+ campus.tbl_paabgabe.note,
+ campus.tbl_paabgabe.upload_allowed,
+ campus.tbl_paabgabe.beurteilungsnotiz,
campus.tbl_paabgabetyp.paabgabetyp_kurzbz,
campus.tbl_paabgabetyp.bezeichnung,
+ campus.tbl_paabgabetyp.benotbar,
campus.tbl_paabgabe.abgabedatum,
campus.tbl_paabgabe.insertvon
FROM campus.tbl_paabgabe JOIN campus.tbl_paabgabetyp USING(paabgabetyp_kurzbz)
@@ -190,16 +195,76 @@ class Projektarbeit_model extends DB_Model
return $this->execReadOnlyQuery($qry, array($projektarbeit_id));
}
+ public function getProjektarbeitenAbgabetermine($projektarbeiten_ids) {
+ $qry ="SELECT campus.tbl_paabgabe.paabgabe_id,
+ campus.tbl_paabgabe.projektarbeit_id,
+ campus.tbl_paabgabe.fixtermin,
+ campus.tbl_paabgabe.kurzbz,
+ campus.tbl_paabgabe.datum,
+ campus.tbl_paabgabe.note,
+ campus.tbl_paabgabe.upload_allowed,
+ campus.tbl_paabgabe.beurteilungsnotiz,
+ campus.tbl_paabgabetyp.paabgabetyp_kurzbz,
+ campus.tbl_paabgabetyp.bezeichnung,
+ campus.tbl_paabgabe.abgabedatum,
+ campus.tbl_paabgabe.insertvon
+ FROM campus.tbl_paabgabe JOIN campus.tbl_paabgabetyp USING(paabgabetyp_kurzbz)
+ WHERE campus.tbl_paabgabe.projektarbeit_id IN ?
+ ORDER BY campus.tbl_paabgabe.datum";
+
+ return $this->execReadOnlyQuery($qry, array($projektarbeiten_ids));
+ }
+
public function getProjektbetreuerAnrede($bperson_id) {
- $qry_betr="SELECT distinct trim(COALESCE(titelpre,'')||' '||COALESCE(vorname,'')||' '||COALESCE(nachname,'')||' '||COALESCE(titelpost,'')) as first,
- public.tbl_mitarbeiter.mitarbeiter_uid, anrede
- FROM public.tbl_person JOIN lehre.tbl_projektbetreuer ON(lehre.tbl_projektbetreuer.person_id=public.tbl_person.person_id)
- JOIN public.tbl_benutzer ON(public.tbl_benutzer.person_id=public.tbl_person.person_id)
- JOIN public.tbl_mitarbeiter ON(public.tbl_benutzer.uid=public.tbl_mitarbeiter.mitarbeiter_uid)
- WHERE public.tbl_person.person_id= ?";
+ $qry_betr="SELECT DISTINCT ON(public.tbl_person.person_id) trim(COALESCE(titelpre,'')||' '||COALESCE(vorname,'')||' '||COALESCE(nachname,'')||' '||COALESCE(titelpost,'')) as first, anrede
+ FROM public.tbl_person JOIN lehre.tbl_projektbetreuer ON(lehre.tbl_projektbetreuer.person_id=public.tbl_person.person_id)
+ WHERE public.tbl_person.person_id= ?";
return $this->execReadOnlyQuery($qry_betr, [$bperson_id]);
+ }
+
+ public function getProjektbetreuerEmail($projektarbeit_id) {
+ $qry = "SELECT (
+ SELECT kontakt
+ FROM public.tbl_kontakt
+ WHERE kontakttyp = 'email'
+ AND person_id = pers.person_id
+ ORDER BY
+ CASE WHEN zustellung THEN 0 ELSE 1 END,
+ insertamum DESC NULLS LAST
+ LIMIT 1
+ ) AS private_email, mitarbeiter_uid as uid
+ FROM lehre.tbl_projektarbeit pa
+ JOIN lehre.tbl_projektbetreuer USING (projektarbeit_id)
+ JOIN public.tbl_person pers USING (person_id)
+ LEFT JOIN public.tbl_benutzer ben USING (person_id)
+ LEFT JOIN public.tbl_mitarbeiter ma ON ben.uid = ma.mitarbeiter_uid
+ WHERE (ben.aktiv OR ben.aktiv IS NULL)
+ AND projektarbeit_id = ?";
+ return $this->execReadOnlyQuery($qry, [$projektarbeit_id]);
+ }
+
+ public function getProjektbetreuerEmailByPersonID($person_id) {
+ $qry = "SELECT (
+ SELECT kontakt
+ FROM public.tbl_kontakt
+ WHERE kontakttyp = 'email'
+ AND person_id = pers.person_id
+ ORDER BY
+ CASE WHEN zustellung THEN 0 ELSE 1 END,
+ insertamum DESC NULLS LAST
+ LIMIT 1
+ ) AS private_email, mitarbeiter_uid as uid
+ FROM lehre.tbl_projektarbeit pa
+ JOIN lehre.tbl_projektbetreuer USING (projektarbeit_id)
+ JOIN public.tbl_person pers USING (person_id)
+ LEFT JOIN public.tbl_benutzer ben USING (person_id)
+ LEFT JOIN public.tbl_mitarbeiter ma ON ben.uid = ma.mitarbeiter_uid
+ WHERE (ben.aktiv OR ben.aktiv IS NULL)
+ AND person_id = ?";
+
+ return $this->execReadOnlyQuery($qry, [$person_id]);
}
public function getProjektarbeitBenutzer($uid) {
@@ -234,9 +299,9 @@ class Projektarbeit_model extends DB_Model
*
FROM
(SELECT tbl_person.vorname, tbl_person.nachname, tbl_studiengang.typ, tbl_studiengang.kurzbz,
- tbl_projektarbeit.projekttyp_kurzbz, tbl_projekttyp.bezeichnung, tbl_projektarbeit.titel, tbl_projektarbeit.projektarbeit_id,
- tbl_projektbetreuer.betreuerart_kurzbz, tbl_betreuerart.beschreibung AS betreuerart_beschreibung,
- tbl_benutzer.uid, tbl_student.matrikelnr, tbl_lehreinheit.studiensemester_kurzbz
+ tbl_projektarbeit.projekttyp_kurzbz, tbl_projekttyp.bezeichnung, tbl_projektarbeit.titel, tbl_projektarbeit.projektarbeit_id, tbl_projektarbeit.note,
+ tbl_projektbetreuer.person_id as betreuer_person_id, tbl_projektbetreuer.betreuerart_kurzbz, tbl_betreuerart.beschreibung AS betreuerart_beschreibung,
+ tbl_benutzer.uid, tbl_student.matrikelnr, tbl_lehreinheit.studiensemester_kurzbz, public.tbl_student.student_uid
FROM lehre.tbl_projektarbeit
LEFT JOIN lehre.tbl_projektbetreuer using(projektarbeit_id)
LEFT JOIN lehre.tbl_betreuerart using(betreuerart_kurzbz)
@@ -273,7 +338,134 @@ class Projektarbeit_model extends DB_Model
return $this->execReadOnlyQuery($qry, array($projektarbeit_id));
}
-
+
+
+ public function getProjektarbeitenForStudiengang($studiengang_kz, $benotet) {
+ $new_qry = "SELECT DISTINCT ON(tmp.projektarbeit_id) *, campus.get_betreuer_details(tmp.zweitbetreuer_person_id) as zweitbetreuer_full_name, campus.get_betreuer_details(tmp.betreuer_person_id) as erstbetreuer_full_name
+ FROM(
+ SELECT
+ DISTINCT ON(tbl_projektarbeit.projektarbeit_id)
+ tbl_projektarbeit.projekttyp_kurzbz,
+ tbl_projektarbeit.titel,
+ tbl_projektarbeit.projektarbeit_id,
+ tbl_studiengang.typ, tbl_studiengang.kurzbz,
+ student_benutzer.uid as student_uid,
+ student_person.vorname as student_vorname,
+ student_person.nachname as student_nachname,
+ tbl_student.matrikelnr, tbl_lehreinheit.studiensemester_kurzbz,
+ betreuer_benutzer.uid as betreuer_benutzer_uid,
+ betreuer_person.vorname as betreuer_vorname,
+ betreuer_person.nachname as betreuer_nachname,
+ lehre.tbl_projektbetreuer.betreuerart_kurzbz as betreuerart,
+ lehre.tbl_projektbetreuer.person_id as betreuer_person_id,
+ lehre.tbl_projektarbeit.sprache as sprache,
+ lehre.tbl_projektarbeit.seitenanzahl as seitenanzahl,
+ lehre.tbl_projektarbeit.kontrollschlagwoerter as kontrollschlagwoerter,
+ lehre.tbl_projektarbeit.schlagwoerter as schlagwoerter,
+ lehre.tbl_projektarbeit.schlagwoerter_en as schlagwoerter_en,
+ lehre.tbl_projektarbeit.abstract as abstract,
+ lehre.tbl_projektarbeit.abstract_en as abstract_en,
+ lehre.tbl_projektarbeit.insertamum as insertamum,
+ lehre.tbl_projektarbeit.note as note,
+ (
+ SELECT orgform_kurzbz
+ FROM tbl_prestudentstatus
+ WHERE prestudent_id = (SELECT prestudent_id
+ FROM tbl_student
+ WHERE student_uid = student_benutzer.uid
+ LIMIT 1)
+ ORDER BY datum DESC, insertamum DESC, ext_id DESC
+ LIMIT 1
+ )
+ as organisationsform,
+ (
+ SELECT person_id
+ FROM lehre.tbl_projektbetreuer
+ WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id
+ AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied')
+ LIMIT 1
+ )
+ AS zweitbetreuer_person_id,
+ (
+ SELECT betreuerart_kurzbz
+ FROM lehre.tbl_projektbetreuer
+ WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id
+ AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied')
+ LIMIT 1
+ )
+ AS zweitbetreuer_betreuerart_kurzbz,
+ (
+ SELECT tbl_betreuerart.beschreibung
+ FROM lehre.tbl_projektbetreuer
+ JOIN lehre.tbl_betreuerart USING (betreuerart_kurzbz)
+ WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id
+ AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied')
+ LIMIT 1
+ )
+ AS zweitbetreuer_betreuerart_beschreibung,
+ (
+ SELECT trim(COALESCE(titelpre, '') || ' ' || COALESCE(vorname, '') || ' ' || COALESCE(nachname, '') || ' ' ||
+ COALESCE(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_full_name,
+ (
+ SELECT
+ COALESCE(tbl_studienplan.orgform_kurzbz,
+ tbl_prestudentstatus.orgform_kurzbz, tbl_studiengang.orgform_kurzbz) as
+ orgform
+ FROM
+ public.tbl_prestudent
+ JOIN public.tbl_prestudentstatus USING(prestudent_id)
+ JOIN public.tbl_studiensemester USING(studiensemester_kurzbz)
+ JOIN public.tbl_studiengang USING(studiengang_kz)
+ LEFT JOIN lehre.tbl_studienplan USING(studienplan_id)
+ WHERE
+ prestudent_id=tbl_student.prestudent_id
+ ORDER BY tbl_prestudentstatus.datum DESC LIMIT 1
+ ) as orgform,
+ (SELECT status_kurzbz FROM public.tbl_prestudentstatus
+ WHERE prestudent_id=tbl_student.prestudent_id
+ ORDER BY datum DESC, insertamum DESC, ext_id DESC LIMIT 1) as studienstatus
+ FROM lehre.tbl_projektarbeit
+ LEFT JOIN public.tbl_benutzer student_benutzer ON (student_benutzer.uid = lehre.tbl_projektarbeit.student_uid)
+ LEFT JOIN public.tbl_person student_person ON (student_benutzer.person_id = student_person.person_id)
+ LEFT JOIN public.tbl_student on(student_benutzer.uid = public.tbl_student.student_uid)
+ LEFT JOIN lehre.tbl_lehreinheit USING (lehreinheit_id)
+ LEFT JOIN lehre.tbl_lehrveranstaltung USING (lehrveranstaltung_id)
+ LEFT JOIN public.tbl_studiengang ON (public.tbl_student.studiengang_kz = public.tbl_studiengang.studiengang_kz)
+ LEFT JOIN lehre.tbl_projekttyp USING (projekttyp_kurzbz)
+ LEFT JOIN lehre.tbl_projektbetreuer USING (projektarbeit_id)
+ LEFT JOIN public.tbl_person betreuer_person ON (betreuer_person.person_id = lehre.tbl_projektbetreuer.person_id)
+ LEFT JOIN public.tbl_benutzer betreuer_benutzer ON (betreuer_person.person_id = betreuer_benutzer.person_id)
+ WHERE (projekttyp_kurzbz = 'Bachelor' OR projekttyp_kurzbz = 'Diplom')
+ AND student_benutzer.aktiv AND (
+ lehre.tbl_projektbetreuer.betreuerart_kurzbz = 'Erstbegutachter'
+ OR lehre.tbl_projektbetreuer.betreuerart_kurzbz = 'Begutachter'
+ OR lehre.tbl_projektbetreuer.betreuerart_kurzbz = 'Betreuer'
+ OR lehre.tbl_projektbetreuer.betreuerart_kurzbz = 'Erstbetreuer'
+ OR lehre.tbl_projektbetreuer.betreuerart_kurzbz = 'Senatsvorsitz'
+ )
+ AND public.tbl_studiengang.studiengang_kz = ?";
+
+ if($benotet == 0) {
+ $new_qry .= " AND lehre.tbl_projektarbeit.note IS NULL ";
+ } else if ($benotet == 1) {
+ $new_qry .= " AND lehre.tbl_projektarbeit.note IS NOT NULL ";
+ }
+
+ $new_qry .= " ORDER BY tbl_projektarbeit.projektarbeit_id DESC, student_person.nachname ASC
+ ) as tmp";
+
+ return $this->execReadOnlyQuery($new_qry, array($studiengang_kz));
+ }
+
/**
*
* @param
@@ -299,4 +491,17 @@ class Projektarbeit_model extends DB_Model
return false;
}
+
+ public function getProjektarbeitByPaabgabeID($paabgabe_id) {
+ $qry = "SELECT
+ projektarbeit_id
+ FROM
+ campus.tbl_paabgabe
+ JOIN lehre.tbl_projektarbeit USING(projektarbeit_id)
+ WHERE
+ campus.tbl_paabgabe.paabgabe_id = ?;
+ ";
+
+ return $this->execReadOnlyQuery($qry, [$paabgabe_id]);
+ }
}
diff --git a/application/models/education/Projektbetreuer_model.php b/application/models/education/Projektbetreuer_model.php
index 02368ae21..47e0239d6 100644
--- a/application/models/education/Projektbetreuer_model.php
+++ b/application/models/education/Projektbetreuer_model.php
@@ -232,4 +232,41 @@ class Projektbetreuer_model extends DB_Model
return $this->execQuery($qry, array($projektarbeit_id, $betreuer_person_id));
}
+
+ /**
+ * Gets all Betreuer of a Projektarbeit.
+ * Returns one row for each person.
+ * @param int $projektarbeit_id
+ * @return array success with number of Betreuer or error
+ */
+ public function getAllBetreuerOfProjektarbeit($projektarbeit_id)
+ {
+ $qry = "SELECT DISTINCT ON (pers.person_id) pers.person_id, betreuerart_kurzbz, vorname, nachname,
+ trim(COALESCE(titelpre,'')||' '||COALESCE(vorname,'')||' '||COALESCE(nachname,'')||' '||COALESCE(titelpost,'')) as voller_name,
+ anrede, titelpre, titelpost, gebdatum, geschlecht, pa.projekttyp_kurzbz,
+ ben.uid, ben.alias, ma.personalnummer, mitarbeiter_uid, student_uid,
+ (
+ SELECT kontakt
+ FROM public.tbl_kontakt
+ WHERE kontakttyp = 'email'
+ AND person_id = pers.person_id
+ ORDER BY
+ CASE WHEN zustellung THEN 0 ELSE 1 END,
+ insertamum DESC NULLS LAST
+ LIMIT 1
+ ) AS private_email
+ FROM lehre.tbl_projektarbeit pa
+ JOIN lehre.tbl_projektbetreuer USING (projektarbeit_id)
+ JOIN public.tbl_person pers USING (person_id)
+ LEFT JOIN public.tbl_benutzer ben USING (person_id)
+ LEFT JOIN public.tbl_mitarbeiter ma ON ben.uid = ma.mitarbeiter_uid
+ WHERE (ben.aktiv OR ben.aktiv IS NULL)
+ AND projektarbeit_id = ?
+ ORDER BY pers.person_id, CASE WHEN ma.mitarbeiter_uid IS NULL THEN 1 ELSE 0 END, /*Mitarbeiter account first*/
+ CASE WHEN ben.uid IS NULL THEN 1 ELSE 0 END, /*user with account first*/
+ ben.insertamum";
+
+ return $this->execQuery($qry, array($projektarbeit_id));
+ }
+
}
diff --git a/application/models/organisation/Organisationseinheit_model.php b/application/models/organisation/Organisationseinheit_model.php
index db56c1930..9f64580a9 100644
--- a/application/models/organisation/Organisationseinheit_model.php
+++ b/application/models/organisation/Organisationseinheit_model.php
@@ -243,4 +243,20 @@ class Organisationseinheit_model extends DB_Model
return $this->execReadOnlyQuery($qry, array($oe_kurzbz));
}
+
+ public function getAssistenzForOE($oe_kurzbz) {
+ $qry = "
+ SELECT person_id, uid, benutzerfunktion_id, funktion_kurzbz, oe_kurzbz, alias,
+ anrede, trim(COALESCE(titelpre,'')||' '||COALESCE(vorname,'')||' '||COALESCE(nachname,'')||' '||COALESCE(titelpost,'')) as first
+ FROM tbl_benutzerfunktion
+ JOIN public.tbl_benutzer USING(uid)
+ JOIN public.tbl_person USING(person_id)
+ WHERE funktion_kurzbz = 'ass'
+ AND oe_kurzbz = ?
+ AND (datum_bis IS NULL OR NOW() <= datum_bis)
+ AND public.tbl_benutzer.aktiv = true
+ ";
+
+ return $this->execReadOnlyQuery($qry, array($oe_kurzbz));
+ }
}
diff --git a/application/models/organisation/Studiengang_model.php b/application/models/organisation/Studiengang_model.php
index 2b235aeb8..131e1deb5 100644
--- a/application/models/organisation/Studiengang_model.php
+++ b/application/models/organisation/Studiengang_model.php
@@ -657,37 +657,7 @@ class Studiengang_model extends DB_Model
$this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel');
$this->load->model('person/Person_model', 'PersonModel');
$this->load->model('crm/Student_model', 'StudentModel');
-
- $addEmailProperty= function(&$benutzerfunktionen){
- if(count($benutzerfunktionen) && defined('DOMAIN'))
- {
- $benutzerfunktionen = array_map(function($benutzer)
- {
- $benutzer->email = $benutzer->alias."@".DOMAIN;
- return $benutzer;
- },$benutzerfunktionen) ;
- }
-
- };
- $addFotoProperty= function(&$collection){
- $collection = array_map(function($item){
- $person_id = $this->PersonModel->getByUid($item->uid);
- if(isError($person_id))
- return error($person_id);
- $person_id = current(getData($person_id))->person_id;
- $this->PersonModel->addSelect('foto');
- $foto = $this->PersonModel->loadWhere(array('person_id'=>$person_id));
- if(isError($foto))
- return error($foto);
- $foto = current(getData($foto))->foto;
- $item->foto = $foto;
- return $item;
- },$collection);
- };
-
- $this->load->model('crm/Student_model', 'StudentModel');
-
$student = $this->StudentModel->loadWhere(['student_uid' => getAuthUID()]);
if (isError($student))
return error($student);
@@ -712,7 +682,7 @@ class Studiengang_model extends DB_Model
$stg_ltg = array_values(array_filter($stg_ltg, function($stg_leitung){
return $stg_leitung->aktiv;
}));
- $addFotoProperty($stg_ltg);
+ $this->addFotoProperty($stg_ltg);
$gf_ltg = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('gLtg', $stg_obj->oe_kurzbz);
if (isError($gf_ltg))
@@ -721,8 +691,8 @@ class Studiengang_model extends DB_Model
$gf_ltg = array_values(array_filter($gf_ltg, function($gf_leitung){
return $gf_leitung->aktiv;
}));
- $addEmailProperty($gf_ltg);
- $addFotoProperty($gf_ltg);
+ $this->addEmailProperty($gf_ltg);
+ $this->addFotoProperty($gf_ltg);
$stv_ltg = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('stvLtg', $stg_obj->oe_kurzbz);
if (isError($stv_ltg))
@@ -731,8 +701,8 @@ class Studiengang_model extends DB_Model
$stv_ltg = array_values(array_filter($stv_ltg, function($stv_leitung){
return $stv_leitung->aktiv;
}));
- $addEmailProperty($stv_ltg);
- $addFotoProperty($stv_ltg);
+ $this->addEmailProperty($stv_ltg);
+ $this->addFotoProperty($stv_ltg);
$ass = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('ass', $stg_obj->oe_kurzbz);
if (isError($ass))
@@ -741,8 +711,8 @@ class Studiengang_model extends DB_Model
$ass = array_values(array_filter($ass, function($assistenz){
return $assistenz->aktiv;
}));
- $addEmailProperty($ass);
- $addFotoProperty($ass);
+ $this->addEmailProperty($ass);
+ $this->addFotoProperty($ass);
$hochschulvertr = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('hsv');
if (isError($hochschulvertr))
@@ -751,7 +721,7 @@ class Studiengang_model extends DB_Model
$hochschulvertr = array_values(array_filter($hochschulvertr, function($hochschul_vertreter){
return $hochschul_vertreter->aktiv;
}));
- $addEmailProperty($hochschulvertr);
+ $this->addEmailProperty($hochschulvertr);
$stdv = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('stdv', $stg_obj->oe_kurzbz);
@@ -761,7 +731,7 @@ class Studiengang_model extends DB_Model
$stdv = array_values(array_filter($stdv, function($std_vertreter){
return $std_vertreter->aktiv;
}));
- $addEmailProperty($stdv);
+ $this->addEmailProperty($stdv);
$jahrgangsvertr = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('jgv', $stg_obj->oe_kurzbz, $semester);
@@ -771,7 +741,7 @@ class Studiengang_model extends DB_Model
$jahrgangsvertr = array_values(array_filter($jahrgangsvertr, function($jahrgang_vertreter){
return $jahrgang_vertreter->aktiv;
}));
- $addEmailProperty($jahrgangsvertr);
+ $this->addEmailProperty($jahrgangsvertr);
$result_object = new stdClass();
@@ -870,4 +840,72 @@ class Studiengang_model extends DB_Model
return $this->execQuery($qry, [$studiengang_kz, $studiensemester_kurzbz]);
}
+
+ public function getStudiengaengeFiltered($allowed_stg) {
+ $query ="SELECT DISTINCT
+ public.tbl_studiengang.studiengang_kz,
+ public.tbl_studiengang.bezeichnung,
+ public.tbl_studiengang.kurzbzlang,
+ public.tbl_studiengang.orgform_kurzbz
+ FROM public.tbl_studiengang JOIN lehre.tbl_studienordnung USING(studiengang_kz)
+ JOIN lehre.tbl_studienplan USING(studienordnung_id)
+ JOIN lehre.tbl_studienplan_semester USING(studienplan_id)
+ WHERE public.tbl_studiengang.aktiv = true
+
+ AND public.tbl_studiengang.studiengang_kz IN ?
+ ORDER BY public.tbl_studiengang.kurzbzlang";
+
+ return $this->execReadOnlyQuery($query, [$allowed_stg]);
+ }
+
+ public function getAssistenzForStudiengangKZ($stg_kz) {
+ $this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel');
+
+ $stg_obj = $this->load($stg_kz);
+ if(isError($stg_obj))
+ return error($stg_obj);
+ if(getData($stg_obj))
+ {
+ $stg_obj = current(getData($stg_obj));
+ }
+
+ $ass = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('ass', $stg_obj->oe_kurzbz);
+ if (isError($ass))
+ return $ass;
+ $ass = getData($ass) ?: [];
+ $ass = array_values(array_filter($ass, function($assistenz){
+ return $assistenz->aktiv;
+ }));
+
+ $this->addEmailProperty($ass);
+
+ return success($ass);
+ }
+
+ private function addEmailProperty(&$benutzerfunktionen) {
+ if(count($benutzerfunktionen) && defined('DOMAIN'))
+ {
+ $benutzerfunktionen = array_map(function($benutzer)
+ {
+ $benutzer->email = $benutzer->alias."@".DOMAIN;
+ return $benutzer;
+ },$benutzerfunktionen) ;
+ }
+ }
+
+ private function addFotoProperty (&$collection) {
+ $collection = array_map(function($item){
+ $person_id = $this->PersonModel->getByUid($item->uid);
+ if(isError($person_id))
+ return error($person_id);
+ $person_id = current(getData($person_id))->person_id;
+ $this->PersonModel->addSelect('foto');
+ $foto = $this->PersonModel->loadWhere(array('person_id'=>$person_id));
+ if(isError($foto))
+ return error($foto);
+ $foto = current(getData($foto))->foto;
+ $item->foto = $foto;
+ return $item;
+ },$collection);
+ }
}
diff --git a/application/models/person/Person_model.php b/application/models/person/Person_model.php
index 233cfc751..e72b24de4 100644
--- a/application/models/person/Person_model.php
+++ b/application/models/person/Person_model.php
@@ -420,4 +420,17 @@ class Person_model extends DB_Model
return success($result);
}
}
+
+ public function loadAllStudentUIDSForPersonID($person_id) {
+ $qry = "SELECT
+ CONCAT(tp.vorname, ' ', tp.nachname) AS name,
+ ARRAY_AGG(DISTINCT b.uid ORDER BY b.uid) AS uids
+ FROM public.tbl_student s
+ JOIN public.tbl_benutzer b ON s.student_uid = b.uid
+ JOIN public.tbl_person tp ON b.person_id = tp.person_id
+ GROUP BY tp.vorname, tp.nachname, b.aktiv, b.person_id
+ HAVING b.person_id = ? AND b.aktiv IS TRUE;";
+
+ return $this->execReadOnlyQuery($qry, [$person_id]);
+ }
}
diff --git a/application/models/system/Message_model.php b/application/models/system/Message_model.php
index e0a185f9b..19129b606 100644
--- a/application/models/system/Message_model.php
+++ b/application/models/system/Message_model.php
@@ -242,74 +242,89 @@ class Message_model extends DB_Model
*/
public function getMessagesForTable($person_id, $offset, $limit)
{
- $sql_base = "
- SELECT
+ $sql = <<execQuery($sql, $parametersArray);
-
- if (isError($count))
- return $count;
-
- $count = ceil(current(getData($count))->count/$limit);
- $sql = "
- SELECT * FROM (
- " . $sql_base . "
- ) a
- ORDER BY insertamum DESC
- LIMIT ?
- OFFSET ?
- ";
+ (COALESCE(ps.titelpre,'') || ' ' || COALESCE(ps.vorname,'') || ' ' || COALESCE(ps.nachname,'') || ' ' || COALESCE(ps.titelpost,'')) as sender,
+ (COALESCE(pr.titelpre,'') || ' ' || COALESCE(pr.vorname,'') || ' ' || COALESCE(pr.nachname,'') || ' ' || COALESCE(pr.titelpost,'')) as recipient,
+ fm.sender_id,
+ fm.recipient_id,
+ ms.status,
+ ms.insertamum as statusdatum
+ from
+ filtered_messages fm
+ join
+ public.tbl_msg_message m on fm.message_id = m.message_id
+ join
+ lastmsgstatus ms on fm.message_id = ms.message_id and fm.recipient_id = ms.person_id
+ left join
+ public.tbl_person ps on ps.person_id = fm.sender_id
+ left join
+ public.tbl_person pr on pr.person_id = fm.recipient_id
+ order by
+ m.insertamum DESC
+ limit ?
+ offset ?;
+EOSQL;
$parametersArray = array($person_id, $person_id, $limit, $offset);
+ $count = 0;
$data = $this->execQuery($sql, $parametersArray);
if (isError($data))
return $data;
$data = getData($data);
+ if($data)
+ {
+ $count = ceil($data[0]->total_msgs / $limit);
+ }
return success(['data' => $data, 'count' => $count]);
}
diff --git a/application/models/vertragsbestandteil/Gehaltsbestandteil_model.php b/application/models/vertragsbestandteil/Gehaltsbestandteil_model.php
index c50627697..2669105a1 100644
--- a/application/models/vertragsbestandteil/Gehaltsbestandteil_model.php
+++ b/application/models/vertragsbestandteil/Gehaltsbestandteil_model.php
@@ -286,7 +286,13 @@ EOSQL;
foreach( $rows as $row ) {
$tmpgb = new Gehaltsbestandteil();
$tmpgb->hydrateByStdClass($row, true);
-
+
+ if ($row->betrag_valorisiert != null && $row->valorisierungsdatum != null
+ && $row->valorisierungsdatum == $row->von) {
+ // neuer Gehaltsbestandteil mit Valorisierungsdatum aber auch valorisiert
+ $tmpgb->setGrundbetrag($row->betrag_valorisiert);
+ }
+
// prevent duplication (caused by the join with historic values)
if (!isset($lastRecords[(string)$row->gehaltsbestandteil_id])) {
$gehaltsbestandteile[] = $tmpgb;
diff --git a/application/views/Cis/Abgabetool.php b/application/views/Cis/Abgabetool.php
new file mode 100644
index 000000000..86e8721f2
--- /dev/null
+++ b/application/views/Cis/Abgabetool.php
@@ -0,0 +1,47 @@
+ 'Cis4',
+ 'axios027' => true,
+ 'bootstrap5' => true,
+ 'fontawesome6' => true,
+ 'tabulator5' => true, // TODO: upgrade to 6 when available
+ 'vue3' => true,
+ 'primevue3' => true,
+ 'skipID' => '#fhccontent',
+ 'vuedatepicker11' => true,
+ 'customCSSs' => array(
+ 'public/css/components/verticalsplit.css',
+ 'public/css/components/FilterComponent.css',
+ 'public/css/components/FormUnderline.css',
+ 'public/css/theme/default.css',
+ 'public/css/components/abgabetool/abgabe.css'
+ ),
+ 'customJSs' => array(
+ 'vendor/npm-asset/primevue/accordion/accordion.min.js',
+ 'vendor/npm-asset/primevue/accordiontab/accordiontab.min.js',
+ 'vendor/npm-asset/primevue/checkbox/checkbox.min.js',
+ 'vendor/npm-asset/primevue/inputnumber/inputnumber.min.js',
+ 'vendor/npm-asset/primevue/speeddial/speeddial.min.js',
+ 'vendor/npm-asset/primevue/textarea/textarea.min.js',
+ 'vendor/npm-asset/primevue/timeline/timeline.min.js',
+ 'vendor/npm-asset/primevue/inplace/inplace.min.js',
+ 'vendor/npm-asset/primevue/message/message.min.js',
+ 'vendor/npm-asset/primevue/tieredmenu/tieredmenu.js',
+ 'vendor/moment/luxonjs/luxon.min.js'
+ ),
+ 'customJSModules' => array(
+ 'public/js/apps/Abgabetool/Abgabetool.js',
+ ),
+
+);
+
+$this->load->view('templates/FHC-Header', $includesArray);
+?>
+
+ uid=
+ student_uid_prop=""
+ stg_kz_prop=""
+ >
+
+load->view('templates/FHC-Footer', $includesArray); ?>
diff --git a/application/views/CisRouterView/CisRouterView.php b/application/views/CisRouterView/CisRouterView.php
index ab22fbb81..6ff428362 100644
--- a/application/views/CisRouterView/CisRouterView.php
+++ b/application/views/CisRouterView/CisRouterView.php
@@ -21,19 +21,25 @@ $includesArray = array(
'public/css/components/FilterComponent.css',
'public/css/components/Profil.css',
'public/css/components/FormUnderline.css',
+ 'public/css/components/abgabetool/abgabe.css',
'public/css/Cis4/Cms.css',
'public/css/Cis4/Studium.css',
),
'customJSs' => array(
'vendor/npm-asset/primevue/accordion/accordion.min.js',
'vendor/npm-asset/primevue/accordiontab/accordiontab.min.js',
- 'vendor/npm-asset/primevue/inputnumber/inputnumber.min.js',
- 'vendor/npm-asset/primevue/textarea/textarea.min.js',
'vendor/npm-asset/primevue/checkbox/checkbox.min.js',
+ 'vendor/npm-asset/primevue/inputnumber/inputnumber.min.js',
+ 'vendor/npm-asset/primevue/speeddial/speeddial.min.js',
+ 'vendor/npm-asset/primevue/textarea/textarea.min.js',
+ 'vendor/npm-asset/primevue/timeline/timeline.min.js',
+ 'vendor/npm-asset/primevue/inplace/inplace.min.js',
+ 'vendor/npm-asset/primevue/message/message.min.js',
+ 'vendor/npm-asset/primevue/tieredmenu/tieredmenu.js',
'vendor/moment/luxonjs/luxon.min.js'
),
'customJSModules' => array(
- 'public/js/apps/Dashboard/Fhc.js'
+ 'public/js/apps/Dashboard/Fhc.js',
),
);
diff --git a/application/views/templates/CISVUE-Header.php b/application/views/templates/CISVUE-Header.php
index 358fc75c9..804a43821 100644
--- a/application/views/templates/CISVUE-Header.php
+++ b/application/views/templates/CISVUE-Header.php
@@ -36,4 +36,4 @@ $this->load->view('templates/FHC-Header', $includesArray);
>
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/cis/public/testtool_test/MathML_Beispiel.png b/cis/public/testtool_test/MathML_Beispiel.png
new file mode 100644
index 000000000..d6ef2403f
Binary files /dev/null and b/cis/public/testtool_test/MathML_Beispiel.png differ
diff --git a/cis/public/testtool_test/testseite.php b/cis/public/testtool_test/testseite.php
index a200b95b2..34ea12818 100644
--- a/cis/public/testtool_test/testseite.php
+++ b/cis/public/testtool_test/testseite.php
@@ -86,67 +86,88 @@ echo '';
Formel / Formula
-
- 5
- 3
-
-
- +
-
- 7
- 6
-
- =
-
-
- 10
- 6
-
- +
-
-
- 7
- 6
-
- =
-
- 17
-
- 6
-
+
+
+ 5
+ 3
+
+ +
+
+ 7
+ 6
+
+ =
+
+ 10
+ 6
+
+ +
+
+ 7
+ 6
+
+ =
+
+ 17
+ 6
+
+
-
-
- ∑
- k =1
- 5
-
-
-
- (-1)
- k +1
-
-
-
-
-
- x
- 2k + 1
-
-
-
- (2k +1)!
-
-
-
-
+
+
+ ∑
+
+ k
+ =
+ 1
+
+ 5
+
+
+
+
+ (
+ -
+ 1
+ )
+
+
+ k
+ +
+ 1
+
+
+
+
+
+ x
+
+ 2
+ k
+ +
+ 1
+
+
+
+
+ (
+ 2
+ k
+ +
+ 1
+ )
+ !
+
+
+
+
Bild / Picture
-
+
diff --git a/cis/testtool/admin/index.php b/cis/testtool/admin/index.php
index 4f010784f..f8e8d36ed 100644
--- a/cis/testtool/admin/index.php
+++ b/cis/testtool/admin/index.php
@@ -1172,8 +1172,8 @@ if ($frage_id != '')
echo "";
//Vorschau fuer das Text-Feld
echo "Vorschau:
- $frage->text
- Derzeit:$frage->text
+ $frage->text
+ Derzeit:$frage->text
";
echo "";
echo '';
@@ -1280,8 +1280,8 @@ if ($frage_id != '')
echo "/> ";
echo " ".($vorschlag_id != ''?" frage_id'\" />":'')." ";
//Vorschau fuer das Text-Feld
- echo "Vorschau:$vorschlag->text
- Derzeit:$vorschlag->text
";
+ echo "Vorschau:$vorschlag->text
+ Derzeit:$vorschlag->text
";
echo "";
echo "";
echo '';
diff --git a/cis/testtool/login.php b/cis/testtool/login.php
index d028a41ff..cfc1ba63b 100644
--- a/cis/testtool/login.php
+++ b/cis/testtool/login.php
@@ -340,13 +340,26 @@ else
}
}
-if ((isset($_SESSION['prestudent_id']) && !isset($_SESSION['pruefling_id']) &&
- !isset($_SESSION['confirmation_needed']) && !isset($_SESSION['confirmed_code'])) ||
- (isset($_SESSION['confirmation_needed']) && $_SESSION['confirmation_needed'] === true &&
- isset($_SESSION['confirmed_code']) && $_SESSION['confirmed_code'] === true &&
- isset($_SESSION['externe_ueberwachung']) && $_SESSION['externe_ueberwachung'] === true &&
- isset($_SESSION['externe_ueberwachung_verified']) && $_SESSION['externe_ueberwachung_verified'] === true &&
- isset($_SESSION['prestudent_id']) && !isset($_SESSION['pruefling_id'])))
+if (
+ (
+ isset($_SESSION['prestudent_id']) && !isset($_SESSION['pruefling_id']) &&
+ !isset($_SESSION['confirmation_needed']) && !isset($_SESSION['confirmed_code']) &&
+ !isset($_SESSION['externe_ueberwachung']) && !isset($_SESSION['externe_ueberwachung_verified'])
+ )
+ ||
+ (
+ isset($_SESSION['confirmation_needed']) && $_SESSION['confirmation_needed'] === true &&
+ isset($_SESSION['confirmed_code']) && $_SESSION['confirmed_code'] === true &&
+ isset($_SESSION['prestudent_id']) && !isset($_SESSION['pruefling_id'])
+ )
+ ||
+ (
+ isset($_SESSION['externe_ueberwachung']) && $_SESSION['externe_ueberwachung'] === true &&
+ isset($_SESSION['externe_ueberwachung_verified']) && $_SESSION['externe_ueberwachung_verified'] === true &&
+ isset($_SESSION['prestudent_id']) && !isset($_SESSION['pruefling_id'])
+ )
+
+)
{
$pruefling = new pruefling();
@@ -665,10 +678,11 @@ elseif (isset($prestudent_id))
else
{
// Letzten Status für des Prestudenten einholen
- $ps_master = new Prestudent();
+ $ps_master = new Prestudent($prestudent_id);
$ps_master->getLastStatus($prestudent_id);
$sto = new Studienordnung();
$sto->getStudienordnungFromStudienplan($ps_master->studienplan_id);
+ $stg = new Studiengang($ps_master->studiengang_kz);
// Name des Studiengangs aus Studienordnung laden, ansonsten Fallback auf Studiengang
$stg_name = $sto->studiengangbezeichnung;
$stg_name_eng = $sto->studiengangbezeichnung_englisch;
diff --git a/include/anwesenheit.class.php b/include/anwesenheit.class.php
index 2b8389c79..9493a3d4b 100644
--- a/include/anwesenheit.class.php
+++ b/include/anwesenheit.class.php
@@ -479,91 +479,182 @@ class anwesenheit extends basis_db
*/
public function loadAnwesenheitStudiensemester($studiensemester_kurzbz, $student_uid=null, $lehrveranstaltung_id=null)
{
- $qry = "SELECT
- lehrveranstaltung_id, vorname, nachname, wahlname, student_uid as uid, bezeichnung,
- gesamt as gesamtstunden, anwesend, nichtanwesend, trunc(100-(nichtanwesend/gesamt)*100,2) as prozent
- FROM
- (
- SELECT
- vorname, nachname, wahlname, lehrveranstaltung_id, bezeichnung, gruppe, student_uid,
- count(stundenplan_id) as gesamt,
- case when anwesend.summe is null then 0 else anwesend.summe end as anwesend,
- case when nichtanwesend.summe is null then 0 else nichtanwesend.summe end as nichtanwesend
+ $qry = "SELECT
+ lehrveranstaltung_id,
+ vorname,
+ nachname,
+ wahlname,
+ student_uid AS uid,
+ bezeichnung,
+ gesamt AS gesamtstunden,
+ anwesend,
+ nichtanwesend,
+ CASE WHEN gesamt = 0 THEN 100.00 ELSE trunc(100-(nichtanwesend/(gesamt))*100,2) END AS prozent
+
+ FROM(
+ SELECT
+ vorname,
+ nachname,
+ wahlname,
+ lehrveranstaltung_id,
+ bezeichnung,
+ student_uid,
+ --COUNT(stundenplan_id) AS gesamts,
+ COALESCE(anwesend.summe, 0) + COALESCE(nichtanwesend.summe, 0) AS gesamt,
+ COALESCE(anwesend.summe, 0) AS anwesend,
+ COALESCE(nichtanwesend.summe, 0) AS nichtanwesend
+
FROM
(
- SELECT
- sum(stundenplan_id) as stundenplan_id, datum, stunde, lehrveranstaltung_id,
- bezeichnung, studiensemester_kurzbz, studiengang_kz,
- TRIM(
- CASE WHEN stp.gruppe_kurzbz is not null then stp.gruppe_kurzbz
- else stp.semester||(case when verband is null then '' else stp.verband end)||(case when stp.gruppe is null then '' else stp.gruppe end) end) as gruppe
+ SELECT
+ SUM(stundenplan_id) AS stundenplan_id,
+ datum,
+ stunde,
+ lehrveranstaltung_id,
+ bezeichnung,
+ studiensemester_kurzbz,
+ studiengang_kz
+
FROM
lehre.tbl_lehrveranstaltung lv
- JOIN lehre.tbl_lehreinheit le using (lehrveranstaltung_id)
- JOIN lehre.tbl_stundenplan stp using (lehreinheit_id,studiengang_kz)
+ JOIN
+ lehre.tbl_lehreinheit le USING (lehrveranstaltung_id)
+ JOIN
+ lehre.tbl_stundenplan stp USING (lehreinheit_id,studiengang_kz)
+
WHERE
studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)."
- AND (titel not like '%Nebenprüfung%' OR titel is null)
-
- group by datum, stunde, lehrveranstaltung_id, bezeichnung, studiensemester_kurzbz, studiengang_kz, stp.gruppe_kurzbz, stp.semester, stp.verband, stp.gruppe
+ AND (titel NOT LIKE '%Nebenprüfung%' OR titel IS NULL)
+
+ GROUP BY
+ datum,
+ stunde,
+ lehrveranstaltung_id,
+ bezeichnung,
+ studiensemester_kurzbz,
+ studiengang_kz,
+ stp.gruppe_kurzbz,
+ stp.semester,
+ stp.verband,
+ stp.gruppe
)x
JOIN (
- SELECT semester::text as gruppe, public.tbl_studentlehrverband.studiensemester_kurzbz, student_uid, studiengang_kz
- FROM
- public.tbl_studentlehrverband
- WHERE studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)."
-
- UNION
-
- SELECT semester||verband as gruppe, public.tbl_studentlehrverband.studiensemester_kurzbz, student_uid, studiengang_kz
- FROM
- public.tbl_studentlehrverband
- WHERE
- studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)."
-
- UNION
-
- SELECT semester||verband||gruppe as gruppe, public.tbl_studentlehrverband.studiensemester_kurzbz, student_uid, studiengang_kz
- FROM
- public.tbl_studentlehrverband
- WHERE
- studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)."
-
- UNION
-
- SELECT gruppe_kurzbz as gruppe, public.tbl_benutzergruppe.studiensemester_kurzbz, uid as student_uid, studiengang_kz
- FROM
- public.tbl_benutzergruppe
- JOIN
- public.tbl_gruppe using (gruppe_kurzbz)
- WHERE studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)."
-
- )a using (gruppe, studiensemester_kurzbz, studiengang_kz)
- JOIN public.tbl_benutzer b on b.uid = student_uid
- JOIN public.tbl_person p using(person_id)
- LEFT JOIN(
SELECT
- lehrveranstaltung_id, studiensemester_kurzbz, uid as student_uid, sum(einheiten) as summe
- FROM
- campus.tbl_anwesenheit a
- JOIN lehre.tbl_lehreinheit le using (lehreinheit_id)
- JOIN lehre.tbl_lehrveranstaltung lv using (lehrveranstaltung_id)
- WHERE
- anwesend = true AND studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)."
+ le.lehrveranstaltung_id,
+ slv.student_uid,
+ le.studiensemester_kurzbz,
+ st.prestudent_id
+
+ FROM
+ public.tbl_studentlehrverband slv
+ JOIN
+ lehre.tbl_lehreinheitgruppe leg
+ ON slv.studiengang_kz = leg.studiengang_kz
+ AND slv.semester = leg.semester
+ AND (
+ NULLIF(btrim(leg.verband::text), '') IS NULL
+ OR NULLIF(btrim(slv.verband::text), '') = NULLIF(btrim(leg.verband::text), '')
+ )
+ AND (
+ NULLIF(btrim(leg.gruppe::text), '') IS NULL
+ OR NULLIF(btrim(slv.gruppe::text), '') = NULLIF(btrim(leg.gruppe::text), '')
+ )
+ JOIN
+ lehre.tbl_lehreinheit le USING (lehreinheit_id, studiensemester_kurzbz)
+ JOIN
+ public.tbl_student st USING(student_uid)
+
+ WHERE
+ leg.gruppe_kurzbz IS NULL
+ AND le.studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)."
+
GROUP BY
- lehrveranstaltung_id, bezeichnung, uid, studiensemester_kurzbz
- )anwesend using(lehrveranstaltung_id, student_uid, studiensemester_kurzbz)
+ le.lehrveranstaltung_id,
+ slv.student_uid,
+ le.studiensemester_kurzbz,
+ st.prestudent_id
+
+ UNION
+
+ SELECT
+ le.lehrveranstaltung_id,
+ bg.uid AS student_uid,
+ bg.studiensemester_kurzbz,
+ st.prestudent_id
+
+ FROM
+ public.tbl_benutzergruppe bg
+ JOIN
+ lehre.tbl_lehreinheitgruppe leg USING (gruppe_kurzbz)
+ JOIN
+ lehre.tbl_lehreinheit le USING(lehreinheit_id, studiensemester_kurzbz)
+ JOIN
+ public.tbl_student st ON bg.uid = st.student_uid
+
+ WHERE
+ bg.studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)."
+
+ GROUP BY
+ le.lehrveranstaltung_id,
+ bg.uid,
+ bg.studiensemester_kurzbz,
+ st.prestudent_id
+
+ )a USING (lehrveranstaltung_id, studiensemester_kurzbz)
+ JOIN
+ public.tbl_benutzer b on b.uid = student_uid
+ JOIN
+ public.tbl_person p using(person_id)
LEFT JOIN(
- SELECT lehrveranstaltung_id, studiensemester_kurzbz, uid as student_uid, sum(einheiten) as summe
+ SELECT
+ lehrveranstaltung_id,
+ studiensemester_kurzbz,
+ uid AS student_uid,
+ SUM(einheiten) AS summe
+
FROM
campus.tbl_anwesenheit a
- JOIN lehre.tbl_lehreinheit le using (lehreinheit_id)
- JOIN lehre.tbl_lehrveranstaltung lv using (lehrveranstaltung_id)
+ JOIN
+ lehre.tbl_lehreinheit le USING(lehreinheit_id)
+ JOIN
+ lehre.tbl_lehrveranstaltung lv USING (lehrveranstaltung_id)
+
WHERE
- anwesend = false AND studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)."
+ anwesend = true
+ AND studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)."
+
GROUP BY
- lehrveranstaltung_id, bezeichnung, uid, studiensemester_kurzbz
- )nichtanwesend using(lehrveranstaltung_id, student_uid, studiensemester_kurzbz)
+ lehrveranstaltung_id,
+ bezeichnung,
+ uid,
+ studiensemester_kurzbz
+
+ )anwesend USING(lehrveranstaltung_id, student_uid, studiensemester_kurzbz)
+ LEFT JOIN(
+ SELECT
+ lehrveranstaltung_id,
+ studiensemester_kurzbz,
+ uid AS student_uid,
+ SUM(einheiten) AS summe
+
+ FROM
+ campus.tbl_anwesenheit a
+ JOIN
+ lehre.tbl_lehreinheit le USING (lehreinheit_id)
+ JOIN
+ lehre.tbl_lehrveranstaltung lv USING (lehrveranstaltung_id)
+
+ WHERE
+ anwesend = false
+ AND studiensemester_kurzbz = ".$this->db_add_param($studiensemester_kurzbz)."
+
+ GROUP BY
+ lehrveranstaltung_id,
+ bezeichnung,
+ uid,
+ studiensemester_kurzbz
+ )nichtanwesend USING(lehrveranstaltung_id, student_uid, studiensemester_kurzbz)
+
WHERE
lehrveranstaltung_id > 0
";
@@ -573,8 +664,15 @@ class anwesenheit extends basis_db
if(!is_null($lehrveranstaltung_id))
$qry.=" AND lehrveranstaltung_id=".$this->db_add_param($lehrveranstaltung_id);
- $qry.="group by
- vorname, nachname, wahlname, lehrveranstaltung_id, bezeichnung, gruppe, student_uid, anwesend.summe, nichtanwesend.summe
+ $qry.=" GROUP BY
+ vorname,
+ nachname,
+ wahlname,
+ lehrveranstaltung_id,
+ bezeichnung,
+ student_uid,
+ anwesend.summe,
+ nichtanwesend.summe
)m";
if($lehrveranstaltung_id != '')
diff --git a/include/statistik.class.php b/include/statistik.class.php
index fd48e7d28..364c6d1a0 100644
--- a/include/statistik.class.php
+++ b/include/statistik.class.php
@@ -513,6 +513,7 @@ class statistik extends basis_db
$this->json=array();
$this->countRows=0;
set_time_limit(600);
+ $parseHtml = (strpos($this->preferences, 'parseHTML: true') !== false);
// In case a decryption function is used then perform password substitution
$this->sql = $this->replaceSQLDecryptionPassword($this->sql);
@@ -565,7 +566,13 @@ class statistik extends basis_db
for($spalte=0;$spalte<$anzahl_spalten;$spalte++)
{
$name = $this->db_field_name($this->data,$spalte);
- $this->html.= ''.$this->convert_html_chars($row->$name).' ';
+ if ($parseHtml) {
+ // HTML direkt rendern
+ $this->html .= ''.($row->$name).' ';
+ } else {
+ // wie bisher escapen
+ $this->html .= ''.$this->convert_html_chars($row->$name).' ';
+ }
// Umwandeln von Punkt in Komma bei Float-Werten
if (is_numeric($row->$name))
{
diff --git a/public/css/Cis4/Cis.css b/public/css/Cis4/Cis.css
index 2bb467048..3056d36b6 100644
--- a/public/css/Cis4/Cis.css
+++ b/public/css/Cis4/Cis.css
@@ -407,7 +407,6 @@ html {
background-color: var(--fhc-background);
border-color: var(--fhc-border);
padding: var(--fhc-cis-main-py) var(--fhc-cis-main-px);
- min-width: 0; /* fix flex-grow with tabulator exceeding width */
}
#cis-main .fa-arrow-up-right-from-square {
@@ -856,3 +855,9 @@ html {
background-color: var(--fhc-secondary);
}
+
+.bordered-modal {
+ border: 1px solid rgba(0, 0, 0, 0.15);
+ border-radius: 0.5rem;
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.25);
+}
\ No newline at end of file
diff --git a/public/css/components/abgabetool/abgabe.css b/public/css/components/abgabetool/abgabe.css
new file mode 100644
index 000000000..d70481805
--- /dev/null
+++ b/public/css/components/abgabetool/abgabe.css
@@ -0,0 +1,308 @@
+/* Base Header */
+.verpasst-header {
+ background-color: var(--fhc-red-70);
+ font-weight: 600;
+ border-radius: 6px;
+ padding: 0px 0px 0px 34px;
+ transition: background-color 0.3s ease, box-shadow 0.3s ease, color 0.3s ease;
+ box-shadow: 0 1px 2px rgba(0,0,0,0.08);
+}
+
+/* Hover State */
+.verpasst-header:hover {
+ background-color: var(--fhc-red-60);
+ box-shadow: 0 2px 6px rgba(0,0,0,0.12);
+}
+
+/* Active / Expanded State */
+.p-accordion-tab-active > .verpasst-header {
+ background-color: var(--fhc-red-50);
+ box-shadow: 0 2px 8px rgba(0,0,0,0.2);
+}
+
+/* Hover State Active*/
+.p-accordion-tab-active > .verpasst-header:hover {
+ background-color: var(--fhc-red-60);
+ box-shadow: 0 2px 6px rgba(0,0,0,0.12);
+}
+
+/* Base Header */
+.abzugeben-header {
+ background-color: var(--fhc-yellow-70);
+ font-weight: 600;
+ border-radius: 6px;
+ padding: 0px 0px 0px 34px;
+ transition: background-color 0.3s ease, box-shadow 0.3s ease, color 0.3s ease;
+ box-shadow: 0 1px 2px rgba(0,0,0,0.08);
+}
+
+/* Hover State */
+.abzugeben-header:hover {
+ background-color: var(--fhc-yellow-60);
+ box-shadow: 0 2px 6px rgba(0,0,0,0.12);
+}
+
+/* Active / Expanded State */
+.p-accordion-tab-active > .abzugeben-header {
+ background-color: var(--fhc-yellow-50);
+ box-shadow: 0 2px 8px rgba(0,0,0,0.2);
+}
+
+/* Hover State Active*/
+.p-accordion-tab-active > .abzugeben-header:hover {
+ background-color: var(--fhc-yellow-60);
+ box-shadow: 0 2px 6px rgba(0,0,0,0.12);
+}
+
+/* Base Header */
+.beurteilungerforderlich-header {
+ background-color: var(--fhc-orange-70);
+ font-weight: 600;
+ border-radius: 6px;
+ padding: 0px 0px 0px 34px;
+ transition: background-color 0.3s ease, box-shadow 0.3s ease, color 0.3s ease;
+ box-shadow: 0 1px 2px rgba(0,0,0,0.08);
+}
+
+
+/* Hover State */
+.beurteilungerforderlich-header:hover {
+ background-color: var(--fhc-orange-60);
+ box-shadow: 0 2px 6px rgba(0,0,0,0.12);
+}
+
+/* Active / Expanded State */
+.p-accordion-tab-active > .beurteilungerforderlich-header {
+ background-color: var(--fhc-orange-50);
+ box-shadow: 0 2px 8px rgba(0,0,0,0.2);
+}
+
+/* Hover State Active*/
+.p-accordion-tab-active > .beurteilungerforderlich-header:hover {
+ background-color: var(--fhc-orange-60);
+ box-shadow: 0 2px 6px rgba(0,0,0,0.12);
+}
+
+/* Base Header */
+.verspaetet-header {
+ background-color: var(--fhc-pink-40);
+ font-weight: 600;
+ border-radius: 6px;
+ padding: 0px 0px 0px 34px;
+ transition: background-color 0.3s ease, box-shadow 0.3s ease, color 0.3s ease;
+ box-shadow: 0 1px 2px rgba(0,0,0,0.08);
+}
+
+/* Hover State */
+.verspaetet-header:hover {
+ background-color: var(--fhc-pink-20);
+ box-shadow: 0 2px 6px rgba(0,0,0,0.12);
+}
+
+/* Active / Expanded State */
+.p-accordion-tab-active > .verspaetet-header {
+ background-color: var(--fhc-pink-30);
+ box-shadow: 0 2px 8px rgba(0,0,0,0.2);
+}
+
+/* Hover State Active*/
+.p-accordion-tab-active > .verspaetet-header:hover {
+ background-color: var(--fhc-pink-20);
+ box-shadow: 0 2px 6px rgba(0,0,0,0.12);
+}
+
+/* Base Header */
+.abgegeben-header {
+ background-color: var(--fhc-green-70);
+ font-weight: 600;
+ border-radius: 6px;
+ padding: 0px 0px 0px 34px;
+ transition: background-color 0.3s ease, box-shadow 0.3s ease, color 0.3s ease;
+ box-shadow: 0 1px 2px rgba(0,0,0,0.08);
+}
+
+/* Hover State */
+.abgegeben-header:hover {
+ background-color: var(--fhc-green-60);
+ box-shadow: 0 2px 6px rgba(0,0,0,0.12);
+}
+
+/* Active / Expanded State */
+.p-accordion-tab-active > .abgegeben-header {
+ background-color: var(--fhc-green-50);
+ box-shadow: 0 2px 8px rgba(0,0,0,0.2);
+}
+
+/* Hover State Active*/
+.p-accordion-tab-active > .abgegeben-header:hover {
+ background-color: var(--fhc-green-60);
+ box-shadow: 0 2px 6px rgba(0,0,0,0.12);
+}
+
+
+/* Base Header */
+.bestanden-header {
+ background-color: var(--fhc-green-70);
+ font-weight: 600;
+ border-radius: 6px;
+ padding: 0px 0px 0px 34px;
+ transition: background-color 0.3s ease, box-shadow 0.3s ease, color 0.3s ease;
+ box-shadow: 0 1px 2px rgba(0,0,0,0.08);
+}
+
+/* Hover State */
+.bestanden-header:hover {
+ background-color: var(--fhc-green-60);
+ box-shadow: 0 2px 6px rgba(0,0,0,0.12);
+}
+
+/* Active / Expanded State */
+.p-accordion-tab-active > .bestanden-header {
+ background-color: var(--fhc-green-50);
+ box-shadow: 0 2px 8px rgba(0,0,0,0.2);
+}
+
+/* Hover State Active*/
+.p-accordion-tab-active > .bestanden-header:hover {
+ background-color: var(--fhc-green-60);
+ box-shadow: 0 2px 6px rgba(0,0,0,0.12);
+}
+
+
+/* Base Header */
+.nichtbestanden-header {
+ background-color: var(--fhc-red-70);
+ font-weight: 600;
+ border-radius: 6px;
+ padding: 0px 0px 0px 34px;
+ transition: background-color 0.3s ease, box-shadow 0.3s ease, color 0.3s ease;
+ box-shadow: 0 1px 2px rgba(0,0,0,0.08);
+}
+
+/* Hover State */
+.nichtbestanden-header:hover {
+ background-color: var(--fhc-red-60);
+ box-shadow: 0 2px 6px rgba(0,0,0,0.12);
+}
+
+/* Active / Expanded State */
+.p-accordion-tab-active > .nichtbestanden-header {
+ background-color: var(--fhc-red-50);
+ box-shadow: 0 2px 8px rgba(0,0,0,0.2);
+}
+
+/* Hover State Active*/
+.p-accordion-tab-active > .nichtbestanden-header:hover {
+ background-color: var(--fhc-red-60);
+ box-shadow: 0 2px 6px rgba(0,0,0,0.12);
+}
+
+
+/* Base Header */
+.erledigt-header {
+ background-color: var(--fhc-red-70);
+ font-weight: 600;
+ border-radius: 6px;
+ padding: 0px 0px 0px 34px;
+ transition: background-color 0.3s ease, box-shadow 0.3s ease, color 0.3s ease;
+ box-shadow: 0 1px 2px rgba(0,0,0,0.08);
+}
+
+/* Hover State */
+.erledigt-header:hover {
+ background-color: var(--fhc-red-60);
+ box-shadow: 0 2px 6px rgba(0,0,0,0.12);
+}
+
+/* Active / Expanded State */
+.p-accordion-tab-active > .erledigt-header {
+ background-color: var(--fhc-red-50);
+ box-shadow: 0 2px 8px rgba(0,0,0,0.2);
+}
+
+/* Hover State Active*/
+.p-accordion-tab-active > .erledigt-header:hover {
+ background-color: var(--fhc-red-60);
+ box-shadow: 0 2px 6px rgba(0,0,0,0.12);
+}
+
+
+/* Base Header */
+.standard-header {
+ background-color: var(--fhc-white-70);
+ font-weight: 600;
+ border-radius: 6px;
+ padding: 0px 0px 0px 34px;
+ transition: background-color 0.3s ease, box-shadow 0.3s ease, color 0.3s ease;
+ box-shadow: 0 1px 2px rgba(0,0,0,0.08);
+}
+
+/* Hover State */
+.standard-header:hover {
+ background-color: var(--fhc-white-60);
+ box-shadow: 0 2px 6px rgba(0,0,0,0.12);
+}
+
+/* Active / Expanded State */
+.p-accordion-tab-active > .standard-header {
+ background-color: var(--fhc-white-50);
+ box-shadow: 0 2px 8px rgba(0,0,0,0.2);
+}
+
+/* Hover State Active*/
+.p-accordion-tab-active > .standard-header:hover {
+ background-color: var(--fhc-white-60);
+ box-shadow: 0 2px 6px rgba(0,0,0,0.12);
+}
+
+#abgabetoolroot .modal-header{
+ background-color: var(--fhc-blue-primary);
+ color: var(--fhc-white-50);
+}
+
+#abgabetoolroot .modal-header .btn-close{
+ filter: invert(1);
+}
+
+#abgabetoolroot .modal-footer {
+ background-color: var(--fhc-white-20);
+
+}
+
+.bordered-modal {
+ border: 1px solid rgba(0, 0, 0, 0.15);
+ border-radius: 0.5rem;
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.25);
+}
+
+.bordered-modal .modal-body {
+ overflow-y: visible;
+}
+
+.p-accordion .p-accordion-header .p-accordion-header-link {
+ padding: 12px!important;
+}
+
+/* 1. Stick the Header */
+#abgabetable .tabulator-header .tabulator-col.sticky-col {
+ position: sticky;
+ left: 0;
+ z-index: 10; /* Must be higher than other headers */
+ background-color: #fff; /* Opaque background is required */
+ border-right: 2px solid #ddd; /* Optional: Separator line */
+}
+
+/* 2. Stick the Data Cells */
+#abgabetable .tabulator-tableholder .tabulator-row .tabulator-cell.sticky-col {
+ position: sticky;
+ left: 0;
+ z-index: 10; /* Ensure it floats above other cells */
+ background-color: #fff; /* Match your row background color */
+ border-right: 2px solid #ddd; /* Optional: Separator line */
+}
+
+/* 3. Fix for Hover Effects (Optional) */
+/* If you use hover rows, you need to ensure the sticky cell matches the hover color */
+#abgabetable .tabulator-row:hover .tabulator-cell.sticky-col {
+ background-color: #ccc; /* Match your existing hover color */
+}
\ No newline at end of file
diff --git a/public/css/tags.css b/public/css/tags.css
index 9e0d7ee4b..e92f415b2 100644
--- a/public/css/tags.css
+++ b/public/css/tags.css
@@ -51,6 +51,14 @@
background-color: #6d4c41;
}
+.tag_dark_grey {
+ background-color: #595959;
+}
+
+.tag_light_grey {
+ background-color: #9a9a9a;
+}
+
.tag_blau {
background-color: #508498;
}
diff --git a/public/css/theme/default.css b/public/css/theme/default.css
index a0f366174..a4d197f07 100644
--- a/public/css/theme/default.css
+++ b/public/css/theme/default.css
@@ -38,15 +38,104 @@
--fhc-blue-primary: #006095;
--fhc-blue-primary-highlight: #0086CB;
- --fhc-red-10: #842029;
- --fhc-red-20: #800000;
+ /* --- Green --- */
+ --fhc-green-5: rgb(240, 250, 240);
+ --fhc-green-10: rgb(220, 245, 220);
+ --fhc-green-20: rgb(190, 235, 190);
+ --fhc-green-30: rgb(150, 220, 150);
+ --fhc-green-40: rgb(110, 200, 110);
+ --fhc-green-50: rgb(70, 170, 70);
+ --fhc-green-60: rgb(50, 145, 50);
+ --fhc-green-70: rgb(35, 120, 35);
+ --fhc-green-80: rgb(25, 95, 25);
+ --fhc-green-90: rgb(15, 70, 15);
- --fhc-green-10: #008000;
+ /* --- Red --- */
+ --fhc-red-5: rgb(255, 245, 246);
+ --fhc-red-10: rgb(255, 225, 228);
+ --fhc-red-20: rgb(250, 190, 195);
+ --fhc-red-30: rgb(240, 150, 160);
+ --fhc-red-40: rgb(225, 110, 120);
+ --fhc-red-50: rgb(200, 70, 85);
+ --fhc-red-60: rgb(170, 50, 65);
+ --fhc-red-70: rgb(140, 35, 50);
+ --fhc-red-80: rgb(110, 20, 35);
+ --fhc-red-90: rgb(85, 10, 25);
+ /* --- Yellow --- */
+ --fhc-yellow-5: rgb(255, 255, 240);
+ --fhc-yellow-10: rgb(255, 250, 210);
+ --fhc-yellow-20: rgb(255, 240, 160);
+ --fhc-yellow-30: rgb(255, 225, 100);
+ --fhc-yellow-40: rgb(250, 210, 50);
+ --fhc-yellow-50: rgb(240, 190, 0);
+ --fhc-yellow-60: rgb(220, 165, 0);
+ --fhc-yellow-70: rgb(190, 135, 0);
+ --fhc-yellow-80: rgb(160, 105, 0);
+ --fhc-yellow-90: rgb(120, 75, 0);
+
+ /* --- Pink --- */
+ --fhc-pink-5: rgb(255, 245, 250);
+ --fhc-pink-10: rgb(255, 225, 235);
+ --fhc-pink-20: rgb(250, 195, 215);
+ --fhc-pink-30: rgb(245, 160, 190);
+ --fhc-pink-40: rgb(235, 120, 160);
+ --fhc-pink-50: rgb(220, 80, 130);
+ --fhc-pink-60: rgb(190, 60, 110);
+ --fhc-pink-70: rgb(160, 40, 90);
+ --fhc-pink-80: rgb(130, 25, 70);
+ --fhc-pink-90: rgb(100, 15, 50);
+
+ /* --- Orange --- */
+ --fhc-orange-5: rgb(255, 250, 240);
+ --fhc-orange-10: rgb(255, 235, 200);
+ --fhc-orange-20: rgb(255, 210, 140);
+ --fhc-orange-30: rgb(255, 185, 80);
+ --fhc-orange-40: rgb(255, 155, 40);
+ --fhc-orange-50: rgb(255, 128, 0);
+ --fhc-orange-60: rgb(230, 110, 0);
+ --fhc-orange-70: rgb(200, 90, 0);
+ --fhc-orange-80: rgb(170, 70, 0);
+ --fhc-orange-90: rgb(130, 50, 0);
+
--fhc-beige-10: rgba(245, 233, 215, 0.5);
--fhc-beige-20: rgba(172, 153, 125, 0.5);
+ /* --- Purple --- */
+ --fhc-purple-5: rgb(250, 245, 255);
+ --fhc-purple-10: rgb(240, 230, 255);
+ --fhc-purple-20: rgb(220, 200, 250);
+ --fhc-purple-30: rgb(190, 160, 245);
+ --fhc-purple-40: rgb(160, 120, 235);
+ --fhc-purple-50: rgb(130, 80, 220);
+ --fhc-purple-60: rgb(110, 60, 190);
+ --fhc-purple-70: rgb(90, 40, 160);
+ --fhc-purple-80: rgb(70, 25, 130);
+ --fhc-purple-90: rgb(50, 15, 100);
+ /* --- Teal --- */
+ --fhc-teal-5: rgb(240, 252, 252);
+ --fhc-teal-10: rgb(220, 245, 245);
+ --fhc-teal-20: rgb(180, 235, 235);
+ --fhc-teal-30: rgb(130, 220, 220);
+ --fhc-teal-40: rgb(80, 200, 200);
+ --fhc-teal-50: rgb(30, 170, 170);
+ --fhc-teal-60: rgb(20, 140, 140);
+ --fhc-teal-70: rgb(15, 115, 115);
+ --fhc-teal-80: rgb(10, 90, 90);
+ --fhc-teal-90: rgb(5, 65, 65);
+
+ /* --- Indigo --- */
+ --fhc-indigo-5: rgb(245, 247, 255);
+ --fhc-indigo-10: rgb(230, 235, 255);
+ --fhc-indigo-20: rgb(200, 210, 250);
+ --fhc-indigo-30: rgb(160, 175, 245);
+ --fhc-indigo-40: rgb(120, 140, 235);
+ --fhc-indigo-50: rgb(80, 100, 220);
+ --fhc-indigo-60: rgb(60, 80, 190);
+ --fhc-indigo-70: rgb(45, 60, 160);
+ --fhc-indigo-80: rgb(30, 40, 130);
+ --fhc-indigo-90: rgb(20, 25, 100);
}
diff --git a/public/js/api/factory/abgabe.js b/public/js/api/factory/abgabe.js
new file mode 100644
index 000000000..c6f229973
--- /dev/null
+++ b/public/js/api/factory/abgabe.js
@@ -0,0 +1,144 @@
+export default {
+ getConfig() {
+ return {
+ method: 'get',
+ url: '/api/frontend/v1/Abgabe/getConfig'
+ };
+ },
+ getConfigStudent() {
+ return {
+ method: 'get',
+ url: '/api/frontend/v1/Abgabe/getConfigStudent'
+ };
+ },
+ getStudentProjektarbeiten(uid) {
+ return {
+ method: 'get',
+ url: '/api/frontend/v1/Abgabe/getStudentProjektarbeiten',
+ params: { uid }
+ };
+ },
+ getStudentProjektabgaben(detail) {
+ return {
+ method: 'get',
+ url: '/api/frontend/v1/Abgabe/getStudentProjektabgaben',
+ params: { projektarbeit_id: detail.projektarbeit_id, student_uid: detail.student_uid }
+ };
+ },
+ postStudentProjektarbeitEndupload(formData) {
+ return {
+ method: 'post',
+ url: '/api/frontend/v1/Abgabe/postStudentProjektarbeitEndupload',
+ params: formData,
+ config: {Headers: { "Content-Type": "multipart/form-data" }}
+ };
+ },
+ postStudentProjektarbeitZwischenabgabe(formData) {
+ return {
+ method: 'post',
+ url: '/api/frontend/v1/Abgabe/postStudentProjektarbeitZwischenabgabe',
+ params: formData,
+ config: {Headers: { "Content-Type": "multipart/form-data" }}
+ };
+ },
+ getMitarbeiterProjektarbeiten(all) {
+ return {
+ method: 'get',
+ url: '/api/frontend/v1/Abgabe/getMitarbeiterProjektarbeiten',
+ params: { showall: all }
+ };
+ },
+ postProjektarbeitAbgabe(termin) {
+
+ let dateString = termin.datum
+ if(termin.datum instanceof Date) {
+ const year = termin.datum.getFullYear();
+ const month = String(termin.datum.getMonth() + 1).padStart(2, '0');
+ const day = String(termin.datum.getDate()).padStart(2, '0');
+
+ dateString = `${year}-${month}-${day}`
+ }
+
+ return {
+ method: 'post',
+ url: '/api/frontend/v1/Abgabe/postProjektarbeitAbgabe',
+ params: {
+ paabgabe_id: termin.paabgabe_id,
+ paabgabetyp_kurzbz: termin.bezeichnung.paabgabetyp_kurzbz,
+ datum: dateString,
+ note: termin.note_pk,
+ upload_allowed: !!termin.upload_allowed,
+ beurteilungsnotiz: termin.beurteilungsnotiz ?? '',
+ fixtermin: termin.fixtermin,
+ insertvon: termin.insertvon,
+ kurzbz: termin.kurzbz,
+ projektarbeit_id: termin.projektarbeit_id,
+ betreuer_person_id: termin.betreuer_person_id
+ }
+ };
+ },
+ deleteProjektarbeitAbgabe(paabgabe_id) {
+ return {
+ method: 'post',
+ url: '/api/frontend/v1/Abgabe/deleteProjektarbeitAbgabe',
+ params: { paabgabe_id }
+ };
+ },
+ postSerientermin(datum, paabgabetyp_kurzbz, bezeichnung, kurzbz, upload_allowed, projektarbeit_ids, fixtermin) {
+ return {
+ method: 'post',
+ url: '/api/frontend/v1/Abgabe/postSerientermin',
+ params: { datum, paabgabetyp_kurzbz, bezeichnung, kurzbz, upload_allowed, projektarbeit_ids, fixtermin }
+ };
+ },
+ fetchDeadlines(person_id) {
+ return {
+ method: 'post',
+ url: '/api/frontend/v1/Abgabe/fetchDeadlines',
+ params: { person_id }
+ };
+ },
+ getPaAbgabetypen() {
+ return {
+ method: 'get',
+ url: '/api/frontend/v1/Abgabe/getPaAbgabetypen'
+ };
+ },
+ //TODO: SWITCH TO NOTEN API ONCE NOTENTOOL IS IN MASTER TO AVOID DUPLICATE API
+ getNoten(){
+ return {
+ method: 'get',
+ url: '/api/frontend/v1/Abgabe/getNoten'
+ };
+ },
+ getProjektarbeitenForStudiengang(studiengang_kz, benotet = 0) {
+ return {
+ method: 'get',
+ url: '/api/frontend/v1/Abgabe/getProjektarbeitenForStudiengang',
+ params: { studiengang_kz, benotet }
+ };
+ },
+ // TODO: this could also very well be generic info api
+ getStudiengaenge() {
+ return {
+ method: 'get',
+ url: '/api/frontend/v1/Abgabe/getStudiengaenge'
+ };
+ },
+ postStudentProjektarbeitZusatzdaten(formData) {
+ return {
+ method: 'post',
+ url: '/api/frontend/v1/Abgabe/postStudentProjektarbeitZusatzdaten',
+ params: formData,
+ config: {Headers: { "Content-Type": "multipart/form-data" }}
+ };
+ },
+ getSignaturStatusForProjektarbeitAbgaben(paabgabe_ids, student_uid) {
+ return {
+ method: 'post',
+ url: '/api/frontend/v1/Abgabe/getSignaturStatusForProjektarbeitAbgaben',
+ params: {paabgabe_ids, student_uid},
+
+ };
+ }
+};
\ No newline at end of file
diff --git a/public/js/api/factory/studiensemester.js b/public/js/api/factory/studiensemester.js
index 367ec9558..7fe4a22d3 100644
--- a/public/js/api/factory/studiensemester.js
+++ b/public/js/api/factory/studiensemester.js
@@ -1,5 +1,27 @@
-export default {
+/**
+ * Copyright (C) 2025 fhcomplete.org
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+export default {
+ getAllStudiensemesterAndAktOrNext() {
+ return {
+ method: 'get',
+ url: '/api/frontend/v1/organisation/Studiensemester/getAllStudiensemesterAndAktOrNext',
+ };
+ },
getAll(order = null, start = null)
{
return {
@@ -8,4 +30,4 @@ export default {
params: { order, start }
};
}
-}
\ No newline at end of file
+};
\ No newline at end of file
diff --git a/public/js/api/lehre.js b/public/js/api/lehre.js
index 5797a2c75..cd7129d61 100644
--- a/public/js/api/lehre.js
+++ b/public/js/api/lehre.js
@@ -18,80 +18,5 @@ export default {
`/api/frontend/v1/Lehre/Pruefungen/${lehrveranstaltung_id}`
, {}
);
- },
- getStudentProjektarbeiten(uid) {
- return this.$fhcApi.get(
- `/api/frontend/v1/Lehre/getStudentProjektarbeiten/${uid}`
- , {}
- );
- },
- getStudentProjektabgaben(detail) {
- return this.$fhcApi.get(
- `/api/frontend/v1/Lehre/getStudentProjektabgaben`
- , {
- projektarbeit_id: detail.projektarbeit_id,
- student_uid: detail.student_uid
- }
- );
- },
- postStudentProjektarbeitEndupload(formData) {
- const url = '/api/frontend/v1/Lehre/postStudentProjektarbeitEndupload';
- const headers = {Headers: { "Content-Type": "multipart/form-data" }}
- return this.$fhcApi.post(url, formData, headers)
- },
- postStudentProjektarbeitZwischenabgabe(formData) {
- const url = '/api/frontend/v1/Lehre/postStudentProjektarbeitZwischenabgabe';
- const headers = {Headers: { "Content-Type": "multipart/form-data" }}
- return this.$fhcApi.post(url, formData, headers)
- },
- getStudentProjektarbeitAbgabeFile(paabgabe_id, student_uid) {
- const url = `/Cis/Abgabetool/getStudentProjektarbeitAbgabeFile?paabgabe_id=${paabgabe_id}&student_uid=${student_uid}`;
-
- window.location = FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + url
- },
- getMitarbeiterProjektarbeiten(uid, all) {
- return this.$fhcApi.get(
- `/api/frontend/v1/Lehre/getMitarbeiterProjektarbeiten?showall=${all}`
- , {}
- );
- },
- postProjektarbeitAbgabe(termin) {
- const payload = {
- paabgabe_id: termin.paabgabe_id,
- paabgabetyp_kurzbz: termin.bezeichnung.paabgabetyp_kurzbz,
- datum: termin.datum,
- fixtermin: termin.fixtermin,
- insertvon: termin.insertvon,
- kurzbz: termin.kurzbz,
- projektarbeit_id: termin.projektarbeit_id
- }
- const url = '/api/frontend/v1/Lehre/postProjektarbeitAbgabe';
-
- return this.$fhcApi.post(url, payload, null)
-
- },
- deleteProjektarbeitAbgabe(paabgabe_id) {
- const payload = {
- paabgabe_id
- }
- const url = '/api/frontend/v1/Lehre/deleteProjektarbeitAbgabe';
-
- return this.$fhcApi.post(url, payload, null)
- },
- postSerientermin(datum, paabgabetyp_kurzbz, bezeichnung, kurzbz, projektarbeit_ids) {
- const payload = {
- datum, paabgabetyp_kurzbz, bezeichnung, kurzbz, projektarbeit_ids
- }
- const url = '/api/frontend/v1/Lehre/postSerientermin';
-
- return this.$fhcApi.post(url, payload, null)
- },
- fetchDeadlines(person_id) {
- const payload = {
- person_id
- }
- const url = '/api/frontend/v1/Lehre/fetchDeadlines';
-
- return this.$fhcApi.post(url, payload, null)
}
}
\ No newline at end of file
diff --git a/public/js/apps/Abgabetool/Abgabetool.js b/public/js/apps/Abgabetool/Abgabetool.js
new file mode 100644
index 000000000..83233ba22
--- /dev/null
+++ b/public/js/apps/Abgabetool/Abgabetool.js
@@ -0,0 +1,74 @@
+import PluginsPhrasen from '../../plugins/Phrasen.js';
+import AbgabetoolStudent from "../../components/Cis/Abgabetool/AbgabetoolStudent.js";
+import AbgabetoolMitarbeiter from "../../components/Cis/Abgabetool/AbgabetoolMitarbeiter.js";
+import AbgabetoolAssistenz from "../../components/Cis/Abgabetool/AbgabetoolAssistenz.js";
+import DeadlineOverview from "../../components/Cis/Abgabetool/DeadlineOverview.js";
+import {capitalize} from "../../helpers/StringHelpers.js";
+
+const app = Vue.createApp({
+ name: 'AbgabetoolApp',
+ components: {
+ AbgabetoolStudent,
+ AbgabetoolMitarbeiter,
+ AbgabetoolAssistenz,
+ DeadlineOverview
+ },
+ data: function() {
+ return {
+ comp: null,
+ uid: null,
+ student_uid: null,
+ stg_kz: null
+ };
+ },
+ methods: {
+
+ },
+ computed: {
+ viewData() {
+ return { uid: this.uid}
+ },
+ student_uid_computed() {
+ return this.student_uid ?? this.uid
+ },
+ stg_kz_computed() {
+ return this.stg_kz ?? null
+ }
+ },
+ created() {
+ },
+ mounted() {
+
+ const root = document.getElementById('abgabetoolroot')
+ const route = root.getAttribute("route");
+ this.comp = route
+
+ const uid = root.getAttribute("uid");
+ this.uid = uid
+
+ const stg_kz = root.getAttribute("stg_kz_prop");
+ this.stg_kz = stg_kz
+
+ const student_uid = root.getAttribute("student_uid_prop");
+ this.student_uid = student_uid
+
+ },
+ template: `
+
+
+
+
+
+
+ `
+});
+app.config.globalProperties.$capitalize = capitalize;
+app.use(primevue.config.default, {
+ zIndex: {
+ overlay: 9000,
+ tooltip: 8000
+ }
+})
+app.directive('tooltip', primevue.tooltip);
+app.use(PluginsPhrasen);
+app.mount('#abgabetoolroot');
diff --git a/public/js/apps/Dashboard/Fhc.js b/public/js/apps/Dashboard/Fhc.js
index e14396cc3..7f988ef0c 100644
--- a/public/js/apps/Dashboard/Fhc.js
+++ b/public/js/apps/Dashboard/Fhc.js
@@ -14,6 +14,7 @@ import Info from "../../components/Cis/Mylv/Semester/Studiengang/Lv/Info.js";
import RoomInformation, {DEFAULT_MODE_RAUMINFO} from "../../components/Cis/Mylv/RoomInformation.js";
import AbgabetoolStudent from "../../components/Cis/Abgabetool/AbgabetoolStudent.js";
import AbgabetoolMitarbeiter from "../../components/Cis/Abgabetool/AbgabetoolMitarbeiter.js";
+import AbgabetoolAssistenz from "../../components/Cis/Abgabetool/AbgabetoolAssistenz.js";
import DeadlineOverview from "../../components/Cis/Abgabetool/DeadlineOverview.js";
import Studium from "../../components/Cis/Studium/Studium.js";
import StgOrgLvPlan from "../../components/Cis/LvPlan/StgOrg.js";
@@ -58,6 +59,12 @@ const router = VueRouter.createRouter({
component: AbgabetoolMitarbeiter,
props: true
},
+ {
+ path: `/Cis/Abgabetool/Assistenz/:stg_kz_prop?`,
+ name: 'AbgabetoolAssistenz',
+ component: AbgabetoolAssistenz,
+ props: true
+ },
{
path: `/Cis/Abgabetool/Deadlines/:person_uid_prop?`,
name: 'DeadlineOverview',
@@ -250,13 +257,16 @@ const app = Vue.createApp({
components: {},
computed: {
isMobile() {
- return /Mobi|Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
+ const smallScreen = window.matchMedia("(max-width: 767px)").matches;
+ const touchCapable = ("ontouchstart" in window) || navigator.maxTouchPoints > 0;
+ return smallScreen;// && touchCapable;
}
},
provide() {
return { // provide injectable & watchable language property
language: Vue.computed(() => this.$p.user_language),
renderers: Vue.computed(() => this.renderers),
+ isMobile: this.isMobile
}
},
methods: {
@@ -295,6 +305,7 @@ const app = Vue.createApp({
}
},
async created(){
+
await this.$api
.call(ApiRenderers.loadRenderers())
.then(res => res.data)
@@ -335,6 +346,7 @@ const app = Vue.createApp({
},
mounted() {
document.addEventListener('click', this.handleClick);
+
},
beforeUnmount() {
document.removeEventListener('click', this.handleClick);
diff --git a/public/js/components/Bootstrap/Modal.js b/public/js/components/Bootstrap/Modal.js
index a84d9d8d7..e320d4429 100644
--- a/public/js/components/Bootstrap/Modal.js
+++ b/public/js/components/Bootstrap/Modal.js
@@ -46,7 +46,8 @@ export default {
"hiddenBsModal",
"hidePreventedBsModal",
"showBsModal",
- "shownBsModal"
+ "shownBsModal",
+ "toggleFullscreen"
],
methods: {
dispose() {
@@ -66,6 +67,7 @@ export default {
},
toggleFullscreen() {
this.fullscreen = !this.fullscreen
+ this.$emit('toggleFullscreen')
}
},
mounted() {
@@ -135,10 +137,16 @@ export default {