diff --git a/application/config/infocenter.php b/application/config/infocenter.php index 555c30996..15889ef78 100644 --- a/application/config/infocenter.php +++ b/application/config/infocenter.php @@ -3,3 +3,4 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); $config['infocenter_studiengang_kz'] = '10021, 10027, 10002'; +$config['infocenter_qualifikationskurs_kz'] = '10002'; diff --git a/application/config/routes.php b/application/config/routes.php index 1674b45ed..2c89e5ace 100644 --- a/application/config/routes.php +++ b/application/config/routes.php @@ -61,6 +61,15 @@ $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'; +// Legacy CMS news routes +$route['api/frontend/v1/Cms/getNewsItem/(:num)'] = 'api/frontend/v1/NewsAdministrationAPI/getNewsItem/$1'; +$route['api/frontend/v1/Cms/storeNewsItem'] = 'api/frontend/v1/NewsAdministrationAPI/storeNewsItem'; +$route['api/frontend/v1/Cms/updateNewsItem/(:num)'] = 'api/frontend/v1/NewsAdministrationAPI/updateNewsItem/$1'; +$route['api/frontend/v1/Cms/deleteNewsItem/(:num)'] = 'api/frontend/v1/NewsAdministrationAPI/deleteNewsItem/$1'; + +// Keep legacy uppercase URLs refreshable while using the canonical controller method casing +$route['CisVue/Cms/NewsAdministration'] = 'CisVue/Cms/newsAdministration'; + $route['Cis/LvPlan/.*'] = 'Cis/LvPlan/index/$1'; $route['Cis/MyLvPlan/.*'] = 'Cis/MyLvPlan/index/$1'; $route['Cis/MyLv/.*'] = 'Cis/MyLv/index/$1'; @@ -69,6 +78,8 @@ $route['Cis/OtherLvPlan/.*'] = 'Cis/OtherLvPlan/index/$1'; $route['Cis/StgOrgLvPlan/.*'] = 'Cis/StgOrgLvPlan/index/$1'; $route['Cis/Benotungstool/.*'] = 'Cis/Benotungstool/index/$1'; +$route['Cis/MyReservation'] = 'Cis/MyReservation/index/$1'; + //Route for Zeitsperrenma $route['Cis/Zeitsperrenma/.*'] = 'Cis/Zeitsperrenma/index/$1'; //Route für Zeitsperren diff --git a/application/controllers/Cis/MyReservation.php b/application/controllers/Cis/MyReservation.php new file mode 100644 index 000000000..e4045cf90 --- /dev/null +++ b/application/controllers/Cis/MyReservation.php @@ -0,0 +1,33 @@ + ['basis/cis:r'] + ]); + + // Load Config + $this->load->config('calendar'); + } + + // ----------------------------------------------------------------------------------------------------------------- + // Public methods + + /** + * @return void + */ + public function index() + { + $this->load->view('CisRouterView/CisRouterView.php', ['route' => 'MyReservation']); + } +} diff --git a/application/controllers/CisVue/Cms.php b/application/controllers/CisVue/Cms.php index aa07b919f..8f70e91c8 100644 --- a/application/controllers/CisVue/Cms.php +++ b/application/controllers/CisVue/Cms.php @@ -17,14 +17,15 @@ class Cms extends Auth_Controller array( 'content' => 'basis/cis:r', 'getNews' => 'basis/cis:r', - 'getNewsRowCount' => 'basis/cis:r', 'getRoomInformation' => 'basis/cis:r', - 'news' => 'basis/cis:r' + 'news' => 'basis/cis:r', + 'newsAdministration' => ['basis/news:r'], ) ); // Loads Libraries $this->load->library('CmsLib'); + $this->load->library('PermissionLib'); // Loads phrases system $this->loadPhrases([ @@ -83,10 +84,18 @@ class Cms extends Auth_Controller */ public function news($infoscreen = false, $studiengang_kz = null, $semester = null, $mischen = true, $titel = '', $edit = false, $sichtbar = true) { - $viewData = array(); - $this->load->view('CisRouterView/CisRouterView.php', ['viewData'=>$viewData, 'route' => 'News']); + $this->load->view('CisRouterView/CisRouterView.php', [ + 'route' => 'News', + ]); } + public function newsAdministration() + { + $this->load->view('CisRouterView/CisRouterView.php', [ + 'route' => 'NewsAdministration', + ]); + } + public function getRoomInformation($ort_kurzbz) { // Load Config diff --git a/application/controllers/api/frontend/v1/Benutzer.php b/application/controllers/api/frontend/v1/Benutzer.php new file mode 100644 index 000000000..f5dea1c7f --- /dev/null +++ b/application/controllers/api/frontend/v1/Benutzer.php @@ -0,0 +1,48 @@ +. + */ + +if (!defined('BASEPATH')) exit('No direct script access allowed'); + +class Benutzer extends FHCAPI_Controller +{ + + /** + * Object initialization + */ + public function __construct() + { + parent::__construct([ + 'getUserData' => self::PERM_LOGGED, + ]); + + $this->load->model('person/Benutzer_model', 'BenutzerModel'); + } + + //------------------------------------------------------------------------------------------------------------------ + // Public methods + + public function getUserData() + { + $uid = $this->input->get("uid") ?? getAuthUID(); + $this->BenutzerModel->addSelect("uid, person_id, insertamum"); + $userResult = $this->BenutzerModel->load(["uid" => $uid]); + $userData = $this->getDataOrTerminateWithError($userResult); + $this->terminateWithSuccess($userData); + } +} + diff --git a/application/controllers/api/frontend/v1/CisMenu.php b/application/controllers/api/frontend/v1/CisMenu.php index d5da7528f..debab48a4 100644 --- a/application/controllers/api/frontend/v1/CisMenu.php +++ b/application/controllers/api/frontend/v1/CisMenu.php @@ -67,8 +67,11 @@ class CisMenu extends FHCAPI_Controller private function generateUrlForMenuItem($menuItem) { - $menuItem->url = $this->menuItemUrlHelper($menuItem); - unset($menuItem->content); + if(!isset($menuItem->url)) + { + $menuItem->url = $this->menuItemUrlHelper($menuItem); + unset($menuItem->content); + } if ($menuItem->childs && count($menuItem->childs)) { $menuItem->childs = $this->generateUrlsForMenuItems($menuItem->childs); @@ -91,6 +94,8 @@ class CisMenu extends FHCAPI_Controller $doc->loadXML($menuItem->content); $urlElem = $doc->getElementsByTagName('url')->item(0); + $this->menuItemUrlTargetHelper($menuItem, $doc); + if (!$urlElem) { return ''; } @@ -122,5 +127,18 @@ class CisMenu extends FHCAPI_Controller return $url; } + private function menuItemUrlTargetHelper($menuItem, $xmldoc) + { + if($menuItem->template_kurzbz === 'redirect') + { + $targetElem = $xmldoc->getElementsByTagName('target')->item(0); + $target = ($targetElem) ? $targetElem->textContent : ''; + if(!in_array($target, array('_self', '_top', '_blank'))) + { + $target = '_self'; + } + $menuItem->target = $target; + } + } } diff --git a/application/controllers/api/frontend/v1/Cms.php b/application/controllers/api/frontend/v1/Cms.php index b8937a1f4..06b88c454 100644 --- a/application/controllers/api/frontend/v1/Cms.php +++ b/application/controllers/api/frontend/v1/Cms.php @@ -36,14 +36,15 @@ class Cms extends FHCAPI_Controller 'ContentID' => self::PERM_LOGGED, 'getOrtKurzbzContent' => self::PERM_LOGGED, 'content' => self::PERM_LOGGED, - 'news' => self::PERM_LOGGED, - 'getNewsRowCount' => self::PERM_LOGGED, + 'newsForWidget' => self::PERM_LOGGED, 'getNews' => self::PERM_LOGGED, ]); $this->load->model('content/News_model', 'NewsModel'); - + $this->load->model('crm/Student_model', 'StudentModel'); + $this->load->model('crm/Prestudent_model', 'PrestudentModel'); + // setting up the papgination_size $this->page_size = 10; @@ -59,7 +60,6 @@ class Cms extends FHCAPI_Controller //------------------------------------------------------------------------------------------------------------------ // Private methods - //------------------------------------------------------------------------------------------------------------------ // Public methods @@ -106,7 +106,7 @@ class Cms extends FHCAPI_Controller $this->terminateWithSuccess($content_id); } - public function news() + public function newsForWidget() { // form validation @@ -118,7 +118,7 @@ class Cms extends FHCAPI_Controller $this->load->model('content/news_model', 'NewsModel'); $limit = $this->input->get('limit',TRUE); - + //query the news $news = $this->NewsModel->getAll($limit); @@ -157,23 +157,7 @@ class Cms extends FHCAPI_Controller } - 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; - - $this->load->model('content/News_model','NewsModel'); - - $num_rows = $this->NewsModel->countNewsWithContent(getSprache(), $studiengang_kz, $semester, $fachbereich_kurzbz, $sichtbar, $maxalter, $page, $page_size, $all, $mischen); - - $num_rows = $this->getDataOrTerminateWithError($num_rows); - - $this->terminateWithSuccess($num_rows); - - } - - - public function getNews($infoscreen = false, $studiengang_kz = null, $semester = null, $mischen = true, $titel = '', $edit = false, $sichtbar = true) + public function getNews($infoscreen = false, $studiengang_kz = null, $semester = null, $mischen = false, $titel = '', $edit = false, $sichtbar = true) { //form validation $this->load->library('form_validation'); @@ -193,15 +177,45 @@ class Cms extends FHCAPI_Controller // default value for the page_size is 10 $page_size = $page_size ?? 10; + + $passedSichtbar = $this->input->get('published', true); + if($passedSichtbar !== null) + { + $sichtbar = $passedSichtbar; + } - $news = $this->cmslib->getNews($infoscreen, $studiengang_kz, $semester, $mischen, $titel, $edit, $sichtbar, $page, $page_size, $sprache); + $filterForDegreePrograms = false; + $entitledDegreePrograms = []; + $student = $this->StudentModel->loadWhere(['student_uid' => getAuthUID()]); + if(isError($student)) + { + $this->terminateWithError(getError($student)); + } + if(hasData($student)) + { + $student = current(getData($student)); + + $degreeProgramSemesterDataResult = $this->PrestudentModel->getStudiengaengAndAusbildungssemesterByStudentUid(getAuthUID()); + $degreeProgramSemesterData = $this->getDataOrTerminateWithError($degreeProgramSemesterDataResult)[0]; + if ($degreeProgramSemesterData) { + $studiengang_kz = isset($degreeProgramSemesterData->studiengang_kz) ? $degreeProgramSemesterData->studiengang_kz : null; + $semester = isset($degreeProgramSemesterData->ausbildungssemester) ? $degreeProgramSemesterData->ausbildungssemester : null; + } + + $mischen = true; + } else { + $filterForDegreePrograms = true; + $entitledDegreePrograms = $this->permissionlib->getSTG_isEntitledFor("basis/news"); + array_push($entitledDegreePrograms, 0); + } + + $news = $this->cmslib->getNews($infoscreen, $studiengang_kz, $semester, $mischen, $titel, $edit, $sichtbar, $page, $page_size, $sprache, $filterForDegreePrograms, $entitledDegreePrograms, true); $news = $this->getDataOrTerminateWithError($news); - $this->addMeta('phrases', json_decode($this->p->getJson())); - $this->terminateWithSuccess($news); + $this->addMeta('row_count', $news["row_count"] ?? 0); + $this->terminateWithSuccess($news["content"]); } } - diff --git a/application/controllers/api/frontend/v1/Lehrveranstaltung.php b/application/controllers/api/frontend/v1/Lehrveranstaltung.php index 66bda9ebf..78e0acce3 100644 --- a/application/controllers/api/frontend/v1/Lehrveranstaltung.php +++ b/application/controllers/api/frontend/v1/Lehrveranstaltung.php @@ -81,7 +81,7 @@ class Lehrveranstaltung extends FHCAPI_Controller { $studiengang_kz = $this->getStudiengangKz($stg_kz); - if (is_null($studiengang_kz) || !preg_match("/^-?[1-9][0-9]*$/", (string)$studiengang_kz)) + if (is_null($studiengang_kz) || !preg_match("/^(-?[1-9][0-9]*|0)$/", (string)$studiengang_kz)) $this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); $verband = null; diff --git a/application/controllers/api/frontend/v1/LvPlan.php b/application/controllers/api/frontend/v1/LvPlan.php index 36054003c..f9d2cc3cf 100644 --- a/application/controllers/api/frontend/v1/LvPlan.php +++ b/application/controllers/api/frontend/v1/LvPlan.php @@ -114,6 +114,7 @@ class LvPlan extends FHCAPI_Controller // fetching lvplan events $result = $this->stundenplanlib->getEventsUser($start_date, $end_date, $uid); + $lvplanEvents = $this->getDataOrTerminateWithError($result); // fetching moodle events diff --git a/application/controllers/api/frontend/v1/MaZeitsperren.php b/application/controllers/api/frontend/v1/MaZeitsperren.php index 8e83e6df1..1cded3cbe 100644 --- a/application/controllers/api/frontend/v1/MaZeitsperren.php +++ b/application/controllers/api/frontend/v1/MaZeitsperren.php @@ -7,15 +7,15 @@ class MaZeitsperren extends FHCAPI_Controller public function __construct() { parent::__construct([ - 'getAllActiveZeitsperren' => self::PERM_LOGGED, - 'getAllZeitsperrenFixeMa' => self::PERM_LOGGED, - 'getAllZeitsperrenLector' => self::PERM_LOGGED, - 'getAllZeitsperrenOes' => self::PERM_LOGGED, - 'getZeitsperrenAss' => self::PERM_LOGGED, + 'getAllActiveZeitsperren' => ['basis/mitarbeiter:r', 'admin:r', 'assistenz:r'], + 'getAllZeitsperrenFixeMa' => ['basis/mitarbeiter:r', 'admin:r', 'assistenz:r'], + 'getAllZeitsperrenLector' => ['basis/mitarbeiter:r', 'admin:r', 'assistenz:r'], + 'getAllZeitsperrenOes' => ['basis/mitarbeiter:r', 'admin:r', 'assistenz:r'], + 'getZeitsperrenAss' => ['basis/mitarbeiter:r', 'admin:r', 'assistenz:r'], 'getStgLectors' => self::PERM_LOGGED, - 'loadZeitsperrenLectorStg' => self::PERM_LOGGED, - 'loadZeitsperrenMa' => self::PERM_LOGGED, - 'getDetailsMa' => self::PERM_LOGGED, + 'loadZeitsperrenLectorStg' => ['basis/mitarbeiter:r', 'admin:r', 'assistenz:r'], + 'loadZeitsperrenMa' => ['basis/mitarbeiter:r', 'admin:r', 'assistenz:r'], + 'getDetailsMa' => self::PERM_LOGGED ]); // Load Libraries diff --git a/application/controllers/api/frontend/v1/NewsAdministrationAPI.php b/application/controllers/api/frontend/v1/NewsAdministrationAPI.php new file mode 100644 index 000000000..e15e403cd --- /dev/null +++ b/application/controllers/api/frontend/v1/NewsAdministrationAPI.php @@ -0,0 +1,948 @@ +. + */ + +if (!defined('BASEPATH')) exit('No direct script access allowed'); + +class NewsAdministrationAPI extends FHCAPI_Controller +{ + /** + * News API constructor. + */ + public function __construct() + { + parent::__construct([ + 'getNews' => 'basis/news:r', + 'getNewsItem' => 'basis/news:r', + 'storeNewsItem' => 'basis/news:w', + 'updateNewsItem' => 'basis/news:w', + 'deleteNewsItem' => 'basis/news:w' + ]); + + $this->load->model('content/Content_model', 'ContentModel'); + $this->load->model('content/Contentsprache_model', 'ContentspracheModel'); + $this->load->model('content/News_model', 'NewsModel'); + $this->load->model('organisation/Studiengang_model', 'StudiengangModel'); + $this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel'); + $this->load->model('system/Sprache_model', 'SpracheModel'); + $this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel'); + + $this->loadPhrases([ + 'global' + ]); + + $this->load->library('CmsLib'); + + $this->load->helper('hlp_sancho_helper'); + } + + //------------------------------------------------------------------------------------------------------------------ + // Public methods + + public function getNews($infoscreen = false, $studiengang_kz = null, $semester = null, $titel = '', $active = true, $sichtbar = true) + { + $this->load->library('form_validation'); + $this->form_validation->set_data($_GET); + $this->form_validation->set_rules('page','Page','required|is_natural'); + $this->form_validation->set_rules('page_size', 'PageSize', 'is_natural'); + if($this->form_validation->run() == FALSE) $this->terminateWithValidationErrors($this->form_validation->error_array()); + + $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; + + $passedSichtbar = $this->input->get('published', true); + if($passedSichtbar !== null) + { + $sichtbar = $passedSichtbar; + } + + $passedIsActive = $this->input->get('isActive', true); + if ($passedIsActive !== null) + { + $isActive = filter_var( + $passedIsActive, + FILTER_VALIDATE_BOOLEAN, + FILTER_NULL_ON_FAILURE + ); + if ($isActive !== null) + { + $active = $isActive; + } + } + + $degreeProgramShortCode = $this->input->get('degreeProgramShortCode', true); + if ($degreeProgramShortCode !== null && $degreeProgramShortCode !== '') + { + if (!ctype_digit((string)$degreeProgramShortCode)) + { + $this->terminateWithValidationErrors([ + 'degreeProgramShortCode' => 'A valid degree program is required' + ]); + } + $studiengang_kz = $degreeProgramShortCode; + } + + $passedSemester = $this->input->get('semester', true); + if ($passedSemester !== null && $passedSemester !== '') + { + if ( + !ctype_digit((string)$passedSemester) + || (int)$passedSemester < 1 + || (int)$passedSemester > 8 + ) + { + $this->terminateWithValidationErrors([ + 'semester' => 'A valid semester is required' + ]); + } + $semester = filter_var($passedSemester, FILTER_VALIDATE_INT); + } + + $entitledDegreePrograms = $this->permissionlib->getSTG_isEntitledFor("basis/news"); + + $news = $this->cmslib->getNews($infoscreen, $studiengang_kz, $semester, false, $titel, true, $sichtbar, $page, $page_size, $sprache, true, $entitledDegreePrograms, $active); + $news = $this->getDataOrTerminateWithError($news); + + $this->addMeta('row_count', $news["row_count"] ?? 0); + $this->terminateWithSuccess($news["content"]); + } + + /** + * Returns one news entry with all available language versions for editing. + * + * @return void + */ + public function getNewsItem($newsId) + { + if (!is_numeric($newsId) || (int)$newsId < 1) + { + $this->terminateWithValidationErrors([ + 'newsId' => 'A valid news ID is required' + ]); + } + + $newsId = (int)$newsId; + $newsResult = $this->NewsModel->load($newsId); + + if (isError($newsResult)) + { + $this->terminateWithError(getError($newsResult), self::ERROR_TYPE_DB); + } + + if (!hasData($newsResult)) + { + $this->terminateWithValidationErrors([ + 'newsId' => 'The requested news entry does not exist' + ]); + } + + $news = current(getData($newsResult)); + $entitledDegreePrograms = $this->permissionlib->getSTG_isEntitledFor("basis/news"); + + if (!in_array($news->studiengang_kz, $entitledDegreePrograms)) { + $this->terminateWithError('You are not entitled to access this news entry', self::ERROR_TYPE_PERMISSION); + } + $translationsResult = $this->ContentspracheModel->loadWhere([ + 'content_id' => $news->content_id + ]); + + if (isError($translationsResult)) + { + $this->terminateWithError(getError($translationsResult), self::ERROR_TYPE_DB); + } + + $languages = []; + + foreach ((array)getData($translationsResult) as $translation) + { + $languages[$translation->sprache] = true; + } + + $translations = []; + + foreach (array_keys($languages) as $language) + { + $contentResult = $this->ContentModel->getContent( + $news->content_id, + $language, + null, + null, + false + ); + + if (isError($contentResult)) + { + $this->terminateWithError(getError($contentResult), self::ERROR_TYPE_DB); + } + + $content = getData($contentResult); + $document = new DOMDocument('1.0', 'UTF-8'); + + if ($content->content !== '' && $document->loadXML($content->content) === false) + { + $this->terminateWithError( + 'The stored news content is invalid', + self::ERROR_TYPE_GENERAL + ); + } + + $author = $document->getElementsByTagName('verfasser')->item(0); + $title = $document->getElementsByTagName('betreff')->item(0); + $text = $document->getElementsByTagName('text')->item(0); + + $translations[] = [ + 'language' => $language, + 'author' => $author ? $author->nodeValue : '', + 'title' => $title ? $title->nodeValue : '', + 'text' => $text ? str_replace('dms.php', APP_ROOT . 'cms/dms.php', $text->nodeValue) : '', + 'isPublished' => (bool)$content->sichtbar + ]; + } + + $this->terminateWithSuccess([ + 'newsId' => (int)$news->news_id, + 'visibleFrom' => $news->datum, + 'visibleTo' => $news->datum_bis, + 'degreeProgramShortCode' => $news->studiengang_kz, + 'semester' => $news->semester, + 'translations' => $translations + ]); + } + + /** + * Creates a news entry and all supplied translations. + * + * @return void + */ + public function storeNewsItem() + { + $this->load->library('form_validation'); + $postData = $this->input->post(null, true); + $this->form_validation->set_data(is_array($postData) ? $postData : []); + $this->form_validation->set_rules('visibleFrom', 'Visible from', 'required|is_valid_date'); + $this->form_validation->set_rules('visibleTo', 'Visible to', 'is_valid_date'); + $this->form_validation->set_rules( + 'degreeProgramShortCode', + 'Degree program', + 'required|is_natural' + ); + $this->form_validation->set_rules( + 'semester', + 'Semester', + 'is_natural_no_zero|less_than_equal_to[8]' + ); + + $errors = $this->form_validation->run() === false + ? $this->form_validation->error_array() + : []; + $visibleFrom = $this->input->post('visibleFrom', true); + $visibleTo = $this->input->post('visibleTo', true); + $translations = $this->input->post('translations', true); + + if ( + is_string($visibleFrom) + && is_string($visibleTo) + && $visibleTo !== '' + && is_valid_date($visibleFrom) + && is_valid_date($visibleTo) + && new DateTime($visibleTo) < new DateTime($visibleFrom) + ) + { + $errors['visibleTo'] = 'Visible to must not be before Visible from'; + } + + if (!is_array($translations) || count($translations) === 0) + { + $errors['translations'] = 'At least one translation is required'; + } + else + { + foreach ($translations as $index => $translation) + { + if (!is_array($translation)) + { + $errors['translations.' . $index] = 'Each translation must be an object'; + } + } + } + + if (count($errors) > 0) + { + $this->terminateWithValidationErrors($errors); + } + + + $this->_ensureUserIsEntitledForDegreeProgram($this->input->post('degreeProgramShortCode', true)); + + $degreeProgramShortCode = $this->input->post('degreeProgramShortCode', true); + $semester = $this->input->post('semester', true); + $semester = $semester === '' ? null : $semester; + $visibleTo = $visibleTo === '' ? null : $visibleTo; + + $studiengang = $this->_getStudiengang($degreeProgramShortCode); + + $data = [ + 'studiengang_kz' => $degreeProgramShortCode, + 'semester' => $semester, + 'datum' => $visibleFrom, + 'datum_bis' => $visibleTo, + 'translations' => [] + ]; + + foreach ($translations as $index => $translation) + { + $data['translations'][$index] = [ + 'sprache' => $translation['language'] ?? '', + 'verfasser' => $translation['author'] ?? '', + 'betreff' => $translation['title'] ?? '', + 'text' => $translation['text'] ?? '', + 'sichtbar' => isset($translation['isPublished']) ? (bool)$translation['isPublished'] : false + ]; + } + + $this->_validateLanguages($data['translations']); + + foreach ($data['translations'] as $index => $translation) + { + $data['translations'][$index]['content'] = $this->_buildNewsXml($translation); + } + + $uid = getAuthUID(); + $now = date('Y-m-d H:i:s'); + + if ($this->db->trans_begin() === false) + { + $this->terminateWithError($this->db->error(), self::ERROR_TYPE_DB); + } + + $contentResult = $this->ContentModel->insert([ + 'template_kurzbz' => 'news', + 'oe_kurzbz' => $studiengang->oe_kurzbz, + 'aktiv' => true, + 'menu_open' => false, + 'insertamum' => $now, + 'insertvon' => $uid + ]); + $contentId = (int)$this->_getInsertedIdOrRollback($contentResult); + + $newsResult = $this->NewsModel->insert([ + 'uid' => $uid, + 'studiengang_kz' => $data['studiengang_kz'], + 'semester' => $data['semester'], + 'datum' => $data['datum'], + 'datum_bis' => $data['datum_bis'], + 'content_id' => $contentId, + 'insertamum' => $now, + 'insertvon' => $uid, + 'updateamum' => $now, + 'updatevon' => $uid + ]); + $newsId = (int)$this->_getInsertedIdOrRollback($newsResult); + + foreach ($data['translations'] as $translation) + { + $translation['content'] = $this->formatContentURLsToRelative($translation['content']); + + $translationResult = $this->ContentspracheModel->insert([ + 'sprache' => $translation['sprache'], + 'content_id' => $contentId, + 'version' => 1, + 'sichtbar' => $translation['sichtbar'], + 'content' => $translation['content'], + 'titel' => $translation['betreff'], + 'insertamum' => $now, + 'insertvon' => $uid, + 'updateamum' => $now, + 'updatevon' => $uid + ]); + + $this->_getInsertedIdOrRollback($translationResult); + } + + $newsItemResult = $this->NewsModel->load($newsId); + $newsItem = $this->getDataOrTerminateWithError($newsItemResult); + $newsItem = $newsItem[0]; + + $this->_sendNewsItemTranslationRequiredMail( + $newsItem + ); + + if ($this->db->trans_status() === false) + { + $error = $this->db->error(); + $this->db->trans_rollback(); + $this->terminateWithError($error, self::ERROR_TYPE_DB); + } + + if ($this->db->trans_commit() === false) + { + $error = $this->db->error(); + $this->db->trans_rollback(); + $this->terminateWithError($error, self::ERROR_TYPE_DB); + } + + $this->terminateWithSuccess($newsId); + } + + /** + * Updates a news entry and its supplied translations. + * + * @return void + */ + public function updateNewsItem($newsId) + { + if (!is_numeric($newsId) || (int)$newsId < 1) + { + $this->terminateWithValidationErrors([ + 'newsId' => 'A valid news ID is required' + ]); + } + + $newsId = (int)$newsId; + $existingNewsResult = $this->NewsModel->load($newsId); + + if (isError($existingNewsResult)) + { + $this->terminateWithError(getError($existingNewsResult), self::ERROR_TYPE_DB); + } + + if (!hasData($existingNewsResult)) + { + $this->terminateWithValidationErrors([ + 'newsId' => 'The requested news entry does not exist' + ]); + } + + $existingNews = current(getData($existingNewsResult)); + + $this->_ensureUserIsEntitledForDegreeProgram($existingNews->studiengang_kz); + + $this->load->library('form_validation'); + $postData = $this->input->post(null, true); + $this->form_validation->set_data(is_array($postData) ? $postData : []); + $this->form_validation->set_rules('visibleFrom', 'Visible from', 'required|is_valid_date'); + $this->form_validation->set_rules('visibleTo', 'Visible to', 'is_valid_date'); + $this->form_validation->set_rules( + 'degreeProgramShortCode', + 'Degree program', + 'required|is_natural' + ); + $this->form_validation->set_rules( + 'semester', + 'Semester', + 'is_natural_no_zero|less_than_equal_to[8]' + ); + + $errors = $this->form_validation->run() === false + ? $this->form_validation->error_array() + : []; + $visibleFrom = $this->input->post('visibleFrom', true); + $visibleTo = $this->input->post('visibleTo', true); + $translations = $this->input->post('translations', true); + + if ( + is_string($visibleFrom) + && is_string($visibleTo) + && $visibleTo !== '' + && is_valid_date($visibleFrom) + && is_valid_date($visibleTo) + && new DateTime($visibleTo) < new DateTime($visibleFrom) + ) + { + $errors['visibleTo'] = 'Visible to must not be before Visible from'; + } + + if (!is_array($translations) || count($translations) === 0) + { + $errors['translations'] = 'At least one translation is required'; + } + else + { + foreach ($translations as $index => $translation) + { + if (!is_array($translation)) + { + $errors['translations.' . $index] = 'Each translation must be an object'; + } + } + } + + if (count($errors) > 0) + { + $this->terminateWithValidationErrors($errors); + } + + $degreeProgramShortCode = $this->input->post('degreeProgramShortCode', true); + $semester = $this->input->post('semester', true); + $semester = $semester === '' ? null : $semester; + $visibleTo = $visibleTo === '' ? null : $visibleTo; + + $studiengang = $this->_getStudiengang($degreeProgramShortCode); + + $data = [ + 'studiengang_kz' => $degreeProgramShortCode, + 'semester' => $semester, + 'datum' => $visibleFrom, + 'datum_bis' => $visibleTo, + 'translations' => [] + ]; + + foreach ($translations as $index => $translation) + { + $data['translations'][$index] = [ + 'sprache' => $translation['language'] ?? '', + 'verfasser' => $translation['author'] ?? '', + 'betreff' => $translation['title'] ?? '', + 'text' => $translation['text'] ?? '', + 'sichtbar' => isset($translation['isPublished']) ? (bool)$translation['isPublished'] : false + ]; + } + + $this->_validateLanguages($data['translations']); + + foreach ($data['translations'] as $index => $translation) + { + $data['translations'][$index]['content'] = $this->_buildNewsXml($translation); + } + + $uid = getAuthUID(); + $now = date('Y-m-d H:i:s'); + + if ($this->db->trans_begin() === false) + { + $this->terminateWithError($this->db->error(), self::ERROR_TYPE_DB); + } + + $contentResult = $this->ContentModel->update($existingNews->content_id, [ + 'oe_kurzbz' => $studiengang->oe_kurzbz, + 'updateamum' => $now, + 'updatevon' => $uid + ]); + + if (isError($contentResult)) + { + $this->db->trans_rollback(); + $this->terminateWithError(getError($contentResult), self::ERROR_TYPE_DB); + } + + $newsResult = $this->NewsModel->update($newsId, [ + 'studiengang_kz' => $data['studiengang_kz'], + 'semester' => $data['semester'], + 'datum' => $data['datum'], + 'datum_bis' => $data['datum_bis'], + 'updateamum' => $now, + 'updatevon' => $uid + ]); + + if (isError($newsResult)) + { + $this->db->trans_rollback(); + $this->terminateWithError(getError($newsResult), self::ERROR_TYPE_DB); + } + + $existingTranslationsResult = $this->ContentspracheModel->loadWhere([ + 'content_id' => $existingNews->content_id + ]); + + if (isError($existingTranslationsResult)) + { + $this->db->trans_rollback(); + $this->terminateWithError(getError($existingTranslationsResult), self::ERROR_TYPE_DB); + } + + $existingTranslations = []; + + foreach ((array)getData($existingTranslationsResult) as $existingTranslation) + { + $language = $existingTranslation->sprache; + + if ( + !isset($existingTranslations[$language]) + || (int)$existingTranslation->version > (int)$existingTranslations[$language]->version + ) + { + $existingTranslations[$language] = $existingTranslation; + } + } + + $submittedLanguages = array_column($data['translations'], 'sprache'); + $this->db->where('content_id', $existingNews->content_id); + $this->db->where_not_in('sprache', $submittedLanguages); + + if ($this->db->delete('campus.tbl_contentsprache') === false) + { + $error = $this->db->error(); + $this->db->trans_rollback(); + $this->terminateWithError($error, self::ERROR_TYPE_DB); + } + + foreach ($data['translations'] as $translation) + { + $translation['content'] = $this->formatContentURLsToRelative($translation['content']); + $translationData = [ + 'sichtbar' => $translation['sichtbar'], + 'content' => $translation['content'], + 'titel' => $translation['betreff'], + 'updateamum' => $now, + 'updatevon' => $uid + ]; + + $existingTranslation = $existingTranslations[$translation['sprache']] ?? null; + + if ($existingTranslation) + { + $translationResult = $this->ContentspracheModel->update( + $existingTranslation->contentsprache_id, + $translationData + ); + } + else + { + $translationResult = $this->ContentspracheModel->insert([ + 'sprache' => $translation['sprache'], + 'content_id' => $existingNews->content_id, + 'version' => 1, + 'insertamum' => $now, + 'insertvon' => $uid + ] + $translationData); + } + + $this->_getInsertedIdOrRollback($translationResult); + } + + if ($this->db->trans_status() === false) + { + $error = $this->db->error(); + $this->db->trans_rollback(); + $this->terminateWithError($error, self::ERROR_TYPE_DB); + } + + if ($this->db->trans_commit() === false) + { + $error = $this->db->error(); + $this->db->trans_rollback(); + $this->terminateWithError($error, self::ERROR_TYPE_DB); + } + + $this->terminateWithSuccess($newsId); + } + + /** + * Deletes one news entry and its linked content. + * + * @return void + */ + public function deleteNewsItem($newsId) + { + if (!is_numeric($newsId) || (int)$newsId < 1) + { + $this->terminateWithValidationErrors([ + 'newsId' => 'A valid news ID is required' + ]); + } + + $newsId = (int)$newsId; + $newsResult = $this->NewsModel->load($newsId); + + if (isError($newsResult)) + { + $this->terminateWithError(getError($newsResult), self::ERROR_TYPE_DB); + } + + if (!hasData($newsResult)) + { + $this->terminateWithValidationErrors([ + 'newsId' => 'The requested news entry does not exist' + ]); + } + + $news = current(getData($newsResult)); + + + $this->_ensureUserIsEntitledForDegreeProgram($news->studiengang_kz); + + if ($this->db->trans_begin() === false) + { + $this->terminateWithError($this->db->error(), self::ERROR_TYPE_DB); + } + + $newsDeleteResult = $this->NewsModel->delete($newsId); + + if (isError($newsDeleteResult)) + { + $this->db->trans_rollback(); + $this->terminateWithError(getError($newsDeleteResult), self::ERROR_TYPE_DB); + } + + $this->db->where('content_id', $news->content_id); + + if ($this->db->delete('campus.tbl_contentsprache') === false) + { + $error = $this->db->error(); + $this->db->trans_rollback(); + $this->terminateWithError($error, self::ERROR_TYPE_DB); + } + + $contentDeleteResult = $this->ContentModel->delete($news->content_id); + + if (isError($contentDeleteResult)) + { + $this->db->trans_rollback(); + $this->terminateWithError(getError($contentDeleteResult), self::ERROR_TYPE_DB); + } + + if ($this->db->trans_status() === false) + { + $error = $this->db->error(); + $this->db->trans_rollback(); + $this->terminateWithError($error, self::ERROR_TYPE_DB); + } + + if ($this->db->trans_commit() === false) + { + $error = $this->db->error(); + $this->db->trans_rollback(); + $this->terminateWithError($error, self::ERROR_TYPE_DB); + } + + $this->terminateWithSuccess($newsId); + } + + //------------------------------------------------------------------------------------------------------------------ + // Private methods + + /** + * Loads the requested Studiengang or reports a validation error. + * + * @param integer $studiengangKz + * @return stdClass + */ + private function _getStudiengang($studiengangKz) + { + $result = $this->StudiengangModel->load($studiengangKz); + + if (isError($result)) + { + $this->terminateWithError(getError($result), self::ERROR_TYPE_DB); + } + + if (!hasData($result)) + { + $this->terminateWithValidationErrors([ + 'studiengang_kz' => 'The requested Studiengang does not exist' + ]); + } + + $studiengaenge = getData($result); + + return current($studiengaenge); + } + + /** + * Ensures that all supplied languages exist in tbl_sprache. + * + * @param array $translations + * @return void + */ + private function _validateLanguages($translations) + { + $languages = []; + + foreach ($translations as $translation) + { + $languages[] = $translation['sprache']; + } + + $result = $this->SpracheModel->loadMultiple($languages); + + if (isError($result)) + { + $this->terminateWithError(getError($result), self::ERROR_TYPE_DB); + } + + $existingLanguages = []; + + foreach ((array)getData($result) as $language) + { + $existingLanguages[$language->sprache] = true; + } + + $errors = []; + + foreach ($translations as $index => $translation) + { + if (!isset($existingLanguages[$translation['sprache']])) + { + $errors['translations.' . $index . '.sprache'] = 'The requested language does not exist'; + } + } + + if (count($errors) > 0) + { + $this->terminateWithValidationErrors($errors); + } + } + + private function _ensureUserIsEntitledForDegreeProgram($degreeProgramShortCode) + { + $entitledDegreePrograms = $this->permissionlib->getSTG_isEntitledFor("basis/news:w"); + if (!is_array($entitledDegreePrograms)) + { + $this->terminateWithError('Failed to retrieve entitled degree programs for the user', self::ERROR_TYPE_GENERAL); + } + + if (!in_array($degreeProgramShortCode, $entitledDegreePrograms)) { + $this->terminateWithError("User is not entitled for the specified degree program"); + } + } + /** + * Returns an inserted identifier or rolls the transaction back on error. + * + * @param stdClass $result + * @return mixed + */ + private function _getInsertedIdOrRollback($result) + { + if (isError($result)) + { + $this->db->trans_rollback(); + $this->terminateWithError(getError($result), self::ERROR_TYPE_DB); + } + + return getData($result); + } + + /** + * Builds the XML format consumed by existing news readers. + * + * @param array $translation + * @return string + */ + private function _buildNewsXml($translation) + { + $document = new DOMDocument('1.0', 'UTF-8'); + $news = $document->createElement('news'); + $document->appendChild($news); + + $this->_appendCdataElement($document, $news, 'verfasser', $translation['verfasser']); + $this->_appendCdataElement($document, $news, 'betreff', $translation['betreff']); + $this->_appendCdataElement($document, $news, 'text', $translation['text']); + + return $document->saveXML($news); + } + + /** + * Appends a CDATA element and safely preserves CDATA terminators. + * + * @param DOMDocument $document + * @param DOMElement $parent + * @param string $name + * @param string $value + * @return void + */ + private function _appendCdataElement($document, $parent, $name, $value) + { + $element = $document->createElement($name); + $parts = explode(']]>', $value); + $lastIndex = count($parts) - 1; + + foreach ($parts as $index => $part) + { + if ($index > 0) + { + $part = '>' . $part; + } + + if ($index < $lastIndex) + { + $part .= ']]'; + } + + $element->appendChild($document->createCDATASection($part)); + } + + $parent->appendChild($element); + } + + private function _sendNewsItemTranslationRequiredMail($newsItem) + { + $translatorsResult = $this->BenutzerfunktionModel->getBenutzerFunktionen("translate", $newsItem->studiengang_kz); + $translators = $this->getDataOrTerminateWithError($translatorsResult); + + $newsItemContentResult = $this->ContentspracheModel->loadWhere([ + 'content_id' => $newsItem->content_id, + 'sprache' => 'German' + ]); + $newsItemContentEntry = getData($newsItemContentResult)[0] ?? null; + if ($newsItemContentEntry) { + $newsItem->sichtbar = $newsItemContentEntry->sichtbar ?? false; + $newsItem->content = $newsItemContentEntry->content; + } + $content = getData( + $this->cmslib->createNewsContent( + $this->cmslib->createNewsWrapper($newsItem, true), + false, + "" + ) + ); + + foreach ($translators as $translator) { + sendSanchoMail( + "Sancho_Mail_News_Translation_Req", + [ + "newsItemUrl" => APP_ROOT . "cis.php/CisVue/Cms/newsAdministration?newsId=" . $newsItem->news_id, + "newsItemAuthor" => $newsItem->verfasser, + "newsItemSubject" => $newsItem->betreff, + "newsItemContent" => $content + ], + $translator->uid . "@" . DOMAIN, + "Übersetzung erforderlich / Translation required" + ); + } + } + + private function formatContentURLsToRelative($content) + { + $content = preg_replace( + '#https?://[^"\'>\s]*/(dms\.php(?:\?[^"\'>\s]*)?)#i', + '$1', + $content + ); + + $content = preg_replace( + '#(?:\.\./)+[^"\'>\s]*/(dms\.php(?:\?[^"\'>\s]*)?)#i', + '$1', + $content + ); + + $content = preg_replace( + '#/[^"\'>\s]*/(dms\.php(?:\?[^"\'>\s]*)?)#i', + '$1', + $content + ); + + return $content; + } +} diff --git a/application/controllers/api/frontend/v1/OtherLvPlan.php b/application/controllers/api/frontend/v1/OtherLvPlan.php index 1807f0a4a..e6616cc99 100644 --- a/application/controllers/api/frontend/v1/OtherLvPlan.php +++ b/application/controllers/api/frontend/v1/OtherLvPlan.php @@ -1,6 +1,6 @@ . + */ + +if (!defined('BASEPATH')) + exit('No direct script access allowed'); + +class Permission extends FHCAPI_Controller +{ + + /** + * Object initialization + */ + public function __construct() + { + parent::__construct([ + 'getPermissions' => self::PERM_LOGGED, + ]); + } + + //------------------------------------------------------------------------------------------------------------------ + // Public methods + + /** + * retrieves permissions for auth user + * @access public + */ + public function getPermissions() + { + $permissionsParam = $this->input->post("permissions"); + if (!$permissionsParam || !is_array($permissionsParam)) { + $this->terminateWithError("Invalid parameter!"); + } + + $permissions = []; + foreach ($permissionsParam as $permission) { + $permissions[$permission] = $this->permissionlib->isBerechtigt($permission); + } + + $this->terminateWithSuccess($permissions); + } + + // ----------------------------------------------------------------------------------------------------------------- + // Private methods + +} + diff --git a/application/controllers/api/frontend/v1/Reservierung.php b/application/controllers/api/frontend/v1/Reservierung.php new file mode 100644 index 000000000..6ee9b293e --- /dev/null +++ b/application/controllers/api/frontend/v1/Reservierung.php @@ -0,0 +1,67 @@ +. + */ + +if (! defined('BASEPATH')) exit('No direct script access allowed'); + +class Reservierung extends FHCAPI_Controller +{ + + /** + * Object initialization + */ + public function __construct() + { + parent::__construct([ + 'getMyReservation' => 'basis/cis:r', + 'deleteReservation' => 'lehre/reservierung:rw' + ]); + + $this->load->model('ressource/Reservierung_model', 'ReservierungModel'); + + } + + /** + * Retrieves all reservations from lehre.vw_reservation of the logged in user + */ + public function getMyReservation() + { + $result = $this->ReservierungModel->getMyReservation(); + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + + /** + * deletes a reservation by ID + */ + public function deleteReservation() + { + $reservierung_id = $this->input->post('reservierung_id'); + + + if ($reservierung_id === NULL || trim((string)$reservierung_id) === '') { + $this->terminateWithError($this->p->t('global', 'wrongParameters'), 'general'); + } + + $result = $this->ReservierungModel->deleteReservation($reservierung_id); + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } +} + diff --git a/application/controllers/api/frontend/v1/Studgang.php b/application/controllers/api/frontend/v1/Studgang.php index 82aebb666..001706c92 100644 --- a/application/controllers/api/frontend/v1/Studgang.php +++ b/application/controllers/api/frontend/v1/Studgang.php @@ -27,7 +27,7 @@ class Studgang extends FHCAPI_Controller { parent::__construct([ 'getStudiengangInfo'=> self::PERM_LOGGED, - + 'getDegreePrograms'=> self::PERM_LOGGED, ]); $this->load->model('organisation/Studiengang_model', 'StudiengangModel'); @@ -43,15 +43,46 @@ class Studgang extends FHCAPI_Controller //------------------------------------------------------------------------------------------------------------------ // Public methods - public function getStudiengangInfo(){ - $isMitarbeiter = $this->MitarbeiterModel->isMitarbeiter(getAuthUID()); - $isMitarbeiter = $this->getDataOrTerminateWithError($isMitarbeiter); - if($isMitarbeiter) { - $this->terminateWithSuccess(null); + public function getDegreePrograms() { + $entitledDegreePrograms = $this->permissionlib->getSTG_isEntitledFor("basis/news"); + if (!$entitledDegreePrograms) { + $this->terminateWithError("User is not entitled for any degree program"); } - + + $activeDegreePrograms = $this->StudiengangModel->getDegreePrograms(); + $activeDegreePrograms= $this->getDataOrTerminateWithError($activeDegreePrograms); + + $activeDegreePrograms = array_values(array_filter($activeDegreePrograms, function($degreeProgram) use ($entitledDegreePrograms) { + return in_array($degreeProgram->studiengang_kz, $entitledDegreePrograms); + })); + + $this->terminateWithSuccess($activeDegreePrograms); + } + + public function getStudiengangInfo(){ + $studiengang_kz = $this->input->get('studiengang_kz', true); + $semester = $this->input->get('semester', true); + + // without a Studiengang the info of the logged in Student is returned + if (!is_numeric($studiengang_kz)) + { + $isMitarbeiter = $this->MitarbeiterModel->isMitarbeiter(getAuthUID()); + $isMitarbeiter = $this->getDataOrTerminateWithError($isMitarbeiter); + if($isMitarbeiter) { + $this->terminateWithSuccess(null); + } + + $studiengang_kz = null; + $semester = null; + } + else + { + $studiengang_kz = (int)$studiengang_kz; + $semester = is_numeric($semester) ? (int)$semester : null; + } + // fetches the Studiengang Information which is used next to the news - $studiengangInfo = $this->StudiengangModel->getStudiengangInfoForNews(); + $studiengangInfo = $this->StudiengangModel->getStudiengangInfoForNews($studiengang_kz, $semester); $studiengangInfo= $this->getDataOrTerminateWithError($studiengangInfo); $this->terminateWithSuccess($studiengangInfo); } diff --git a/application/controllers/api/frontend/v1/Studium.php b/application/controllers/api/frontend/v1/Studium.php index f53a4105c..4794bedd3 100644 --- a/application/controllers/api/frontend/v1/Studium.php +++ b/application/controllers/api/frontend/v1/Studium.php @@ -167,7 +167,9 @@ class Studium extends FHCAPI_Controller if($aktuelles_studienplan){ $lehrveranstaltungen = $this->computeStudienplanLehrveranstaltungen($aktuelles_studienplan->studienplan_id, $aktuelles_semester); foreach($lehrveranstaltungen as $lehrv){ - foreach($lehrv->lehrveranstaltungen as $lv){ + // a lehrveranstaltung without a modul has no children and gets its lektoren directly + $lvs = isset($lehrv->lehrveranstaltungen) ? $lehrv->lehrveranstaltungen : [$lehrv]; + foreach($lvs as $lv){ $lvLektoren =$this->computeLektorenFromLehrveranstaltung($lv->lehrveranstaltung_id,$aktuelles_semester, $aktuelles_studiengang->studiengang_kz, $aktuelles_studiensemester->studiensemester_kurzbz); $lv->lektoren = $lvLektoren; } @@ -286,6 +288,7 @@ SELECT tbl_lehrveranstaltung.*, $lehrveranstaltungen = $this->LehrveranstaltungModel->execReadOnlyQuery($query,[$studienplan_id, $semester]); $lehrveranstaltungen = $this->getDataOrTerminateWithError($lehrveranstaltungen); + usort($lehrveranstaltungen, function($a, $b){ if($a->lehrtyp_kurzbz == "modul"){ return -1; @@ -302,12 +305,17 @@ SELECT tbl_lehrveranstaltung.*, } else{ $parent =array_filter($carry, function($item)use($lehrv){ - return $item->studienplan_lehrveranstaltung_id == $lehrv->studienplan_lehrveranstaltung_id_parent; + return isset($item->lehrveranstaltungen) + && $item->studienplan_lehrveranstaltung_id == $lehrv->studienplan_lehrveranstaltung_id_parent; }); $parent = current($parent); if($parent){ $parent->lehrveranstaltungen[] = $lehrv; } + else{ + // lehrveranstaltung without a modul: keep it on the top level + array_push($carry, $lehrv); + } } return $carry; }, []); diff --git a/application/controllers/api/frontend/v1/Zeitsperren.php b/application/controllers/api/frontend/v1/Zeitsperren.php index d2698d205..aa25e911d 100644 --- a/application/controllers/api/frontend/v1/Zeitsperren.php +++ b/application/controllers/api/frontend/v1/Zeitsperren.php @@ -7,14 +7,14 @@ class Zeitsperren extends FHCAPI_Controller public function __construct() { parent::__construct([ - 'getZeitsperrenUser' => self::PERM_LOGGED, + 'getZeitsperrenUser' => ['basis/mitarbeiter:r', 'admin:r', 'assistenz:r'], 'getTypenZeitsperren' => self::PERM_LOGGED, 'getTypenErreichbarkeit' => self::PERM_LOGGED, 'getStunden' => self::PERM_LOGGED, - 'loadZeitsperre' => self::PERM_LOGGED, - 'add' => self::PERM_LOGGED, - 'update' => self::PERM_LOGGED, - 'delete' => self::PERM_LOGGED, + 'loadZeitsperre' => ['basis/mitarbeiter:r', 'admin:r', 'assistenz:r'], + 'add' => ['basis/mitarbeiter:r', 'admin:r', 'assistenz:r'], + 'update' => ['basis/mitarbeiter:r', 'admin:r', 'assistenz:r'], + 'delete' => ['basis/mitarbeiter:r', 'admin:r', 'assistenz:r'], ]); // Load Libraries diff --git a/application/controllers/api/frontend/v1/dashboard/Widget.php b/application/controllers/api/frontend/v1/dashboard/Widget.php index ac8c682e8..99865b6db 100644 --- a/application/controllers/api/frontend/v1/dashboard/Widget.php +++ b/application/controllers/api/frontend/v1/dashboard/Widget.php @@ -101,6 +101,9 @@ class Widget extends FHCAPI_Controller $tmpsetup = json_decode($widget->setup); $tmpsetup->file = absoluteJsImportUrl($tmpsetup->file); $widget->setup = $tmpsetup; + $widget->permitted = empty($widget->berechtigung_kurzbz) + || $this->permissionlib->isBerechtigt($widget->berechtigung_kurzbz); + return $widget; }, $widgets); diff --git a/application/controllers/api/frontend/v1/funktionen/Funktionen.php b/application/controllers/api/frontend/v1/funktionen/Funktionen.php index a3efcdb51..821dcf5bd 100644 --- a/application/controllers/api/frontend/v1/funktionen/Funktionen.php +++ b/application/controllers/api/frontend/v1/funktionen/Funktionen.php @@ -12,9 +12,9 @@ class Funktionen extends FHCAPI_Controller parent::__construct(array( 'getAllFunctions' => ['admin:r', 'assistenz:r'], 'getAllUserFunctions' => ['admin:r', 'assistenz:r'], - 'getOrgHeads' => ['admin:r', 'assistenz:r'], - 'getOrgetsForCompany' => ['admin:r', 'assistenz:r'], - 'getAllOrgUnits' => ['admin:r', 'assistenz:r'], + 'getOrgHeads' => self::PERM_LOGGED, + 'getOrgetsForCompany' => self::PERM_LOGGED, + 'getAllOrgUnits' => self::PERM_LOGGED, 'loadFunction' => ['admin:r', 'assistenz:r'], 'insertFunction' => ['admin:rw', 'assistenz:rw'], 'updateFunction' => ['admin:rw', 'assistenz:rw'], diff --git a/application/controllers/api/frontend/v1/stv/LvTermine.php b/application/controllers/api/frontend/v1/stv/LvTermine.php index b9e23e77d..0d070ffd3 100644 --- a/application/controllers/api/frontend/v1/stv/LvTermine.php +++ b/application/controllers/api/frontend/v1/stv/LvTermine.php @@ -370,6 +370,7 @@ class LvTermine extends FHCAPI_Controller $result->semester = $item->semester; $result->verband = $item->verband; $result->gruppe = $item->gruppe; + $result->studiensemester_kurzbz = $item->studiensemester_kurzbz; return $result; }, $lehrverband_query_result)); diff --git a/application/controllers/api/frontend/v1/stv/Projektarbeit.php b/application/controllers/api/frontend/v1/stv/Projektarbeit.php index d26d6a10c..f8131bd3a 100644 --- a/application/controllers/api/frontend/v1/stv/Projektarbeit.php +++ b/application/controllers/api/frontend/v1/stv/Projektarbeit.php @@ -42,6 +42,8 @@ class Projektarbeit extends FHCAPI_Controller $this->load->model('education/Note_model', 'NoteModel'); $this->load->model('education/Projektbetreuer_model', 'BetreuerModel'); $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + $this->load->model('crm/Student_model', 'StudentModel'); + $this->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel'); // load libraries $this->load->library('PermissionLib'); @@ -100,16 +102,16 @@ class Projektarbeit extends FHCAPI_Controller private function fetchProjektarbeitById($projektarbeit_id) { $this->ProjektarbeitModel->resetQuery(); $this->ProjektarbeitModel->addSelect( - 'lehre.tbl_projektarbeit.projektarbeit_id, titel, titel_english, themenbereich, projekttyp_kurzbz, lehrveranstaltung_id, lehreinheit_id, - firma_id, beginn, ende, gesperrtbis, note, final, freigegeben, tbl_projektarbeit.anmerkung, fa.name AS firma_name' + 'lehre.tbl_projektarbeit.projektarbeit_id, titel, titel_english, themenbereich, projekttyp_kurzbz, lehrveranstaltung_id, lehreinheit_id, + tbl_projektarbeit.studiensemester_kurzbz, firma_id, beginn, ende, gesperrtbis, note, final, freigegeben, tbl_projektarbeit.anmerkung, fa.name AS firma_name' ); - $this->ProjektarbeitModel->addJoin('lehre.tbl_lehreinheit le', 'lehreinheit_id'); $this->ProjektarbeitModel->addJoin('lehre.tbl_lehrveranstaltung lv', 'lehrveranstaltung_id'); $this->ProjektarbeitModel->addJoin('public.tbl_firma fa', 'firma_id', 'LEFT'); + + return $this->ProjektarbeitModel->loadWhere( array('projektarbeit_id' => $projektarbeit_id) ); - } /** @@ -246,14 +248,38 @@ class Projektarbeit extends FHCAPI_Controller $additional_lehrveranstaltung_id = $this->input->get('additional_lehrveranstaltung_id'); if (!isset($student_uid)) $this->terminateWithError($this->p->t('ui', 'error_missingId', ['id'=> 'Student UID']), self::ERROR_TYPE_GENERAL); - if (!isset($studiensemester_kurzbz)) $this->terminateWithError('Studiensemster missing', self::ERROR_TYPE_GENERAL); + if (!isset($studiensemester_kurzbz)) $this->terminateWithError('Studiensemester missing', self::ERROR_TYPE_GENERAL); - // get Lvs + // get prestudent_id from student model + $studentRes = $this->StudentModel->load(['student_uid' => $student_uid]); + if(hasData($studentRes)) { + $student = getData($studentRes); + } else { + $this->terminateWithError($studentRes, self::ERROR_TYPE_GENERAL); + } + + // to get prestudent_status history + $historyRes = $this->PrestudentstatusModel->getHistoryPrestudent($student[0]->prestudent_id); + if(hasData($historyRes)) { + $history = getData($historyRes); + } else { + $this->terminateWithError($historyRes, self::ERROR_TYPE_GENERAL); + } + + // query for every lva of a studiengang that has projektarbeit flag true $lvsResult = $this->LehrveranstaltungModel->getLvsForProjektarbeit($student_uid, $studiengang_kz, $additional_lehrveranstaltung_id); - if (isError($lvsResult)) return $this->terminateWithError($lvsResult, self::ERROR_TYPE_GENERAL); - $lvs = hasData($lvsResult) ? getData($lvsResult) : []; + + $lvsIDs = array_column($lvs, 'lehrveranstaltung_id'); + + // get current studienplan_id from status history to find out which lva options are actually assigned to the students studienplan + // important so the projektarbeit has the correct lva assigned to be able to find and print the thesis title on the degree documents! + $currentStatus = $history[0]; + $lvByStudienPlanRes = $this->LehrveranstaltungModel->getLvsByStudienplanByLvaIDs($currentStatus->studienplan_id, $lvsIDs); + if(hasData($lvByStudienPlanRes)) { + $lvs = getData($lvByStudienPlanRes); + } foreach ($lvs as $lv) { @@ -320,11 +346,18 @@ class Projektarbeit extends FHCAPI_Controller 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Projekttyp']) ]); - $this->form_validation->set_rules('lehreinheit_id', 'Lehreinheit', 'required|is_natural', [ - 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Lehreinheit']), + $this->form_validation->set_rules('lehreinheit_id', 'Lehreinheit', 'is_natural', [ 'is_natural' => $this->p->t('ui', 'error_fieldNotNumeric', ['field' => 'Lehreinheit']) ]); + $this->form_validation->set_rules('lehrveranstaltung_id', 'Lehrveranstaltung', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Lehrveranstaltung']) + ]); + + $this->form_validation->set_rules('studiensemester_kurzbz', 'Studiensemester', 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Studiensemester']) + ]); + $this->form_validation->set_rules('beginn', 'Beginn', 'is_valid_date', [ 'is_valid_date' => $this->p->t('ui', 'error_notValidDate', ['field' => 'Beginn']) ]); @@ -354,6 +387,8 @@ class Projektarbeit extends FHCAPI_Controller 'projekttyp_kurzbz' => $formData['projekttyp_kurzbz'], 'firma_id' => $formData['firma_id'] ?? null, 'lehreinheit_id' => $formData['lehreinheit_id'], + 'lehrveranstaltung_id' => $formData['lehrveranstaltung_id'], + 'studiensemester_kurzbz' => $formData['studiensemester_kurzbz'], 'beginn' => isset($formData['beginn']) && !isEmptyString($formData['beginn']) ? $formData['beginn'] : null, 'ende' => isset($formData['ende']) && !isEmptyString($formData['ende']) ? $formData['ende'] : null, 'note' => $formData['note'] ?? null, diff --git a/application/controllers/api/frontend/v1/stv/Students.php b/application/controllers/api/frontend/v1/stv/Students.php index 39ed72072..6427df0ac 100644 --- a/application/controllers/api/frontend/v1/stv/Students.php +++ b/application/controllers/api/frontend/v1/stv/Students.php @@ -108,6 +108,7 @@ class Students extends FHCAPI_Controller 'studiensemester_kurzbz' => $studiensemester_kurzbz ]); + $studiensemester_kurzbz = $this->getStudiensemesterKurzbz($studiensemester_kurzbz); $this->studentlistlib->addJoin( "( @@ -153,7 +154,8 @@ class Students extends FHCAPI_Controller $this->addMeta('ci_params', [ 'studiensemester_kurzbz' => $studiensemester_kurzbz ]); - + + $studiensemester_kurzbz = $this->getStudiensemesterKurzbz($studiensemester_kurzbz); $this->studentlistlib->addJoin( "( @@ -213,6 +215,7 @@ class Students extends FHCAPI_Controller 'studiensemester_kurzbz' => $studiensemester_kurzbz ]); + $studiensemester_kurzbz = $this->getStudiensemesterKurzbz($studiensemester_kurzbz); $this->studentlistlib->addJoin( "( diff --git a/application/controllers/jobs/ReihungstestJob.php b/application/controllers/jobs/ReihungstestJob.php index 6dd214fbb..83ab9b526 100644 --- a/application/controllers/jobs/ReihungstestJob.php +++ b/application/controllers/jobs/ReihungstestJob.php @@ -803,7 +803,7 @@ class ReihungstestJob extends JOB_Controller { if (!isset($studiensemester) || isEmptyString($studiensemester)) { - $this->logError("Studiensemster not passed as parameter"); + $this->logError("Studiensemester not passed as parameter"); return; } diff --git a/application/controllers/system/infocenter/InfoCenter.php b/application/controllers/system/infocenter/InfoCenter.php index eaa207ff1..f10d94a8a 100644 --- a/application/controllers/system/infocenter/InfoCenter.php +++ b/application/controllers/system/infocenter/InfoCenter.php @@ -34,6 +34,9 @@ class InfoCenter extends Auth_Controller const PREV_FILTER_ID = 'prev_filter_id'; const KEEP_TABLESORTER_FILTER = 'keepTsFilter'; + const ONBOARDING_INSERTVON = 'onboarding'; + const ONBOARDING_KENNZEICHENTYP = 'eobRegistrierungsId'; + private $_uid; // contains the UID of the logged user // Used to log with PersonLogLib @@ -175,6 +178,7 @@ class InfoCenter extends Auth_Controller $this->load->model('person/Kontakt_model', 'KontaktModel'); $this->load->model('person/Geschlecht_model', 'GeschlechtModel'); $this->load->model('person/adresse_model', 'AdresseModel'); + $this->load->model('person/Kennzeichen_model', 'KennzeichenModel'); // Loads libraries $this->load->library('PersonLogLib'); @@ -1452,6 +1456,100 @@ class InfoCenter extends Auth_Controller $this->outputJsonSuccess("Done!"); } + + public function getAbsageData() + { + $stg_typ = $this->getStudienArtBerechtigung(['b', 'm']); + + if (!is_null($stg_typ)) + { + $statusgruende = $this->StatusgrundModel->getStatus(self::ABGEWIESENERSTATUS, true)->retval; + $studienSemester = $this->variablelib->getVar('infocenter_studiensemester'); + $studiengaenge = $this->StudiengangModel->getStudiengaengeWithOrgForm(array_column($stg_typ, 'typ'), $studienSemester); + + $data = array ( + 'statusgruende' => $statusgruende, + 'studiengaenge' => $studiengaenge->retval + ); + + $this->outputJsonSuccess($data); + } + else + $this->outputJsonSuccess(null); + } + + public function getStudienArtBerechtigung($typ = null) + { + $studiengang_kz_all = $this->permissionlib->getSTG_isEntitledFor('infocenter'); + $stg_typ = $this->StudiengangModel->getStudiengangTyp($studiengang_kz_all, $typ); + return getData($stg_typ); + } + + public function getStudienartData() + { + $this->outputJsonSuccess($this->getStudienArtBerechtigung(['b', 'm', 'l'])); + } + + public function saveAbsageForAll() + { + $statusgrund = $this->input->post('statusgrund'); + $studiengang = $this->input->post('studiengang'); + $abgeschickt = $this->input->post('abgeschickt'); + $personen = $this->input->post('personen'); + $studienSemester = $this->variablelib->getVar('infocenter_studiensemester'); + + if ($statusgrund === 'null' || $studiengang === 'null' || $abgeschickt === 'null' || empty($personen)) + $this->terminateWithJsonError("Bitte füllen Sie alle Felder aus"); + + if ($studiengang === 'all' && $abgeschickt === 'all') + { + foreach($personen as $person) + { + $prestudenten = $this->PrestudentModel->getByPersonWithoutLehrgang($person, $studienSemester); + + if (!hasData($prestudenten)) + continue; + + $prestudentenData = getData($prestudenten); + + foreach ($prestudentenData as $prestudent) + { + $this->saveAbsage($prestudent->prestudent_id, $statusgrund); + } + } + } + else + { + $this->load->model('organisation/Studienplan_model', 'StudienplanModel'); + + $this->StudienplanModel->addSelect('1'); + $this->StudienplanModel->addJoin('lehre.tbl_studienordnung so', 'studienordnung_id'); + $escaped = $this->StudienplanModel->db->escape(strtoupper($studiengang)); + $this->StudienplanModel->db->where("UPPER(so.studiengangkurzbzlang || ':' || tbl_studienplan.orgform_kurzbz) = $escaped"); + $this->StudienplanModel->addLimit(1); + $studiengangResult = $this->StudienplanModel->load(); + + if (hasData($studiengangResult)) + { + foreach($personen as $person) + { + $prestudent = $this->PrestudentModel->getPrestudentByStudiengangAndPerson($studiengang, $person, $studienSemester, $abgeschickt, $abgeschickt === 'all'); + + if (!hasData($prestudent)) + continue; + + $prestudentData = getData($prestudent); + $this->saveAbsage($prestudentData[0]->prestudent_id, $statusgrund); + } + } + else + $this->terminateWithJsonError("Falschen Studiengang übergeben!"); + + } + + $this->outputJsonSuccess("Success"); + } + // ----------------------------------------------------------------------------------------------------------------- // Private methods @@ -1946,6 +2044,17 @@ class InfoCenter extends Auth_Controller show_error(getError($user_person)); } + // add info about first electronig onboarding login + $this->KennzeichenModel->addSelect('insertamum'); + $onboarding_first_login = $this->KennzeichenModel->loadWhere( + array('person_id' => $person_id, 'kennzeichentyp_kurzbz' => self::ONBOARDING_KENNZEICHENTYP) + ); + + if (isError($onboarding_first_login)) + { + show_error(getError($onboarding_first_login)); + } + $data = array ( 'lockedby' => $lockedby, 'lockedbyother' => $lockedbyother, @@ -1955,7 +2064,9 @@ class InfoCenter extends Auth_Controller 'messages' => $messages->retval, 'logs' => $logs, 'notizen' => $notizen->retval, - 'notizenbewerbung' => $notizen_bewerbung->retval + 'notizenbewerbung' => $notizen_bewerbung->retval, + 'created_by_onboarding' => $stammdaten->retval->insertvon == self::ONBOARDING_INSERTVON, + 'onboarding_first_login' => hasData($onboarding_first_login) ? getData($onboarding_first_login)[0]->insertamum : null ); return $data; @@ -2375,97 +2486,4 @@ class InfoCenter extends Auth_Controller $this->loglib->logError('Studiengang has no mail for sending Freigabe mail'); } } - - public function getAbsageData() - { - $stg_typ = $this->getStudienArtBerechtigung(['b', 'm']); - - if (!is_null($stg_typ)) - { - $statusgruende = $this->StatusgrundModel->getStatus(self::ABGEWIESENERSTATUS, true)->retval; - $studienSemester = $this->variablelib->getVar('infocenter_studiensemester'); - $studiengaenge = $this->StudiengangModel->getStudiengaengeWithOrgForm(array_column($stg_typ, 'typ'), $studienSemester); - - $data = array ( - 'statusgruende' => $statusgruende, - 'studiengaenge' => $studiengaenge->retval - ); - - $this->outputJsonSuccess($data); - } - else - $this->outputJsonSuccess(null); - } - - public function getStudienArtBerechtigung($typ = null) - { - $studiengang_kz_all = $this->permissionlib->getSTG_isEntitledFor('infocenter'); - $stg_typ = $this->StudiengangModel->getStudiengangTyp($studiengang_kz_all, $typ); - return getData($stg_typ); - } - - public function getStudienartData() - { - $this->outputJsonSuccess($this->getStudienArtBerechtigung(['b', 'm', 'l'])); - } - - public function saveAbsageForAll() - { - $statusgrund = $this->input->post('statusgrund'); - $studiengang = $this->input->post('studiengang'); - $abgeschickt = $this->input->post('abgeschickt'); - $personen = $this->input->post('personen'); - $studienSemester = $this->variablelib->getVar('infocenter_studiensemester'); - - if ($statusgrund === 'null' || $studiengang === 'null' || $abgeschickt === 'null' || empty($personen)) - $this->terminateWithJsonError("Bitte füllen Sie alle Felder aus"); - - if ($studiengang === 'all' && $abgeschickt === 'all') - { - foreach($personen as $person) - { - $prestudenten = $this->PrestudentModel->getByPersonWithoutLehrgang($person, $studienSemester); - - if (!hasData($prestudenten)) - continue; - - $prestudentenData = getData($prestudenten); - - foreach ($prestudentenData as $prestudent) - { - $this->saveAbsage($prestudent->prestudent_id, $statusgrund); - } - } - } - else - { - $this->load->model('organisation/Studienplan_model', 'StudienplanModel'); - - $this->StudienplanModel->addSelect('1'); - $this->StudienplanModel->addJoin('lehre.tbl_studienordnung so', 'studienordnung_id'); - $escaped = $this->StudienplanModel->db->escape(strtoupper($studiengang)); - $this->StudienplanModel->db->where("UPPER(so.studiengangkurzbzlang || ':' || tbl_studienplan.orgform_kurzbz) = $escaped"); - $this->StudienplanModel->addLimit(1); - $studiengangResult = $this->StudienplanModel->load(); - - if (hasData($studiengangResult)) - { - foreach($personen as $person) - { - $prestudent = $this->PrestudentModel->getPrestudentByStudiengangAndPerson($studiengang, $person, $studienSemester, $abgeschickt, $abgeschickt === 'all'); - - if (!hasData($prestudent)) - continue; - - $prestudentData = getData($prestudent); - $this->saveAbsage($prestudentData[0]->prestudent_id, $statusgrund); - } - } - else - $this->terminateWithJsonError("Falschen Studiengang übergeben!"); - - } - - $this->outputJsonSuccess("Success"); - } } \ No newline at end of file diff --git a/application/controllers/system/infocenter/Rueckstellung.php b/application/controllers/system/infocenter/Rueckstellung.php index b1f2b60b7..2a122348f 100644 --- a/application/controllers/system/infocenter/Rueckstellung.php +++ b/application/controllers/system/infocenter/Rueckstellung.php @@ -7,6 +7,8 @@ class Rueckstellung extends Auth_Controller private $_ci; // Code igniter instance private $_uid; + const ZGV_UEBERPRUEFUNG_MAIL_VORLAGE = 'ZGVUEP'; + public function __construct() { parent::__construct( @@ -23,6 +25,7 @@ class Rueckstellung extends Auth_Controller $this->load->model('crm/RueckstellungStatus_model', 'RueckstellungStatusModel'); $this->load->model('person/Person_model', 'PersonModel'); $this->load->library('PersonLogLib'); + $this->load->library('MessageLib'); $this->_setAuthUID(); // sets property uid @@ -78,6 +81,8 @@ class Rueckstellung extends Auth_Controller $this->_log($person_id, $status_kurzbz); + if ($status_kurzbz === 'onhold_zgv') + $this->sendRueckstellungMessage($person_id); $this->outputJson($result); } @@ -104,6 +109,10 @@ class Rueckstellung extends Auth_Controller if (isError($result)) $this->terminateWithJsonError(getError($result)); $this->_log($person, $status_kurzbz); + + if ($status_kurzbz === 'onhold_zgv') + $this->sendRueckstellungMessage($person); + } $this->outputJsonSuccess("Erfolgreich gespeichert!"); } @@ -160,4 +169,26 @@ class Rueckstellung extends Auth_Controller $this->_uid ); } + + private function sendRueckstellungMessage($person_id) + { + $person = $this->_ci->PersonModel->load($person_id); + + if (hasData($person)) + { + $person = getData($person)[0]; + + return $this->messagelib->sendMessageUserTemplate( + $person_id, + self::ZGV_UEBERPRUEFUNG_MAIL_VORLAGE, + array( + 'anrede' => $person->anrede, + 'nachname' => $person->nachname + ), + null, + getAuthPersonId(), + 'infocenter' + ); + } + } } \ No newline at end of file diff --git a/application/helpers/hlp_header_helper.php b/application/helpers/hlp_header_helper.php index eb2cd9f85..41f361bf1 100644 --- a/application/helpers/hlp_header_helper.php +++ b/application/helpers/hlp_header_helper.php @@ -82,6 +82,21 @@ function generateCSSsInclude($CSSs) } } +/** + * Generates tags for the style sheets you want to include, the parameter could by a string or an array of strings + */ +function generatePrintCSS($path) +{ + $cssLink = ''; + + $ci =& get_instance(); + $cachetoken = '?'.$ci->config->item('fhcomplete_build_version'); + + if (isset($path)) { + echo sprintf($cssLink, base_url($path).$cachetoken) . PHP_EOL; + } +} + /** * Generates global JS-Object to pass parms to other javascripts */ diff --git a/application/libraries/AnrechnungLib.php b/application/libraries/AnrechnungLib.php index 8ee1891b5..4c27a297c 100644 --- a/application/libraries/AnrechnungLib.php +++ b/application/libraries/AnrechnungLib.php @@ -741,7 +741,7 @@ class AnrechnungLib $fullname = hasData($result) ? $result->retval[0]->vorname. $result->retval[0]->nachname : ''; // Return filename - return 'Anrechnungsantrag'. $orgform_kurzbz .'_LV-'. $lehrveranstaltung_id. '_'. $fullname; + return 'Anrechnungsantrag'. $orgform_kurzbz .'_LV-'. $lehrveranstaltung_id. '_'. $fullname . '.pdf'; } public function LVhasLector($anrechnung_id) diff --git a/application/libraries/CmsLib.php b/application/libraries/CmsLib.php index 355cf7c56..89f06c412 100644 --- a/application/libraries/CmsLib.php +++ b/application/libraries/CmsLib.php @@ -4,6 +4,7 @@ if (!defined('BASEPATH')) exit('No direct script access allowed'); use \DateTime as DateTime; +use \DateInterval as DateInterval; use \DOMDocument as DOMDocument; use \XSLTProcessor as XSLTProcessor; @@ -141,63 +142,6 @@ class CmsLib ]); } - /** - * @param stdClass $stg_obj - * - * @return stdClass - */ - protected function getNewsExtras($stg_obj, $semester) - { - $this->ci->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel'); - - $stg_ltg = $this->ci->StudiengangModel->getLeitungDetailed($stg_obj->studiengang_kz); - if (isError($stg_ltg)) - return $stg_ltg; - $stg_ltg = getData($stg_ltg) ?: []; - - $gf_ltg = $this->ci->BenutzerfunktionModel->getBenutzerFunktionenDetailed('gLtg', $stg_obj->oe_kurzbz); - if (isError($gf_ltg)) - return $gf_ltg; - $gf_ltg = getData($gf_ltg) ?: []; - - $stv_ltg = $this->ci->BenutzerfunktionModel->getBenutzerFunktionenDetailed('stvLtg', $stg_obj->oe_kurzbz); - if (isError($stv_ltg)) - return $stv_ltg; - $stv_ltg = getData($stv_ltg) ?: []; - - $ass = $this->ci->BenutzerfunktionModel->getBenutzerFunktionenDetailed('ass', $stg_obj->oe_kurzbz); - if (isError($ass)) - return $ass; - $ass = getData($ass) ?: []; - - $hochschulvertr = $this->ci->BenutzerfunktionModel->getBenutzerFunktionenDetailed('hsv'); - if (isError($hochschulvertr)) - return $hochschulvertr; - $hochschulvertr = getData($hochschulvertr) ?: []; - - $stdv = $this->ci->BenutzerfunktionModel->getBenutzerFunktionenDetailed('stdv', $stg_obj->oe_kurzbz); - if (isError($stdv)) - return $stdv; - $stdv = getData($stdv) ?: []; - - $jahrgangsvertr = $this->ci->BenutzerfunktionModel->getBenutzerFunktionenDetailed('jgv', $stg_obj->oe_kurzbz, $semester); - if (isError($jahrgangsvertr)) - return $jahrgangsvertr; - $jahrgangsvertr = getData($jahrgangsvertr) ?: []; - - return success($this->ci->load->view('Cis/Cms/News/Xml/NewsExtras', [ - 'studiengang' => $stg_obj, - 'semester' => $semester, - 'stg_ltg' => $stg_ltg, - 'gf_ltg' => $gf_ltg, - 'stv_ltg' => $stv_ltg, - 'ass' => $ass, - 'hochschulvertr' => $hochschulvertr, - 'stdv' => $stdv, - 'jahrgangsvertr' => $jahrgangsvertr - ], true)); - } - /** * @param string $studiengang_kz * @param string $semester @@ -233,64 +177,102 @@ 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, $sprache) + public function getNews($infoscreen = false, $studiengang_kz = null, $semester = null, $mischen = true, $titel = '', $edit = false, $sichtbar = true, $page = 1, $page_size = 10, $sprache, $filterForDegreePrograms = false, $allowedDegreePrograms = [], $active = true) + { $this->ci->load->model('organisation/Studiengang_model', 'StudiengangModel'); list($studiengang_kz, $semester) = $this->getStgAndSem($studiengang_kz, $semester); - $all = $edit; - - $xml = ''; $this->ci->load->model('content/News_model', 'NewsModel'); - $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); + + $news = $this->ci->NewsModel->getNewsWithContent($sprache, $studiengang_kz, $semester, null, $sichtbar, $page, $page_size, $active, $mischen, $filterForDegreePrograms, $allowedDegreePrograms); + $news = getData($news) ?? []; + $newsWrappers = []; + foreach ($news as $newsobj) { if ($studiengang_kz && $edit && !$newsobj->studiengang_kz) continue; - $date = new DateTime($newsobj->datum); - $datum = 'format('d.m.Y') . ']]>'; - $datum .= 'format('Y-m-d H:i') . ']]>'; - $id = $edit ? 'news_id . ']]>' : ''; - $xml .= "" . $newsobj->content . $datum . $id . ""; + + $newsWrappers[] = $this->createNewsWrapper($newsobj, $edit); } - /* if ($studiengang_kz != 0) { - $stg_obj = $this->ci->StudiengangModel->load($studiengang_kz); - if (isError($stg_obj)) - return $stg_obj; - $stg_obj = current(getData($stg_obj) ?: []); + $content = $this->createNewsContent($newsWrappers, $infoscreen, $titel); + if (isError($content)) + return $content; - if ($stg_obj) { - if (!$edit && !$infoscreen) { - $extras = $this->getNewsExtras($stg_obj, $semester); - if (isError($extras)) - return $extras; - $xml .= getData($extras); - } - $xml .= 'bezeichnung . ']]>'; - } - } */ + return success([ + "content" => getData($content), + "row_count" => $news[0]->row_count ?? 0 + ]); + } + + /** + * Creates a newswrapper XML element from a news item. + * + * @param stdClass $newsobj + * @param boolean $edit + * + * @return DOMElement + */ + public function createNewsWrapper($newsobj, $edit) + { + $id = $edit ? 'news_id . ']]>' : ''; + $isPublished = $edit ? 'sichtbar ? 'true' : 'false') . ']]>' : ''; + + $date = new DateTime($newsobj->datum); + $datum = 'format('d.m.Y') . ']]>'; + $datum .= 'format('Y-m-d H:i') . ']]>'; + + $hasVisibleToDate = isset($newsobj->datum_bis) && $newsobj->datum_bis !== ''; + $datumTo = $hasVisibleToDate + ? new DateTime($newsobj->datum_bis) + : (clone $date)->add(new DateInterval('P' . MAXNEWSALTER . 'D')); + if ($hasVisibleToDate) + $datumTo->setTime(23, 59, 59); + + $now = new DateTime(); + $isActive = '= $now ? 'true' : 'false') . ']]>'; + + $newsWrapper = new DOMDocument(); + $newsWrapper->loadXML('' . $newsobj->content . $datum . $id . $isPublished . $isActive . ''); + + return $newsWrapper->documentElement; + } + + /** + * Creates rendered news content from one or more newswrapper XML elements. + * + * @param DOMElement|array $newsWrappers + * @param boolean $infoscreen + * @param string $titel + * + * @return stdClass + */ + public function createNewsContent($newsWrappers, $infoscreen, $titel) + { + if (!is_array($newsWrappers)) + $newsWrappers = [$newsWrappers]; + + $XML = new DOMDocument('1.0', 'UTF-8'); + $contentElement = $XML->createElement('content'); + $XML->appendChild($contentElement); + + foreach ($newsWrappers as $newsWrapper) + $contentElement->appendChild($XML->importNode($newsWrapper, true)); if ($titel != '') { - $xml .= '' . $titel . ''; + $titleElement = $XML->createElement('news_titel'); + $titleElement->appendChild($XML->createTextNode($titel)); + $contentElement->appendChild($titleElement); } - $xml .= ''; - //XSLT Vorlage laden $template = $this->ci->TemplateModel->load($infoscreen ? 'news_infoscreen' : 'news'); if (isError($template)) return $template; $template = current(getData($template)); - $XML = new DOMDocument(); - $XML->loadXML($xml); - $xsltemplate = new DOMDocument(); $xsltemplate->loadXML($template->xslt_xhtml_c4); diff --git a/application/libraries/StundenplanLib.php b/application/libraries/StundenplanLib.php index 0a460079b..4cfefc634 100644 --- a/application/libraries/StundenplanLib.php +++ b/application/libraries/StundenplanLib.php @@ -94,13 +94,13 @@ class StundenplanLib if (isError($benutzer_gruppen)) return $benutzer_gruppen; $benutzer_gruppen = getData($benutzer_gruppen); - + $this->_ci->addMeta('spezialgruppen', $benutzer_gruppen); // getting the student_lehrverbaende of the student in the different studiensemester $student_lehrverband = $this->fetchStudentlehrverbandFromStudiensemester($student_uid, $semester_range); if (isError($student_lehrverband)) return $student_lehrverband; $student_lehrverband = getData($student_lehrverband); - + $this->_ci->addMeta('studentlehrvebaende', $student_lehrverband); $stundenplan_query = $this->_ci->StundenplanModel->getStundenplanQuery( $start, $end, @@ -872,6 +872,7 @@ class StundenplanLib $result->semester = $item->semester; $result->verband = $item->verband; $result->gruppe = $item->gruppe; + $result->studiensemester_kurzbz = $item->studiensemester_kurzbz; return $result; }, $lehrverband_query_result); diff --git a/application/models/accounting/Vertrag_model.php b/application/models/accounting/Vertrag_model.php index 97b5c72b6..b49f6ef53 100644 --- a/application/models/accounting/Vertrag_model.php +++ b/application/models/accounting/Vertrag_model.php @@ -31,18 +31,20 @@ class Vertrag_model extends DB_Model */ public function save($person_id, $mitarbeiter_uid, $lehrveranstaltung_id, $lehreinheit_id, $projektarbeit_id = null, $vertragsstunden, $betrag, $studiensemester_kurzbz) { - $person_id = (isset($person_id) && is_numeric($person_id)) + $vertragstyp_kurzbz = (is_null($projektarbeit_id)) ? 'Lehrauftrag' : 'Betreuung'; + + $person_id = (isset($person_id) && is_numeric($person_id)) ? $person_id : show_error('peron_id must be set and numeric.'); - $lehreinheit_id = (isset($lehreinheit_id) && is_numeric($lehreinheit_id)) - ? $lehreinheit_id - : show_error('lehreinheit_id must be set and numeric.'); $lehrveranstaltung_id = (isset($lehrveranstaltung_id) && is_numeric($lehrveranstaltung_id)) ? $lehrveranstaltung_id : show_error('lehrveranstaltung_id must be set and numeric.'); $projektarbeit_id = (isset($projektarbeit_id) && is_numeric($projektarbeit_id)) ? $projektarbeit_id : null; + $lehreinheit_id = (isset($lehreinheit_id) && is_numeric($lehreinheit_id)) + ? $lehreinheit_id + : (($vertragstyp_kurzbz == 'Betreuung') ? null : show_error('lehreinheit_id must be set and numeric.')); $vertragsstunden = (isset($vertragsstunden) && is_numeric($vertragsstunden)) ? $vertragsstunden : 0; @@ -53,7 +55,7 @@ class Vertrag_model extends DB_Model ? $mitarbeiter_uid : show_error('mitarbeiter_uid must be set and a string value.');; - $vertragstyp_kurzbz = (is_null($projektarbeit_id)) ? 'Lehrauftrag' : 'Betreuung'; + // First check if Vertrag already exists for that Lehrauftrag or for that Projektbetreuerauftrag if ($vertragstyp_kurzbz == 'Lehrauftrag') @@ -257,7 +259,7 @@ class Vertrag_model extends DB_Model } elseif ($vertragstyp_kurzbz == 'Betreuung') { - $this->addSelect('lehreinheit_id'); + $this->addSelect('lehreinheit_id, lehre.tbl_projektarbeit.lehrveranstaltung_id, lehre.tbl_projektarbeit.studiensemester_kurzbz'); $this->addJoin('lehre.tbl_projektbetreuer', 'vertrag_id'); $this->addJoin('lehre.tbl_projektarbeit', 'projektarbeit_id'); if ($result = $this->loadWhere(array('vertrag_id' => $vertrag_id))) @@ -281,17 +283,22 @@ class Vertrag_model extends DB_Model { if ($result = getData($this->getLehreinheitID($vertrag_id))) { - $this->load->model('education/Lehreinheit_model', 'LehreinheitModel'); - $this->LehreinheitModel->addSelect($select); + if (!empty($result[0]->lehreinheit_id)) + { + $this->load->model('education/Lehreinheit_model', 'LehreinheitModel'); + $this->LehreinheitModel->addSelect($select); - if($result = $this->LehreinheitModel->load($result[0]->lehreinheit_id)) - { - return success($result->retval); - } - else - { - return error('Fehler beim Laden der Lehreinheit'); + if ($result = $this->LehreinheitModel->load($result[0]->lehreinheit_id)) + { + return success($result->retval); + } + else + { + return error('Fehler beim Laden der Lehreinheit'); + } } + + return success($result); } else { @@ -563,14 +570,13 @@ SELECT null::integer as pruefung_id, projektarbeit_id, (tbl_projektbetreuer.stunden*tbl_projektbetreuer.stundensatz) as betrag1, - tbl_lehreinheit.studiensemester_kurzbz, + tbl_projektarbeit.studiensemester_kurzbz, tbl_projektbetreuer.betreuerart_kurzbz, (SELECT nachname || ' ' || vorname FROM public.tbl_person JOIN public.tbl_benutzer USING(person_id) WHERE uid=tbl_projektarbeit.student_uid) as bezeichnung FROM lehre.tbl_projektbetreuer JOIN lehre.tbl_projektarbeit USING(projektarbeit_id) - JOIN lehre.tbl_lehreinheit USING(lehreinheit_id) WHERE tbl_projektbetreuer.person_id=? AND vertrag_id IS NULL @@ -619,14 +625,13 @@ SELECT null::integer as pruefung_id, projektarbeit_id, (tbl_projektbetreuer.stunden * tbl_projektbetreuer.stundensatz) as betrag, - tbl_lehreinheit.studiensemester_kurzbz, + tbl_projektarbeit.studiensemester_kurzbz, tbl_projektbetreuer.betreuerart_kurzbz, (SELECT nachname || ' ' || vorname FROM public.tbl_person JOIN public.tbl_benutzer USING(person_id) WHERE uid=tbl_projektarbeit.student_uid) as bezeichnung, vertrag_id FROM lehre.tbl_projektbetreuer JOIN lehre.tbl_projektarbeit USING(projektarbeit_id) - JOIN lehre.tbl_lehreinheit USING(lehreinheit_id) WHERE tbl_projektbetreuer.person_id=? AND vertrag_id = ? diff --git a/application/models/content/News_model.php b/application/models/content/News_model.php index ad8ecab99..ee00bf327 100644 --- a/application/models/content/News_model.php +++ b/application/models/content/News_model.php @@ -20,14 +20,16 @@ class News_model extends DB_Model public function getAll($limit = null) { $this->addJoin("campus.tbl_content","content_id"); + return $this->execReadOnlyQuery(' 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 + WHERE --text IS NOT NULL AND - datum <= NOW() AND (datum_bis IS NULL OR datum_bis >= now()::date) - ORDER BY datum DESC + datum <= NOW() AND (datum_bis >= NOW()::date OR datum_bis IS NULL) AND + (NOW()-datum) < interval \'' . MAXNEWSALTER . ' days\' + ORDER BY datum DESC, campus.tbl_news.updateamum DESC LIMIT ' . $this->escape($limit) , ['DD/MM/YYYY']); } @@ -48,31 +50,28 @@ class News_model extends DB_Model * @param integer | null $semester * @param string $fachbereich_kurzbz * @param boolean $sichtbar - * @param integer $maxalter * @param integer $page * @param integer $page_size - * @param boolean $all + * @param boolean $active * @param boolean $mischen * * TODO(chris): this is not a good function -> the params are all over the place * */ - protected function prepareNewsWithContent($sprache, $studiengang_kz, $semester, $fachbereich_kurzbz = null, $sichtbar = true, $maxalter = 0, $page = 1, $page_size = 10, $all = false, $mischen = true) + protected function prepareNewsWithContent($sprache, $studiengang_kz, $semester, $fachbereich_kurzbz = null, $sichtbar = true, $page = 1, $page_size = 10, $active = true, $mischen = true, $filterForDegreePrograms = false, $allowedDegreePrograms = []) { + $this->addSelect(["*", "COUNT(*) OVER() AS row_count"]); $this->addOrder('datum', 'DESC'); + $this->addOrder('tbl_news.updateamum', 'DESC'); $studiengang_kz = trim($studiengang_kz); $fachbereich_kurzbz = trim($fachbereich_kurzbz); $where = []; - if (trim($maxalter) != '0') { - $where[] = "(now()-datum) < interval " . $this->db->escape($maxalter) . " days"; - - } - if (!$all) { - $where[] = "datum <= now()"; - $where[] = "(datum_bis >= now()::date OR datum_bis IS NULL)"; + + if ($active) { + $where[] = "(datum <= NOW()::date AND (datum_bis >= NOW()::date OR (datum_bis IS NULL AND (NOW()-datum) < interval '" . MAXNEWSALTER . " days')))"; } if ($fachbereich_kurzbz != '*') { if ($fachbereich_kurzbz == '') { @@ -82,27 +81,54 @@ class News_model extends DB_Model } } - if ($studiengang_kz == '0') { - $where[] = "studiengang_kz = " . $this->db->escape($studiengang_kz); - if ($semester === NULL) - $where[] = "semester IS NULL"; - elseif ($semester === 0) - $where[] = "semester = 0"; - } elseif ($studiengang_kz != '') { - $add = $mischen === true ? " OR (studiengang_kz = 0 AND semester IS NULL)" : ""; - $where[] = "((studiengang_kz = " . $this->db->escape($studiengang_kz) . " AND semester = " . $this->db->escape($semester) . ") OR (studiengang_kz = " . $this->db->escape($studiengang_kz) . " AND semester = 0) OR (studiengang_kz = 0 AND semester = " . $this->db->escape($semester) . ")" . $add . ")"; + $sgAndSemesterCondition = []; + if ($studiengang_kz !== '') { + $sgAndSemesterCondition[] = 'studiengang_kz = ' . $this->db->escape($studiengang_kz); } + if ($semester !== null && $semester !== 0) { + $sgAndSemesterCondition[] = 'semester = ' . $this->db->escape($semester); + } + + $targetedSgAndSemesterCondition = []; + + if (!empty($sgAndSemesterCondition)) { + $targetedSgAndSemesterCondition[] = '(' . implode(' AND ', $sgAndSemesterCondition) . ')'; + } + if ($mischen === true) { + $targetedSgAndSemesterCondition[] = '(studiengang_kz = 0 AND (semester = 0 OR semester IS NULL))'; + + if ($semester !== null && $semester !== 0) { + $targetedSgAndSemesterCondition[] = '(studiengang_kz = 0 AND semester = ' . $this->db->escape($semester) . ')'; + } + } + + $finalSgAndSemesterCondition = implode(' OR ', $targetedSgAndSemesterCondition); + + if ($finalSgAndSemesterCondition !== '') { + $where[] = "(" . $finalSgAndSemesterCondition . ")"; + } + $this->addJoin('campus.tbl_contentsprache cs', 'content_id'); - $where[] = "cs.sichtbar = " . ($sichtbar ? "true" : "false"); + if (is_bool($sichtbar) || $sichtbar === 'true' || $sichtbar === 'false') { + $isSichtbar = filter_var($sichtbar, FILTER_VALIDATE_BOOLEAN); + $where[] = "cs.sichtbar = " . ($isSichtbar ? "true" : "false"); + } $where[] = "cs.sprache = (CASE WHEN EXISTS(SELECT 1 FROM campus.tbl_contentsprache cs2 WHERE cs2.content_id=" . $this->dbTable . ".content_id AND sprache=" . $this->db->escape($sprache) . ") THEN " . $this->db->escape($sprache) . " ELSE " . $this->db->escape(DEFAULT_LANGUAGE) . " END)"; $where[] = "cs.version = (SELECT MAX(version) FROM campus.tbl_contentsprache cs3 WHERE cs3.content_id=" . $this->dbTable . ".content_id AND cs3.sprache = (CASE WHEN EXISTS(SELECT 1 FROM campus.tbl_contentsprache cs2 WHERE cs2.content_id=" . $this->dbTable . ".content_id AND sprache=" . $this->db->escape($sprache) . ") THEN " . $this->db->escape($sprache) . " ELSE " . $this->db->escape(DEFAULT_LANGUAGE) . " END))"; + if ($filterForDegreePrograms) { + if (empty($allowedDegreePrograms)) { + $where[] = "1=0"; + } else { + $where[] = "studiengang_kz IN (" . implode(',', array_map([$this->db, 'escape'], $allowedDegreePrograms)) . ")"; + } + } $where = implode(" AND ", $where); @@ -110,25 +136,16 @@ class News_model extends DB_Model } - public function getNewsWithContent($sprache, $studiengang_kz, $semester, $fachbereich_kurzbz = null, $sichtbar = true, $maxalter = 0, $page = 1, $page_size = 10, $all = false, $mischen = true) + public function getNewsWithContent($sprache, $studiengang_kz, $semester, $fachbereich_kurzbz = null, $sichtbar = true, $page = 1, $page_size = 10, $active = true, $mischen = true, $filterForDegreePrograms = false, $allowedDegreePrograms = []) { - $this->prepareNewsWithContent($sprache, $studiengang_kz, $semester, $fachbereich_kurzbz, $sichtbar, $maxalter, $page, $page_size, $all, $mischen); - + $this->prepareNewsWithContent($sprache, $studiengang_kz, $semester, $fachbereich_kurzbz, $sichtbar, $page, $page_size, $active, $mischen, $filterForDegreePrograms, $allowedDegreePrograms); // getting the number of rows of the query and adding pagination to the query result $num_rows = $this->getNumRows(true); $this->addPagination($page, $page_size, $num_rows); // preparing the query again because every call to get_compiled_select or cour_all_results will add the from clause to the query - $this->prepareNewsWithContent($sprache, $studiengang_kz, $semester, $fachbereich_kurzbz, $sichtbar, $maxalter, $page, $page_size, $all, $mischen); + $this->prepareNewsWithContent($sprache, $studiengang_kz, $semester, $fachbereich_kurzbz, $sichtbar, $page, $page_size, $active, $mischen, $filterForDegreePrograms, $allowedDegreePrograms); return $this->load(); } - - public function countNewsWithContent($sprache, $studiengang_kz, $semester, $fachbereich_kurzbz = null, $sichtbar = true, $maxalter = 0, $page = 1, $page_size = 10, $all = false, $mischen = true) - { - $this->prepareNewsWithContent($sprache, $studiengang_kz, $semester, $fachbereich_kurzbz, $sichtbar, $maxalter, $page, $page_size, $all, $mischen); - return $this->getNumRows(); - } - - } diff --git a/application/models/crm/Prestudent_model.php b/application/models/crm/Prestudent_model.php index ad5c3e141..9b1778c4e 100644 --- a/application/models/crm/Prestudent_model.php +++ b/application/models/crm/Prestudent_model.php @@ -88,6 +88,30 @@ class Prestudent_model extends DB_Model return $this->execQuery($query, $parametersArray); } + /** + * Gets the Studiengang and current Ausbildungssemester for every + * Prestudent belonging to the same person as the student. + * + * @param string $student_uid + * @return stdClass + */ + public function getStudiengaengAndAusbildungssemesterByStudentUid($student_uid) + { + $query = 'SELECT p.studiengang_kz, + ( + SELECT ps.ausbildungssemester + FROM public.tbl_prestudentstatus ps + WHERE ps.prestudent_id = p.prestudent_id + ORDER BY ps.datum DESC, ps.insertamum DESC, ps.ext_id DESC + LIMIT 1 + ) AS ausbildungssemester + FROM public.tbl_student s + JOIN public.tbl_prestudent p USING (prestudent_id) + WHERE s.student_uid = ?'; + + return $this->execQuery($query, array($student_uid)); + } + /** * updateAufnahmegruppe */ diff --git a/application/models/crm/Prestudentstatus_model.php b/application/models/crm/Prestudentstatus_model.php index c0ed8595e..618d4be51 100644 --- a/application/models/crm/Prestudentstatus_model.php +++ b/application/models/crm/Prestudentstatus_model.php @@ -177,7 +177,7 @@ class Prestudentstatus_model extends DB_Model * @param prestudent_id ID of the Prestudent. * @param $status_kurzbz kurzbz of the status. * @param $ausbildungssemester ausbildungssemester of the status. - * @param $studiensemester_kurzbz studiensemster of the status. + * @param $studiensemester_kurzbz studiensemester of the status. * * @return result object with all the status entries */ diff --git a/application/models/crm/Student_model.php b/application/models/crm/Student_model.php index ab073996f..df8c1f983 100644 --- a/application/models/crm/Student_model.php +++ b/application/models/crm/Student_model.php @@ -204,7 +204,7 @@ class Student_model extends DB_Model Events::trigger( 'generate_student_uid', - function ($value) use ($uid) { + function ($value) use (&$uid) { $uid = $value; }, $stgkzl, diff --git a/application/models/education/Lehreinheitmitarbeiter_model.php b/application/models/education/Lehreinheitmitarbeiter_model.php index efdb2e74d..5dca16c95 100644 --- a/application/models/education/Lehreinheitmitarbeiter_model.php +++ b/application/models/education/Lehreinheitmitarbeiter_model.php @@ -85,9 +85,18 @@ class Lehreinheitmitarbeiter_model extends DB_Model public function getLektorenByLe($lehreinheit_id) { - $this->addSelect('vorname, nachname, tbl_lehreinheitmitarbeiter.*, stundenplan.verplant'); + $this->addSelect('tbl_person.vorname, tbl_person.nachname, tbl_lehreinheitmitarbeiter.*, stundenplan.verplant, + COALESCE(insertvonperson.vorname || \' \' || insertvonperson.nachname, tbl_lehreinheitmitarbeiter.insertvon) as insertvon, + COALESCE(updatevonperson.vorname || \' \' || updatevonperson.nachname, tbl_lehreinheitmitarbeiter.updatevon) as updatevon'); $this->addJoin('tbl_benutzer', 'uid = mitarbeiter_uid'); $this->addJoin('tbl_person', 'person_id'); + $this->addJoin('tbl_benutzer insertvonbenutzer', 'insertvonbenutzer.uid = tbl_lehreinheitmitarbeiter.insertvon', 'LEFT'); + $this->addJoin('tbl_person insertvonperson', 'insertvonperson.person_id = insertvonbenutzer.person_id', 'LEFT'); + + $this->addJoin('tbl_benutzer updatevonbenutzer', 'updatevonbenutzer.uid = tbl_lehreinheitmitarbeiter.updatevon', 'LEFT'); + $this->addJoin('tbl_person updatevonperson', 'updatevonperson.person_id = updatevonbenutzer.person_id', 'LEFT'); + + $this->addJoin('( SELECT 1 as verplant, lehreinheit_id, mitarbeiter_uid diff --git a/application/models/education/Lehrveranstaltung_model.php b/application/models/education/Lehrveranstaltung_model.php index f19e64469..1cf50ee4d 100644 --- a/application/models/education/Lehrveranstaltung_model.php +++ b/application/models/education/Lehrveranstaltung_model.php @@ -1263,6 +1263,39 @@ class Lehrveranstaltung_model extends DB_Model "; } + /** + * Gets lehrveranstaltungen of Studienplan of a certain lva_id set + * used if a bigger set of lva id is already available and it needs to be checked against a certain studienplan aswell + * @param $studienplan_id ID des Studienplans + * @param $lva_ids LVA_ID welche abgegleicht werden sollen + * @return array|null + */ + public function getLvsByStudienplanByLvaIDs($studienplan_id, $lva_ids) + { + $params = array($studienplan_id, $lva_ids); + + $qry = "SELECT tbl_lehrveranstaltung.*, + tbl_studienplan_lehrveranstaltung.studienplan_lehrveranstaltung_id, + tbl_studienplan_lehrveranstaltung.semester as stpllv_semester, + tbl_studienplan_lehrveranstaltung.pflicht as stpllv_pflicht, + tbl_studienplan_lehrveranstaltung.koordinator as stpllv_koordinator, + tbl_studienplan_lehrveranstaltung.studienplan_lehrveranstaltung_id_parent, + tbl_studienplan_lehrveranstaltung.sort stpllv_sort, + tbl_studienplan_lehrveranstaltung.curriculum, + tbl_studienplan_lehrveranstaltung.export, + tbl_studienplan_lehrveranstaltung.genehmigung + FROM lehre.tbl_lehrveranstaltung + JOIN lehre.tbl_studienplan_lehrveranstaltung + USING(lehrveranstaltung_id) + WHERE tbl_studienplan_lehrveranstaltung.studienplan_id = ? + AND tbl_studienplan_lehrveranstaltung.lehrveranstaltung_id IN ? + "; + + $qry .= " ORDER BY stpllv_sort, semester, sort"; + + return $this->execQuery($qry, $params); + } + public function getAllOe($lv_id) { $qry = "SELECT DISTINCT oe_kurzbz diff --git a/application/models/education/Paabgabe_model.php b/application/models/education/Paabgabe_model.php index f073e5f73..3f6159bd6 100644 --- a/application/models/education/Paabgabe_model.php +++ b/application/models/education/Paabgabe_model.php @@ -50,8 +50,7 @@ class Paabgabe_model extends DB_Model JOIN lehre.tbl_projektbetreuer USING(projektarbeit_id) JOIN public.tbl_benutzer bn_student ON(tbl_projektarbeit.student_uid=bn_student.uid) JOIN public.tbl_person person_student ON(bn_student.person_id=person_student.person_id) - JOIN lehre.tbl_lehreinheit ON(tbl_projektarbeit.lehreinheit_id=tbl_lehreinheit.lehreinheit_id) - JOIN lehre.tbl_lehrveranstaltung ON(tbl_lehreinheit.lehrveranstaltung_id=tbl_lehrveranstaltung.lehrveranstaltung_id) + JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id) JOIN public.tbl_studiengang ON(tbl_lehrveranstaltung.studiengang_kz=tbl_studiengang.studiengang_kz) JOIN campus.tbl_paabgabetyp USING(paabgabetyp_kurzbz) WHERE @@ -121,7 +120,6 @@ class Paabgabe_model extends DB_Model JOIN campus.tbl_paabgabetyp abgabetyp USING(paabgabetyp_kurzbz) LEFT JOIN public.tbl_benutzer ben ON(uid=student_uid) LEFT JOIN public.tbl_person pers ON(ben.person_id=pers.person_id) - LEFT JOIN lehre.tbl_lehreinheit USING(lehreinheit_id) LEFT JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id) LEFT JOIN public.tbl_studiengang stg USING(studiengang_kz) WHERE @@ -200,7 +198,6 @@ class Paabgabe_model extends DB_Model JOIN campus.tbl_paabgabe USING(projektarbeit_id) LEFT JOIN public.tbl_benutzer ON(uid=student_uid) LEFT JOIN public.tbl_person ON(tbl_benutzer.person_id=tbl_person.person_id) - LEFT JOIN lehre.tbl_lehreinheit USING(lehreinheit_id) LEFT JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id) LEFT JOIN public.tbl_studiengang USING(studiengang_kz) WHERE @@ -236,14 +233,13 @@ class Paabgabe_model extends DB_Model campus.tbl_paabgabe.insertvon, campus.tbl_paabgabe.insertamum, campus.tbl_paabgabe.updatevon, campus.tbl_paabgabe.updateamum, campus.tbl_paabgabe.note, upload_allowed, beurteilungsnotiz, student_uid, tbl_projektarbeit.note, lehre.tbl_projektarbeit.titel, UPPER(tbl_studiengang.typ) as stgtyp, UPPER(tbl_studiengang.kurzbz) as stgkz, public.tbl_studiengang.studiengang_kz, - public.tbl_studiengang.oe_kurzbz as stg_oe_kurzbz, tbl_lehreinheit.studiensemester_kurzbz, + public.tbl_studiengang.oe_kurzbz as stg_oe_kurzbz, tbl_projektarbeit.studiensemester_kurzbz, public.tbl_person.anrede, public.tbl_person.titelpre, public.tbl_person.vorname, public.tbl_person.nachname, public.tbl_person.titelpost FROM campus.tbl_paabgabe JOIN campus.tbl_paabgabetyp USING (paabgabetyp_kurzbz) JOIN lehre.tbl_projektarbeit USING (projektarbeit_id) - JOIN lehre.tbl_lehreinheit using(lehreinheit_id) - JOIN lehre.tbl_lehrveranstaltung using(lehrveranstaltung_id) - JOIN public.tbl_studiengang on(lehre.tbl_lehrveranstaltung.studiengang_kz = public.tbl_studiengang.studiengang_kz) + JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id) + JOIN public.tbl_studiengang ON(lehre.tbl_lehrveranstaltung.studiengang_kz = public.tbl_studiengang.studiengang_kz) JOIN public.tbl_benutzer ON (public.tbl_benutzer.uid = student_uid) JOIN public.tbl_person USING (person_id) @@ -261,7 +257,7 @@ class Paabgabe_model extends DB_Model campus.tbl_paabgabe.insertvon, campus.tbl_paabgabe.insertamum, campus.tbl_paabgabe.updatevon, campus.tbl_paabgabe.updateamum, campus.tbl_paabgabe.note, upload_allowed, beurteilungsnotiz, student_uid, tbl_projektarbeit.note, lehre.tbl_projektarbeit.titel, UPPER(tbl_studiengang.typ) as stgtyp, UPPER(tbl_studiengang.kurzbz) as stgkz, public.tbl_studiengang.studiengang_kz, - public.tbl_studiengang.oe_kurzbz as stg_oe_kurzbz, tbl_lehreinheit.studiensemester_kurzbz, + public.tbl_studiengang.oe_kurzbz as stg_oe_kurzbz, tbl_projektarbeit.studiensemester_kurzbz, lehre.tbl_projektbetreuer.betreuerart_kurzbz, lehre.tbl_projektbetreuer.person_id, public.tbl_person.anrede, public.tbl_person.titelpre, public.tbl_person.vorname, public.tbl_person.nachname, public.tbl_person.titelpost @@ -269,8 +265,7 @@ class Paabgabe_model extends DB_Model JOIN campus.tbl_paabgabetyp USING (paabgabetyp_kurzbz) JOIN lehre.tbl_projektarbeit USING (projektarbeit_id) JOIN lehre.tbl_projektbetreuer USING (projektarbeit_id) - JOIN lehre.tbl_lehreinheit using(lehreinheit_id) - JOIN lehre.tbl_lehrveranstaltung using(lehrveranstaltung_id) + JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id) JOIN public.tbl_studiengang on(lehre.tbl_lehrveranstaltung.studiengang_kz = public.tbl_studiengang.studiengang_kz) JOIN public.tbl_benutzer ON (public.tbl_benutzer.uid = student_uid) JOIN public.tbl_person ON (public.tbl_benutzer.person_id = public.tbl_person.person_id) diff --git a/application/models/education/Projektarbeit_model.php b/application/models/education/Projektarbeit_model.php index c9aaf40ef..c002349b0 100644 --- a/application/models/education/Projektarbeit_model.php +++ b/application/models/education/Projektarbeit_model.php @@ -25,9 +25,9 @@ class Projektarbeit_model extends DB_Model { $sprache_index = "COALESCE((SELECT index FROM public.tbl_sprache WHERE sprache=" . $this->escape(getUserLanguage()) . " LIMIT 1), 1)"; $qry = "SELECT - pa.*, tbl_projekttyp.bezeichnung, - tbl_lehreinheit.studiensemester_kurzbz, tbl_lehrveranstaltung.lehrveranstaltung_id, + pa.*, tbl_projekttyp.bezeichnung, tbl_lehrveranstaltung.lehrveranstaltung_id, tbl_sprache.bezeichnung[".$sprache_index."] AS sprache_bezeichnung, + pa.studiensemester_kurzbz, pa.lehrveranstaltung_id, tbl_firma.name AS firma_name, ( SELECT @@ -43,7 +43,6 @@ class Projektarbeit_model extends DB_Model FROM lehre.tbl_projektarbeit pa JOIN lehre.tbl_projekttyp USING (projekttyp_kurzbz) - JOIN lehre.tbl_lehreinheit USING (lehreinheit_id) JOIN lehre.tbl_lehrveranstaltung USING (lehrveranstaltung_id) LEFT JOIN public.tbl_firma USING (firma_id) LEFT JOIN public.tbl_sprache ON pa.sprache = tbl_sprache.sprache @@ -60,7 +59,7 @@ class Projektarbeit_model extends DB_Model if (isset($studiensemester_kurzbz)) { - $qry .= ' AND tbl_lehreinheit.studiensemester_kurzbz=?'; + $qry .= ' AND tbl_projektarbeit.studiensemester_kurzbz=?'; $params[] = $studiensemester_kurzbz; } @@ -137,7 +136,7 @@ class Projektarbeit_model extends DB_Model projektarbeit_id, lehre.tbl_projekttyp.bezeichnung as projekttypbezeichnung, lehre.tbl_projekttyp.projekttyp_kurzbz as projekttypkurzbz, - lehre.tbl_lehreinheit.studiensemester_kurzbz, + lehre.tbl_projektarbeit.studiensemester_kurzbz, lehre.tbl_lehrveranstaltung.studiengang_kz, public.tbl_studiengang.kurzbzlang, lehre.tbl_projektarbeit.note as note, @@ -160,7 +159,6 @@ class Projektarbeit_model extends DB_Model LEFT JOIN public.tbl_benutzer USING(person_id) LEFT JOIN lehre.tbl_projekttyp USING (projekttyp_kurzbz) LEFT JOIN lehre.tbl_betreuerart USING(betreuerart_kurzbz) - LEFT JOIN lehre.tbl_lehreinheit USING(lehreinheit_id) LEFT JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id) LEFT JOIN public.tbl_mitarbeiter ON(public.tbl_mitarbeiter.mitarbeiter_uid = public.tbl_benutzer.uid) LEFT JOIN public.tbl_studiengang USING(studiengang_kz) @@ -369,7 +367,7 @@ class Projektarbeit_model extends DB_Model tbl_studiengang.typ, tbl_studiengang.kurzbz, tbl_projektarbeit.projekttyp_kurzbz, tbl_projekttyp.bezeichnung, tbl_projektarbeit.titel, tbl_projektarbeit.projektarbeit_id, tbl_projektarbeit.note, - student_benutzer.uid, tbl_student.matrikelnr, tbl_lehreinheit.studiensemester_kurzbz, public.tbl_student.student_uid, + student_benutzer.uid, tbl_student.matrikelnr, tbl_projektarbeit.studiensemester_kurzbz, public.tbl_student.student_uid, lehre.tbl_projektarbeit.sprache, lehre.tbl_projektarbeit.seitenanzahl, @@ -433,7 +431,6 @@ class Projektarbeit_model extends DB_Model LEFT JOIN public.tbl_benutzer student_benutzer ON student_benutzer.uid = lehre.tbl_projektarbeit.student_uid LEFT JOIN public.tbl_person student_person ON student_benutzer.person_id = student_person.person_id LEFT JOIN public.tbl_student ON student_benutzer.uid = public.tbl_student.student_uid - LEFT JOIN lehre.tbl_lehreinheit USING (lehreinheit_id) LEFT JOIN lehre.tbl_lehrveranstaltung USING (lehrveranstaltung_id) LEFT JOIN public.tbl_studiengang ON public.tbl_student.studiengang_kz = public.tbl_studiengang.studiengang_kz LEFT JOIN lehre.tbl_projekttyp USING (projekttyp_kurzbz) @@ -506,7 +503,7 @@ class Projektarbeit_model extends DB_Model student_person.vorname AS student_vorname, student_person.nachname AS student_nachname, public.tbl_student.matrikelnr, - tbl_lehreinheit.studiensemester_kurzbz, + tbl_projektarbeit.studiensemester_kurzbz, betreuer_benutzer.uid AS betreuer_benutzer_uid, betreuer_person.titelpre AS betreuer_titelpre, betreuer_person.vorname AS betreuer_vorname, @@ -568,7 +565,6 @@ class Projektarbeit_model extends DB_Model LEFT JOIN public.tbl_benutzer student_benutzer ON student_benutzer.uid = lehre.tbl_projektarbeit.student_uid LEFT JOIN public.tbl_person student_person ON student_benutzer.person_id = student_person.person_id LEFT JOIN public.tbl_student ON student_benutzer.uid = public.tbl_student.student_uid - LEFT JOIN lehre.tbl_lehreinheit USING (lehreinheit_id) LEFT JOIN lehre.tbl_lehrveranstaltung USING (lehrveranstaltung_id) LEFT JOIN public.tbl_studiengang ON public.tbl_student.studiengang_kz = public.tbl_studiengang.studiengang_kz LEFT JOIN lehre.tbl_projekttyp USING (projekttyp_kurzbz) @@ -636,7 +632,7 @@ class Projektarbeit_model extends DB_Model student_person.vorname AS student_vorname, student_person.nachname AS student_nachname, public.tbl_student.matrikelnr, - tbl_lehreinheit.studiensemester_kurzbz, + tbl_projektarbeit.studiensemester_kurzbz, betreuer_benutzer.uid AS betreuer_benutzer_uid, betreuer_person.titelpre AS betreuer_titelpre, betreuer_person.vorname AS betreuer_vorname, @@ -698,7 +694,6 @@ class Projektarbeit_model extends DB_Model LEFT JOIN public.tbl_benutzer student_benutzer ON student_benutzer.uid = lehre.tbl_projektarbeit.student_uid LEFT JOIN public.tbl_person student_person ON student_benutzer.person_id = student_person.person_id LEFT JOIN public.tbl_student ON student_benutzer.uid = public.tbl_student.student_uid - LEFT JOIN lehre.tbl_lehreinheit USING (lehreinheit_id) LEFT JOIN lehre.tbl_lehrveranstaltung USING (lehrveranstaltung_id) LEFT JOIN public.tbl_studiengang ON public.tbl_student.studiengang_kz = public.tbl_studiengang.studiengang_kz LEFT JOIN lehre.tbl_projekttyp USING (projekttyp_kurzbz) diff --git a/application/models/organisation/Studiengang_model.php b/application/models/organisation/Studiengang_model.php index db0996319..9a0a992b0 100644 --- a/application/models/organisation/Studiengang_model.php +++ b/application/models/organisation/Studiengang_model.php @@ -653,31 +653,42 @@ class Studiengang_model extends DB_Model } /** + * Gets the Studiengang information. Without parameters it uses the Studiengang + * of the logged in Student. + * + * @param int|null $studiengang_kz + * @param int|null $semester used for the Jahrgangsvertretung * @return stdClass */ - public function getStudiengangInfoForNews() + public function getStudiengangInfoForNews($studiengang_kz = null, $semester = null) { $this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel'); $this->load->model('person/Person_model', 'PersonModel'); $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; + + if (is_null($studiengang_kz)) + { + $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; + } } - + + // users without a Student record get no information instead of an error + if (is_null($studiengang_kz)) + return success(null); + $stg_obj = $this->load($studiengang_kz); if(isError($stg_obj)) return error($stg_obj); - if(getData($stg_obj)) - { - $stg_obj = current(getData($stg_obj)); - } + if(!hasData($stg_obj)) + return error('Studiengang nicht gefunden'); + $stg_obj = current(getData($stg_obj)); $stg_ltg = $this->getLeitungDetailed($stg_obj->studiengang_kz); if (isError($stg_ltg)) @@ -886,6 +897,14 @@ class Studiengang_model extends DB_Model return success($ass); } + public function getDegreePrograms() { + $query = "SELECT * + FROM public.tbl_studiengang + ORDER BY public.tbl_studiengang.kurzbzlang"; + + return $this->execReadOnlyQuery($query); + } + private function addEmailProperty(&$benutzerfunktionen) { if(count($benutzerfunktionen) && defined('DOMAIN')) { diff --git a/application/models/organisation/Studiensemester_model.php b/application/models/organisation/Studiensemester_model.php index 8aee8f65e..1766f2c88 100644 --- a/application/models/organisation/Studiensemester_model.php +++ b/application/models/organisation/Studiensemester_model.php @@ -218,7 +218,7 @@ class Studiensemester_model extends DB_Model */ public function getByDate($date) { - // gets the studiensemster of a date or the next closest previous studiensemester if a date is not within a studiensemester + // gets the studiensemester 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 diff --git a/application/models/person/Notiz_model.php b/application/models/person/Notiz_model.php index 1dc09caaf..de3900d2b 100644 --- a/application/models/person/Notiz_model.php +++ b/application/models/person/Notiz_model.php @@ -98,7 +98,7 @@ class Notiz_model extends DB_Model /** * Add a Notiz for a given person */ - public function addNotizForPerson($person_id, $titel, $text, $erledigt, $verfasser_uid) + public function addNotizForPerson($person_id, $titel, $text, $erledigt, $verfasser_uid, $insertvon = null) { // Loads model Notizzuordnung_model $this->load->model('person/Notizzuordnung_model', 'NotizzuordnungModel'); @@ -106,8 +106,15 @@ class Notiz_model extends DB_Model // Start DB transaction $this->db->trans_start(false); - $result = $this->insert(array('titel' => $titel, 'text' => $text, 'erledigt' => $erledigt, 'verfasser_uid' => $verfasser_uid, - "insertvon" => $verfasser_uid)); + $result = $this->insert( + array( + 'titel' => $titel, + 'text' => $text, + 'erledigt' => $erledigt, + 'verfasser_uid' => $verfasser_uid, + 'insertvon' => $insertvon ?? $verfasser_uid + ) + ); if (isSuccess($result)) { diff --git a/application/models/ressource/Reservierung_model.php b/application/models/ressource/Reservierung_model.php index bedeefed8..88fa0d2dd 100644 --- a/application/models/ressource/Reservierung_model.php +++ b/application/models/ressource/Reservierung_model.php @@ -24,7 +24,7 @@ class Reservierung_model extends DB_Model $lvplan_reservierungen_query = "SELECT r.* , stund.beginn, stund.ende, CASE WHEN r.gruppe_kurzbz IS NOT NULL THEN r.gruppe_kurzbz - ELSE CONCAT(UPPER(studg.typ),UPPER(studg.kurzbz),'-',COALESCE(CAST(r.semester AS varchar),'/'),COALESCE(CAST(r.verband AS varchar),'/'),COALESCE(CAST(res.gruppe AS varchar),'/')) + ELSE CONCAT(UPPER(studg.typ),UPPER(studg.kurzbz),'-',COALESCE(CAST(r.semester AS varchar),'/'),COALESCE(CAST(r.verband AS varchar),'/'),COALESCE(CAST(r.gruppe AS varchar),'/')) END as gruppen_kuerzel FROM campus.vw_reservierung r JOIN public.tbl_studiengang studg ON studg.studiengang_kz=r.studiengang_kz @@ -148,4 +148,40 @@ class Reservierung_model extends DB_Model return $this->execReadOnlyQuery($qry, [$uid, $datum, $stunde]); } + public function deleteReservation($reservierung_id) { + $uid = getAuthUID(); + + $result = $this->load($reservierung_id); + + if (isError($result)) + return $result; + + if (!hasData($result)) + return error('Reservierung nicht gefunden'); + + $row = $result->retval[0]; + + if ($row->uid !== $uid && $row->insertvon !== $uid) + return error('Keine Berechtigung'); + + return $this->delete($reservierung_id); + } + + public function getMyReservation() { + $uid = getAuthUID(); + $date = date("Y-m-d",time()); + + $qry = "SELECT vw_reservierung.*, + trim(COALESCE(vw_mitarbeiter.titelpre,'')||' '||COALESCE(vw_mitarbeiter.vorname,'')||' '||COALESCE(vw_mitarbeiter.nachname,'')||' '||COALESCE(vw_mitarbeiter.titelpost,'')) as reserviert_fuer, + trim(COALESCE(reserviert_von.titelpre,'')||' '||COALESCE(reserviert_von.vorname,'')||' '||COALESCE(reserviert_von.nachname,'')||' '||COALESCE(reserviert_von.titelpost,'')) as reserviert_von + FROM campus.vw_reservierung + JOIN campus.vw_mitarbeiter ON vw_reservierung.uid=vw_mitarbeiter.uid + LEFT JOIN campus.vw_mitarbeiter reserviert_von ON vw_reservierung.insertvon=reserviert_von.uid + WHERE datum >= ? + AND (vw_reservierung.uid= ? OR vw_reservierung.insertvon= ? ) + ORDER BY datum, titel, ort_kurzbz, stunde"; + + return $this->execReadOnlyQuery($qry, [$date, $uid, $uid]); + } + } diff --git a/application/models/ressource/Stundenplan_model.php b/application/models/ressource/Stundenplan_model.php index 1eddd2e2f..0f51e4b71 100644 --- a/application/models/ressource/Stundenplan_model.php +++ b/application/models/ressource/Stundenplan_model.php @@ -604,11 +604,17 @@ class Stundenplan_model extends DB_Model { foreach($semester_date_range as $sem_date => $sem_date_range) { - if(!array_key_exists($sem_date,$studentlehrverbaende) || count($studentlehrverbaende[$sem_date]) == 0) + if(!array_key_exists($sem,$studentlehrverbaende) || count($studentlehrverbaende[$sem]) == 0) { continue; } - foreach($studentlehrverbaende[$sem_date] as $key=>$lehrverband) + $studlvbds = array_filter( + $studentlehrverbaende[$sem], + function($value) use ($sem_date) { + return $value->studiensemester_kurzbz === $sem_date; + } + ); + foreach($studlvbds as $key=>$lehrverband) { $query .= "(((sp.studiengang_kz = ".$this->escape($lehrverband->studiengang_kz)." AND sp.semester = ".$this->escape($lehrverband->semester)." AND sp.verband = ".$this->escape($lehrverband->verband)." AND sp.gruppe = ".$this->escape($lehrverband->gruppe)." AND sp.datum BETWEEN ".$this->escape($sem_date_range->start)." AND ".$this->escape($sem_date_range->ende).")"; // Eintraege fuer den ganzen Verband diff --git a/application/views/CisRouterView/CisRouterView.php b/application/views/CisRouterView/CisRouterView.php index 530379308..1257ea563 100644 --- a/application/views/CisRouterView/CisRouterView.php +++ b/application/views/CisRouterView/CisRouterView.php @@ -10,6 +10,7 @@ $includesArray = array( 'primevue3' => true, 'skipID' => '#fhccontent', 'vuedatepicker11' => true, + 'tinymce5' => true, 'customCSSs' => array( 'public/css/components/verticalsplit.css', 'public/css/components/searchbar/searchbar.css', @@ -24,9 +25,9 @@ $includesArray = array( 'public/css/components/abgabetool/abgabe.css', 'public/css/Cis4/Cms.css', 'public/css/Cis4/Studium.css', + 'public/css/components/vue-datepicker.css', 'public/css/Cis4/Benotungstool.css', - 'public/css/Cis4/Zeitsperren.css', - 'public/css/components/Zeitsperren.css', //70747 + 'public/css/components/Zeitsperrenma.css', //70747 'public/css/Cis4/Zeitsperren.css', //77941 ), 'customJSs' => array( @@ -57,6 +58,8 @@ $includesArray = array( $this->load->view('templates/CISVUE-Header', $includesArray); ?>
> - +
load->view('templates/CISVUE-Footer', $includesArray); ?> diff --git a/application/views/Vertragsverwaltung.php b/application/views/Vertragsverwaltung.php index 4a73be945..390798cd8 100644 --- a/application/views/Vertragsverwaltung.php +++ b/application/views/Vertragsverwaltung.php @@ -19,7 +19,6 @@ $includesArray = array( 'public/css/components/primevue.css', 'public/css/Vertragsverwaltung.css', 'public/css/components/Detailheader.css', - 'public/css/components/Zeitsperren.css' ], 'customJSs' => [ #'vendor/npm-asset/primevue/tree/tree.min.js', diff --git a/application/views/lehre/anrechnung/approveAnrechnungUebersichtData.php b/application/views/lehre/anrechnung/approveAnrechnungUebersichtData.php index acfcbd907..dccc31187 100644 --- a/application/views/lehre/anrechnung/approveAnrechnungUebersichtData.php +++ b/application/views/lehre/anrechnung/approveAnrechnungUebersichtData.php @@ -16,7 +16,7 @@ $query = ' anrechnung.begruendung_id, anrechnung.dms_id, CASE - WHEN stg.typ || stg.kurzbz IN (' . $ORGANISATIONSEINHEITEN_SCHREIBBERECHTIGT . ') THEN TRUE + WHEN stg.oe_kurzbz IN (' . $ORGANISATIONSEINHEITEN_SCHREIBBERECHTIGT . ') THEN TRUE ELSE FALSE END "schreibberechtigt", anrechnung.studiensemester_kurzbz, diff --git a/application/views/lehre/lehrauftrag/acceptLehrauftragData.php b/application/views/lehre/lehrauftrag/acceptLehrauftragData.php index a36605d13..f1cc42728 100644 --- a/application/views/lehre/lehrauftrag/acceptLehrauftragData.php +++ b/application/views/lehre/lehrauftrag/acceptLehrauftragData.php @@ -232,8 +232,8 @@ FROM SELECT pa.lehreinheit_id, lv.lehrveranstaltung_id, - pa.projektarbeit_id::text AS "projektarbeit_id", - le.studiensemester_kurzbz, + pa.projektarbeit_id::text AS "projektarbeit_id", + pa.studiensemester_kurzbz, stg.studiengang_kz, upper(stg.typ || stg.kurzbz) AS "stg_typ_kurzbz", lv.orgform_kurzbz, @@ -268,8 +268,7 @@ FROM FROM lehre.tbl_projektbetreuer pb JOIN lehre.tbl_projektarbeit pa USING (projektarbeit_id) - JOIN lehre.tbl_lehreinheit le USING (lehreinheit_id) - JOIN lehre.tbl_lehrveranstaltung lv USING (lehrveranstaltung_id) + JOIN lehre.tbl_lehrveranstaltung lv ON (pa.lehrveranstaltung_id = lv.lehrveranstaltung_id) JOIN PUBLIC.tbl_organisationseinheit oe USING (oe_kurzbz) JOIN PUBLIC.tbl_person person USING (person_id) LEFT JOIN lehre.tbl_vertrag vertrag USING (vertrag_id) @@ -280,7 +279,7 @@ FROM /* filter projektbetreuuer */ pb.person_id = \'' . $PERSON_ID . '\' /* filter studiensemester */ - AND le.studiensemester_kurzbz = \'' . $STUDIENSEMESTER . '\' + AND pa.studiensemester_kurzbz = \'' . $STUDIENSEMESTER . '\' /* filter active lehrveranstaltungen */ AND lv.aktiv = TRUE /* filter active organisationseinheiten */ diff --git a/application/views/lehre/lehrauftrag/approveLehrauftragData.php b/application/views/lehre/lehrauftrag/approveLehrauftragData.php index 7dd3822a6..d67a37b06 100644 --- a/application/views/lehre/lehrauftrag/approveLehrauftragData.php +++ b/application/views/lehre/lehrauftrag/approveLehrauftragData.php @@ -242,8 +242,8 @@ FROM pa.lehreinheit_id, lv.lehrveranstaltung_id, lv.bezeichnung AS "lv_bezeichnung", - (pa.projektarbeit_id::text) AS "projektarbeit_id", - le.studiensemester_kurzbz, + (pa.projektarbeit_id::text) AS "projektarbeit_id", + pa.studiensemester_kurzbz, stg.studiengang_kz, upper(stg.typ || stg.kurzbz) AS "stg_typ_kurzbz", lv.orgform_kurzbz, @@ -270,7 +270,7 @@ FROM ELSE (oe.organisationseinheittyp_kurzbz || \' \' || oe.bezeichnung) END AS "lv_oe_kurzbz", - (nachname || \' \' || vorname) AS "lektor", + (nachname || \' \' || vorname) AS "lektor", TRUNC(pb.stunden, 1) AS "stunden", pb.stundensatz, TRUNC((pb.stunden * pb.stundensatz), 2) AS "betrag", @@ -280,8 +280,7 @@ FROM FROM lehre.tbl_projektbetreuer pb JOIN lehre.tbl_projektarbeit pa USING (projektarbeit_id) - JOIN lehre.tbl_lehreinheit le USING (lehreinheit_id) - JOIN lehre.tbl_lehrveranstaltung lv USING (lehrveranstaltung_id) + JOIN lehre.tbl_lehrveranstaltung lv ON (pa.lehrveranstaltung_id = lv.lehrveranstaltung_id) JOIN PUBLIC.tbl_organisationseinheit oe USING (oe_kurzbz) JOIN PUBLIC.tbl_person person USING (person_id) LEFT JOIN lehre.tbl_vertrag vertrag USING (vertrag_id) @@ -291,7 +290,7 @@ FROM /* filter organisationseinheit */ lv.oe_kurzbz IN (\'' . implode('\',\'', $ORGANISATIONSEINHEIT) . '\') /* filter studiensemester */ - AND le.studiensemester_kurzbz = \'' . $STUDIENSEMESTER . '\' + AND pa.studiensemester_kurzbz = \'' . $STUDIENSEMESTER . '\' /* filter active lehrveranstaltungen */ AND lv.aktiv = TRUE /* filter active organisationseinheiten */ diff --git a/application/views/lehre/lehrauftrag/orderLehrauftragData.php b/application/views/lehre/lehrauftrag/orderLehrauftragData.php index f5b5cf6ce..d62ecd076 100644 --- a/application/views/lehre/lehrauftrag/orderLehrauftragData.php +++ b/application/views/lehre/lehrauftrag/orderLehrauftragData.php @@ -272,8 +272,8 @@ FROM pa.lehreinheit_id, lv.lehrveranstaltung_id, lv.bezeichnung AS "lv_bezeichnung", - pa.projektarbeit_id::text AS "projektarbeit_id", - le.studiensemester_kurzbz, + pa.projektarbeit_id::text AS "projektarbeit_id", + pa.studiensemester_kurzbz, stg.studiengang_kz, upper(stg.typ || stg.kurzbz) AS "stg_typ_kurzbz", lv.orgform_kurzbz, @@ -310,8 +310,7 @@ FROM FROM lehre.tbl_projektbetreuer pb JOIN lehre.tbl_projektarbeit pa USING (projektarbeit_id) - JOIN lehre.tbl_lehreinheit le USING (lehreinheit_id) - JOIN lehre.tbl_lehrveranstaltung lv USING (lehrveranstaltung_id) + JOIN lehre.tbl_lehrveranstaltung lv ON (pa.lehrveranstaltung_id = lv.lehrveranstaltung_id) JOIN PUBLIC.tbl_organisationseinheit oe USING (oe_kurzbz) JOIN PUBLIC.tbl_person person USING (person_id) LEFT JOIN lehre.tbl_vertrag vertrag USING (vertrag_id) @@ -321,7 +320,7 @@ FROM /* filter studiengang */ lv.studiengang_kz IN ('. implode(',', $STUDIENGANG) . ') /* filter studiensemester */ - AND le.studiensemester_kurzbz = \''. $STUDIENSEMESTER. '\' + AND pa.studiensemester_kurzbz = \''. $STUDIENSEMESTER. '\' /* filter active lehrveranstaltungen */ AND lv.aktiv = TRUE /* filter ausbildungssemester */ diff --git a/application/views/system/infocenter/infocenterDetails.php b/application/views/system/infocenter/infocenterDetails.php index fb023c5fd..b5761405c 100644 --- a/application/views/system/infocenter/infocenterDetails.php +++ b/application/views/system/infocenter/infocenterDetails.php @@ -57,7 +57,7 @@
diff --git a/application/views/system/infocenter/infocenterFreigegebenData.php b/application/views/system/infocenter/infocenterFreigegebenData.php index 38285b6ae..55d8f403e 100644 --- a/application/views/system/infocenter/infocenterFreigegebenData.php +++ b/application/views/system/infocenter/infocenterFreigegebenData.php @@ -8,6 +8,7 @@ $LOGDATA_NAME = '\'Login with code\', \'Login with user\', \'Attempt to register with existing mailadress\', \'Access code sent\', \'Personal data saved\''; $REJECTED_STATUS = '\'Abgewiesener\''; $ADDITIONAL_STG = $this->config->item('infocenter_studiengang_kz'); + $QUALIFIKATIONSKURS = $this->config->item('infocenter_qualifikationskurs_kz'); $STATUS_KURZBZ = '\'Wartender\', \'Bewerber\', \'Aufgenommener\', \'Student\''; $STUDIENSEMESTER = '\''.$this->variablelib->getVar('infocenter_studiensemester').'\''; $ORG_NAME = '\'InfoCenter\''; @@ -277,7 +278,26 @@ $query = ' WHERE konto.person_id = p.person_id AND konto.studiensemester_kurzbz = '. $STUDIENSEMESTER .' AND konto.buchungstyp_kurzbz = '. $KAUTION_DRITT_STAAT .' - ) AS "Kaution" + ) AS "Kaution", + ( + SELECT 1 + FROM public.tbl_prestudentstatus pss + JOIN public.tbl_prestudent ps USING(prestudent_id) + JOIN public.tbl_studiengang sg USING(studiengang_kz) + JOIN lehre.tbl_studienplan sp USING(studienplan_id) + JOIN lehre.tbl_studienordnung so USING(studienordnung_id) + WHERE pss.status_kurzbz = '.$INTERESSENT_STATUS.' + AND pss.bewerbung_abgeschicktamum IS NOT NULL + AND ps.person_id = p.person_id + AND sg.studiengang_kz in('.$QUALIFIKATIONSKURS.') + AND NOT EXISTS ( + SELECT 1 + FROM tbl_prestudentstatus spss + WHERE spss.prestudent_id = ps.prestudent_id + AND spss.status_kurzbz = '.$REJECTED_STATUS.' + ) + LIMIT 1 + ) AS "Qualikurs" FROM public.tbl_person p LEFT JOIN ( SELECT tpl.person_id, @@ -351,7 +371,8 @@ $query = ' 'ZGV Nation MA', 'InfoCenter Mitarbeiter', 'Identitätsnachweis', - ucfirst($this->p->t('infocenter', 'kaution')) + ucfirst($this->p->t('infocenter', 'kaution')), + 'Qualikurs' ), 'formatRow' => function($datasetRaw) { @@ -480,6 +501,14 @@ $query = ' $datasetRaw->{'Kaution'} = 'Offen'; } + if ($datasetRaw->{'Qualikurs'} === null) + { + $datasetRaw->{'Qualikurs'} = 'Nein'; + } + else + { + $datasetRaw->{'Qualikurs'} = 'Ja'; + } return $datasetRaw; }, 'markRow' => function($datasetRaw) { diff --git a/application/views/system/infocenter/stammdaten.php b/application/views/system/infocenter/stammdaten.php index c632b079f..73ea300ab 100644 --- a/application/views/system/infocenter/stammdaten.php +++ b/application/views/system/infocenter/stammdaten.php @@ -92,6 +92,14 @@
+ +
+ +
p->t('infocenter','onboardingRegistriert') ?>
+ +
p->t('infocenter','ersterOnboardingLogin').': '.date_format(date_create($onboarding_first_login), 'd.m.Y') ?>
+
+ @@ -191,12 +199,12 @@ diff --git a/application/views/templates/CISVUE-Header.php b/application/views/templates/CISVUE-Header.php index 43716b3b5..00d0595cf 100644 --- a/application/views/templates/CISVUE-Header.php +++ b/application/views/templates/CISVUE-Header.php @@ -8,6 +8,7 @@ $includesArray = array( 'axios027' => true, 'primevue3' => true, 'vuedatepicker11' => true, + 'printCssPath' => 'public/css/Cis4/print.css', 'customJSs' => array_merge([ 'vendor/moment/luxonjs/luxon.min.js' ], $customJSs ?? []), @@ -29,14 +30,18 @@ $this->load->view('templates/FHC-Header', $includesArray); document.body.classList.add("in-frame"); -
'; - echo ''; + if ($row->semester == '1') + { + // Basisgebiete anzeigen + echo '
'. ($row->semester == '1' ? $p->t('testtool/basisgebiete') : $p->t('testtool/quereinstiegsgebiete')).'
'; + echo ''; + } + else + { + if (!$quereinsteiger_menu) + { + echo '
' . $p->t('testtool/basisgebiete') . '
'; + echo ''; + $quereinsteiger_menu = true; + } + else + { + echo '
' . $p->t('testtool/quereinstiegsgebiete') . '
'; + } + } } // Bei Quereinstiegsgebieten nach STG clustern und die STG anzeigen @@ -394,6 +406,12 @@ else if (isset($_SESSION['pruefling_id'])) '; + if (!$gebiet_pruefling->checkIfExists($_SESSION['pruefling_id'], $row->gebiet_id)) + { + $gebiet_pruefling->pruefling_id = $_SESSION['pruefling_id']; + $gebiet_pruefling->gebiet_id = $row->gebiet_id; + $gebiet_pruefling->saveGebietForPruefling(); + } $_SESSION['alleGebiete'][] = $row->gebiet_id; } else diff --git a/cms/newsverwaltung.php b/cms/newsverwaltung.php index 8d21d9f14..4497b2e00 100644 --- a/cms/newsverwaltung.php +++ b/cms/newsverwaltung.php @@ -86,11 +86,11 @@ echo ' - - - - - + + + + + diff --git a/cms/tinymce_dms.php b/cms/tinymce_dms.php index 9971eb808..019950601 100644 --- a/cms/tinymce_dms.php +++ b/cms/tinymce_dms.php @@ -88,6 +88,29 @@ if (! $rechte->isberechtigt('basis/dms', null, 's', null)) init: function(){ }, mySubmit : function (id) { + var messageTarget = window.opener; + + if (!messageTarget && window.parent !== window) + messageTarget = window.parent; + + if (messageTarget && typeof(messageTarget.postMessage) == "function") + { + messageTarget.postMessage( + { + type: "fhcomplete:dms:selected", + dmsId: id + }, + window.location.protocol + "//" + window.location.host + ); + } + + if ( + typeof(tinyMCEPopup) == "undefined" || + !tinyMCEPopup.params || + typeof(tinyMCEPopup.getWindowArg) != "function" + ) + return; + var URL = "dms.php?id="+id; var win = tinyMCEPopup.getWindowArg("window"); diff --git a/content/mitarbeiter/lehrtaetigkeit.pdf.php b/content/mitarbeiter/lehrtaetigkeit.pdf.php index 9118d3f60..911df1a9b 100644 --- a/content/mitarbeiter/lehrtaetigkeit.pdf.php +++ b/content/mitarbeiter/lehrtaetigkeit.pdf.php @@ -122,8 +122,7 @@ foreach ($project_arr as $project) // * get studiensemester $pa = new Projektarbeit($pa_id); - $le = new Lehreinheit($pa->lehreinheit_id); - $studiensemester_kurzbz = $le->studiensemester_kurzbz; + $studiensemester_kurzbz = $pa->studiensemester_kurzbz; // * get begin- and end date of studiensemester $ss = new Studiensemester($studiensemester_kurzbz); diff --git a/content/statistik/alvsstatistik.php b/content/statistik/alvsstatistik.php index ad2352896..0d3e59053 100644 --- a/content/statistik/alvsstatistik.php +++ b/content/statistik/alvsstatistik.php @@ -107,16 +107,14 @@ SELECT FROM lehre.tbl_projektarbeit, lehre.tbl_lehrveranstaltung, - lehre.tbl_lehreinheit, lehre.tbl_projektbetreuer, public.tbl_person WHERE tbl_projektarbeit.projektarbeit_id=tbl_projektbetreuer.projektarbeit_id AND - tbl_lehreinheit.lehreinheit_id=tbl_projektarbeit.lehreinheit_id AND - tbl_lehreinheit.lehrveranstaltung_id=tbl_lehrveranstaltung.lehrveranstaltung_id AND + tbl_projektarbeit.lehrveranstaltung_id=tbl_lehrveranstaltung.lehrveranstaltung_id AND tbl_projektbetreuer.person_id=tbl_person.person_id AND tbl_projektbetreuer.stunden<>0 AND - tbl_lehreinheit.studiensemester_kurzbz=".$db->db_add_param($stsem)." + tbl_projektarbeit.studiensemester_kurzbz=".$db->db_add_param($stsem)." GROUP BY studiengang_kz,geschlecht"; if(!$result = $db->db_query($qry)) @@ -231,7 +229,7 @@ if($format=='xls') if(!isset($stunden['w'])) $stunden['w']=0; $summe_w+=$stunden['w']; - if(!isset($summe_oe[$oe]['w'])) + if(!isset($summe_oe[$oe]['w'])) $summe_oe[$oe]['w']=0; $summe_oe[$oe]['w']+=$stunden['w']; $worksheet->write($zeile,$organisationseinheiten_idx[$oe]+1,$stunden['w'],$format_data); diff --git a/content/statistik/lehrauftragsliste_gst.xls.php b/content/statistik/lehrauftragsliste_gst.xls.php index d44c91e63..9a4ab3d70 100644 --- a/content/statistik/lehrauftragsliste_gst.xls.php +++ b/content/statistik/lehrauftragsliste_gst.xls.php @@ -85,7 +85,7 @@ $db = new basis_db(); //Daten holen $qry = "SELECT * FROM ( SELECT - tbl_lehreinheit.*, tbl_person.vorname, tbl_person.nachname, tbl_person.titelpre, + tbl_person.vorname, tbl_person.nachname, tbl_person.titelpre, tbl_mitarbeiter.personalnummer, tbl_person.person_id, tbl_mitarbeiter.mitarbeiter_uid, tbl_mitarbeiter.fixangestellt, tbl_lehreinheitmitarbeiter.stundensatz as stundensatz, @@ -109,21 +109,20 @@ if($semester!='') //Projektsbetreuungen $qry.= " UNION SELECT - tbl_lehreinheit.*, tbl_person.vorname, tbl_person.nachname, tbl_person.titelpre, + tbl_person.vorname, tbl_person.nachname, tbl_person.titelpre, tbl_mitarbeiter.personalnummer, tbl_person.person_id, tbl_mitarbeiter.mitarbeiter_uid, tbl_mitarbeiter.fixangestellt, 0 as stundensatz, 0 as semesterstunden FROM - lehre.tbl_lehreinheit, lehre.tbl_projektarbeit, lehre.tbl_projektbetreuer, + lehre.tbl_projektarbeit, lehre.tbl_projektbetreuer, public.tbl_mitarbeiter, public.tbl_benutzer, lehre.tbl_lehrveranstaltung, public.tbl_person WHERE tbl_mitarbeiter.mitarbeiter_uid = tbl_benutzer.uid AND tbl_benutzer.person_id = tbl_projektbetreuer.person_id AND tbl_projektarbeit.projektarbeit_id = tbl_projektbetreuer.projektarbeit_id AND - tbl_projektarbeit.lehreinheit_id = tbl_lehreinheit.lehreinheit_id AND - tbl_lehreinheit.studiensemester_kurzbz = ".$db->db_add_param($semester_aktuell)." AND - tbl_lehreinheit.lehrveranstaltung_id = tbl_lehrveranstaltung.lehrveranstaltung_id AND + tbl_projektarbeit.lehrveranstaltung_id = tbl_lehrveranstaltung.lehrveranstaltung_id AND + tbl_projektarbeit.studiensemester_kurzbz = ".$db->db_add_param($semester_aktuell)." AND tbl_lehrveranstaltung.studiengang_kz = ".$db->db_add_param($studiengang_kz, FHC_INTEGER)." AND tbl_person.person_id = tbl_projektbetreuer.person_id"; if($semester!='') @@ -164,16 +163,15 @@ if($result = $db->db_query($qry)) $qry = " SELECT tbl_projektbetreuer.stunden, tbl_projektbetreuer.stundensatz - FROM lehre.tbl_projektbetreuer, lehre.tbl_lehreinheit, lehre.tbl_lehrveranstaltung, + FROM lehre.tbl_projektbetreuer, lehre.tbl_lehrveranstaltung, public.tbl_benutzer, lehre.tbl_projektarbeit, campus.vw_student WHERE tbl_projektbetreuer.person_id=tbl_benutzer.person_id AND tbl_benutzer.uid=".$db->db_add_param($uid)." AND tbl_projektarbeit.projektarbeit_id=tbl_projektbetreuer.projektarbeit_id AND student_uid=vw_student.uid - AND tbl_lehreinheit.lehreinheit_id=tbl_projektarbeit.lehreinheit_id - AND tbl_lehreinheit.studiensemester_kurzbz=".$db->db_add_param($semester_aktuell)." - AND tbl_lehreinheit.lehrveranstaltung_id = tbl_lehrveranstaltung.lehrveranstaltung_id + AND tbl_projektarbeit.studiensemester_kurzbz=".$db->db_add_param($semester_aktuell)." + AND tbl_projektarbeit.lehrveranstaltung_id = tbl_lehrveranstaltung.lehrveranstaltung_id AND tbl_lehrveranstaltung.studiengang_kz=".$db->db_add_param($studiengang_kz, FHC_INTEGER); if($semester!='') $qry.=" AND tbl_lehrveranstaltung.semester=".$db->db_add_param($semester, FHC_INTEGER); diff --git a/content/statistik/lehrauftragsliste_mail.xls.php b/content/statistik/lehrauftragsliste_mail.xls.php index b4ee093b7..ea66464e6 100644 --- a/content/statistik/lehrauftragsliste_mail.xls.php +++ b/content/statistik/lehrauftragsliste_mail.xls.php @@ -99,10 +99,9 @@ $qry_stg = "SELECT distinct studiengang_kz, typ, kurzbz studiengang_kz FROM lehre.tbl_projektbetreuer JOIN lehre.tbl_projektarbeit ON tbl_projektbetreuer.projektarbeit_id=tbl_projektarbeit.projektarbeit_id - JOIN lehre.tbl_lehreinheit ON tbl_lehreinheit.lehreinheit_id = tbl_projektarbeit.lehreinheit_id - JOIN lehre.tbl_lehrveranstaltung ON tbl_lehrveranstaltung.lehrveranstaltung_id = tbl_lehreinheit.lehrveranstaltung_id + JOIN lehre.tbl_lehrveranstaltung ON tbl_lehrveranstaltung.lehrveranstaltung_id = tbl_projektarbeit.lehrveranstaltung_id WHERE - lehre.tbl_lehreinheit.studiensemester_kurzbz=".$db->db_add_param($semester_aktuell)." + lehre.tbl_projektarbeit.studiensemester_kurzbz=".$db->db_add_param($semester_aktuell)." ) as foo JOIN public.tbl_studiengang USING (studiengang_kz) "; @@ -506,10 +505,9 @@ if ($result_stg = $db->db_query($qry_stg)) JOIN public.tbl_benutzer ON tbl_benutzer.person_id=tbl_person.person_id JOIN public.tbl_mitarbeiter ON tbl_mitarbeiter.mitarbeiter_uid=tbl_benutzer.uid JOIN lehre.tbl_projektarbeit ON tbl_projektarbeit.projektarbeit_id=tbl_projektbetreuer.projektarbeit_id - JOIN lehre.tbl_lehreinheit ON tbl_lehreinheit.lehreinheit_id=tbl_projektarbeit.lehreinheit_id - JOIN lehre.tbl_lehrveranstaltung ON tbl_lehrveranstaltung.lehrveranstaltung_id = tbl_lehreinheit.lehrveranstaltung_id + JOIN lehre.tbl_lehrveranstaltung ON tbl_lehrveranstaltung.lehrveranstaltung_id = tbl_projektarbeit.lehrveranstaltung_id WHERE - tbl_lehreinheit.studiensemester_kurzbz=".$db->db_add_param($semester_aktuell)." AND + tbl_projektarbeit.studiensemester_kurzbz=".$db->db_add_param($semester_aktuell)." AND tbl_lehrveranstaltung.studiengang_kz=".$db->db_add_param($studiengang_kz, FHC_INTEGER)." AND NOT EXISTS (SELECT mitarbeiter_uid @@ -589,12 +587,11 @@ if ($result_stg = $db->db_query($qry_stg)) FROM lehre.tbl_projektbetreuer JOIN public.tbl_benutzer ON tbl_projektbetreuer.person_id = tbl_benutzer.person_id JOIN lehre.tbl_projektarbeit ON tbl_projektarbeit.projektarbeit_id = tbl_projektbetreuer.projektarbeit_id - JOIN lehre.tbl_lehreinheit ON tbl_lehreinheit.lehreinheit_id = tbl_projektarbeit.lehreinheit_id - JOIN lehre.tbl_lehrveranstaltung ON tbl_lehreinheit.lehrveranstaltung_id = tbl_lehrveranstaltung.lehrveranstaltung_id + JOIN lehre.tbl_lehrveranstaltung ON tbl_projektarbeit.lehrveranstaltung_id = tbl_lehrveranstaltung.lehrveranstaltung_id JOIN campus.vw_student ON vw_student.uid = student_uid WHERE tbl_benutzer.uid = ".$db->db_add_param($uid)." - AND tbl_lehreinheit.studiensemester_kurzbz=".$db->db_add_param($semester_aktuell)." + AND tbl_projektarbeit.studiensemester_kurzbz=".$db->db_add_param($semester_aktuell)." AND tbl_lehrveranstaltung.studiengang_kz=".$db->db_add_param($studiengang_kz, FHC_INTEGER); if ($result = $db->db_query($qry)) @@ -825,15 +822,14 @@ if ($result_stg = $db->db_query($qry_stg)) $worksheet =& $workbook->addWorksheet('Betreuerstunden'); $worksheet->setInputEncoding('utf-8'); $qry = "SELECT - studiensemester_kurzbz, nachname, vorname, sum(stunden) AS stunden, titelpre, + lehre.tbl_projektarbeit.studiensemester_kurzbz, nachname, vorname, sum(stunden) AS stunden, titelpre, sum(tbl_projektbetreuer.stundensatz*tbl_projektbetreuer.stunden)::numeric(8, 2) AS euro, person_id FROM public.tbl_person JOIN lehre.tbl_projektbetreuer USING (person_id) JOIN lehre.tbl_projektarbeit USING (projektarbeit_id) - JOIN lehre.tbl_lehreinheit USING (lehreinheit_id) JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id) WHERE - studiensemester_kurzbz = ".$db->db_add_param($semester_aktuell)." AND + lehre.tbl_projektarbeit.studiensemester_kurzbz = ".$db->db_add_param($semester_aktuell)." AND stunden > 0"; if (count($stg_arr) > 0) @@ -841,7 +837,7 @@ if ($result_stg = $db->db_query($qry_stg)) $qry .= " GROUP BY - studiensemester_kurzbz, person_id, nachname, vorname, titelpre + lehre.tbl_projektarbeit.studiensemester_kurzbz, person_id, nachname, vorname, titelpre ORDER BY nachname, vorname "; diff --git a/content/statistik/lvplanung.php b/content/statistik/lvplanung.php index fe69e4160..57f676402 100644 --- a/content/statistik/lvplanung.php +++ b/content/statistik/lvplanung.php @@ -304,15 +304,14 @@ if($studiengang_kz!='') $qry = "SELECT * FROM - lehre.tbl_projektarbeit, lehre.tbl_lehreinheit, lehre.tbl_lehrveranstaltung, + lehre.tbl_projektarbeit, lehre.tbl_lehrveranstaltung, lehre.tbl_projektbetreuer, public.tbl_person WHERE - tbl_projektarbeit.lehreinheit_id=tbl_lehreinheit.lehreinheit_id AND - tbl_lehreinheit.lehrveranstaltung_id=tbl_lehrveranstaltung.lehrveranstaltung_id AND + tbl_projektarbeit.lehrveranstaltung_id=tbl_lehrveranstaltung.lehrveranstaltung_id AND tbl_projektarbeit.projektarbeit_id=tbl_projektbetreuer.projektarbeit_id AND tbl_person.person_id=tbl_projektbetreuer.person_id AND tbl_lehrveranstaltung.studiengang_kz=".$db->db_add_param($studiengang_kz, FHC_INTEGER)." AND - tbl_lehreinheit.studiensemester_kurzbz=".$db->db_add_param($semester_aktuell)." + tbl_projektarbeit.studiensemester_kurzbz=".$db->db_add_param($semester_aktuell)." "; if($semester!='') @@ -323,14 +322,13 @@ elseif($mitarbeiter_uid!='') $qry = "SELECT * FROM - lehre.tbl_projektarbeit, lehre.tbl_lehreinheit, lehre.tbl_lehrveranstaltung, lehre.tbl_projektbetreuer, public.tbl_person + lehre.tbl_projektarbeit, lehre.tbl_lehrveranstaltung, lehre.tbl_projektbetreuer, public.tbl_person WHERE - tbl_projektarbeit.lehreinheit_id=tbl_lehreinheit.lehreinheit_id AND - tbl_lehreinheit.lehrveranstaltung_id=tbl_lehrveranstaltung.lehrveranstaltung_id AND + tbl_projektarbeit.lehrveranstaltung_id=tbl_lehrveranstaltung.lehrveranstaltung_id AND tbl_projektarbeit.projektarbeit_id=tbl_projektbetreuer.projektarbeit_id AND tbl_person.person_id=tbl_projektbetreuer.person_id AND tbl_projektbetreuer.person_id=".$db->db_add_param($mitarbeiter->person_id, FHC_INTEGER)." AND - tbl_lehreinheit.studiensemester_kurzbz=".$db->db_add_param($semester_aktuell)." + tbl_projektarbeit.studiensemester_kurzbz=".$db->db_add_param($semester_aktuell)." "; } elseif($oe_kurzbz!='') @@ -338,15 +336,14 @@ elseif($oe_kurzbz!='') $qry = "SELECT * FROM - lehre.tbl_projektarbeit, lehre.tbl_lehreinheit, lehre.tbl_lehrveranstaltung, lehre.tbl_projektbetreuer, + lehre.tbl_projektarbeit, lehre.tbl_lehrveranstaltung, lehre.tbl_projektbetreuer, public.tbl_person, lehre.tbl_lehrveranstaltung as lehrfach WHERE - tbl_projektarbeit.lehreinheit_id=tbl_lehreinheit.lehreinheit_id AND - tbl_lehreinheit.lehrveranstaltung_id=tbl_lehrveranstaltung.lehrveranstaltung_id AND + tbl_projektarbeit.lehrveranstaltung_id=tbl_lehrveranstaltung.lehrveranstaltung_id AND tbl_projektarbeit.projektarbeit_id=tbl_projektbetreuer.projektarbeit_id AND - tbl_lehreinheit.lehrfach_id=lehrfach.lehrveranstaltung_id AND + tbl_projektarbeit.lehrveranstaltung_id=lehrfach.lehrveranstaltung_id AND tbl_person.person_id=tbl_projektbetreuer.person_id AND - tbl_lehreinheit.studiensemester_kurzbz=".$db->db_add_param($semester_aktuell)." AND + tbl_projektarbeit.studiensemester_kurzbz=".$db->db_add_param($semester_aktuell)." AND lehrfach.oe_kurzbz=".$db->db_add_param($oe_kurzbz)." "; } diff --git a/content/statistik/lvplanung.xls.php b/content/statistik/lvplanung.xls.php index deb4bf295..f1371db5a 100644 --- a/content/statistik/lvplanung.xls.php +++ b/content/statistik/lvplanung.xls.php @@ -490,15 +490,13 @@ if($result = $db->db_query($qry)) tbl_projektbetreuer.person_id, tbl_lehrveranstaltung.orgform_kurzbz FROM lehre.tbl_projektarbeit, - lehre.tbl_lehreinheit, lehre.tbl_lehrveranstaltung, lehre.tbl_projektbetreuer, PUBLIC.tbl_person - WHERE tbl_projektarbeit.lehreinheit_id = tbl_lehreinheit.lehreinheit_id - AND tbl_lehreinheit.lehrveranstaltung_id = tbl_lehrveranstaltung.lehrveranstaltung_id + WHERE tbl_projektarbeit.lehrveranstaltung_id = tbl_lehrveranstaltung.lehrveranstaltung_id AND tbl_projektarbeit.projektarbeit_id = tbl_projektbetreuer.projektarbeit_id AND tbl_person.person_id = tbl_projektbetreuer.person_id - AND tbl_lehreinheit.studiensemester_kurzbz = ".$db->db_add_param($studiensemester_kurzbz); + AND tbl_projektarbeit.studiensemester_kurzbz = ".$db->db_add_param($studiensemester_kurzbz); if($uid!=='') { diff --git a/content/statistik/projektarbeitexport.xls.php b/content/statistik/projektarbeitexport.xls.php index 2422292e7..41d3e9bcb 100644 --- a/content/statistik/projektarbeitexport.xls.php +++ b/content/statistik/projektarbeitexport.xls.php @@ -84,15 +84,14 @@ $qry = "SELECT ende, CASE WHEN freigegeben THEN 'Ja' ELSE 'Nein' END, gesperrtbis, themenbereich, tbl_projektarbeit.anmerkung, projektarbeit_id FROM - lehre.tbl_projektarbeit, lehre.tbl_lehreinheit, lehre.tbl_lehrveranstaltung, + lehre.tbl_projektarbeit, lehre.tbl_lehrveranstaltung, public.tbl_benutzer, public.tbl_person, lehre.tbl_projekttyp WHERE - tbl_projektarbeit.lehreinheit_id = tbl_lehreinheit.lehreinheit_id AND - tbl_lehrveranstaltung.lehrveranstaltung_id = tbl_lehreinheit.lehrveranstaltung_id AND + tbl_projektarbeit.lehrveranstaltung_id = tbl_lehrveranstaltung.lehrveranstaltung_id AND tbl_projektarbeit.student_uid = tbl_benutzer.uid AND tbl_benutzer.person_id = tbl_person.person_id AND tbl_projektarbeit.projekttyp_kurzbz = tbl_projekttyp.projekttyp_kurzbz AND - tbl_lehreinheit.studiensemester_kurzbz = ".$db->db_add_param($studiensemester_kurzbz)." AND + tbl_projektarbeit.studiensemester_kurzbz = ".$db->db_add_param($studiensemester_kurzbz)." AND tbl_lehrveranstaltung.studiengang_kz = ".$db->db_add_param($studiengang_kz)." AND tbl_projektarbeit.projekttyp_kurzbz IN ('Bachelor','Diplom','Projekt')"; diff --git a/content/student/studentDBDML.php b/content/student/studentDBDML.php index 041af9c20..b9232d5cd 100644 --- a/content/student/studentDBDML.php +++ b/content/student/studentDBDML.php @@ -4374,6 +4374,8 @@ if(!$error) $projektarbeit->titel = $_POST['titel']; $projektarbeit->titel_english = $_POST['titel_english']; $projektarbeit->lehreinheit_id = $_POST['lehreinheit_id']; + $projektarbeit->lehrveranstaltung_id = $_POST['lehrveranstaltung_id']; + $projektarbeit->studiensemester_kurzbz = $_POST['studiensemester_kurzbz']; $projektarbeit->student_uid = $_POST['student_uid']; $projektarbeit->firma_id = $_POST['firma_id']; $projektarbeit->note = $_POST['note']; diff --git a/content/student/studentprojektarbeit.js.php b/content/student/studentprojektarbeit.js.php index 62dbfeace..11fd630fe 100644 --- a/content/student/studentprojektarbeit.js.php +++ b/content/student/studentprojektarbeit.js.php @@ -239,6 +239,7 @@ function StudentProjektarbeitDetailDisableFields(val) document.getElementById('student-projektarbeit-button-speichern').disabled=val; document.getElementById('student-projektarbeit-menulist-projekttyp').disabled=val; document.getElementById('student-projektarbeit-menulist-lehrveranstaltung').disabled=val; + document.getElementById('student-projektarbeit-menulist-studiensemester').disabled=val; document.getElementById('student-projektarbeit-menulist-lehreinheit').disabled=val; document.getElementById('student-projektarbeit-menulist-firma').disabled=val; document.getElementById('student-projektarbeit-menulist-note').disabled=val; @@ -290,6 +291,7 @@ function StudentProjektarbeitResetFields() document.getElementById('student-projektarbeit-menulist-firma').value=''; document.getElementById('student-projektarbeit-menulist-note').value=''; document.getElementById('student-projektarbeit-checkbox-final').checked=true; + document.getElementById('student-projektarbeit-menulist-studiensemester').value=getStudiensemester(); var stg_kz = document.getElementById('student-detail-menulist-studiengang_kz').value; @@ -379,6 +381,7 @@ function StudentProjektarbeitAuswahl() lehreinheit_id = getTargetHelper(dsource,subject,rdfService.GetResource( predicateNS + "#lehreinheit_id" )); lehrveranstaltung_id = getTargetHelper(dsource,subject,rdfService.GetResource( predicateNS + "#lehrveranstaltung_id" )); lehreinheit_stsem = getTargetHelper(dsource,subject,rdfService.GetResource( predicateNS + "#lehreinheit_stsem" )); + projektarbeit_stsem = getTargetHelper(dsource,subject,rdfService.GetResource( predicateNS + "#projektarbeit_stsem" )); student_uid = getTargetHelper(dsource,subject,rdfService.GetResource( predicateNS + "#student_uid" )); firma_id = getTargetHelper(dsource,subject,rdfService.GetResource( predicateNS + "#firma_id" )); note = getTargetHelper(dsource,subject,rdfService.GetResource( predicateNS + "#note" )); @@ -399,7 +402,7 @@ function StudentProjektarbeitAuswahl() //Lehrveranstaltung DropDown laden var LvDropDown = document.getElementById('student-projektarbeit-menulist-lehrveranstaltung'); - url='rdf/lehrveranstaltung.rdf.php?uid='+student_uid+"&projektarbeit=true&withlv="+lehrveranstaltung_id+"&"+gettimestamp(); + url='rdf/lehrveranstaltung.rdf.php?uid='+student_uid+"&stg_kz="+stg_kz+"&projektarbeit=true&withlv="+lehrveranstaltung_id+"&"+gettimestamp(); //Alte DS entfernen var oldDatasources = LvDropDown.database.GetDataSources(); @@ -420,7 +423,7 @@ function StudentProjektarbeitAuswahl() // Lehreinheit Drop Down laden var LeDropDown = document.getElementById('student-projektarbeit-menulist-lehreinheit'); - url='rdf/lehreinheit.rdf.php?lehrveranstaltung_id='+lehrveranstaltung_id+"&studiensemester_kurzbz="+lehreinheit_stsem+"&"+gettimestamp(); + url='rdf/lehreinheit.rdf.php?lehrveranstaltung_id='+lehrveranstaltung_id+"&studiensemester_kurzbz="+projektarbeit_stsem+"&"+gettimestamp(); //Alte DS entfernen var oldDatasources = LeDropDown.database.GetDataSources(); @@ -442,6 +445,7 @@ function StudentProjektarbeitAuswahl() //Werte setzen document.getElementById('student-projektarbeit-textbox-projektarbeit_id').value=projektarbeit_id; document.getElementById('student-projektarbeit-textbox-lehreinheit_stsem').value=lehreinheit_stsem; + document.getElementById('student-projektarbeit-menulist-studiensemester').value=projektarbeit_stsem; document.getElementById('student-projektarbeit-menulist-projekttyp').value=projekttyp_kurzbz; document.getElementById('student-projektarbeit-menulist-lehrveranstaltung').value=lehrveranstaltung_id; document.getElementById('student-projektarbeit-menulist-lehreinheit').value=lehreinheit_id; @@ -539,6 +543,7 @@ function StudentProjektarbeitSpeichern() projektarbeit_id = document.getElementById('student-projektarbeit-textbox-projektarbeit_id').value; projekttyp_kurzbz = document.getElementById('student-projektarbeit-menulist-projekttyp').value; lehrveranstaltung_id = document.getElementById('student-projektarbeit-menulist-lehrveranstaltung').value; + studiensemester_kurzbz = document.getElementById('student-projektarbeit-menulist-studiensemester').value; lehreinheit_id = document.getElementById('student-projektarbeit-menulist-lehreinheit').value; titel = document.getElementById('student-projektarbeit-textbox-titel').value; titel_english = document.getElementById('student-projektarbeit-textbox-titel_english').value; @@ -585,12 +590,18 @@ function StudentProjektarbeitSpeichern() return false; } - if(lehreinheit_id=='') + if(lehrveranstaltung_id=='') { - alert('Bitte einen LV-Teil auswaehlen'); + alert('Bitte eine Lehrveranstaltung auswaehlen'); return false; } + if(studiensemester_kurzbz=='') + { + alert('Bitte ein Studiensemester auswaehlen'); + return false; + } + if(isNaN(gesamtstunden)) gesamtstunden=0; @@ -603,6 +614,8 @@ function StudentProjektarbeitSpeichern() req.add('projekttyp_kurzbz', projekttyp_kurzbz ); req.add('titel', titel); req.add('titel_english', titel_english); + req.add('lehrveranstaltung_id', lehrveranstaltung_id); + req.add('studiensemester_kurzbz', studiensemester_kurzbz); req.add('lehreinheit_id', lehreinheit_id); req.add('student_uid', student_uid); req.add('firma_id', firma_id); @@ -738,7 +751,7 @@ function StudentProjektarbeitLVAChange() netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); lehrveranstaltung_id = document.getElementById('student-projektarbeit-menulist-lehrveranstaltung').value; - studiensemester_kurzbz = getStudiensemester(); + studiensemester_kurzbz = document.getElementById('student-projektarbeit-menulist-studiensemester').value; // Lehreinheit Drop Down laden var LeDropDown = document.getElementById('student-projektarbeit-menulist-lehreinheit'); @@ -897,8 +910,8 @@ function StudentProjektbetreuerAuswahl() document.getElementById('student-projektbetreuer-textbox-person_id').value=person_id; document.getElementById('student-projektbetreuer-checkbox-neu').checked=false; - var lehreinheitstsem = document.getElementById('student-projektarbeit-textbox-lehreinheit_stsem').value; - var default_stundensatz = StudentProjektbetreuerLoadStundensatz(person_id, lehreinheitstsem); + var projektarbeitstsem = document.getElementById('student-projektarbeit-menulist-studiensemester').value; + var default_stundensatz = StudentProjektbetreuerLoadStundensatz(person_id, projektarbeitstsem); if (default_stundensatz != '') default_stundensatz = 'Stundensatz (Default '+default_stundensatz+'):'; @@ -1410,9 +1423,10 @@ function StudentProjektbetreuerLoadStundensatz(person_id, studiensemester) function StudentProjektbetreuerLoadMitarbeiterDaten() { var person_id = MenulistGetSelectedValue('student-projektbetreuer-menulist-person'); - var lehreinheitstsem = document.getElementById('student-projektarbeit-textbox-lehreinheit_stsem').value; + var projektarbeitstsem = document.getElementById('student-projektarbeit-menulist-studiensemester').value; - var stundensatz = StudentProjektbetreuerLoadStundensatz(person_id, lehreinheitstsem); + + var stundensatz = StudentProjektbetreuerLoadStundensatz(person_id, projektarbeitstsem); if (stundensatz != '') default_stundensatz = 'Stundensatz (Default '+stundensatz+'):'; diff --git a/content/student/studentprojektarbeitoverlay.xul.php b/content/student/studentprojektarbeitoverlay.xul.php index 71cae9cf6..94788054a 100644 --- a/content/student/studentprojektarbeitoverlay.xul.php +++ b/content/student/studentprojektarbeitoverlay.xul.php @@ -104,6 +104,10 @@ $is_hidden = (!defined('FAS_STUDIERENDE_PROJEKTARBEIT_VERTRAGSDETAILS_ANZEIGEN') class="sortDirectionIndicator" sort="rdf:http://www.technikum-wien.at/projektarbeit/rdf#projektarbeit_id" /> +