diff --git a/application/config/cis.php b/application/config/cis.php index b7330ef29..82655f244 100644 --- a/application/config/cis.php +++ b/application/config/cis.php @@ -4,6 +4,6 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); // CMS Content Id for CIS4 Menu Root -$config['cis_menu_root_content_id'] = 11066; +$config['cis_menu_root_content_id'] = 11087; // send Mails for ProfilUpdate $config['cis_send_profil_update_mails'] = true; diff --git a/application/config/routes.php b/application/config/routes.php index b07497ae7..eb4c267ce 100644 --- a/application/config/routes.php +++ b/application/config/routes.php @@ -61,8 +61,7 @@ $route['api/v1/organisation/[O|o]rganisationseinheit/(:any)'] = 'api/v1/organisa $route['api/v1/ressource/[B|b]etriebsmittelperson/(:any)'] = 'api/v1/ressource/betriebsmittelperson2/$1'; $route['api/v1/system/[S|s]prache/(:any)'] = 'api/v1/system/sprache2/$1'; -$route['CisVue'] = 'CisVue/dashboard'; -$route['Cis/Stundenplan/(:any)'] = 'Cis/Stundenplan'; +$route['Cis/Stundenplan/.*'] = 'Cis/Stundenplan/index/$1'; // load routes from extensions $subdir = 'application/config/extensions'; diff --git a/application/config/stv.php b/application/config/stv.php new file mode 100644 index 000000000..31ce3f521 --- /dev/null +++ b/application/config/stv.php @@ -0,0 +1,76 @@ + [ + //all fields can be configured to be hidden, see class attribute stv-details-details-name for name + 'hiddenFields' => [], + 'hideUDFs' => false + ], + + 'prestudent' => [ + + //all fields can be configured to be hidden, see class attribute stv-details-prestudent-name for name + 'hiddenFields' => [ + + //propably used by FH-Communities + 'aufnahmeschluessel', 'standort_code', 'facheinschlaegigBerufstaetig' + + ], + 'hideUDFs' => false + ], + 'finalexam' => [ + 'documents' => [ + 'pruefungsprotokoll' => [ + 'de' => [ + 'Bakk' => 'PrProtBA', + 'Master' => 'PrProtMA', + ], + 'en' => [ + 'Bakk' => 'PrProtBAEng', + 'Master' => 'PrProtMAEng', + ], + ], + 'pruefungszeugnis' => [ + 'de' => [ + 'Bakk' => 'Bakkzeugnis', + 'Master' => 'Diplomzeugnis', + ], + 'en' => [ + 'Bakk' => 'BakkzeugnisEng', + 'Master' => 'DiplomzeugnisEng', + ], + ], + 'urkunde' => [ + 'de' => [ + 'Bakk' => 'Bakkurkunde', + 'Master' => 'Diplomurkunde', + ], + 'en' => [ + 'Bakk' => 'BakkurkundeEng', + 'Master' => 'DiplomurkundeEng', + ], + ], + ], + ] + ]; + +// List of fields to show when ZGV_DOKTOR_ANZEIGEN is defined +$fieldsZgvDoktor = ['zgvdoktorort', 'zgvdoktordatum', 'zgvdoktornation', 'zgvdoktor_erfuellt', 'zgvdoktor_code']; + +// List of fields to show when ZGV_ERFUELLT_ANZEIGEN is defined +$fieldsZgvErfuellt = ['zgv_erfuellt', 'zgvmas_erfuellt','zgvdoktor_erfuellt']; + +//order important: to show zgf_erfuellt_doktor just in case visibility of doktor is true +if (!defined('ZGV_ERFUELLT_ANZEIGEN') || !ZGV_ERFUELLT_ANZEIGEN) { + $config['tabs']['prestudent']['hiddenFields'] = array_merge( + $config['tabs']['prestudent']['hiddenFields'], $fieldsZgvErfuellt + ); +} + +if (!defined('ZGV_DOKTOR_ANZEIGEN') || !ZGV_DOKTOR_ANZEIGEN) { + $config['tabs']['prestudent']['hiddenFields'] = array_merge( + $config['tabs']['prestudent']['hiddenFields'], + $fieldsZgvDoktor + ); +} diff --git a/application/controllers/Cis/InfoTerminal.php b/application/controllers/Cis/InfoTerminal.php new file mode 100644 index 000000000..13dea1367 --- /dev/null +++ b/application/controllers/Cis/InfoTerminal.php @@ -0,0 +1,30 @@ + ['basis/cis:r'], + ]); + } + + // ----------------------------------------------------------------------------------------------------------------- + // Public methods + + /** + * @return void + */ + public function index() + { + $this->load->view('Cis/InfoTerminal.php', []); + } +} diff --git a/application/controllers/Cis/MyLv.php b/application/controllers/Cis/MyLv.php index 08bf843b5..49a938553 100644 --- a/application/controllers/Cis/MyLv.php +++ b/application/controllers/Cis/MyLv.php @@ -26,7 +26,12 @@ class MyLv extends Auth_Controller */ public function index() { - $this->load->view('Cis/MyLv'); + + $viewData = array( + + ); + + $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'MyLv']); } public function Info($studien_semester,$lvid) diff --git a/application/controllers/Cis/Profil.php b/application/controllers/Cis/Profil.php index e991d1976..8c3088bd7 100644 --- a/application/controllers/Cis/Profil.php +++ b/application/controllers/Cis/Profil.php @@ -55,7 +55,10 @@ class Profil extends Auth_Controller */ public function index() { - $this->load->view('Cis/Profil'); + $viewData = array( + + ); + $this->load->view('CisRouterView/CisRouterView.php',['viewData' => $viewData, 'route' => 'profilIndex']); } /** @@ -65,7 +68,9 @@ class Profil extends Auth_Controller */ public function View($uid) { - $this->load->view('Cis/Profil'); + $viewData = array ('uid' => $uid); + + $this->load->view('CisRouterView/CisRouterView.php',['viewData' => $viewData, 'route' => 'profilViewUid']); } /** diff --git a/application/controllers/Cis/Stundenplan.php b/application/controllers/Cis/Stundenplan.php index 3e4e1a070..71e01be8b 100644 --- a/application/controllers/Cis/Stundenplan.php +++ b/application/controllers/Cis/Stundenplan.php @@ -25,6 +25,11 @@ class Stundenplan extends Auth_Controller */ public function index() { - $this->load->view('Cis/Stundenplan'); + + $viewData = array( + 'uid'=>getAuthUID(), + ); + + $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'Stundenplan']); } } diff --git a/application/controllers/Cis4.php b/application/controllers/Cis4.php index 9197fd388..c0ca8d503 100644 --- a/application/controllers/Cis4.php +++ b/application/controllers/Cis4.php @@ -36,6 +36,6 @@ class Cis4 extends Auth_Controller 'person_id' => $personData->person_id ); - $this->load->view('CisVue/Dashboard.php',['viewData' => $viewData]); + $this->load->view('CisRouterView/CisRouterView.php',['viewData' => $viewData, 'route' => 'FhcDashboard']); } } \ No newline at end of file diff --git a/application/controllers/CisVue/Cms.php b/application/controllers/CisVue/Cms.php index d1fe5468e..a9ff13c53 100644 --- a/application/controllers/CisVue/Cms.php +++ b/application/controllers/CisVue/Cms.php @@ -60,7 +60,14 @@ class Cms extends Auth_Controller $content = current($content); - $this->load->view('CisVue/Cms/Content', ['content_id' => $content_id, 'template_kurzbz' => $content->template_kurzbz, 'version' => $version, 'sprache' => $sprache, 'sichtbar' => $sichtbar]); + $viewData = array( + 'content_id' => $content_id, + 'template_kurzbz' => $content->template_kurzbz, + 'version' => $version, + 'sichtbar' => $sichtbar + ); + + $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'Content']); } /** @@ -75,53 +82,15 @@ class Cms extends Auth_Controller * @return void */ public function news($infoscreen = false, $studiengang_kz = null, $semester = null, $mischen = true, $titel = '', $edit = false, $sichtbar = true) - { - $this->load->view('CisVue/Cms/Content', ['infoscreen' => $infoscreen, 'studiengang_kz' => $studiengang_kz, 'semester' => $semester, 'mischen' => $mischen, 'titel' => $titel, 'edit' => $edit, 'sichtbar' => $sichtbar]); + { + $viewData = array(); + $this->load->view('CisRouterView/CisRouterView.php', ['viewData'=>$viewData, 'route' => 'News']); } - - public function getNews($infoscreen = false, $studiengang_kz = null, $semester = null, $mischen = true, $titel = '', $edit = false, $sichtbar = true) - { - $get_page = intval($this->input->get('page', true)); - $get_page_size = intval($this->input->get('page_size', true)); - if ($get_page) { - $page = $get_page; - } - if ($get_page_size) { - $page_size = $get_page_size; - } else { - $page_size = $this->page_size; - } - $news = $this->cmslib->getNews($infoscreen, $studiengang_kz, $semester, $mischen, $titel, $edit, $sichtbar, $page, $page_size); - - if (isError($news)) { - $this->terminateWithJsonError(getError($news)); - } - $news = hasData($news) ? getData($news) : null; - if ($news) { - echo json_encode($news); - } else { - show_error("News: No data found"); - } - - } - - public function getNewsRowCount($infoscreen = false, $studiengang_kz = null, $semester = null, $mischen = true, $titel = '', $fachbereich_kurzbz = null, $maxalter = 0, $edit = false, $sichtbar = true, $page = 1, $page_size = 10) - { - list($studiengang_kz, $semester) = $this->cmslib->getStgAndSem($studiengang_kz, $semester); - $all = $edit; - $num_rows = $this->NewsModel->countNewsWithContent(getSprache(), $studiengang_kz, $semester, $fachbereich_kurzbz, $sichtbar, $maxalter, $page, $this->page_size, $all, $mischen); - if (isError($num_rows)) { - $this->terminateWithJsonError(getError($num_rows)); - } - $num_rows = hasData($num_rows) ? getData($num_rows) : null; - if ($num_rows) { - echo json_encode($num_rows); - } else { - show_error("News number rows: No data found"); - } - } - + public function getRoomInformation($ort_kurzbz){ - $this->load->view('CisVue/Cms/RoomInformation',['ort_kurzbz'=>$ort_kurzbz]); + $viewData = array( + 'ort_kurzbz' => $ort_kurzbz + ); + $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData, 'route' => 'CmsRoom']); } } diff --git a/application/controllers/CisVue/Dashboard.php b/application/controllers/CisVue/Dashboard.php index 5cb0d1a9e..ee830cb8b 100644 --- a/application/controllers/CisVue/Dashboard.php +++ b/application/controllers/CisVue/Dashboard.php @@ -29,17 +29,15 @@ class Dashboard extends Auth_Controller { $this->load->model('person/Person_model','PersonModel'); - $begruesung = $this->PersonModel->getFirstName(getAuthUID()); - if(isError($begruesung)) - { - show_error("name couldn't be loaded for username ".getAuthUID()); - } - $begruesung = getData($begruesung); + $personData = getData($this->PersonModel->getByUid(getAuthUID()))[0]; + $viewData = array( - 'name' => $begruesung + 'uid' => getAuthUID(), + 'name' => $personData->vorname, + 'person_id' => $personData->person_id ); - $this->load->view('CisVue/Dashboard.php', ['viewData' => $viewData]); + $this->load->view('CisRouterView/CisRouterView.php', ['viewData' => $viewData]); } } \ No newline at end of file diff --git a/application/controllers/Documents.php b/application/controllers/Documents.php new file mode 100644 index 000000000..47aae7ed1 --- /dev/null +++ b/application/controllers/Documents.php @@ -0,0 +1,294 @@ +. + */ + +if (! defined('BASEPATH')) exit('No direct script access allowed'); + +/** + * This controller handles output and access to documents. + * It creates a XML file, transforms it with the XSL-FO Vorlage from the + * database and generates a PDF file with unoconv or docsbox. + * This file is then outputted as download. + * + * It is the CodeIgniter version of content/pdfExport.php when not using the + * get paremeters: "archivdokument" and "archive". + * Use exportSigned() instead of providing the "sign" get parameter and + * export() otherwise. + */ +class Documents extends Auth_Controller +{ + public function __construct() + { + parent::__construct([ + 'export' => self::PERM_LOGGED, + 'exportSigned' => self::PERM_LOGGED + ]); + + // Load Phrases + $this->loadPhrases([ + 'stv' + ]); + } + + /** + * Download a not signed document. + * + * @param string $xml + * @param string $xsl + * + * @return void + */ + public function export($xml, $xsl) + { + return $this->_export($xml, $xsl); + } + + /** + * Download a signed document. + * + * @param string $xml + * @param string $xsl + * + * @return void + */ + public function exportSigned($xml, $xsl) + { + return $this->_export($xml, $xsl, getAuthUID()); + } + + /** + * Helper function for export() and exportSigned() + * + * @param string $xml + * @param string $xsl + * @param string $sign_user (optional) + * + * @return void + */ + protected function _export($xml, $xsl, $sign_user = null) + { + $xsl_oe_kurzbz = null; + $version = $this->input->post_get('version') ?: null; + + // Get the OE or STG of the document + $xsl_oe_kurzbz = $this->input->post_get('xsl_oe_kurzbz') + ?: $this->input->post_get('xsl_stg_kz') + ?: $this->input->post_get('stg_kz'); + if (is_null($xsl_oe_kurzbz)) { + $uid = $this->input->post_get('uid'); + if ($uid) { + $uid = current(explode(';', $uid)); + $this->load->model('crm/Student_model', 'StudentModel'); + $result = $this->StudentModel->load([$uid]); + if (!isError($result) && hasData($result)) + $xsl_oe_kurzbz = current(getData($result))->studiengang_kz; + } + } + if (is_null($xsl_oe_kurzbz)) { + $prestudent_id = $this->input->post_get('prestudent_id'); + if ($prestudent_id) { + $prestudent_id = current(explode(';', $prestudent_id)); + $this->load->model('crm/Prestudent_model', 'PrestudentModel'); + $result = $this->PrestudentModel->load($prestudent_id); + if (!isError($result) && hasData($result)) + $xsl_oe_kurzbz = current(getData($result))->studiengang_kz; + } + } + if (is_null($xsl_oe_kurzbz)) + $xsl_oe_kurzbz = 0; + + // Access rights + if ($xsl == 'AccountInfo') { + $this->load->model('resource/Mitarbeiter_model', 'MitarbeiterModel'); + $this->load->model('crm/Student_model', 'StudentModel'); + $uids = $this->input->post_get('uid'); + if ($uids) { + $uids = explode(';', $uids); + foreach ($uids as $uid) { + $result = $this->MitarbeiterModel->load($uid); + if (!isError($result) && hasData($result)) { + if (!$this->permissionlib->isBerechtigt('admin', 'suid', 0) + && !$this->permissionlib->isBerechtigt('mitarbeiter', 'suid', 0)) + return $this->_outputAuthError([$this->router->method => ['admin:rw', 'mitarbeiter:rw']]); + } else { + $result = $this->StudentModel->load([$uid]); + if (!isError($result) && hasData($result)) { + $student = current(getData($result)); + if (!$this->permissionlib->isBerechtigt('admin', 'suid', $student->studiengang_kz) + && !$this->permissionlib->isBerechtigt('admin', 'suid', 0) + && !$this->permissionlib->isBerechtigt('assistenz', 'suid', $student->studiengang_kz) + && !$this->permissionlib->isBerechtigt('assistenz', 'suid', 0) + && !$this->permissionlib->isBerechtigt('support', 'suid', 0)) + return $this->_outputAuthError([$this->router->method => ['admin:rw', 'assistenz:rw', 'support:rw']]); + } + } + } + } + } else { + $this->load->model('system/Vorlagestudiengang_model', 'VorlagestudiengangModel'); + + $result = $this->VorlagestudiengangModel->getCurrent($xsl, $xsl_oe_kurzbz, $version); + if (isError($result)) + return show_error(getError($result)); + if (!hasData($result)) + return show_404(); + + $access_rights = current(getData($result))->berechtigung; + if (!$access_rights) + return show_404(); + $allowed = false; + foreach ($access_rights as $access_right) { + if ($this->permissionlib->isBerechtigt($access_right)) { + $allowed = true; + break; + } + } + if (!$allowed) + return $this->_outputAuthError([$this->router->method => $access_rights]); + } + + // Output format + $outputformat = $this->input->post_get('output') ?: 'pdf'; + if ($outputformat != 'pdf' + // An der FHTW darf das Studienblatt und das Prüfungsprotokoll auch in anderen Formaten exportiert werden + && !(CAMPUS_NAME == 'FH Technikum Wien' + && ($xsl == 'Studienblatt' + || $xsl == 'StudienblattEng' + || $xsl == 'PrProtBA' + || $xsl == 'PrProtBAEng' + || $xsl == 'PrProtMA' + || $xsl == 'PrProtMAEng' + ) + ) + && !$this->permissionlib->isBerechtigt('system/change_outputformat', null, $xsl_oe_kurzbz) + ) { + $outputformat = 'pdf'; + } + + // XML Params + $params = 'xmlformat=xml'; + foreach ([ + 'uid', + 'stg_kz', + 'person_id', + 'id', + 'prestudent_id', + 'buchungsnummern', + 'ss', + 'abschlusspruefung_id', + 'typ', + 'all', + 'preoutgoing_id', + 'lvid', + 'projekt_kurzbz', + 'von', + 'bis', + 'stundevon', + 'stundebis', + 'sem', + 'lehreinheit', + 'mitarbeiter_uid', + 'studienordnung_id', + 'fixangestellt', + 'standort', + 'abrechnungsmonat', + 'form', + 'projektarbeit_id', + 'betreuerart_kurzbz', + 'studiensemester_kurzbz' + ] as $key) { + $value = $this->input->post_get($key); + if ($value !== null) + $params .= '&' . $key . '=' . urlencode($value); + } + $value = $this->input->post_get('vertrag_id'); + if ($value !== null) { + foreach ($value as $id) + $params .= '&vertrag_id[]=' . urlencode($id); + } + + $this->load->library('DocumentExportLib'); + $this->load->model('system/Vorlage_model', 'VorlageModel'); + + $result = $this->VorlageModel->load($xsl); + if (isError($result)) + return show_error(getError($result)); + if (!hasData($result)) + show_404(); + + $vorlage = current(getData($result)); + if ($sign_user && !$vorlage->signierbar) + return show_error($this->p->t("stv", "grades_error_sign")); + + + // Filename + $filename = ($vorlage->bezeichnung ?: $vorlage->vorlage_kurzbz); + switch ($xsl) { + case 'LV_Informationen': + $this->load->model('organisation/Studiengang_model', 'StudiengangModel'); + $result = $this->StudiengangModel->load($this->input->post_get('stg_kz')); + if (!isError($result) && hasData($result)) + $filename .= '_' . sanitizeProblemChars(current(getData($result))->kurzbzlang); + + $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + $result = $this->StudiensemesterModel->load($this->input->post_get('ss')); + if (!isError($result) && hasData($result)) + $filename .= '_' . sanitizeProblemChars(current(getData($result))->studiensemester_kurzbz); + break; + case 'Honorarvertrag': + $uid = str_replace(';', '', $this->input->post_get('uid') ?: ''); + $this->load->model('person/Benutzer_model', 'BenutzerModel'); + $this->BenutzerModel->addJoin('public.tbl_person', 'person_id', 'LEFT'); + $result = $this->BenutzerModel->load([$uid]); + if (!isError($result) && hasData($result)) { + $user = current(getData($result)); + $filename .= '_' . sanitizeProblemChars($user->nachname) . '_' . sanitizeProblemChars($user->vorname); + } + break; + case 'Studienordnung': + $filename = 'Studienordnung-Studienplan-'; + + $this->load->model('organisation/Studienordnung_model', 'StudienordnungModel'); + $result = $this->StudienordnungModel->load($this->input->post_get('studienordnung_id')); + if (!isError($result) && hasData($result)) { + $so = current(getData($result)); + $filename .= sprintf("%'.04d", $so->studiengang_kz) . '-' . $so->studiengangkurzbzlang; + } + break; + default: + $uid = str_replace(';', '', $this->input->post_get('uid') ?: ''); + $this->load->model('person/Benutzer_model', 'BenutzerModel'); + $this->BenutzerModel->addJoin('public.tbl_person', 'person_id', 'LEFT'); + $result = $this->BenutzerModel->load([$uid]); + if (!isError($result) && hasData($result)) { + $user = current(getData($result)); + $filename .= '_' . sanitizeProblemChars($user->nachname); + } + break; + } + + // XML Data + $result = $this->documentexportlib->getDataURL($xml, $params); + if (isError($result)) + return show_error(getError($result)); + + $data = getData($result); + + // Output + $this->documentexportlib->showContent($filename, $vorlage, $data, $xsl_oe_kurzbz, $version, $outputformat, $sign_user); + } +} diff --git a/application/controllers/Studentenverwaltung.php b/application/controllers/Studentenverwaltung.php index e09d04c6a..2ce19c58a 100644 --- a/application/controllers/Studentenverwaltung.php +++ b/application/controllers/Studentenverwaltung.php @@ -30,7 +30,8 @@ class Studentenverwaltung extends Auth_Controller 'admin' => $this->permissionlib->isBerechtigt('admin'), 'assistenz_schreibrechte' => $this->permissionlib->isBerechtigt('assistenz','suid'), 'student/keine_studstatuspruefung' => $this->permissionlib->isBerechtigt('student/keine_studstatuspruefung'), - 'lehre/reihungstestAufsicht' => $this->permissionlib->isBerechtigt('lehre/reihungstestAufsicht') + 'lehre/reihungstestAufsicht' => $this->permissionlib->isBerechtigt('lehre/reihungstestAufsicht'), + 'system/change_outputformat' => $this->permissionlib->getOE_isEntitledFor('system/change_outputformat'), ], 'variables' => [ 'semester_aktuell' => $this->variablelib->getVar('semester_aktuell') diff --git a/application/controllers/api/frontend/v1/AuthInfo.php b/application/controllers/api/frontend/v1/AuthInfo.php new file mode 100644 index 000000000..1362aee18 --- /dev/null +++ b/application/controllers/api/frontend/v1/AuthInfo.php @@ -0,0 +1,52 @@ +. + */ + +if (!defined('BASEPATH')) exit('No direct script access allowed'); + +class AuthInfo extends FHCAPI_Controller +{ + + /** + * Object initialization + */ + public function __construct() + { + parent::__construct([ + 'getAuthUID' => self::PERM_LOGGED, + ]); + + $this->uid = getAuthUID(); + $this->pid = getAuthPersonID(); + } + + //------------------------------------------------------------------------------------------------------------------ + // Public methods + + /** + * returns the uid of the currently logged in user + * @access public + * + */ + public function getAuthUID() + { + $this->terminateWithSuccess(['uid'=>$this->uid]); + } + + +} + diff --git a/application/controllers/api/frontend/v1/Bookmark.php b/application/controllers/api/frontend/v1/Bookmark.php index a811843ce..3e646bb51 100644 --- a/application/controllers/api/frontend/v1/Bookmark.php +++ b/application/controllers/api/frontend/v1/Bookmark.php @@ -30,6 +30,7 @@ class Bookmark extends FHCAPI_Controller 'getBookmarks' => self::PERM_LOGGED, 'delete' => self::PERM_LOGGED, 'insert' => self::PERM_LOGGED, + 'update' => self::PERM_LOGGED, ]); $this->load->model('dashboard/Bookmark_model', 'BookmarkModel'); @@ -50,7 +51,8 @@ class Bookmark extends FHCAPI_Controller */ public function getBookmarks() { - $bookmarks = $this->BookmarkModel->loadWhere(["uid"=>$this->uid]); + $this->BookmarkModel->addOrder("bookmark_id"); + $bookmarks = $this->BookmarkModel->loadWhere(["uid"=>$this->uid]); $bookmarks = $this->getDataOrTerminateWithError($bookmarks); @@ -104,6 +106,33 @@ class Bookmark extends FHCAPI_Controller $this->terminateWithSuccess($insert_into_result); + } + + /** + * updates bookmark in the bookmark table + * @access public + * @return void + */ + public function update($bookmark_id) + { + // form validation + $this->load->library('form_validation'); + $this->form_validation->set_rules('url', 'URL', 'required|valid_url|max_length[511]'); + $this->form_validation->set_rules('title', 'Title', 'required|max_length[255]'); + if($this->form_validation->run() == FALSE) $this->terminateWithValidationErrors($this->form_validation->error_array()); + + $url = $this->input->post('url',true); + $title = $this->input->post('title',true); + + $now = new DateTime(); + $now = $now->format('Y-m-d H:i:s'); + + $update_result = $this->BookmarkModel->update($bookmark_id,['url'=>$url, 'title'=>$title,'updateamum'=>$now]); + + $update_result = $this->getDataOrTerminateWithError($update_result); + + $this->terminateWithSuccess($update_result); + } } diff --git a/application/controllers/api/frontend/v1/Cis4FhcApi.php b/application/controllers/api/frontend/v1/Cis4FhcApi.php new file mode 100644 index 000000000..372e4bfaa --- /dev/null +++ b/application/controllers/api/frontend/v1/Cis4FhcApi.php @@ -0,0 +1,58 @@ +. + */ + +if (! defined('BASEPATH')) exit('No direct script access allowed'); + +class Cis4FhcApi extends FHCAPI_Controller +{ + + /** + * Object initialization + */ + public function __construct() + { + parent::__construct([ + 'getViewData' => self::PERM_LOGGED, + ]); + + } + + //------------------------------------------------------------------------------------------------------------------ + // Public methods + + /** + * fetches ViewData + */ + public function getViewData() + { + $this->load->model('person/Person_model','PersonModel'); + $personData = getData($this->PersonModel->getByUid(getAuthUID()))[0]; + + $viewData = array( + 'uid' => getAuthUID(), + 'name' => $personData->vorname, + 'person_id' => $personData->person_id + ); + + $this->terminateWithSuccess($viewData); + } + + + +} + diff --git a/application/controllers/api/frontend/v1/CisMenu.php b/application/controllers/api/frontend/v1/CisMenu.php new file mode 100644 index 000000000..4f4f2573e --- /dev/null +++ b/application/controllers/api/frontend/v1/CisMenu.php @@ -0,0 +1,58 @@ +. + */ + +if (! defined('BASEPATH')) exit('No direct script access allowed'); + + +class CisMenu extends FHCAPI_Controller +{ + + /** + * Object initialization + */ + public function __construct() + { + parent::__construct([ + 'getMenu' => self::PERM_LOGGED, + ]); + + + + } + + //------------------------------------------------------------------------------------------------------------------ + // Public methods + + /** + * fetches the menu for CIS from the database based on the userLanguage + */ + public function getMenu() + { + $this->load->model('content/Content_model', 'ContentModel'); + $this->load->config('cis'); + $cis4_content_id =$this->config->item('cis_menu_root_content_id'); + $result = $this->ContentModel->getMenu($cis4_content_id, getAuthUID(),getUserLanguage()); + $result = $this->getDataOrTerminateWithError($result); + $menu = $result->childs ?? []; + $this->terminateWithSuccess($menu); + } + + + +} + diff --git a/application/controllers/api/frontend/v1/Cms.php b/application/controllers/api/frontend/v1/Cms.php index e41196f45..b8937a1f4 100644 --- a/application/controllers/api/frontend/v1/Cms.php +++ b/application/controllers/api/frontend/v1/Cms.php @@ -106,7 +106,6 @@ class Cms extends FHCAPI_Controller $this->terminateWithSuccess($content_id); } - //todo: there is the method news and getNews but only one should exist public function news() { @@ -125,25 +124,35 @@ class Cms extends FHCAPI_Controller //get the data or terminate with error $news = $this->getDataOrTerminateWithError($news); - + // array that keeps track of which news don't have a betreff and have to be removed from the news array + $newsToRemove = array(); // collect the content of the news - foreach($news as $news_element){ - $this->addMeta("content_id",$news_element->content_id); + foreach($news as $index=>$news_element){ - //todo: quick fix, for query builder error when fetching content $this->NewsModel->resetQuery(); $content = $this->cmslib->getContent($news_element->content_id); - - $content = getData($content); - - $news_element->content_obj = $content; + if(isError($content)) + { + // removes the news from the news array, so that the response does not include a invalid news + array_push($newsToRemove,$index); + //add the error to the api response? visual feedback + //$this->addError(print_r($content->retval,true)); + continue; + } + $content = getData($content); + $news_element->content_obj = $content; } + + //removes all news that don't have a betreff + foreach($newsToRemove as $removeNewsIndex) + { + unset($news[$removeNewsIndex]); + } + $withContent = function($news) { return $news->content_obj != null; - }; - + }; $newsWithContent = array_filter($news, $withContent); - $this->terminateWithSuccess($newsWithContent); } @@ -176,15 +185,18 @@ class Cms extends FHCAPI_Controller // getting the GET parameters $page = intval($this->input->get('page', true)); $page_size = intval($this->input->get('page_size', true)); + $sprache = $this->input->get('sprache', true); + if(!$sprache) + { + $sprache = getUserLanguage(); + } // default value for the page_size is 10 $page_size = $page_size ?? 10; - $news = $this->cmslib->getNews($infoscreen, $studiengang_kz, $semester, $mischen, $titel, $edit, $sichtbar, $page, $page_size); - + $news = $this->cmslib->getNews($infoscreen, $studiengang_kz, $semester, $mischen, $titel, $edit, $sichtbar, $page, $page_size, $sprache); $news = $this->getDataOrTerminateWithError($news); - $this->addMeta('test', $this->p->t('global', 'studiengangsleitung')); $this->addMeta('phrases', json_decode($this->p->getJson())); $this->terminateWithSuccess($news); diff --git a/application/controllers/api/frontend/v1/Documents.php b/application/controllers/api/frontend/v1/Documents.php new file mode 100644 index 000000000..60010e14d --- /dev/null +++ b/application/controllers/api/frontend/v1/Documents.php @@ -0,0 +1,422 @@ +. + */ + +if (! defined('BASEPATH')) exit('No direct script access allowed'); + +/** + * This controller operates between (interface) the JS (GUI) and the back-end + * Provides data to the ajax get calls about documents + * Listens to ajax post calls to change the documents data + * This controller works with JSON calls on the HTTP GET or POST and the output is always JSON + * + * This controller handles output and access to documents. + * It checks permissions to render documents in an alternative format + * or it creates a XML file, transforms it with the XSL-FO Vorlage from the + * database and generates a PDF file with unoconv or docsbox. + * This file is then archivated in the database. + * + * The last part is the CodeIgniter version of content/pdfExport.php when not + * using the get paremeter: "archivdokument" but using the get parameter: + * "archive". + * Use archiveSigned() instead of providing the "sign" get parameter and + * archive() otherwise. + */ +class Documents extends FHCAPI_Controller +{ + public function __construct() + { + parent::__construct([ + 'permissionAlternativeFormat' => self::PERM_LOGGED, + 'archive' => ['admin:rw', 'assistenz:rw'], + 'archiveSigned' => ['admin:rw', 'assistenz:rw'] + ]); + + // Load Phrases + $this->loadPhrases([ + 'stv' + ]); + } + + /** + * Checks if the current user has permission to render documents in an + * alternative format. + * + * @param string $oe_kurzbz Or studiengang_kz + * + * @return void + */ + public function permissionAlternativeFormat($oe_kurzbz) + { + $this->terminateWithSuccess($this->permissionlib->isBerechtigt('system/change_outputformat', null, $oe_kurzbz)); + } + + /** + * Download a not signed document. + * + * @param string $xml (optional) + * @param string $xsl (optional) + * + * @return void + */ + public function archive($xml = null, $xsl = null) + { + return $this->_archive($xml, $xsl); + } + + /** + * Download a signed document. + * + * @param string $xml (optional) + * @param string $xsl (optional) + * + * @return void + */ + public function archiveSigned($xml = null, $xsl = null) + { + return $this->_archive($xml, $xsl, getAuthUID()); + } + + /** + * Helper function for archive() and archiveSigned() + * + * @param string $xml + * @param string $xsl + * @param string $sign_user (optional) + * + * @return void + */ + public function _archive($xml, $xsl, $sign_user = null) + { + if (!$xml || !$xsl) { + $this->load->library('form_validation'); + if (!$xml) { + $xml = $this->input->post_get('xml'); + $this->form_validation->set_rules('xml', 'xml', 'required'); + } + if (!$xsl) { + $xsl = $this->input->post_get('xsl'); + $this->form_validation->set_rules('xsl', 'xsl', 'required'); + } + + if (!$this->form_validation->run()) + $this->terminateWithValidationErrors($this->form_validation->error_array()); + } + + $xsl_oe_kurzbz = null; + $version = $this->input->post_get('version') ?: null; + + // Get the OE or STG of the document + $xsl_oe_kurzbz = $this->input->post_get('xsl_oe_kurzbz') + ?: $this->input->post_get('xsl_stg_kz') + ?: $this->input->post_get('stg_kz'); + if (is_null($xsl_oe_kurzbz)) { + $uid = $this->input->post_get('uid'); + if ($uid) { + $uid = current(explode(';', $uid)); + $this->load->model('crm/Student_model', 'StudentModel'); + $result = $this->StudentModel->load([$uid]); + if (!isError($result) && hasData($result)) + $xsl_oe_kurzbz = current(getData($result))->studiengang_kz; + } + } + if (is_null($xsl_oe_kurzbz)) { + $prestudent_id = $this->input->post_get('prestudent_id'); + if ($prestudent_id) { + $prestudent_id = current(explode(';', $prestudent_id)); + $this->load->model('crm/Prestudent_model', 'PrestudentModel'); + $result = $this->PrestudentModel->load($prestudent_id); + if (!isError($result) && hasData($result)) + $xsl_oe_kurzbz = current(getData($result))->studiengang_kz; + } + } + if (is_null($xsl_oe_kurzbz)) + $xsl_oe_kurzbz = 0; + + // Vorlage + $this->load->model('system/Vorlage_model', 'VorlageModel'); + + $result = $this->VorlageModel->load($xsl); + $vorlage = current($this->getDataOrTerminateWithError($result)); + if (!$vorlage) + show_404(); + + // Akte Data + $akteData = [ + 'dokument_kurzbz' => $vorlage->dokument_kurzbz ?: 'Zeugnis', + 'mimetype' => 'application/pdf', + 'erstelltam' => date('Y-m-d'), + 'gedruckt' => true, + 'insertamum' => date('c'), + 'insertvon' => getAuthUID(), + 'uid' => $this->input->post_get('uid') ?: '', + 'archiv' => true, + 'signiert' => !!$sign_user, + 'stud_selfservice' => $vorlage->stud_selfservice + ]; + $studiengang_kz = null; + if ($akteData['uid']) { + $this->load->model('crm/Student_model', 'StudentModel'); + $this->StudentModel->addJoin('public.tbl_studiengang', 'studiengang_kz', 'LEFT'); + $result = $this->StudentModel->load([$akteData['uid']]); + $student = current($this->getDataOrTerminateWithError($result)); + + $ss = $this->input->post_get('ss'); + + if ($ss !== null) { + $this->load->model('crm/prestudentstatus_model', 'PrestudentstatusModel'); + $result = $this->PrestudentstatusModel->getLastStatus($student->prestudent_id, $ss); + $status = current($this->getDataOrTerminateWithError($result)); + if (!$status) + $this->terminateWithError($this->p->t("stv", "grades_error_prestudentstatus")); + $semester = $status->ausbildungssemester; + + $this->load->model('education/Studentlehrverband_model', 'StudentlehrverbandModel'); + $this->StudentlehrverbandModel->addJoin('public.tbl_benutzer', 'uid = student_uid'); + $this->StudentlehrverbandModel->addJoin('public.tbl_studiengang', 'studiengang_kz'); + $result = $this->StudentlehrverbandModel->load([ + 'studiensemester_kurzbz' => $ss, + 'student_uid' => $akteData['uid'] + ]); + $res = current($this->getDataOrTerminateWithError($result)); + + $studiengang_kz = $res->studiengang_kz; + $akteData['person_id'] = $res->person_id; + switch ($xsl) { + case 'Ausbildungsver': + case 'AusbVerEng': + $akteData['titel'] = mb_substr($xsl . + "_" . + strtoupper($res->typ) . + strtoupper($res->kurzbz) . + "_" . + $semester . + "_" . + $ss, 0, 64); + $akteData['bezeichnung'] = mb_substr($vorlage->bezeichnung . " " . $student->kuerzel, 0, 64); + break; + case 'LVZeugnisEng': + case 'LVZeugnis': + case 'Zertifikat': + $this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel'); + $result = $this->LehrveranstaltungModel->load($this->input->post_get('lvid')); + $lv = current($this->getDataOrTerminateWithError($result)); + $akteData['dokument_kurzbz'] = $xsl; + $akteData['titel'] = mb_substr($xsl . + "_" . + strtoupper($res->typ) . + strtoupper($res->kurzbz) . + "_" . + $semester . + '_' . + $ss . + '_' . + str_replace(' ', '_', $lv->bezeichnung), 0, 60); + $akteData['bezeichnung'] = mb_substr($xsl . + " " . + strtoupper($res->typ) . + strtoupper($res->kurzbz) . + " " . + $semester . + ". Semester" . + ' ' . + $ss . + ' ' . + $lv->bezeichnung, 0, 64); + break; + case 'SZeugnis': + $akteData['titel'] = mb_substr($vorlage->bezeichnung . " " . $student->kuerzel, 0, 64); + $akteData['bezeichnung'] = mb_substr($vorlage->bezeichnung . " " . $student->kuerzel, 0, 64); + break; + default: + $akteData['titel'] = mb_substr($xsl . + "_" . + strtoupper($res->typ) . + strtoupper($res->kurzbz) . + "_" . + $semester . + "_" . + $ss, 0, 64); + $akteData['bezeichnung'] = mb_substr($xsl . + " " . + strtoupper($res->typ) . + strtoupper($res->kurzbz) . + " " . + $semester . + ". Semester" . + ' ' . + $ss, 0, 64); + break; + } + } else { + $studiengang_kz = $student->studiengang_kz; + $akteData['person_id'] = $student->person_id; + $akteData['titel'] = $vorlage->bezeichnung . '_' . $student->kuerzel; + $akteData['bezeichnung'] = mb_substr($vorlage->bezeichnung . " " . $student->kuerzel, 0, 64); + } + } else { + $prestudent_id = $this->input->post_get('prestudent_id'); + if ($prestudent_id) { + $this->load->model('crm/prestudent_model', 'PrestudentModel'); + $this->PrestudentModel->addJoin('public.tbl_studiengang', 'studiengang_kz', 'LEFT'); + $result = $this->PrestudentModel->load($prestudent_id); + $prestudent = current($this->getDataOrTerminateWithError($result)); + + $studiengang_kz = $prestudent->studiengang_kz; + $akteData['person_id'] = $prestudent->person_id; + $akteData['titel'] = mb_substr($xsl . "_" . $prestudent->kuerzel, 0, 64); + $akteData['bezeichnung'] = mb_substr($vorlage->bezeichnung . " " . $prestudent->kuerzel, 0, 64); + } + } + + // Access rights + if (!$this->permissionlib->isBerechtigt('admin', 'suid', $studiengang_kz) + && !$this->permissionlib->isBerechtigt('assistenz', 'suid', $studiengang_kz)) + return $this->_outputAuthError([$this->router->method => ['admin:rw', 'assistenz:rw']]); + if ($xsl == 'AccountInfo') { + $this->load->model('resource/Mitarbeiter_model', 'MitarbeiterModel'); + $this->load->model('crm/Student_model', 'StudentModel'); + $uids = $this->input->post_get('uid'); + if ($uids) { + $uids = explode(';', $uids); + foreach ($uids as $uid) { + $result = $this->MitarbeiterModel->load($uid); + if (!isError($result) && hasData($result)) { + if (!$this->permissionlib->isBerechtigt('admin', 'suid', 0) + && !$this->permissionlib->isBerechtigt('mitarbeiter', 'suid', 0)) + return $this->_outputAuthError([$this->router->method => ['admin:rw', 'mitarbeiter:rw']]); + } else { + $result = $this->StudentModel->load([$uid]); + if (!isError($result) && hasData($result)) { + $student = current(getData($result)); + if (!$this->permissionlib->isBerechtigt('admin', 'suid', $student->studiengang_kz) + && !$this->permissionlib->isBerechtigt('admin', 'suid', 0) + && !$this->permissionlib->isBerechtigt('assistenz', 'suid', $student->studiengang_kz) + && !$this->permissionlib->isBerechtigt('assistenz', 'suid', 0) + && !$this->permissionlib->isBerechtigt('support', 'suid', 0)) + return $this->_outputAuthError([$this->router->method => ['admin:rw', 'assistenz:rw', 'support:rw']]); + } + } + } + } + } else { + $this->load->model('system/Vorlagestudiengang_model', 'VorlagestudiengangModel'); + + $result = $this->VorlagestudiengangModel->getCurrent($xsl, $xsl_oe_kurzbz, $version); + $access_rights = current($this->getDataOrTerminateWithError($result)); + if (!$access_rights || !$access_rights->berechtigung) + return show_404(); + + $allowed = false; + foreach ($access_rights->berechtigung as $access_right) { + if ($this->permissionlib->isBerechtigt($access_right)) { + $allowed = true; + break; + } + } + if (!$allowed) + return $this->_outputAuthError([$this->router->method => $access_rights]); + } + + // Output format + $outputformat = $this->input->post_get('output') ?: 'pdf'; + if ($outputformat != 'pdf' + // An der FHTW darf das Studienblatt und das Prüfungsprotokoll auch in anderen Formaten exportiert werden + && !(CAMPUS_NAME == 'FH Technikum Wien' + && ($xsl == 'Studienblatt' + || $xsl == 'StudienblattEng' + || $xsl == 'PrProtBA' + || $xsl == 'PrProtBAEng' + || $xsl == 'PrProtMA' + || $xsl == 'PrProtMAEng' + ) + ) + && !$this->permissionlib->isBerechtigt('system/change_outputformat', null, $xsl_oe_kurzbz) + ) { + $outputformat = 'pdf'; + } + + // XML Params + $params = 'xmlformat=xml'; + foreach ([ + 'uid', + 'stg_kz', + 'person_id', + 'id', + 'prestudent_id', + 'buchungsnummern', + 'ss', + 'abschlusspruefung_id', + 'typ', + 'all', + 'preoutgoing_id', + 'lvid', + 'projekt_kurzbz', + 'von', + 'bis', + 'stundevon', + 'stundebis', + 'sem', + 'lehreinheit', + 'mitarbeiter_uid', + 'studienordnung_id', + 'fixangestellt', + 'standort', + 'abrechnungsmonat', + 'form', + 'projektarbeit_id', + 'betreuerart_kurzbz', + 'studiensemester_kurzbz' + ] as $key) { + $value = $this->input->post_get($key); + if ($value !== null) + $params .= '&' . $key . '=' . urlencode($value); + } + $value = $this->input->post_get('vertrag_id'); + if ($value !== null) { + foreach ($value as $id) + $params .= '&vertrag_id[]=' . urlencode($id); + } + + if (!$vorlage->archivierbar) + $this->terminateWithError($this->p->t("stv", "grades_error_archive")); + + if ($sign_user && !$vorlage->signierbar) + $this->terminateWithError($this->p->t("stv", "grades_error_sign")); + + + $this->load->library('DocumentExportLib'); + + // XML Data + $result = $this->documentexportlib->getDataURL($xml, $params); + $data = $this->getDataOrTerminateWithError($result); + $this->documentexportlib->addArchiveToData($data); + + // Output + $result = $this->documentexportlib->getContent($vorlage, $data, $xsl_oe_kurzbz, $version, $outputformat, $sign_user); + + $content = $this->getDataOrTerminateWithError($result); + $akteData['titel'] .= '.pdf'; + $akteData['inhalt'] = base64_encode($content); + + $this->load->model('crm/Akte_model', 'AkteModel'); + $result = $this->AkteModel->insert($akteData); + $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess(true); + } +} diff --git a/application/controllers/api/frontend/v1/Filter.php b/application/controllers/api/frontend/v1/Filter.php index 45838fc5f..b195e0012 100644 --- a/application/controllers/api/frontend/v1/Filter.php +++ b/application/controllers/api/frontend/v1/Filter.php @@ -113,7 +113,7 @@ class Filter extends FHCAPI_Controller */ public function applyFilterFields() { - $this->form_validation->set_rules('filterFields', 'filterFields', 'required'); + $this->form_validation->set_rules('filterFields[]', 'filterFields', 'required'); if (!$this->form_validation->run()) $this->terminateWithValidationErrors($this->form_validation->error_array()); diff --git a/application/controllers/api/frontend/v1/Lehre.php b/application/controllers/api/frontend/v1/Lehre.php index c25dc1986..f079a5b37 100644 --- a/application/controllers/api/frontend/v1/Lehre.php +++ b/application/controllers/api/frontend/v1/Lehre.php @@ -30,6 +30,7 @@ class Lehre extends FHCAPI_Controller parent::__construct([ 'lvStudentenMail' => self::PERM_LOGGED, 'LV' => self::PERM_LOGGED, + 'Pruefungen' => self::PERM_LOGGED, ]); @@ -76,6 +77,23 @@ class Lehre extends FHCAPI_Controller $this->terminateWithSuccess($result); } + + /** + * fetches all Pruefungen of a student for a specific lehrveranstaltung + * if the student passed the Pruefung on the first attempt, no information about the Pruefungen is stored in the database + * @param mixed $lehrveranstaltung_id + * @return void + */ + public function Pruefungen($lehrveranstaltung_id) + { + $this->load->model('education/Pruefung_model', 'PruefungModel'); + + $result = $this->PruefungModel->getByStudentAndLv(getAuthUID(), $lehrveranstaltung_id, getUserLanguage()); + + $result = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($result); + } diff --git a/application/controllers/api/frontend/v1/LvMenu.php b/application/controllers/api/frontend/v1/LvMenu.php index 777d49b0c..393c4d5c3 100644 --- a/application/controllers/api/frontend/v1/LvMenu.php +++ b/application/controllers/api/frontend/v1/LvMenu.php @@ -58,6 +58,22 @@ class LvMenu extends FHCAPI_Controller //------------------------------------------------------------------------------------------------------------------ // Public methods + + /** + * alternative function to get multiple lvMenus with a single http request + */ + public function getMultipleLvMenu($lvMenuOptionList){ + $result =[]; + foreach($lvMenuOptionList as $lvMenuOptions){ + $lvMenu = $this->getLvMenu($lvMenuOptions['lvid'],$lvMenuOptions['studiensemester_kurzbz']); + if(isError($lvMenu)){ + // TODO: some lvMenu threw an error, handle error here + } + $result[$lvMenuOptions['lvid']]=$lvMenu; + } + $this->terminateWithSuccess($result); + } + /** * */ @@ -91,20 +107,24 @@ class LvMenu extends FHCAPI_Controller $lvres = $this->Lehrveranstaltung_model->load($lvid); if(!hasData($lvres)) { - $this->terminateWithError('LV ' . $lvid . ' not found.'); + $this->terminateWithError('LV ' . $lvid . ' not found.'); } $lv = (getData($lvres))[0]; - + $this->addMeta('lvInfo',$lv); // define studiengang_kz / semester / lehrverzeichnis $studiengang_kz = $lv->studiengang_kz; $semester = $lv->semester; $short = $lv->lehreverzeichnis; + // return empty menu for studiengang_kz = 0 + if($studiengang_kz == 0){ + $this->terminateWithSuccess("organisatorische_einheit"); + } // load studiengang - $stgres = $this->Studiengang_model->load($lv->studiengang_kz); + $stgres = $this->Studiengang_model->load(strval($studiengang_kz)); if(!hasData($stgres)) { - $this->terminateWithError('Stg ' . $lv->studiengang_kz . ' nof found.'); + $this->terminateWithError('Stg ' . $lv->studiengang_kz . ' not found.'); } $stg = (getData($stgres))[0]; $kurzbz = strtoupper($stg->typ . $stg->kurzbz); @@ -284,24 +304,6 @@ class LvMenu extends FHCAPI_Controller } - - private function fhc_menu_digitale_anwesenheiten(&$menu, $angemeldet, $studiengang_kz, $semester, $lvid, $angezeigtes_stsem){ - - // DIGITALE ANWESENHEITEN - if (defined('CIS_LEHRVERANSTALTUNG_ANWESENHEIT_ANZEIGEN') && CIS_LEHRVERANSTALTUNG_ANWESENHEIT_ANZEIGEN && $angemeldet) { - - $menu[] = array - ( - 'id' => 'core_menu_digitale_anwesenheitslisten', - 'position' => '50', - 'name' => $this->p->t('lehre', 'digiAnw'), - 'c4_icon' => base_url('skin/images/button_kreuzerltool.png'), - 'c4_link' => base_url("index.ci.php/extensions/FHC-Core-Anwesenheiten/?stg_kz=$studiengang_kz&sem=$semester&lvid=$lvid&sem_kurzbz=$angezeigtes_stsem&nav=false"), - 'c4_linkList' => [] - ); - } - } - private function fhc_menu_lvinfo(&$menu, $lvid, $studiengang_kz, $lektor_der_lv, $is_lector, $lehrfach_oe_kurzbz_arr){ // LVINFO diff --git a/application/controllers/api/frontend/v1/Phrasen.php b/application/controllers/api/frontend/v1/Phrasen.php index 3509e6630..7cc652c71 100644 --- a/application/controllers/api/frontend/v1/Phrasen.php +++ b/application/controllers/api/frontend/v1/Phrasen.php @@ -73,11 +73,22 @@ class Phrasen extends FHCAPI_Controller // gets all languages that are set as active in the database public function getAllLanguages() { - $langs = getDBActiveLanguages(); + $this->load->model('system/Sprache_model', 'SprachenModel'); + + // Add order clause by index and select the sprache,bezeichnung and index column + $this->SprachenModel->addOrder('index'); + $this->SprachenModel->addSelect('sprache, bezeichnung, index'); + + // Retrieves from public.tbl_sprache + $langs = $this->SprachenModel->loadWhere(array('content' => true)); $langs = $this->getDataOrTerminateWithError($langs); $langs = array_map(function($lang){ - return $lang->sprache; + $data = new stdClass(); + $data->sprache = $lang->sprache; + $data->bezeichnung = $lang->bezeichnung[($lang->index-1)]; + return $data; }, $langs); + $this->terminateWithSuccess($langs); } diff --git a/application/controllers/api/frontend/v1/Profil.php b/application/controllers/api/frontend/v1/Profil.php index 576a2a8ed..c52d8bae5 100644 --- a/application/controllers/api/frontend/v1/Profil.php +++ b/application/controllers/api/frontend/v1/Profil.php @@ -499,7 +499,7 @@ class Profil extends FHCAPI_Controller /** @param integer $geburtsInfo */ if ($geburtsInfo) { array_push($selectClause, "gebort"); - array_push($selectClause, "gebdatum"); + array_push($selectClause, "TO_CHAR(gebdatum, 'DD.MM.YYYY') as gebdatum"); } $this->BenutzerModel->addSelect($selectClause); $this->BenutzerModel->addJoin("tbl_person", "person_id"); @@ -567,7 +567,7 @@ class Profil extends FHCAPI_Controller */ private function getStudentInfo($uid) { - $this->StudentModel->addSelect(['tbl_studiengang.bezeichnung as studiengang', 'tbl_student.semester', 'tbl_student.verband', 'tbl_student.gruppe', 'tbl_student.matrikelnr as personenkennzeichen']); + $this->StudentModel->addSelect(['tbl_studiengang.bezeichnung as studiengang', 'tbl_studiengang.studiengang_kz as studiengang_kz', 'tbl_student.semester', 'tbl_student.verband', 'tbl_student.gruppe', 'tbl_student.matrikelnr as personenkennzeichen']); $this->StudentModel->addJoin('tbl_studiengang', "tbl_studiengang.studiengang_kz=tbl_student.studiengang_kz"); $student_res = $this->StudentModel->load([$uid]); diff --git a/application/controllers/api/frontend/v1/Studgang.php b/application/controllers/api/frontend/v1/Studgang.php new file mode 100644 index 000000000..82aebb666 --- /dev/null +++ b/application/controllers/api/frontend/v1/Studgang.php @@ -0,0 +1,65 @@ +. + */ + +if (! defined('BASEPATH')) exit('No direct script access allowed'); +class Studgang extends FHCAPI_Controller +{ + + /** + * Object initialization + */ + public function __construct() + { + parent::__construct([ + 'getStudiengangInfo'=> self::PERM_LOGGED, + + ]); + + $this->load->model('organisation/Studiengang_model', 'StudiengangModel'); + $this->load->model('ressource/mitarbeiter_model', 'MitarbeiterModel'); + + // Loads phrases system + $this->loadPhrases([ + 'global' + ]); + + } + + //------------------------------------------------------------------------------------------------------------------ + // Public methods + + public function getStudiengangInfo(){ + $isMitarbeiter = $this->MitarbeiterModel->isMitarbeiter(getAuthUID()); + $isMitarbeiter = $this->getDataOrTerminateWithError($isMitarbeiter); + if($isMitarbeiter) { + $this->terminateWithSuccess(null); + } + + // fetches the Studiengang Information which is used next to the news + $studiengangInfo = $this->StudiengangModel->getStudiengangInfoForNews(); + $studiengangInfo= $this->getDataOrTerminateWithError($studiengangInfo); + $this->terminateWithSuccess($studiengangInfo); + } + + //------------------------------------------------------------------------------------------------------------------ + // Private methods + + + +} + diff --git a/application/controllers/api/frontend/v1/Stundenplan.php b/application/controllers/api/frontend/v1/Stundenplan.php index c14ea4315..2ec02fea9 100644 --- a/application/controllers/api/frontend/v1/Stundenplan.php +++ b/application/controllers/api/frontend/v1/Stundenplan.php @@ -33,6 +33,7 @@ class Stundenplan extends FHCAPI_Controller 'Reservierungen' => self::PERM_LOGGED, 'getStundenplan' => self::PERM_LOGGED, 'getLehreinheitStudiensemester' => self::PERM_LOGGED, + 'studiensemesterDateInterval' => self::PERM_LOGGED, ]); $this->load->library('LogLib'); @@ -56,6 +57,15 @@ class Stundenplan extends FHCAPI_Controller //------------------------------------------------------------------------------------------------------------------ // Public methods + //TODO: delete this function if we don't use the old calendar export endpoints anymore + public function studiensemesterDateInterval($date){ + $this->load->model('organisation/Studiensemester_model','StudiensemesterModel'); + $studiensemester =$this->StudiensemesterModel->getByDate(date_format(date_create($date),'Y-m-d')); + $studiensemester =current($this->getDataOrTerminateWithError($studiensemester)); + $this->terminateWithSuccess($studiensemester); + } + + /** * fetches Stunden layout from database * @access public @@ -107,7 +117,7 @@ class Stundenplan extends FHCAPI_Controller * @access public * */ - //TODO: getStundenplan fuer Mitarbeiter anpassen + public function getStundenplan(){ $this->load->model('ressource/Mitarbeiter_model','MitarbeiterModel'); @@ -126,42 +136,63 @@ class Stundenplan extends FHCAPI_Controller // storing the get parameter in local variables $start_date = $this->input->get('start_date', TRUE); $end_date = $this->input->get('end_date', TRUE); + $lv_id = $this->input->get('lv_id', TRUE); $student_uid = getAuthUID(); if(is_null($student_uid)) { $this->terminateWithError("No UID"); } + + $semester_range = $this->studienSemesterErmitteln($start_date,$end_date); + $this->sortStudienSemester($semester_range); + $this->applyLoadUeberSemesterHaelfte($semester_range); + + if($lv_id) { // fetch Stundenplan for lva, irrelevant of who is requesting it (for now) + $stundenplan_data = $this->StundenplanModel->getStundenplanLVA($start_date, $end_date, $lv_id); + $stundenplan_data = $this->getDataOrTerminateWithError($stundenplan_data) ?? []; + $this->expand_object_information($stundenplan_data); + + // query lv itself in case its Stundenplan is being queried and it has no entries + $this->load->model('education/Lehrveranstaltung_model','LehrveranstaltungModel'); + $lv = getData($this->LehrveranstaltungModel->load($lv_id))[0]; + $this->addMeta('lv', $lv); + $this->terminateWithSuccess($stundenplan_data); + + } + $is_mitarbeiter = getData($this->MitarbeiterModel->isMitarbeiter($student_uid)); if($is_mitarbeiter) { - $this->terminateWithError("Not possible to look at the Student Calendar as a Mitarbeiter"); + + $stundenplan_data = $this->StundenplanModel->getStundenplanMitarbeiter($start_date, $end_date, $student_uid); + $stundenplan_data = $this->getDataOrTerminateWithError($stundenplan_data) ?? []; + $this->expand_object_information($stundenplan_data); + $this->terminateWithSuccess($stundenplan_data); + } else { + // getting the gruppen_kurzbz of the student in the different studiensemester + $benutzer_gruppen = $this->fetchBenutzerGruppenFromStudiensemester($semester_range); + + // getting the student_lehrverbaende of the student in the different studiensemester + $student_lehrverband = $this->fetchStudentlehrverbandFromStudiensemester($semester_range); + + $stundenplan_query = $this->StundenplanModel->getStundenplanQuery($start_date, $end_date, $semester_range, $benutzer_gruppen, $student_lehrverband); + if(!$stundenplan_query) + { + $this->terminateWithSuccess([]); + } + $stundenplan_data = $this->StundenplanModel->stundenplanGruppierung($stundenplan_query); + $stundenplan_data = $this->getDataOrTerminateWithError($stundenplan_data) ?? []; + + $this->expand_object_information($stundenplan_data); + + $this->returnObj['$stundenplan_query'] = $stundenplan_query; + $this->returnObj['$student_lehrverband'] = $student_lehrverband; + $this->returnObj['$benutzer_gruppen'] = $benutzer_gruppen; + $this->terminateWithSuccess($stundenplan_data); } - $semester_range = $this->studienSemesterErmitteln($start_date,$end_date); - - $this->sortStudienSemester($semester_range); - - $this->applyLoadUeberSemesterHaelfte($semester_range); - - // getting the gruppen_kurzbz of the student in the different studiensemester - $benutzer_gruppen = $this->fetchBenutzerGruppenFromStudiensemester($semester_range); - - // getting the student_lehrverbaende of the student in the different studiensemester - $student_lehrverband = $this->fetchStudentlehrverbandFromStudiensemester($semester_range); - - $stundenplan_query = $this->StundenplanModel->getStundenplanQuery($start_date, $end_date, $semester_range, $benutzer_gruppen, $student_lehrverband); - if(!$stundenplan_query) - { - $this->terminateWithSuccess([]); - } - $stundenplan_data = $this->StundenplanModel->stundenplanGruppierung($stundenplan_query); - $stundenplan_data = $this->getDataOrTerminateWithError($stundenplan_data) ?? []; - - $this->expand_object_information($stundenplan_data); - - $this->terminateWithSuccess($stundenplan_data); } // gets the reservierungen of a room if the ort_kurzbz parameter is supplied otherwise gets the reservierungen of the stundenplan of a student @@ -174,19 +205,25 @@ class Stundenplan extends FHCAPI_Controller $this->form_validation->set_rules('end_date', "EndDate", "required"); if($this->form_validation->run() == FALSE) $this->terminateWithValidationErrors($this->form_validation->error_array()); - // storing the get parameter in local variables + $this->load->model('ressource/Mitarbeiter_model','MitarbeiterModel'); + + // storing the get parameter in local variables $start_date = $this->input->get('start_date', TRUE); $end_date = $this->input->get('end_date', TRUE); - // querying the reservierungen - $reservierungen = $this->ReservierungModel->getReservierungen($start_date, $end_date, $ort_kurzbz); - - $reservierungen = $this->getDataOrTerminateWithError($reservierungen) ?? []; - + $is_mitarbeiter = getData($this->MitarbeiterModel->isMitarbeiter(getAuthUID())); + if($is_mitarbeiter) + { + $reservierungen = $this->ReservierungModel->getReservierungenMitarbeiter($start_date, $end_date, $ort_kurzbz); + } else { + // querying the reservierungen + $reservierungen = $this->ReservierungModel->getReservierungen($start_date, $end_date, $ort_kurzbz); + } + + $reservierungen = $this->getDataOrTerminateWithError($reservierungen) ?? []; $this->expand_object_information($reservierungen); - $this->terminateWithSuccess($reservierungen); - + } public function getLehreinheitStudiensemester($lehreinheit_id){ @@ -246,6 +283,23 @@ class Stundenplan extends FHCAPI_Controller $gruppe_obj_array[] = $lv_gruppe_object; } + + if($item->ort_kurzbz) { + + $ort_content_object = $this->StundenplanModel->execReadOnlyQuery(" + SELECT content_id + FROM public.tbl_ort + WHERE ort_kurzbz = ?", [$item->ort_kurzbz]); + if (isError($ort_content_object)) { + $this->show_error(getError($ort_content_object)); + } + $ort_content_object = getData($ort_content_object)[0]; + if($ort_content_object) { + $item->ort_content_id = $ort_content_object->content_id; + } + + + } $item->gruppe = $gruppe_obj_array; $item->lektor = $lektor_obj_array; @@ -536,7 +590,7 @@ class Stundenplan extends FHCAPI_Controller private function studienSemesterErmitteln($start_date,$end_date){ // gets all studiensemester from the student from start_date to end_date - $semester_range = $this->StudiensemesterModel->getByDate($start_date,$end_date); + $semester_range = $this->StudiensemesterModel->getByDateRange($start_date,$end_date); $semester_range = array_map( function($sem) { diff --git a/application/controllers/api/frontend/v1/betriebsmittel/BetriebsmittelP.php b/application/controllers/api/frontend/v1/betriebsmittel/BetriebsmittelP.php index 8e44b2326..8e9d931f2 100644 --- a/application/controllers/api/frontend/v1/betriebsmittel/BetriebsmittelP.php +++ b/application/controllers/api/frontend/v1/betriebsmittel/BetriebsmittelP.php @@ -342,7 +342,7 @@ class BetriebsmittelP extends FHCAPI_Controller $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id' => 'Betriebsmittelperson_id']), self::ERROR_TYPE_GENERAL); } - $this->terminateWithSuccess(current(getData($result))); + return $this->terminateWithSuccess(current(getData($result))); } public function deleteBetriebsmittel($betriebsmittelperson_id) @@ -358,7 +358,7 @@ class BetriebsmittelP extends FHCAPI_Controller if (!hasData($result)) { return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id' => 'Betriebsmittelperson_id']), self::ERROR_TYPE_GENERAL); } - return $this->outputJsonSuccess(current(getData($result))); + $this->terminateWithSuccess(current(getData($result))); } public function getTypenBetriebsmittel() diff --git a/application/controllers/api/frontend/v1/organisation/StudiengangEP.php b/application/controllers/api/frontend/v1/organisation/StudiengangEP.php new file mode 100644 index 000000000..463243f57 --- /dev/null +++ b/application/controllers/api/frontend/v1/organisation/StudiengangEP.php @@ -0,0 +1,57 @@ + self::PERM_LOGGED + ) + ); + // Load model StudiengangModel + $this->load->model('organisation/studiengang_model', 'StudiengangModel'); + } + + /** + * @return void + */ + public function getStudiengangByKz() + { + $studiengang_kz = intval($this->input->get('studiengang_kz')); + + $this->StudiengangModel->addSelect('studiengang_kz, kurzbz, kurzbzlang, ' + . 'typ, bezeichnung, english, aktiv, orgform_kurzbz, sprache, ' + . 'oe_kurzbz'); + $result = $this->StudiengangModel->load($studiengang_kz); + + if (isError($result)) + { + $this->terminateWithError(getError($result), self::ERROR_TYPE_DB); + } + + $stg = null; + if(hasData($result)) + { + $stg = (getData($result))[0]; + } + $this->terminateWithSuccess($stg); + } +} diff --git a/application/controllers/api/frontend/v1/stv/Abschlusspruefung.php b/application/controllers/api/frontend/v1/stv/Abschlusspruefung.php new file mode 100644 index 000000000..daaf043b5 --- /dev/null +++ b/application/controllers/api/frontend/v1/stv/Abschlusspruefung.php @@ -0,0 +1,420 @@ + ['admin:r', 'assistenz:r'], + 'loadAbschlusspruefung' => ['admin:r', 'assistenz:r'], + 'insertAbschlusspruefung' => ['admin:rw', 'assistenz:rw'], + 'updateAbschlusspruefung' => ['admin:rw', 'assistenz:rw'], + 'deleteAbschlusspruefung' => ['admin:rw', 'assistenz:rw'], + 'getTypenAbschlusspruefung' => ['admin:rw', 'assistenz:rw'], + 'getNoten' => ['admin:rw', 'assistenz:rw'], + 'getTypenAntritte' => ['admin:rw', 'assistenz:rw'], + 'getBeurteilungen' => ['admin:rw', 'assistenz:rw'], + 'getAkadGrade' => ['admin:rw', 'assistenz:rw'], + 'getMitarbeiter' => ['admin:rw', 'assistenz:rw'], + 'getPruefer' => ['admin:rw', 'assistenz:rw'], + 'getTypStudiengang' => ['admin:rw', 'assistenz:rw'], + 'checkForExistingExams' => ['admin:rw', 'assistenz:rw'], + ]); + + // Load Libraries + $this->load->library('VariableLib', ['uid' => getAuthUID()]); + $this->load->library('form_validation'); + + // Load language phrases + $this->loadPhrases([ + 'ui', + 'person', + 'abschlusspruefung' + ]); + + // Load models + $this->load->model('education/Abschlusspruefung_model', 'AbschlusspruefungModel'); + } + + public function getAbschlusspruefung($student_uid) + { + $result = $this->AbschlusspruefungModel->getAbschlusspruefungForPrestudent($student_uid); + + if (isError($result)) { + $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); + } + + $this->terminateWithSuccess((getData($result) ?: [])); + } + + public function loadAbschlusspruefung() + { + $abschlusspruefung_id = $this->input->post('id'); + + $this->AbschlusspruefungModel->addSelect('lehre.tbl_abschlusspruefung.*'); + $this->AbschlusspruefungModel->addSelect(" + CASE + WHEN pruefer1 IS NOT NULL + THEN CONCAT(p1.nachname, ' ', p1.vorname, COALESCE(' ' || p1.titelpre, '')) + ELSE NULL + END AS p1 + "); + $this->AbschlusspruefungModel->addSelect(" + CASE + WHEN pruefer2 IS NOT NULL + THEN CONCAT(p2.nachname, ' ', p2.vorname, COALESCE(' ' || p2.titelpre, '')) + ELSE NULL + END AS p2 + "); + $this->AbschlusspruefungModel->addSelect(" + CASE + WHEN pruefer3 IS NOT NULL + THEN CONCAT(p3.nachname, ' ', p3.vorname, COALESCE(' ' || p3.titelpre, '')) + ELSE NULL + END AS p3 + "); + $this->AbschlusspruefungModel->addSelect(" + CASE + WHEN vorsitz IS NOT NULL + THEN CONCAT(pv.nachname, ' ', pv.vorname, COALESCE(' ' || pv.titelpre, ''), ' (', ben.uid , ')' ) + ELSE NULL + END AS pv + "); + $this->AbschlusspruefungModel->addJoin('public.tbl_benutzer ben', 'ON (ben.uid = lehre.tbl_abschlusspruefung.vorsitz)', 'LEFT'); + $this->AbschlusspruefungModel->addJoin('public.tbl_person pv', 'ON (pv.person_id = ben.person_id)', 'LEFT'); + $this->AbschlusspruefungModel->addJoin('public.tbl_person p1', 'ON (p1.person_id = lehre.tbl_abschlusspruefung.pruefer1)', 'LEFT'); + $this->AbschlusspruefungModel->addJoin('public.tbl_person p2', 'ON (p2.person_id = lehre.tbl_abschlusspruefung.pruefer2)', 'LEFT'); + $this->AbschlusspruefungModel->addJoin('public.tbl_person p3', 'ON (p3.person_id = lehre.tbl_abschlusspruefung.pruefer3)', 'LEFT'); + $result = $this->AbschlusspruefungModel->loadWhere( + array('abschlusspruefung_id' => $abschlusspruefung_id) + ); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess(current($data)); + } + + public function getTypenAbschlusspruefung() + { + $this->load->model('education/Pruefungstyp_model', 'PruefungstypModel'); + + $result = $this->PruefungstypModel->loadWhere( + array('abschluss' => true) + ); + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + + public function getTypenAntritte() + { + $this->load->model('education/Pruefungsantritt_model', 'PruefungsantrittModel'); + + $result = $this->PruefungsantrittModel->load(); + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + + public function getBeurteilungen() + { + $this->load->model('education/Abschlussbeurteilung_model', 'AbschlussbeurteilungModel'); + + $result = $this->AbschlussbeurteilungModel->load(); + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + + public function getAkadGrade() + { + $studiengang_kz= $this->input->post('studiengang_kz'); + + + $this->load->model('education/Akadgrad_model', 'AkadgradModel'); + + $result = $this->AkadgradModel->loadWhere( + array('studiengang_kz' => $studiengang_kz) + ); + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + + public function getTypStudiengang() + { + $studiengang_kz= $this->input->post('studiengang_kz'); + +/* if (!$studiengang_kzs || !is_array($studiengang_kzs)) { + $this->load->library('form_validation'); + + $this->form_validation->set_rules('studiengang_kzs', '', 'required|is_null', [ + 'is_null' => $this->p->t('ui', 'error_fieldMustBeArray') + ]); + + if (!$this->form_validation->run()) + $this->terminateWithValidationErrors($this->form_validation->error_array()); + }*/ + + + $this->load->model('organisation/Studiengang_model', 'StudiengangModel'); + + $result = $this->StudiengangModel->loadWhere( + array('studiengang_kz' => $studiengang_kz) + ); + $data = $this->getDataOrTerminateWithError($result); + + $typStudiengang = current($data)->typ; + + $this->terminateWithSuccess($typStudiengang); + } + + public function getMitarbeiter($searchString) + { + $this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel'); + + $result = $this->MitarbeiterModel->searchMitarbeiter($searchString, 'mitAkadGrad'); + + if (isError($result)) { + $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); + } + $this->terminateWithSuccess($result ?: []); + } + + public function getPruefer($searchString) + { + $this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel'); + + $result = $this->MitarbeiterModel->searchMitarbeiter($searchString, 'ohneMaUid'); + + if (isError($result)) { + $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); + } + + $this->terminateWithSuccess($result ?: []); + } + + public function getNoten() + { + $this->load->model('education/Note_model', 'NoteModel'); + + $this->NoteModel->addOrder('note', 'ASC'); + $result = $this->NoteModel->load(); + + if (isError($result)) { + $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); + } + return $this->terminateWithSuccess(getData($result) ?: []); + } + + public function insertAbschlusspruefung() + { + $this->load->library('form_validation'); + + $student_uid = $this->input->post('uid'); + + if(!$student_uid) + { + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Student UID']), self::ERROR_TYPE_GENERAL); + } + + $formData = $this->input->post('formData'); + + $_POST['pruefungstyp_kurzbz'] = $formData['pruefungstyp_kurzbz']; + $_POST['akadgrad_id']= $formData['akadgrad_id']; + $_POST['vorsitz'] = isset($formData['vorsitz']['mitarbeiter_uid']) ? $formData['vorsitz']['mitarbeiter_uid'] : $formData['vorsitz']; + $_POST['pruefer1'] = isset($formData['pruefer1']['person_id']) ? $formData['pruefer1']['person_id'] : $formData['pruefer1']; + $_POST['pruefer2'] = isset($formData['pruefer2']['person_id']) ? $formData['pruefer2']['person_id'] : $formData['pruefer2']; + $_POST['pruefer3'] = isset($formData['pruefer3']['person_id']) ? $formData['pruefer3']['person_id'] : $formData['pruefer3']; + $_POST['pruefungsantritt_kurzbz'] = $formData['pruefungsantritt_kurzbz']; + $_POST['abschlussbeurteilung_kurzbz'] = $formData['abschlussbeurteilung_kurzbz']; + $_POST['datum']= $formData['datum']; + $_POST['sponsion']= $formData['sponsion']; + $_POST['anmerkung'] = $formData['anmerkung']; + $_POST['protokoll']= $formData['protokoll']; + $_POST['note'] = $formData['note']; + + $this->form_validation->set_rules('pruefungstyp_kurzbz', 'Typ', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Typ']) + ]); + + $this->form_validation->set_rules('akadgrad_id', 'AkadGrad', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'AkadGrad']) + ]); + + $this->form_validation->set_rules('datum', 'Datum', 'is_valid_date', [ + 'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'Datum']) + ]); + + $this->form_validation->set_rules('sponsion', 'Sponsion', 'is_valid_date', [ + 'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'Sponsion']) + ]); + + if ($this->form_validation->run() == false) + { + $this->terminateWithValidationErrors($this->form_validation->error_array()); + } + + $result = $this->AbschlusspruefungModel->insert([ + 'student_uid' => $student_uid, + 'pruefungstyp_kurzbz' => $this->input->post('pruefungstyp_kurzbz'), + 'akadgrad_id' => $this->input->post('akadgrad_id'), + 'vorsitz' => $this->input->post('vorsitz'), + 'pruefungsantritt_kurzbz' => $this->input->post('pruefungsantritt_kurzbz'), + 'abschlussbeurteilung_kurzbz' => $this->input->post('abschlussbeurteilung_kurzbz'), + 'datum' => $this->input->post('datum'), //TODO(Manu) check if minute format like FAS + 'sponsion' => $this->input->post('sponsion'), + 'pruefer1' => $this->input->post('pruefer1'), + 'pruefer2' => $this->input->post('pruefer2'), + 'pruefer3' => $this->input->post('pruefer3'), + 'protokoll' => $this->input->post('protokoll'), + 'note' => $this->input->post('note'), + 'anmerkung' => $this->input->post('anmerkung'), + 'insertamum' => date('c'), + 'insertvon' => getAuthUID() + ]); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + + public function updateAbschlusspruefung() + { + $this->load->library('form_validation'); + + $abschlusspruefung_id = $this->input->post('id'); + + if(!$abschlusspruefung_id) + { + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Abschlussprüfung ID']), self::ERROR_TYPE_GENERAL); + } + + $formData = $this->input->post('formData'); + $_POST['student_uid'] = $formData['student_uid']; + $_POST['pruefungstyp_kurzbz'] = $formData['pruefungstyp_kurzbz']; + $_POST['akadgrad_id']= $formData['akadgrad_id']; + $_POST['vorsitz'] = isset($formData['vorsitz']['mitarbeiter_uid']) ? $formData['vorsitz']['mitarbeiter_uid'] : $formData['vorsitz']; + $_POST['pruefer1'] = isset($formData['pruefer1']['person_id']) ? $formData['pruefer1']['person_id'] : $formData['pruefer1']; + $_POST['pruefer2'] = isset($formData['pruefer2']['person_id']) ? $formData['pruefer2']['person_id'] : $formData['pruefer2']; + $_POST['pruefer3'] = isset($formData['pruefer3']['person_id']) ? $formData['pruefer3']['person_id'] : $formData['pruefer3']; + $_POST['pruefungsantritt_kurzbz'] = $formData['pruefungsantritt_kurzbz']; + $_POST['abschlussbeurteilung_kurzbz'] = $formData['abschlussbeurteilung_kurzbz']; + $_POST['datum']= $formData['datum']; + $_POST['sponsion']= $formData['sponsion']; + $_POST['anmerkung'] = $formData['anmerkung']; + $_POST['protokoll']= $formData['protokoll']; + $_POST['note'] = $formData['note']; + + $this->form_validation->set_rules('pruefungstyp_kurzbz', 'Typ', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Typ']) + ]); + + $this->form_validation->set_rules('akadgrad_id', 'AkadGrad', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'AkadGrad']) + ]); + + $this->form_validation->set_rules('datum', 'Datum', 'is_valid_date', [ + 'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'Datum']) + ]); + + $this->form_validation->set_rules('sponsion', 'Sponsion', 'is_valid_date', [ + 'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'Sponsion']) + ]); + + + if ($this->form_validation->run() == false) + { + $this->terminateWithValidationErrors($this->form_validation->error_array()); + } + + $result = $this->AbschlusspruefungModel->update( + [ + 'abschlusspruefung_id' => $abschlusspruefung_id + ], + [ + 'student_uid' => $this->input->post('student_uid'), + 'pruefungstyp_kurzbz' => $this->input->post('pruefungstyp_kurzbz'), + 'akadgrad_id' => $this->input->post('akadgrad_id'), + 'vorsitz' => $this->input->post('vorsitz'), + 'pruefungsantritt_kurzbz' => $this->input->post('pruefungsantritt_kurzbz'), + 'abschlussbeurteilung_kurzbz' => $this->input->post('abschlussbeurteilung_kurzbz'), + 'datum' => $this->input->post('datum'), + 'sponsion' => $this->input->post('sponsion'), + 'pruefer1' => $this->input->post('pruefer1'), + 'pruefer2' => $this->input->post('pruefer2'), + 'pruefer3' => $this->input->post('pruefer3'), + 'protokoll' => $this->input->post('protokoll'), + 'note' => $this->input->post('note'), + 'anmerkung' => $this->input->post('anmerkung'), + 'insertamum' => date('c'), + 'insertvon' => getAuthUID() + ] + ); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + + public function deleteAbschlusspruefung() + { + $abschlusspruefung_id = $this->input->post('id'); + + $result = $this->AbschlusspruefungModel->delete( + array('abschlusspruefung_id' => $abschlusspruefung_id) + ); + + if (isError($result)) + { + return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); + } + if (!hasData($result)) + { + $this->outputJson($result); + } + return $this->terminateWithSuccess(current(getData($result)) ? : null); + } + + public function checkForExistingExams() + { + $warning = false; + $output = []; + + $student_uids = $this->input->post('uids'); + + if (empty($student_uids)) { + throw new InvalidArgumentException("Keine UID(s) übergeben."); + } + + if( !is_array($student_uids) ) + { + $student_uids = array($student_uids); + } + + foreach ($student_uids as $uid) + { + $result = $this->AbschlusspruefungModel->loadWhere( + array('student_uid' => $uid) + ); + if (isError($result)) { + $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); + } + if (!hasData($result)) + { + $warning = true; + $output[] = $uid; + } + } + if($warning) + { + $uids = is_array($output) ? implode(", ", $output) : $output; + return $this->terminateWithError($this->p->t('abschlusspruefung', 'error_studentOhneFinalExam', ['id'=> $uids]), self::ERROR_TYPE_GENERAL); + } + $this->terminateWithSuccess('step3'); + } +} diff --git a/application/controllers/api/frontend/v1/stv/Address.php b/application/controllers/api/frontend/v1/stv/Address.php index 7685fcd04..324e306f3 100644 --- a/application/controllers/api/frontend/v1/stv/Address.php +++ b/application/controllers/api/frontend/v1/stv/Address.php @@ -45,7 +45,7 @@ class Address extends FHCAPI_Controller $this->terminateWithSuccess($data); } - public function getPlaces($plz) + public function getPlaces($plz = null) { $this->load->model('codex/Gemeinde_model', 'GemeindeModel'); @@ -53,7 +53,7 @@ class Address extends FHCAPI_Controller $this->form_validation->set_data(['address.plz' => $plz]); - $this->form_validation->set_rules('address.plz', 'PLZ', 'numeric|less_than[10000]'); + $this->form_validation->set_rules('address.plz', 'PLZ', 'required|numeric|less_than[10000]'); if (!$this->form_validation->run()) $this->terminateWithValidationErrors($this->form_validation->error_array()); diff --git a/application/controllers/api/frontend/v1/stv/Config.php b/application/controllers/api/frontend/v1/stv/Config.php index c28c49485..42de1b02f 100644 --- a/application/controllers/api/frontend/v1/stv/Config.php +++ b/application/controllers/api/frontend/v1/stv/Config.php @@ -44,16 +44,23 @@ class Config extends FHCAPI_Controller 'person', 'lehre', 'stv', - 'konto' + 'konto', + 'abschlusspruefung' ]); + + // Load Config + $this->load->config('stv'); } public function student() { $result = []; + $config = $this->config->item('tabs'); + $result['details'] = [ 'title' => $this->p->t('stv', 'tab_details'), - 'component' => './Stv/Studentenverwaltung/Details/Details.js' + 'component' => './Stv/Studentenverwaltung/Details/Details.js', + 'config' => $config['details'] ]; $result['notes'] = [ 'title' => $this->p->t('stv', 'tab_notes'), @@ -69,7 +76,8 @@ class Config extends FHCAPI_Controller ]; $result['prestudent'] = [ 'title' => $this->p->t('stv', 'tab_prestudent'), - 'component' => './Stv/Studentenverwaltung/Details/Prestudent.js' + 'component' => './Stv/Studentenverwaltung/Details/Prestudent.js', + 'config' => $config['prestudent'] ]; $result['status'] = [ 'title' => 'Status', @@ -91,12 +99,34 @@ class Config extends FHCAPI_Controller 'title' => $this->p->t('stv', 'tab_resources'), 'component' => './Stv/Studentenverwaltung/Details/Betriebsmittel.js' ]; - /* TODO(chris): Ausgeblendet für Testing $result['grades'] = [ 'title' => $this->p->t('stv', 'tab_grades'), - 'component' => './Stv/Studentenverwaltung/Details/Noten.js' + 'component' => './Stv/Studentenverwaltung/Details/Noten.js', + 'showOnlyWithUid' => true, + 'config' => [ + 'usePoints' => defined('CIS_GESAMTNOTE_PUNKTE') && CIS_GESAMTNOTE_PUNKTE, + 'edit' => 'both', // Possible values: both|header|inline + 'delete' => 'both', // Possible values: both|header|inline + 'documents' => 'both', // Possible values: both|header|inline + 'documentslist' => $this->gradesDocumentsList() + ] + ]; + + $result['exam'] = [ + 'title' => $this->p->t('stv', 'tab_exam'), + 'component' => './Stv/Studentenverwaltung/Details/Pruefung.js' + ]; + + $result['finalexam'] = [ + 'title' => $this->p->t('stv', 'tab_finalexam'), + 'component' => './Stv/Studentenverwaltung/Details/Abschlusspruefung.js', + 'config' => $config['finalexam'] + ]; + + $result['mobility'] = [ + 'title' => $this->p->t('stv', 'tab_mobility'), + 'component' => './Stv/Studentenverwaltung/Details/Mobility.js' ]; - */ Events::trigger('stv_conf_student', function & () use (&$result) { return $result; @@ -108,6 +138,7 @@ class Config extends FHCAPI_Controller public function students() { $result = []; + $config = $this->config->item('tabs'); $result['banking'] = [ 'title' => $this->p->t('stv', 'tab_banking'), 'component' => './Stv/Studentenverwaltung/Details/Konto.js', @@ -131,6 +162,11 @@ class Config extends FHCAPI_Controller 'changeStatusToAbsolvent' => $this->permissionlib->isBerechtigt('admin') ] ]; + $result['finalexam'] = [ + 'title' => $this->p->t('stv', 'tab_finalexam'), + 'component' => './Stv/Studentenverwaltung/Details/Abschlusspruefung.js', + 'config' => $config['finalexam'] + ]; Events::trigger('stv_conf_students', function & () use (&$result) { return $result; @@ -230,4 +266,186 @@ class Config extends FHCAPI_Controller ] ] + $this->kontoColumns(); } + + /** + * Helper function to generate the default documentslist config for the + * grades tab. + * + * The resulting array consists of elements which are associative arrays + * that can have the following entries: + * title (required) on the first level this can be HTML code. + * permissioncheck (optional) an URL to an FHCAPI endpoint which returns + * true or false. + * link (optional) an URL that will be called if "action" and + * "children" are not defined. + * action (optional) an associative array that describes an + * POST action that will be called if "children" is + * not defined. + * It can have the following entries: + * - url (required) an URL to an FHCAPI endpoint. + * - post (optional) an associative array with the POST data to + * be sent. + * - response (optional) a string that will be displayed on success. + * children (optional) an array of child elements + * + * All strings that start with { and end with } in the URLs and the + * actions post parameter will be replaced with the corresponding + * attribute of the current dataset (e.G: {uid} will be replaced with the + * uid of the current dataset) + * + * @return array + */ + protected function gradesDocumentsList() + { + $permissioncheck = site_url("api/frontend/v1/documents/permissionAlternativeFormat/{studiengang_kz}"); + + $title_ger = $this->p->t("global", "deutsch"); + $title_eng = $this->p->t("global", "englisch"); + $title_ff = $this->p->t("stv", "document_certificate"); + $title_lv = $this->p->t("stv", "document_coursecertificate"); + + $link_ff = "documents/export/" . + "zertifikat.rdf.php/" . + "Zertifikat" . + "?stg_kz={studiengang_kz_lv}" . + "&uid={uid}" . + "&ss={studiensemester_kurzbz}" . + "&lvid={lehrveranstaltung_id}"; + $link_lv_ger = "documents/export/" . + "lehrveranstaltungszeugnis.rdf.php/" . + "LVZeugnis" . + "?stg_kz={studiengang_kz}" . + "&uid={uid}" . + "&ss={studiensemester_kurzbz}" . + "&lvid={lehrveranstaltung_id}"; + $link_lv_eng = "documents/export/" . + "lehrveranstaltungszeugnis.rdf.php/" . + "LVZeugnisEng" . + "?stg_kz={studiengang_kz}" . + "&uid={uid}" . + "&ss={studiensemester_kurzbz}" . + "&lvid={lehrveranstaltung_id}"; + + $archive_url = "api/frontend/v1/documents/archiveSigned"; + $archive_response = $this->p->t("stv", "document_signed_and_archived"); + $archive_post_ff = [ + "xml" => "zertifikat.rdf.php", + "xsl" => "Zertifikat", + "stg_kz" => "{studiengang_kz_lv}", + "uid" => "{uid}", + "ss" => "{studiensemester_kurzbz}", + "lvid" => "{lehrveranstaltung_id}" + ]; + $archive_post_lv_ger = [ + "xml" => "lehrveranstaltungszeugnis.rdf.php", + "xsl" => "LVZeugnis", + "stg_kz" => "{studiengang_kz}", + "uid" => "{uid}", + "ss" => "{studiensemester_kurzbz}", + "lvid" => "{lehrveranstaltung_id}" + ]; + $archive_post_lv_eng = [ + "xml" => "lehrveranstaltungszeugnis.rdf.php", + "xsl" => "LVZeugnisEng", + "stg_kz" => "{studiengang_kz}", + "uid" => "{uid}", + "ss" => "{studiensemester_kurzbz}", + "lvid" => "{lehrveranstaltung_id}" + ]; + + $list = [ + [ + 'title' => '', + 'children' => [ + [ + 'title' => $title_ff, + 'link' => site_url($link_ff) + ], + [ + 'title' => $title_lv, + 'children' => [ + [ + 'title' => $title_ger, + 'link' => site_url($link_lv_ger), + 'children' => [ + [ + 'title' => 'PDF', + 'permissioncheck' => $permissioncheck, + 'link' => site_url($link_lv_ger) + ], + [ + 'title' => 'DOC', + 'permissioncheck' => $permissioncheck, + 'link' => site_url($link_lv_ger . "&output=doc") + ], + [ + 'title' => 'ODT', + 'permissioncheck' => $permissioncheck, + 'link' => site_url($link_lv_ger . "&output=odt") + ] + ] + ], + [ + 'title' => $title_eng, + 'link' => site_url($link_lv_eng), + 'children' => [ + [ + 'title' => 'PDF', + 'permissioncheck' => $permissioncheck, + 'link' => site_url($link_lv_eng) + ], + [ + 'title' => 'DOC', + 'permissioncheck' => $permissioncheck, + 'link' => site_url($link_lv_eng . "&output=doc") + ], + [ + 'title' => 'ODT', + 'permissioncheck' => $permissioncheck, + 'link' => site_url($link_lv_eng . "&output=odt") + ] + ] + ] + ] + ] + ] + ], + [ + 'title' => '', + 'children' => [ + [ + 'title' => $title_ff, + 'action' => [ + 'url' => site_url($archive_url), + 'post' => $archive_post_ff, + 'response' => $archive_response + ] + ], + [ + 'title' => $title_lv, + 'children' => [ + [ + 'title' => $title_ger, + 'action' => [ + 'url' => site_url($archive_url), + 'post' => $archive_post_lv_ger, + 'response' => $archive_response + ] + ], + [ + 'title' => $title_eng, + 'action' => [ + 'url' => site_url($archive_url), + 'post' => $archive_post_lv_eng, + 'response' => $archive_response + ] + ] + ] + ] + ] + ] + ]; + + return $list; + } } diff --git a/application/controllers/api/frontend/v1/stv/Favorites.php b/application/controllers/api/frontend/v1/stv/Favorites.php index 8d7a6cd14..b8fe6f3d7 100644 --- a/application/controllers/api/frontend/v1/stv/Favorites.php +++ b/application/controllers/api/frontend/v1/stv/Favorites.php @@ -48,7 +48,7 @@ class Favorites extends FHCAPI_Controller if (!$data) $this->terminateWithSuccess(null); else - $this->terminateWithSuccess($data['stv_favorites']); + $this->terminateWithSuccess($data['stv_favorites'] ?? null); } public function set() diff --git a/application/controllers/api/frontend/v1/stv/Grades.php b/application/controllers/api/frontend/v1/stv/Grades.php new file mode 100644 index 000000000..61d797495 --- /dev/null +++ b/application/controllers/api/frontend/v1/stv/Grades.php @@ -0,0 +1,685 @@ +. + */ + +if (! defined('BASEPATH')) exit('No direct script access allowed'); + +/** + * This controller operates between (interface) the JS (GUI) and the back-end + * Provides data to the ajax get calls about grades + * This controller works with JSON calls on the HTTP GET or POST and the output is always JSON + */ +class Grades extends FHCAPI_Controller +{ + public function __construct() + { + parent::__construct([ + 'list' => 'student/noten:r', + 'getCertificate' => 'student/noten:r', + 'getTeacherProposal' => 'student/noten:r', + 'getRepeaterGrades' => 'student/noten:r', + 'updateCertificate' => ['admin:w', 'assistenz:w'], + 'deleteCertificate' => ['admin:w', 'assistenz:w'], + 'copyTeacherProposalToCertificate' => 'student/noten:w', + 'copyRepeaterGradeToCertificate' => 'student/noten:w', + 'getGradeFromPoints' => 'student/noten:r' + ]); + + // Load Libraries + $this->load->library('VariableLib', ['uid' => getAuthUID()]); + + // Load Phrases + $this->loadPhrases([ + 'stv', + 'person', + 'lehre' + ]); + } + + /** + * List all possible grades + * (Entries in lehre.tbl_note) + * + * @return void + */ + public function list() + { + $this->load->model('codex/Note_model', 'NoteModel'); + + $this->NoteModel->addOrder('note'); + + $result = $this->NoteModel->load(); + + $grades = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($grades); + } + + /** + * List grades for the certificate of a prestudent. + * (Entries in lehre.tbl_zeugnisnote) + * + * @param string $prestudent_id + * @param string|null $all (optional) If null only the current semesters grades will be loaded, otherwise all semesters grades will be loaded. + * + * @return void + */ + public function getCertificate($prestudent_id, $all = null) + { + $this->load->model('crm/Student_model', 'StudentModel'); + $this->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel'); + + $result = $this->StudentModel->loadWhere([ + 'prestudent_id' => $prestudent_id + ]); + + $student = $this->getDataOrTerminateWithError($result); + if (!$student) + $this->terminateWithSuccess([]); + + + $student_uid = current($student)->student_uid; + + $studiensemester_kurzbz = ($all === null) ? $this->variablelib->getVar('semester_aktuell') : null; + + + $result = $this->ZeugnisnoteModel->getZeugnisnoten($student_uid, $studiensemester_kurzbz); + + $grades = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($grades); + } + + /** + * List grades of a prestudent that teachers gave. + * (Entries in campus.tbl_lvgesamtnote) + * + * @param string $prestudent_id + * @param string|null $all (optional) If null only the current semesters grades will be loaded, otherwise all semesters grades will be loaded. + * + * @return void + */ + public function getTeacherProposal($prestudent_id, $all = null) + { + $this->load->model('crm/Student_model', 'StudentModel'); + $this->load->model('education/Lvgesamtnote_model', 'LvgesamtnoteModel'); + + $result = $this->StudentModel->loadWhere([ + 'prestudent_id' => $prestudent_id + ]); + + $student = $this->getDataOrTerminateWithError($result); + if (!$student) + $this->terminateWithSuccess([]); + + + $student_uid = current($student)->student_uid; + + $studiensemester_kurzbz = ($all === null) ? $this->variablelib->getVar('semester_aktuell') : null; + + + $result = $this->LvgesamtnoteModel->getLvGesamtNoten(null, $student_uid, $studiensemester_kurzbz); + + $grades = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($grades); + } + + /** + * List grades of a prestudent that an assistant marked as already done + * or as not allowed because of the repeating of a semester. + * + * @param string $prestudent_id + * @param string|null $all (optional) If null only the current semesters grades will be loaded, otherwise all semesters grades will be loaded. + * + * @return void + */ + public function getRepeaterGrades($prestudent_id, $all = null) + { + $this->load->library('AntragLib'); + + $studiensemester_kurzbz = ($all === null) ? $this->variablelib->getVar('semester_aktuell') : false; + + + $result = $this->antraglib->getLvsForPrestudent($prestudent_id, $studiensemester_kurzbz); + + $grades = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($grades); + } + + /** + * Update or Insert a grade for the certificate of a prestudent. + * (Entry in lehre.tbl_zeugnisnote) + * + * @return void + */ + public function updateCertificate() + { + $this->load->library('form_validation'); + + $this->form_validation->set_rules("lehrveranstaltung_id", $this->p->t('lehre', 'lehrveranstaltung'), "required|integer"); + $this->form_validation->set_rules("student_uid", $this->p->t('person', 'student'), "required"); + $this->form_validation->set_rules("studiensemester_kurzbz", $this->p->t('lehre', 'studiensemester'), "required"); + $this->form_validation->set_rules('note', $this->p->t('lehre', 'note'), 'required|numeric'); + + if (!$this->form_validation->run()) + $this->terminateWithValidationErrors($this->form_validation->error_array()); + + + $studiensemester_kurzbz = $this->input->post('studiensemester_kurzbz'); + $student_uid = $this->input->post('student_uid'); + $lehrveranstaltung_id = $this->input->post('lehrveranstaltung_id'); + $note = $this->input->post('note'); + $authUID = getAuthUID(); + $now = date('c'); + + // NOTE(chris): Stg Permissions + if (!$this->hasPermissionUpdate($lehrveranstaltung_id, $student_uid)) + return $this->_outputAuthError([$this->router->method => ['admin', 'assistenz']]); + + $this->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel'); + + $result = $this->ZeugnisnoteModel->load([ + 'studiensemester_kurzbz' => $studiensemester_kurzbz, + 'student_uid' => $student_uid, + 'lehrveranstaltung_id' => $lehrveranstaltung_id + ]); + $current = $this->getDataOrTerminateWithError($result); + + if ($current) { + $result = $this->ZeugnisnoteModel->update([ + 'studiensemester_kurzbz' => $studiensemester_kurzbz, + 'student_uid' => $student_uid, + 'lehrveranstaltung_id' => $lehrveranstaltung_id + ], [ + 'note' => $note, + 'benotungsdatum' => $now, + 'updateamum' => $now, + 'updatevon' => $authUID + ]); + } else { + $result = $this->ZeugnisnoteModel->insert([ + 'studiensemester_kurzbz' => $studiensemester_kurzbz, + 'student_uid' => $student_uid, + 'lehrveranstaltung_id' => $lehrveranstaltung_id, + 'note' => $note, + 'benotungsdatum' => $now, + 'insertamum' => $now, + 'insertvon' => $authUID + ]); + } + $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess(true); + } + + /** + * Delete a grade from the certificate of a prestudent. + * (Entry in lehre.tbl_zeugnisnote) + * + * @return void + */ + public function deleteCertificate() + { + $this->load->library('form_validation'); + + $this->form_validation->set_rules("lehrveranstaltung_id", $this->p->t('lehre', 'lehrveranstaltung'), "required|integer"); + $this->form_validation->set_rules("student_uid", $this->p->t('person', 'student'), "required"); + $this->form_validation->set_rules("studiensemester_kurzbz", $this->p->t('lehre', 'studiensemester'), "required"); + + if (!$this->form_validation->run()) + $this->terminateWithValidationErrors($this->form_validation->error_array()); + + + $studiensemester_kurzbz = $this->input->post('studiensemester_kurzbz'); + $student_uid = $this->input->post('student_uid'); + $lehrveranstaltung_id = $this->input->post('lehrveranstaltung_id'); + + // NOTE(chris): Stg Permissions + if (!$this->hasPermissionDelete($lehrveranstaltung_id, $student_uid)) + return $this->_outputAuthError([$this->router->method => ['admin', 'assistenz']]); + + $this->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel'); + + $result = $this->ZeugnisnoteModel->delete([ + 'studiensemester_kurzbz' => $studiensemester_kurzbz, + 'student_uid' => $student_uid, + 'lehrveranstaltung_id' => $lehrveranstaltung_id + ]); + $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess(true); + } + + /** + * Copy a grade that teachers gave to the certificate of a prestudent. + * (Entry in campus.tbl_lvgesamtnote to an entry in lehre.tbl_zeugnisnote) + * + * @return void + */ + public function copyTeacherProposalToCertificate() + { + $this->load->library('form_validation'); + + $this->form_validation->set_rules("lehrveranstaltung_id", $this->p->t('lehre', 'lehrveranstaltung'), "required|integer"); + $this->form_validation->set_rules("student_uid", $this->p->t('person', 'student'), "required"); + $this->form_validation->set_rules("studiensemester_kurzbz", $this->p->t('lehre', 'studiensemester'), "required"); + + if (!$this->form_validation->run()) + $this->terminateWithValidationErrors($this->form_validation->error_array()); + + $lehrveranstaltung_id = $this->input->post('lehrveranstaltung_id'); + $student_uid = $this->input->post('student_uid'); + $studiensemester_kurzbz = $this->input->post('studiensemester_kurzbz'); + $authUID = getAuthUID(); + + // NOTE(chris): Stg Permissions + if (!$this->hasPermissionCopy($lehrveranstaltung_id, $student_uid)) + return $this->_outputAuthError([$this->router->method => 'student/noten']); + + $this->load->model('education/Lvgesamtnote_model', 'LvgesamtnoteModel'); + + $result = $this->LvgesamtnoteModel->load([ + 'student_uid' => $student_uid, + 'studiensemester_kurzbz' => $studiensemester_kurzbz, + 'lehrveranstaltung_id' => $lehrveranstaltung_id + ]); + $teacherGrade = $this->getDataOrTerminateWithError($result); + + if (!$teacherGrade) + show_404(); + + $teacherGrade = current($teacherGrade); + + $data = [ + 'note' => $teacherGrade->note, + 'punkte' => $teacherGrade->punkte, + 'uebernahmedatum' => date('c'), + 'benotungsdatum' => $teacherGrade->benotungsdatum, + 'bemerkung' => $teacherGrade->bemerkung + ]; + + $this->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel'); + + $this->ZeugnisnoteModel->addJoin('lehre.tbl_note n', 'note'); + $result = $this->ZeugnisnoteModel->load([ + 'studiensemester_kurzbz' => $studiensemester_kurzbz, + 'student_uid' => $student_uid, + 'lehrveranstaltung_id' => $lehrveranstaltung_id + ]); + $certificateGrade = $this->getDataOrTerminateWithError($result); + + if ($certificateGrade) { + $certificateGrade = current($certificateGrade); + + if (!$certificateGrade->lkt_ueberschreibbar) + $this->terminateWithError($this->p->t("stv", "grades_error_overwrite")); + + // NOTE(chris): update + $data['updateamum'] = $data['uebernahmedatum']; + $data['updatevon'] = $authUID; + + $this->ZeugnisnoteModel->update([ + 'studiensemester_kurzbz' => $studiensemester_kurzbz, + 'student_uid' => $student_uid, + 'lehrveranstaltung_id' => $lehrveranstaltung_id + ], $data); + } else { + // NOTE(chris): insert + $data['insertamum'] = $data['uebernahmedatum']; + $data['insertvon'] = $authUID; + $data['lehrveranstaltung_id'] = $lehrveranstaltung_id; + $data['student_uid'] = $student_uid; + $data['studiensemester_kurzbz'] = $studiensemester_kurzbz; + + $this->ZeugnisnoteModel->insert($data); + + if (defined('FAS_PRUEFUNG_BEI_NOTENEINGABE_ANLEGEN') + && FAS_PRUEFUNG_BEI_NOTENEINGABE_ANLEGEN) { + $result = $this->addTestsForGrade( + $studiensemester_kurzbz, + $student_uid, + $lehrveranstaltung_id, + $teacherGrade->note, + $teacherGrade->punkte + ); + $this->getDataOrTerminateWithError($result); + } + } + + + $this->terminateWithSuccess(true); + } + + /** + * Copy a grade that was marked by an assistant as already done or not + * allowed because of the repeating of a semester to the certificate of a + * prestudent. + * + * @return void + */ + public function copyRepeaterGradeToCertificate() + { + $this->load->library('form_validation'); + + $this->form_validation->set_rules("studierendenantrag_lehrveranstaltung_id", "studierendenantrag_lehrveranstaltung_id", "required|integer"); + + if (!$this->form_validation->run()) + $this->terminateWithValidationErrors($this->form_validation->error_array()); + + $id = $this->input->post('studierendenantrag_lehrveranstaltung_id'); + $authUID = getAuthUID(); + + $this->load->model('education/Studierendenantraglehrveranstaltung_model', 'StudierendenantraglehrveranstaltungModel'); + + $this->StudierendenantraglehrveranstaltungModel->addSelect("tbl_studierendenantrag_lehrveranstaltung.*"); + $this->StudierendenantraglehrveranstaltungModel->addSelect("student_uid"); + $this->StudierendenantraglehrveranstaltungModel->addJoin("campus.tbl_studierendenantrag", "studierendenantrag_id"); + $this->StudierendenantraglehrveranstaltungModel->addJoin("public.tbl_student", "prestudent_id", "LEFT"); + + $result = $this->StudierendenantraglehrveranstaltungModel->load($id); + $repeaterGrade = $this->getDataOrTerminateWithError($result); + + if (!$repeaterGrade) + show_404(); + + $repeaterGrade = current($repeaterGrade); + + // NOTE(chris): Stg Permissions + if (!$this->hasPermissionCopy($repeaterGrade->lehrveranstaltung_id, $repeaterGrade->student_uid)) + return $this->_outputAuthError([$this->router->method => 'student/noten']); + + $data = [ + 'note' => $repeaterGrade->note, + 'uebernahmedatum' => date('c'), + 'benotungsdatum' => $repeaterGrade->insertamum, + 'bemerkung' => $repeaterGrade->anmerkung + ]; + + $this->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel'); + + $result = $this->ZeugnisnoteModel->load([ + $repeaterGrade->studiensemester_kurzbz, + $repeaterGrade->student_uid, + $repeaterGrade->lehrveranstaltung_id + ]); + $certificateGrade = $this->getDataOrTerminateWithError($result); + + if ($certificateGrade) { + // NOTE(chris): update + $data['updateamum'] = $data['uebernahmedatum']; + $data['updatevon'] = $authUID; + + $this->ZeugnisnoteModel->update([ + $repeaterGrade->studiensemester_kurzbz, + $repeaterGrade->student_uid, + $repeaterGrade->lehrveranstaltung_id + ], $data); + } else { + // NOTE(chris): insert + $data['insertamum'] = $data['uebernahmedatum']; + $data['insertvon'] = $authUID; + $data['lehrveranstaltung_id'] = $repeaterGrade->lehrveranstaltung_id; + $data['student_uid'] = $repeaterGrade->student_uid; + $data['studiensemester_kurzbz'] = $repeaterGrade->studiensemester_kurzbz; + + $this->ZeugnisnoteModel->insert($data); + } + + + $this->terminateWithSuccess(true); + } + + /** + * Loads the grade from the points using the gradingkey + * + * @return void + */ + public function getGradeFromPoints() + { + $this->load->library('form_validation'); + + $this->form_validation->set_rules("lehrveranstaltung_id", $this->p->t('lehre', 'lehrveranstaltung'), "required|integer"); + $this->form_validation->set_rules("points", $this->p->t("stv", "grades_points"), "required|numeric"); + + if (!$this->form_validation->run()) + $this->terminateWithValidationErrors($this->form_validation->error_array()); + + $this->load->model('education/Notenschluesselaufteilung_model', 'NotenschluesselaufteilungModel'); + + $studiensemester_kurzbz = $this->variablelib->getVar('semester_aktuell'); + + $result = $this->NotenschluesselaufteilungModel->getNote( + $this->input->post('points'), + $this->input->post('lehrveranstaltung_id'), + $studiensemester_kurzbz + ); + + $note = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($note); + } + + /** + * Helper function that adds tests for a student + * (Entries in lehre.tbl_pruefung) + * + * @param string $studiensemester_kurzbz + * @param string $student_uid + * @param integer $lehrveranstaltung_id + * @param integer $note + * @param numeric $punkte + * + * @return stdClass + */ + protected function addTestsForGrade($studiensemester_kurzbz, $student_uid, $lehrveranstaltung_id, $note, $punkte) + { + $this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel'); + + // Get Lehreinheit + $result = $this->LehrveranstaltungModel->getLeByStudent($student_uid, $studiensemester_kurzbz, $lehrveranstaltung_id); + + if (isError($result)) + return $result; + if (!hasData($result)) + return error($this->p->t("stv", "grades_error_lehreinheit_id")); + $le = current(getData($result)); + + // Prepare + $this->load->model('education/LePruefung_model', 'LePruefungModel'); + $data = [ + "student_uid" => $student_uid, + "lehreinheit_id" => $le->lehreinheit_id, + "datum" => date('Y-m-d'), + "pruefungstyp_kurzbz" => "Termin1", + "note" => $note + ]; + + if (defined('CIS_GESAMTNOTE_PUNKTE') && CIS_GESAMTNOTE_PUNKTE) + $data["punkte"] = $punkte; + + // Get Anwesenheit + $this->load->model('education/Anwesenheit_model', 'AnwesenheitModel'); + $result = $this->AnwesenheitModel->loadAnwesenheitStudiensemester($studiensemester_kurzbz, $student_uid, $lehrveranstaltung_id); + if (isError($result)) + return $result; + $anwesenheit = getData($result); + + if ($anwesenheit && (float)current($anwesenheit)->prozent < FAS_ANWESENHEIT_ROT) { + // Get Anwesenheitsbefreiung + $this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel'); + $result = $this->BenutzerfunktionModel->getBenutzerFunktionByUidInStdsem($student_uid, $studiensemester_kurzbz, 'awbefreit'); + + if (isError($result)) + return $result; + + $anwesenheitsbefreit = hasData($result); + + // Wenn nicht Anwesenheitsbefreit und Anwesenheit unter einem bestimmten Prozentsatz fällt dann wird ein Pruefungsantritt abgezogen + if (!$anwesenheitsbefreit) { + $data2 = $data; + $data2["note"] = 7; + if (isset($data2["punkte"])) + unset($data2["punkte"]); + + $result = $this->LePruefungModel->insert($data2); + + if (isError($result)) + return $result; + + $data["pruefungstyp_kurzbz"] = "Termin2"; + } + } + + return $this->LePruefungModel->insert($data); + } + + /** + * Helper function to check permissions for updateCertificate() + * + * @param integer $lehrveranstaltung_id + * @param string $student_uid + * + * @return boolean + */ + protected function hasPermissionUpdate($lehrveranstaltung_id, $student_uid) + { + if ($lehrveranstaltung_id === null || $student_uid === null) + return true; + + $this->load->model('crm/Student_model', 'StudentModel'); + + $result = $this->StudentModel->load([$student_uid]); + if (isError($result) || !hasData($result)) + return false; + + $student = current(getData($result)); + + if ($this->permissionlib->isBerechtigt('admin', 'suid', $student->studiengang_kz)) + return true; + if ($this->permissionlib->isBerechtigt('assistenz', 'suid', $student->studiengang_kz)) + return true; + + $this->load->model('organisation/Studienplan_model', 'StudienplanModel'); + + $result = $this->StudienplanModel->getAllOesForLv($lehrveranstaltung_id); + if (isError($result)) + return false; + + $oes = getData($result) ?: []; + + $this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel'); + + $result = $this->LehrveranstaltungModel->getStg($lehrveranstaltung_id); + if (isError($result)) + return false; + + if (hasData($result)) + $oes[] = current(getData($result)); + + foreach ($oes as $oe) { + if ($this->permissionlib->isBerechtigt('admin', 'suid', $oe->oe_kurzbz)) + return true; + if ($this->permissionlib->isBerechtigt('assistenz', 'suid', $oe->oe_kurzbz)) + return true; + } + + return false; + } + + /** + * Helper function to check permissions for deleteCertificate() + * + * @param integer $lehrveranstaltung_id + * @param string $student_uid + * + * @return boolean + */ + protected function hasPermissionDelete($lehrveranstaltung_id, $student_uid) + { + if ($lehrveranstaltung_id === null || $student_uid === null) + return true; + + $this->load->model('crm/Student_model', 'StudentModel'); + + $result = $this->StudentModel->load([$student_uid]); + if (isError($result) || !hasData($result)) + return false; + + $student = current(getData($result)); + + if ($this->permissionlib->isBerechtigt('admin', 'suid', $student->studiengang_kz)) + return true; + if ($this->permissionlib->isBerechtigt('assistenz', 'suid', $student->studiengang_kz)) + return true; + + $this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel'); + + $result = $this->LehrveranstaltungModel->load($lehrveranstaltung_id); + if (isError($result) || !hasData($result)) + return false; + + $oe = current(getData($result)); + + if ($this->permissionlib->isBerechtigt('admin', 'suid', $oe->oe_kurzbz)) + return true; + if ($this->permissionlib->isBerechtigt('assistenz', 'suid', $oe->oe_kurzbz)) + return true; + + return false; + } + + /** + * Helper function to check permissions for + * copyTeacherProposalToCertificate() and copyRepeaterGradeToCertificate() + * + * @param integer $lehrveranstaltung_id + * @param string $student_uid + * + * @return boolean + */ + protected function hasPermissionCopy($lehrveranstaltung_id, $student_uid) + { + if ($lehrveranstaltung_id === null || $student_uid === null) + return true; + + $this->load->model('crm/Student_model', 'StudentModel'); + + $result = $this->StudentModel->load([$student_uid]); + if (isError($result) || !hasData($result)) + return false; + + $student = current(getData($result)); + + if ($this->permissionlib->isBerechtigt('student/noten', 'suid', $student->studiengang_kz)) + return true; + + $this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel'); + + $result = $this->LehrveranstaltungModel->load($lehrveranstaltung_id); + if (isError($result) || !hasData($result)) + return false; + + $oe = current(getData($result)); + + if ($this->permissionlib->isBerechtigt('student/noten', 'suid', $oe->oe_kurzbz)) + return true; + + return false; + } +} diff --git a/application/controllers/api/frontend/v1/stv/Kontakt.php b/application/controllers/api/frontend/v1/stv/Kontakt.php index 379184ee0..fd16fff06 100644 --- a/application/controllers/api/frontend/v1/stv/Kontakt.php +++ b/application/controllers/api/frontend/v1/stv/Kontakt.php @@ -97,7 +97,14 @@ class Kontakt extends FHCAPI_Controller || $this->router->method == 'deleteContact' || $this->router->method == 'deleteBankverbindung' ) { - $id = current(array_slice($this->uri->rsegments, 2)); + if($this->input->post('address_id')) + $id = $this->input->post('address_id'); + if($this->input->post('adresse_id')) + $id = $this->input->post('adresse_id'); + if($this->input->post('bankverbindung_id')) + $id = $this->input->post('bankverbindung_id'); + if($this->input->post('kontakt_id')) + $id = $this->input->post('kontakt_id'); $model = 'person/Adresse_model'; if ($this->router->method == 'loadContact' @@ -125,7 +132,12 @@ class Kontakt extends FHCAPI_Controller } public function getAdressen($person_id) { - $this->AdresseModel->addSelect('public.tbl_adresse.*'); + $this->AdresseModel->addSelect("public.tbl_adresse.*, + (CASE + WHEN public.tbl_adresse.updateamum >= public.tbl_adresse.insertamum + THEN public.tbl_adresse.updateamum + ELSE public.tbl_adresse.insertamum + END) AS lastUpdate"); $this->AdresseModel->addSelect('t.*'); $this->AdresseModel->addSelect('f.firma_id'); $this->AdresseModel->addSelect('f.name as firmenname'); @@ -143,15 +155,26 @@ class Kontakt extends FHCAPI_Controller public function addNewAddress($person_id) { - $this->form_validation->set_rules('plz', 'PLZ', 'required|numeric', [ + $this->form_validation->set_data(['address.plz' => $_POST['plz']]); + + $this->form_validation->set_rules('address.plz', 'PLZ', 'required', [ 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'PLZ']), - 'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'PLZ']) ]); - if(isset($_POST['gemeinde']) && isset($_POST['ort'])) - $this->form_validation->set_rules('plz', 'Postleitzahl', 'callback_validateLocationCombination', [ - 'validateLocationCombination' => $this->p->t('ui', 'error_location_combination') - ]); + if(isset($_POST['nation']) && $_POST['nation'] == 'A') + { + $this->form_validation->set_rules('address.plz', 'PLZ', 'required|numeric', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'PLZ']), + 'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'PLZ']) + ]); + } + + if(isset($_POST['gemeinde']) && isset($_POST['ort']) && isset($_POST['nation']) && $_POST['nation'] == 'A') + { + $this->form_validation->set_rules('address.plz', 'Postleitzahl', 'callback_validateLocationCombination', [ + 'validateLocationCombination' => $this->p->t('ui', 'error_location_combination') + ]); + } if ($this->form_validation->run() == false) { @@ -196,25 +219,37 @@ class Kontakt extends FHCAPI_Controller ] ); - if (isError($result)) - { - return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); - } - return $this->outputJsonSuccess(true); + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); } - public function updateAddress($address_id) + public function updateAddress() { + $address_id = $this->input->post('adresse_id'); + + $this->form_validation->set_data(['address.plz' => $_POST['plz']]); + $uid = getAuthUID(); - $this->form_validation->set_rules('plz', 'PLZ', 'required|numeric', [ + + $this->form_validation->set_rules('address.plz', 'PLZ', 'required', [ 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'PLZ']), - 'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'PLZ']) ]); - if(isset($_POST['gemeinde']) && isset($_POST['ort'])) - $this->form_validation->set_rules('plz', 'Postleitzahl', 'callback_validateLocationCombination', [ + if(isset($_POST['nation']) && $_POST['nation'] == 'A') + { + $this->form_validation->set_rules('address.plz', 'PLZ', 'required|numeric', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'PLZ']), + 'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'PLZ']) + ]); + } + + if(isset($_POST['gemeinde']) && isset($_POST['ort']) && isset($_POST['nation']) && $_POST['nation'] == 'A') + { + $this->form_validation->set_rules('address.plz', 'Postleitzahl', 'callback_validateLocationCombination', [ 'validateLocationCombination' => $this->p->t('ui', 'error_location_combination') ]); + } if ($this->form_validation->run() == false) { @@ -272,15 +307,15 @@ class Kontakt extends FHCAPI_Controller ] ); - if (isError($result)) - { - return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); - } - return $this->outputJsonSuccess(true); + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); } - public function loadAddress($adresse_id) + public function loadAddress() { + $adresse_id = $this->input->post('address_id'); + $this->load->model('person/Adresse_model', 'AdresseModel'); $this->AdresseModel->addSelect('public.tbl_adresse.*'); @@ -306,8 +341,10 @@ class Kontakt extends FHCAPI_Controller $this->terminateWithSuccess(current(getData($result)) ? : null); } - public function deleteAddress($adresse_id) + public function deleteAddress() { + $adresse_id = $this->input->post('address_id'); + $this->load->model('person/Adresse_model', 'AdresseModel'); $result = $this->AdresseModel->load([ 'adresse_id'=> $adresse_id, @@ -366,10 +403,10 @@ class Kontakt extends FHCAPI_Controller $this->load->model('organisation/standort_model', 'StandortModel'); $result = $this->StandortModel->searchStandorte($searchString); - if (isError($result)) { - $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); - } - $this->terminateWithSuccess($result ?: []); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); } public function getStandorteByFirma($firma_id) @@ -386,11 +423,11 @@ class Kontakt extends FHCAPI_Controller public function getKontakte($person_id) { $this->KontaktModel->addSelect("public.tbl_kontakt.*, - TO_CHAR (CASE - WHEN public.tbl_kontakt.updateamum >= public.tbl_kontakt.insertamum - THEN public.tbl_kontakt.updateamum - ELSE public.tbl_kontakt.insertamum - END::timestamp, 'DD.MM.YYYY HH24:MI:SS') AS lastUpdate, st.bezeichnung, f.name"); + (CASE + WHEN public.tbl_kontakt.updateamum >= public.tbl_kontakt.insertamum + THEN public.tbl_kontakt.updateamum + ELSE public.tbl_kontakt.insertamum + END) AS lastUpdate, st.bezeichnung, f.name"); $this->StandortModel->addJoin('public.tbl_standort st', 'ON (public.tbl_kontakt.standort_id = st.standort_id)', 'LEFT'); $this->FirmaModel->addJoin('public.tbl_firma f', 'ON (f.firma_id = st.firma_id)', 'LEFT'); $result = $this->KontaktModel->loadWhere( @@ -418,8 +455,9 @@ class Kontakt extends FHCAPI_Controller } } - public function loadContact($kontakt_id) + public function loadContact() { + $kontakt_id = $this->input->post('kontakt_id'); $this->load->model('person/Kontakt_model', 'KontaktModel'); $this->KontaktModel->addSelect('*, public.tbl_kontakt.*'); @@ -439,7 +477,6 @@ class Kontakt extends FHCAPI_Controller { return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Kontakt_id']), self::ERROR_TYPE_GENERAL); } - // $this->outputJsonSuccess(current(getData($result))); $this->terminateWithSuccess(current(getData($result))); } @@ -492,11 +529,12 @@ class Kontakt extends FHCAPI_Controller { return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); } - return $this->outputJsonSuccess(true); + $this->terminateWithSuccess($result); } - public function updateContact($kontakt_id) + public function updateContact() { + $kontakt_id = $this->input->post('kontakt_id'); $this->load->model('person/Kontakt_model', 'KontaktModel'); if(!$kontakt_id) @@ -523,13 +561,6 @@ class Kontakt extends FHCAPI_Controller $this->terminateWithValidationErrors($this->form_validation->error_array()); } -/* if(isset($_POST['standort'])) - { - $standort_id = $_POST['standort']['standort_id']; - } - else - $standort_id = null;*/ - $uid = getAuthUID(); $kontakttyp = $this->input->post('kontakttyp'); $anmerkung = $this->input->post('anmerkung'); @@ -538,8 +569,6 @@ class Kontakt extends FHCAPI_Controller $person_id = $this->input->post('person_id'); $standort_id = $this->input->post('standort_id'); - //return $this->terminateWithError("in update " . $standort_id, self::ERROR_TYPE_GENERAL); - $result = $this->KontaktModel->update( [ 'kontakt_id' => $kontakt_id @@ -557,15 +586,14 @@ class Kontakt extends FHCAPI_Controller ] ); - if (isError($result)) - { - return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); - } - return $this->outputJsonSuccess(true); + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); } - public function deleteContact($kontakt_id) + public function deleteContact() { + $kontakt_id = $this->input->post('kontakt_id'); $this->load->model('person/Kontakt_model', 'KontaktModel'); $result = $this->KontaktModel->delete( @@ -643,15 +671,15 @@ class Kontakt extends FHCAPI_Controller 'orgform_kurzbz' => $orgform_kurzbz ] ); - if (isError($result)) - { - return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); - } - return $this->outputJsonSuccess(true); + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); } - public function loadBankverbindung($bankverbindung_id) + public function loadBankverbindung() { + $bankverbindung_id = $this->input->post('bankverbindung_id'); + $this->load->model('person/Bankverbindung_model', 'BankverbindungModel'); $this->BankverbindungModel->addSelect('*'); @@ -719,15 +747,15 @@ class Kontakt extends FHCAPI_Controller ] ); - if (isError($result)) - { - return $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); - } - return $this->outputJsonSuccess(true); + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); } - public function deleteBankverbindung($bankverbindung_id) + public function deleteBankverbindung() { + $bankverbindung_id = $this->input->post('bankverbindung_id'); + $this->load->model('person/Bankverbindung_model', 'BankverbindungModel'); $result = $this->BankverbindungModel->delete( @@ -740,7 +768,7 @@ class Kontakt extends FHCAPI_Controller } if (!hasData($result)) { - $this->outputJson($result); + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Bankverbindung_id']), self::ERROR_TYPE_GENERAL); } return $this->terminateWithSuccess(current(getData($result)) ? : null); } diff --git a/application/controllers/api/frontend/v1/stv/Mobility.php b/application/controllers/api/frontend/v1/stv/Mobility.php new file mode 100644 index 000000000..2ab0ac682 --- /dev/null +++ b/application/controllers/api/frontend/v1/stv/Mobility.php @@ -0,0 +1,528 @@ + ['admin:r', 'assistenz:r'], + 'loadMobility' => ['admin:r', 'assistenz:r'], + 'insertMobility' => ['admin:rw', 'assistenz:rw'], + 'updateMobility' => ['admin:rw', 'assistenz:rw'], + 'deleteMobility' => ['admin:rw', 'assistenz:rw'], + 'getProgramsMobility' => ['admin:r', 'assistenz:r'], + 'getLVList' => ['admin:r', 'assistenz:r'], + 'getAllLehreinheiten' => ['admin:r', 'assistenz:r'], + 'getLvsandLesByStudent' => ['admin:r', 'assistenz:r'], + 'getPurposes' => ['admin:r', 'assistenz:r'], + 'getSupports' => ['admin:r', 'assistenz:r'], + 'getListPurposes' => ['admin:r', 'assistenz:r'], + 'getListSupports' => ['admin:r', 'assistenz:r'], + 'deleteMobilityPurpose' => ['admin:r', 'assistenz:r'], + 'addMobilityPurpose' => ['admin:r', 'assistenz:r'], + 'deleteMobilitySupport' => ['admin:r', 'assistenz:r'], + 'addMobilitySupport' => ['admin:r', 'assistenz:r'], + ]); + + // Load Libraries + $this->load->library('VariableLib', ['uid' => getAuthUID()]); + $this->load->library('form_validation'); + + // Load language phrases + $this->loadPhrases([ + 'ui', + 'mobility' + ]); + + // Load models + $this->load->model('codex/Bisio_model', 'BisioModel'); + } + + public function getMobilitaeten($student_uid) + { + $this->BisioModel->addSelect("*"); + $this->BisioModel->addJoin('bis.tbl_mobilitaetsprogramm mp', 'ON (mp.mobilitaetsprogramm_code = bis.tbl_bisio.mobilitaetsprogramm_code)', 'LEFT'); + $this->BisioModel->addJoin('lehre.tbl_lehreinheit le', 'ON (le.lehreinheit_id = bis.tbl_bisio.lehreinheit_id)','LEFT'); + $this->BisioModel->addOrder('von', 'DESC'); + $this->BisioModel->addOrder('bis', 'DESC'); + $this->BisioModel->addOrder('bisio_id', 'DESC'); + $result = $this->BisioModel->loadWhere( + array('student_uid' => $student_uid) + ); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + + public function getProgramsMobility() + { + $this->load->model('codex/Mobilitaetsprogramm_model', 'MobilitaetsprogrammModel'); + + $result = $this->MobilitaetsprogrammModel->load(); + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + + public function insertMobility() + { + $this->load->library('form_validation'); + $authUID = getAuthUID(); + + $student_uid = $this->input->post('uid'); + + if(!$student_uid) + { + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Student UID']), self::ERROR_TYPE_GENERAL); + } + + $formData = $this->input->post('formData'); + + $_POST['von'] = (isset($formData['von']) && !empty($formData['von'])) ? $formData['von'] : null; + $_POST['bis'] = (isset($formData['bis']) && !empty($formData['bis'])) ? $formData['bis'] : null; + $_POST['nation_code'] = (isset($formData['nation_code']) && !empty($formData['nation_code'])) ? $formData['nation_code'] : 'A'; + $_POST['mobilitaetsprogramm_code'] = (isset($formData['mobilitaetsprogramm_code']) && !empty($formData['mobilitaetsprogramm_code'])) ? $formData['mobilitaetsprogramm_code'] : null; + $_POST['herkunftsland_code'] = (isset($formData['herkunftsland_code']) && !empty($formData['herkunftsland_code'])) ? $formData['herkunftsland_code'] : 'A'; + $_POST['ects_erworben'] = (isset($formData['ects_erworben']) && !empty($formData['ects_erworben'])) ? $formData['ects_erworben'] : null; + $_POST['ects_angerechnet'] = (isset($formData['ects_angerechnet']) && !empty($formData['ects_angerechnet'])) ? $formData['ects_angerechnet'] : null; + $_POST['lehreinheit_id'] = (isset($formData['lehreinheit_id']) && !empty($formData['lehreinheit_id'])) ? $formData['lehreinheit_id'] : null; + + $this->form_validation->set_rules('nation_code', 'Nation_code', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Nation_code']) + ]); + $this->form_validation->set_rules('herkunftsland_code', 'Herkunftsland_code', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Herkunftsland_code']) + ]); + $this->form_validation->set_rules('mobilitaetsprogramm_code', 'Mobilitaetsprogramm_code', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Mobilitaetsprogramm_code']) + ]); + $this->form_validation->set_rules('von', 'VonDatum', 'is_valid_date', [ + 'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'VonDatum']) + ]); + + $this->form_validation->set_rules('bis', 'VBisDatum', 'is_valid_date', [ + 'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'VBisDatum']) + ]); + + $this->form_validation->set_rules('ects_erworben', 'Ects_erworben', 'numeric', [ + 'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'Ects_erworben']) + ]); + + $this->form_validation->set_rules('ects_angerechnet', 'Ects_angerechnet', 'numeric', [ + 'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'Ects_angerechnet']) + ]); + + $this->form_validation->set_rules('lehreinheit_id', 'Lehreinheit', 'numeric', [ + 'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'Lehreinheit']) + ]); + + if ($this->form_validation->run() == false) + { + $this->terminateWithValidationErrors($this->form_validation->error_array()); + } + + $ort = (isset($formData['ort']) && !empty($formData['ort'])) ? $formData['ort'] : null; + $universitaet = (isset($formData['universitaet']) && !empty($formData['universitaet'])) ? $formData['universitaet'] : null; + $localPurposes = (isset($formData['localPurposes']) && !empty($formData['localPurposes'])) ? $formData['localPurposes'] : null; + $localSupports = (isset($formData['localSupports']) && !empty($formData['localSupports'])) ? $formData['localSupports'] : null; + + $result = $this->BisioModel->insert([ + 'student_uid' => $student_uid, + 'von' => $_POST['von'], + 'bis' => $_POST['bis'], + 'mobilitaetsprogramm_code' => $_POST['mobilitaetsprogramm_code'], + 'nation_code' => $_POST['nation_code'], + 'herkunftsland_code' => $_POST['herkunftsland_code'], + 'lehreinheit_id' => $_POST['lehreinheit_id'], + 'ort' => $ort, + 'universitaet' => $universitaet, + 'ects_erworben' => $_POST['ects_erworben'] , + 'ects_angerechnet' => $_POST['ects_angerechnet'], + 'insertamum' => date('c'), + 'insertvon' => $authUID, + ]); + + $bisio_id = $this->getDataOrTerminateWithError($result); + + //check if localData (purposes) + if(count($localPurposes) > 0){ + foreach ($localPurposes as $zweck){ + $zweck = (int)$zweck; + $this->addMobilityPurpose($bisio_id, $zweck); + } + } + + //check if localData (supports) + if(count($localSupports) > 0){ + foreach ($localSupports as $support){ + $this->addMobilitySupport($bisio_id, $support); + } + } + + $this->terminateWithSuccess($bisio_id); + } + + public function loadMobility($bisio_id) + { + $this->BisioModel->addSelect("*"); + $this->BisioModel->addJoin('bis.tbl_mobilitaetsprogramm mp', 'ON (mp.mobilitaetsprogramm_code = bis.tbl_bisio.mobilitaetsprogramm_code)', 'LEFT'); + $this->BisioModel->addJoin('lehre.tbl_lehreinheit le', 'ON (le.lehreinheit_id = bis.tbl_bisio.lehreinheit_id)','LEFT'); + $result = $this->BisioModel->loadWhere( + array('bisio_id' => $bisio_id) + ); + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess(current($data)); + } + + public function updateMobility() + { + + $this->load->library('form_validation'); + $authUID = getAuthUID(); + + $student_uid = $this->input->post('uid'); + + if(!$student_uid) + { + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Student UID']), self::ERROR_TYPE_GENERAL); + } + $formData = $this->input->post('formData'); + + $_POST['von'] = (isset($formData['von']) && !empty($formData['von'])) ? $formData['von'] : null; + $_POST['bis'] = (isset($formData['bis']) && !empty($formData['bis'])) ? $formData['bis'] : null; + $_POST['nation_code'] = (isset($formData['nation_code']) && !empty($formData['nation_code'])) ? $formData['nation_code'] : 'A'; + $_POST['mobilitaetsprogramm_code'] = (isset($formData['mobilitaetsprogramm_code']) && !empty($formData['mobilitaetsprogramm_code'])) ? $formData['mobilitaetsprogramm_code'] : null; + $_POST['herkunftsland_code'] = (isset($formData['herkunftsland_code']) && !empty($formData['herkunftsland_code'])) ? $formData['herkunftsland_code'] : 'A'; + $_POST['ects_erworben'] = (isset($formData['ects_erworben']) && !empty($formData['ects_erworben'])) ? $formData['ects_erworben'] : null; + $_POST['ects_angerechnet'] = (isset($formData['ects_angerechnet']) && !empty($formData['ects_angerechnet'])) ? $formData['ects_angerechnet'] : null; + $_POST['lehreinheit_id'] = (isset($formData['lehreinheit_id']) && !empty($formData['lehreinheit_id'])) ? $formData['lehreinheit_id'] : null; + + $this->form_validation->set_rules('nation_code', 'Nation_code', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Nation_code']) + ]); + $this->form_validation->set_rules('herkunftsland_code', 'Herkunftsland_code', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Herkunftsland_code']) + ]); + $this->form_validation->set_rules('mobilitaetsprogramm_code', 'Mobilitaetsprogramm_code', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Mobilitaetsprogramm_code']) + ]); + $this->form_validation->set_rules('von', 'VonDatum', 'is_valid_date', [ + 'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'VonDatum']) + ]); + + $this->form_validation->set_rules('bis', 'VBisDatum', 'is_valid_date', [ + 'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'VBisDatum']) + ]); + + $this->form_validation->set_rules('ects_erworben', 'Ects_erworben', 'numeric', [ + 'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'Ects_erworben']) + ]); + + $this->form_validation->set_rules('ects_angerechnet', 'Ects_angerechnet', 'numeric', [ + 'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'Ects_angerechnet']) + ]); + + $this->form_validation->set_rules('lehreinheit_id', 'Lehreinheit', 'numeric', [ + 'numeric' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'Lehreinheit']) + ]); + + if ($this->form_validation->run() == false) + { + $this->terminateWithValidationErrors($this->form_validation->error_array()); + } + + $result = $this->BisioModel->update( + [ + 'bisio_id' => $formData['bisio_id'] + ], + [ + 'student_uid' => $student_uid, + 'von' => $_POST['von'], + 'bis' => $_POST['bis'], + 'mobilitaetsprogramm_code' => $_POST['mobilitaetsprogramm_code'], + 'nation_code' => $_POST['nation_code'], + 'herkunftsland_code' => $_POST['herkunftsland_code'], + 'lehreinheit_id' => $_POST['lehreinheit_id'], + 'ort' => $formData['ort'], + 'universitaet' => $formData['universitaet'], + 'ects_erworben' => $_POST['ects_erworben'] , + 'ects_angerechnet' => $_POST['ects_angerechnet'], + 'updateamum' => date('c'), + 'updatevon' => $authUID, + ] + ); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess(current($data)); + } + + public function deleteMobility($bisio_id) + { + //check if extension table exists + $result = $this->BisioModel->tableExists('extension', 'tbl_mo_bisioidzuordnung'); + $data = $this->getDataOrTerminateWithError($result); + + //if table exists check if existing entry + if(!empty($data)) + { + $this->BisioModel->addSelect("count(*)"); + $this->BisioModel->addJoin('extension.tbl_mo_bisioidzuordnung mo', 'ON (mo.bisio_id = bis.tbl_bisio.bisio_id)', 'LEFT'); + + $resultCheckMo = $this->BisioModel->loadWhere( + array('mo.bisio_id' => $bisio_id) + ); + + $resultCheckMo = $this->getDataOrTerminateWithError($resultCheckMo); + $count = current($resultCheckMo)->count; + + $existsInExtension = $count > 0 ? true : false; + + if($existsInExtension) + $this->terminateWithError($this->p->t('mobility', 'error_existingEntryInExtension'), self::ERROR_TYPE_GENERAL); + } + + $result = $this->BisioModel->delete( + array('bisio_id' => $bisio_id) + ); + + $data = $this->getDataOrTerminateWithError($result); + $this->terminateWithSuccess($data); + } + + public function getLVList($studiengang_kz) + { + $this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel'); + + $result = $this->LehrveranstaltungModel->getLvsByStudiengangkz($studiengang_kz); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + + public function getAllLehreinheiten() + { + $lv_id = $this->input->post('lv_id'); + $studiensemester_kurzbz = $this->input->post('studiensemester_kurzbz'); + + $this->load->model('education/Lehreinheit_model', 'LehreinheitModel'); + + $result = $this->LehreinheitModel->getLesFromLvIds($lv_id, $studiensemester_kurzbz); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + + public function getLvsandLesByStudent($student_uid) + { + $this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel'); + + $result = $this->LehrveranstaltungModel->getLvsByStudent($student_uid); + + $data = $this->getDataOrTerminateWithError($result); + + $lv_ids = array(); + $allData = array(); + + foreach ($data as $lehrveranstaltung) { + $lv_ids[] = $lehrveranstaltung->lehrveranstaltung_id; + } + + $this->load->model('education/Lehreinheit_model', 'LehreinheitModel'); + + foreach ($lv_ids as $id) + { + $result = $this->LehreinheitModel->getLesFromLvIds($id); + $data = $this->getDataOrTerminateWithError($result); + + if (is_array($data)) { + $allData = array_merge($allData, $data); + } + } + + return $this->terminateWithSuccess($allData); + } + + public function getPurposes($bisio_id) + { + $bisio_id = (int)$bisio_id; + + $this->load->model('codex/Bisiozweck_model', 'BisiozweckModel'); + + $this->BisiozweckModel->addSelect("*"); + $this->BisiozweckModel->addJoin('bis.tbl_zweck zw', 'ON (zw.zweck_code = bis.tbl_bisio_zweck.zweck_code)'); + + $result = $this->BisiozweckModel->loadWhere( + array('bisio_id' => $bisio_id) + ); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + + public function getSupports($bisio_id) + { + $bisio_id = (int)$bisio_id; + + $this->load->model('codex/Bisioaufenthaltfoerderung_model', 'BisioaufenthaltfoerderungModel'); + + $this->BisioaufenthaltfoerderungModel->addSelect("*"); + $this->BisioaufenthaltfoerderungModel->addJoin('bis.tbl_aufenthaltfoerderung af', 'ON (af.aufenthaltfoerderung_code = bis.tbl_bisio_aufenthaltfoerderung.aufenthaltfoerderung_code)'); + + $result = $this->BisioaufenthaltfoerderungModel->loadWhere( + array('bisio_id' => $bisio_id) + ); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + + public function getListPurposes() + { + $this->load->model('codex/Zweck_model', 'ZweckModel'); + + $result = $this->ZweckModel->load(); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + + public function getListSupports() + { + $this->load->model('codex/Aufenthaltfoerderung_model', 'AufenthaltfoerderungModel'); + + $result = $this->AufenthaltfoerderungModel->load(); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + + public function addMobilityPurpose($bisio_id, $local_purpose = null) + { + $zweck_code = $this->input->post('zweck_code'); + + if($local_purpose){ + $zweck_code = $local_purpose; + } + + $this->load->model('codex/Bisiozweck_model', 'BisiozweckModel'); + if(!$local_purpose) + { + $check = $this->BisiozweckModel->loadWhere( + [ + 'bisio_id' => $bisio_id, + 'zweck_code' => $zweck_code, + ] + ); + if (hasData($check)) + { + $this->terminateWithError($this->p->t('ui', 'error_entryExisting'), self::ERROR_TYPE_GENERAL); + } + } + + $result = $this->BisiozweckModel->insert( + array( + 'bisio_id' => $bisio_id, + 'zweck_code' => $zweck_code + ) + ); + + $data = $this->getDataOrTerminateWithError($result); + + if($local_purpose) + { + return $data; + } + + return $this->terminateWithSuccess(current($data)); + } + + public function deleteMobilityPurpose($bisio_id) + { + $zweck_code = $this->input->post('zweck_code'); + + $this->load->model('codex/Bisiozweck_model', 'BisiozweckModel'); + + + $result = $this->BisiozweckModel->delete( + array( + 'bisio_id' => $bisio_id, + 'zweck_code' => $zweck_code + ) + ); + + $data = $this->getDataOrTerminateWithError($result); + + return $this->terminateWithSuccess(current($data)); + } + + public function addMobilitySupport($bisio_id, $local_support = null) + { + $aufenthaltfoerderung_code = $this->input->post('aufenthaltfoerderung_code'); + + if($local_support){ + $aufenthaltfoerderung_code = $local_support; + } + + $this->load->model('codex/Bisioaufenthaltfoerderung_model', 'BisioaufenthaltfoerderungModel'); + + if(!$local_support) + { + $check = $this->BisioaufenthaltfoerderungModel->loadWhere( + [ + 'bisio_id' => $bisio_id, + 'aufenthaltfoerderung_code' => $aufenthaltfoerderung_code, + ] + ); + if (hasData($check)) + { + $this->terminateWithError($this->p->t('ui', 'error_entryExisting'), self::ERROR_TYPE_GENERAL); + } + } + + $result = $this->BisioaufenthaltfoerderungModel->insert( + array( + 'bisio_id' => $bisio_id, + 'aufenthaltfoerderung_code' => $aufenthaltfoerderung_code + ) + ); + + $data = $this->getDataOrTerminateWithError($result); + + if($local_support) + { + return $data; + } + + return $this->terminateWithSuccess(current($data)); + } + + public function deleteMobilitySupport($bisio_id) + { + $aufenthaltfoerderung_code = $this->input->post('aufenthaltfoerderung_code'); + + $this->load->model('codex/Bisioaufenthaltfoerderung_model', 'BisioaufenthaltfoerderungModel'); + + $result = $this->BisioaufenthaltfoerderungModel->delete( + array( + 'bisio_id' => $bisio_id, + 'aufenthaltfoerderung_code' => $aufenthaltfoerderung_code + ) + ); + $data = $this->getDataOrTerminateWithError($result); + + return $this->terminateWithSuccess(current($data)); + } +} diff --git a/application/controllers/api/frontend/v1/stv/Prestudent.php b/application/controllers/api/frontend/v1/stv/Prestudent.php index ef9aeb111..0b06b9667 100644 --- a/application/controllers/api/frontend/v1/stv/Prestudent.php +++ b/application/controllers/api/frontend/v1/stv/Prestudent.php @@ -19,6 +19,7 @@ class Prestudent extends FHCAPI_Controller 'getAufmerksamdurch' => ['admin:r', 'assistenz:r'], 'getBerufstaetigkeit' => ['admin:r', 'assistenz:r'], 'getTypenStg' => ['admin:r', 'assistenz:r'], + 'getBisstandort' => ['admin:r', 'assistenz:r'], 'getStudienplaene' => ['admin:r', 'assistenz:r'], 'getStudiengang' => ['admin:r', 'assistenz:r'] ]); @@ -265,6 +266,17 @@ class Prestudent extends FHCAPI_Controller return $this->terminateWithSuccess(getData($result) ?: []); } + public function getBisstandort() + { + $this->load->model('codex/Bisstandort_model', 'BisstandortModel'); + + $result = $this->BisstandortModel->load(); + if (isError($result)) { + $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); + } + return $this->terminateWithSuccess(getData($result) ?: []); + } + public function getStudienplaene($prestudent_id) { $this->load->model('organisation/Studienplan_model', 'StudienplanModel'); diff --git a/application/controllers/api/frontend/v1/stv/Pruefung.php b/application/controllers/api/frontend/v1/stv/Pruefung.php new file mode 100644 index 000000000..e205c85b8 --- /dev/null +++ b/application/controllers/api/frontend/v1/stv/Pruefung.php @@ -0,0 +1,577 @@ +. + */ + +if (! defined('BASEPATH')) exit('No direct script access allowed'); + +/** + * This controller operates between (interface) the JS (GUI) and the back-end + * Provides data to the ajax get calls about addresses + * This controller works with JSON calls on the HTTP GET or POST and the output is always JSON + */ +class Pruefung extends FHCAPI_Controller +{ + public function __construct() + { + parent::__construct([ + 'getPruefungen' => ['admin:r', 'assistenz:r'], + 'loadPruefung' => ['admin:r', 'assistenz:r'], + 'getTypenPruefungen' => ['admin:r', 'assistenz:r'], + 'getLehreinheiten' => ['admin:r', 'assistenz:r'], + 'getAllLehreinheiten' => ['admin:r', 'assistenz:r'], + 'getLvsByStudent' => ['admin:r', 'assistenz:r'], + 'getLvsandLesByStudent' => ['admin:r', 'assistenz:r'], + 'getLvsAndMas' => ['admin:r', 'assistenz:r'], + 'getMitarbeiterLv' => ['admin:r', 'assistenz:r'], + 'getNoten' => ['admin:r', 'assistenz:r'], + 'checkZeugnisnoteLv' => ['admin:r', 'assistenz:r'], + 'checkTermin1' => ['admin:r', 'assistenz:r'], + 'insertPruefung' => self::PERM_LOGGED, + 'updatePruefung' =>self::PERM_LOGGED, + 'deletePruefung' =>self::PERM_LOGGED, + ]); + + //Load Models + $this->load->model('education/LePruefung_model', 'PruefungModel'); + + //version with postParameter + if ($this->router->method == 'insertPruefung') + { + $student_uid = $this->input->post('student_uid'); + + $this->load->model('crm/Student_model', 'StudentModel'); + $result = $this->StudentModel->load([$student_uid]); + $student = $this->getDataOrTerminateWithError($result); + + $prestudent_id = current($student)->prestudent_id; + $this->checkPermissionsForPrestudent($prestudent_id, ['admin:w', 'assistenz:w']); + } + + // parameter from uri + if ($this->router->method == 'updatePruefung' || $this->router->method == 'deletePruefung') + { + $pruefung_id = current(array_slice($this->uri->rsegments, 2)); + + $result = $this->PruefungModel->load($pruefung_id); + $pruefung = $this->getDataOrTerminateWithError($result); + $student_uid = current($pruefung)->student_uid; + + + $this->load->model('crm/Student_model', 'StudentModel'); + $result = $this->StudentModel->load([$student_uid]); + $student = $this->getDataOrTerminateWithError($result); + $prestudent_id = current($student)->prestudent_id; + + $this->checkPermissionsForPrestudent($prestudent_id, ['admin:rw', 'assistenz:rw']); + } + + if ($this->router->method == 'loadPruefung') + { + $pruefung_id = current(array_slice($this->uri->rsegments, 2)); + + $result = $this->PruefungModel->load($pruefung_id); + $pruefung = $this->getDataOrTerminateWithError($result); + + + $student_uid = current($pruefung)->student_uid; + + $this->load->model('crm/Student_model', 'StudentModel'); + $result = $this->StudentModel->load([$student_uid]); + $student = $this->getDataOrTerminateWithError($result); + $prestudent_id = current($student)->prestudent_id; + + $this->checkPermissionsForPrestudent($prestudent_id, ['admin:r', 'assistenz:r']); + } + + if ($this->router->method == 'getPruefungen') + { + $student_uid = current(array_slice($this->uri->rsegments, 2)); + + $this->load->model('crm/Student_model', 'StudentModel'); + $result = $this->StudentModel->load([$student_uid]); + $student = $this->getDataOrTerminateWithError($result); + $prestudent_id = current($student)->prestudent_id; + + $this->checkPermissionsForPrestudent($prestudent_id, ['admin:r', 'assistenz:r']); + } + + // Load language phrases + $this->loadPhrases([ + 'global', 'ui','lehre' + ]); + } + + public function getPruefungen($student_uid, $studiensemester_kurzbz = null) + { + $result = $this->PruefungModel->getPruefungenByStudentuid($student_uid); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + + public function loadPruefung($pruefung_id) + { + $this->PruefungModel->addSelect('tbl_pruefung.datum'); + $this->PruefungModel->addSelect("TO_CHAR(tbl_pruefung.datum::timestamp, 'DD.MM.YYYY') AS format_datum"); + $this->PruefungModel->addSelect('tbl_pruefung.anmerkung'); + $this->PruefungModel->addSelect('tbl_pruefung.pruefungstyp_kurzbz'); + $this->PruefungModel->addSelect('tbl_pruefung.pruefung_id'); + $this->PruefungModel->addSelect('tbl_pruefung.lehreinheit_id'); + $this->PruefungModel->addSelect('tbl_pruefung.student_uid'); + $this->PruefungModel->addSelect('tbl_pruefung.mitarbeiter_uid'); + $this->PruefungModel->addSelect('tbl_pruefung.punkte'); + $this->PruefungModel->addSelect('tbl_pruefung.note'); + + $this->PruefungModel->addSelect('tbl_lehrveranstaltung.bezeichnung as lehrveranstaltung_bezeichnung'); + $this->PruefungModel->addSelect('tbl_lehrveranstaltung.lehrveranstaltung_id'); + $this->PruefungModel->addSelect('tbl_lehrveranstaltung.semester'); + $this->PruefungModel->addSelect('tbl_lehrveranstaltung.lehrform_kurzbz'); + $this->PruefungModel->addSelect('tbl_note.bezeichnung as note_bezeichnung'); + $this->PruefungModel->addSelect('tbl_pruefungstyp.beschreibung as typ_beschreibung'); + $this->PruefungModel->addSelect('tbl_lehreinheit.studiensemester_kurzbz as studiensemester_kurzbz'); + + $this->PruefungModel->addJoin('lehre.tbl_lehreinheit', 'lehre.tbl_pruefung.lehreinheit_id = lehre.tbl_lehreinheit.lehreinheit_id'); + $this->PruefungModel->addJoin('lehre.tbl_lehrveranstaltung', 'lehrveranstaltung_id'); + $this->PruefungModel->addJoin('lehre.tbl_note', 'note'); + $this->PruefungModel->addJoin('lehre.tbl_pruefungstyp', 'pruefungstyp_kurzbz'); + + + $this->PruefungModel->addLimit(1); + + $result = $this->PruefungModel->loadWhere( + array('pruefung_id' => $pruefung_id) + ); + if (isError($result)) { + return $this->terminateWithError($result, self::ERROR_TYPE_GENERAL); + } + + if (!hasData($result)) + { + return $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Pruefung_id']), self::ERROR_TYPE_GENERAL); + } + $this->terminateWithSuccess(current(getData($result)) ? : null); + } + + /** + * Inserts a pruefung + * + * @param lehrveranstaltung_id, student_uid, lehreinheit_id + * + * @return values on success + * retval 0: pruefung inserted + * reval 1: pruefung and zeugnisnote inserted + * retval 2: pruefung inserted, no insert Zeugnisnote + * (change after date of examination) + * retval 3: pruefung of type Termin2 inserted + * and pruefung of type Termin1 as well + * retval 5: prueufungen Termin 2 and 1 inserted + * and no insert Zeugnisnote (change after date of examination) + */ + public function insertPruefung() + { + $authUID = getAuthUID(); + + $this->load->library('form_validation'); + + $this->form_validation->set_rules('lehrveranstaltung_id', $this->p->t('lehre', 'lehrveranstaltung'), 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('lehre', 'lehrveranstaltung')]), + ]); + $this->form_validation->set_rules('lehreinheit_id', $this->p->t('lehre', 'lehreinheit'), 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('lehre', 'lehreinheit')]), + ]); + $this->form_validation->set_rules('pruefungstyp_kurzbz', $this->p->t('lehre', 'pruefung'), 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('global', 'typ')]), + ]); + $this->form_validation->set_rules( + 'datum', + $this->p->t('global', 'datum'), + ['is_valid_date'] + ); + + if ($this->form_validation->run() == false) + { + $this->terminateWithValidationErrors($this->form_validation->error_array()); + } + + //calculate studiensemester_kurzbz this from lehreinheit (case newPruefung) + $studiensemester_kurzbz = $this->input->post('studiensemester_kurzbz'); + if (!$studiensemester_kurzbz) + { + $this->load->model('education/Lehreinheit_model', 'LehreinheitModel'); + + $result = $this->LehreinheitModel->load($this->input->post('lehreinheit_id')); + + $lehreinheit = $this->getDataOrTerminateWithError($result); + $studiensemester_kurzbz = current($lehreinheit)->studiensemester_kurzbz; + + if (isError($result)) + { + $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); + } + } + + $result = $this->PruefungModel->insert([ + 'lehreinheit_id' => $this->input->post('lehreinheit_id'), + 'student_uid' => $this->input->post('student_uid'), + 'mitarbeiter_uid' => $this->input->post('mitarbeiter_uid'), + 'datum' => $this->input->post('datum'), + 'pruefungstyp_kurzbz' => $this->input->post('pruefungstyp_kurzbz'), + 'note' => $this->input->post('note'), + 'anmerkung' => $this->input->post('anmerkung'), + 'insertamum' => date('c'), + 'insertvon' => $authUID, + ]); + + $this->getDataOrTerminateWithError($result); + + //check if existing zeugnisnote + $this->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel'); + + $result = $this->ZeugnisnoteModel->loadWhere(array( + 'lehrveranstaltung_id' => $this->input->post('lehrveranstaltung_id'), + 'student_uid' => $this->input->post('student_uid'), + 'studiensemester_kurzbz' => $studiensemester_kurzbz)); + + if (isError($result)) + { + $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); + } + + if (!hasData($result)) + { + //insert zeugnisnote, if not existing + $result = $this->ZeugnisnoteModel->insert(array( + 'lehrveranstaltung_id' => $this->input->post('lehrveranstaltung_id'), + 'student_uid' => $this->input->post('student_uid'), + 'studiensemester_kurzbz' => $studiensemester_kurzbz, + 'note' => $this->input->post('note'), + 'uebernahmedatum' => date('c'), + 'benotungsdatum' => $this->input->post('datum'), + 'insertamum' => date('c'), + 'insertvon' => $authUID + )); + + if (isError($result)) + { + $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); + } + $this->terminateWithSuccess(1); + } + + $return_code = 0; + + //handling Termin1 if not existing + if($this->input->post('pruefungstyp_kurzbz') == "Termin2") + { + $resultP = $this->PruefungModel->loadWhere(array( + 'lehreinheit_id' => $this->input->post('lehreinheit_id'), + 'student_uid' => $this->input->post('student_uid'), + 'pruefungstyp_kurzbz' => 'Termin1')); + + if (isError($resultP)) + { + $this->terminateWithError(getError($resultP), self::ERROR_TYPE_GENERAL); + } + if(!hasData($resultP)) + { + //check if existing Zeugnisnote + $this->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel'); + $this->ZeugnisnoteModel->addJoin('lehre.tbl_lehreinheit', 'lehrveranstaltung_id'); + + $resultP = $this->ZeugnisnoteModel->loadWhere(array( + 'lehrveranstaltung_id' => $this->input->post('lehrveranstaltung_id'), + 'student_uid' => $this->input->input->post('student_uid'), + 'lehre.tbl_zeugnisnote.studiensemester_kurzbz' => $studiensemester_kurzbz)); + if (isError($resultP)) + { + $this->terminateWithError(getError($resultP), self::ERROR_TYPE_GENERAL); + } + if (!hasData($resultP)) + { + $this->terminateWithError("Zeugnisnote existiert nicht", self::ERROR_TYPE_GENERAL); + } + $dataNote = current(getData($resultP)); + + $resultN = $this->PruefungModel->insert([ + 'lehreinheit_id' => $this->input->post('lehreinheit_id'), + 'student_uid' => $this->input->post('student_uid'), + 'mitarbeiter_uid' => $this->input->post('mitarbeiter_uid'), + 'datum' => $dataNote->benotungsdatum, + 'pruefungstyp_kurzbz' => 'Termin1', + 'note' => $dataNote->note, + 'punkte' => $dataNote->punkte, + 'anmerkung' => 'automatisiert aus Zeugnisnote erstellt', + 'insertamum' => date('c'), + 'insertvon' => $authUID, + ]); + + if (isError($resultN)) { + $this->terminateWithError(getError($resultN), self::ERROR_TYPE_GENERAL); + } + $return_code = 3; + } + } + + $note = current(getData($result)); + $uebernahmedatum = new DateTime($note->uebernahmedatum); + $benotungsdatum = new DateTime($note->benotungsdatum); + + $checkDate = $uebernahmedatum === '' || $benotungsdatum > $uebernahmedatum + ? $benotungsdatum + : $uebernahmedatum; + + if ($checkDate >= $this->input->post('datum') && $note !== $note->note) + { + $this->terminateWithSuccess($return_code + 2); + } + $this->terminateWithSuccess($return_code + 2); + } + + /** + * Updates a pruefung + * + * @param pruefung_id + * + * @return success or error + * + * no impact on lehre.tbl_zeugnisnote + */ + public function updatePruefung($pruefung_id) + { + $result = $this->PruefungModel->load($pruefung_id); + + $oldpruefung = $this->getDataOrTerminateWithError($result); + if (!$oldpruefung) + show_404(); // Pruefung that should be updated does not exist + + $authUID = getAuthUID(); + + $this->load->library('form_validation'); + + $this->form_validation->set_rules('lehrveranstaltung_id', $this->p->t('lehre', 'lehrveranstaltung'), 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('lehre', 'lehrveranstaltung')]), + ]); + $this->form_validation->set_rules('lehreinheit_id', $this->p->t('lehre', 'lehreinheit'), 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('lehre', 'lehreinheit')]), + ]); + $this->form_validation->set_rules('pruefungstyp_kurzbz', $this->p->t('lehre', 'pruefung'), 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('global', 'typ')]), + ]); + $this->form_validation->set_rules( + 'datum', + $this->p->t('global', 'datum'), + ['is_valid_date'] + ); + + if ($this->form_validation->run() == false) + { + $this->terminateWithValidationErrors($this->form_validation->error_array()); + } + + $result = $this->PruefungModel->update( + [ + 'pruefung_id' => $pruefung_id + ], + [ 'lehreinheit_id' => $this->input->post('lehreinheit_id'), + 'student_uid' => $this->input->post('student_uid'), + 'mitarbeiter_uid' => $this->input->post('mitarbeiter_uid'), + 'note' => $this->input->post('note'), + 'pruefungstyp_kurzbz' => $this->input->post('pruefungstyp_kurzbz'), + 'datum' => $this->input->post('datum'), + 'anmerkung' => $this->input->post('anmerkung'), + 'updatevon' => $authUID, + 'updateamum' => date('c'), + ] + ); + $this->getDataOrTerminateWithError($result); + + return $this->outputJsonSuccess(true); + } + + /** + * Deletes a pruefung + * + * @param pruefung_id + * + * @return success or error + * + * no impact on lehre.tbl_zeugnisnote + */ + public function deletePruefung($pruefung_id) + { + $result = $this->PruefungModel->load($pruefung_id); + + $oldpruefung = $this->getDataOrTerminateWithError($result); + if (!$oldpruefung) + show_404(); // Pruefung that should be deleted does not exist + + $result = $this->PruefungModel->delete( + [ + 'pruefung_id' => $pruefung_id + ] + ); + + $this->getDataOrTerminateWithError($result); + + return $this->terminateWithSuccess(true); + } + + public function getTypenPruefungen() + { + $this->load->model('education/Pruefungstyp_model', 'PruefungtypModel'); + + //TODO(Manu) sort Termin3 + $this->PruefungtypModel->addOrder('sort', 'ASC'); + $result = $this->PruefungtypModel->loadWhere( + array('abschluss' => 'false') + ); + + if (isError($result)) { + $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); + } + return $this->terminateWithSuccess(getData($result) ?: []); + } + + public function getAllLehreinheiten() + { + $lv_id = $this->input->post('lv_id'); + $studiensemester_kurzbz = $this->input->post('studiensemester_kurzbz'); + + $this->load->model('education/Lehreinheit_model', 'LehreinheitModel'); + + $result = $this->LehreinheitModel->getLesFromLvIds($lv_id, $studiensemester_kurzbz); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + + public function getLvsandLesByStudent($student_uid, $semester_kurzbz=null) + { + $this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel'); + + $result = $this->LehrveranstaltungModel->getLvsByStudent($student_uid, $semester_kurzbz); + + $data = $this->getDataOrTerminateWithError($result); + + $lv_ids = array(); + $allData = array(); + + foreach ($data as $lehrveranstaltung) { + $lv_ids[] = $lehrveranstaltung->lehrveranstaltung_id; + } + + $this->load->model('education/Lehreinheit_model', 'LehreinheitModel'); + + foreach ($lv_ids as $id) + { + $result = $this->LehreinheitModel->getLesFromLvIds($id, $semester_kurzbz); + $data = $this->getDataOrTerminateWithError($result); + + if (is_array($data)) { + $allData = array_merge($allData, $data); + } + } + + return $this->terminateWithSuccess($allData); + } + + public function getLvsAndMas($student_uid) + { + $this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel'); + + $result = $this->LehrveranstaltungModel->getLvsByStudent($student_uid); + + $data = $this->getDataOrTerminateWithError($result); + + $lv_ids = array(); + $allDataMa = array(); + + foreach ($data as $lehrveranstaltung) + { + $lv_ids[] = $lehrveranstaltung->lehrveranstaltung_id; + } + + $this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel'); + + foreach ($lv_ids as $id) + { + $resultMa = $this->MitarbeiterModel->getMitarbeiterFromLV($id); + $dataMa = $this->getDataOrTerminateWithError($resultMa); + + if (is_array($dataMa)) + { + $allDataMa = array_merge($allDataMa, $dataMa); + } + } + return $this->terminateWithSuccess($allDataMa); + } + + public function getLvsByStudent($student_uid, $studiensemester_kurzbz = null) + { + $this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel'); + + $result = $this->LehrveranstaltungModel->getLvsByStudent($student_uid, $studiensemester_kurzbz); + + $data = $this->getDataOrTerminateWithError($result); + + return $this->terminateWithSuccess($data); + } + + public function getMitarbeiterLv($lv_id) + { + $this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel'); + + $result = $this->MitarbeiterModel->getMitarbeiterFromLV($lv_id); + + $data = $this->getDataOrTerminateWithError($result); + + return $this->terminateWithSuccess($data); + } + + public function getNoten() + { + $this->load->model('education/Note_model', 'NoteModel'); + + $this->NoteModel->addOrder('note', 'ASC'); + $result = $this->NoteModel->load(); + + if (isError($result)) { + $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); + } + return $this->terminateWithSuccess(getData($result) ?: []); + } + + public function checkZeugnisnoteLv() + { + $student_uid = $this->input->post('student_uid'); + $studiensemester_kurzbz = $this->input->post('studiensemester_kurzbz'); + $lehrveranstaltung_id = $this->input->post('lehrveranstaltung_id'); + + $this->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel'); + + $result = $this->ZeugnisnoteModel->loadWhere(array( + 'lehrveranstaltung_id' => $lehrveranstaltung_id, + 'student_uid' => $student_uid, + 'studiensemester_kurzbz' => $studiensemester_kurzbz)); + + $data = $this->getDataOrTerminateWithError($result); + + return $this->terminateWithSuccess($data); + } +} diff --git a/application/controllers/api/frontend/v1/stv/Status.php b/application/controllers/api/frontend/v1/stv/Status.php index 074f4029e..8167bd90f 100644 --- a/application/controllers/api/frontend/v1/stv/Status.php +++ b/application/controllers/api/frontend/v1/stv/Status.php @@ -647,15 +647,8 @@ class Status extends FHCAPI_Controller return $this->outputJsonSuccess(true); } - public function loadStatus() + public function loadStatus($prestudent_id, $status_kurzbz, $studiensemester_kurzbz, $ausbildungssemester) { - $_POST = json_decode(utf8_encode($this->input->raw_input_stream), true); - - $prestudent_id = $this->input->post('prestudent_id'); - $status_kurzbz = $this->input->post('status_kurzbz'); - $ausbildungssemester = $this->input->post('ausbildungssemester'); - $studiensemester_kurzbz = $this->input->post('studiensemester_kurzbz'); - $result = $this->PrestudentstatusModel->loadWhere( array( 'prestudent_id' => $prestudent_id, @@ -1344,13 +1337,13 @@ class Status extends FHCAPI_Controller 'updatevon' => $authUID ]; foreach ([ - 'orgform_kurzbz', - 'anmerkung', - 'bewerbung_abgeschicktamum', - 'studienplan_id', - 'rt_stufe', - 'statusgrund_id' - ] as $key) + 'orgform_kurzbz', + 'anmerkung', + 'bewerbung_abgeschicktamum', + 'studienplan_id', + 'rt_stufe', + 'statusgrund_id' + ] as $key) if ($this->input->post($key)) $updateData[$key] = $this->input->post($key); diff --git a/application/controllers/api/frontend/v1/stv/Student.php b/application/controllers/api/frontend/v1/stv/Student.php index 89c317ae4..f805be88a 100644 --- a/application/controllers/api/frontend/v1/stv/Student.php +++ b/application/controllers/api/frontend/v1/stv/Student.php @@ -55,7 +55,7 @@ class Student extends FHCAPI_Controller // Load language phrases $this->loadPhrases([ - 'ui' + 'ui', 'lehre' ]); } @@ -223,12 +223,10 @@ class Student extends FHCAPI_Controller // Check PKs if (count($update_lehrverband) + count($update_student) && $uid === null) { - // TODO(chris): phrase - $this->terminateWithValidationErrors(['' => "Kein/e StudentIn vorhanden!"]); + $this->terminateWithValidationErrors(['' => $this->p->t('lehre', 'error_no_student')]); } if (count($update_person) && $person_id === null) { - // TODO(chris): phrase - $this->terminateWithValidationErrors(['' => "Keine Person vorhanden!"]); + $this->terminateWithValidationErrors(['' => $this->p->t('lehre', 'error_no_person')]); } // Do Updates diff --git a/application/controllers/components/stv/Noten.php b/application/controllers/components/stv/Noten.php deleted file mode 100644 index fb61de065..000000000 --- a/application/controllers/components/stv/Noten.php +++ /dev/null @@ -1,168 +0,0 @@ - 'student/noten:r', - 'getZeugnis' => 'student/noten:r', - 'update' => ['admin:w', 'assistenz:w'] - ]); - - // Load Libraries - $this->load->library('VariableLib', ['uid' => getAuthUID()]); - } - - public function get() - { - $this->load->model('codex/Note_model', 'NoteModel'); - - $result = $this->NoteModel->addOrder('note'); - - $result = $this->NoteModel->load(); - if (isError($result)) { - $this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR); - } - - return $this->outputJson($result); - } - - public function getZeugnis($prestudent_id, $all = null) - { - $this->load->model('crm/Student_model', 'StudentModel'); - $this->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel'); - - $result = $this->StudentModel->loadWhere([ - 'prestudent_id' => $prestudent_id - ]); - if (isError($result)) { - $this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR); - return $this->outputJson($result); - } - if (!hasData($result)) - return $this->outputJsonSuccess(null); - - $student_uid = current(getData($result))->student_uid; - - $studiensemester_kurzbz = ($all === null) ? $this->variablelib->getVar('semester_aktuell') : null; - - $result = $this->ZeugnisnoteModel->getZeugnisnoten($student_uid, $studiensemester_kurzbz); - if (isError($result)) { - $this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR); - } - - return $this->outputJson($result); - } - - public function update() - { - $this->load->model('crm/Student_model', 'StudentModel'); - $this->load->model('organisation/Studienplan_model', 'StudienplanModel'); - $this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel'); - $this->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel'); - - $this->load->library('form_validation'); - - $_POST = json_decode(utf8_encode($this->input->raw_input_stream), true); - - if (empty($_POST) || !is_array(current($_POST))) { - $result = $this->hasPermissionUpdate($this->input->post('lehrveranstaltung_id'), $this->input->post('student_uid')); - if (isError($result)) { - $this->output->set_status_header(REST_Controller::HTTP_FORBIDDEN); - return $this->outputJson($result); - } - - $this->form_validation->set_rules('lehrveranstaltung_id', 'Lehrverantaltung ID', 'required|numeric'); - $this->form_validation->set_rules('student_uid', 'Student UID', 'required'); - $this->form_validation->set_rules('studiensemester_kurzbz', 'Studiensemester Kurzbezeichnung', 'required'); - $this->form_validation->set_rules('note', 'Note', 'required|numeric'); - $post = [$_POST]; - } else { - foreach ($_POST as $i => $data) { - $lvid = isset($data['lehrveranstaltung_id']) ? $data['lehrveranstaltung_id'] : null; - $uid = isset($data['student_uid']) ? $data['student_uid'] : null; - $result = $this->hasPermissionUpdate($lvid, $uid); - if (isError($result)) { - $this->output->set_status_header(REST_Controller::HTTP_FORBIDDEN); - return $this->outputJson($result); - } - - $this->form_validation->set_rules($i . '[lehrveranstaltung_id]', '#' . $i . ' Lehrverantaltung ID', 'required|numeric'); - $this->form_validation->set_rules($i . '[student_uid]', '#' . $i . ' Student UID', 'required'); - $this->form_validation->set_rules($i . '[studiensemester_kurzbz]', '#' . $i . ' Studiensemester Kurzbezeichnung', 'required'); - $this->form_validation->set_rules($i . '[note]', '#' . $i . ' Note', 'required|numeric'); - } - $post = $_POST; - } - if ($this->form_validation->run() == false) { - $this->output->set_status_header(REST_Controller::HTTP_BAD_REQUEST); - return $this->outputJsonError($this->form_validation->error_array()); - } - - $final_result = success(); - $this->ZeugnisnoteModel->db->trans_start(); - - foreach ($post as $i => $data) { - $note = $data['note']; - unset($data['note']); - $result = $this->ZeugnisnoteModel->update($data, [ - 'note' => $note, - 'benotungsdatum' => date('c'), - 'updateamum' => date('c'), - 'updatevon' => getAuthUID() - ]); - if (isError($result)) { - $final_result = $result; - break; - } - } - - $this->ZeugnisnoteModel->db->trans_complete(); - - if (isError($final_result)) { - $this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR); - } - - $this->outputJson($final_result); - } - - protected function hasPermissionUpdate($lehrveranstaltung_id, $student_uid) - { - // TODO(chris): error phrases! - if ($lehrveranstaltung_id === null || $student_uid === null) - return success(); - $result = $this->StudentModel->load([$student_uid]); - if (isError($result)) - return $result; - if (!hasData($result)) - return error('Fehler beim Ermitteln des Studenten'); - $student = current(getData($result)); - - if ($this->permissionlib->isBerechtigt('admin', 'suid', $student->studiengang_kz)) - return success(); - if ($this->permissionlib->isBerechtigt('assistenz', 'suid', $student->studiengang_kz)) - return success(); - - $result = $this->StudienplanModel->getAllOesForLv($lehrveranstaltung_id); - if (isError($result)) - return $result; - $oes = getData($result) ?: []; - $result = $this->LehrveranstaltungModel->getStg($lehrveranstaltung_id); - if (isError($result)) - return $result; - if (hasData($result)) - $oes[] = current(getData($result)); - - foreach ($oes as $oe) { - if ($this->permissionlib->isBerechtigt('admin', 'suid', $oe->oe_kurzbz)) - return success(); - if ($this->permissionlib->isBerechtigt('assistenz', 'suid', $oe->oe_kurzbz)) - return success(); - } - - return error('Forbidden'); - } -} diff --git a/application/controllers/jobs/ReihungstestJob.php b/application/controllers/jobs/ReihungstestJob.php index 996354bb5..9b2532b4b 100644 --- a/application/controllers/jobs/ReihungstestJob.php +++ b/application/controllers/jobs/ReihungstestJob.php @@ -876,7 +876,7 @@ class ReihungstestJob extends JOB_Controller JOIN PUBLIC.tbl_studiengang ON (tbl_prestudent.studiengang_kz = tbl_studiengang.studiengang_kz) WHERE tbl_prestudent.person_id = ".$row_ps->person_id." AND tbl_prestudent.prestudent_id != ".$row_ps->prestudent_id." - AND get_rolle_prestudent (tbl_prestudent.prestudent_id, '".$row_ps->studiensemester_kurzbz."') IN ('Aufgenommener','Bewerber','Wartender') + AND get_rolle_prestudent (tbl_prestudent.prestudent_id, '".$row_ps->studiensemester_kurzbz."') IN ('Aufgenommener','Bewerber','Wartender', 'Student') AND studiensemester_kurzbz = '".$row_ps->studiensemester_kurzbz."' AND tbl_studiengang.typ IN ('b', 'm') AND priorisierung > ".$row_ps->priorisierung." @@ -894,12 +894,22 @@ class ReihungstestJob extends JOB_Controller { foreach ($resultNiedrPrios->retval as $rowNiedrPrios) { - // nur Info wenn aufgenommen oder master - if ($rowNiedrPrios->laststatus == 'Aufgenommener' || $rowNiedrPrios->studiengang_typ == 'm') + // nur Info wenn aufgenommen/student oder master + if ($rowNiedrPrios->laststatus == 'Aufgenommener' || $rowNiedrPrios->laststatus == 'Student' || $rowNiedrPrios->studiengang_typ == 'm') { - // Mail zur Info an Assistenz schicken, dass in höherer Prio aufgenommen wurde - $mailArray[$rowNiedrPrios->studiengang_kz][$rowNiedrPrios->orgform_kurzbz]['AufnahmeHoeherePrio'][] - = $rowNiedrPrios->nachname.' '.$rowNiedrPrios->vorname.' ('.$rowNiedrPrios->prestudent_id.')'; + + if ($rowNiedrPrios->laststatus == 'Aufgenommener') + { + // Mail zur Info an Assistenz schicken, dass in höherer Prio aufgenommen wurde + $mailArray[$rowNiedrPrios->studiengang_kz][$rowNiedrPrios->orgform_kurzbz]['AufnahmeHoeherePrio'][] + = $rowNiedrPrios->nachname.' '.$rowNiedrPrios->vorname.' ('.$rowNiedrPrios->prestudent_id.')'; + } + else if ($rowNiedrPrios->laststatus == 'Student') + { + $mailArray[$rowNiedrPrios->studiengang_kz][$rowNiedrPrios->orgform_kurzbz]['StudentHoeherePrio'][] + = $rowNiedrPrios->nachname.' '.$rowNiedrPrios->vorname.' ('.$rowNiedrPrios->prestudent_id.')'; + } + } elseif ($rowNiedrPrios->laststatus == 'Bewerber' && $row_ps->prestudenstatus_datum > $rowNiedrPrios->datum) { @@ -1061,6 +1071,20 @@ class ReihungstestJob extends JOB_Controller $mailcontent .= ''; $content = true; } + if (isset($value['StudentHoeherePrio']) && !isEmptyArray($value['StudentHoeherePrio'])) + { + $mailcontent .= '

+ Folgende Studenten wurden in einem höher priorisierten Studiengang aufgenommen:

'; + $mailcontent .= ''; + $mailcontent .= ' '; + sort($value['StudentHoeherePrio']); + foreach ($value['StudentHoeherePrio'] AS $key=>$bewerber) + { + $mailcontent .= ''; + } + $mailcontent .= '
'.$bewerber.'
'; + $content = true; + } if (isset($value['AbgewiesenHoeherePrio']) && !isEmptyArray($value['AbgewiesenHoeherePrio'])) { $mailcontent .= '

diff --git a/application/core/Notiz_Controller.php b/application/core/Notiz_Controller.php index 05f70ee85..472ac7669 100644 --- a/application/core/Notiz_Controller.php +++ b/application/core/Notiz_Controller.php @@ -309,6 +309,7 @@ abstract class Notiz_Controller extends FHCAPI_Controller } //update(1) loading all dms-entries with this notiz_id + $dms_id_arr = []; $this->load->model('person/Notizdokument_model', 'NotizdokumentModel'); $this->NotizdokumentModel->addJoin('campus.tbl_dms_version', 'dms_id'); diff --git a/application/helpers/hlp_header_helper.php b/application/helpers/hlp_header_helper.php index ea1795ad5..14f7ed338 100644 --- a/application/helpers/hlp_header_helper.php +++ b/application/helpers/hlp_header_helper.php @@ -87,18 +87,28 @@ function generateCSSsInclude($CSSs) */ function generateJSDataStorageObject($indexPage, $calledPath, $calledMethod) { + $ci =& get_instance(); + $ci->load->model('system/Sprache_model','SpracheModel'); + $server_language = getData($ci->SpracheModel->loadWhere(['content' => true])); + $server_language = array_map(function($language){ + return ['sprache'=>$language->sprache, 'LC_Time'=>$language->locale, 'bezeichnung'=>$language->bezeichnung[$language->index-1]]; + }, $server_language); $user_language = getUserLanguage(); + $FHC_JS_DATA_STORAGE_OBJECT = array( + 'app_root' => APP_ROOT, + 'ci_router' => $indexPage, + 'called_path' => $calledPath, + 'called_method' => $calledMethod, + 'server_languages' => $server_language, + 'user_language' => $user_language, + 'timezone' => date_default_timezone_get(), + ); + $toPrint = "\n"; $toPrint .= ''; $toPrint .= "\n\n"; diff --git a/application/libraries/CmsLib.php b/application/libraries/CmsLib.php index b65e2a71c..355cf7c56 100644 --- a/application/libraries/CmsLib.php +++ b/application/libraries/CmsLib.php @@ -43,7 +43,7 @@ class CmsLib * @param string $sprache * @param boolean $sichtbar * - * @return void + * @return stdClass */ public function getContent($content_id, $version = null, $sprache = null, $sichtbar = true) { @@ -105,7 +105,19 @@ class CmsLib if($content->titel){ $betreff = $content->titel; }else{ + //DomDocument getElementsByTagName returns a DomNodeList $betreff = $XML->getElementsByTagName('betreff'); + //check if any betreff was found and if it is not empty + if($betreff->length > 0 && !empty($betreff->item(0)->nodeValue)) + { + //DomNodeList item() return a DomNode, property nodeValue contains the value of the node + $betreff = $betreff->item(0)->nodeValue; + + } + else + { + return error('no betreff found for the content'); + } } $xsltemplate = new DOMDocument(); @@ -221,7 +233,7 @@ class CmsLib * * @return void */ - public function getNews($infoscreen = false, $studiengang_kz = null, $semester = null, $mischen = true, $titel = '', $edit = false, $sichtbar = true, $page = 1, $page_size = 10) + public function getNews($infoscreen = false, $studiengang_kz = null, $semester = null, $mischen = true, $titel = '', $edit = false, $sichtbar = true, $page = 1, $page_size = 10, $sprache) { $this->ci->load->model('organisation/Studiengang_model', 'StudiengangModel'); list($studiengang_kz, $semester) = $this->getStgAndSem($studiengang_kz, $semester); @@ -230,13 +242,13 @@ class CmsLib $xml = ''; $this->ci->load->model('content/News_model', 'NewsModel'); - $news = $this->ci->NewsModel->getNewsWithContent(getSprache(), $studiengang_kz, $semester, null, $sichtbar, 0, $page, $page_size, $all, $mischen); + $news = $this->ci->NewsModel->getNewsWithContent($sprache, $studiengang_kz, $semester, null, $sichtbar, 0, $page, $page_size, $all, $mischen); if (isError($news)) return $news; $news = getData($news); - //var_dump($news->maxPageCount); + foreach ($news as $newsobj) { if ($studiengang_kz && $edit && !$newsobj->studiengang_kz) continue; @@ -247,7 +259,7 @@ class CmsLib $xml .= "" . $newsobj->content . $datum . $id . ""; } - if ($studiengang_kz != 0) { + /* if ($studiengang_kz != 0) { $stg_obj = $this->ci->StudiengangModel->load($studiengang_kz); if (isError($stg_obj)) return $stg_obj; @@ -262,7 +274,7 @@ class CmsLib } $xml .= 'bezeichnung . ']]>'; } - } + } */ if ($titel != '') { $xml .= '' . $titel . ''; diff --git a/application/libraries/DocumentExportLib.php b/application/libraries/DocumentExportLib.php new file mode 100644 index 000000000..595ac461a --- /dev/null +++ b/application/libraries/DocumentExportLib.php @@ -0,0 +1,714 @@ +vorlage_kurzbz, $oe_kurzbz, $version); + * $doc->setFilename($filename); + * $doc->addDataXML($data); + * $doc->addImage($imagepath, $imagename, $imagecontenttype); + * $doc->create($outputformat); + * $doc->output(true); + * $doc->close(); + * + * New: + * $xml_data = $this->documentexportlib->getDataXML($data); + * $images = [[ + * 'path' => $imagepath, + * 'name' => $imagename, + * 'contenttype' => $imagecontenttype + * ]]; + * $this->documentexportlib->showContent( + * $filename, + * $vorlage, + * $xml_data, + * $oe_kurzbz, + * $version, + * $outputformat, + * null, + * null, + * $images + * ); + */ +class DocumentExportLib +{ + private $unoconv_version; + + /** + * Constructor + */ + public function __construct() + { + // Gets CI instance + $this->ci =& get_instance(); + + // Load Phrases + $this->ci->load->library('PhrasesLib', ['document_export', null], 'documentExportPhrases'); + + // Which document converter has to be used + if (defined('DOCSBOX_ENABLED') && DOCSBOX_ENABLED === true) + { + // Use docsbox!! + } + else + { + exec('unoconv --version', $ret_arr); + + if(isset($ret_arr[0])) + { + $hlp = explode(' ', $ret_arr[0]); + if(isset($hlp[1])) + { + $this->unoconv_version = $hlp[1]; + } + else + show_error($this->ci->documentExportPhrases->t("document_export", "error_unoconv_version")); + } + else + show_error($this->ci->documentExportPhrases->t("document_export", "error_unoconv")); + } + } + + /** + * Laedt die XML Daten fuer die XSL Transformation anhand eines Arrays + * + * @param array $data Array mit Daten + * @param string $root Bezeichnung des Root Nodes + * + * @return DOMDocument + */ + public function getDataArray($data, $root) + { + $xml_data = new DOMDocument(); + $xml_data->loadXML($this->convertArrayToXML($data, $root)); + return $xml_data; + } + + /** + * XML Daten fuer die XSL Transformation + * + * @param string $xml + * + * @return DOMDocument + */ + public function getDataXML($xml) + { + $xml_data = new DOMDocument(); + $xml_data->loadXML($xml); + return $xml_data; + } + + /** + * URL zu XML Datei die fuer XSLTransformation verwendet werden soll + * + * @param string $xml URL to XML + * @param string $params GET parameter + * + * @return stdClass + */ + public function getDataURL($xml, $params) + { + $xml_found = false; + + $aktive_addons = array_filter(array_map('trim', explode(";", ACTIVE_ADDONS))); + foreach($aktive_addons as $addon) { + $xmlfile = DOC_ROOT . 'addons/' . $addon . '/rdf/' . $xml; + if (file_exists($xmlfile)) { + $xml_found = true; + $xml_url = XML_ROOT . '../addons/' . $addon . '/rdf/' . $xml . '?' . $params; + break; + } + } + if (!$xml_found) + $xml_url = XML_ROOT . $xml . '?' . $params; + + + // Load the XML source + $xml_data = new DOMDocument; + + if (!$xml_data->load($xml_url)) + return error($this->ci->documentExportPhrases->t("document_export", "error_xml_load", [ + "url" => $xml_url, + "xml" => $xml, + "params" => $params + ])); + + return success($xml_data); + } + + /** + * Adds a XML Tag for signatur to the document + * + * @param DomDocument $xml_data + * + * @return void + */ + protected function addSignToData($xml_data) + { + $signblock = $xml_data->createElement("signed", "true"); + $xml_data->documentElement->appendChild($signblock); + } + + /** + * Adds a XML Tag for archive to the document + * + * @param DomDocument $xml_data + * + * @return void + */ + public function addArchiveToData($xml_data) + { + $archiv = $xml_data->createElement("archivierbar", "true"); + $xml_data->documentElement->appendChild($archiv); + } + + /** + * Get the contents of a Document + * + * @param stdClass $vorlage A db entry from tbl_vorlage + * @param DomDocument $xml_data + * @param string $oe_kurzbz + * @param integer|null $version (optional) + * @param string $outputformat (optional) + * @param string $sign_user (optional) Must be a valid uid + * @param string $sign_profile (optional) Signatureprofile for signing + * @param array $images (optional) Each element should have a property path, name & contenttype which are all strings + * + * @return stdClass + */ + public function getContent( + $vorlage, + $xml_data, + $oe_kurzbz, + $version = null, + $outputformat = null, + $sign_user = null, + $sign_profile = null, + $images = [] + ) { + $source_folder = getcwd(); + $temp_folder = sys_get_temp_dir() . '/fhcunoconv-' . uniqid(); + + $outputformat = $this->getDefaultOutputFormat($outputformat, $vorlage->mimetype); + + $result = $this->createAndSignContent( + $temp_folder, + $outputformat, + $vorlage, + $oe_kurzbz, + $version, + $xml_data, + $images, + $sign_user, + $sign_profile + ); + if (isError($result)) { + $this->close($temp_folder, $source_folder); + return $result; + } + $temp_filename = getData($result); + + $fsize = filesize($temp_filename); + $handle = fopen($temp_filename, 'r'); + if (!$handle) + return error($this->ci->documentExportPhrases->t("document_export", "error_file_load")); + $result = fread($handle, $fsize); + fclose($handle); + + $this->close($temp_folder, $source_folder); + + return success($result); + } + + /** + * Sets the headers and displays the Document. + * On failure the exit() function will be called + * + * @param string $filename + * @param stdClass $vorlage A db entry from tbl_vorlage + * @param DomDocument $xml_data + * @param string $oe_kurzbz + * @param integer|null $version (optional) + * @param string $outputformat (optional) + * @param string $sign_user (optional) Must be a valid uid + * @param string $sign_profile (optional) Signatureprofile for signing + * @param array $images (optional) Each element should have a property path, name & contenttype which are all strings + * + * @return void + */ + public function showContent( + $filename, + $vorlage, + $xml_data, + $oe_kurzbz, + $version = null, + $outputformat = null, + $sign_user = null, + $sign_profile = null, + $images = [] + ) { + $source_folder = getcwd(); + $temp_folder = sys_get_temp_dir() . '/fhcunoconv-' . uniqid(); + + $outputformat = $this->getDefaultOutputFormat($outputformat, $vorlage->mimetype); + + $result = $this->createAndSignContent( + $temp_folder, + $outputformat, + $vorlage, + $oe_kurzbz, + $version, + $xml_data, + $images, + $sign_user, + $sign_profile + ); + if (isError($result)) { + $this->close($temp_folder, $source_folder); + exit(getError($result)); + } + $temp_filename = getData($result); + + $fsize = filesize($temp_filename); + $handle = fopen($temp_filename, 'r'); + if (!$handle) { + $this->close($temp_folder, $source_folder); + exit($this->ci->documentExportPhrases->t("document_export", "error_file_load")); + } + + if (headers_sent()) { + $this->close($temp_folder, $source_folder); + exit($this->ci->documentExportPhrases->t("document_export", "error_headers")); + } + + switch ($outputformat) { + case 'pdf': + header('Content-type: application/pdf'); + header('Content-Disposition: attachment; filename="' . $filename . '.pdf"'); + header('Content-Length: ' . $fsize); + break; + + case 'doc': + header('Content-type: application/vnd.ms-word'); + header('Content-Disposition: attachment; filename="' . $filename . '.doc"'); + header('Content-Length: ' . $fsize); + break; + + case 'odt': + header('Content-type: application/vnd.oasis.opendocument.text'); + header('Content-Disposition: attachment; filename="' . $filename . '.odt"'); + header('Content-Length: ' . $fsize); + break; + default: + $this->close($temp_folder, $source_folder); + exit($this->ci->documentExportPhrases->t("document_export", "error_outputformat_missing")); + } + + while (!feof($handle)) { + echo fread($handle, 8192); + } + fclose($handle); + + $this->close($temp_folder, $source_folder); + } + + /** + * Helper function for getContent and showContent. + * Creates the temp folder and calls create and sign functions. + * + * @param string $temp_folder + * @param string $outputformat + * @param stdClass $vorlage + * @param string $oe_kurzbz + * @param integer $version + * @param DomDocument $xml_data + * @param array $images Each element should have a property path, name and contenttype which are all strings + * @param string $sign_user Must be a valid uid + * @param string $sign_profile Signatureprofile for signing + * + * @return stdClass + */ + protected function createAndSignContent( + $temp_folder, + $outputformat, + $vorlage, + $oe_kurzbz, + $version, + $xml_data, + $images, + $sign_user, + $sign_profile + ) { + mkdir($temp_folder); + chdir($temp_folder); + + $this->ci->load->model('system/Vorlagestudiengang_model', 'VorlagestudiengangModel'); + + $result = $this->ci->VorlagestudiengangModel->getCurrent($vorlage->vorlage_kurzbz, $oe_kurzbz, $version); + if (isError($result)) + return $result; + if (!hasData($result)) + return error($this->ci->documentExportPhrases->t("document_export", "error_template_missing")); + $vorlage_stg = current(getData($result)); + foreach ($vorlage_stg as $k => $v) + $vorlage->$k = $v; + + $result = $this->create($temp_folder, $outputformat, $vorlage, $xml_data, $images); + if (isError($result)) + return $result; + + $temp_filename = getData($result); + + if ($sign_user) { + $this->addSignToData($xml_data); + + $result = $this->sign($temp_folder, $temp_filename, $outputformat, $sign_user, $sign_profile); + if (isError($result)) + return $result; + + $temp_filename = getData($result); + } + + return success($temp_filename); + } + + /** + * Helper function for createAndSignContent. + * Creates the files in the temp folder. + * + * @param string $temp_folder + * @param string $outputformat + * @param stdClass $vorlage + * @param DomDocument $xml_data + * @param array $images Each element should have a property path, name and contenttype which are all strings + * + * @return stdClass + */ + protected function create($temp_folder, $outputformat, $vorlage, $xml_data, $images) + { + $content_xsl = new DOMDocument(); + if (!$content_xsl->loadXML($vorlage->text)) + return error($this->ci->documentExportPhrases->t("document_export", "error_xsl_load")); + + $proc = new XSLTProcessor(); + $proc->importStyleSheet($content_xsl); + + $contentbuffer = $proc->transformToXml($xml_data); + + file_put_contents($temp_folder . '/content.xml', $contentbuffer); + + if ($xml_data->firstChild->tagName == 'error') + return error($xml_data->firstChild->textContent); + + // styles.xml erstellen + if ($vorlage->style) { + $styles_xsl = new DOMDocument(); + if (!$styles_xsl->loadXML($vorlage->style)) + return error($this->ci->documentExportPhrases->t("document_export", "error_styles_load")); + $style_proc = new XSLTProcessor(); + $style_proc->importStyleSheet($styles_xsl); + + $stylesbuffer = $style_proc->transformToXml($xml_data); + + file_put_contents($temp_folder . '/styles.xml', $stylesbuffer); + } + + // Template holen + $vorlage_found = false; + $vorlage_filename = $vorlage->vorlage_kurzbz . ($vorlage->mimetype == 'application/vnd.oasis.opendocument.spreadsheet' ? '.ods' : '.odt'); + + $aktive_addons = array_filter(array_map('trim', explode(";", ACTIVE_ADDONS))); + foreach($aktive_addons as $addon) { + $zipfile = DOC_ROOT . 'addons/' . $addon . '/system/vorlage_zip/' . $vorlage_filename; + + if (file_exists($zipfile)) { + $vorlage_found = true; + break; + } + } + if (!$vorlage_found) + $zipfile = DOC_ROOT . 'system/vorlage_zip/' . $vorlage_filename; + + $tempname_zip = $temp_folder . '/out.zip'; + + if (!copy($zipfile, $tempname_zip)) + return error($this->ci->documentExportPhrases->t("document_export", "error_file_copy")); + + exec("zip $tempname_zip content.xml"); + if (!is_null($styles_xsl)) + exec("zip $tempname_zip styles.xml"); + + // bilder hinzufuegen + if (count($images) > 0) + { + // Unterordner fuer die Bilder erstellen + mkdir('Pictures'); + + // Manifest Datei holen + exec('unzip ' . $tempname_zip . ' META-INF/manifest.xml'); + + // Bild zur Manifest Datei hinzufuegen + $manifest = file_get_contents('META-INF/manifest.xml'); + + $manifest_xml = new DOMDocument; + if (!$manifest_xml->loadXML($manifest)) + return error($this->ci->documentExportPhrases->t("document_export", "error_manifest")); + + //root-node holen + $root = $manifest_xml->getElementsByTagName('manifest')->item(0); + + foreach ($images as $bild) { + copy($bild['path'], 'Pictures/' . $bild['name']); + + //Neues Element unterhalb des Root Nodes anlegen + $node = $manifest_xml->createElement("manifest:file-entry"); + $node->setAttribute("manifest:full-path", 'Pictures/' . $bild['name']); + $node->setAttribute("manifest:media-type", $bild['contenttype']); + $root->appendChild($node); + } + + $out = $manifest_xml->saveXML(); + + //geaenderte Manifest Datei speichern und wieder ins Zip packen + file_put_contents('META-INF/manifest.xml', $out); + exec('zip ' . $tempname_zip . ' META-INF/*'); + + // Bilder zum ZIP-File hinzufuegen + exec('zip ' . $tempname_zip . ' Pictures/*'); + } + + clearstatcache(); + + switch ($outputformat) { + case 'pdf': + case 'doc': + $ret = 0; + $temp_filename = $temp_folder . '/out.' . $outputformat; + + if (defined('DOCSBOX_ENABLED') && DOCSBOX_ENABLED === true) { + // Use docsbox + + $this->ci->load->library("DocsboxLib"); + + $docboxlib = get_class($this->ci->docboxlib); + + $ret = $docboxlib::convert($tempname_zip, $temp_filename, $outputformat); + } else { + // Use unoconv + + // Unoconv Version 0.6 hat eine Bug wodurch die Berechtigungen des PDF/Doc nicht korrekt gesetzt + // werden. Deshalb wird dies hier speziell behandelt. + // Die 2. Variante hat den Vorteil dass hier eine bessere Fehlerbehandlung moeglich ist + if ($this->unoconv_version == '0.6') + $command = 'unoconv -e IsSkipEmptyPages=false -f ' . $outputformat . ' %2$s > %1$s'; + else + $command = 'unoconv -e IsSkipEmptyPages=false -f ' . $outputformat . ' --output %s %s 2>&1'; + + $command = sprintf($command, $temp_filename, $tempname_zip); + + exec($command, $out, $ret); + } + + if ($ret) + return error($this->ci->documentExportPhrases->t("document_export", "error_conv_timeout")); + break; + case 'odt': + default: + $temp_filename = $tempname_zip; + } + + return success($temp_filename); + } + + /** + * Helper function for createAndSignContent. + * Signs the main file in the temp folder. + * + * @param string $temp_folder + * @param string $temp_filename + * @param string $outputformat + * @param string $user Must be a valid uid + * @param string $profile Signatureprofile for signing + * + * @return stdClass + */ + protected function sign($temp_folder, $temp_filename, $outputformat, $user, $profile) + { + if ($outputformat != 'pdf') + return error($this->ci->documentExportPhrases->t("document_export", "error_sign_pdf")); + + // Load the File + $file_data = file_get_contents($temp_filename); + + $data = new stdClass(); + $data->document = base64_encode($file_data); + + // Signatur Profil + if (!is_null($profile)) + $data->profile = $profile; + else + $data->profile = SIGNATUR_DEFAULT_PROFILE; + + // Username des Endusers der die Signatur angefordert hat + $data->user = $user; + + $ch = curl_init(); + + curl_setopt($ch, CURLOPT_URL, SIGNATUR_URL . '/' . SIGNATUR_SIGN_API); + curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 7); + curl_setopt($ch, CURLOPT_USERAGENT, "FH-Complete"); + + // SSL Zertifikatsprüfung deaktivieren + // Besser ist es das Zertifikat am Server zu installieren! + //curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); + //curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + + $data_string = json_encode($data, JSON_FORCE_OBJECT); + + curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); + curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_HTTPHEADER, [ + 'Content-Type: application/json', + 'Content-Length:' . mb_strlen($data_string), + 'Authorization: Basic ' . base64_encode(SIGNATUR_USER . ":" . SIGNATUR_PASSWORD) + ]); + + $result = curl_exec($ch); + if (curl_errno($ch)) { + curl_close($ch); + return error($this->ci->documentExportPhrases->t("document_export", "error_sign_timeout")); + } + curl_close($ch); + $resultdata = json_decode($result); + + // If it is success + if (isset($resultdata->error) && $resultdata->error == 0) { + $signed_filename = $temp_folder . '/signed.pdf'; + file_put_contents($signed_filename, base64_decode($resultdata->retval)); + return success($signed_filename); + } + + // otherwise if it is an error + return error($resultdata->retval ?? $this->ci->documentExportPhrases->t("global", "unknown_error", ["error" => $result])); + } + + /** + * Deletes all files in the $temp_folder and changes back to the source_folder + * + * @param string $temp_folder + * @param string $source_folder + * + * @return void + */ + protected function close($temp_folder, $source_folder) + { + $files = glob($temp_folder . '/*'); // get all file names + foreach ($files as $file) + if (is_file($file)) + unlink($file); + + chdir($source_folder); + rmdir($temp_folder); + } + + /** + * Convert an array to XML + * + * @param array $data + * @param string $root + * @param SimpleXMLElement $xml_data + * + * @return string|boolean + */ + private function convertArrayToXML($data, $root = null, $xml_data = null) + { + $_xml_data = $xml_data; + if ($_xml_data === null) + $_xml_data = new SimpleXMLElement($root !== null ? '<' . $root . ' />' : ''); + + foreach ($data as $key => $value) { + if (is_array($value)) { + if (is_numeric($key)) { + $key = 'item' . $key; // dealing with <0/>.. issues + $this->convertArrayToXML($value, null, $_xml_data); + } else { + $subnode = $_xml_data->addChild($key); + $this->convertArrayToXML($value, null, $subnode); + } + } else { + // Remove UTF8 Control Characters (breaking XML) + $value = preg_replace('/[\x00-\x1F\x7F]/u', '', $value); + $_xml_data->addChild((string)$key, htmlspecialchars("$value")); + } + } + + return $_xml_data->asXML(); + } + + /** + * Get default outputformat from mimetype if its not set + * + * @param string $outputformat + * @param string $mimetype + * + * @return string + */ + private function getDefaultOutputFormat($outputformat, $mimetype) + { + if ($outputformat) + return $outputformat; + + if ($mimetype == 'application/vnd.oasis.opendocument.spreadsheet') + return 'ods'; + if ($mimetype == 'application/vnd.oasis.opendocument.text') + return 'odt'; + + return 'pdf'; + } +} diff --git a/application/libraries/FilterCmptLib.php b/application/libraries/FilterCmptLib.php index c1a2b47cb..272899de6 100644 --- a/application/libraries/FilterCmptLib.php +++ b/application/libraries/FilterCmptLib.php @@ -371,21 +371,21 @@ class FilterCmptLib foreach ($filterFields as $filterField) { // If not an empty array - if ($filterField != null) + if (!isEmptyArray($filterField)) { // - if (isset($filterField->name) && isset($filterField->operation) && isset($filterField->condition) - && !isEmptyString($filterField->name) && !isEmptyString($filterField->operation) - && !isEmptyString($filterField->condition)) + if (isset($filterField['name']) && isset($filterField['operation']) && isset($filterField['condition']) + && !isEmptyString($filterField['name']) && !isEmptyString($filterField['operation']) + && !isEmptyString((string)$filterField['condition'])) { // Fine $filter = new stdClass(); - $filter->name = $filterField->name; - $filter->operation = $filterField->operation; - $filter->condition = $filterField->condition; - if (isset($filterField->option) && !isEmptyString($filterField->option)) + $filter->name = $filterField['name']; + $filter->operation = $filterField['operation']; + $filter->condition = $filterField['condition']; + if (isset($filterField['option']) && !isEmptyString($filterField['option'])) { - $filter->option = $filterField->option; + $filter->option = $filterField['option']; } else { @@ -1173,4 +1173,4 @@ class FilterCmptLib return $filterName; } -} \ No newline at end of file +} diff --git a/application/models/codex/Bisio_model.php b/application/models/codex/Bisio_model.php index 1cff1dc54..5ecd4bb51 100644 --- a/application/models/codex/Bisio_model.php +++ b/application/models/codex/Bisio_model.php @@ -44,4 +44,27 @@ class Bisio_model extends DB_Model else return success("Bisio not found"); } + + /** + * checks, if an (extension) table exists to avoid later errors + * @param String $schema like 'extension' + * @param String $table like 'tbl_mo_bisiozuordnung' + * @return boolean + */ + public function tableExists($schema, $table) + { + $params = array($schema, $table); + + $qry = "SELECT + 1 + FROM + information_schema.role_table_grants + WHERE + table_schema = ? + AND table_name = ?"; + + $result = $this->execQuery($qry, $params); + + return $result; + } } diff --git a/application/models/codex/Bisstandort_model.php b/application/models/codex/Bisstandort_model.php new file mode 100644 index 000000000..9c7e9e45b --- /dev/null +++ b/application/models/codex/Bisstandort_model.php @@ -0,0 +1,14 @@ +dbTable = 'bis.tbl_bisstandort'; + $this->pk = 'standort_code'; + } +} diff --git a/application/models/content/News_model.php b/application/models/content/News_model.php index 0700a7057..ad8ecab99 100644 --- a/application/models/content/News_model.php +++ b/application/models/content/News_model.php @@ -21,7 +21,7 @@ class News_model extends DB_Model { $this->addJoin("campus.tbl_content","content_id"); return $this->execReadOnlyQuery(' - SELECT * + SELECT *, TO_CHAR(campus.tbl_news.datum, ?) as datumformatted FROM campus.tbl_news JOIN campus.tbl_content content ON content.content_id = campus.tbl_news.content_id WHERE @@ -29,7 +29,7 @@ class News_model extends DB_Model datum <= NOW() AND (datum_bis IS NULL OR datum_bis >= now()::date) ORDER BY datum DESC LIMIT ' . $this->escape($limit) - ); + , ['DD/MM/YYYY']); } public function getNewsContentIDs($limit=10){ diff --git a/application/models/crm/Prestudentstatus_model.php b/application/models/crm/Prestudentstatus_model.php index 5f3c8400e..de91319b9 100644 --- a/application/models/crm/Prestudentstatus_model.php +++ b/application/models/crm/Prestudentstatus_model.php @@ -501,17 +501,14 @@ class Prestudentstatus_model extends DB_Model $this->addSelect('tbl_prestudentstatus.studiensemester_kurzbz'); $this->addSelect('tbl_prestudentstatus.ausbildungssemester'); $this->addSelect('tbl_prestudentstatus.datum'); - $this->addSelect("TO_CHAR(tbl_prestudentstatus.datum::timestamp, 'DD.MM.YYYY') AS format_datum"); $this->addSelect('tbl_prestudentstatus.insertamum'); $this->addSelect('tbl_prestudentstatus.insertvon'); $this->addSelect('tbl_prestudentstatus.updateamum'); $this->addSelect('tbl_prestudentstatus.updatevon'); $this->addSelect('tbl_prestudentstatus.orgform_kurzbz'); $this->addSelect('tbl_prestudentstatus.bestaetigtam'); - $this->addSelect("TO_CHAR(tbl_prestudentstatus.bestaetigtam::timestamp, 'DD.MM.YYYY') AS format_bestaetigtam"); $this->addSelect('tbl_prestudentstatus.bestaetigtvon'); $this->addSelect('tbl_prestudentstatus.bewerbung_abgeschicktamum'); - $this->addSelect("TO_CHAR(tbl_prestudentstatus.bewerbung_abgeschicktamum::timestamp, 'DD.MM.YYYY') AS format_bewerbung_abgeschicktamum"); $this->addSelect('tbl_prestudentstatus.anmerkung'); $this->addSelect('plan.studienplan_id'); $this->addSelect('plan.bezeichnung'); diff --git a/application/models/education/Abschlusspruefung_model.php b/application/models/education/Abschlusspruefung_model.php index 268e786cb..0ba8fd55c 100644 --- a/application/models/education/Abschlusspruefung_model.php +++ b/application/models/education/Abschlusspruefung_model.php @@ -113,4 +113,61 @@ class Abschlusspruefung_model extends DB_Model return success($abschlusspruefungdata); } + + /** + * Gets data of an Abschlusspruefung + * @param $student_uid + * @return object + */ + public function getAbschlusspruefungForPrestudent($student_uid) + { + $qry = " + SELECT + exam.*, + CONCAT( + person_pruefer1.nachname || ' ', + person_pruefer1.vorname, + COALESCE(' ' || person_pruefer1.titelpre) + ) AS person_pruefer1, + CONCAT( + person_pruefer2.nachname || ' ', + person_pruefer2.vorname, + COALESCE(' ' || person_pruefer2.titelpre) + ) AS person_pruefer2, + CONCAT( + person_pruefer3.nachname || ' ', + person_pruefer3.vorname, + COALESCE(' ' || person_pruefer3.titelpre) + ) AS person_pruefer3, + CONCAT( + person_vorsitzender.nachname || ' ', + person_vorsitzender.vorname, + COALESCE(' ' || person_vorsitzender.titelpre) + ) AS person_vorsitzender, + datum, + freigabedatum, + sponsion, + uhrzeit, + person_pruefer1.nachname as p1_nachname, + person_pruefer2.nachname as p2_nachname, + person_pruefer3.nachname as p3_nachname, + person_vorsitzender.nachname as vorsitz_nachname, + beurteilung.bezeichnung as beurteilung_bezeichnung, + antritt.bezeichnung as antritt_bezeichnung + FROM + lehre.tbl_abschlusspruefung exam + JOIN lehre.tbl_pruefungstyp USING (pruefungstyp_kurzbz) + LEFT JOIN public.tbl_benutzer ben_vorsitzender ON (ben_vorsitzender.uid = vorsitz) + LEFT JOIN public.tbl_person person_vorsitzender ON (ben_vorsitzender.person_id = person_vorsitzender.person_id) + LEFT JOIN public.tbl_person person_pruefer1 ON (person_pruefer1.person_id = pruefer1) + LEFT JOIN public.tbl_person person_pruefer2 ON (person_pruefer2.person_id = pruefer2) + LEFT JOIN public.tbl_person person_pruefer3 ON (person_pruefer3.person_id = pruefer3) + LEFT JOIN lehre.tbl_abschlussbeurteilung beurteilung USING (abschlussbeurteilung_kurzbz) + LEFT JOIN lehre.tbl_abschlusspruefung_antritt antritt USING (pruefungsantritt_kurzbz) + WHERE student_uid = ? + ORDER BY exam.datum DESC + "; + + return $this->execQuery($qry, array('student_uid' => $student_uid)); + } } diff --git a/application/models/education/Akadgrad_model.php b/application/models/education/Akadgrad_model.php new file mode 100644 index 000000000..92762a525 --- /dev/null +++ b/application/models/education/Akadgrad_model.php @@ -0,0 +1,14 @@ +dbTable = 'lehre.tbl_akadgrad'; + $this->pk = 'akadgrad_id'; + } +} \ No newline at end of file diff --git a/application/models/education/Anwesenheit_model.php b/application/models/education/Anwesenheit_model.php index 80a1fc111..b2c78fe02 100644 --- a/application/models/education/Anwesenheit_model.php +++ b/application/models/education/Anwesenheit_model.php @@ -11,4 +11,193 @@ class Anwesenheit_model extends DB_Model $this->dbTable = 'campus.tbl_anwesenheit'; $this->pk = 'anwesenheit_id'; } + + /** + * Laedt die Anwesenheiten in Prozent von Studierenden bei Lehrveranstaltungen + * Wenn die StudentUID uebergeben wird, werden alle Lehrveranstaltungen zu denen der Studierenden zugeteilt ist inkl Prozent der Anwesenheit + * Wenn die LehrveranstaltungID uebergeben wird, werden alle Studierenden geholt die zugeteilt sind inkl Prozent der Anwesenheit + * Es werden pro Student die Anwesenheiten berechnet aufgrund der Lehreinheit zu der sie zugeordnet sind + * + * @param string $studiensemester_kurzbz + * @param string|null (optional) $student_uid + * @param integer|null (optional) $lehrveranstaltung_id + * + * @return stdClass + */ + public function loadAnwesenheitStudiensemester($studiensemester_kurzbz, $student_uid = null, $lehrveranstaltung_id = null) + { + $this->addSelect("vorname"); + $this->addSelect("nachname"); + $this->addSelect("wahlname"); + $this->addSelect("lehrveranstaltung_id"); + $this->addSelect("bezeichnung"); + $this->addSelect("gruppe"); + $this->addSelect("student_uid AS uid"); + $this->addSelect("COUNT(stundenplan_id) AS gesamtstunden"); + $this->addSelect("COALESCE(anwesend.summe, 0) AS anwesend"); + $this->addSelect("COALESCE(nichtanwesend.summe, 0) AS nichtanwesend"); + $this->addSelect("COALESCE(anwesend.summe, 0) + COALESCE(nichtanwesend.summe, 0) AS erfassteanwesenheit"); + $this->addSelect("CASE + WHEN COUNT(stundenplan_id) = 0 OR COALESCE(anwesend.summe, 0) + COALESCE(nichtanwesend.summe, 0) = 0 + THEN 100 + ELSE TRUNC(100-(100/COUNT(stundenplan_id)*COALESCE(nichtanwesend.summe, 0)), 2) + END AS prozent"); + + + $this->db->join("( + SELECT + semester::text AS gruppe, + public.tbl_studentlehrverband.studiensemester_kurzbz, + student_uid, + studiengang_kz + FROM public.tbl_studentlehrverband + WHERE studiensemester_kurzbz = " . $this->escape($studiensemester_kurzbz) . " + + UNION + + SELECT + semester || verband AS gruppe, + public.tbl_studentlehrverband.studiensemester_kurzbz, + student_uid, + studiengang_kz + FROM public.tbl_studentlehrverband + WHERE studiensemester_kurzbz = " . $this->escape($studiensemester_kurzbz) . " + + UNION + + SELECT + semester || verband || gruppe AS gruppe, + public.tbl_studentlehrverband.studiensemester_kurzbz, + student_uid, + studiengang_kz + FROM public.tbl_studentlehrverband + WHERE studiensemester_kurzbz = " . $this->escape($studiensemester_kurzbz) . " + + UNION + + SELECT + gruppe_kurzbz AS gruppe, + public.tbl_benutzergruppe.studiensemester_kurzbz, + uid AS student_uid, + studiengang_kz + FROM public.tbl_benutzergruppe + JOIN public.tbl_gruppe USING (gruppe_kurzbz) + WHERE studiensemester_kurzbz = " . $this->escape($studiensemester_kurzbz) . " + ) a", "gruppe,studiensemester_kurzbz,studiengang_kz", "", false); + $this->addJoin("public.tbl_benutzer b", "b.uid = student_uid"); + $this->addJoin("public.tbl_person p", "person_id"); + $this->db->join("( + SELECT + lehrveranstaltung_id, + studiensemester_kurzbz, uid AS student_uid, + SUM(einheiten) AS summe + FROM campus.tbl_anwesenheit a + JOIN lehre.tbl_lehreinheit le USING (lehreinheit_id) + JOIN lehre.tbl_lehrveranstaltung lv USING (lehrveranstaltung_id) + WHERE anwesend = TRUE + AND studiensemester_kurzbz = " . $this->escape($studiensemester_kurzbz) . " + GROUP BY + lehrveranstaltung_id, + bezeichnung, + uid, + studiensemester_kurzbz + ) anwesend", "lehrveranstaltung_id,student_uid,studiensemester_kurzbz", "LEFT", false); + $this->db->join("( + SELECT + lehrveranstaltung_id, + studiensemester_kurzbz, + uid AS student_uid, + SUM(einheiten) AS summe + FROM campus.tbl_anwesenheit a + JOIN lehre.tbl_lehreinheit le USING (lehreinheit_id) + JOIN lehre.tbl_lehrveranstaltung lv USING (lehrveranstaltung_id) + WHERE anwesend = FALSE + AND studiensemester_kurzbz = " . $this->escape($studiensemester_kurzbz) . " + GROUP BY + lehrveranstaltung_id, bezeichnung, uid, studiensemester_kurzbz + ) nichtanwesend", "lehrveranstaltung_id,student_uid,studiensemester_kurzbz", "LEFT", false); + + $this->addGroupBy("vorname"); + $this->addGroupBy("nachname"); + $this->addGroupBy("wahlname"); + $this->addGroupBy("lehrveranstaltung_id"); + $this->addGroupBy("bezeichnung"); + $this->addGroupBy("gruppe"); + $this->addGroupBy("student_uid"); + $this->addGroupBy("anwesend.summe"); + $this->addGroupBy("nichtanwesend.summe"); + + + $where = [ + "lehrveranstaltung_id >" => 0 + ]; + + if ($student_uid) + $where["student_uid"] = $student_uid; + + if ($lehrveranstaltung_id) + $where["lehrveranstaltung_id"] = $lehrveranstaltung_id; + + if ($lehrveranstaltung_id) { + $this->addOrder("nachname"); + $this->addOrder("vorname"); + } elseif ($student_uid) { + $this->addOrder("bezeichnung"); + } + + + $tmp = $this->dbTable; + + $this->dbTable = "( + SELECT + SUM(stundenplan_id) AS stundenplan_id, + datum, + stunde, + lehrveranstaltung_id, + bezeichnung, + studiensemester_kurzbz, + studiengang_kz, + TRIM( + CASE + WHEN stp.gruppe_kurzbz IS NOT NULL + THEN stp.gruppe_kurzbz + ELSE stp.semester || ( + CASE + WHEN verband IS NULL + THEN '' + ELSE stp.verband + END + ) || ( + CASE + WHEN stp.gruppe IS NULL + THEN '' + ELSE stp.gruppe + END + ) + END + ) AS gruppe + FROM lehre.tbl_lehrveranstaltung lv + JOIN lehre.tbl_lehreinheit le USING (lehrveranstaltung_id) + JOIN lehre.tbl_stundenplan stp USING (lehreinheit_id,studiengang_kz) + WHERE studiensemester_kurzbz = " . $this->escape($studiensemester_kurzbz) . " + AND (titel NOT LIKE '%Nebenprüfung%' OR titel IS NULL) + GROUP BY + datum, + stunde, + lehrveranstaltung_id, + bezeichnung, + studiensemester_kurzbz, + studiengang_kz, + stp.gruppe_kurzbz, + stp.semester, + stp.verband, + stp.gruppe + ) x"; + + $result = $this->loadWhere($where); + + $this->dbTable = $tmp; + + return $result; + } } diff --git a/application/models/education/LePruefung_model.php b/application/models/education/LePruefung_model.php index ac6c7f9b2..6e51f1975 100644 --- a/application/models/education/LePruefung_model.php +++ b/application/models/education/LePruefung_model.php @@ -11,4 +11,45 @@ class LePruefung_model extends DB_Model $this->dbTable = 'lehre.tbl_pruefung'; $this->pk = 'pruefung_id'; } + + /** + * gets all Pruefungen for a student_uid + * @param string $student_uid + * @param string $studiensemester_kurzbz + * + * @return stdClass + */ + public function getPruefungenByStudentuid($student_uid, $studiensemester_kurzbz = null) + { + $this->addSelect('tbl_pruefung.datum'); + $this->addSelect("TO_CHAR(tbl_pruefung.datum::timestamp, 'DD.MM.YYYY') AS format_datum"); + $this->addSelect('tbl_pruefung.anmerkung'); + $this->addSelect('tbl_pruefung.pruefungstyp_kurzbz'); + $this->addSelect('tbl_pruefung.pruefung_id'); + $this->addSelect('tbl_pruefung.lehreinheit_id'); + $this->addSelect('tbl_pruefung.student_uid'); + $this->addSelect('tbl_pruefung.mitarbeiter_uid'); + $this->addSelect('tbl_pruefung.punkte'); + + $this->addSelect('tbl_lehrveranstaltung.bezeichnung as lehrveranstaltung_bezeichnung'); + $this->addSelect('tbl_lehrveranstaltung.lehrveranstaltung_id'); + $this->addSelect('tbl_note.bezeichnung as note_bezeichnung'); + $this->addSelect('tbl_pruefungstyp.beschreibung as typ_beschreibung'); + $this->addSelect('tbl_lehreinheit.studiensemester_kurzbz as studiensemester_kurzbz'); + + $this->addJoin('lehre.tbl_lehreinheit', 'lehre.tbl_pruefung.lehreinheit_id=lehre.tbl_lehreinheit.lehreinheit_id'); + $this->addJoin('lehre.tbl_lehrveranstaltung', 'lehrveranstaltung_id'); + $this->addJoin('lehre.tbl_note', 'note'); + $this->addJoin('lehre.tbl_pruefungstyp', 'pruefungstyp_kurzbz'); + + if ($studiensemester_kurzbz) + $this->db->where("tbl_lehreinheit.studiensemester_kurzbz = ", $studiensemester_kurzbz); + + $this->addOrder('tbl_pruefung.datum', 'DESC'); + $this->addOrder('tbl_pruefung.pruefung_id', 'DESC'); + + return $this->loadWhere([ + 'student_uid' => $student_uid + ]); + } } diff --git a/application/models/education/Lehreinheit_model.php b/application/models/education/Lehreinheit_model.php index afad6870b..d4bc7a22f 100644 --- a/application/models/education/Lehreinheit_model.php +++ b/application/models/education/Lehreinheit_model.php @@ -31,7 +31,7 @@ class Lehreinheit_model extends DB_Model $this->addOrder('lehreinheit_id'); $les = $this->loadWhere( array('lehrveranstaltung_id' => $lehrveranstaltung_id, - 'studiensemester_kurzbz' => $studiensemester) + 'studiensemester_kurzbz' => $studiensemester) ); if (hasData($les)) @@ -244,4 +244,63 @@ EOSQL; $res = $this->execReadOnlyQuery($query); return $res; } + + /** + * Gets Lehreinheiten for Lehrveranstaltungen in a Studiensemester. + * Without using tbl_lehrfach: bezeichnung and kurzbz ALWAYS from lehrveranstaltung + * @param $lehrveranstaltung_id + * @param $studiensemester + * @return array with Lehreinheiten and their Lehreinheitgruppen + */ + public function getLesFromLvIds($lehrveranstaltung_id, $studiensemester_kurzbz = null) + { + $params = array($lehrveranstaltung_id); + + $query = " + SELECT + lv.lehrveranstaltung_id, + le.lehreinheit_id, + le.lehrform_kurzbz, + lv.kurzbz, + lv.bezeichnung, + lv.semester, + ( + SELECT + STRING_AGG(CONCAT(leg.semester, leg.verband, leg.gruppe), ' ') + FROM lehre.tbl_lehreinheitgruppe leg + WHERE leg.lehreinheit_id = le.lehreinheit_id + ) AS gruppe, + STRING_AGG(tma.kurzbz, ' ') as kuerzel + FROM + lehre.tbl_lehreinheit le + JOIN + lehre.tbl_lehrveranstaltung lv ON lv.lehrveranstaltung_id = le.lehrveranstaltung_id + JOIN + lehre.tbl_lehreinheitmitarbeiter ma USING (lehreinheit_id) + JOIN + public.tbl_mitarbeiter tma USING (mitarbeiter_uid) + WHERE + lv.lehrveranstaltung_id = ? + "; + + if (isset($studiensemester_kurzbz)) + { + $query .= " AND le.studiensemester_kurzbz = ?"; + $params[] = $studiensemester_kurzbz; + } + + $query .=" + GROUP BY + lv.lehrveranstaltung_id, + le.lehreinheit_id, + le.lehrform_kurzbz, + lv.kurzbz, + lv.bezeichnung, + lv.semester + ORDER BY + le.lehreinheit_id; + "; + + return $this->execQuery($query, $params); + } } diff --git a/application/models/education/Lehrveranstaltung_model.php b/application/models/education/Lehrveranstaltung_model.php index 3f02f5ce7..0a48965b5 100644 --- a/application/models/education/Lehrveranstaltung_model.php +++ b/application/models/education/Lehrveranstaltung_model.php @@ -517,28 +517,29 @@ class Lehrveranstaltung_model extends DB_Model /** * Gets Lehrveranstaltungen of a student * @param $student_uid - * @param null $studiensemester_kurzbz + * @param $studiensemester_kurzbz * @return array|null */ public function getLvsByStudent($student_uid, $studiensemester_kurzbz = null) { $params = array($student_uid); - $qry = "SELECT * FROM lehre.tbl_lehrveranstaltung - WHERE lehrveranstaltung_id IN(SELECT lehrveranstaltung_id FROM campus.vw_student_lehrveranstaltung - WHERE uid=?"; + WHERE lehrveranstaltung_id IN( + SELECT lehrveranstaltung_id FROM campus.vw_student_lehrveranstaltung + WHERE uid=?"; + if (isset($studiensemester_kurzbz)) { - $qry .= " AND studiensemester_kurzbz=?"; $params[] = $studiensemester_kurzbz; + $qry .= " AND studiensemester_kurzbz=?"; } - $qry .= ") OR lehrveranstaltung_id IN(SELECT lehrveranstaltung_id FROM lehre.tbl_zeugnisnote WHERE student_uid=?"; + $qry .= ")"; + + $qry .= " OR lehrveranstaltung_id IN( + SELECT lehrveranstaltung_id FROM lehre.tbl_zeugnisnote + WHERE student_uid=?"; $params[] = $student_uid; - if (isset($studiensemester_kurzbz)) - { - $qry .= " AND studiensemester_kurzbz=?"; - $params[] = $studiensemester_kurzbz; - } + $qry .= ") ORDER BY semester, bezeichnung"; return $this->execQuery($qry, $params); @@ -608,7 +609,11 @@ class Lehrveranstaltung_model extends DB_Model $this->addSelect($lvbezeichnung . ' AS bezeichnung'); $this->addSelect($sgbezeichnung . ' AS sg_bezeichnung'); $this->addSelect('UPPER(sg.typ::VARCHAR(1) || sg.kurzbz) AS studiengang_kuerzel'); - + + //also adds returns the index of the grade + //TODO: ist zeugnissnote immer gleich wie die lvgesamtnote + $this->addSelect('COALESCE(zn.note::numeric,gn.note::numeric) as note_index'); + $this->addSelect('COALESCE(znn.positiv,gnn.positiv) as positiv'); $this->addSelect('COALESCE(gnn.' . $bezeichnung . ', gnn.bezeichnung, gn.note::text) AS lvnote'); $this->addSelect('COALESCE(znn.' . $bezeichnung . ', znn.bezeichnung, zn.note::text) AS znote'); @@ -730,6 +735,37 @@ class Lehrveranstaltung_model extends DB_Model return $this->execQuery($query, array($uid, $studiensemester_kurzbz, $lehrveranstaltung_id)); } + /** + * Get Lehreinheit. + * + * @param string $student_uid + * @param string $studiensemester_kurzbz + * @param integer $lehrveranstaltung_id + * + * @return stdClass + */ + public function getLeByStudent($student_uid, $studiensemester_kurzbz, $lehrveranstaltung_id) + { + $this->addSelect("lehreinheit_id"); + + $this->addOrder("lehreinheit_id", "ASC"); + + $this->addLimit(1); + + $tmp = $this->dbTable; + $this->dbTable = "campus.vw_student_lehrveranstaltung"; + + $result = $this->loadWhere([ + "uid" => $student_uid, + "lehrveranstaltung_id" => $lehrveranstaltung_id, + "studiensemester_kurzbz" => $studiensemester_kurzbz + ]); + + $this->dbTable = $tmp; + + return $result; + } + /** * Sucht nach LV Templates und gibt Id und Label ("bezeichnung [kurzbz]") aus * Diese funktion ist für autocomplete gedacht @@ -1012,4 +1048,27 @@ class Lehrveranstaltung_model extends DB_Model $res = $this->execReadOnlyQuery($query); return $res; } + + /** + * Gets lehrveranstaltungen of a studiengang + * @param integer $studiengang_kz + * @return array|null + */ + public function getLvsByStudiengangkz($studiengang_kz) + { + $params = array($studiengang_kz); + + $qry = "SELECT + * + FROM + lehre.tbl_lehrveranstaltung + WHERE lehrveranstaltung_id IN + (SELECT lehrveranstaltung_id + FROM campus.vw_student_lehrveranstaltung + WHERE studiengang_kz = ?"; + + $qry .= ") ORDER BY semester, bezeichnung"; + + return $this->execQuery($qry, $params); + } } diff --git a/application/models/education/Lvgesamtnote_model.php b/application/models/education/Lvgesamtnote_model.php index 975833287..c30045ff0 100644 --- a/application/models/education/Lvgesamtnote_model.php +++ b/application/models/education/Lvgesamtnote_model.php @@ -12,4 +12,38 @@ class Lvgesamtnote_model extends DB_Model $this->pk = array('student_uid', 'studiensemester_kurzbz', 'lehrveranstaltung_id'); $this->hasSequence = false; } + + /** + * Laedt die Noten + * + * @param integer $lehrveranstaltung_id + * @param string $student_uid + * @param string $studiensemester_kurzbz + * + * @return stdClass + */ + public function getLvGesamtNoten($lehrveranstaltung_id, $student_uid, $studiensemester_kurzbz) + { + $this->addSelect($this->dbTable . ".*"); + $this->addSelect("n.bezeichnung AS note_bezeichnung"); + $this->addSelect("lv.bezeichnung AS lehrveranstaltung_bezeichnung"); + $this->addSelect("lv.studiengang_kz"); + $this->addSelect("UPPER(stg.typ || stg.kurzbz) AS studiengang"); + + $this->addJoin("lehre.tbl_note n", "note"); + $this->addJoin("lehre.tbl_lehrveranstaltung lv", "lehrveranstaltung_id"); + $this->addJoin("public.tbl_studiengang stg", "studiengang_kz"); + + $this->db->where($this->dbTable . ".freigabedatum <", "NOW()", false); + + $where = []; + if ($studiensemester_kurzbz) + $where[$this->dbTable . ".studiensemester_kurzbz"] = $studiensemester_kurzbz; + if ($lehrveranstaltung_id) + $where[$this->dbTable . ".lehrveranstaltung_id"] = $lehrveranstaltung_id; + if ($student_uid) + $where[$this->dbTable . ".student_uid"] = $student_uid; + + return $this->loadWhere($where); + } } diff --git a/application/models/education/Note_model.php b/application/models/education/Note_model.php new file mode 100644 index 000000000..80b454398 --- /dev/null +++ b/application/models/education/Note_model.php @@ -0,0 +1,14 @@ +dbTable = 'lehre.tbl_note'; + $this->pk = 'note'; + } +} \ No newline at end of file diff --git a/application/models/education/Notenschluesselaufteilung_model.php b/application/models/education/Notenschluesselaufteilung_model.php index 5e0f2f05c..d48e16b0b 100644 --- a/application/models/education/Notenschluesselaufteilung_model.php +++ b/application/models/education/Notenschluesselaufteilung_model.php @@ -11,4 +11,34 @@ class Notenschluesselaufteilung_model extends DB_Model $this->dbTable = 'lehre.tbl_notenschluesselaufteilung'; $this->pk = 'notenschluesselaufteilung_id'; } + + /** + * Liefert die Note zu Punkten einer Lehrveranstaltung + * + * @param number $points + * @param integer $lehrveranstaltung_id + * @param string $studiensemester_kurzbz + * + * @return stdClass returns success(null) if no entry is found + */ + public function getNote($points, $lehrveranstaltung_id, $studiensemester_kurzbz) + { + $this->load->model('education/Notenschluesselzuordnung_model', 'NotenschluesselzuordnungModel'); + $notenschluessel_kurzbz = $this->NotenschluesselzuordnungModel->getKurzbzForLv($lehrveranstaltung_id, $studiensemester_kurzbz); + + $this->addSelect("note"); + $this->addOrder("punkte", "DESC"); + $this->addLimit(1); + + $result = $this->loadWhere([ + "notenschluessel_kurzbz" => $notenschluessel_kurzbz, + "punkte <=" => $points + ]); + + if (isError($result)) + return $result; + if (!hasData($result)) + return success(null); + return success(current(getData($result))->note); + } } diff --git a/application/models/education/Notenschluesselzuordnung_model.php b/application/models/education/Notenschluesselzuordnung_model.php index e6881e12b..9eb46b290 100644 --- a/application/models/education/Notenschluesselzuordnung_model.php +++ b/application/models/education/Notenschluesselzuordnung_model.php @@ -11,4 +11,71 @@ class Notenschluesselzuordnung_model extends DB_Model $this->dbTable = 'lehre.tbl_notenschluesselzuordnung'; $this->pk = 'notenschluesselzuordnung_id'; } + + /** + * Liefert den passenden Notenschluessel zu einer Lehrveranstaltung + * + * @param integer $lehrveranstaltung_id + * @param string $studiensemester_kurzbz + * + * @return integer|null + */ + public function getKurzbzForLv($lehrveranstaltung_id, $studiensemester_kurzbz) + { + $this->addSelect("notenschluessel_kurzbz"); + + $this->db->where("lehrveranstaltung_id", $lehrveranstaltung_id); + if ($studiensemester_kurzbz) { + $this->db->where("studiensemester_kurzbz", $studiensemester_kurzbz); + $this->db->or_where("studiensemester_kurzbz", null); + } else { + $this->db->where("studiensemester_kurzbz", null); + } + + $result = $this->load(); + + if (!isError($result) && hasData($result)) + return current(getData($result))->notenschluessel_kurzbz; + + + $this->addSelect("notenschluessel_kurzbz"); + + $this->addJoin("( + WITH RECURSIVE oes(oe_kurzbz, oe_parent_kurzbz, depth) AS ( + SELECT oe_kurzbz, oe_parent_kurzbz, 1 + FROM public.tbl_organisationseinheit + WHERE oe_kurzbz = ( + SELECT + oe_kurzbz + FROM + lehre.tbl_lehrveranstaltung + WHERE + lehrveranstaltung_id = " . $this->escape($lehrveranstaltung_id) . " + ) + UNION ALL + SELECT o.oe_kurzbz, o.oe_parent_kurzbz, oes.depth+1 AS depth + FROM public.tbl_organisationseinheit o, oes + WHERE o.oe_kurzbz = oes.oe_parent_kurzbz + AND aktiv = true + ) + SELECT * FROM oes + ) oes", "oe_kurzbz"); + + $this->addOrder("depth", "ASC"); + $this->addLimit(1); + + if ($studiensemester_kurzbz) { + $this->db->where_in("studiensemester_kurzbz", [$studiensemester_kurzbz, null]); + $result = $this->load(); + } else { + $result = $this->loadWhere([ + "studiensemester_kurzbz" => null + ]); + } + + if (isError($result) || !hasData($result)) + return null; + + return current(getData($result))->notenschluessel_kurzbz; + } } diff --git a/application/models/education/Pruefungsantritt_model.php b/application/models/education/Pruefungsantritt_model.php new file mode 100644 index 000000000..f22633117 --- /dev/null +++ b/application/models/education/Pruefungsantritt_model.php @@ -0,0 +1,14 @@ +dbTable = 'lehre.tbl_abschlusspruefung_antritt'; + $this->pk = 'pruefungsantritt_kurzbz'; + } +} \ No newline at end of file diff --git a/application/models/education/Studierendenantraglehrveranstaltung_model.php b/application/models/education/Studierendenantraglehrveranstaltung_model.php index 4318c773e..927343a3e 100644 --- a/application/models/education/Studierendenantraglehrveranstaltung_model.php +++ b/application/models/education/Studierendenantraglehrveranstaltung_model.php @@ -46,6 +46,15 @@ class Studierendenantraglehrveranstaltung_model extends DB_Model } } + /** + * Gets all LVs for a repeating prestudent that are either not allowed or + * already done. + * + * @param string $prestudent_id + * @param string $studiensemester_kurzbz + * + * @return stdClass + */ public function getLvsForPrestudent($prestudent_id, $studiensemester_kurzbz) { $this->addSelect($this->dbTable . '.*'); @@ -66,39 +75,53 @@ class Studierendenantraglehrveranstaltung_model extends DB_Model ); $this->addJoin('public.tbl_student s', 'prestudent_id'); - // NOTE(chris): last offizell note - $this->addJoin('( - SELECT z.* - FROM lehre.tbl_zeugnisnote z - LEFT JOIN public.tbl_studiensemester zs - USING(studiensemester_kurzbz) - JOIN ( - SELECT zi.lehrveranstaltung_id, zi.student_uid, MAX(zis.start) AS start - FROM lehre.tbl_zeugnisnote zi - LEFT JOIN lehre.tbl_note zin - USING(note) - LEFT JOIN public.tbl_studiensemester zis - USING(studiensemester_kurzbz) - WHERE zin.aktiv AND zin.offiziell - GROUP BY zi.lehrveranstaltung_id, zi.student_uid - ) zx - ON ( - z.lehrveranstaltung_id=zx.lehrveranstaltung_id - AND z.student_uid=zx.student_uid - AND zs.start = zx.start - )) z', 'z.lehrveranstaltung_id=lv.lehrveranstaltung_id AND z.student_uid=s.student_uid', 'LEFT'); - $this->addJoin('lehre.tbl_note zn', 'z.note = zn.note', 'LEFT'); - + $this->load->config('studierendenantrag'); $note_intern_angerechntet = $this->config->item('wiederholung_note_angerechnet'); - return $this->loadWhere([ + $where = [ 'ps.prestudent_id' => $prestudent_id, 'a.typ' => Studierendenantrag_model::TYP_WIEDERHOLUNG, 'stat.studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_APPROVED, 'n.note <> ' => 0, - $this->dbTable . '.studiensemester_kurzbz' => $studiensemester_kurzbz, - '(n.note<>' . $this->db->escape($note_intern_angerechntet) . ' OR (z.note IS NOT NULL AND zn.positiv))' => null - ]); + // NOTE(chris): grade "intern angerechnet" needs an official grade beforehand (the subquery gets the last positive offical grade) + "(n.note<>" . $this->db->escape($note_intern_angerechntet) . " OR EXISTS ( + SELECT + 1 + FROM + lehre.tbl_zeugnisnote z + LEFT JOIN public.tbl_studiensemester zs USING(studiensemester_kurzbz) + JOIN ( + SELECT + zi.lehrveranstaltung_id, + zi.student_uid, + MAX(zis.start) AS start + FROM + lehre.tbl_zeugnisnote zi + LEFT JOIN lehre.tbl_note zin USING(note) + LEFT JOIN public.tbl_studiensemester zis USING(studiensemester_kurzbz) + WHERE + zin.aktiv + AND zin.offiziell + GROUP BY + zi.lehrveranstaltung_id, + zi.student_uid + ) zx ON ( + z.lehrveranstaltung_id = zx.lehrveranstaltung_id + AND z.student_uid = zx.student_uid + AND zs.start = zx.start + ) + JOIN lehre.tbl_note zn USING (note) + WHERE + z.lehrveranstaltung_id = lv.lehrveranstaltung_id + AND z.student_uid = s.student_uid + AND zn.positiv + ))" => null + ]; + + if ($studiensemester_kurzbz !== false) + $where[$this->dbTable . '.studiensemester_kurzbz'] = $studiensemester_kurzbz; + + return $this->loadWhere($where); } } diff --git a/application/models/education/Zeugnisnote_model.php b/application/models/education/Zeugnisnote_model.php index b4d909e37..f32713dec 100644 --- a/application/models/education/Zeugnisnote_model.php +++ b/application/models/education/Zeugnisnote_model.php @@ -177,45 +177,63 @@ class Zeugnisnote_model extends DB_Model $params[] = $studiensemester_kurzbz; } - $qry = "SELECT vw_student_lehrveranstaltung.lehrveranstaltung_id, uid, - vw_student_lehrveranstaltung.studiensemester_kurzbz, note, punkte, uebernahmedatum, benotungsdatum, - vw_student_lehrveranstaltung.ects, vw_student_lehrveranstaltung.semesterstunden, - tbl_zeugnisnote.updateamum, tbl_zeugnisnote.updatevon, tbl_zeugnisnote.insertamum, - tbl_zeugnisnote.insertvon, tbl_zeugnisnote.ext_id, - vw_student_lehrveranstaltung.bezeichnung as lehrveranstaltung_bezeichnung, - vw_student_lehrveranstaltung.bezeichnung_english as lehrveranstaltung_bezeichnung_english, - tbl_note.bezeichnung as note_bezeichnung, - tbl_note.positiv as note_positiv, - tbl_zeugnisnote.bemerkung as bemerkung, - vw_student_lehrveranstaltung.sort, - vw_student_lehrveranstaltung.zeugnis, - vw_student_lehrveranstaltung.studiengang_kz, - vw_student_lehrveranstaltung.lv_lehrform_kurzbz, - tbl_lehrveranstaltung.sws - FROM - ( - campus.vw_student_lehrveranstaltung LEFT JOIN lehre.tbl_zeugnisnote - ON(uid=student_uid - AND vw_student_lehrveranstaltung.studiensemester_kurzbz=tbl_zeugnisnote.studiensemester_kurzbz - AND vw_student_lehrveranstaltung.lehrveranstaltung_id=tbl_zeugnisnote.lehrveranstaltung_id - ) - ) LEFT JOIN lehre.tbl_note USING(note) - JOIN lehre.tbl_lehrveranstaltung ON(vw_student_lehrveranstaltung.lehrveranstaltung_id=tbl_lehrveranstaltung.lehrveranstaltung_id) - WHERE true $where + $qry = "SELECT + a.*, + lv.lehrform_kurzbz AS lehrveranstaltung_lehrform, + lv.kurzbz AS lehrveranstaltung_kurzbz, + UPPER(stg1.typ || stg1.kurzbz) AS studiengang, + s.studiengang_kz AS studiengang_kz, + UPPER(stg2.typ || stg2.kurzbz) AS studiengang_lv, + lv.studiengang_kz AS studiengang_kz_lv, + lv.semester AS semester_lv, + lv.ects AS ects_lv, + lv.zeugnis, + lv.bezeichnung_english AS lehrveranstaltung_bezeichnung_english + FROM ( + SELECT vw_student_lehrveranstaltung.lehrveranstaltung_id, uid, + vw_student_lehrveranstaltung.studiensemester_kurzbz, note, punkte, uebernahmedatum, benotungsdatum, + vw_student_lehrveranstaltung.ects, vw_student_lehrveranstaltung.semesterstunden, + tbl_zeugnisnote.updateamum, tbl_zeugnisnote.updatevon, tbl_zeugnisnote.insertamum, + tbl_zeugnisnote.insertvon, tbl_zeugnisnote.ext_id, + vw_student_lehrveranstaltung.bezeichnung as lehrveranstaltung_bezeichnung, + vw_student_lehrveranstaltung.bezeichnung_english as lehrveranstaltung_bezeichnung_english, + tbl_note.bezeichnung as note_bezeichnung, + tbl_note.positiv as note_positiv, + tbl_zeugnisnote.bemerkung as bemerkung, + vw_student_lehrveranstaltung.sort, + vw_student_lehrveranstaltung.zeugnis, + vw_student_lehrveranstaltung.studiengang_kz, + vw_student_lehrveranstaltung.lv_lehrform_kurzbz, + tbl_lehrveranstaltung.sws + FROM + ( + campus.vw_student_lehrveranstaltung LEFT JOIN lehre.tbl_zeugnisnote + ON(uid=student_uid + AND vw_student_lehrveranstaltung.studiensemester_kurzbz=tbl_zeugnisnote.studiensemester_kurzbz + AND vw_student_lehrveranstaltung.lehrveranstaltung_id=tbl_zeugnisnote.lehrveranstaltung_id + ) + ) LEFT JOIN lehre.tbl_note USING(note) + JOIN lehre.tbl_lehrveranstaltung ON(vw_student_lehrveranstaltung.lehrveranstaltung_id=tbl_lehrveranstaltung.lehrveranstaltung_id) + WHERE true $where - UNION - SELECT lehre.tbl_lehrveranstaltung.lehrveranstaltung_id,student_uid AS uid,studiensemester_kurzbz, note, punkte, - uebernahmedatum, benotungsdatum,lehre.tbl_lehrveranstaltung.ects,lehre.tbl_lehrveranstaltung.semesterstunden, tbl_zeugnisnote.updateamum, tbl_zeugnisnote.updatevon, tbl_zeugnisnote.insertamum, - tbl_zeugnisnote.insertvon, tbl_zeugnisnote.ext_id, lehre.tbl_lehrveranstaltung.bezeichnung as lehrveranstaltung_bezeichnung, lehre.tbl_lehrveranstaltung.bezeichnung_english as lehrveranstaltung_bezeichnung_english, - tbl_note.bezeichnung as note_bezeichnung, tbl_note.positiv as note_positiv, tbl_zeugnisnote.bemerkung as bemerkung, tbl_lehrveranstaltung.sort, tbl_lehrveranstaltung.zeugnis, tbl_lehrveranstaltung.studiengang_kz, - tbl_lehrveranstaltung.lehrform_kurzbz as lv_lehrform_kurzbz, tbl_lehrveranstaltung.sws - FROM - lehre.tbl_zeugnisnote - JOIN lehre.tbl_lehrveranstaltung USING (lehrveranstaltung_id) - JOIN lehre.tbl_note USING(note) - WHERE true $where2 + UNION + SELECT lehre.tbl_lehrveranstaltung.lehrveranstaltung_id,student_uid AS uid,studiensemester_kurzbz, note, punkte, + uebernahmedatum, benotungsdatum,lehre.tbl_lehrveranstaltung.ects,lehre.tbl_lehrveranstaltung.semesterstunden, tbl_zeugnisnote.updateamum, tbl_zeugnisnote.updatevon, tbl_zeugnisnote.insertamum, + tbl_zeugnisnote.insertvon, tbl_zeugnisnote.ext_id, lehre.tbl_lehrveranstaltung.bezeichnung as lehrveranstaltung_bezeichnung, lehre.tbl_lehrveranstaltung.bezeichnung_english as lehrveranstaltung_bezeichnung_english, + tbl_note.bezeichnung as note_bezeichnung, tbl_note.positiv as note_positiv, tbl_zeugnisnote.bemerkung as bemerkung, tbl_lehrveranstaltung.sort, tbl_lehrveranstaltung.zeugnis, tbl_lehrveranstaltung.studiengang_kz, + tbl_lehrveranstaltung.lehrform_kurzbz as lv_lehrform_kurzbz, tbl_lehrveranstaltung.sws + FROM + lehre.tbl_zeugnisnote + JOIN lehre.tbl_lehrveranstaltung USING (lehrveranstaltung_id) + JOIN lehre.tbl_note USING(note) + WHERE true $where2 - ORDER BY sort"; + ORDER BY sort + ) a + LEFT JOIN public.tbl_student s ON (a.uid = s.student_uid) + LEFT JOIN public.tbl_studiengang stg1 ON (s.studiengang_kz = stg1.studiengang_kz) + LEFT JOIN lehre.tbl_lehrveranstaltung lv USING (lehrveranstaltung_id) + LEFT JOIN public.tbl_studiengang stg2 ON (lv.studiengang_kz = stg2.studiengang_kz)"; return $this->execQuery($qry, $params); } diff --git a/application/models/organisation/Studiengang_model.php b/application/models/organisation/Studiengang_model.php index e306ce950..7ea8a901c 100644 --- a/application/models/organisation/Studiengang_model.php +++ b/application/models/organisation/Studiengang_model.php @@ -647,4 +647,135 @@ class Studiengang_model extends DB_Model return $this->load(); } + + /** + * @return stdClass + */ + public function getStudiengangInfoForNews() + { + + $this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel'); + $this->load->model('person/Person_model', 'PersonModel'); + $this->load->model('crm/Student_model', 'StudentModel'); + + $addEmailProperty= function(&$benutzerfunktionen){ + if(count($benutzerfunktionen) && defined('DOMAIN')) + { + $benutzerfunktionen = array_map(function($benutzer) + { + $benutzer->email = $benutzer->alias."@".DOMAIN; + return $benutzer; + },$benutzerfunktionen) ; + } + + }; + $addFotoProperty= function(&$collection){ + $collection = array_map(function($item){ + $person_id = $this->PersonModel->getByUid($item->uid); + if(isError($person_id)) + return error($person_id); + $person_id = current(getData($person_id))->person_id; + $this->PersonModel->addSelect('foto'); + $foto = $this->PersonModel->loadWhere(array('person_id'=>$person_id)); + if(isError($foto)) + return error($foto); + $foto = current(getData($foto))->foto; + $item->foto = $foto; + return $item; + },$collection); + }; + + + $this->load->model('crm/Student_model', 'StudentModel'); + + $student = $this->StudentModel->loadWhere(['student_uid' => getAuthUID()]); + if (isError($student)) + return error($student); + if (getData($student)) { + $student = current(getData($student)); + $studiengang_kz = $student->studiengang_kz; + $semester = $student->semester; + } + + $stg_obj = $this->load($studiengang_kz); + if(isError($stg_obj)) + return error($stg_obj); + if(getData($stg_obj)) + { + $stg_obj = current(getData($stg_obj)); + } + + $stg_ltg = $this->getLeitungDetailed($stg_obj->studiengang_kz); + if (isError($stg_ltg)) + return $stg_ltg; + $stg_ltg = getData($stg_ltg) ?: []; + $addFotoProperty($stg_ltg); + + $gf_ltg = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('gLtg', $stg_obj->oe_kurzbz); + if (isError($gf_ltg)) + return $gf_ltg; + $gf_ltg = getData($gf_ltg) ?: []; + $addEmailProperty($gf_ltg); + + $stv_ltg = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('stvLtg', $stg_obj->oe_kurzbz); + if (isError($stv_ltg)) + return $stv_ltg; + $stv_ltg = getData($stv_ltg) ?: []; + $addEmailProperty($stv_ltg); + + $ass = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('ass', $stg_obj->oe_kurzbz); + if (isError($ass)) + return $ass; + $ass = getData($ass) ?: []; + $addEmailProperty($ass); + $addFotoProperty($ass); + + $hochschulvertr = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('hsv'); + if (isError($hochschulvertr)) + return $hochschulvertr; + $hochschulvertr = getData($hochschulvertr) ?: []; + $addEmailProperty($hochschulvertr); + + + $stdv = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('stdv', $stg_obj->oe_kurzbz); + if (isError($stdv)) + return $stdv; + $stdv = getData($stdv) ?: []; + $addEmailProperty($stdv); + + + $jahrgangsvertr = $this->BenutzerfunktionModel->getBenutzerFunktionenDetailed('jgv', $stg_obj->oe_kurzbz, $semester); + if (isError($jahrgangsvertr)) + return $jahrgangsvertr; + $jahrgangsvertr = getData($jahrgangsvertr) ?: []; + $addEmailProperty($jahrgangsvertr); + + + $result_object = new stdClass(); + $result_object->studiengang = $stg_obj; + $result_object->semester = $semester; + $result_object->stg_ltg = $stg_ltg; + $result_object->gf_ltg = $gf_ltg; + $result_object->stv_ltg = $stv_ltg; + $result_object->ass = $ass; + $result_object->hochschulvertr = $hochschulvertr; + $result_object->stdv = $stdv; + $result_object->jahrgangsvertr = $jahrgangsvertr; + + return success($result_object); + } + + public function getLvaForStudiengangInStudiensemester($studiengang_kz, $orgform_kurzbz, $studiensemester_kurzbz) { + $qry = ' + SELECT DISTINCT ON (lehre.tbl_lehrveranstaltung.lehrveranstaltung_id, + kurzbz, bezeichnung, semester, + lehre.tbl_lehrveranstaltung.sprache, orgform_kurzbz, + lehre.tbl_lehrveranstaltung.lehrform_kurzbz) + lehre.tbl_lehrveranstaltung.lehrveranstaltung_id, kurzbz, bezeichnung, + semester, lehre.tbl_lehrveranstaltung.sprache, orgform_kurzbz, lehre.tbl_lehrveranstaltung.lehrform_kurzbz + FROM lehre.tbl_lehrveranstaltung JOIN lehre.tbl_lehreinheit USING(lehrveranstaltung_id) JOIN lehre.tbl_lehreinheitmitarbeiter USING(lehreinheit_id) + WHERE aktiv = TRUE AND studiengang_kz = ? AND orgform_kurzbz = ? AND tbl_lehreinheit.studiensemester_kurzbz IN ?'; + + return $this->execReadOnlyQuery($qry, array($studiengang_kz, $orgform_kurzbz, $studiensemester_kurzbz)); + } } diff --git a/application/models/organisation/Studiensemester_model.php b/application/models/organisation/Studiensemester_model.php index 291a010f9..0ea5b9328 100644 --- a/application/models/organisation/Studiensemester_model.php +++ b/application/models/organisation/Studiensemester_model.php @@ -170,13 +170,31 @@ class Studiensemester_model extends DB_Model return $this->execQuery($query, array($studiensemester_kurzbz, $studiengang_kz)); } + /** + * Gets a Studiensemester for a date + * @param $date + * @return string + */ + public function getByDate($date) + { + // gets the studiensemster of a date or the next closest previous studiensemester if a date is not within a studiensemester + $query = " + SELECT studiensemester_kurzbz, start, ende + FROM public.tbl_studiensemester + WHERE ( ende >= ?::date AND start <= ?::date ) OR ( ende >= ?::date + '-45 days'::interval AND start <= ?::date + '-45 days'::interval ) + ORDER BY start DESC + LIMIT 1"; + + return $this->execQuery($query, array($date,$date,$date,$date)); + } + /** * Gets all Studiensemester between two dates * @param $from * @param $to * @return array|null */ - public function getByDate($from, $to) + public function getByDateRange($from, $to) { if (date_format(date_create($from), 'Y-m-d') > (date_format(date_create($to), 'Y-m-d'))) return success(array()); diff --git a/application/models/person/Benutzerfunktion_model.php b/application/models/person/Benutzerfunktion_model.php index 398ca765e..8c43e4f84 100644 --- a/application/models/person/Benutzerfunktion_model.php +++ b/application/models/person/Benutzerfunktion_model.php @@ -50,6 +50,53 @@ class Benutzerfunktion_model extends DB_Model return $this->execQuery($qry, $params); } + /** + * Lädt alle Benutzerfunktionen zu einer UID im Zeitraum eines Studiensemesters + * + * @param string $uid + * @param string $stdsem + * @param string $funktion_kurzbz (optional) + * + * @return stdClass + */ + public function getBenutzerFunktionByUidInStdsem($uid, $stdsem, $funktion_kurzbz = null) + { + $stdsemEscaped = $this->escape($stdsem); + $this->addSelect($this->dbTable . ".*"); + $this->addSelect("oe.bezeichnung AS organisationseinheit_bezeichnung"); + $this->addSelect("oe.organisationseinheittyp_kurzbz"); + + $this->addJoin("public.tbl_organisationseinheit oe", "oe_kurzbz"); + + $this->db->where("uid", $uid); + + if ($funktion_kurzbz !== null) + $this->db->where("funktion_kurzbz", $funktion_kurzbz); + + $this->db->group_start(); + $this->db->where("datum_bis IS NULL"); + $this->db->or_where("datum_bis >=", "( + SELECT start + FROM public.tbl_studiensemester + WHERE studiensemester_kurzbz = " . $stdsemEscaped . " + )", false); + $this->db->group_end(); + + $this->db->group_start(); + $this->db->where("datum_von IS NULL"); + $this->db->or_where("datum_von <=", "( + SELECT ende + FROM public.tbl_studiensemester + WHERE studiensemester_kurzbz = " . $stdsemEscaped . " + )", false); + $this->db->group_end(); + + $this->addOrder("datum_bis", "NULLS LAST"); + $this->addOrder("datum_von", "NULLS LAST"); + + return $this->load(); + } + /** * Get the Benutzerfunktion using the person_id */ diff --git a/application/models/person/Notiz_model.php b/application/models/person/Notiz_model.php index 2d1e054c3..2e99d1cdd 100644 --- a/application/models/person/Notiz_model.php +++ b/application/models/person/Notiz_model.php @@ -156,10 +156,10 @@ class Notiz_model extends DB_Model $qry = " SELECT n.*, count(dms_id) as countDoc, z.notizzuordnung_id, - TO_CHAR (CASE + (CASE WHEN n.updateamum >= n.insertamum THEN n.updateamum ELSE n.insertamum - END::timestamp, 'DD.MM.YYYY HH24:MI:SS') AS lastUpdate, + END) AS lastUpdate, regexp_replace(n.text, '<[^>]*>', '', 'g') as text_stripped, TO_CHAR(n.start::timestamp, 'DD.MM.YYYY') AS start_format, TO_CHAR(n.ende::timestamp, 'DD.MM.YYYY') AS ende_format, diff --git a/application/models/ressource/Betriebsmittelperson_model.php b/application/models/ressource/Betriebsmittelperson_model.php index 39f08b5cd..6da9a384d 100644 --- a/application/models/ressource/Betriebsmittelperson_model.php +++ b/application/models/ressource/Betriebsmittelperson_model.php @@ -115,13 +115,18 @@ class Betriebsmittelperson_model extends DB_Model $query = " SELECT - bm.nummer, bmp.person_id, bm.betriebsmitteltyp, bmp.anmerkung as anmerkung, bmp.retouram, TO_CHAR(bmp.retouram::timestamp, 'DD.MM.YYYY') AS format_retour, bmp.ausgegebenam, TO_CHAR(bmp.ausgegebenam::timestamp, 'DD.MM.YYYY') AS format_ausgabe, bm.beschreibung, bmp.uid, bmp.kaution, bm.betriebsmittel_id, bmp.betriebsmittelperson_id, bm.inventarnummer, bm.nummer2 + bm.nummer, bmp.person_id, bm.betriebsmitteltyp, bmp.anmerkung as anmerkung, + bmp.retouram, + bmp.ausgegebenam, + bm.beschreibung, bmp.uid, bmp.kaution, + bm.betriebsmittel_id, bmp.betriebsmittelperson_id, + bm.inventarnummer, bm.nummer2 FROM - wawi.tbl_betriebsmittelperson bmp + wawi.tbl_betriebsmittelperson bmp JOIN - wawi.tbl_betriebsmittel bm ON (bmp.betriebsmittel_id = bm.betriebsmittel_id) + wawi.tbl_betriebsmittel bm ON (bmp.betriebsmittel_id = bm.betriebsmittel_id) WHERE - " . $cond . " = ? "; + " . $cond . " = ? "; return $this->execQuery($query, array($id)); } diff --git a/application/models/ressource/Mitarbeiter_model.php b/application/models/ressource/Mitarbeiter_model.php index c38fcf054..836f5d65a 100644 --- a/application/models/ressource/Mitarbeiter_model.php +++ b/application/models/ressource/Mitarbeiter_model.php @@ -217,12 +217,28 @@ class Mitarbeiter_model extends DB_Model return success($kurzbz); } - public function searchMitarbeiter($filter) + /** + * Search function for mitarbeiter + * @param $filter searchstring: searches for nachname, vorname, mitarbeiter_uid + * $param $mode gives the resultobject in different version: + * null : "[mitarbeiter_uid], Nachname, Vorname, (mitarbeiter_uid)" + * 'mitAkadGrad': "[mitarbeiter_uid], Nachname, Vorname, Titelpre, Titelpost (mitarbeiter_uid)" + * 'ohneMaUid' : "[mitarbeiter_uid], Nachname, Vorname, Titelpre, Titelpost" + * @return object in 3 versions + */ + public function searchMitarbeiter($filter, $mode=null) { $filter = strtoLower($filter); + + if ($mode == "mitAkadGrad") + $returnwert = "ma.mitarbeiter_uid, CONCAT(p.nachname, ' ', p.vorname, ' ', p.titelpost, ' ', p.titelpre, ' (', ma.mitarbeiter_uid , ')') as mitarbeiter"; + elseif ($mode == "ohneMaUid") + $returnwert = "p.person_id, CONCAT(p.nachname, ' ', p.vorname, ' ', p.titelpost, ' ', p.titelpre) as mitarbeiter"; + else + $returnwert = "ma.mitarbeiter_uid, CONCAT(p.nachname, ' ', p.vorname, ' (', ma.mitarbeiter_uid , ')') as mitarbeiter"; + $qry = " - SELECT - ma.mitarbeiter_uid, CONCAT(p.nachname, ' ', p.vorname, ' (', ma.mitarbeiter_uid , ')') as mitarbeiter + SELECT " . $returnwert . " FROM public.tbl_mitarbeiter ma JOIN @@ -238,4 +254,28 @@ class Mitarbeiter_model extends DB_Model return $this->execQuery($qry); } + + /** + * Gets Mitarbeiter for a certain Lehrveranstaltung. + * + * @param $lehrveranstaltung_id + * @return array with Mitarbeiter and their Lehreinheiten + */ + public function getMitarbeiterFromLV($lehrveranstaltung_id){ + //TODO(manu) maybe filter that in pruefungslist.js ? + $qry = "SELECT DISTINCT + lehrveranstaltung_id, uid, vorname, wahlname, vornamen, nachname, titelpre, titelpost, kurzbz, mitarbeiter_uid + FROM + lehre.tbl_lehreinheitmitarbeiter, campus.vw_mitarbeiter, lehre.tbl_lehreinheit + WHERE + lehrveranstaltung_id= ? + AND + mitarbeiter_uid=uid + AND + tbl_lehreinheitmitarbeiter.lehreinheit_id=tbl_lehreinheit.lehreinheit_id;"; + + $parametersArray = array($lehrveranstaltung_id); + + return $this->execQuery($qry, $parametersArray); + } } diff --git a/application/models/ressource/Reservierung_model.php b/application/models/ressource/Reservierung_model.php index fdfc9926b..f635d0cb1 100644 --- a/application/models/ressource/Reservierung_model.php +++ b/application/models/ressource/Reservierung_model.php @@ -71,6 +71,51 @@ class Reservierung_model extends DB_Model return $query_result; } + /** + * @param $uid + * + * @return stdClass + */ + public function getReservierungenMitarbeiter($start_date, $end_date, $ort_kurzbz = null) + { + + $raum_reservierungen_query = "SELECT res.*, beginn, ende, + CASE + WHEN res.gruppe_kurzbz IS NOT NULL THEN res.gruppe_kurzbz + ELSE CONCAT(UPPER(studg.typ),UPPER(studg.kurzbz),'-',COALESCE(CAST(res.semester AS varchar),'/'),COALESCE(CAST(res.verband AS varchar),'/')) + END as gruppen_kuerzel + FROM campus.vw_reservierung res + JOIN public.tbl_studiengang studg ON studg.studiengang_kz=res.studiengang_kz + JOIN lehre.tbl_stunde ON lehre.tbl_stunde.stunde = res.stunde + WHERE res.uid = ? AND datum >= ? AND datum <= ?"; + +// $subquery = is_null($ort_kurzbz)? $stundenplan_reservierungen_query:$raum_reservierungen_query; + $subquery = $raum_reservierungen_query; + + + $query_result= $this->execReadOnlyQuery(" + SELECT + 'reservierung' as type, beginn, ende, datum, + COALESCE(titel, beschreibung) as topic, + array_agg(DISTINCT mitarbeiter_kurzbz) as lektor, + array_agg(DISTINCT (gruppe,verband,semester,studiengang_kz,gruppen_kuerzel)) as gruppe, + + ort_kurzbz, 'FFFFFF' as farbe + + FROM + ( + ". $subquery ." + ) AS subquery + + GROUP BY datum, beginn, ende, ort_kurzbz, titel, beschreibung + + ORDER BY datum, beginn + ", [getAuthUID(), $start_date, $end_date]); + + + return $query_result; + } + /** * @param $uid * diff --git a/application/models/ressource/Stundenplan_model.php b/application/models/ressource/Stundenplan_model.php index 8cb07a3bb..012ce0a57 100644 --- a/application/models/ressource/Stundenplan_model.php +++ b/application/models/ressource/Stundenplan_model.php @@ -186,9 +186,119 @@ class Stundenplan_model extends DB_Model return $query_result; } + /** + * queries Stundenplan but for a whole lva, irrespective of who is requesting it + * + * @return void + */ + public function getStundenplanLVA($start_date, $end_date, $lv_id) { + return $this->execReadOnlyQuery(" + + SELECT + 'lehreinheit' as type, beginn, ende, datum, + CONCAT(lehrfach,'-',lehrform) as topic, + array_agg(DISTINCT lektor) as lektor, + array_agg(DISTINCT (gruppe,verband,semester,studiengang_kz,gruppen_kuerzel)) as gruppe, + string_agg(DISTINCT ort_kurzbz, '/') as ort_kurzbz, + array_agg(DISTINCT lehreinheit_id) as lehreinheit_id, + + titel, lehrfach, lehrform, lehrfach_bez, organisationseinheit, farbe, lehrveranstaltung_id + + FROM + ( + SELECT unr,datum,beginn, ende, + CASE + WHEN sp.mitarbeiter_kurzbz IS NOT NULL THEN sp.mitarbeiter_kurzbz + ELSE lektor + END as lektor, + CASE + WHEN gruppe_kurzbz IS NOT NULL THEN gruppe_kurzbz + ELSE CONCAT(UPPER(sp.stg_typ),UPPER(sp.stg_kurzbz),'-',COALESCE(CAST(sp.semester AS varchar),'/'),COALESCE(CAST(sp.verband AS varchar),'/')) + END as gruppen_kuerzel, + (SELECT bezeichnung + FROM public.tbl_organisationseinheit + WHERE oe_kurzbz IN( + SELECT oe_kurzbz + FROM lehre.tbl_lehrveranstaltung + WHERE lehrveranstaltung_id = sp.lehrveranstaltung_id + )) as organisationseinheit, + ort_kurzbz, studiengang_kz, titel,lehreinheit_id,lehrfach_id,anmerkung,fix,lehrveranstaltung_id,stg_kurzbzlang,stg_bezeichnung,stg_typ,fachbereich_kurzbz,lehrfach,lehrfach_bez,farbe,lehrform,anmerkung_lehreinheit,gruppe, verband, semester,stg_kurzbz + + FROM ( + SELECT sp.* + FROM lehre.vw_stundenplan sp + WHERE + sp.datum >= ? + AND sp.datum <= ? AND sp.lehrveranstaltung_id = ? + ) sp + JOIN lehre.tbl_stunde ON lehre.tbl_stunde.stunde = sp.stunde + + ) as subquery + + GROUP BY unr, datum, beginn, ende, ort_kurzbz, titel, lehrform, lehrfach, lehrfach_bez, organisationseinheit, farbe, lehrveranstaltung_id + + ORDER BY datum, beginn + ", [$start_date, $end_date, $lv_id]); + } + + /** + * queries Stundenplan and filters by assigned ma_kurzbz, very similar to get by LVA + * + * @return void + */ + public function getStundenplanMitarbeiter($start_date, $end_date, $ma_uid) { + return $this->execReadOnlyQuery(" + + SELECT + 'lehreinheit' as type, beginn, ende, datum, + CONCAT(lehrfach,'-',lehrform) as topic, + array_agg(DISTINCT lektor) as lektor, + array_agg(DISTINCT (gruppe,verband,semester,studiengang_kz,gruppen_kuerzel)) as gruppe, + string_agg(DISTINCT ort_kurzbz, '/') as ort_kurzbz, + array_agg(DISTINCT lehreinheit_id) as lehreinheit_id, + + titel, lehrfach, lehrform, lehrfach_bez, organisationseinheit, farbe, lehrveranstaltung_id + + FROM + ( + SELECT unr,datum,beginn, ende, + CASE + WHEN sp.mitarbeiter_kurzbz IS NOT NULL THEN sp.mitarbeiter_kurzbz + ELSE sp.lektor + END as lektor, + CASE + WHEN gruppe_kurzbz IS NOT NULL THEN gruppe_kurzbz + ELSE CONCAT(UPPER(sp.stg_typ),UPPER(sp.stg_kurzbz),'-',COALESCE(CAST(sp.semester AS varchar),'/'),COALESCE(CAST(sp.verband AS varchar),'/')) + END as gruppen_kuerzel, + (SELECT bezeichnung + FROM public.tbl_organisationseinheit + WHERE oe_kurzbz IN( + SELECT oe_kurzbz + FROM lehre.tbl_lehrveranstaltung + WHERE lehrveranstaltung_id = sp.lehrveranstaltung_id + )) as organisationseinheit, + sp.ort_kurzbz, sp.studiengang_kz, sp.titel,sp.lehreinheit_id,sp.lehrfach_id,sp.anmerkung,fix,lehrveranstaltung_id,stg_kurzbzlang,stg_bezeichnung,stg_typ,fachbereich_kurzbz,lehrfach,lehrfach_bez,farbe,lehrform,anmerkung_lehreinheit,gruppe, verband, semester,stg_kurzbz + + FROM ( + SELECT sp.* + FROM lehre.vw_stundenplan sp + WHERE + sp.datum >= ? + AND sp.datum <= ? + ) sp + JOIN lehre.tbl_stunde ON lehre.tbl_stunde.stunde = sp.stunde + JOIN public.tbl_mitarbeiter ON public.tbl_mitarbeiter.kurzbz = sp.mitarbeiter_kurzbz + WHERE mitarbeiter_uid = ? + + ) as subquery + + GROUP BY unr, datum, beginn, ende, ort_kurzbz, titel, lehrform, lehrfach, lehrfach_bez, organisationseinheit, farbe, lehrveranstaltung_id + + ORDER BY datum, beginn", [$start_date, $end_date, $ma_uid]); + } + /** * NO STANDALONE FUNCTION - Generates a SQL query string to fetch 'stundenplan' events for a specific student within the current semester. - * @param string $uid the user id that is used to fetch the stundenplan rows from the lehre.vw_stundenplan table * * @return mixed */ diff --git a/application/models/system/Vorlagestudiengang_model.php b/application/models/system/Vorlagestudiengang_model.php index 24af7353c..613d88226 100644 --- a/application/models/system/Vorlagestudiengang_model.php +++ b/application/models/system/Vorlagestudiengang_model.php @@ -11,4 +11,49 @@ class Vorlagestudiengang_model extends DB_Model $this->dbTable = 'public.tbl_vorlagestudiengang'; $this->pk = 'vorlagestudiengang_id'; } + + /** + * Gets the Current Vorlagestudiengang + * + * @param string $vorlage_kurzbz + * @param string $oe_kurzbz Or studiengang_kz + * @param integer $version (optional) + * @param boolean|null $active (optional) + * + * @return stdClass + */ + public function getCurrent($vorlage_kurzbz, $oe_kurzbz, $version = null, $active = true) + { + if (is_numeric($oe_kurzbz)) { + $initselect = "SELECT oe_kurzbz, 1 AS l FROM public.tbl_studiengang WHERE studiengang_kz = " . $this->escape($oe_kurzbz); + } else { + $initselect = "SELECT oe_kurzbz, 1 AS l FROM public.tbl_organisationseinheit WHERE oe_kurzbz = " . $this->escape($oe_kurzbz); + } + + $this->addJoin("( + WITH RECURSIVE tmp (oe_kurzbz, l) AS ( + " . $initselect . " + UNION ALL + SELECT o.oe_parent_kurzbz AS oe_kurzbz, l+1 AS l + FROM tmp + JOIN public.tbl_organisationseinheit o USING (oe_kurzbz) + WHERE o.oe_parent_kurzbz IS NOT NULL + ) SELECT * FROM tmp + ) oe", "oe_kurzbz"); + + if (!is_null($version)) + $this->db->where('version', $version); + if ($active) + $this->db->where('aktiv', true); + + $this->addOrder('l', 'ASC'); + $this->addOrder('version', 'DESC'); + $this->addLimit(1); + + $result = $this->loadWhere([ + 'vorlage_kurzbz' => $vorlage_kurzbz + ]); + + return $result; + } } diff --git a/application/views/Cis/InfoTerminal.php b/application/views/Cis/InfoTerminal.php new file mode 100644 index 000000000..ed05d1857 --- /dev/null +++ b/application/views/Cis/InfoTerminal.php @@ -0,0 +1,16 @@ + 'Infoterminal', + 'tabulator5' => true, + 'primevue3' => true, +); +$this->load->view( + 'templates/CISVUE-Header', + $includesArray +); +?> + + +load->view('templates/CISVUE-Footer', $includesArray); ?> diff --git a/application/views/Cis/MyLv.php b/application/views/Cis/MyLv.php deleted file mode 100644 index d8d5026a1..000000000 --- a/application/views/Cis/MyLv.php +++ /dev/null @@ -1,15 +0,0 @@ - 'MyLv', - 'customJSModules' => ['public/js/apps/Cis/MyLv/Student.js'], - 'customCSSs' => ['public/css/components/MyLv.css'] -); - -$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 index 788d44360..f66ebf8a9 100644 --- a/application/views/Cis/Profil.php +++ b/application/views/Cis/Profil.php @@ -1,6 +1,6 @@ 'Stundenplan', + 'title' => 'Profil', 'customJSModules' => ['public/js/apps/Cis/Profil.js'], 'tabulator5' => true, 'primevue3' => true, diff --git a/application/views/Cis/Stundenplan.php b/application/views/Cis/Stundenplan.php deleted file mode 100644 index bfab73109..000000000 --- a/application/views/Cis/Stundenplan.php +++ /dev/null @@ -1,15 +0,0 @@ - 'Stundenplan', - 'customJSModules' => ['public/js/apps/Cis/Stundenplan.js'], - 'customCSSs' => ['public/css/components/calendar.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 new file mode 100644 index 000000000..4590b210e --- /dev/null +++ b/application/views/CisRouterView/CisRouterView.php @@ -0,0 +1,41 @@ + 'Cis4', + 'axios027' => true, + 'bootstrap5' => true, + 'fontawesome6' => true, + 'tabulator5' => true, + 'vue3' => true, + 'primevue3' => true, + 'customCSSs' => array( + 'public/css/components/verticalsplit.css', + 'public/css/components/searchbar/searchbar.css', + 'public/css/Fhc.css', + 'public/css/components/dashboard.css', + 'public/css/components/calendar.css', + 'public/css/components/Sprachen.css', + 'public/css/components/MyLv.css', + 'public/css/components/FilterComponent.css', + 'public/css/components/Profil.css', + 'public/css/components/FormUnderline.css', + 'public/css/Cis4/Cms.css', + ), + 'customJSs' => array( + 'vendor/npm-asset/primevue/accordion/accordion.js', + 'vendor/npm-asset/primevue/accordiontab/accordiontab.js' + ), + 'customJSModules' => array( + 'public/js/apps/Dashboard/Fhc.js' + ), + +); + +$this->load->view('templates/CISVUE-Header', $includesArray); +?> +
> + +
+load->view('templates/CISVUE-Footer', $includesArray); ?> diff --git a/application/views/CisVue/Cms/Content.php b/application/views/CisVue/Cms/Content.php deleted file mode 100644 index f957bb7f9..000000000 --- a/application/views/CisVue/Cms/Content.php +++ /dev/null @@ -1,32 +0,0 @@ - ['public/js/apps/Cis/Cms.js'], - 'primevue3'=>true, - 'customCSSs' => [ - 'public/css/Cis4/Cms.css', - #'skin/style.css.php' - ] -); - -// adds the tabulator5 dependency for all templates to replace the tablesorter -$includesArray['tabulator5'] = true; - -if(defined('CIS4')){ - $this->load->view('templates/CISVUE-Header', $includesArray); -}else{ - $this->load->view('templates/FHC-Header', $includesArray); -} -?> - -
-' : ''); ?> -
- -load->view('templates/CISVUE-Footer', $includesArray); -} else { - $this->load->view('templates/FHC-Footer', $includesArray); -} - ?> - diff --git a/application/views/CisVue/Cms/RoomInformation.php b/application/views/CisVue/Cms/RoomInformation.php deleted file mode 100644 index e7b197504..000000000 --- a/application/views/CisVue/Cms/RoomInformation.php +++ /dev/null @@ -1,20 +0,0 @@ - 'RoomInformation', - 'customJSModules' => ['public/js/apps/Cis/RoomInformation.js'], - 'customCSSs' => ['public/css/components/calendar.css'] -); - -$this->load->view('templates/CISVUE-Header', $includesArray); -?> - -
-

Room Information:

-
-
- -
- -
- -load->view('templates/CISVUE-Footer', $includesArray); ?> diff --git a/application/views/CisVue/Dashboard.php b/application/views/CisVue/Dashboard.php deleted file mode 100644 index 2f241af87..000000000 --- a/application/views/CisVue/Dashboard.php +++ /dev/null @@ -1,20 +0,0 @@ - 'Dashboard', - 'tabulator5'=>true, - 'primevue3' => true, - 'customJSModules' => ['public/js/apps/Dashboard/Fhc.js'], - 'customCSSs' => [ - 'public/css/components/dashboard.css' - ], -); - -$this->load->view('templates/CISVUE-Header', $includesArray); -?> - -
- -
- -load->view('templates/CISVUE-Footer', $includesArray); ?> - diff --git a/application/views/Studentenverwaltung.php b/application/views/Studentenverwaltung.php index 2d0d22346..c10dc475a 100644 --- a/application/views/Studentenverwaltung.php +++ b/application/views/Studentenverwaltung.php @@ -34,8 +34,10 @@ !defined('GENERATE_ALIAS_STUDENT') ? true : GENERATE_ALIAS_STUDENT, - 'showZgvDoktor' => !defined('ZGV_DOKTOR_ANZEIGEN') ? false : ZGV_DOKTOR_ANZEIGEN, - 'showZgvErfuellt' => !defined('ZGV_ERFUELLT_ANZEIGEN') ? false : ZGV_ERFUELLT_ANZEIGEN + //replaced by possibility to hide each formular field via config stv.php + #'showZgvDoktor' => !defined('ZGV_DOKTOR_ANZEIGEN') ? false : ZGV_DOKTOR_ANZEIGEN, + #'showZgvErfuellt' => !defined('ZGV_ERFUELLT_ANZEIGEN') ? false : ZGV_ERFUELLT_ANZEIGEN + 'showHintKommPrfg' => !defined('FAS_STUDSTATUS_SHOW_KOMM_PRFG_HINT') ? false : FAS_STUDSTATUS_SHOW_KOMM_PRFG_HINT ]; ?> diff --git a/application/views/lehre/anrechnung/requestAnrechnung.php b/application/views/lehre/anrechnung/requestAnrechnung.php index 328af2f4f..81b07b1ee 100644 --- a/application/views/lehre/anrechnung/requestAnrechnung.php +++ b/application/views/lehre/anrechnung/requestAnrechnung.php @@ -85,7 +85,7 @@ else } -
+
diff --git a/application/views/system/logs/logsViewer.php b/application/views/system/logs/logsViewer.php index 8749806bc..ddfe855fe 100644 --- a/application/views/system/logs/logsViewer.php +++ b/application/views/system/logs/logsViewer.php @@ -8,11 +8,12 @@ 'filtercomponent' => true, 'navigationcomponent' => true, 'tabulator5' => true, + 'primevue3' => true, 'phrases' => array( 'global' => array('mailAnXversandt'), 'ui' => array('bitteEintragWaehlen') ), - 'customJSModules' => array('public/js/apps/LogsViewer/LogsViewer.js') + 'customJSModules' => array('public/js/apps/LogsViewer/LogsViewer.js'), ); $this->load->view('templates/FHC-Header', $includesArray); diff --git a/application/views/templates/CISVUE-Header.php b/application/views/templates/CISVUE-Header.php index 119b9e5ee..86b5b8755 100644 --- a/application/views/templates/CISVUE-Header.php +++ b/application/views/templates/CISVUE-Header.php @@ -5,6 +5,7 @@ $includesArray = array( 'bootstrap5' => true, 'fontawesome6' => true, 'axios027' => true, + 'primevue3' => true, 'customJSModules' => array_merge([ 'public/js/apps/Cis.js' ], $customJSModules ?? []), @@ -15,15 +16,6 @@ $includesArray = array( $this->load->view('templates/FHC-Header', $includesArray); - -if (!isset($menu)) { - $ci =& get_instance(); // get CI instance - $ci->load->model('content/Content_model', 'ContentModel'); - $ci->load->config('cis'); - $cis4_content_id = $ci->config->item('cis_menu_root_content_id'); - $result = $ci->ContentModel->getMenu($cis4_content_id, getAuthUID()); - $menu = getData($result)->childs ?? []; -} ?>