diff --git a/application/components/filters/Vertragsverwaltung.php b/application/components/filters/Vertragsverwaltung.php new file mode 100644 index 000000000..b96aee8ea --- /dev/null +++ b/application/components/filters/Vertragsverwaltung.php @@ -0,0 +1,36 @@ + 'core', + 'datasetName' => 'vertragsverwaltung', + 'query' => ' + SELECT + uid, + person_id, + vorname, + nachname, + gebdatum, + vertragsarten, + unternehmen, + ids, + aktiv + FROM + ( + SELECT + b.uid , p.person_id, + p.vorname, p.nachname, + gebdatum, + STRING_AGG(DISTINCT va.bezeichnung, \', \') AS Vertragsarten, + STRING_AGG(DISTINCT u.bezeichnung, \', \') AS Unternehmen, + STRING_AGG(d.dienstverhaeltnis_id::TEXT, \', \') AS ids, + b.aktiv + FROM + hr.tbl_dienstverhaeltnis d + JOIN public.tbl_benutzer b ON d.mitarbeiter_uid = b.uid + JOIN public.tbl_person p ON p.person_id = b.person_id + JOIN public.tbl_organisationseinheit u ON d.oe_kurzbz = u.oe_kurzbz + JOIN hr.tbl_vertragsart va ON d.vertragsart_kurzbz = va.vertragsart_kurzbz + GROUP BY b.uid, p.person_id, p.vorname, p.nachname, b.aktiv + ) as vertragsdaten + ', + 'requiredPermissions' => 'vertrag/mitarbeiter' + ); diff --git a/application/config/abgabe.php b/application/config/abgabe.php index f9b043a34..90aedbd8b 100644 --- a/application/config/abgabe.php +++ b/application/config/abgabe.php @@ -26,7 +26,9 @@ $config['RELEVANT_PAABGABETYPEN_SAMMELMAIL_ASSISTENZ'] = ['end']; $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'; @@ -36,3 +38,8 @@ $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; + +$config['BETREUER_SAMMELMAIL_BUTTON_STUDENT'] = true; diff --git a/application/config/navigation.php b/application/config/navigation.php index f7ba8dca3..c70aba57c 100644 --- a/application/config/navigation.php +++ b/application/config/navigation.php @@ -163,6 +163,13 @@ $config['navigation_header'] = array( 'expand' => true, 'sort' => 50, 'requiredPermissions' => 'lehre/gruppenmanager:r' + ), + 'vertragsverwaltung' => array( + 'link' => site_url('vertragsverwaltung'), + 'description' => 'Vertragsverwaltung', + 'expand' => true, + 'sort' => 51, + 'requiredPermissions' => 'vertrag/mitarbeiter:r' ) ) ), @@ -335,6 +342,18 @@ $config['navigation_menu']['system/issues/Issues/*'] = array( 'target' => '_blank', 'requiredPermissions' => array('admin:rw') ), + +); + +$config['navigation_menu']['vertragsverwaltung/*'] = array( + 'vertragsverwaltung' => array( + 'link' => site_url('vertragsverwaltung'), + 'description' => 'Vertragsverwaltung', + 'icon' => 'home', + 'sort' => 100, + 'target' => '_blank', + 'requiredPermissions' => array('vertrag/mitarbeiter:r') + ) ); $config['navigation_menu']['apps'] = [ diff --git a/application/config/stv.php b/application/config/stv.php index 8942c35e6..34a30a96e 100644 --- a/application/config/stv.php +++ b/application/config/stv.php @@ -130,3 +130,16 @@ $config['students_tab_order'] = [ 'combinePeople', 'archive', ]; + +$config['stv_prestudent_tags'] = [ + 'prioone' => ['readonly' => false], + 'priotwo' => ['readonly' => true], + 'hinweis' => ['readonly' => false], + 'hinweis_assistenz' => ['readonly' => true], + 'hinweis_kf' => ['readonly' => true], + 'hinweis_lehrende' => ['readonly' => false], + 'hinweis_stg_kf' => ['readonly' => true], + 'finished_stg' => ['readonly' => true], + 'finished_kf' => ['readonly' => true], + 'inwork_kf' => ['readonly' => true], +]; diff --git a/application/controllers/Cis/MyLv.php b/application/controllers/Cis/MyLv.php index 49a938553..819d56b05 100644 --- a/application/controllers/Cis/MyLv.php +++ b/application/controllers/Cis/MyLv.php @@ -33,9 +33,4 @@ class MyLv extends Auth_Controller $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'MyLv']); } - - public function Info($studien_semester,$lvid) - { - $this->load->view('Cis/LvInfo',['lvid'=> $lvid, 'studien_semester' => $studien_semester]); - } } diff --git a/application/controllers/Studentenverwaltung.php b/application/controllers/Studentenverwaltung.php index 36c91d5f6..1699ba740 100644 --- a/application/controllers/Studentenverwaltung.php +++ b/application/controllers/Studentenverwaltung.php @@ -28,7 +28,7 @@ class Studentenverwaltung extends Auth_Controller 'basis/prestudentstatus' => $this->permissionlib->isBerechtigt('basis/prestudentstatus'), 'assistenz_stgs' => $this->permissionlib->getSTG_isEntitledFor('assistenz'), 'admin' => $this->permissionlib->isBerechtigt('admin'), - 'assistenz_schreibrechte' => $this->permissionlib->isBerechtigt('assistenz','suid'), + 'assistenz_schreibrechte' => $this->permissionlib->isBerechtigt('assistenz', 'suid'), 'student/keine_studstatuspruefung' => $this->permissionlib->isBerechtigt('student/keine_studstatuspruefung'), 'lehre/reihungstestAufsicht' => $this->permissionlib->isBerechtigt('lehre/reihungstestAufsicht'), 'system/change_outputformat' => $this->permissionlib->getOE_isEntitledFor('system/change_outputformat'), @@ -43,3 +43,5 @@ class Studentenverwaltung extends Auth_Controller ]); } } + + diff --git a/application/controllers/Vertragsverwaltung.php b/application/controllers/Vertragsverwaltung.php new file mode 100644 index 000000000..f68ed1737 --- /dev/null +++ b/application/controllers/Vertragsverwaltung.php @@ -0,0 +1,30 @@ +method] = ['vertrag/mitarbeiter:r']; + #$permissions[$router->method] = ['admin:rw']; + parent::__construct($permissions); + + // Load Libraries + $this->load->library('VariableLib', ['uid' => getAuthUID()]); + } + + /** + * @return void + */ + public function _remap() + { + $this->load->view('Vertragsverwaltung', [ + 'permissions' => [ + 'vertragsverwaltung_schreibrechte' => $this->permissionlib->isBerechtigt('vertrag/mitarbeiter', 'suid') + ] + ]); + } +} diff --git a/application/controllers/api/frontend/v1/Abgabe.php b/application/controllers/api/frontend/v1/Abgabe.php index 5a6331584..43dc18d1c 100644 --- a/application/controllers/api/frontend/v1/Abgabe.php +++ b/application/controllers/api/frontend/v1/Abgabe.php @@ -45,8 +45,9 @@ class Abgabe extends FHCAPI_Controller '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') - ]); + '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'); @@ -86,11 +87,17 @@ class Abgabe extends FHCAPI_Controller $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'); + $BETREUER_SAMMELMAIL_BUTTON_STUDENT = $this->config->item('BETREUER_SAMMELMAIL_BUTTON_STUDENT'); $ret = array( 'old_abgabe_beurteilung_link' => $old_abgabe_beurteilung_link, 'turnitin_link' => $turnitin_link, - 'abgabetypenBetreuer' => $abgabetypenBetreuer + 'abgabetypenBetreuer' => $abgabetypenBetreuer, + 'ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT' => $ASSISTENZ_SAMMELMAIL_BUTTON_STUDENT, + 'ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER' => $ASSISTENZ_SAMMELMAIL_BUTTON_BETREUER, + 'BETREUER_SAMMELMAIL_BUTTON_STUDENT' => $BETREUER_SAMMELMAIL_BUTTON_STUDENT, ); $this->terminateWithSuccess($ret); @@ -151,7 +158,7 @@ class Abgabe extends FHCAPI_Controller $ret = $this->ProjektarbeitModel->getProjektarbeitAbgabetermine($projektarbeit_id); foreach ($ret->retval as $termin) { - $this->checkAbgabeSignatur($termin, $projektarbeit); + $this->checkAbgabeSignatur($termin, $projektarbeit->student_uid); } $this->terminateWithSuccess(array($ret, $projektarbeitIsCurrent)); @@ -368,6 +375,8 @@ class Abgabe extends FHCAPI_Controller $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general'); } + $this->checkPaabgabeDeadline($paabgabe_id); + $this->checkProjektarbeitForFinishedStatus($projektarbeit_id); $zugeordnet = $this->checkZuordnung($projektarbeit_id, getAuthUID()); @@ -398,7 +407,7 @@ class Abgabe extends FHCAPI_Controller $this->terminateWithError($this->p->t('abgabetool', 'c4projektabgabeNichtGefunden'), 'general'); } - $this->checkAbgabeSignatur($paabgabe, $projektarbeit); + $this->checkAbgabeSignatur($paabgabe, $projektarbeit->student_uid); $signaturstatus = $paabgabe->signatur; // update projektarbeit cols @@ -439,6 +448,36 @@ class Abgabe extends FHCAPI_Controller } } + + // validate paabgabe deadline against servertime just in case a student spoofs their local clock and thus + // unlocks the upload ui + private function checkPaabgabeDeadline($paabgabe_id) { + $this->load->model('education/Paabgabe_model', 'PaabgabeModel'); + + $result = $this->PaabgabeModel->load($paabgabe_id); + $paabgabeArr = $this->getDataOrTerminateWithError($result, 'general'); + + if (count($paabgabeArr) > 0) { + $paabgabe = $paabgabeArr[0]; + } else { + $this->terminateWithError($this->p->t('abgabetool', 'c4projektabgabeNichtGefunden'), 'general'); + } + + // in that case any submission date is fine + if($paabgabe->fixtermin === false) return; + + $tz = new DateTimeZone('Europe/Berlin'); + $now = new DateTimeImmutable('now', $tz); + $deadline = DateTimeImmutable::createFromFormat( + 'Y-m-d H:i:s', + $paabgabe->datum . ' 23:59:59', + $tz + ); + + if($now >= $deadline) { + $this->terminateWithError($this->p->t('abgabetool', 'c4deadlineExceeded')); + } + } /** * tabulator tabledata fetch for abgabetool/mitarbeiter @@ -468,6 +507,16 @@ class Abgabe extends FHCAPI_Controller $projektarbeiten = $this->ProjektarbeitModel->getMitarbeiterProjektarbeiten(getAuthUID(), $showAllBool); + $mapFunc = function($projektarbeit) { + return $projektarbeit->projektarbeit_id; + }; + $projektarbeiten_ids = array_map($mapFunc, $projektarbeiten->retval); + + if(count($projektarbeiten_ids) > 0) { + $ret = $this->ProjektarbeitModel->getProjektarbeitenAbgabetermine($projektarbeiten_ids); + $projektabgaben = $this->getDataOrTerminateWithError($ret, 'general'); + } + forEach($projektarbeiten->retval as $pa) { $result = $this->ProjektarbeitModel->getProjektbetreuerAnrede($pa->betreuer_person_id); @@ -484,6 +533,20 @@ class Abgabe extends FHCAPI_Controller Events::trigger('projektbeurteilung_formular_link', $pa->betreuerart_kurzbz, APP_ROOT, $pa->projektarbeit_id, $pa->student_uid, $returnFunc); $pa->beurteilungLinkNew = $newLink; $pa->beurteilungLinkOld = $oldLink; + + // has previously been retrieved via getStudentProjektabgaben but is fetched in advance to avoid having to reload abgaben + $projektarbeitIsCurrent = false; + $returnFunc = function ($result) use (&$projektarbeitIsCurrent) { + $projektarbeitIsCurrent = $result; + }; + Events::trigger('projektarbeit_is_current', $pa->projektarbeit_id, $returnFunc); + $pa->isCurrent = $projektarbeitIsCurrent; + + $filterFunc = function($projektabgabe) use ($pa) { + return $projektabgabe->projektarbeit_id == $pa->projektarbeit_id; + }; + + $pa->abgabetermine = array_values(array_filter($projektabgaben, $filterFunc)); } @@ -539,7 +602,18 @@ class Abgabe extends FHCAPI_Controller 'insertamum' => date('Y-m-d H:i:s') ) ); - $this->logLib->logInfoDB(array('paabgabe created',$result, getAuthUID(), getAuthPersonId())); + $this->logLib->logInfoDB(array('paabgabe created',array( + 'projektarbeit_id' => $projektarbeit_id, + 'paabgabetyp_kurzbz' => $paabgabetyp_kurzbz, + 'fixtermin' => $fixtermin, + 'datum' => $datum, + 'kurzbz' => $kurzbz, + 'note' => $note, + 'beurteilungsnotiz' => $beurteilungsnotiz, + 'upload_allowed' => $upload_allowed, + 'insertvon' => getAuthUID(), + 'insertamum' => date('Y-m-d H:i:s') + ), getAuthUID(), getAuthPersonId())); } else { // load existing entry of paabgabe and check if note has changed to negativ, to avoid sending when // only notiz has changed. @@ -713,7 +787,16 @@ class Abgabe extends FHCAPI_Controller $abgaben[]= getData($this->PaabgabeModel->load($dataAbgabe))[0]; } - $this->logLib->logInfoDB(array('serientermin angelegt',$res, getAuthUID(), getAuthPersonId())); + $this->logLib->logInfoDB(array('serientermin angelegt',array( + 'projektarbeit_id' => $projektarbeit_id, + 'paabgabetyp_kurzbz' => $paabgabetyp_kurzbz, + 'fixtermin' => $fixtermin, + 'datum' => $datum, + 'kurzbz' => $kurzbz, + 'upload_allowed' => $upload_allowed, + 'insertvon' => getAuthUID(), + 'insertamum' => date('Y-m-d H:i:s') + ), getAuthUID(), getAuthPersonId())); $this->terminateWithSuccess($abgaben); } @@ -761,15 +844,28 @@ class Abgabe extends FHCAPI_Controller /** * helper function to fetch the correct email for a projektarbeits erstbetreuer */ - private function getProjektbetreuerEmail($projektarbeit_id) { + private function getProjektbetreuerEmailByProjektarbeitID($projektarbeit_id) { $this->load->model('education/Projektarbeit_model', 'ProjektarbeitModel'); $result = $this->ProjektarbeitModel->getProjektbetreuerEmail($projektarbeit_id); - $email = $this->getDataOrTerminateWithError($result, 'general'); - - return $email[0]->uid ? $email[0]->uid.'@'.DOMAIN : $email[0]->private_email; + if(count($result->retval) > 0) { + $email = getData($result); + return $email[0]->uid ? $email[0]->uid.'@'.DOMAIN : $email[0]->private_email; + } else return ''; } + /** + * 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 /** @@ -784,7 +880,10 @@ class Abgabe extends FHCAPI_Controller $allowed_noten_abgabetool = $this->config->item('ALLOWED_NOTEN_ABGABETOOL'); - $this->terminateWithSuccess(array($noten, $allowed_noten_abgabetool)); + $nonfinal_noten_abgabetool = $this->config->item('NONFINAL_NOTEN_ABGABETOOL'); + + + $this->terminateWithSuccess(array($noten, $allowed_noten_abgabetool, $nonfinal_noten_abgabetool)); } /** @@ -886,16 +985,17 @@ class Abgabe extends FHCAPI_Controller // 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)); - - // check the signature status for enduploads - foreach($projektarbeit->abgabetermine as $abgabe) { - $this->checkAbgabeSignatur($abgabe, $projektarbeit); - } } $this->terminateWithSuccess(array($projektarbeiten, DOMAIN)); @@ -1021,10 +1121,33 @@ class Abgabe extends FHCAPI_Controller $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, $projektarbeit) { + private function checkAbgabeSignatur($abgabe, $student_uid) { $paabgabetypenToCheck = $this->config->item('SIGNATUR_CHECK_PAABGABETYPEN'); if(!in_array($abgabe->paabgabetyp_kurzbz, $paabgabetypenToCheck)) { @@ -1036,7 +1159,7 @@ class Abgabe extends FHCAPI_Controller return; } - $path = PAABGABE_PATH.$abgabe->paabgabe_id.'_'.$projektarbeit->student_uid.'.pdf'; + $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)) { @@ -1121,9 +1244,9 @@ class Abgabe extends FHCAPI_Controller $maildata['bewertunglink'] = $projektarbeitIsCurrent && $paabgabetyp_kurzbz == 'end' ? "

Zur Beurteilung der Arbeit

" : ""; $maildata['token'] = ""; - $email = $this->getProjektbetreuerEmail($projektarbeit_id); + $email = $this->getProjektbetreuerEmailByProjektarbeitID($projektarbeit_id); - if(!$email) $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailBegutachter'), 'general'); + if(!$email) $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailBegutachterv2'), 'general'); $mailres = sendSanchoMail( 'ParbeitsbeurteilungEndupload', @@ -1136,7 +1259,7 @@ class Abgabe extends FHCAPI_Controller if(!$mailres) { - $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailBegutachter'), 'general'); + $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailBegutachterv2'), 'general'); } // 2. Begutachter mail, wenn Endabgabe, mit Token wenn extern @@ -1156,14 +1279,14 @@ class Abgabe extends FHCAPI_Controller if (!$tokenGenRes) { - $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailZweitBegutachter'), 'general'); + $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailZweitBegutachterv2'), 'general'); } $begutachterMitTokenRetval = getData($this->ProjektbetreuerModel->getZweitbegutachterWithToken($bperson_id, $projektarbeit_id, $studentUser->uid, $begutachter->person_id)); if (!$begutachterMitTokenRetval && count($begutachterMitTokenRetval) <= 0) { - $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailZweitBegutachter'), 'general'); + $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailZweitBegutachterv2'), 'general'); } $begutachterMitToken = $begutachterMitTokenRetval[0]; @@ -1197,7 +1320,7 @@ class Abgabe extends FHCAPI_Controller if (!$mailres) { - $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailBegutachter'), 'general'); + $this->terminateWithError($this->p->t('abgabetool', 'c4fehlerMailBegutachterv2'), 'general'); } } diff --git a/application/controllers/api/frontend/v1/Documents.php b/application/controllers/api/frontend/v1/Documents.php index 7b2fc4a15..dcc0bb9ac 100644 --- a/application/controllers/api/frontend/v1/Documents.php +++ b/application/controllers/api/frontend/v1/Documents.php @@ -208,7 +208,6 @@ class Documents extends FHCAPI_Controller $this->load->model('system/Vorlage_model', 'VorlageModel'); $result = $this->VorlageModel->load($xsl); - $this->addMeta("ress", $result); $vorlage = current($this->getDataOrTerminateWithError($result)); if (!$vorlage) show_404(); @@ -251,6 +250,9 @@ class Documents extends FHCAPI_Controller 'studiensemester_kurzbz' => $ss, 'student_uid' => $akteData['uid'] ]); + + if (!hasData($result)) $this->terminateWithError($this->p->t("stv", "error_noLehrverbandAssigned")); + $res = current($this->getDataOrTerminateWithError($result)); $studiengang_kz = $res->studiengang_kz; diff --git a/application/controllers/api/frontend/v1/detailheader/Detailheader.php b/application/controllers/api/frontend/v1/detailheader/Detailheader.php new file mode 100644 index 000000000..ada10c5b6 --- /dev/null +++ b/application/controllers/api/frontend/v1/detailheader/Detailheader.php @@ -0,0 +1,53 @@ + ['vertrag/mitarbeiter:r'], + 'getPersonAbteilung' => ['vertrag/mitarbeiter:r'], + 'getLeitungOrg' => ['vertrag/mitarbeiter:r'], + ]); + } + + public function getHeader($person_id) + { + $this->load->model('ressource/Mitarbeiter_model', 'Mitarbeitermodel'); + + $result = $this->Mitarbeitermodel->getHeader($person_id); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess(current($data)); + } + + public function getPersonAbteilung($mitarbeiter_uid) + { + $this->load->model('ressource/Mitarbeiter_model', 'Mitarbeitermodel'); + + $result = $this->Mitarbeitermodel->getPersonAbteilung($mitarbeiter_uid); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess(current($data)); + } + + public function getLeitungOrg($oekurzbz) + { + $this->load->model('ressource/Mitarbeiter_model', 'Mitarbeitermodel'); + + $result = $this->Mitarbeitermodel->getLeitungOrg($oekurzbz); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess(current($data)); + } + +} + + diff --git a/application/controllers/api/frontend/v1/fotoHandling/Foto.php b/application/controllers/api/frontend/v1/fotoHandling/Foto.php new file mode 100644 index 000000000..4945ddd85 --- /dev/null +++ b/application/controllers/api/frontend/v1/fotoHandling/Foto.php @@ -0,0 +1,237 @@ + ['admin:r', 'assistenz:r'], + 'deleteFoto' => ['admin:r', 'assistenz:r'], + ]); + + //Load Models and Libraries + $this->load->model('person/Person_model', 'PersonModel'); + $this->load->model("crm/Akte_model", "AkteModel"); + $this->load->model('person/Fotostatusperson_model', 'FotostatusPersonModel'); + + $this->loadPhrases([ + 'ui', + 'header' + ]); + } + + public function uploadFoto($person_id) + { + if(!$person_id) + { + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Person_id']), self::ERROR_TYPE_GENERAL); + } + + $data = json_decode(file_get_contents("php://input"), true); + + if (!empty($data['image'])) + { + $base64 = $data['image']; + $resizedImage1 = $this->_resize($base64, 827, 1063); + + if (is_null($resizedImage1)) + return $this->terminateWithError($this->p->t('header', 'error_fotoupload'), self::ERROR_TYPE_GENERAL); + + $akte = $this->AkteModel->loadWhere(array('person_id' => $person_id, 'dokument_kurzbz' => 'Lichtbil')); + + $akteUpdateData = array( + 'dokument_kurzbz' => 'Lichtbil', + 'person_id' => $person_id, + 'inhalt' => $resizedImage1, + 'mimetype' => 'image/jpg', + 'erstelltam' => date('c'), + 'gedruckt' => false, + 'titel' => 'Lichtbild_' . $person_id . '.jpg', + 'bezeichnung' => 'Lichtbild gross', + 'insertamum' => date('c'), + 'insertvon' => getAuthUID(), + ); + + if (hasData($akte)) { + $akte_id = getData($akte)[0]->akte_id; + + $akteUpdateData['updateamum'] = date('c'); + $akteUpdateData['updatevon'] = getAuthUID(); + $akteResult = $this->AkteModel->update(array('akte_id' => $akte_id), $akteUpdateData); + } else { + $akteResult = $this->AkteModel->insert($akteUpdateData); + } + + if (isError($akteResult)) { + return $this->terminateWithError(getError($akteResult), self::ERROR_TYPE_GENERAL); + } + + $resizedImage2 = $this->_resize($base64, 101, 130); + + if (is_null($resizedImage2)) + return $this->terminateWithError($this->p->t('header', 'error_fotoupload'), self::ERROR_TYPE_GENERAL); + + $result = $this->_updateFoto($person_id, $resizedImage2); + + if (!isError($result)) { + $this->FotostatusPersonModel->insert(array( + 'person_id' => $person_id, + 'fotostatus_kurzbz' => 'hochgeladen', + 'datum' => date('Y-m-d'), + 'updateamum' => date('c'), + 'updatevon' => getAuthUID(), + 'insertamum' => date('c'), + 'insertvon' => getAuthUID(), + )); + + return $this->terminateWithSuccess($base64); + } + } + else + { + $this->terminateWithError($this->p->t('header', 'error_noPhoto'), self::ERROR_TYPE_GENERAL); + } + } + + public function deleteFoto($person_id) + { + if(!$person_id) + { + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Person_id']), self::ERROR_TYPE_GENERAL); + } + + $result = $this->_deleteFoto($person_id); + + if (isError($result)) + { + return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); + } + return $this->terminateWithSuccess($result); + } + + private function _resize($imageData, $maxwidth, $maxheight, $quality = 90) + { + $meta = getimagesize($imageData); + if (!$meta) + { + return null; + } + + $src_width = $meta[0]; + $src_height = $meta[1]; + $mime = $meta['mime']; + + switch ($mime) { + case 'image/jpeg': + case 'image/jpg': + $imagecreated = imagecreatefromjpeg($imageData); + break; + case 'image/png': + $imagecreated = imagecreatefrompng($imageData); + break; + case 'image/gif': + $imagecreated = imagecreatefromgif($imageData); + break; + default: + return null; + } + + + if (!$imagecreated) + { + return null; + } + + $src_aspect_ratio = $src_width / $src_height; + $thu_aspect_ratio = $maxwidth / $maxheight; + + if ($src_width <= $maxwidth && $src_height <= $maxheight) + { + $thu_width = $src_width; + $thu_height = $src_height; + } + elseif ($thu_aspect_ratio > $src_aspect_ratio) + { + $thu_width = (int) ($maxheight * $src_aspect_ratio); + $thu_height = $maxheight; + } + else + { + $thu_width = $maxwidth; + $thu_height = (int) ($maxwidth / $src_aspect_ratio); + } + + $imageScaled = imagecreatetruecolor($thu_width, $thu_height); + + if ($mime === 'image/png') + { + $background = imagecolorallocate($imageScaled , 0, 0, 0); + imagecolortransparent($imageScaled, $background); + imagealphablending($imageScaled, false); + imagesavealpha($imageScaled, true); + } + + imagecopyresampled($imageScaled, $imagecreated, 0, 0, 0, 0, $thu_width, $thu_height, $src_width, $src_height); + + if ($mime === "image/gif") + { + $background = imagecolorallocate($imageScaled, 0, 0, 0); + imagecolortransparent($imageScaled, $background); + } + + if (!empty($imageScaled)) + { + ob_start(); + + if ($mime == 'image/png') + imagepng($imageScaled, NULL); + else if ($mime === 'image/gif') + imagegif($imageScaled, NULL); + else + imagejpeg($imageScaled, NULL, $quality); + + $resizedImageData = ob_get_contents(); + ob_end_clean(); + @imagedestroy($imagecreated); + @imagedestroy($imageScaled); + + + if (!empty($resizedImageData)) + { + return base64_encode($resizedImageData); + } + return null; + } + return null; + } + + private function _updateFoto($person_id, $foto) + { + $personJson['foto'] = $foto; + $result = $this->PersonModel->update($person_id, $personJson); + + if (isError($result)) + { + return error($result->msg, EXIT_ERROR); + } + + return $result; + } + + private function _deleteFoto($person_id) + { + $personJson['foto'] = null; + $result = $this->PersonModel->update($person_id, $personJson); + + if (isError($result)) + { + return error($result->msg, EXIT_ERROR); + } + + return $result; + } +} diff --git a/application/controllers/api/frontend/v1/notiz/NotizAnrechnung.php b/application/controllers/api/frontend/v1/notiz/NotizAnrechnung.php new file mode 100644 index 000000000..30dae9a50 --- /dev/null +++ b/application/controllers/api/frontend/v1/notiz/NotizAnrechnung.php @@ -0,0 +1,44 @@ + ['admin:r', 'assistenz:r'], + ]); + + //Load Models + $this->load->model('person/Notiz_model', 'NotizModel'); + $this->load->model('person/Notizzuordnung_model', 'NotizzuordnungModel'); + + // Load Libraries + $this->load->library('VariableLib', ['uid' => getAuthUID()]); + + // Load language phrases + $this->loadPhrases([ + 'ui' + ]); + } + + public function isBerechtigt($id, $typeId) + { + if($typeId != "anrechnung_id") + { + $this->terminateWithError($this->p->t('ui','error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL); + } + + //TODO define permission + if(!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid')) + { + $result = $this->p->t('lehre','error_keineSchreibrechte'); + + $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); + } + $this->terminateWithSuccess("berechtigt in überschreibender Funktion"); + } +} \ No newline at end of file diff --git a/application/controllers/api/frontend/v1/notiz/NotizBestellung.php b/application/controllers/api/frontend/v1/notiz/NotizBestellung.php new file mode 100644 index 000000000..e30628f33 --- /dev/null +++ b/application/controllers/api/frontend/v1/notiz/NotizBestellung.php @@ -0,0 +1,43 @@ + ['admin:r', 'assistenz:r'], + ]); + + //Load Models + $this->load->model('person/Notiz_model', 'NotizModel'); + $this->load->model('person/Notizzuordnung_model', 'NotizzuordnungModel'); + + // Load Libraries + $this->load->library('VariableLib', ['uid' => getAuthUID()]); + + // Load language phrases + $this->loadPhrases([ + 'ui' + ]); + } + + public function isBerechtigt($id, $typeId) + { + if($typeId != "bestellung_id") + { + $this->terminateWithError($this->p->t('ui','error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL); + } + //TODO define permission + if(!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid')) + { + $result = $this->p->t('lehre','error_keineSchreibrechte'); + + $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); + } + $this->terminateWithSuccess("berechtigt in überschreibender Funktion"); + } +} \ No newline at end of file diff --git a/application/controllers/api/frontend/v1/notiz/NotizLehreinheit.php b/application/controllers/api/frontend/v1/notiz/NotizLehreinheit.php index f8e1f816b..a3b96d477 100644 --- a/application/controllers/api/frontend/v1/notiz/NotizLehreinheit.php +++ b/application/controllers/api/frontend/v1/notiz/NotizLehreinheit.php @@ -17,5 +17,106 @@ class NotizLehreinheit extends Notiz_Controller 'getMitarbeiter' => ['admin:r', 'assistenz:r'], 'isBerechtigt' => ['admin:r', 'assistenz:r'], ]); + + //Load Models + $this->load->model('person/Notiz_model', 'NotizModel'); + $this->load->model('person/Notizzuordnung_model', 'NotizzuordnungModel'); + $this->load->model('education/Lehreinheit_model', 'LehreinheitModel'); + + // Load Libraries + $this->load->library('VariableLib', ['uid' => getAuthUID()]); + + //Permission checks for allowed Oes + $allowedOes = $this->permissionlib->getOE_isEntitledFor('assistenz') ?: []; + + if ($this->router->method == 'addNewNotiz') + { + $json = $this->input->post('data'); + $post_data = json_decode($json, true); + $lehreinheit_id = $post_data['id']; + + if(!$lehreinheit_id) + { + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Lehreinheit ID']), self::ERROR_TYPE_GENERAL); + } + $this->_checkAllowedOesFromLehreinheit($lehreinheit_id, $allowedOes); + } + + if ($this->router->method == 'updateNotiz') + { + $json = $this->input->post('data'); + $post_data = json_decode($json, true); + $notiz_id = $post_data['notiz_id']; + + if(!$notiz_id) + { + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Notiz ID']), self::ERROR_TYPE_GENERAL); + } + + //get lehreinheit_id + $result = $this->NotizzuordnungModel->loadWhere(['notiz_id' => $notiz_id]); + + $data = $this->getDataOrTerminateWithError($result); + $lehreinheit_id = current($data)->lehreinheit_id; + + if(!$lehreinheit_id) + { + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Lehreinheit ID']), self::ERROR_TYPE_GENERAL); + } + $this->_checkAllowedOesFromLehreinheit($lehreinheit_id, $allowedOes); + } + + if ($this->router->method == 'deleteNotiz') + { + $notiz_id = $this->input->post('notiz_id'); + $lehreinheit_id = $this->input->post('id'); + + if(!$notiz_id) + { + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Notiz ID']), self::ERROR_TYPE_GENERAL); + } + + if(!$lehreinheit_id) + { + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Lehreinheit ID']), self::ERROR_TYPE_GENERAL); + } + $this->_checkAllowedOesFromLehreinheit($lehreinheit_id, $allowedOes); + } + + // Load language phrases + $this->loadPhrases([ + 'ui' + ]); } -} \ No newline at end of file + + private function _checkAllowedOesFromLehreinheit($lehreinheit_id, $allowedOes) + { + //get oe from lehreinheit + $result = $this->LehreinheitModel->getOes($lehreinheit_id); + $data = $this->getDataOrTerminateWithError($result); + $oes = current($data); + + if (!in_array($oes, $allowedOes)) + { + return $this->terminateWithError($this->p->t('ui', 'error_keineBerechtigungStg') . " " . $oes, self::ERROR_TYPE_GENERAL); + } + } + + public function isBerechtigt($id, $typeId) + { + if($typeId != "lehreinheit_id") + { + $this->terminateWithError($this->p->t('ui','error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL); + } + + if(!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid')) + { + $result = $this->p->t('lehre','error_keineSchreibrechte'); + + $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); + } + $this->terminateWithSuccess("berechtigt in überschreibender Funktion"); + } + + +} diff --git a/application/controllers/api/frontend/v1/notiz/NotizMitarbeiter.php b/application/controllers/api/frontend/v1/notiz/NotizMitarbeiter.php new file mode 100644 index 000000000..f7de4b47b --- /dev/null +++ b/application/controllers/api/frontend/v1/notiz/NotizMitarbeiter.php @@ -0,0 +1,44 @@ + ['admin:r', 'assistenz:r'], + ]); + + //Load Models + $this->load->model('person/Notiz_model', 'NotizModel'); + $this->load->model('person/Notizzuordnung_model', 'NotizzuordnungModel'); + + // Load Libraries + $this->load->library('VariableLib', ['uid' => getAuthUID()]); + + // Load language phrases + $this->loadPhrases([ + 'ui' + ]); + } + + public function isBerechtigt($id, $typeId) + { + if($typeId != "mitarbeiter_uid") + { + $this->terminateWithError($this->p->t('ui','error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL); + } + + //TODO define permission + if(!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid')) + { + $result = $this->p->t('lehre','error_keineSchreibrechte'); + + $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); + } + $this->terminateWithSuccess("berechtigt in überschreibender Funktion"); + } +} \ No newline at end of file diff --git a/application/controllers/api/frontend/v1/notiz/NotizPerson.php b/application/controllers/api/frontend/v1/notiz/NotizPerson.php index 23a8fd199..a047129d7 100644 --- a/application/controllers/api/frontend/v1/notiz/NotizPerson.php +++ b/application/controllers/api/frontend/v1/notiz/NotizPerson.php @@ -20,33 +20,100 @@ class NotizPerson extends Notiz_Controller 'isBerechtigt' => ['admin:r', 'assistenz:r'], 'getCountNotes' => ['admin:r', 'assistenz:r'], ]); + + //Load Models + $this->load->model('person/Benutzer_model', 'BenutzerModel'); + $this->load->model('crm/Student_model', 'StudentModel'); + $this->load->model('crm/Prestudent_model', 'PrestudentModel'); + + //Permission checks for allowed Oes + if ($this->router->method == 'addNewNotiz') + { + $json = $this->input->post('data'); + $post_data = json_decode($json, true); + $person_id = $post_data['id']; + + $allowedStgs = $this->permissionlib->getSTG_isEntitledFor('assistenz') ?: []; + + if(!$person_id) + { + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Person ID']), self::ERROR_TYPE_GENERAL); + } + $this->_checkIfBerechtigungForOnePrestudentExists($person_id, $allowedStgs); + } + + if ( $this->router->method == 'updateNotiz') + { + $json = $this->input->post('data'); + $post_data = json_decode($json, true); + $notiz_id = $post_data['notiz_id']; + + if(!$notiz_id) + { + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Notiz ID']), self::ERROR_TYPE_GENERAL); + } + + //get person_id + $result = $this->NotizzuordnungModel->loadWhere(['notiz_id' => $notiz_id]); + + $data = $this->getDataOrTerminateWithError($result); + $person_id = current($data)->person_id; + + $allowedStgs = $this->permissionlib->getSTG_isEntitledFor('assistenz') ?: []; + $this->_checkIfBerechtigungForOnePrestudentExists($person_id, $allowedStgs); + } + + if ($this->router->method == 'deleteNotiz' ) + { + $notiz_id = $this->input->post('notiz_id'); + $person_id = $this->input->post('id'); + + if(!$notiz_id) + { + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Notiz ID']), self::ERROR_TYPE_GENERAL); + } + + if(!$person_id) + { + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'person ID']), self::ERROR_TYPE_GENERAL); + } + + $allowedStgs = $this->permissionlib->getSTG_isEntitledFor('assistenz') ?: []; + $this->_checkIfBerechtigungForOnePrestudentExists($person_id, $allowedStgs); + } } public function isBerechtigt($id, $typeId) { if($typeId != "person_id") { - return $this->terminateWithError($this->p->t('ui', 'error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL); + $this->terminateWithError($this->p->t('ui', 'error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL); } - //TODO define permission if (!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid')) { $result = $this->p->t('lehre', 'error_keineSchreibrechte'); - - return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); + $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); } - return $this->outputJsonSuccess(true); + $this->terminateWithSuccess("berechtigt in überschreibender Funktion"); } - public function loadDokumente() + //stv: if person has permission of one studiengang of person -> permission to add/update/delete Note + private function _checkIfBerechtigungForOnePrestudentExists($person_id, $allowedStgs) { - $notiz_id = $this->input->post('notiz_id'); + $result = $this->PrestudentModel->loadWhere(['person_id' => $person_id]); + $data = $this->getDataOrTerminateWithError($result); - // TODO(chris): make CI variant of endpoint - $this->NotizModel->addSelect($this->NotizModel->escape(base_url('content/notizdokdownload.php?id=')) . ' || campus.tbl_dms_version.dms_id AS preview'); - - return parent::loadDokumente(); + $checkarray = []; + foreach ($data as $item) + { + if(in_array($item->studiengang_kz, $allowedStgs)) + { + return true; + } + } + + $this->terminateWithError($this->p->t('ui', 'error_keineBerechtigungStg'), self::ERROR_TYPE_GENERAL); } -} \ No newline at end of file +} diff --git a/application/controllers/api/frontend/v1/notiz/NotizPrestudent.php b/application/controllers/api/frontend/v1/notiz/NotizPrestudent.php new file mode 100644 index 000000000..5e6cd747c --- /dev/null +++ b/application/controllers/api/frontend/v1/notiz/NotizPrestudent.php @@ -0,0 +1,117 @@ + ['admin:r', 'assistenz:r'], + ]); + + //Load Models + $this->load->model('person/Notiz_model', 'NotizModel'); + $this->load->model('person/Notizzuordnung_model', 'NotizzuordnungModel'); + $this->load->model('crm/Student_model', 'StudentModel'); + + // Load Libraries + $this->load->library('VariableLib', ['uid' => getAuthUID()]); + + // Load language phrases + $this->loadPhrases([ + 'ui' + ]); + + //Permission checks for Studiengangsarray + $allowedStgs = $this->permissionlib->getSTG_isEntitledFor('assistenz') ?: []; + + if ($this->router->method == 'addNewNotiz') + { + $json = $this->input->post('data'); + $post_data = json_decode($json, true); + $prestudent_id = $post_data['id']; + + if(!$prestudent_id) + { + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Lehreinheit ID']), self::ERROR_TYPE_GENERAL); + } + $this->_checkAllowedOesFromPrestudent($prestudent_id, $allowedStgs); + } + + if ($this->router->method == 'updateNotiz') + { + $json = $this->input->post('data'); + $post_data = json_decode($json, true); + $notiz_id = $post_data['notiz_id']; + + if(!$notiz_id) + { + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Notiz ID']), self::ERROR_TYPE_GENERAL); + } + + //get prestudent_id + $result = $this->NotizzuordnungModel->loadWhere(['notiz_id' => $notiz_id]); + + $data = $this->getDataOrTerminateWithError($result); + $prestudent_id = current($data)->prestudent_id; + + if(!$prestudent_id) + { + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Prestudent ID']), self::ERROR_TYPE_GENERAL); + } + $this->_checkAllowedOesFromPrestudent($prestudent_id, $allowedStgs); + } + + if ($this->router->method == 'deleteNotiz') + { + $notiz_id = $this->input->post('notiz_id'); + $prestudent_id = $this->input->post('id'); + + if(!$notiz_id) + { + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Notiz ID']), self::ERROR_TYPE_GENERAL); + } + + if(!$prestudent_id) + { + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Prestudent ID']), self::ERROR_TYPE_GENERAL); + } + $this->_checkAllowedOesFromPrestudent($prestudent_id, $allowedStgs); + } + } + + public function isBerechtigt($id, $typeId) + { + if($typeId != "prestudent_id") + { + $this->terminateWithError($this->p->t('ui','error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL); + } + + if(!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid')) + { + $result = $this->p->t('lehre','error_keineSchreibrechte'); + + $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); + } + $this->terminateWithSuccess("berechtigt in überschreibender Funktion"); + } + + private function _checkAllowedOesFromPrestudent($prestudent_id, $allowedStgs) + { + $student_uid = $this->StudentModel->getUID($prestudent_id); + + $result = $this->StudentModel->loadWhere(['student_uid' => $student_uid]); + + $data = $this->getDataOrTerminateWithError($result); + $studiengang_kz = current($data)->studiengang_kz; + + if (!in_array($studiengang_kz, $allowedStgs)) + { + return $this->terminateWithError($this->p->t('ui', 'error_keineBerechtigungStg'), self::ERROR_TYPE_GENERAL); + } + } + +} \ No newline at end of file diff --git a/application/controllers/api/frontend/v1/notiz/NotizProjekt.php b/application/controllers/api/frontend/v1/notiz/NotizProjekt.php new file mode 100644 index 000000000..9cdde36ae --- /dev/null +++ b/application/controllers/api/frontend/v1/notiz/NotizProjekt.php @@ -0,0 +1,32 @@ + ['admin:r', 'assistenz:r'], + ]); + } + + public function isBerechtigt($id, $typeId) + { + if($typeId != "projekt_kurzbz") + { + $this->terminateWithError($this->p->t('ui','error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL); + } + + //TODO define permission + if(!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid')) + { + $result = $this->p->t('lehre','error_keineSchreibrechte'); + + $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); + } + $this->terminateWithSuccess("berechtigt in überschreibender Funktion"); + } +} \ No newline at end of file diff --git a/application/controllers/api/frontend/v1/notiz/NotizProjektphase.php b/application/controllers/api/frontend/v1/notiz/NotizProjektphase.php new file mode 100644 index 000000000..7a82c658e --- /dev/null +++ b/application/controllers/api/frontend/v1/notiz/NotizProjektphase.php @@ -0,0 +1,32 @@ + ['admin:r', 'assistenz:r'], + ]); + } + + public function isBerechtigt($id, $typeId) + { + if($typeId != "projektphase_id") + { + $this->terminateWithError($this->p->t('ui','error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL); + } + + //TODO define permission + if(!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid')) + { + $result = $this->p->t('lehre','error_keineSchreibrechte'); + + $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); + } + $this->terminateWithSuccess("berechtigt in überschreibender Funktion"); + } +} \ No newline at end of file diff --git a/application/controllers/api/frontend/v1/notiz/NotizProjekttask.php b/application/controllers/api/frontend/v1/notiz/NotizProjekttask.php new file mode 100644 index 000000000..aadb04f40 --- /dev/null +++ b/application/controllers/api/frontend/v1/notiz/NotizProjekttask.php @@ -0,0 +1,32 @@ + ['admin:r', 'assistenz:r'], + ]); + } + + public function isBerechtigt($id, $typeId) + { + if($typeId != "projekttask_id") + { + $this->terminateWithError($this->p->t('ui','error_typeNotizIdIncorrect'), self::ERROR_TYPE_GENERAL); + } + + //TODO define permission + if(!$this->permissionlib->isBerechtigt('admin', 'suid') && !$this->permissionlib->isBerechtigt('assistenz', 'suid')) + { + $result = $this->p->t('lehre','error_keineSchreibrechte'); + + $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); + } + $this->terminateWithSuccess("berechtigt in überschreibender Funktion"); + } +} \ No newline at end of file diff --git a/application/controllers/api/frontend/v1/studstatus/Unterbrechung.php b/application/controllers/api/frontend/v1/studstatus/Unterbrechung.php index abf58cf4f..72d5dbccc 100644 --- a/application/controllers/api/frontend/v1/studstatus/Unterbrechung.php +++ b/application/controllers/api/frontend/v1/studstatus/Unterbrechung.php @@ -127,9 +127,9 @@ class Unterbrechung extends FHCAPI_Controller $this->form_validation->set_rules( 'datum_wiedereinstieg', 'Datum Wiedereinstieg', - 'required|callback_isValidDate|callback_isDateInFuture', + 'required|is_valid_date|callback_isDateInFuture', [ - 'isValidDate' => $this->p->t('ui', 'error_invalid_date'), + 'is_valid_date' => $this->p->t('ui', 'error_invalid_date'), 'isDateInFuture' => $this->p->t('ui', 'error_invalid_date') ] ); @@ -209,18 +209,9 @@ class Unterbrechung extends FHCAPI_Controller $this->terminateWithSuccess(getData($result)); } - public function isValidDate($date) - { - try { - new DateTime($date); - } catch (Exception $e) { - return false; - } - return true; - } - public function isDateInFuture($date) { return new DateTime() < new DateTime($date); } } + diff --git a/application/controllers/api/frontend/v1/stv/Aufnahmetermine.php b/application/controllers/api/frontend/v1/stv/Aufnahmetermine.php index 26033908d..437ba42ad 100644 --- a/application/controllers/api/frontend/v1/stv/Aufnahmetermine.php +++ b/application/controllers/api/frontend/v1/stv/Aufnahmetermine.php @@ -36,15 +36,44 @@ class Aufnahmetermine extends FHCAPI_Controller // Load models $this->load->model('crm/Reihungstest_model', 'ReihungstestModel'); $this->load->model('crm/RtPerson_model', 'RtPersonModel'); + $this->load->model('organisation/Studienplan_model', 'StudienplanModel'); + $this->load->model('organisation/Studienordnung_model', 'StudienordnungModel'); + $this->load->model('organisation/Studiengang_model', 'StudiengangModel'); } public function getAufnahmetermine($person_id) { $result = $this->ReihungstestModel->getReihungstestPerson($person_id); + $arrayRt = $this->getDataOrTerminateWithError($result); - $data = $this->getDataOrTerminateWithError($result); + foreach ($arrayRt as $item) { + //Studienplan + $result = $this->StudienplanModel->loadWhere([ + 'studienplan_id' => $item->studienplan_id + ]); + $data = $this->getDataOrTerminateWithError($result); + $studienordnung_id_ber = current($data)->studienordnung_id; - $this->terminateWithSuccess($data); + //Studienordnung + $result = $this->StudienordnungModel->loadWhere([ + 'studienordnung_id' => $studienordnung_id_ber + ]); + $data = $this->getDataOrTerminateWithError($result); + $studiengang_kz_ber = current($data)->studiengang_kz; + + //Studiengang von studiengang_kz_ber + $result = $this->StudiengangModel->load($studiengang_kz_ber); + $data = $this->getDataOrTerminateWithError($result); + + $studiengangkurzbzlang_ber = current($data)->kurzbzlang; + $typ_ber = current($data)->typ; + + //add to Array + $item->studiengang_kz_ber = $studiengang_kz_ber; + $item->studiengangkurzbzlang_ber = $studiengangkurzbzlang_ber; + $item->studiengangtyp_ber = $typ_ber; + } + $this->terminateWithSuccess($arrayRt); } public function insertAufnahmetermin() @@ -60,7 +89,6 @@ class Aufnahmetermine extends FHCAPI_Controller return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Person ID']), self::ERROR_TYPE_GENERAL); } - $rt_id = (isset($formData['rt_id']) && !empty($formData['rt_id'])) ? $formData['rt_id'] : null; $anmeldedatum = (isset($formData['anmeldedatum']) && !empty($formData['anmeldedatum'])) ? $formData['anmeldedatum'] : null; $teilgenommen = (isset($formData['teilgenommen']) && !empty($formData['teilgenommen'])) ? $formData['teilgenommen'] : false; @@ -224,7 +252,11 @@ class Aufnahmetermine extends FHCAPI_Controller ) ); - $data = $this->getDataOrTerminateWithError($result); + //check if existing placementtest + if(!hasData($result)) + $this->terminateWithSuccess([]); + else + $data = getData($result); $studienplan_arr = []; $include_ids = []; @@ -233,12 +265,18 @@ class Aufnahmetermine extends FHCAPI_Controller if($item->studienplan_id != null) $studienplan_arr[] = $item->studienplan_id; } + if(!hasData($studienplan_arr)) + $this->terminateWithSuccess([]); //get Placementtests Person $person_id = $this->_getPersonId($prestudent_id); $resultRt = $this->ReihungstestModel->getReihungstestPerson($person_id); - $dataRt = $this->getDataOrTerminateWithError($resultRt); + //check if existing placementtest + if(!hasData($result)) + $this->terminateWithSuccess([]); + else + $dataRt = getData($resultRt); foreach ($dataRt as $item) { @@ -354,6 +392,7 @@ class Aufnahmetermine extends FHCAPI_Controller $person_id = $this->input->get('person_id'); $punkte = $this->input->get('punkte'); $reihungstest_id = $this->input->get('reihungstest_id'); + $has_excluded_gebiete = $this->input->get('hasExcludedAreas'); if(!$reihungstest_id) { @@ -364,22 +403,27 @@ class Aufnahmetermine extends FHCAPI_Controller $studiengang_kz = $this->input->get('studiengang_kz'); $this->load->model('testtool/Ablauf_model', 'AblaufModel'); - $result = $this->AblaufModel->getAblaufGebieteAndGewichte($studiengang_kz); + $result = $this->AblaufModel->getAblaufGebieteAndGewichte($studiengang_kz, 1); $data = $this->getDataOrTerminateWithError($result); $weightedArray = []; + $basis_gebiet_id_arr = []; + $basis_gebiet_id_toString = ''; foreach ($data as $abl) { $weightedArray[$abl->gebiet_id] = $abl->gewicht; + $basis_gebiet_id_arr[]= $abl->gebiet_id; } + $basis_gebiet_id_toString = implode(', ', $basis_gebiet_id_arr); - $result = $this->ReihungstestModel->getReihungstestErgebnisPerson($person_id, $punkte, $reihungstest_id, $weightedArray); - -/* if (isError($result)) - { - $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); - }*/ - + $result = $this->ReihungstestModel->getReihungstestErgebnisPerson( + $person_id, + $punkte, + $reihungstest_id, + $weightedArray, + $has_excluded_gebiete, + $basis_gebiet_id_toString + ); $this->terminateWithSuccess($result); } diff --git a/application/controllers/api/frontend/v1/stv/Config.php b/application/controllers/api/frontend/v1/stv/Config.php index c787381f0..bc1fbebfe 100644 --- a/application/controllers/api/frontend/v1/stv/Config.php +++ b/application/controllers/api/frontend/v1/stv/Config.php @@ -200,7 +200,8 @@ class Config extends FHCAPI_Controller 'type' => 'select', 'values' => $buchungstyp_kurzbz_plus_all, 'value_key' => 'buchungstyp_kurzbz', - 'label_key' => 'beschreibung' + 'label_key' => 'beschreibung', + 'default' => 'all' ], 'samestg' => [ 'type' => 'bool', @@ -226,7 +227,8 @@ class Config extends FHCAPI_Controller 'type' => 'select', 'values' => $buchungstyp_kurzbz_plus_all, 'value_key' => 'buchungstyp_kurzbz', - 'label_key' => 'beschreibung' + 'label_key' => 'beschreibung', + 'default' => 'all' ], 'samestg' => [ 'type' => 'bool', diff --git a/application/controllers/api/frontend/v1/stv/Dokumente.php b/application/controllers/api/frontend/v1/stv/Dokumente.php index 9f54d0aa4..b8c7830bd 100644 --- a/application/controllers/api/frontend/v1/stv/Dokumente.php +++ b/application/controllers/api/frontend/v1/stv/Dokumente.php @@ -753,6 +753,10 @@ class Dokumente extends FHCAPI_Controller ); $data = $this->getDataOrTerminateWithError($result); + if(!(is_array($data) && count($data) > 0)) + { + return null; + } $student = current($data); return $student->student_uid; diff --git a/application/controllers/api/frontend/v1/stv/Student.php b/application/controllers/api/frontend/v1/stv/Student.php index 943577bb3..7694807e7 100644 --- a/application/controllers/api/frontend/v1/stv/Student.php +++ b/application/controllers/api/frontend/v1/stv/Student.php @@ -108,6 +108,10 @@ class Student extends FHCAPI_Controller $this->PrestudentModel->addSelect('p.matr_nr'); $this->PrestudentModel->addSelect('p.anrede'); $this->PrestudentModel->addSelect('p.zugangscode'); + if($this->permissionlib->isBerechtigt('student/bpk')) + { + $this->PrestudentModel->addSelect('p.bpk'); + } if (defined('ACTIVE_ADDONS') && strpos(ACTIVE_ADDONS, 'bewerbung') !== false) { $this->PrestudentModel->addSelect( @@ -136,14 +140,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'); @@ -547,6 +546,7 @@ class Student extends FHCAPI_Controller $this->_validate(); + // TODO(chris): This should be in a library $this->load->model('crm/Student_model', 'StudentModel'); $this->load->model('crm/Prestudent_model', 'PrestudentModel'); $this->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel'); @@ -798,8 +798,8 @@ class Student extends FHCAPI_Controller $this->form_validation->set_rules('geschlecht', 'Geschlecht', 'callback_requiredIfNotPersonId', [ 'requiredIfNotPersonId' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('person', 'geschlecht')]) ]); - $this->form_validation->set_rules('gebdatum', 'Geburtsdatum', ['isValidDate', function($value) { return isValidDate($value); }], [ - 'isValidDate' => $this->p->t('ui', 'error_invalid_date') + $this->form_validation->set_rules('gebdatum', 'Geburtsdatum', 'is_valid_date', [ + 'is_valid_date' => $this->p->t('ui', 'error_invalid_date') ]); //$this->form_validation->set_rules('address[checked]', 'Address', 'required'); $this->form_validation->set_rules('address[plz]', 'PLZ', 'callback_requiredIfAddressFunc', [ diff --git a/application/controllers/api/frontend/v1/stv/Students.php b/application/controllers/api/frontend/v1/stv/Students.php index 9dbea65f2..55f4b8976 100644 --- a/application/controllers/api/frontend/v1/stv/Students.php +++ b/application/controllers/api/frontend/v1/stv/Students.php @@ -611,7 +611,7 @@ class Students extends FHCAPI_Controller if (!$verband && !$gruppe && $orgform_kurzbz !== null) { $this->PrestudentModel->db->where( "( - SELECT orgform_kurzbz + SELECT orgform_kurzbz FROM public.tbl_prestudentstatus WHERE prestudent_id=tbl_prestudent.prestudent_id AND studiensemester_kurzbz=" . $this->PrestudentModel->escape($studiensemester_kurzbz) . " @@ -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(); @@ -855,6 +850,41 @@ class Students extends FHCAPI_Controller { $stdsemEsc = $studiensemester_kurzbz ? $this->PrestudentModel->escape($studiensemester_kurzbz) : 'NULL'; + $this->load->config('stv'); + $tags = $this->config->item('stv_prestudent_tags'); + + $whereTags = ''; + if (is_array($tags) && !isEmptyArray($tags)) { + $tags = array_keys($tags); + + foreach ($tags as $key => $tag) { + $tags[$key] = $this->db->escape($tag); + } + $whereTags = " AND nt.typ_kurzbz IN (" . implode(",", $tags) . ")"; + } + $subQueryTag = " + ( + SELECT + tag.prestudent_id, + COALESCE(json_agg(tag ORDER BY tag.done), '[]'::json) AS tags + FROM ( + SELECT DISTINCT ON (n.notiz_id) + n.notiz_id AS id, + nt.typ_kurzbz, + array_to_json(nt.bezeichnung_mehrsprachig)->>0 AS beschreibung, + n.text AS notiz, + nt.style, + n.erledigt AS done, + nz.prestudent_id + FROM public.tbl_notizzuordnung AS nz + JOIN public.tbl_notiz AS n ON nz.notiz_id = n.notiz_id + JOIN public.tbl_notiz_typ AS nt ON n.typ = nt.typ_kurzbz " + . $whereTags . + " + ) AS tag + GROUP BY tag.prestudent_id + ) AS tag_data_agg + "; $this->PrestudentModel->addJoin('public.tbl_studiengang stg', 'studiengang_kz', 'LEFT'); $this->PrestudentModel->addJoin('public.tbl_person p', 'person_id'); @@ -877,8 +907,11 @@ class Students extends FHCAPI_Controller AND ps.studiensemester_kurzbz=public.get_stdsem_prestudent(tbl_prestudent.prestudent_id, ' . $stdsemEsc . ') AND ps.ausbildungssemester=public.get_absem_prestudent(tbl_prestudent.prestudent_id, ' . $stdsemEsc . ')', 'LEFT'); + $this->PrestudentModel->addJoin($subQueryTag, 'tag_data_agg.prestudent_id = tbl_prestudent.prestudent_id', 'LEFT'); + $this->PrestudentModel->addSelect("b.uid"); + $this->PrestudentModel->addSelect('tag_data_agg.tags'); $this->PrestudentModel->addSelect('titelpre'); $this->PrestudentModel->addSelect('nachname'); $this->PrestudentModel->addSelect('vorname'); @@ -897,14 +930,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'); @@ -941,6 +969,7 @@ class Students extends FHCAPI_Controller $this->PrestudentModel->addSelect('mentor'); $this->PrestudentModel->addSelect('b.aktiv AS bnaktiv'); + $this->PrestudentModel->addSelect('unruly'); $this->PrestudentModel->db->where_in('tbl_prestudent.studiengang_kz', $this->allowedStgs); diff --git a/application/controllers/api/frontend/v1/stv/Tags.php b/application/controllers/api/frontend/v1/stv/Tags.php new file mode 100644 index 000000000..3004a1f3b --- /dev/null +++ b/application/controllers/api/frontend/v1/stv/Tags.php @@ -0,0 +1,48 @@ + self::BERECHTIGUNG_KURZBZ, + 'getTags' => self::BERECHTIGUNG_KURZBZ, + 'addTag' => self::BERECHTIGUNG_KURZBZ, + 'updateTag' => self::BERECHTIGUNG_KURZBZ, + 'doneTag' => self::BERECHTIGUNG_KURZBZ, + 'deleteTag' => self::BERECHTIGUNG_KURZBZ + ]); + + $this->config->load('stv'); + } + + public function getTag($readonly_tags = null) + { + parent::getTag($this->config->item('stv_prestudent_tags')); + } + public function getTags($tags = null) + { + parent::getTags($this->config->item('stv_prestudent_tags')); + } + public function addTag($withZuordnung = true, $updatable_tags = null) + { + parent::addTag(true, $this->config->item('stv_prestudent_tags')); + } + public function updateTag($updatable_tags = null) + { + parent::updateTag($this->config->item('stv_prestudent_tags')); + } + public function deleteTag($withZuordnung = true, $updatable_tags = null) + { + parent::deleteTag(true, $this->config->item('stv_prestudent_tags')); + } + public function doneTag($updatable_tags = null) + { + parent::doneTag($this->config->item('stv_prestudent_tags')); + } +} diff --git a/application/controllers/api/frontend/v1/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/api/frontend/v1/vertraege/Config.php b/application/controllers/api/frontend/v1/vertraege/Config.php new file mode 100644 index 000000000..a4ebd8c48 --- /dev/null +++ b/application/controllers/api/frontend/v1/vertraege/Config.php @@ -0,0 +1,62 @@ +. + */ + +if (!defined('BASEPATH')) exit('No direct script access allowed'); + +use CI3_Events as Events; + +/** + * This controller operates between (interface) the JS (GUI) and the back-end + * Provides data to the ajax get calls about the VV Config + * This controller works with JSON calls on the HTTP GET or POST and the output is always JSON + */ +class Config extends FHCAPI_Controller +{ + public function __construct() + { + parent::__construct([ + 'printDocument' => ['vertrag/mitarbeiter:r'], + ]); + } + + public function printDocument() + { + $params = []; + $menu = []; + + Events::trigger( + 'multiActionPrintHonorarvertrag', + // passing $menu per reference + function & () use (&$menu) { + return $menu; + }, + $params + ); + + if (is_array($menu) && isset($menu[0])) + { + $this->terminateWithSuccess($menu[0]); + } + else + { + // $this->terminateWithError('Error with Event 'multiActionPrintHonorarvertrag'); + $this->terminateWithSuccess(); + + } + } +} diff --git a/application/controllers/api/frontend/v1/vertraege/Vertraege.php b/application/controllers/api/frontend/v1/vertraege/Vertraege.php index bb14bc511..c0683e999 100644 --- a/application/controllers/api/frontend/v1/vertraege/Vertraege.php +++ b/application/controllers/api/frontend/v1/vertraege/Vertraege.php @@ -26,9 +26,6 @@ class Vertraege extends FHCAPI_Controller 'deleteLehrauftrag' =>['vertrag/mitarbeiter:w'], 'deleteBetreuung' =>['vertrag/mitarbeiter:w'], 'getMitarbeiter' => ['vertrag/mitarbeiter:r'], - 'getHeader' => ['vertrag/mitarbeiter:r'], - 'getPersonAbteilung' => ['vertrag/mitarbeiter:r'], - 'getLeitungOrg' => ['vertrag/mitarbeiter:r'], ]); //Load Models and Libraries @@ -241,7 +238,7 @@ class Vertraege extends FHCAPI_Controller } } $this->db->trans_complete(); - $this->terminateWithSuccess(true); + $this->terminateWithSuccess($vertrag_id); } public function updateContract() @@ -358,7 +355,7 @@ class Vertraege extends FHCAPI_Controller } $this->db->trans_complete(); - $this->terminateWithSuccess(true); + $this->terminateWithSuccess($vertrag_id); } public function loadContract($vertrag_id) @@ -684,37 +681,4 @@ class Vertraege extends FHCAPI_Controller } return $this->terminateWithSuccess(getData($result)); } - - public function getPersonAbteilung($mitarbeiter_uid) - { - $this->load->model('ressource/Mitarbeiter_model', 'Mitarbeitermodel'); - - $result = $this->Mitarbeitermodel->getPersonAbteilung($mitarbeiter_uid); - - $data = $this->getDataOrTerminateWithError($result); - - $this->terminateWithSuccess(current($data)); - } - - public function getLeitungOrg($oekurzbz) - { - $this->load->model('ressource/Mitarbeiter_model', 'Mitarbeitermodel'); - - $result = $this->Mitarbeitermodel->getLeitungOrg($oekurzbz); - - $data = $this->getDataOrTerminateWithError($result); - - $this->terminateWithSuccess(current($data)); - } - - public function getHeader($person_id) - { - $this->load->model('ressource/Mitarbeiter_model', 'Mitarbeitermodel'); - - $result = $this->Mitarbeitermodel->getHeader($person_id); - - $data = $this->getDataOrTerminateWithError($result); - - $this->terminateWithSuccess(current($data)); - } } diff --git a/application/controllers/jobs/AbgabetoolJob.php b/application/controllers/jobs/AbgabetoolJob.php index 51b2b4920..b81053032 100644 --- a/application/controllers/jobs/AbgabetoolJob.php +++ b/application/controllers/jobs/AbgabetoolJob.php @@ -22,11 +22,272 @@ class AbgabetoolJob extends JOB_Controller $this->_ci->load->model('crm/Student_model', 'StudentModel'); $this->_ci->load->model('organisation/Studiengang_model', 'StudiengangModel'); $this->_ci->load->model('organisation/Organisationseinheit_model', 'OrganisationseinheitModel'); - + + $this->_ci->load->library('SignatureLib'); + $this->_ci->load->config('abgabe'); $this->loadPhrases([ 'abgabetool' ]); + + + } + + // basically the notifyBetreuerMail function but email goes to assistenz + // and new abgaben are further evaluated for missing signature status + public function notifyAssistenzAboutMissingSignatureUploads() { + $this->_ci->logInfo('Start job FHC-Core->notifyAssistenzAboutMissingSignatureUploads'); + + $interval = $this->_ci->config->item('PAABGABE_EMAIL_JOB_INTERVAL'); + $relevantTypes = $this->_ci->config->item('RELEVANT_PAABGABETYPEN_SAMMELMAIL_ASSISTENZ'); + + $result = $this->_ci->PaabgabeModel->findAbgabenNewOrUpdatedSinceByAbgabedatum($interval, $relevantTypes); + $retval = getData($result); + + // retval are paabgaben joined with projektarbeit and betreuer + if(count($retval) == 0) { + $this->logInfo("Keine Emails über neue Paabgaben an Assistenzen versandt"); + return; + } + + // group changed/new abgaben for projektarbeiten + $projektarbeiten = []; + foreach($retval as $abgabeWithNewUpload) { + // Check if the current item has a 'projektarbeit_id' field. + // Replace 'projektarbeit_id' with the actual key name if it's different. + if (isset($abgabeWithNewUpload->projektarbeit_id)) { + $projektarbeitId = $abgabeWithNewUpload->projektarbeit_id; + + // If the 'projektarbeit_id' is not yet a key in $projektarbeiten, + // initialize it as an empty array. + if (!isset($projektarbeiten[$projektarbeitId])) { + $projektarbeiten[$projektarbeitId] = []; + } + + // check signature for that abgabe, main point of this job + $this->checkAbgabeSignatur($abgabeWithNewUpload, $abgabeWithNewUpload->student_uid); + + // Add the current row to the array associated with its 'projektarbeit_id'. + $projektarbeiten[$projektarbeitId][] = $abgabeWithNewUpload; + } + } + + // for each projektarbeit fetch their assistenz and same them in their own dictionary to avoid too many mails + $assistenzMap = []; + // for each projektarbeit fetch their betreuer and save them in their own dictionary to avoid too many mails + $projektarbeitBetreuerMap = []; + forEach($projektarbeiten as $projektarbeit_id => $abgaben) { + + $assistenzResult = $this->_ci->OrganisationseinheitModel->getAssistenzForOE($abgaben[0]->stg_oe_kurzbz); + + forEach($assistenzResult->retval as $assistenzRow) { + if (!isset($assistenzMap[$assistenzRow->person_id])) { + $assistenzMap[$assistenzRow->person_id] = []; + } + + // Add the current $assistenzRow to the $assistenzMap as an array associated with its projektarbeit_id. + $assistenzMap[$assistenzRow->person_id][] = [$projektarbeit_id, $assistenzRow]; + } + + $betreuerResult = $this->_ci->ProjektbetreuerModel->getAllBetreuerOfProjektarbeit($projektarbeit_id); + + forEach($betreuerResult->retval as $betreuerRow) { + if (!isset($projektarbeitBetreuerMap[$projektarbeit_id])) { + $projektarbeitBetreuerMap[$projektarbeit_id] = []; + } + + // Add the current betreuerRow to the betreuerMap as an array associated with its projektarbeit_id. + $projektarbeitBetreuerMap[$projektarbeit_id][] = $betreuerRow; + } + + } + + $count = 0; + foreach($assistenzMap as $assistenz_person_id => $tupelArr) { + + $abgabenString = '
'; + $hasIssues = false; // Track if this assistant actually needs an email + + foreach($tupelArr as $tupel) { + $projektarbeit_id = $tupel[0]; + $assistenzRow = $tupel[1]; + + $betreuerArray = $projektarbeitBetreuerMap[$projektarbeit_id] ?? []; + $allAbgaben = $projektarbeiten[$projektarbeit_id]; + + // only keep abgaben that are not correctly signed + $issueAbgaben = array_filter($allAbgaben, function($abgabe) { + // We only care about cases where it's explicitly NOT true (false, error, or null) + return $abgabe->signatur !== true; + }); + + // if this specific project has no signature issues, skip to the next project + if(empty($issueAbgaben)) { + continue; + } + + // If we reached here, we have at least one issue to report + $hasIssues = true; + + // Format the Student Name (using the first available abgabe object) + $s = reset($issueAbgaben); + $nameParts = array_filter([$s->titelpre, $s->vorname, $s->nachname, $s->titelpost]); + $studentFullName = implode(' ', $nameParts); + + // Format the Supervisors string + $betreuerStrings = []; + foreach($betreuerArray as $b) { + $bNameParts = array_filter([$b->titelpre, $b->vorname, $b->nachname, $b->titelpost]); + $bFullName = implode(' ', $bNameParts); + $betreuerStrings[] = "{$bFullName} ({$b->betreuerart_kurzbz})"; + } + $allBetreuerFormatted = implode(', ', $betreuerStrings); + + $projektarbeit_titel = $s->titel ?? 'Kein Titel vergeben'; + + // Project Header Section + $abgabenString .= " +
+ Projekt: {$projektarbeit_titel}
+
+ Studierende/r: {$studentFullName} +
+
+ Betreuer: {$allBetreuerFormatted} +
+ + ID: {$projektarbeit_id} | Stg: {$s->stgtyp}{$s->stgkz} ({$s->studiensemester_kurzbz}) + +
"; + + // Start Table + $abgabenString .= ' + + + + + + + + + '; + + $printed = []; // lazy hack to avoid duplicate rows + foreach ($issueAbgaben as $abgabe) { + // if we had this paabgabe already (erstbetreuer/zweitbetreuer fetch achieves duplicates + if(in_array($abgabe->paabgabe_id, $printed)) { + continue; // skip this forEach iteration + } + + $printed[] = $abgabe->paabgabe_id; + + $abgabedatumFormatted = (new DateTime($abgabe->abgabedatum))->format('d.m.Y'); + + // label and color + if ($abgabe->signatur === false) { + $sigLabel = "FEHLENDE SIGNATUR"; + $sigBg = "#dc3545"; + } elseif ($abgabe->signatur === 'error') { + $sigLabel = "PRÜFUNG FEHLGESCHLAGEN"; + $sigBg = "#fd7e14"; + } else { + $sigLabel = "DATEI NICHT GEFUNDEN"; + $sigBg = "#6c757d"; + } + + $abgabenString .= " + + + + + "; + } + + $abgabenString .= '
DatumAbgabe/BezeichnungStatus
{$abgabedatumFormatted} + {$abgabe->bezeichnung} + + + {$sigLabel} + +
'; + } + + $abgabenString .= '
'; + + // only send the email if at least one project had an issue + if ($hasIssues) { + $assistenzRow = $tupelArr[0][1]; + $anrede = $assistenzRow->anrede; + $anredeFillString = $assistenzRow->anrede == "Herr" ? "r" : ""; + $fullFormattedNameString = $assistenzRow->first; + + $path = $this->_ci->config->item('URL_ASSISTENZ'); + $url = CIS_ROOT . $path; + + $body_fields = array( + 'anrede' => $anrede, + 'anredeFillString' => $anredeFillString, + 'fullFormattedNameString' => $fullFormattedNameString, + 'abgabenString' => $abgabenString, + 'linkAbgabetool' => $url + ); + + $email = $assistenzRow->uid . "@" . DOMAIN; + + sendSanchoMail( + 'PAANoSigAssSM', + $body_fields, + $email, + $this->p->t('abgabetool', 'c4missingSignatureNotification') + ); + + $count++; + } + } + + $this->_ci->logInfo($count . " Emails bezüglich fehlender Signaturen erfolgreich versandt"); + $this->_ci->logInfo('End job FHC-Core->notifyAssistenzAboutMissingSignatureUploads'); + } + + /** + * helper function to check the signature status of uploaded files for zwischenabgabe & endupload + */ + private function checkAbgabeSignatur($abgabe, $student_uid) { + $paabgabetypenToCheck = $this->config->item('SIGNATUR_CHECK_PAABGABETYPEN'); + + if(!in_array($abgabe->paabgabetyp_kurzbz, $paabgabetypenToCheck)) { + return; + } + + if (!defined('SIGNATUR_URL')) { + $abgabe->signatur = 'error'; + return; + } + + $path = PAABGABE_PATH.$abgabe->paabgabe_id.'_'.$student_uid.'.pdf'; + + $signaturVorhanden = null; // if frontend receives null -> indicates no file found at path + if(file_exists($path)) { + + // Check if the document is signed + $signList = SignatureLib::list($path); + if (is_array($signList) && count($signList) > 0) + { + // The document is signed + $signaturVorhanden = true; + } + elseif ($signList === null) + { + // frontend knows to handle it this way for signatures + $signaturVorhanden = 'error'; + } + else + { + $signaturVorhanden = false; + } + + $abgabe->signatur = $signaturVorhanden; + } } public function notifyAssistenzAboutChangedAbgaben() { @@ -234,8 +495,7 @@ class AbgabetoolJob extends JOB_Controller // get all new or changed termine in interval $result = $this->_ci->PaabgabeModel->findAbgabenNewOrUpdatedSince($interval, $relevantTypes); $retval = getData($result); - - if(count($retval) == 0) { + if(!$retval) { $this->_ci->logInfo("Keine Emails an Betreuer über neue oder veränderte Termine versandt"); return; } @@ -248,17 +508,29 @@ class AbgabetoolJob extends JOB_Controller if (isset($newOrChangedAbgabe->projektarbeit_id)) { $projektarbeitId = $newOrChangedAbgabe->projektarbeit_id; + // check if the updatevon field is NOT the same as the student the projektarbeit is assigned to + // since uploading a file to a paabgabe is also putting updateamum & updatevon + // we have our own "student has uploaded a file" emailjob anyways + if($newOrChangedAbgabe->student_uid === $newOrChangedAbgabe->updatevon) { + continue; + } + // If the 'projektarbeit_id' is not yet a key in $projektarbeiten, // initialize it as an empty array. if (!isset($projektarbeiten[$projektarbeitId])) { $projektarbeiten[$projektarbeitId] = []; } - + // Add the current row to the array associated with its 'projektarbeit_id'. $projektarbeiten[$projektarbeitId][] = $newOrChangedAbgabe; } } + if(count($projektarbeiten) == 0) { + $this->_ci->logInfo("Keine Emails an Betreuer über neue oder veränderte Termine versandt"); + return; + } + // for each projektarbeit fetch their betreuer and save them in their own dictionary to avoid too many mails $betreuerMap = []; forEach($projektarbeiten as $projektarbeit_id => $abgaben) { @@ -289,6 +561,8 @@ class AbgabetoolJob extends JOB_Controller $anredeFillString = $data->anrede == "Herr" ? "r" : ""; $fullFormattedNameString = $data->first; + $relevantCounter = 0; // workaround to check if a betreuer needs to have any notification about relevant + // abgaben at all to avoid sending empty emails since we filter on certain conditions forEach($tupelArr as $tupel) { $projektarbeit_id = $tupel[0]; $betreuerRow = $tupel[1]; @@ -307,6 +581,8 @@ class AbgabetoolJob extends JOB_Controller continue; } + $relevantCounter++; + // format the Student Name $s = $relevantAbgaben[0]; $nameParts = []; @@ -365,6 +641,11 @@ class AbgabetoolJob extends JOB_Controller // done with building the change list, now send it $betreuerRow = $tupelArr[0][1]; + if($relevantCounter == 0) { + $this->_ci->logInfo('No Relevant Abgaben to notify Betreuer PersonID: "'.$betreuerRow->person_id.'".'); + continue; + } + $path = $this->_ci->config->item('URL_MITARBEITER'); $url = CIS_ROOT.$path; @@ -377,6 +658,11 @@ class AbgabetoolJob extends JOB_Controller ); $email = $betreuerRow->uid ? $betreuerRow->uid."@".DOMAIN : $betreuerRow->private_email; + + if(!$email) { + $this->_ci->logInfo('Could not send Email for Betreuer PersonID: "'.$data->person_id.'".'); + continue; + } // send email with bundled info sendSanchoMail( @@ -500,6 +786,12 @@ class AbgabetoolJob extends JOB_Controller $email = $data->uid ? $data->uid."@".DOMAIN : $data->private_email; + // in rare cases there are betreuer (often zweitbetreuer) without uid and without private email + if(!$email) { + $this->_ci->logInfo('Could not send Email for Betreuer PersonID: "'.$data->person_id.'".'); + continue; + } + // send email with bundled info sendSanchoMail( 'PaabgabeUpdatesBetSM', diff --git a/application/core/CI3_Events.php b/application/core/CI3_Events.php index 37f6c3f21..ad4aea729 100644 --- a/application/core/CI3_Events.php +++ b/application/core/CI3_Events.php @@ -35,7 +35,7 @@ class CI3_Events }); self::$eventsSorted[$event] = true; } - + foreach (self::$events[$event] as $conf) { $conf[1](...$args); } diff --git a/application/core/Notiz_Controller.php b/application/core/Notiz_Controller.php index cfc54d5f5..923970923 100644 --- a/application/core/Notiz_Controller.php +++ b/application/core/Notiz_Controller.php @@ -8,7 +8,7 @@ abstract class Notiz_Controller extends FHCAPI_Controller { const DEFAULT_PERMISSION_R = 'admin:r'; const DEFAULT_PERMISSION_RW = 'admin:rw'; - //public function __construct($zuordnung = 'person/Notizzuordnung_model') + public function __construct($permissions) { $default_permissions = [ @@ -97,13 +97,13 @@ abstract class Notiz_Controller extends FHCAPI_Controller if (isError($result)) { $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); } - return $this->terminateWithSuccess(getData($result) ?: []); + $this->terminateWithSuccess(getData($result) ?: []); } //Override function protected function isBerechtigt($id, $typeId){ - return $this->terminateWithError("in abstract function: define right in extension", self::ERROR_TYPE_GENERAL); + $this->terminateWithError("in abstract function: define right in extension", self::ERROR_TYPE_GENERAL); } public function loadNotiz() @@ -112,7 +112,6 @@ abstract class Notiz_Controller extends FHCAPI_Controller $notiz_id = $this->input->post('notiz_id'); - //$this->load->model('person/Notiz_model', 'NotizModel'); $this->NotizModel->addJoin('public.tbl_notiz_dokument', 'notiz_id', 'LEFT'); $this->NotizModel->addSelect('*'); $this->NotizModel->addSelect("TO_CHAR(CASE WHEN public.tbl_notiz.updateamum >= public.tbl_notiz.insertamum @@ -143,14 +142,9 @@ abstract class Notiz_Controller extends FHCAPI_Controller $uid = getAuthUID(); - if (isset($_POST['data'])) - { - $data = json_decode($_POST['data']); - unset($_POST['data']); - foreach ($data as $k => $v) { - $_POST[$k] = $v; - } - } + $json = $this->input->post('data'); + $post_data = json_decode($json, true); + $this->form_validation->set_data($post_data); //Form Validation $this->form_validation->set_rules('titel', 'Titel', 'required', [ @@ -166,26 +160,25 @@ abstract class Notiz_Controller extends FHCAPI_Controller $this->terminateWithValidationErrors($this->form_validation->error_array()); } - $titel = $this->input->post('titel'); - $text = $this->input->post('text'); - $erledigt = $this->input->post('erledigt'); - $verfasser_uid = isset($_POST['verfasser']) ? $_POST['verfasser'] : $uid; - $bearbeiter_uid = isset($_POST['bearbeiter']) ? $_POST['bearbeiter'] : null; - $type = $this->input->post('typeId'); - $start = $this->input->post('start'); - $ende = $this->input->post('ende'); + $titel = $post_data['titel']; + $text = $post_data['text']; + $erledigt = $post_data['erledigt']; + $bearbeiter_uid = isset($post_data['bearbeiter']) ? $post_data['bearbeiter'] : null; + $type = $post_data['typeId']; + $start = isset($post_data['start']) ? $post_data['start'] : null; + $ende = isset($post_data['ende']) ? $post_data['ende'] : null; // Start DB transaction $this->db->trans_start(); //Save note - $result = $this->NotizModel->insert(array('titel' => $titel, 'text' => $text, 'erledigt' => $erledigt, 'verfasser_uid' => $verfasser_uid, - "insertvon" => $verfasser_uid, 'start' => $start, 'ende' => $ende, 'bearbeiter_uid' => $bearbeiter_uid)); + $result = $this->NotizModel->insert(array('titel' => $titel, 'text' => $text, 'erledigt' => $erledigt, 'verfasser_uid' => $uid, + "insertvon" => $uid, 'start' => $start, 'ende' => $ende, 'bearbeiter_uid' => $bearbeiter_uid)); if (isError($result)) { $this->db->trans_rollback(); - return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); + $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); } $notiz_id = $result->retval; @@ -220,7 +213,7 @@ abstract class Notiz_Controller extends FHCAPI_Controller if (isError($result)) { $this->db->trans_rollback(); - return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); + $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); } $dms_id_arr[] = $result->retval['dms_id']; } @@ -235,34 +228,28 @@ abstract class Notiz_Controller extends FHCAPI_Controller if (isError($result)) { $this->db->trans_rollback(); - return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); + $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); } } } $this->db->trans_commit(); - return $this->terminateWithSuccess($result); + $this->terminateWithSuccess($result); } public function updateNotiz() { + $this->load->library('form_validation'); $this->load->library('DmsLib'); - if (isset($_POST['data'])) - { - $data = json_decode($_POST['data']); - unset($_POST['data']); - foreach ($data as $k => $v) { - $_POST[$k] = $v; - } - } + $json = $this->input->post('data'); + $post_data = json_decode($json, true); - $notiz_id = $this->input->post('notiz_id'); + $this->form_validation->set_data($post_data); - if(!$notiz_id) - { - $this->terminateWithError($this->p->t('ui','error_missingId',['id'=>'Notiz_id']), self::ERROR_TYPE_GENERAL); - } + $this->form_validation->set_rules('notiz_id', 'Notiz ID', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'notiz_id']) + ]); //Form Validation $this->form_validation->set_rules('titel', 'Titel', 'required', [ @@ -280,25 +267,23 @@ abstract class Notiz_Controller extends FHCAPI_Controller //update Notiz $uid = getAuthUID(); - $titel = $this->input->post('titel'); - $text = $this->input->post('text'); - $verfasser_uid = isset($_POST['verfasser']) ? $_POST['verfasser'] : $uid; - $bearbeiter_uid = isset($_POST['bearbeiter']) ? $_POST['bearbeiter'] : $uid; - $erledigt = $this->input->post('erledigt'); - $start = $this->input->post('start'); - $ende = $this->input->post('ende'); + $titel = $post_data['titel']; + $text = $post_data['text']; + $bearbeiter_uid = isset($post_data['bearbeiter']) ? $post_data['bearbeiter'] : $post_data['bearbeiter_uid']; + $erledigt = $post_data['erledigt']; + $start = $post_data['start']; + $ende = $post_data['ende']; $result = $this->NotizModel->update( [ - 'notiz_id' => $notiz_id + 'notiz_id' => $post_data['notiz_id'], ], [ 'titel' => $titel, 'updatevon' => $uid, 'updateamum' => date('c'), 'text' => $text, - 'verfasser_uid' => $verfasser_uid, - 'bearbeiter_uid' => $bearbeiter_uid, + 'bearbeiter_uid' => isEmptyString($bearbeiter_uid) ? null : $bearbeiter_uid, 'start' => $start, 'ende' => $ende, 'erledigt' => $erledigt @@ -306,7 +291,7 @@ abstract class Notiz_Controller extends FHCAPI_Controller ); if (isError($result)) { - return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); + $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); } //update(1) loading all dms-entries with this notiz_id @@ -314,7 +299,7 @@ abstract class Notiz_Controller extends FHCAPI_Controller $this->load->model('person/Notizdokument_model', 'NotizdokumentModel'); $this->NotizdokumentModel->addJoin('campus.tbl_dms_version', 'dms_id'); - $result = $this->NotizdokumentModel->loadWhere(array('notiz_id' => $notiz_id)); + $result = $this->NotizdokumentModel->loadWhere(array('notiz_id' => $post_data['notiz_id'])); $result = $this->getDataOrTerminateWithError($result); foreach ($result as $doc) { $dms_id_arr[$doc->dms_id] = array( @@ -351,7 +336,7 @@ abstract class Notiz_Controller extends FHCAPI_Controller $result = $this->getDataOrTerminateWithError($result); $dms_id = $result['dms_id']; - $result = $this->NotizdokumentModel->insert(array('notiz_id' => $notiz_id, 'dms_id' => $dms_id)); + $result = $this->NotizdokumentModel->insert(array('notiz_id' => $post_data['notiz_id'], 'dms_id' => $dms_id)); $this->getDataOrTerminateWithError($result); } @@ -365,7 +350,7 @@ abstract class Notiz_Controller extends FHCAPI_Controller $this->getDataOrTerminateWithError($result); } - return $this->terminateWithSuccess($result); + $this->terminateWithSuccess($result); } public function deleteNotiz() @@ -416,15 +401,15 @@ abstract class Notiz_Controller extends FHCAPI_Controller if (isError($result)) { $this->db->trans_rollback(); - return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); + $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); } if(!hasData($result)) { - return $this->terminateWithError($this->p->t('ui','error_missingId', ['id'=> 'Notiz_id']), self::ERROR_TYPE_GENERAL); + $this->terminateWithError($this->p->t('ui','error_missingId', ['id'=> 'Notiz_id']), self::ERROR_TYPE_GENERAL); } $this->db->trans_complete(); - return $this->terminateWithSuccess(getData($result)); + $this->terminateWithSuccess(getData($result)); } public function loadDokumente() @@ -440,14 +425,14 @@ abstract class Notiz_Controller extends FHCAPI_Controller array('public.tbl_notiz.notiz_id' => $notiz_id) ); if (isError($result)) { - return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); + $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); } if(!hasData($result)) { - return $this->terminateWithError($this->p->t('ui','error_missingId', ['id'=> 'Notiz_id']), self::ERROR_TYPE_GENERAL); + $this->terminateWithError($this->p->t('ui','error_missingId', ['id'=> 'Notiz_id']), self::ERROR_TYPE_GENERAL); } - return $this->terminateWithSuccess(getData($result)); + $this->terminateWithSuccess(getData($result)); } public function getMitarbeiter($searchString) @@ -457,7 +442,7 @@ abstract class Notiz_Controller extends FHCAPI_Controller if (isError($result)) { $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); } - return $this->terminateWithSuccess($result); + $this->terminateWithSuccess($result); } public function getCountNotes($person_id) @@ -476,4 +461,4 @@ abstract class Notiz_Controller extends FHCAPI_Controller return $this->terminateWithSuccess($anzahl->anzahl ?: 0); } -} \ No newline at end of file +} diff --git a/application/helpers/hlp_common_helper.php b/application/helpers/hlp_common_helper.php index b13d9d44d..06cfa1cfd 100644 --- a/application/helpers/hlp_common_helper.php +++ b/application/helpers/hlp_common_helper.php @@ -91,7 +91,7 @@ function var_dump_to_error_log($parameter) var_dump($parameter); // KEEP IT!!! $ob_get_contents = ob_get_contents(); ob_end_clean(); - error_log(str_replace("\n", '', $ob_get_contents)); // KEEP IT!!! + error_log(str_replace("\n", '', $ob_get_contents) . ', referer: ' . "http".(!empty($_SERVER['HTTPS'])?"s":"")."://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']); // KEEP IT!!! } /** @@ -408,22 +408,6 @@ function findResource($path, $resource, $subdir = false, $extraDir = null) return null; } -/** - * check if String can be converted to a date - */ -function isValidDate($dateString) -{ - try - { - return (new DateTime($dateString)) !== false; - } - catch(Exception $e) - { - return false; - } -} - - // ------------------------------------------------------------------------ // PHP functions that don't exist in older versions // ------------------------------------------------------------------------ @@ -446,7 +430,8 @@ if (!function_exists('array_is_list')) { // ------------------------------------------------------------------------ /** - * check if string can be converted to a date + * Check if the provided parameter is a string containing a valid date + * NOTE: the name is in the "snake case" format because othewise the CI form validation _cannot_ use it */ function is_valid_date($dateString) { diff --git a/application/helpers/hlp_header_helper.php b/application/helpers/hlp_header_helper.php index 41d40ca0d..27dfba5a1 100644 --- a/application/helpers/hlp_header_helper.php +++ b/application/helpers/hlp_header_helper.php @@ -269,3 +269,199 @@ function absoluteJsImportUrl($relurl) } return $url; } + +/* + * Manipulate CI views includes Array to load + * - public/js/FhcApps.js via customJSs and + * - app customisation js and/or css from extensions via customJSModules + * if customJSModules contains at least one vuejs app and customisation files + * exist in extensions + */ +class ExtendableAppsHelper +{ + private static $instance = null; + + protected $extensions; + + protected $customCSSs; + protected $customJSs; + protected $customJSModules; + + protected $initialised; + protected $appscount; + + protected $extCustomCSSs; + protected $extCustomJSs; + protected $extCustomJSModules; + + private function __construct() + { + $this->extensions = array(); + $this->customCSSs = null; + $this->customJSs = null; + $this->customJSModules = null; + + $this->initialised = false; + $this->appscount = 0; + + $this->extCustomCSSs = null; + $this->extCustomJSs = null; + $this->extCustomJSModules = null; + } + + public static function getInstance() + { + if(self::$instance === null) + { + self::$instance = new ExtendableAppsHelper(); + } + return self::$instance; + } + + public function init($customCSSs, $customJSs, $customJSModules) + { + if($this->initialised) + { + return; + } + + $this->customCSSs = $customCSSs; + $this->customJSs = $customJSs; + $this->customJSModules = $customJSModules; + $this->initialised = true; + + if(!isset($this->customJSModules)) + { + return; + } + + if(!is_array($this->customJSModules)) + { + $this->customJSModules = array($this->customJSModules); + } + + if(count($this->customJSModules) < 1) + { + return; + } + + $this->buildExtensionsList(); + $this->prepareExtendedArrays(); + } + + public function getCustomCSSs() + { + if(is_null($this->extCustomCSSs)) + { + return $this->customCSSs; + } + return $this->extCustomCSSs; + } + + public function getCustomJSs() + { + if(is_null($this->extCustomJSs)) + { + return $this->customJSs; + } + return $this->extCustomJSs; + } + + public function getCustomJSModules() + { + if(is_null($this->extCustomJSModules)) + { + return $this->customJSModules; + } + return $this->extCustomJSModules; + } + + protected function buildExtensionsList() + { + $this->extensions = array(); + $fsiterator = new FilesystemIterator(FHCPATH . 'application/extensions'); + foreach ($fsiterator as $fsitem) + { + if(preg_match('/^FHC-Core-/', $fsitem->getBasename())) + { + $this->extensions[] = $fsitem->getBasename(); + } + } + } + + protected function prepareExtendedArrays() + { + $this->appscount = 0; + $this->initExtCustomCSSs(); + $this->extCustomJSModules = array(); + foreach($this->customJSModules as $item) + { + $matches = array(); + if(preg_match('#^public/(extensions/FHC-Core-.+)?js/apps/(.*)\.js$#', $item, $matches)) + { + $this->appscount++; + + $fhcextension = $matches[1]; + $app = $matches[2]; + + $extend_js_suffix = 'js/extend_app/' . $fhcextension . $app . '.js'; + $extend_css_suffix = 'css/extend_app/' . $fhcextension . $app . '.css'; + + foreach($this->extensions as $extension) + { + $extend_js = 'public/extensions/' . $extension . '/' . $extend_js_suffix; + $extend_css = 'public/extensions/' . $extension . '/' . $extend_css_suffix; + + if(is_readable(FHCPATH . $extend_js)) + { + array_push($this->extCustomJSModules, $extend_js); + } + + if(is_readable(FHCPATH . $extend_css)) + { + array_push($this->extCustomCSSs, $extend_css); + } + } + } + array_push($this->extCustomJSModules, $item); + } + + if($this->appscount > 0) + { + $this->addFhcAppsJs(); + } + } + + protected function initExtCustomCSSs() + { + if(!isset($this->customCSSs)) + { + $this->extCustomCSSs = array(); + } + elseif(!is_array($this->customCSSs)) + { + $this->extCustomCSSs = array($this->customCSSs); + } + else + { + $this->extCustomCSSs = $this->customCSSs; + } + } + + protected function addFhcAppsJs() + { + if(!isset($this->customJSs)) + { + $this->extCustomJSs = array(); + } + elseif(!is_array($this->customJSs)) + { + $this->extCustomJSs = array($this->customJSs); + } + else + { + $this->extCustomJSs = $this->customJSs; + } + array_push($this->extCustomJSs, 'public/js/FhcApps.js'); + } +} diff --git a/application/libraries/DocsboxLib.php b/application/libraries/DocsboxLib.php index f9167c379..184855ad8 100644 --- a/application/libraries/DocsboxLib.php +++ b/application/libraries/DocsboxLib.php @@ -180,7 +180,8 @@ class DocsboxLib } // Just started or still working on it elseif ($getStatusResponse->body->status == self::STATUS_WORKING - || $getStatusResponse->body->status == self::STATUS_STARTED) + || $getStatusResponse->body->status == self::STATUS_STARTED + || $getStatusResponse->body->status == self::STATUS_QUEUED) { // go on! } diff --git a/application/models/accounting/Vertrag_model.php b/application/models/accounting/Vertrag_model.php index 4c036369b..97b5c72b6 100644 --- a/application/models/accounting/Vertrag_model.php +++ b/application/models/accounting/Vertrag_model.php @@ -490,6 +490,175 @@ class Vertrag_model extends DB_Model return $bezeichnung; } + /** + * Loads all Contracts of a Person + * @param $person_id + * @return array of objects + */ + public function loadContractsOfPerson($person_id) + { + $query = " + SELECT + *, + tbl_vertrag.bezeichnung as bezeichnung, + tbl_vertragstyp.bezeichnung as vertragstyp_bezeichnung, + tbl_vertrag.vertragsdatum, + (SELECT bezeichnung FROM lehre.tbl_vertragsstatus + JOIN lehre.tbl_vertrag_vertragsstatus USING(vertragsstatus_kurzbz) + WHERE vertrag_id=tbl_vertrag.vertrag_id ORDER BY datum desc limit 1) as status, anmerkung, + CASE + WHEN EXISTS ( + SELECT 1 + FROM lehre.tbl_vertrag_vertragsstatus + WHERE vertrag_id = tbl_vertrag.vertrag_id + AND vertragsstatus_kurzbz = 'abgerechnet' + ) THEN true + ELSE false + END AS isAbgerechnet + FROM + lehre.tbl_vertrag + LEFT JOIN lehre.tbl_vertragstyp USING(vertragstyp_kurzbz) + WHERE person_id= ?"; + + + return $this->execQuery($query, array($person_id)); + } + + /** + * Loads all Contracts of a Person that are not assigned yet + * @param $person_id + * @return array of objects + */ + public function loadContractsOfPersonNotAssigned($person_id) + { + $query = " +SELECT + 'Lehrauftrag' as type, + lehreinheit_id, + mitarbeiter_uid, + null as pruefung_id, + null as projektarbeit_id, + (tbl_lehreinheitmitarbeiter.semesterstunden*tbl_lehreinheitmitarbeiter.stundensatz) as betrag1, + tbl_lehreinheit.studiensemester_kurzbz, + null as betreuerart_kurzbz, + ( SELECT + upper(tbl_studiengang.typ || tbl_studiengang.kurzbz) || tbl_lehrveranstaltung.semester || '-' || tbl_lehrveranstaltung.kurzbz || '-' || tbl_lehreinheit.lehrform_kurzbz + FROM + lehre.tbl_lehrveranstaltung + JOIN public.tbl_studiengang USING(studiengang_kz) + WHERE + lehrveranstaltung_id=tbl_lehreinheit.lehrveranstaltung_id) + as bezeichnung + FROM + lehre.tbl_lehreinheitmitarbeiter + JOIN lehre.tbl_lehreinheit USING(lehreinheit_id) + WHERE + mitarbeiter_uid IN (SELECT uid FROM public.tbl_benutzer WHERE person_id=?) + AND vertrag_id IS NULL + UNION + SELECT + 'Betreuung' as type, + tbl_projektarbeit.lehreinheit_id as lehreinheit_id, + null as mitarbeiter_uid, + null::integer as pruefung_id, + projektarbeit_id, + (tbl_projektbetreuer.stunden*tbl_projektbetreuer.stundensatz) as betrag1, + tbl_lehreinheit.studiensemester_kurzbz, + tbl_projektbetreuer.betreuerart_kurzbz, + (SELECT nachname || ' ' || vorname FROM public.tbl_person JOIN public.tbl_benutzer USING(person_id) WHERE uid=tbl_projektarbeit.student_uid) + as bezeichnung + FROM + lehre.tbl_projektbetreuer + JOIN lehre.tbl_projektarbeit USING(projektarbeit_id) + JOIN lehre.tbl_lehreinheit USING(lehreinheit_id) + WHERE + tbl_projektbetreuer.person_id=? + AND vertrag_id IS NULL + "; + + return $this->execQuery($query, array($person_id, $person_id)); + } + + /** + * Loads all Contracts of a Person that are assigned yet + * @param $person_id, $vertrag_id + * @return array of objects + */ + + public function loadContractsOfPersonAssigned($person_id, $vertrag_id) + { + $query = " + SELECT + 'Lehrauftrag' as type, + lehreinheit_id, + mitarbeiter_uid, + null as pruefung_id, + null as projektarbeit_id, + (tbl_lehreinheitmitarbeiter.semesterstunden * tbl_lehreinheitmitarbeiter.stundensatz) as betrag, + tbl_lehreinheit.studiensemester_kurzbz, + null as betreuerart_kurzbz, + ( SELECT + upper(tbl_studiengang.typ || tbl_studiengang.kurzbz) || tbl_lehrveranstaltung.semester || '-' || tbl_lehrveranstaltung.kurzbz || '-' || tbl_lehreinheit.lehrform_kurzbz + FROM + lehre.tbl_lehrveranstaltung + JOIN public.tbl_studiengang USING(studiengang_kz) + WHERE + lehrveranstaltung_id=tbl_lehreinheit.lehrveranstaltung_id) + as bezeichnung, vertrag_id + FROM + lehre.tbl_lehreinheitmitarbeiter + JOIN lehre.tbl_lehreinheit USING(lehreinheit_id) + WHERE + mitarbeiter_uid IN (SELECT uid FROM public.tbl_benutzer WHERE person_id=?) + AND vertrag_id = ? + UNION + SELECT + 'Betreuung' as type, + tbl_projektarbeit.lehreinheit_id as lehreinheit_id, + null as mitarbeiter_uid, + null::integer as pruefung_id, + projektarbeit_id, + (tbl_projektbetreuer.stunden * tbl_projektbetreuer.stundensatz) as betrag, + tbl_lehreinheit.studiensemester_kurzbz, + tbl_projektbetreuer.betreuerart_kurzbz, + (SELECT nachname || ' ' || vorname FROM public.tbl_person JOIN public.tbl_benutzer USING(person_id) WHERE uid=tbl_projektarbeit.student_uid) + as bezeichnung, vertrag_id + FROM + lehre.tbl_projektbetreuer + JOIN lehre.tbl_projektarbeit USING(projektarbeit_id) + JOIN lehre.tbl_lehreinheit USING(lehreinheit_id) + WHERE + tbl_projektbetreuer.person_id=? + AND vertrag_id = ? + "; + + return $this->execQuery($query, array($person_id, $vertrag_id, $person_id, $vertrag_id)); + } + + /** + * Returns all stati of a contract + * + * @param $vertrag_id + * @return array + */ + public function getStatiOfContract($vertrag_id) + { + $query = " + SELECT + *, + tbl_vertrag_vertragsstatus.datum, + tbl_vertrag_vertragsstatus.insertamum, + tbl_vertrag_vertragsstatus.updateamum + FROM + lehre.tbl_vertrag_vertragsstatus + JOIN lehre.tbl_vertragsstatus USING(vertragsstatus_kurzbz) + WHERE + tbl_vertrag_vertragsstatus.vertrag_id = ? + ORDER BY tbl_vertrag_vertragsstatus.datum DESC"; + + return $this->execQuery($query, array($vertrag_id)); + } + private function _updateVertragRelevant($vertrag_id) { $this->LehreinheitmitarbeiterModel->update( diff --git a/application/models/accounting/Vertragstyp_model.php b/application/models/accounting/Vertragstyp_model.php index 42d248217..a3275af6e 100644 --- a/application/models/accounting/Vertragstyp_model.php +++ b/application/models/accounting/Vertragstyp_model.php @@ -11,4 +11,5 @@ class Vertragstyp_model extends DB_Model $this->dbTable = 'lehre.tbl_vertragstyp'; $this->pk = 'vertragstyp_kurzbz'; } + } diff --git a/application/models/accounting/Vertragvertragsstatus_model.php b/application/models/accounting/Vertragvertragsstatus_model.php index 78a065540..75b0794cc 100644 --- a/application/models/accounting/Vertragvertragsstatus_model.php +++ b/application/models/accounting/Vertragvertragsstatus_model.php @@ -190,4 +190,6 @@ class Vertragvertragsstatus_model extends DB_Model return $this->loadWhere($condition); } + + } diff --git a/application/models/crm/Reihungstest_model.php b/application/models/crm/Reihungstest_model.php index a685b01cd..efef0a8fa 100644 --- a/application/models/crm/Reihungstest_model.php +++ b/application/models/crm/Reihungstest_model.php @@ -10,7 +10,7 @@ class Reihungstest_model extends DB_Model parent::__construct(); $this->dbTable = 'public.tbl_reihungstest'; $this->pk = 'reihungstest_id'; - } + } /** * Gets a test from a test id only if it is available @@ -42,8 +42,8 @@ class Reihungstest_model extends DB_Model /** * Checks if there are active studyplans which have no public placement tests assigned yet. * Only check assignment to studyplans that are - * - Bachelor, - * - active, + * - Bachelor, + * - active, * - set as online application * - valid for 1st terms * @return array Returns object array with studyplans that have no public placement tests assigned yet. @@ -97,7 +97,7 @@ class Reihungstest_model extends DB_Model USING (reihungstest_id) WHERE datum >= now() - AND + AND oeffentlich = \'t\' ) '; @@ -105,7 +105,7 @@ class Reihungstest_model extends DB_Model return $this->execQuery($query); } - /** + /** * Gets amount of free places. * @return array Returns object array with faculty and amount of free places * for each public actual placement test date. @@ -432,10 +432,10 @@ class Reihungstest_model extends DB_Model } /** - * Loads all applicants of a placement test - * @param integer $reihungstest_id ID of placement test - * @return array Returns object array with data of applicants. - */ + * Loads all applicants of a placement test + * @param integer $reihungstest_id ID of placement test + * @return array Returns object array with data of applicants. + */ public function getApplicantsOfPlacementTest($reihungstest_id) { $query = ' @@ -556,13 +556,22 @@ class Reihungstest_model extends DB_Model * Calculates Result of Placement Test for a given Person and given placementtest * and with taking account of weighting per area * - * @param $person_id ID of Person - * @param $punkte if true result is points else result is percentage of sum - * @param $reihungstest_id ID of Placementtest - * @param $weightedArray array of weighting per area (gewicht per gebiet_id) - * @return float result + * @param Number $person_id ID of Person + * @param Boolean $punkte if true result is points else result is percentage of sum + * @param Number $reihungstest_id ID of Placementtest + * @param Array $weightedArray array of weighting per area (gewicht per gebiet_id) + * @param Boolean $has_excluded_gebiete if true, areas in the configArray will be excluded + * @param Array $basis_gebiet_id_toString areas to exclude + * @return float result points of RT */ - public function getReihungstestErgebnisPerson($person_id, $punkte, $reihungstest_id, $weightedArray = null) + public function getReihungstestErgebnisPerson( + $person_id, + $punkte, + $reihungstest_id, + $weightedArray = null, + $has_excluded_gebiete = false, + $basis_gebiet_id_toString = null + ) { $parametersArray = array($reihungstest_id); @@ -577,6 +586,35 @@ class Reihungstest_model extends DB_Model WHERE reihungstest_id = ? "; + //areas of Studiengang + if (!empty($basis_gebiet_id_toString)) + { + $qry .= " + AND + gebiet_id IN (". $basis_gebiet_id_toString. ") + "; + } + + //areas to exclude + if($has_excluded_gebiete) + { + if (defined('FAS_REIHUNGSTEST_EXCLUDE_GEBIETE') && !empty(FAS_REIHUNGSTEST_EXCLUDE_GEBIETE)) + { + $excluded_gebiete = unserialize(FAS_REIHUNGSTEST_EXCLUDE_GEBIETE); + $exclude_gebiet_id_arr = $excluded_gebiete; + if (is_array($exclude_gebiet_id_arr) && count($exclude_gebiet_id_arr) > 0) + { + $exclude_gebiet_id_toString = implode(', ', $exclude_gebiet_id_arr); + $qry .= " + AND + gebiet_id NOT IN (". $exclude_gebiet_id_toString. ") + -- AND + -- typ = 'b' + "; + } + } + } + //using prestudent Status to avoid to get the sum of more than 1 placement tests $qry .= " AND prestudent_id = ( diff --git a/application/models/education/Paabgabe_model.php b/application/models/education/Paabgabe_model.php index aa61bbaae..be42b7660 100644 --- a/application/models/education/Paabgabe_model.php +++ b/application/models/education/Paabgabe_model.php @@ -86,26 +86,43 @@ class Paabgabe_model extends DB_Model return $this->execQuery($query, [$interval, $interval, $relevantTypes]); } - public function findAbgabenNewOrUpdatedSinceByAbgabedatum($interval) { - - $query = "SELECT projektarbeit_id, paabgabe_id, paabgabetyp_kurzbz, fixtermin, datum, kurzbz, campus.tbl_paabgabetyp.bezeichnung, campus.tbl_paabgabe.abgabedatum, - campus.tbl_paabgabe.insertvon, campus.tbl_paabgabe.insertamum, campus.tbl_paabgabe.updatevon, campus.tbl_paabgabe.updateamum, - campus.tbl_paabgabe.note, upload_allowed, beurteilungsnotiz, student_uid, tbl_projektarbeit.note, lehre.tbl_projektarbeit.titel, - lehre.tbl_projektbetreuer.betreuerart_kurzbz, lehre.tbl_projektbetreuer.person_id, - public.tbl_person.anrede, public.tbl_person.titelpre, public.tbl_person.vorname, public.tbl_person.nachname, public.tbl_person.titelpost + public function findAbgabenNewOrUpdatedSinceByAbgabedatum($interval, $relevantTypes = null) { + + $queryParams = [$interval]; + $query = "SELECT projektarbeit_id, paabgabe_id, paabgabetyp_kurzbz, fixtermin, datum, campus.tbl_paabgabe.kurzbz, campus.tbl_paabgabetyp.bezeichnung, campus.tbl_paabgabe.abgabedatum, + campus.tbl_paabgabe.insertvon, campus.tbl_paabgabe.insertamum, campus.tbl_paabgabe.updatevon, campus.tbl_paabgabe.updateamum, + campus.tbl_paabgabe.note, upload_allowed, beurteilungsnotiz, student_uid, tbl_projektarbeit.note, lehre.tbl_projektarbeit.titel, + UPPER(tbl_studiengang.typ) as stgtyp, UPPER(tbl_studiengang.kurzbz) as stgkz, public.tbl_studiengang.studiengang_kz, + public.tbl_studiengang.oe_kurzbz as stg_oe_kurzbz, tbl_lehreinheit.studiensemester_kurzbz, + lehre.tbl_projektbetreuer.betreuerart_kurzbz, lehre.tbl_projektbetreuer.person_id, + public.tbl_person.anrede, public.tbl_person.titelpre, public.tbl_person.vorname, public.tbl_person.nachname, public.tbl_person.titelpost - FROM campus.tbl_paabgabe - JOIN campus.tbl_paabgabetyp USING (paabgabetyp_kurzbz) - JOIN lehre.tbl_projektarbeit USING (projektarbeit_id) - JOIN lehre.tbl_projektbetreuer USING (projektarbeit_id) - JOIN public.tbl_benutzer ON (public.tbl_benutzer.uid = student_uid) - JOIN public.tbl_person ON (public.tbl_benutzer.person_id = public.tbl_person.person_id) + FROM campus.tbl_paabgabe + JOIN campus.tbl_paabgabetyp USING (paabgabetyp_kurzbz) + JOIN lehre.tbl_projektarbeit USING (projektarbeit_id) + JOIN lehre.tbl_projektbetreuer USING (projektarbeit_id) + JOIN lehre.tbl_lehreinheit using(lehreinheit_id) + JOIN lehre.tbl_lehrveranstaltung using(lehrveranstaltung_id) + JOIN public.tbl_studiengang on(lehre.tbl_lehrveranstaltung.studiengang_kz = public.tbl_studiengang.studiengang_kz) + JOIN public.tbl_benutzer ON (public.tbl_benutzer.uid = student_uid) + JOIN public.tbl_person ON (public.tbl_benutzer.person_id = public.tbl_person.person_id) WHERE campus.tbl_paabgabe.abgabedatum IS NOT NULL - AND campus.tbl_paabgabe.abgabedatum >= NOW() - INTERVAL ? - ORDER BY abgabedatum DESC - "; + AND campus.tbl_paabgabe.abgabedatum >= NOW() - INTERVAL ?"; + + if($relevantTypes !== null) { + $query .= " AND campus.tbl_paabgabe.paabgabetyp_kurzbz IN ?"; + $queryParams[]= $relevantTypes; + } - return $this->execQuery($query, [$interval]); + $query .= " ORDER BY abgabedatum DESC"; + + return $this->execQuery($query, $queryParams); + } + + public function loadByIDs($paabgabe_ids) { + $qry = "SELECT * FROM campus.tbl_paabgabe WHERE paabgabe_id IN ?"; + + return $this->execReadOnlyQuery($qry, [$paabgabe_ids]); } } diff --git a/application/models/education/Projektarbeit_model.php b/application/models/education/Projektarbeit_model.php index d80878f6d..3b1ea55e5 100644 --- a/application/models/education/Projektarbeit_model.php +++ b/application/models/education/Projektarbeit_model.php @@ -244,6 +244,28 @@ class Projektarbeit_model extends DB_Model 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) { $qry="SELECT * FROM campus.vw_benutzer where uid=?"; @@ -277,7 +299,7 @@ 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_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 @@ -332,8 +354,10 @@ class Projektarbeit_model extends DB_Model student_person.nachname as student_nachname, tbl_student.matrikelnr, tbl_lehreinheit.studiensemester_kurzbz, betreuer_benutzer.uid as betreuer_benutzer_uid, + betreuer_person.titelpre as betreuer_titelpre, betreuer_person.vorname as betreuer_vorname, betreuer_person.nachname as betreuer_nachname, + betreuer_person.titelpost as betreuer_titelpost, lehre.tbl_projektbetreuer.betreuerart_kurzbz as betreuerart, lehre.tbl_projektbetreuer.person_id as betreuer_person_id, lehre.tbl_projektarbeit.sprache as sprache, @@ -393,6 +417,50 @@ class Projektarbeit_model extends DB_Model LIMIT 1 ) as zweitbetreuer_full_name, + ( + SELECT titelpre + FROM public.tbl_person + JOIN lehre.tbl_projektbetreuer ON (lehre.tbl_projektbetreuer.person_id = public.tbl_person.person_id) + LEFT JOIN public.tbl_benutzer ON (public.tbl_benutzer.person_id = public.tbl_person.person_id) + LEFT JOIN public.tbl_mitarbeiter ON (public.tbl_benutzer.uid = public.tbl_mitarbeiter.mitarbeiter_uid) + WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id + AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied') + LIMIT 1 + ) + as zweitbetreuer_titelpre, + ( + SELECT vorname + FROM public.tbl_person + JOIN lehre.tbl_projektbetreuer ON (lehre.tbl_projektbetreuer.person_id = public.tbl_person.person_id) + LEFT JOIN public.tbl_benutzer ON (public.tbl_benutzer.person_id = public.tbl_person.person_id) + LEFT JOIN public.tbl_mitarbeiter ON (public.tbl_benutzer.uid = public.tbl_mitarbeiter.mitarbeiter_uid) + WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id + AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied') + LIMIT 1 + ) + as zweitbetreuer_vorname, + ( + SELECT nachname + FROM public.tbl_person + JOIN lehre.tbl_projektbetreuer ON (lehre.tbl_projektbetreuer.person_id = public.tbl_person.person_id) + LEFT JOIN public.tbl_benutzer ON (public.tbl_benutzer.person_id = public.tbl_person.person_id) + LEFT JOIN public.tbl_mitarbeiter ON (public.tbl_benutzer.uid = public.tbl_mitarbeiter.mitarbeiter_uid) + WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id + AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied') + LIMIT 1 + ) + as zweitbetreuer_nachname, + ( + SELECT titelpost + FROM public.tbl_person + JOIN lehre.tbl_projektbetreuer ON (lehre.tbl_projektbetreuer.person_id = public.tbl_person.person_id) + LEFT JOIN public.tbl_benutzer ON (public.tbl_benutzer.person_id = public.tbl_person.person_id) + LEFT JOIN public.tbl_mitarbeiter ON (public.tbl_benutzer.uid = public.tbl_mitarbeiter.mitarbeiter_uid) + WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id + AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter', 'Senatsmitglied') + LIMIT 1 + ) + as zweitbetreuer_titelpost, ( SELECT COALESCE(tbl_studienplan.orgform_kurzbz, diff --git a/application/models/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/ressource/Mitarbeiter_model.php b/application/models/ressource/Mitarbeiter_model.php index a650643f1..d8bbd7d63 100644 --- a/application/models/ressource/Mitarbeiter_model.php +++ b/application/models/ressource/Mitarbeiter_model.php @@ -209,7 +209,7 @@ class Mitarbeiter_model extends DB_Model { $qry = " SELECT - titelpre, vorname, nachname, titelpost, foto, foto_sperre, person_id, alias, telefonklappe + titelpre, vorname, nachname, titelpost, foto, foto_sperre, person_id, alias, telefonklappe, personalnummer, mitarbeiter_uid FROM public.tbl_person JOIN public.tbl_benutzer b USING(person_id) @@ -363,14 +363,14 @@ class Mitarbeiter_model extends DB_Model $returnwert .= ", ma.mitarbeiter_uid, CONCAT(p.nachname, ' ', p.vorname, ' (', ma.mitarbeiter_uid , ')') as mitarbeiter"; $qry = " - SELECT " . $returnwert . " - FROM + SELECT " . $returnwert . " + FROM public.tbl_mitarbeiter ma - JOIN + JOIN public.tbl_benutzer b on (ma.mitarbeiter_uid = b.uid) - JOIN + JOIN public.tbl_person p on (p.person_id = b.person_id) - WHERE + WHERE lower (p.nachname) LIKE '%". $this->db->escape_like_str($filter)."%' OR lower (p.vorname) LIKE '%". $this->db->escape_like_str($filter)."%' @@ -393,14 +393,14 @@ class Mitarbeiter_model extends DB_Model public function getMitarbeiterFromLV($lehrveranstaltung_id) { $qry = "SELECT DISTINCT - lehrveranstaltung_id, uid, vorname, wahlname, vornamen, nachname, titelpre, titelpost, kurzbz, mitarbeiter_uid - FROM + lehrveranstaltung_id, uid, vorname, wahlname, vornamen, nachname, titelpre, titelpost, kurzbz, mitarbeiter_uid + FROM lehre.tbl_lehreinheitmitarbeiter, campus.vw_mitarbeiter, lehre.tbl_lehreinheit - WHERE + WHERE lehrveranstaltung_id= ? - AND - mitarbeiter_uid=uid - AND + AND + mitarbeiter_uid=uid + AND tbl_lehreinheitmitarbeiter.lehreinheit_id=tbl_lehreinheit.lehreinheit_id;"; $parametersArray = array($lehrveranstaltung_id); diff --git a/application/models/ressource/Stundenplan_model.php b/application/models/ressource/Stundenplan_model.php index 067e2b790..d0a97ed9d 100644 --- a/application/models/ressource/Stundenplan_model.php +++ b/application/models/ressource/Stundenplan_model.php @@ -470,12 +470,12 @@ class Stundenplan_model extends DB_Model } foreach($studentlehrverbaende[$sem_date] as $key=>$lehrverband) { - $query .= "((sp.studiengang_kz = ".$this->escape($lehrverband->studiengang_kz)." AND sp.semester = ".$this->escape($lehrverband->semester)." AND sp.verband = ".$this->escape($lehrverband->verband)." AND sp.gruppe = ".$this->escape($lehrverband->gruppe)." AND sp.datum BETWEEN ".$this->escape($sem_date_range->start)." AND ".$this->escape($sem_date_range->ende).")"; + $query .= "(((sp.studiengang_kz = ".$this->escape($lehrverband->studiengang_kz)." AND sp.semester = ".$this->escape($lehrverband->semester)." AND sp.verband = ".$this->escape($lehrverband->verband)." AND sp.gruppe = ".$this->escape($lehrverband->gruppe)." AND sp.datum BETWEEN ".$this->escape($sem_date_range->start)." AND ".$this->escape($sem_date_range->ende).")"; // Eintraege fuer den ganzen Verband $query .= "OR (sp.studiengang_kz = ".$this->escape($lehrverband->studiengang_kz)." AND sp.semester = ".$this->escape($lehrverband->semester)." AND sp.verband = ".$this->escape($lehrverband->verband)." AND (sp.gruppe is null OR sp.gruppe='') AND sp.datum BETWEEN ".$this->escape($sem_date_range->start)." AND ".$this->escape($sem_date_range->ende).")"; // Eintraege fuer das ganze Semester $query .= "OR (sp.studiengang_kz = ".$this->escape($lehrverband->studiengang_kz)." AND sp.semester = ".$this->escape($lehrverband->semester)." AND (sp.verband is null OR sp.verband='') AND sp.datum BETWEEN ".$this->escape($sem_date_range->start) - ." AND ".$this->escape($sem_date_range->ende).")". $stringGroupLv. ")"; + ." AND ".$this->escape($sem_date_range->ende).")) AND gruppe_kurzbz is null)"; $query .="OR"; } diff --git a/application/models/system/Message_model.php b/application/models/system/Message_model.php index e0a185f9b..3e59d7250 100644 --- a/application/models/system/Message_model.php +++ b/application/models/system/Message_model.php @@ -242,74 +242,91 @@ 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 index 480116290..86e8721f2 100644 --- a/application/views/Cis/Abgabetool.php +++ b/application/views/Cis/Abgabetool.php @@ -27,6 +27,7 @@ $includesArray = array( '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( diff --git a/application/views/Cis/LvInfo.php b/application/views/Cis/LvInfo.php deleted file mode 100644 index 49a7b7a85..000000000 --- a/application/views/Cis/LvInfo.php +++ /dev/null @@ -1,15 +0,0 @@ - 'LvInfo', - 'customJSModules' => ['public/js/apps/Cis/LvInfo.js'] -); - -$this->load->view('templates/CISVUE-Header', $includesArray); -?> - -
- - -
- -load->view('templates/CISVUE-Footer', $includesArray); ?> diff --git a/application/views/Cis/Profil.php b/application/views/Cis/Profil.php deleted file mode 100644 index f66ebf8a9..000000000 --- a/application/views/Cis/Profil.php +++ /dev/null @@ -1,18 +0,0 @@ - 'Profil', - 'customJSModules' => ['public/js/apps/Cis/Profil.js'], - 'tabulator5' => true, - 'primevue3' => true, - 'customCSSs' => ['public/css/components/calendar.css', 'public/css/components/FilterComponent.css','public/css/components/Profil.css','public/css/components/FormUnderline.css'], - -); - -$this->load->view('templates/CISVUE-Header', $includesArray); -?> - -
- -
- -load->view('templates/CISVUE-Footer', $includesArray); ?> diff --git a/application/views/CisRouterView/CisRouterView.php b/application/views/CisRouterView/CisRouterView.php index 1b3e767b2..6ff428362 100644 --- a/application/views/CisRouterView/CisRouterView.php +++ b/application/views/CisRouterView/CisRouterView.php @@ -35,6 +35,7 @@ $includesArray = array( '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( diff --git a/application/views/Studentenverwaltung.php b/application/views/Studentenverwaltung.php index 1cd28d735..8dd2dd93d 100644 --- a/application/views/Studentenverwaltung.php +++ b/application/views/Studentenverwaltung.php @@ -7,19 +7,21 @@ 'vue3' => true, 'primevue3' => true, #'filtercomponent' => true, - 'tabulator5' => true, + 'tabulator6' => true, 'tinymce5' => true, 'phrases' => array( 'global', 'ui', 'notiz', ), + 'tags' => true, 'customCSSs' => [ #datepicker fuer component functions 'public/css/components/vue-datepicker.css', 'public/css/components/primevue.css', 'public/css/Studentenverwaltung.css', - 'public/css/components/function.css' + 'public/css/components/function.css', + 'public/css/components/Detailheader.css' ], 'customJSs' => [ 'vendor/vuejs/vuedatepicker_js/vue-datepicker.iife.js', @@ -45,6 +47,8 @@ $configArray = [ 'showAufnahmegruppen' => !defined('FAS_REIHUNGSTEST_AUFNAHMEGRUPPEN') ? false : FAS_REIHUNGSTEST_AUFNAHMEGRUPPEN, 'allowUebernahmePunkte' => !defined('FAS_REIHUNGSTEST_PUNKTEUEBERNAHME') ? true : FAS_REIHUNGSTEST_PUNKTEUEBERNAHME, 'useReihungstestPunkte' => !defined('FAS_REIHUNGSTEST_PUNKTE') ? true : FAS_REIHUNGSTEST_PUNKTE, + 'hasExcludedAreas' => defined('FAS_REIHUNGSTEST_EXCLUDE_GEBIETE') && !empty(FAS_REIHUNGSTEST_EXCLUDE_GEBIETE), + 'stvTagsEnabled' => defined('STV_TAGS_ENABLED') ? STV_TAGS_ENABLED : false, ]; ?> diff --git a/application/views/Vertragsverwaltung.php b/application/views/Vertragsverwaltung.php new file mode 100644 index 000000000..8fa6dff27 --- /dev/null +++ b/application/views/Vertragsverwaltung.php @@ -0,0 +1,50 @@ + 'Vertragsverwaltung', + 'axios027' => true, + 'bootstrap5' => true, + 'fontawesome6' => true, + 'vue3' => true, + 'primevue3' => true, + 'filtercomponent' => true, + 'navigationcomponent' => true, + 'tabulator6' => true, + 'tinymce5' => true, + 'phrases' => array( + 'global', + 'ui', + ), + 'customCSSs' => [ + 'public/css/components/vue-datepicker.css', + 'public/css/components/primevue.css', + 'public/css/Vertragsverwaltung.css', + 'public/css/components/Detailheader.css' + ], + 'customJSs' => [ + #'vendor/npm-asset/primevue/tree/tree.min.js', + #'vendor/npm-asset/primevue/toast/toast.min.js' + ], + 'customJSModules' => [ + 'public/js/apps/Vertragsverwaltung.js' + ] +); + +$this->load->view('templates/FHC-Header', $includesArray); +?> + + !defined('DOMAIN') ? 'notDefined' : DOMAIN, +]; +?> + +
+ + +
+ +load->view('templates/FHC-Footer', $includesArray); ?> + diff --git a/application/views/templates/FHC-Footer.php b/application/views/templates/FHC-Footer.php index c816ebf2e..d2eb229f1 100644 --- a/application/views/templates/FHC-Footer.php +++ b/application/views/templates/FHC-Footer.php @@ -17,6 +17,7 @@ $use_vuejs_dev_version = $this->config->item('use_vuejs_dev_version'); // By default set the parameters to null + $customCSSs = isset($customCSSs) ? $customCSSs : null; $customJSs = isset($customJSs) ? $customJSs : null; $customJSModules = isset($customJSModules) ? $customJSModules : null; @@ -191,12 +192,13 @@ // NOTE: keep it as the last but one if ($addons === true) generateAddonsJSsInclude($calledPath.'/'.$calledMethod); - - + $extapphelper = ExtendableAppsHelper::getInstance(); + $extapphelper->init($customCSSs, $customJSs, $customJSModules); + // Eventually required JS // NOTE: keep it as the latest - generateJSsInclude($customJSs); - generateJSModulesInclude($customJSModules); + generateJSsInclude($extapphelper->getCustomJSs()); + generateJSModulesInclude($extapphelper->getCustomJSModules()); ?> diff --git a/application/views/templates/FHC-Header.php b/application/views/templates/FHC-Header.php index f7b5491a1..7b53cbf5d 100644 --- a/application/views/templates/FHC-Header.php +++ b/application/views/templates/FHC-Header.php @@ -9,6 +9,8 @@ $title = isset($title) ? $title : null; $refresh = isset($refresh) ? $refresh : null; $customCSSs = isset($customCSSs) ? $customCSSs : null; + $customJSs = isset($customJSs) ? $customJSs : null; + $customJSModules = isset($customJSModules) ? $customJSModules : null; $skipID = isset($skipID) ? $skipID : null; ?> @@ -132,8 +134,11 @@ //Tags if ($tags === true) generateCSSsInclude('public/css/tags.css'); + $extapphelper = ExtendableAppsHelper::getInstance(); + $extapphelper->init($customCSSs, $customJSs, $customJSModules); + // Eventually required CSS - generateCSSsInclude($customCSSs); // Eventually required CSS + generateCSSsInclude($extapphelper->getCustomCSSs()); // Eventually required CSS ?> diff --git a/cis/private/lehre/notenliste.xls.php b/cis/private/lehre/notenliste.xls.php index 6c8db5246..25f353c12 100644 --- a/cis/private/lehre/notenliste.xls.php +++ b/cis/private/lehre/notenliste.xls.php @@ -264,7 +264,7 @@ else tbl_bisio.bisio_id, tbl_bisio.bis, tbl_bisio.von, tbl_zeugnisnote.note,tbl_mobilitaet.mobilitaetstyp_kurzbz, (CASE WHEN bis.tbl_mobilitaet.studiensemester_kurzbz = vw_student_lehrveranstaltung.studiensemester_kurzbz THEN '1' ELSE '' END) as doubledegree, - tbl_note.lkt_ueberschreibbar, tbl_note.anmerkung + tbl_note.lkt_ueberschreibbar, tbl_note.anmerkung, tbl_zeugnisnote.punkte FROM campus.vw_student_lehrveranstaltung JOIN public.tbl_benutzer USING(uid) JOIN public.tbl_person USING(person_id) JOIN public.tbl_student ON(uid=student_uid) @@ -306,7 +306,14 @@ else && $elem->von < $stsemdatumbis && (anzahlTage($elem->von, $elem->bis) >= 30)) $inc.=' (o)'; - $note = $elem->note; + if(defined('CIS_GESAMTNOTE_PUNKTE') && CIS_GESAMTNOTE_PUNKTE==true) + { + $note = $elem->punkte; + } + else + { + $note = $elem->note; + } if($elem->lkt_ueberschreibbar == 'f') // angerechnet / intern angerechnet / nicht zugelassen { @@ -339,20 +346,23 @@ else { $worksheet->write($lines,8, trim($elem->matrikelnr), $format_highlight); $pr = new Pruefung(); - $pr->getPruefungen($elem->uid, "Termin2", $lvid, $sem); + $pr->getPruefungen($elem->uid, "Termin2", $lvid, $stsem); $output2 = $pr->result; if ($output2) { $resultPr = $output2[0]; $worksheet->write($lines,9, date('d.m.Y', strtotime($resultPr->datum)), $format_highlightright_date); - $worksheet->write($lines,10, $resultPr->note, $format_highlightright); + if(defined('CIS_GESAMTNOTE_PUNKTE') && CIS_GESAMTNOTE_PUNKTE==true) + $worksheet->write($lines,10, $resultPr->punkte, $format_highlightright); + else + $worksheet->write($lines,10, $resultPr->note, $format_highlightright); + } + else + { + $worksheet->write($lines,9, '', $format_highlightright_date); + $worksheet->write($lines,10, '', $format_highlightright); } - else - { - $worksheet->write($lines,9, '', $format_highlightright_date); - $worksheet->write($lines,10, '', $format_highlightright); - } } // Nachprüfung @@ -360,20 +370,23 @@ else { $worksheet->write($lines,12, trim($elem->matrikelnr), $format_highlight); $pr = new Pruefung(); - $pr->getPruefungen($elem->uid, "Termin3", $lvid, $sem); + $pr->getPruefungen($elem->uid, "Termin3", $lvid, $stsem); $output3 = $pr->result; if ($output3) { $resultPr = $output3[0]; $worksheet->write($lines,13, date('d.m.Y', strtotime($resultPr->datum)), $format_highlightright_date); - $worksheet->write($lines,14, $resultPr->note, $format_highlightright); + if(defined('CIS_GESAMTNOTE_PUNKTE') && CIS_GESAMTNOTE_PUNKTE==true) + $worksheet->write($lines,14, $resultPr->punkte, $format_highlightright); + else + $worksheet->write($lines,14, $resultPr->note, $format_highlightright); + } + else + { + $worksheet->write($lines,13, '', $format_highlightright_date); + $worksheet->write($lines,14, '', $format_highlightright); } - else - { - $worksheet->write($lines,13, '', $format_highlightright_date); - $worksheet->write($lines,14, '', $format_highlightright); - } } $i++; diff --git a/cis/public/coodle.php b/cis/public/coodle.php index 2b8421db0..05eaa41df 100644 --- a/cis/public/coodle.php +++ b/cis/public/coodle.php @@ -1041,7 +1041,7 @@ function sendEmail($coodle_id) ."END:STANDARD\r\n" ."END:VTIMEZONE\r\n" ."BEGIN:VEVENT\r\n" - .$coodle->foldContentLine("ORGANIZER:MAILTO:".$erstellername." <".$coodle->ersteller_uid."@".DOMAIN)."\r\n" + .$coodle->foldContentLine("ORGANIZER:MAILTO:".$erstellername." <".$coodle->ersteller_uid."@".DOMAIN).">\r\n" .rtrim($teilnehmer)."\r\n" ."DTSTART;TZID=Europe/Vienna:".$dtstart."\r\n" ."DTEND;TZID=Europe/Vienna:".$dtend."\r\n" 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

- Beispielbild + Beispielbild
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/frage.php b/cis/testtool/frage.php index bf2ee24c5..a5f4100c9 100644 --- a/cis/testtool/frage.php +++ b/cis/testtool/frage.php @@ -581,14 +581,14 @@ if($frage->frage_id!='') else $value=$p->t('testtool/blaettern').' >>'; - echo " $value"; + echo "$value"; } else { if(!$demo) { //Wenns der letzte Eintrag ist, wieder zum ersten springen - echo " ".$p->t('testtool/blaettern')." >>"; + echo "".$p->t('testtool/blaettern')." >>"; } } } 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/config/global.config-default.inc.php b/config/global.config-default.inc.php index c43cb38d1..943363f6d 100644 --- a/config/global.config-default.inc.php +++ b/config/global.config-default.inc.php @@ -371,4 +371,6 @@ define('STATUS_VORRUECKEN_ANZEIGEN', true); //externe Ueberwachung im Testtool erlauben define('TESTTOOL_EXTERNE_UEBERWACHUNG_ALLOWED', false); +//enable tags in StudVW +define('STV_TAGS_ENABLED', false); ?> diff --git a/content/student/studentdetailoverlay.xul.php b/content/student/studentdetailoverlay.xul.php index 36740d209..c3bf8c191 100644 --- a/content/student/studentdetailoverlay.xul.php +++ b/content/student/studentdetailoverlay.xul.php @@ -798,6 +798,10 @@ echo ''; class="sortDirectionIndicator" sort="rdf:http://www.technikum-wien.at/prestudentrolle/rdf#updatevon" /> +