diff --git a/application/controllers/api/frontend/fas/studstatus/Wiederholung.php b/application/controllers/api/frontend/fas/studstatus/Wiederholung.php
new file mode 100644
index 000000000..c6e5a4fa9
--- /dev/null
+++ b/application/controllers/api/frontend/fas/studstatus/Wiederholung.php
@@ -0,0 +1,161 @@
+.
+ */
+
+if (! defined('BASEPATH')) exit('No direct script access allowed');
+
+
+/**
+ * This controller operates between (interface) the JS (FAS) and the AntragLib (back-end)
+ * This controller works with calls on the HTTP GET or POST and the output is always RDF
+ */
+class Wiederholung extends Auth_Controller
+{
+
+ /**
+ * Calls the parent's constructor and loads the FilterCmptLib
+ */
+ public function __construct()
+ {
+ parent::__construct([
+ 'getLvs' => ['student/studierendenantrag:r', 'student/noten:r'],
+ 'moveLvsToZeugnis' => ['student/studierendenantrag:w', 'student/noten:w']
+ ]);
+
+ // Libraries
+ $this->load->library('AntragLib');
+
+ // Load language phrases
+ $this->loadPhrases([
+ 'global',
+ 'studierendenantrag'
+ ]);
+ }
+
+ //------------------------------------------------------------------------------------------------------------------
+ // Public methods
+
+ public function getLvs($prestudent_id)
+ {
+ // header für no cache
+ $this->output->set_header("Cache-Control: no-cache");
+ $this->output->set_header("Cache-Control: post-check=0, pre-check=0", false);
+ $this->output->set_header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
+ $this->output->set_header("Pragma: no-cache");
+ $this->output->set_header("Content-type: application/xhtml+xml");
+
+ $this->load->library('VariableLib', ['uid' => getAuthUID()]);
+ $sem_akt = $this->variablelib->getVar('semester_aktuell');
+
+
+ $result = $this->antraglib->getLvsForPrestudent($prestudent_id, $sem_akt);
+ $lvs = $this->getDataOrTerminateWithError($result) ?: [];
+
+ $rdf_url = 'http://www.technikum-wien.at/antragnote';
+
+ $this->load->view('lehre/Antrag/Wiederholung/getLvs.rdf.php', [
+ 'url' => $rdf_url,
+ 'lvs' => $lvs
+ ]);
+ }
+
+ public function moveLvsToZeugnis()
+ {
+ $anzahl = $this->input->post('anzahl');
+ $student_uid = $this->input->post('student_uid');
+ $this->load->model('education/Studierendenantraglehrveranstaltung_model', 'StudierendenantraglehrveranstaltungModel');
+ $this->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel');
+
+ $errormsg = array();
+
+ for($i=0; $i<$anzahl; $i++)
+ {
+ $id = $this->input->post('studierendenantrag_lehrveranstaltung_id_' . $i);
+ $result =$this->StudierendenantraglehrveranstaltungModel->load($id);
+ if(isError($result))
+ {
+ $errormsg[] = getError($result);
+ }
+ elseif(!hasData($result))
+ {
+ $errormsg[] = $this->p->t('studierendenantrag', 'error_no_lv_in_application');
+ }
+ else
+ {
+ $antragLv = getData($result)[0];
+ $result= $this->ZeugnisnoteModel->load([
+ 'lehrveranstaltung_id'=> $antragLv->lehrveranstaltung_id,
+ 'student_uid'=> $student_uid,
+ 'studiensemester_kurzbz' => $antragLv->studiensemester_kurzbz
+ ]);
+ if(isError($result))
+ {
+ $errormsg[] = getError($result);
+ }
+ else
+ {
+ if (hasData($result))
+ {
+ $result = $this->ZeugnisnoteModel->update(
+ [
+ 'lehrveranstaltung_id'=> $antragLv->lehrveranstaltung_id,
+ 'student_uid'=> $student_uid,
+ 'studiensemester_kurzbz' => $antragLv->studiensemester_kurzbz
+ ],
+ [
+ 'note'=> $antragLv->note,
+ 'uebernahmedatum' => date('c'),
+ 'benotungsdatum' => $antragLv->insertamum,
+ 'updateamum' => date('c'),
+ 'bemerkung'=>$antragLv->anmerkung,
+ 'updatevon'=>getAuthUID()
+ ]
+ );
+ }
+ else
+ {
+ $result = $this->ZeugnisnoteModel->insert([
+ 'lehrveranstaltung_id'=> $antragLv->lehrveranstaltung_id,
+ 'student_uid'=> $student_uid,
+ 'studiensemester_kurzbz' => $antragLv->studiensemester_kurzbz,
+ 'note'=> $antragLv->note,
+ 'uebernahmedatum' => date('c'),
+ 'benotungsdatum' => $antragLv->insertamum,
+ 'insertamum' => date('c'),
+ 'bemerkung'=>$antragLv->anmerkung,
+ 'insertvon'=>getAuthUID()
+ ]);
+ }
+ if(isError($result))
+ {
+ $errormsg[] = getError($result);
+ }
+ }
+ }
+ }
+
+ if($errormsg)
+ $return = false;
+ else
+ $return = true;
+
+ $this->load->view('lehre/Antrag/Wiederholung/moveLvs.rdf.php', [
+ 'return' => $return,
+ 'errormsg' => $errormsg
+ ]);
+ }
+}
diff --git a/application/controllers/api/frontend/v1/Filter.php b/application/controllers/api/frontend/v1/Filter.php
new file mode 100644
index 000000000..45838fc5f
--- /dev/null
+++ b/application/controllers/api/frontend/v1/Filter.php
@@ -0,0 +1,231 @@
+.
+ */
+
+if (! defined('BASEPATH')) exit('No direct script access allowed');
+
+/**
+ * This controller operates between (interface) the JS (GUI) and the FilterCmptLib (back-end)
+ * Provides data to the ajax get calls about the filter component
+ * Listens to ajax post calls to change the filter data
+ * This controller works with JSON calls on the HTTP GET or POST and the output is always JSON
+ */
+class Filter extends FHCAPI_Controller
+{
+ const FILTER_UNIQUE_ID = 'filterUniqueId'; // Name of the filter cmpt unique id (mandatory)
+ const FILTER_TYPE = 'filterType'; // The filter type (PHP filter definition) used (mandatory)
+ const FILTER_ID = 'filterId'; // The id of the used filter (optional)
+
+ /**
+ * Calls the parent's constructor and loads the FilterCmptLib
+ */
+ public function __construct()
+ {
+ // NOTE: FilterCmpt has its own permissions checks
+ parent::__construct([
+ 'getFilter' => self::PERM_LOGGED,
+ 'removeFilterField' => self::PERM_LOGGED,
+ 'addFilterField' => self::PERM_LOGGED,
+ 'applyFilterFields' => self::PERM_LOGGED,
+ 'removeCustomFilter' => self::PERM_LOGGED,
+ 'saveCustomFilter' => self::PERM_LOGGED,
+ 'reloadDataset' => self::PERM_LOGGED
+ ]);
+
+ // Loads the FiltersModel
+ $this->load->model('system/Filters_model', 'FiltersModel');
+
+ // Loads the FilterCmptLib with HTTP GET/POST parameters
+ $this->_startFilterCmptLib();
+ }
+
+ //------------------------------------------------------------------------------------------------------------------
+ // Public methods
+
+ /**
+ * Retrieves data about the current filter from the session and will be written on the output in JSON format
+ */
+ public function getFilter()
+ {
+ if (!$this->form_validation->run())
+ $this->terminateWithValidationErrors($this->form_validation->error_array());
+
+ $session = $this->filtercmptlib->getSession();
+ if (is_object($session)) {
+ // If stdClass it is an retval object
+ $session = $this->getDataOrTerminateWithError($session);
+ }
+ $this->terminateWithSuccess($session);
+ }
+
+ /**
+ * Remove an applied filter (SQL where condition) from the current filter
+ */
+ public function removeFilterField()
+ {
+ $this->form_validation->set_rules('filterField', 'filterField', 'required');
+
+ if (!$this->form_validation->run())
+ $this->terminateWithValidationErrors($this->form_validation->error_array());
+
+ $result = $this->filtercmptlib->removeFilterField($this->input->post('filterField'));
+
+ if (!$result)
+ $this->terminateWithError('Error occurred', self::ERROR_TYPE_GENERAL);
+
+ $this->terminateWithSuccess('Field removed');
+ }
+
+ /**
+ * Add a filter (SQL where clause) to be applied to the current filter
+ */
+ public function addFilterField()
+ {
+ $this->form_validation->set_rules('filterField', 'filterField', 'required');
+
+ if (!$this->form_validation->run())
+ $this->terminateWithValidationErrors($this->form_validation->error_array());
+
+ $result = $this->filtercmptlib->addFilterField($this->input->post('filterField'));
+
+ if (!$result)
+ $this->terminateWithError('Error occurred', self::ERROR_TYPE_GENERAL);
+
+ $this->terminateWithSuccess('Field added');
+ }
+
+ /**
+ * Apply the filter changes
+ */
+ public function applyFilterFields()
+ {
+ $this->form_validation->set_rules('filterFields', 'filterFields', 'required');
+
+ if (!$this->form_validation->run())
+ $this->terminateWithValidationErrors($this->form_validation->error_array());
+
+ $result = $this->filtercmptlib->applyFilterFields($this->input->post('filterFields'));
+
+ if (!$result)
+ $this->terminateWithError('Error occurred', self::ERROR_TYPE_GENERAL);
+
+ $this->terminateWithSuccess('Applied');
+ }
+
+ /**
+ * Save the current filter as a custom filter for this user with the given description
+ */
+ public function saveCustomFilter()
+ {
+ $this->form_validation->set_rules('customFilterName', 'customFilterName', 'required');
+
+ if (!$this->form_validation->run())
+ $this->terminateWithValidationErrors($this->form_validation->error_array());
+
+ $result = $this->filtercmptlib->saveCustomFilter($this->input->post('customFilterName'));
+
+ if (!$result)
+ $this->terminateWithError('Error occurred', self::ERROR_TYPE_GENERAL);
+
+ $this->terminateWithSuccess('Saved');
+ }
+
+ /**
+ * Remove a custom filter by its filterId
+ */
+ public function removeCustomFilter()
+ {
+ $this->form_validation->set_rules('filterId', 'filterId', 'required');
+
+ if (!$this->form_validation->run())
+ $this->terminateWithValidationErrors($this->form_validation->error_array());
+
+ $result = $this->filtercmptlib->removeCustomFilter($this->input->post('filterId'));
+
+ if (!$result)
+ $this->terminateWithError('Error occurred', self::ERROR_TYPE_GENERAL);
+
+ $this->terminateWithSuccess('Removed');
+ }
+
+ /**
+ * Reloads the dataset
+ */
+ public function reloadDataset()
+ {
+ if (!$this->form_validation->run())
+ $this->terminateWithValidationErrors($this->form_validation->error_array());
+
+ $this->filtercmptlib->reloadDataset();
+
+ $this->terminateWithSuccess('Success');
+ }
+
+ //------------------------------------------------------------------------------------------------------------------
+ // Private methods
+
+ /**
+ * Loads the FilterCmptLib with the FILTER_UNIQUE_ID parameter
+ * If the parameter FILTER_UNIQUE_ID is not given then the execution of the controller is terminated and
+ * an error message is printed
+ */
+ private function _startFilterCmptLib()
+ {
+ $filterUniqueId = null;
+ $filterType = null;
+ $filterId = null;
+
+ $validations = [
+ [
+ 'field' => self::FILTER_UNIQUE_ID,
+ 'label' => self::FILTER_UNIQUE_ID,
+ 'rules' => 'required'
+ ],
+ [
+ 'field' => self::FILTER_TYPE,
+ 'label' => self::FILTER_TYPE,
+ 'rules' => 'required'
+ ],
+ ];
+
+ $this->load->library('form_validation');
+
+ if ($this->input->method() == 'get')
+ $this->form_validation->set_data($this->input->get());
+ $this->form_validation->set_rules($validations);
+
+ if ($this->form_validation->run()) {
+ $filterUniqueId = $this->input->post_get(self::FILTER_UNIQUE_ID);
+ $filterType = $this->input->post_get(self::FILTER_TYPE);
+ $filterId = $this->input->post_get(self::FILTER_ID);
+
+ // Loads the FilterCmptLib that contains all the used logic
+ $this->load->library(
+ 'FilterCmptLib',
+ array(
+ 'filterUniqueId' => $filterUniqueId,
+ 'filterType' => $filterType,
+ 'filterId' => $filterId
+ )
+ );
+
+ // Start the component
+ $this->filtercmptlib->start();
+ }
+ }
+}
+
diff --git a/application/controllers/api/frontend/v1/Navigation.php b/application/controllers/api/frontend/v1/Navigation.php
new file mode 100644
index 000000000..6cbbbd385
--- /dev/null
+++ b/application/controllers/api/frontend/v1/Navigation.php
@@ -0,0 +1,101 @@
+.
+ */
+
+if (! defined('BASEPATH')) exit('No direct script access allowed');
+
+/**
+ * This controller operates between (interface) the JS (GUI) and the NavigationLib (back-end)
+ * Provides data to the ajax get calls about the filter
+ * This controller works with JSON calls on the HTTP GET or POST and the output is always JSON
+ */
+class Navigation extends FHCAPI_Controller
+{
+ const NAVIGATION_PAGE_PARAM = 'navigation_page'; // Navigation page parameter name
+
+ /**
+ * Loads the NavigationLib where the used logic lies
+ */
+ public function __construct()
+ {
+ parent::__construct([
+ 'menu' => self::PERM_LOGGED,
+ 'header' => self::PERM_LOGGED
+ ]);
+
+ $this->_loadNavigationLib(); // Loads the NavigationLib with parameters
+ }
+
+ //------------------------------------------------------------------------------------------------------------------
+ // Public methods
+
+ /**
+ * This function creates the left Menu for each Page
+ * @param NAVIGATION_PAGE_PARAM GET Parameter witch holds the currently called Page
+ * @return JSON object with the Menu Entries
+ */
+ public function menu()
+ {
+ $menuArray = $this->navigationlib->getMenuArray($this->input->get(self::NAVIGATION_PAGE_PARAM));
+
+ $this->terminateWithSuccess($menuArray);
+ }
+
+ /**
+ * This function creates the Top Menu for each Page
+ * @param NAVIGATION_PAGE_PARAM GET Parameter witch holds the currently called Page
+ * @return JSON object with the Menu Entries
+ */
+ public function header()
+ {
+ $headerArray = $this->navigationlib->getHeaderArray($this->input->get(self::NAVIGATION_PAGE_PARAM));
+
+ $this->terminateWithSuccess($headerArray);
+ }
+
+ //------------------------------------------------------------------------------------------------------------------
+ // Private methods
+
+ /**
+ * Loads the NavigationLib with the NAVIGATION_PAGE_PARAM parameter
+ * If the parameter NAVIGATION_PAGE_PARAM is not given then the execution of the controller is terminated and
+ * an error message is printed
+ */
+ private function _loadNavigationLib()
+ {
+ // If the parameter NAVIGATION_PAGE_PARAM is present in the HTTP GET or POST
+ if (isset($_GET[self::NAVIGATION_PAGE_PARAM]) || isset($_POST[self::NAVIGATION_PAGE_PARAM]))
+ {
+ // If it is present in the HTTP GET
+ if (isset($_GET[self::NAVIGATION_PAGE_PARAM]))
+ {
+ $navigationPage = $this->input->get(self::NAVIGATION_PAGE_PARAM); // is retrieved from the HTTP GET
+ }
+ elseif (isset($_POST[self::NAVIGATION_PAGE_PARAM])) // Else if it is present in the HTTP POST
+ {
+ $navigationPage = $this->input->post(self::NAVIGATION_PAGE_PARAM); // is retrieved from the HTTP POST
+ }
+
+ // Loads the NavigationLib that contains all the used logic
+ $this->load->library('NavigationLib', array(self::NAVIGATION_PAGE_PARAM => $navigationPage));
+ }
+ else // Otherwise an error will be written in the output
+ {
+ show_error('Parameter "' . self::NAVIGATION_PAGE_PARAM . '" not provided!');
+ }
+ }
+}
diff --git a/application/controllers/api/frontend/v1/Phrasen.php b/application/controllers/api/frontend/v1/Phrasen.php
new file mode 100644
index 000000000..472308d2b
--- /dev/null
+++ b/application/controllers/api/frontend/v1/Phrasen.php
@@ -0,0 +1,46 @@
+.
+ */
+
+if (! defined('BASEPATH')) exit('No direct script access allowed');
+
+/**
+ * This controller operates between (interface) the JS (GUI) and the PhrasesLib (back-end)
+ * Provides data to the ajax get calls about the Phrasen plugin
+ * This controller works with JSON calls on the HTTP GET and the output is always JSON
+ */
+class Phrasen extends FHCAPI_Controller
+{
+ public function __construct()
+ {
+ parent::__construct([
+ 'loadModule' => self::PERM_ANONYMOUS
+ ]);
+ }
+
+ //------------------------------------------------------------------------------------------------------------------
+ // Public methods
+
+ /**
+ * @param string $module
+ */
+ public function loadModule($module)
+ {
+ $this->load->library('PhrasesLib', [$module], 'pj');
+ $this->terminateWithSuccess(json_decode($this->pj->getJSON()));
+ }
+}
diff --git a/application/controllers/api/frontend/v1/Searchbar.php b/application/controllers/api/frontend/v1/Searchbar.php
new file mode 100644
index 000000000..8b383e042
--- /dev/null
+++ b/application/controllers/api/frontend/v1/Searchbar.php
@@ -0,0 +1,69 @@
+.
+ */
+
+if (! defined('BASEPATH')) exit('No direct script access allowed');
+
+/**
+ * This controller operates between (interface) the JS (GUI) and the SearchBarLib (back-end)
+ * Provides data to the ajax get calls about the searchbar component
+ * This controller works with JSON calls on the HTTP GET and the output is always JSON
+ */
+class Searchbar extends FHCAPI_Controller
+{
+ const SEARCHSTR_PARAM = 'searchstr';
+ const TYPES_PARAM = 'types';
+
+ /**
+ * Object initialization
+ */
+ public function __construct()
+ {
+ // NOTE(chris): additional permission checks will be done in SearchBarLib
+ parent::__construct([
+ 'search' => self::PERM_LOGGED
+ ]);
+
+ // Load the library SearchBarLib
+ $this->load->library('SearchBarLib');
+ }
+
+ //------------------------------------------------------------------------------------------------------------------
+ // Public methods
+
+ /**
+ * Gets a JSON body via HTTP POST and provides the parameters
+ */
+ public function search()
+ {
+ $this->load->library('form_validation');
+
+ // Checks if the searchstr and the types parameters are in the POSTed JSON
+ $this->form_validation->set_rules(self::SEARCHSTR_PARAM, null, 'required');
+ $this->form_validation->set_rules(self::TYPES_PARAM . '[]', null, 'required');
+
+ if (!$this->form_validation->run())
+ $this->terminateWithError(SearchBarLib::ERROR_WRONG_JSON, self::ERROR_TYPE_GENERAL);
+
+ // Convert to json the result from searchbarlib->search
+ $result = $this->searchbarlib->search($this->input->post(self::SEARCHSTR_PARAM), $this->input->post(self::TYPES_PARAM));
+ if (property_exists($result, 'error'))
+ $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
+ $this->terminateWithSuccess($result);
+ }
+}
+
diff --git a/application/controllers/api/frontend/v1/studstatus/Abmeldung.php b/application/controllers/api/frontend/v1/studstatus/Abmeldung.php
new file mode 100644
index 000000000..875b6484c
--- /dev/null
+++ b/application/controllers/api/frontend/v1/studstatus/Abmeldung.php
@@ -0,0 +1,187 @@
+.
+ */
+
+if (! defined('BASEPATH')) exit('No direct script access allowed');
+
+use \REST_Controller as REST_Controller;
+use \Studierendenantrag_model as Studierendenantrag_model;
+
+/**
+ * This controller operates between (interface) the JS (GUI) and the AntragLib (back-end)
+ * This controller works with JSON calls on the HTTP GET or POST and the output is always JSON
+ */
+class Abmeldung extends FHCAPI_Controller
+{
+
+ /**
+ * Calls the parent's constructor and loads the AntragLib
+ */
+ public function __construct()
+ {
+ parent::__construct([
+ 'getDetailsForNewAntrag' => self::PERM_LOGGED,
+ 'getDetailsForAntrag' => self::PERM_LOGGED,
+ 'createAntrag' => self::PERM_LOGGED,
+ 'cancelAntrag' => self::PERM_LOGGED
+ ]);
+
+ // Libraries
+ $this->load->library('AntragLib');
+
+ // Load language phrases
+ $this->loadPhrases([
+ 'studierendenantrag'
+ ]);
+ }
+
+ //------------------------------------------------------------------------------------------------------------------
+ // Public methods
+
+ /**
+ * Retrieves data of the current studiengang for the current user
+ */
+
+ public function getDetailsForNewAntrag($prestudent_id)
+ {
+ if (!$this->antraglib->isEntitledToCreateAntragFor($prestudent_id, true))
+ $this->terminateWithError('Forbidden', self::ERROR_TYPE_AUTH, REST_Controller::HTTP_FORBIDDEN);
+
+ $result = $this->antraglib->getPrestudentAbmeldeBerechtigt($prestudent_id);
+ $result = $this->getDataOrTerminateWithError($result);
+
+ if (!$result) {
+ $this->terminateWithError(
+ $this->p->t('studierendenantrag', 'error_no_student'),
+ self::ERROR_TYPE_AUTH,
+ REST_Controller::HTTP_FORBIDDEN
+ );
+ } elseif ($result == -3) {
+ $this->terminateWithError(
+ $this->p->t('studierendenantrag', 'error_stg_blacklist'),
+ self::ERROR_TYPE_AUTH,
+ REST_Controller::HTTP_FORBIDDEN
+ );
+ } elseif ($result == -1) {
+ $result = $this->antraglib->getDetailsForLastAntrag(
+ $prestudent_id,
+ [
+ Studierendenantrag_model::TYP_ABMELDUNG,
+ Studierendenantrag_model::TYP_ABMELDUNG_STGL
+ ]
+ );
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $data->canCancel = (
+ $data->status == Studierendenantragstatus_model::STATUS_CREATED &&
+ $this->antraglib->isEntitledToCancelAntrag($data->studierendenantrag_id)
+ );
+
+ $this->terminateWithSuccess($data);
+ }
+
+ $result = $this->antraglib->getDetailsForNewAntrag($prestudent_id);
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess($data);
+ }
+
+ public function getDetailsForAntrag($studierendenantrag_id)
+ {
+ if (!$this->antraglib->isEntitledToShowAntrag($studierendenantrag_id))
+ return show_404();
+
+ $result = $this->antraglib->getDetailsForAntrag($studierendenantrag_id);
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ if ($data->typ !== Studierendenantrag_model::TYP_ABMELDUNG_STGL && $data->typ !== Studierendenantrag_model::TYP_ABMELDUNG)
+ return show_404();
+
+ $data->canCancel = (
+ $data->status == Studierendenantragstatus_model::STATUS_CREATED &&
+ $this->antraglib->isEntitledToCancelAntrag($data->studierendenantrag_id)
+ );
+
+ $this->terminateWithSuccess($data);
+ }
+
+ public function createAntrag()
+ {
+ $this->load->library('form_validation');
+
+ $this->form_validation->set_rules('studiensemester', 'Studiensemester', 'required');
+ $this->form_validation->set_rules('prestudent_id', 'Prestudent ID', 'required');
+ $this->form_validation->set_rules('grund', 'Grund', 'required');
+
+ if (!$this->form_validation->run())
+ $this->terminateWithValidationErrors($this->form_validation->error_array());
+
+ $grund = $this->input->post('grund');
+ $studiensemester = $this->input->post('studiensemester');
+ $prestudent_id = $this->input->post('prestudent_id');
+
+ $result = $this->antraglib->getPrestudentAbmeldeBerechtigt($prestudent_id);
+ $result = $this->getDataOrTerminateWithError($result);
+ if (!$result)
+ $this->terminateWithError($this->p->t('studierendenantrag', 'error_no_student'), self::ERROR_TYPE_GENERAL);
+ elseif ($result == -3)
+ $this->terminateWithError($this->p->t('studierendenantrag', 'error_stg_blacklist'), self::ERROR_TYPE_GENERAL);
+ elseif ($result < 0)
+ $this->terminateWithError($this->p->t('studierendenantrag', 'error_antrag_exists'), self::ERROR_TYPE_GENERAL);
+
+ $result = $this->antraglib->createAbmeldung($prestudent_id, $studiensemester, getAuthUID(), $grund);
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $result = $this->antraglib->getDetailsForAntrag($data);
+ if (!hasData($result))
+ return $this->terminateWithSuccess(true);
+
+ $data = getData($result);
+ $data->canCancel = (boolean)$this->antraglib->isEntitledToCancelAntrag($data->studierendenantrag_id);
+
+ $this->terminateWithSuccess($data);
+ }
+
+ public function cancelAntrag()
+ {
+ $this->load->library('form_validation');
+
+ $this->form_validation->set_rules('antrag_id', 'Antrag ID', 'required');
+
+ if (!$this->form_validation->run())
+ $this->terminateWithValidationErrors($this->form_validation->error_array());
+
+ $antrag_id = $this->input->post('antrag_id');
+
+ if (!$this->antraglib->isEntitledToCancelAntrag($antrag_id))
+ $this->terminateWithError('Forbidden', self::ERROR_TYPE_AUTH, REST_Controller::HTTP_FORBIDDEN);
+
+ $result = $this->antraglib->cancelAntrag($antrag_id, getAuthUID());
+ $this->getDataOrTerminateWithError($result);
+
+ $result = $this->antraglib->getDetailsForAntrag($antrag_id);
+ if (!hasData($result))
+ $this->terminateWithSuccess($antrag_id);
+
+ $data = getData($result);
+
+ $this->terminateWithSuccess($data);
+ }
+}
diff --git a/application/controllers/api/frontend/v1/studstatus/Leitung.php b/application/controllers/api/frontend/v1/studstatus/Leitung.php
new file mode 100644
index 000000000..2699a3dbb
--- /dev/null
+++ b/application/controllers/api/frontend/v1/studstatus/Leitung.php
@@ -0,0 +1,428 @@
+.
+ */
+
+if (! defined('BASEPATH')) exit('No direct script access allowed');
+
+use \stdClass as stdClass;
+use \Studierendenantrag_model as Studierendenantrag_model;
+
+/**
+ * This controller operates between (interface) the JS (GUI) and the AntragLib (back-end)
+ * This controller works with JSON calls on the HTTP GET or POST and the output is always JSON
+ */
+class Leitung extends FHCAPI_Controller
+{
+
+ /**
+ * Calls the parent's constructor and loads the AntragLib
+ */
+ public function __construct()
+ {
+ parent::__construct([
+ 'getActiveStgs' => ['student/antragfreigabe:r', 'student/studierendenantrag:r'],
+ 'getAntraege' => ['student/antragfreigabe:r', 'student/studierendenantrag:r'],
+ 'getHistory' => ['student/antragfreigabe:r', 'student/studierendenantrag:r'],
+ 'getPrestudents' => 'student/studierendenantrag:w',
+ 'approveAntrag' => 'student/antragfreigabe:w',
+ 'rejectAntrag' => 'student/antragfreigabe:w',
+ 'reopenAntrag' => 'student/studierendenantrag:w',
+ 'pauseAntrag' => ['student/antragfreigabe:w', 'student/studierendenantrag:w'],
+ 'unpauseAntrag' => ['student/antragfreigabe:w', 'student/studierendenantrag:w'],
+ 'objectAntrag' => ['student/antragfreigabe:w', 'student/studierendenantrag:w'],
+ 'approveObjection' => ['student/antragfreigabe:w', 'student/studierendenantrag:w'],
+ 'denyObjection' => ['student/antragfreigabe:w', 'student/studierendenantrag:w']
+ ]);
+
+ // Libraries
+ $this->load->library('AntragLib');
+
+ // Load language phrases
+ $this->loadPhrases([
+ 'studierendenantrag'
+ ]);
+ }
+
+ //------------------------------------------------------------------------------------------------------------------
+ // Public methods
+
+ public function getActiveStgs()
+ {
+ $studiengaenge = $this->permissionlib->getSTG_isEntitledFor('student/antragfreigabe') ?: [];
+ $studiengaenge = array_merge($studiengaenge, $this->permissionlib->getSTG_isEntitledFor('student/studierendenantrag') ?: []);
+
+ $result = $this->StudierendenantragModel->loadStgsWithAntraege($studiengaenge);
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess($data);
+ }
+
+ public function getAntraege($studiengang = null, $extra = null)
+ {
+ if ($studiengang && $studiengang == 'todo') {
+ $studiengang = $extra;
+ $extra = true;
+ } else {
+ $extra = false;
+ }
+
+ $studiengaenge = $this->permissionlib->getSTG_isEntitledFor('student/antragfreigabe');
+ if(!is_array($studiengaenge))
+ $studiengaenge = [];
+
+
+ $stgsNeuanlage = $this->permissionlib->getSTG_isEntitledFor('student/studierendenantrag');
+ if(!is_array($stgsNeuanlage))
+ $stgsNeuanlage = [];
+
+ $studiengaenge = array_unique(array_merge($studiengaenge, $stgsNeuanlage));
+
+ if ($studiengang) {
+ if (!in_array($studiengang, $studiengaenge))
+ $this->terminateWithError(
+ 'Forbidden',
+ self::ERROR_TYPE_AUTH,
+ REST_Controller::HTTP_FORBIDDEN
+ );
+ $studiengaenge = [$studiengang];
+ }
+
+ $antraege = [];
+ if ($studiengaenge) {
+ $result = $extra
+ ? $this->StudierendenantragModel->loadActiveForStudiengaenge($studiengaenge)
+ : $this->StudierendenantragModel->loadForStudiengaenge($studiengaenge);
+
+ $antraege = $this->getDataOrTerminateWithError($result);
+ }
+
+ $this->terminateWithSuccess($antraege ?: []);
+ }
+
+ public function getHistory($studierendenantrag_id)
+ {
+ if (!$this->antraglib->isEntitledToSeeHistoryForAntrag($studierendenantrag_id))
+ $this->terminateWithError(
+ 'Forbidden',
+ self::ERROR_TYPE_AUTH,
+ REST_Controller::HTTP_FORBIDDEN
+ );
+
+ $result = $this->antraglib->getAntragHistory($studierendenantrag_id);
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess($data ?: []);
+ }
+
+ public function getPrestudents()
+ {
+ $query = $this->input->post('query');
+
+ $studiengaenge = $this->permissionlib->getSTG_isEntitledFor('student/studierendenantrag');
+
+ $result = $this->antraglib->getAktivePrestudentenInStgs($studiengaenge, $query);
+ $result = $this->getDataOrTerminateWithError($result);
+
+ return $this->terminateWithSuccess($result ?: []);
+ }
+
+ public function approveAntrag()
+ {
+ $this->load->library('form_validation');
+
+ $this->form_validation->set_rules(
+ 'studierendenantrag_id',
+ 'Studierenden Antrag',
+ [
+ 'required',
+ ['isEntitledToApproveAntrag', [$this->antraglib, 'isEntitledToApproveAntrag']],
+ ],
+ [
+ 'isEntitledToApproveAntrag' => $this->p->t('studierendenantrag', 'error_no_right')
+ ]
+ );
+ $this->form_validation->set_rules(
+ 'typ',
+ 'Typ',
+ 'required|in_list[' . implode(',', [
+ Studierendenantrag_model::TYP_ABMELDUNG,
+ Studierendenantrag_model::TYP_ABMELDUNG_STGL,
+ Studierendenantrag_model::TYP_UNTERBRECHUNG,
+ Studierendenantrag_model::TYP_WIEDERHOLUNG
+ ]) . ']'
+ );
+
+ if (!$this->form_validation->run())
+ $this->terminateWithValidationErrors($this->form_validation->error_array());
+
+ $studierendenantrag_id = $this->input->post('studierendenantrag_id');
+ switch ($this->input->post('typ')) {
+ case Studierendenantrag_model::TYP_ABMELDUNG:
+ case Studierendenantrag_model::TYP_ABMELDUNG_STGL:
+ $result = $this->antraglib->approveAbmeldung([$studierendenantrag_id], getAuthUID());
+ break;
+ case Studierendenantrag_model::TYP_UNTERBRECHUNG:
+ $result = $this->antraglib->approveUnterbrechung([$studierendenantrag_id], getAuthUID());
+ break;
+ case Studierendenantrag_model::TYP_WIEDERHOLUNG:
+ $result = $this->antraglib->approveWiederholung($studierendenantrag_id, getAuthUID());
+ break;
+ }
+ $this->getDataOrTerminateWithError($result);
+
+ return $this->terminateWithSuccess($studierendenantrag_id);
+ }
+
+ public function rejectAntrag()
+ {
+ $this->load->library('form_validation');
+
+ $this->form_validation->set_rules(
+ 'studierendenantrag_id',
+ 'Studierenden Antrag',
+ [
+ 'required',
+ ['isEntitledToRejectAntrag', [$this->antraglib, 'isEntitledToRejectAntrag']],
+ ],
+ [
+ 'isEntitledToRejectAntrag' => $this->p->t('studierendenantrag', 'error_no_right')
+ ]
+ );
+ $this->form_validation->set_rules('grund', 'Grund', 'required');
+ $this->form_validation->set_rules(
+ 'typ',
+ 'Typ',
+ 'required|in_list[' . implode(',', [
+ Studierendenantrag_model::TYP_UNTERBRECHUNG
+ ]) . ']'
+ );
+
+ if (!$this->form_validation->run())
+ $this->terminateWithValidationErrors($this->form_validation->error_array());
+
+ $studierendenantrag_id = $this->input->post('studierendenantrag_id');
+ $grund = $this->input->post('grund');
+
+ $result = $this->antraglib->rejectUnterbrechung([$studierendenantrag_id], getAuthUID(), $grund);
+ $this->getDataOrTerminateWithError($result);
+
+ return $this->terminateWithSuccess($studierendenantrag_id);
+ }
+
+ public function reopenAntrag()
+ {
+ $this->load->library('form_validation');
+
+ $this->form_validation->set_rules(
+ 'studierendenantrag_id',
+ 'Studierenden Antrag',
+ [
+ 'required',
+ ['isEntitledToReopenAntrag', [$this->antraglib, 'isEntitledToReopenAntrag']],
+ ],
+ [
+ 'isEntitledToReopenAntrag' => $this->p->t('studierendenantrag', 'error_no_right')
+ ]
+ );
+ $this->form_validation->set_rules(
+ 'typ',
+ 'Typ',
+ 'required|in_list[' . implode(',', [
+ Studierendenantrag_model::TYP_WIEDERHOLUNG
+ ]) . ']'
+ );
+
+ if (!$this->form_validation->run())
+ $this->terminateWithValidationErrors($this->form_validation->error_array());
+
+ $studierendenantrag_id = $this->input->post('studierendenantrag_id');
+
+ $result = $this->antraglib->reopenWiederholung($studierendenantrag_id, getAuthUID());
+ $this->getDataOrTerminateWithError($result);
+
+ return $this->terminateWithSuccess($studierendenantrag_id);
+ }
+
+ public function pauseAntrag()
+ {
+ $this->load->library('form_validation');
+
+ $this->form_validation->set_rules(
+ 'studierendenantrag_id',
+ 'Studierenden Antrag',
+ [
+ 'required',
+ ['isEntitledToPauseAntrag', [$this->antraglib, 'isEntitledToPauseAntrag']],
+ ['antragCanBeManualPaused', [$this->antraglib, 'antragCanBeManualPaused']]
+ ],
+ [
+ 'isEntitledToPauseAntrag' => $this->p->t('studierendenantrag', 'error_no_right'),
+ 'antragCanBeManualPaused' => $this->p->t(
+ 'studierendenantrag',
+ 'error_not_pauseable',
+ ['id' => $this->input->post('studierendenantrag_id')]
+ )
+ ]
+ );
+
+ if (!$this->form_validation->run())
+ $this->terminateWithValidationErrors($this->form_validation->error_array());
+
+ $studierendenantrag_id = $this->input->post('studierendenantrag_id');
+
+ $result = $this->antraglib->pauseAntrag($studierendenantrag_id, getAuthUID());
+ $this->getDataOrTerminateWithError($result);
+
+ return $this->terminateWithSuccess($studierendenantrag_id);
+ }
+
+ public function unpauseAntrag()
+ {
+ $this->load->library('form_validation');
+
+ $this->form_validation->set_rules(
+ 'studierendenantrag_id',
+ 'Studierenden Antrag',
+ [
+ 'required',
+ ['isEntitledToUnpauseAntrag', [$this->antraglib, 'isEntitledToUnpauseAntrag']],
+ ['antragCanBeManualUnpaused', [$this->antraglib, 'antragCanBeManualUnpaused']]
+ ],
+ [
+ 'isEntitledToUnpauseAntrag' => $this->p->t('studierendenantrag', 'error_no_right'),
+ 'antragCanBeManualUnpaused' => $this->p->t(
+ 'studierendenantrag',
+ 'error_not_paused',
+ ['id' => $this->input->post('studierendenantrag_id')]
+ )
+ ]
+ );
+
+ if (!$this->form_validation->run())
+ $this->terminateWithValidationErrors($this->form_validation->error_array());
+
+ $studierendenantrag_id = $this->input->post('studierendenantrag_id');
+
+ $result = $this->antraglib->unpauseAntrag($studierendenantrag_id, getAuthUID());
+ $this->getDataOrTerminateWithError($result);
+
+ return $this->terminateWithSuccess($studierendenantrag_id);
+ }
+
+ public function objectAntrag()
+ {
+ $this->load->library('form_validation');
+
+ $this->form_validation->set_rules(
+ 'studierendenantrag_id',
+ 'Studierenden Antrag',
+ [
+ 'required',
+ ['isEntitledToObjectAntrag', [$this->antraglib, 'isEntitledToObjectAntrag']],
+ ['canBeObjected', function ($a) {
+ return $this->antraglib->hasType($a, Studierendenantrag_model::TYP_ABMELDUNG_STGL);
+ }]
+ ],
+ [
+ 'isEntitledToObjectAntrag' => $this->p->t('studierendenantrag', 'error_no_right'),
+ 'canBeObjected' => $this->p->t(
+ 'studierendenantrag',
+ 'error_no_objection'
+ )
+ ]
+ );
+
+ if (!$this->form_validation->run())
+ $this->terminateWithValidationErrors($this->form_validation->error_array());
+
+ $studierendenantrag_id = $this->input->post('studierendenantrag_id');
+
+ $result = $this->antraglib->objectAbmeldung($studierendenantrag_id, getAuthUID());
+ $this->getDataOrTerminateWithError($result);
+
+ return $this->terminateWithSuccess($studierendenantrag_id);
+ }
+
+ public function approveObjection()
+ {
+ $this->load->library('form_validation');
+
+ $this->form_validation->set_rules(
+ 'studierendenantrag_id',
+ 'Studierenden Antrag',
+ [
+ 'required',
+ ['isEntitledToObjectAntrag', [$this->antraglib, 'isEntitledToObjectAntrag']],
+ ['isObjected', function ($a) {
+ return $this->antraglib->hasStatus($a, Studierendenantragstatus_model::STATUS_OBJECTED);
+ }]
+ ],
+ [
+ 'isEntitledToObjectAntrag' => $this->p->t('studierendenantrag', 'error_no_right'),
+ 'isObjected' => $this->p->t(
+ 'studierendenantrag',
+ 'error_not_objected'
+ )
+ ]
+ );
+
+ if (!$this->form_validation->run())
+ $this->terminateWithValidationErrors($this->form_validation->error_array());
+
+ $studierendenantrag_id = $this->input->post('studierendenantrag_id');
+
+ $result = $this->antraglib->cancelAntrag($studierendenantrag_id, getAuthUID());
+ $this->getDataOrTerminateWithError($result);
+
+ return $this->terminateWithSuccess($studierendenantrag_id);
+ }
+
+ public function denyObjection()
+ {
+ $this->load->library('form_validation');
+
+ $this->form_validation->set_rules(
+ 'studierendenantrag_id',
+ 'Studierenden Antrag',
+ [
+ 'required',
+ ['isEntitledToObjectAntrag', [$this->antraglib, 'isEntitledToObjectAntrag']],
+ ['isObjected', function ($a) {
+ return $this->antraglib->hasStatus($a, Studierendenantragstatus_model::STATUS_OBJECTED);
+ }]
+ ],
+ [
+ 'isEntitledToObjectAntrag' => $this->p->t('studierendenantrag', 'error_no_right'),
+ 'isObjected' => $this->p->t(
+ 'studierendenantrag',
+ 'error_not_objected'
+ )
+ ]
+ );
+
+ if (!$this->form_validation->run())
+ $this->terminateWithValidationErrors($this->form_validation->error_array());
+
+ $studierendenantrag_id = $this->input->post('studierendenantrag_id');
+ $grund = $this->input->post('grund');
+
+ $result = $this->antraglib->denyObjectionAbmeldung($studierendenantrag_id, getAuthUID(), $grund);
+ $this->getDataOrTerminateWithError($result);
+
+ return $this->terminateWithSuccess($studierendenantrag_id);
+ }
+}
diff --git a/application/controllers/components/Antrag/Unterbrechung.php b/application/controllers/api/frontend/v1/studstatus/Unterbrechung.php
similarity index 51%
rename from application/controllers/components/Antrag/Unterbrechung.php
rename to application/controllers/api/frontend/v1/studstatus/Unterbrechung.php
index 33bd0035d..abf58cf4f 100755
--- a/application/controllers/components/Antrag/Unterbrechung.php
+++ b/application/controllers/api/frontend/v1/studstatus/Unterbrechung.php
@@ -1,4 +1,20 @@
.
+ */
if (! defined('BASEPATH')) exit('No direct script access allowed');
@@ -6,23 +22,28 @@ use \Studierendenantrag_model as Studierendenantrag_model;
use \DateTime as DateTime;
/**
- *
+ * This controller operates between (interface) the JS (GUI) and the AntragLib (back-end)
+ * This controller works with JSON calls on the HTTP GET or POST and the output is always JSON
*/
-class Unterbrechung extends FHC_Controller
+class Unterbrechung extends FHCAPI_Controller
{
/**
- * Calls the parent's constructor and loads the FilterCmptLib
+ * Calls the parent's constructor and loads the AntragLib
*/
public function __construct()
{
- parent::__construct();
+ parent::__construct([
+ 'getDetailsForNewAntrag' => self::PERM_LOGGED,
+ 'getDetailsForAntrag' => self::PERM_LOGGED,
+ 'createAntrag' => self::PERM_LOGGED,
+ 'cancelAntrag' => self::PERM_LOGGED
+ ]);
// Configs
$this->load->config('studierendenantrag');
// Libraries
- $this->load->library('AuthLib');
$this->load->library('AntragLib');
// Load language phrases
@@ -38,74 +59,62 @@ class Unterbrechung extends FHC_Controller
public function getDetailsForNewAntrag($prestudent_id)
{
- if (!$this->antraglib->isEntitledToCreateAntragFor($prestudent_id, false)) {
- $this->output->set_status_header(403);
- return $this->outputJsonError('Forbidden');
- }
+ if (!$this->antraglib->isEntitledToCreateAntragFor($prestudent_id, false))
+ $this->terminateWithError('Forbidden', self::ERROR_TYPE_AUTH, REST_Controller::HTTP_FORBIDDEN);
+
$result = $this->antraglib->getPrestudentUnterbrechungsBerechtigt($prestudent_id);
- if (isError($result)) {
- $this->output->set_status_header(500);
- return $this->outputJsonError(getError($result));
- }
- $result = $result->retval;
+ $result = $this->getDataOrTerminateWithError($result);
+
if (!$result) {
- $this->output->set_status_header(403);
- return $this->outputJsonError($this->p->t('studierendenantrag', 'error_no_student'));
- }
- elseif ($result == -1)
- {
+ $this->terminateWithError(
+ $this->p->t('studierendenantrag', 'error_no_student'),
+ self::ERROR_TYPE_AUTH,
+ REST_Controller::HTTP_FORBIDDEN
+ );
+ } elseif ($result == -1) {
$result = $this->antraglib->getDetailsForLastAntrag($prestudent_id, Studierendenantrag_model::TYP_UNTERBRECHUNG);
- if (isError($result)) {
- return $this->outputJsonError(getError($result));
- }
+
+ $data = $this->getDataOrTerminateWithError($result);
- return $this->outputJsonSuccess(getData($result));
- }
- elseif ($result == -2)
- {
+ return $this->terminateWithSuccess($data);
+ } elseif ($result == -2) {
$result = $this->antraglib->getDetailsForLastAntrag($prestudent_id);
- if (isError($result)) {
- return $this->outputJsonError(getError($result));
- }
- $result = getData($result);
- $this->output->set_status_header(400);
- return $this->outputJsonError($this->p->t('studierendenantrag', 'error_antrag_pending', [
+ $data = $this->getDataOrTerminateWithError($result);
+
+ return $this->terminateWithError($this->p->t('studierendenantrag', 'error_antrag_pending', [
'typ' => $this->p->t('studierendenantrag', 'antrag_typ_' . $result->typ)
]));
+ } elseif ($result == -3) {
+ $this->terminateWithError(
+ $this->p->t('studierendenantrag', 'error_stg_blacklist'),
+ self::ERROR_TYPE_AUTH,
+ REST_Controller::HTTP_FORBIDDEN
+ );
}
- elseif ($result == -3)
- {
- $this->output->set_status_header(403);
- return $this->outputJsonError($this->p->t('studierendenantrag', 'error_stg_blacklist'));
- }
+
$result = $this->antraglib->getDetailsForNewAntrag($prestudent_id);
- if (isError($result)) {
- return $this->outputJsonError(getError($result));
- }
- $data = getData($result);
+ $data = $this->getDataOrTerminateWithError($result);
- $data->studiensemester = $this->antraglib->getSemesterForUnterbrechung($data->studiensemester_kurzbz);
+ $data->studiensemester = $this->antraglib->getSemesterForUnterbrechung($prestudent_id, null);
- $this->outputJsonSuccess($data);
+ $this->terminateWithSuccess($data);
}
public function getDetailsForAntrag($studierendenantrag_id)
{
- if (!$this->antraglib->isEntitledToShowAntrag($studierendenantrag_id)) return show_404();
+ if (!$this->antraglib->isEntitledToShowAntrag($studierendenantrag_id))
+ return show_404();
$result = $this->antraglib->getDetailsForAntrag($studierendenantrag_id);
- if (isError($result)) {
- return $this->outputJsonError(getError($result));
- }
- $data = getData($result);
+ $data = $this->getDataOrTerminateWithError($result);
if ($data->typ !== Studierendenantrag_model::TYP_UNTERBRECHUNG)
return show_404();
- $this->outputJsonSuccess($data);
+ $this->terminateWithSuccess($data);
}
public function createAntrag()
@@ -125,9 +134,8 @@ class Unterbrechung extends FHC_Controller
]
);
- if ($this->form_validation->run() == false)
- {
- return $this->outputJsonError($this->form_validation->error_array());
+ if (!$this->form_validation->run()) {
+ $this->terminateWithValidationErrors($this->form_validation->error_array());
}
$grund = $this->input->post('grund');
@@ -136,26 +144,18 @@ class Unterbrechung extends FHC_Controller
$datum_wiedereinstieg = $this->input->post('datum_wiedereinstieg');
$dms_id = null;
- $result = $this->antraglib->getPrestudentUnterbrechungsBerechtigt($prestudent_id);
- if (isError($result)) {
- return $this->outputJsonError(['db' => getError($result)]);
- }
- $result = $result->retval;
- if (!$result)
- {
- return $this->outputJsonError(['db' => $this->p->t('studierendenantrag', 'error_no_student')]);
- }
- elseif ($result == -3)
- {
- return $this->outputJsonError(['db' => $this->p->t('studierendenantrag', 'error_stg_blacklist')]);
- }
- elseif ($result < 0)
- {
- return $this->outputJsonError(['db' => $this->p->t('studierendenantrag', 'error_antrag_exists')]);
- }
+ $result = $this->antraglib->getPrestudentUnterbrechungsBerechtigt($prestudent_id, $studiensemester, $datum_wiedereinstieg);
- if(isset($_FILES['attachment']) && (!isset($_FILES['attachment']['error']) || $_FILES['attachment']['error'] != UPLOAD_ERR_NO_FILE))
- {
+ $result = $this->getDataOrTerminateWithError($result);
+
+ if (!$result)
+ $this->terminateWithError($this->p->t('studierendenantrag', 'error_no_student'), self::ERROR_TYPE_GENERAL);
+ elseif ($result == -3)
+ $this->terminateWithError($this->p->t('studierendenantrag', 'error_stg_blacklist'), self::ERROR_TYPE_GENERAL);
+ elseif ($result < 0)
+ $this->terminateWithError($this->p->t('studierendenantrag', 'error_antrag_exists'), self::ERROR_TYPE_GENERAL);
+
+ if (isset($_FILES['attachment']) && (!isset($_FILES['attachment']['error']) || $_FILES['attachment']['error'] != UPLOAD_ERR_NO_FILE)) {
$this->load->library('DmsLib');
$dms = $this->config->item('unterbrechung_dms');
@@ -167,53 +167,46 @@ class Unterbrechung extends FHC_Controller
$allowed_filetypes = $this->config->item('unterbrechung_dms_filetypes') ?: ['*'];
$result = $this->dmslib->upload($dms, 'attachment', $allowed_filetypes);
- if(isError($result))
- {
- return $this->outputJsonError(['db' => getError($result)]);
- }
- $dms_id = getData($result)['dms_id'];
+
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $dms_id = $data['dms_id'];
}
$result = $this->antraglib->createUnterbrechung($prestudent_id, $studiensemester, getAuthUID(), $grund, $datum_wiedereinstieg, $dms_id);
- if(isError($result))
- {
- return $this->outputJsonError(['db' => getError($result)]);
- }
- $antragId = getData($result);
+ $antragId = $this->getDataOrTerminateWithError($result);
+
$result = $this->antraglib->getDetailsForAntrag($antragId);
- if(!hasData($result))
- return $this->outputJsonSuccess($antragId);
- $this->outputJsonSuccess(getData($result));
+ if (!hasData($result))
+ $this->terminateWithSuccess($antragId);
+
+ $this->terminateWithSuccess(getData($result));
}
public function cancelAntrag()
{
$this->load->library('form_validation');
- $_POST = json_decode($this->input->raw_input_stream, true);
-
$this->form_validation->set_rules('antrag_id', 'Antrag ID', 'required');
- if ($this->form_validation->run() == false)
- {
- return $this->outputJsonError($this->form_validation->error_array());
+ if (!$this->form_validation->run()) {
+ $this->terminateWithValidationErrors($this->form_validation->error_array());
}
$antrag_id = $this->input->post('antrag_id');
$result = $this->antraglib->cancelAntrag($antrag_id, getAuthUID());
- if (isError($result))
- {
- return $this->outputJsonError(['db' => getError($result)]);
- }
+
+ $this->getDataOrTerminateWithError($result);
$result = $this->antraglib->getDetailsForAntrag($antrag_id);
if (!hasData($result))
- return $this->outputJsonSuccess($antrag_id);
- $this->outputJsonSuccess(getData($result));
+ return $this->terminateWithSuccess($antrag_id);
+
+ $this->terminateWithSuccess(getData($result));
}
public function isValidDate($date)
diff --git a/application/controllers/api/frontend/v1/studstatus/Wiederholung.php b/application/controllers/api/frontend/v1/studstatus/Wiederholung.php
new file mode 100644
index 000000000..1a8f70d52
--- /dev/null
+++ b/application/controllers/api/frontend/v1/studstatus/Wiederholung.php
@@ -0,0 +1,258 @@
+.
+ */
+
+if (! defined('BASEPATH')) exit('No direct script access allowed');
+
+use \REST_Controller as REST_Controller;
+use \Studierendenantragstatus_model as Studierendenantragstatus_model;
+
+/**
+ * This controller operates between (interface) the JS (GUI) and the AntragLib (back-end)
+ * This controller works with JSON calls on the HTTP GET or POST and the output is always JSON
+ */
+class Wiederholung extends FHCAPI_Controller
+{
+
+ /**
+ * Calls the parent's constructor and loads the FilterCmptLib
+ */
+ public function __construct()
+ {
+ parent::__construct([
+ 'getDetailsForNewAntrag' => self::PERM_LOGGED,
+ 'createAntrag' => self::PERM_LOGGED,
+ 'cancelAntrag' => self::PERM_LOGGED,
+ 'getLvs' => self::PERM_LOGGED,
+ 'saveLvs' => ['student/studierendenantrag:w']
+ ]);
+
+ // Libraries
+ $this->load->library('AntragLib');
+
+ // Load language phrases
+ $this->loadPhrases([
+ 'global',
+ 'studierendenantrag'
+ ]);
+ }
+
+ //------------------------------------------------------------------------------------------------------------------
+ // Public methods
+
+ /**
+ * Retrieves data of the current studiengang for the current user
+ */
+
+ public function getDetailsForNewAntrag($prestudent_id)
+ {
+ if (!$this->antraglib->isEntitledToCreateAntragFor($prestudent_id, false))
+ $this->terminateWithError('Forbidden', self::ERROR_TYPE_AUTH, REST_Controller::HTTP_FORBIDDEN);
+
+ $result = $this->antraglib->getPrestudentWiederholungsBerechtigt($prestudent_id);
+ $result = $this->getDataOrTerminateWithError($result);
+
+ if (!$result) {
+ $this->terminateWithError(
+ $this->p->t('studierendenantrag', 'error_no_student_no_failed_exam'),
+ self::ERROR_TYPE_AUTH,
+ REST_Controller::HTTP_FORBIDDEN
+ );
+ } elseif ($result == -1) {
+ $result = $this->antraglib->getDetailsForLastAntrag($prestudent_id, Studierendenantrag_model::TYP_WIEDERHOLUNG);
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $result = $this->antraglib->getFailedExamForPrestudent($prestudent_id, $data->datum, $data->studiensemester_kurzbz);
+ // NOTE(chris): error handling for this function should already happenden in antraglib->getPrestudentWiederholungsBerechtigt()
+ $pruefungsdata = current(getData($result));
+
+ $data->studiensemester_kurzbz = $pruefungsdata->studiensemester_kurzbz;
+ $data->lvbezeichnung = $pruefungsdata->lvbezeichnung;
+ $data->pruefungsdatum = $pruefungsdata->datum;
+
+ $this->terminateWithSuccess($data);
+ } elseif ($result == -2) {
+ $result = $this->antraglib->getDetailsForLastAntrag($prestudent_id);
+ $result = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithError(
+ $this->p->t('studierendenantrag', 'error_antrag_pending', [
+ 'typ' => $this->p->t('studierendenantrag', 'antrag_typ_' . $result->typ)
+ ]),
+ self::ERROR_TYPE_GENERAL,
+ REST_Controller::HTTP_BAD_REQUEST
+ );
+ } elseif ($result == -3) {
+ $this->terminateWithError(
+ $this->p->t('studierendenantrag', 'error_stg_blacklist'),
+ self::ERROR_TYPE_GENERAL,
+ REST_Controller::HTTP_BAD_REQUEST
+ );
+ }
+
+ $result = $this->antraglib->getDetailsForNewAntrag($prestudent_id);
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $result = $this->antraglib->getFailedExamForPrestudent($prestudent_id);
+ // NOTE(chris): error handling for this function should already happenden in antraglib->getPrestudentWiederholungsBerechtigt()
+ $pruefungsdata = current(getData($result));
+
+ $data->studiensemester_kurzbz = $pruefungsdata->studiensemester_kurzbz;
+ $data->lvbezeichnung = $pruefungsdata->lvbezeichnung;
+ $data->pruefungsdatum = $pruefungsdata->datum;
+
+ $this->terminateWithSuccess($data);
+ }
+
+ public function createAntrag()
+ {
+ $this->createAntragWithStatus(true);
+ }
+
+ public function cancelAntrag()
+ {
+ $this->createAntragWithStatus(false);
+ }
+
+ protected function createAntragWithStatus($repeat)
+ {
+ $this->load->library('form_validation');
+
+ $this->form_validation->set_rules('prestudent_id', 'Prestudent ID', 'required');
+ $this->form_validation->set_rules('studiensemester', 'Studiensemester', 'required');
+
+ if (!$this->form_validation->run())
+ $this->terminateWithValidationErrors($this->form_validation->error_array());
+
+ $prestudent_id = $this->input->post('prestudent_id');
+ $studiensemester = $this->input->post('studiensemester');
+
+ $result = $this->antraglib->getPrestudentWiederholungsBerechtigt($prestudent_id);
+ $result = $this->getDataOrTerminateWithError($result);
+
+ if (!$result) {
+ $this->terminateWithError($this->p->t('studierendenantrag', 'error_no_student'), self::ERROR_TYPE_GENERAL);
+ } elseif ($result == -1) {
+ $result = $this->PrestudentstatusModel->getLastStatus($prestudent_id);
+ $result = $this->getDataOrTerminateWithError($result);
+ if (!$result)
+ $this->terminateWithError($this->p->t('studierendenantrag', 'error_no_prestudentstatus', [
+ 'prestudent_id' => $prestudent_id
+ ]), self::ERROR_TYPE_GENERAL);
+ if (!in_array(current($result)->status_kurzbz, $this->config->item('antrag_prestudentstatus_whitelist')))
+ $this->terminateWithError($this->p->t('studierendenantrag', 'error_no_student'), self::ERROR_TYPE_GENERAL);
+ } elseif ($result == -2) {
+ $this->terminateWithError($this->p->t('studierendenantrag', 'error_antrag_exists'), self::ERROR_TYPE_GENERAL);
+ } elseif ($result == -3) {
+ $this->terminateWithError($this->p->t('studierendenantrag', 'error_stg_blacklist'), self::ERROR_TYPE_GENERAL);
+ }
+
+ $result = $this->antraglib->createWiederholung($prestudent_id, $studiensemester, getAuthUID(), $repeat);
+ $antragId = $this->getDataOrTerminateWithError($result);
+
+ $result = $this->antraglib->getDetailsForAntrag($antragId);
+
+ if (!hasData($result))
+ $this->terminateWithSuccess(true);
+
+ $data = getData($result);
+
+ $result = $this->antraglib->getFailedExamForPrestudent($prestudent_id);
+ // NOTE(chris): error handling for this function should already happenden in antraglib->getPrestudentWiederholungsBerechtigt()
+ $pruefungsdata = current(getData($result));
+
+ $data->studiensemester_kurzbz = $pruefungsdata->studiensemester_kurzbz;
+ $data->lvbezeichnung = $pruefungsdata->lvbezeichnung;
+ $data->pruefungsdatum = $pruefungsdata->datum;
+
+ $this->terminateWithSuccess($data);
+ }
+
+
+ public function getLvs($antrag_id)
+ {
+ $result = $this->antraglib->getLvsForAntrag($antrag_id);
+ if (isError($result)) {
+ $error = getError($result);
+ if ($error == 'Forbidden')
+ $this->terminateWithError(
+ $error,
+ self::ERROR_TYPE_AUTH,
+ REST_Controller::HTTP_FORBIDDEN
+ );
+ $this->terminateWithError(
+ $error,
+ self::ERROR_TYPE_GENERAL
+ );
+ }
+ $lvs = getData($result);
+
+ $this->terminateWithSuccess($lvs);
+ }
+
+ public function saveLvs()
+ {
+ $forbiddenLvs = $this->input->post('forbiddenLvs');
+ $mandatoryLvs = $this->input->post('mandatoryLvs');
+ $antragsLvs = array_merge($forbiddenLvs, $mandatoryLvs);
+
+ if (!$antragsLvs)
+ $this->terminateWithError($this->p->t('studierendenantrag', 'error_no_lv'), self::ERROR_TYPE_GENERAL);
+
+ $insert = array_map(function ($lv) {
+ return [
+ 'studierendenantrag_id' => $lv['studierendenantrag_id'],
+ 'lehrveranstaltung_id' => $lv['lehrveranstaltung_id'],
+ 'note' => $lv['zugelassen']
+ ? ($lv['zugelassen'] == 1 ? 0 : $this->config->item('wiederholung_note_angerechnet'))
+ : $this->config->item('wiederholung_note_nicht_zugelassen'),
+ 'anmerkung' => $lv['anmerkung'],
+ 'insertvon' => getAuthUID(),
+ 'studiensemester_kurzbz' => $lv['studiensemester_kurzbz']
+ ];
+ }, $antragsLvs);
+
+ $antrag_ids = array_unique(array_map(function ($lv) {
+ return $lv['studierendenantrag_id'];
+ }, $insert));
+
+ foreach ($antrag_ids as $antrag_id) {
+ $result = $this->StudierendenantragModel->loadIdAndStatusWhere([
+ 'studierendenantrag_id' => $antrag_id
+ ]);
+ $antrag = $this->getDataOrTerminateWithError($result);
+ if (!$antrag)
+ $this->terminateWithError(
+ $this->p->t('studierendenantrag', 'error_no_antrag_found', ['id' => $antrag_id]),
+ self::ERROR_TYPE_GENERAL
+ );
+ $antrag = current($antrag);
+
+ if ($antrag->status != Studierendenantragstatus_model::STATUS_CREATED
+ && $antrag->status != Studierendenantragstatus_model::STATUS_LVSASSIGNED)
+ $this->terminateWithError(
+ $this->p->t('studierendenantrag', 'error_antrag_locked'),
+ self::ERROR_TYPE_GENERAL
+ );
+ }
+
+ $result = $this->antraglib->saveLvs($insert);
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess($data);
+ }
+}
diff --git a/application/controllers/components/Filter.php b/application/controllers/components/Filter.php
index bde7d7ed7..617edd69f 100755
--- a/application/controllers/components/Filter.php
+++ b/application/controllers/components/Filter.php
@@ -9,6 +9,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed');
* This controller works with JSON calls on the HTTP GET or POST and the output is always JSON
* NOTE: extends the FHC_Controller instead of the Auth_Controller because the FilterCmpt has its
* own permissions check
+ * TODO(chris): deprecated
*/
class Filter extends FHC_Controller
{
diff --git a/application/controllers/components/Phrasen.php b/application/controllers/components/Phrasen.php
index 87516ce00..3ac35a652 100755
--- a/application/controllers/components/Phrasen.php
+++ b/application/controllers/components/Phrasen.php
@@ -3,7 +3,7 @@
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
- *
+ * TODO(chris): deprecated
*/
class Phrasen extends FHC_Controller
{
diff --git a/application/controllers/components/SearchBar.php b/application/controllers/components/SearchBar.php
index d19113177..eac1a4cbc 100755
--- a/application/controllers/components/SearchBar.php
+++ b/application/controllers/components/SearchBar.php
@@ -3,7 +3,7 @@
if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
- *
+ * TODO(chris): deprecated
*/
class SearchBar extends FHC_Controller
{
@@ -21,7 +21,7 @@ class SearchBar extends FHC_Controller
// NOTE:
// - A user must be authenticated via another controller to access this one
// - It is loaded to be able to call the isLogged function later
- $this->load->library('AuthLib', array(false));
+ $this->load->library('AuthLib');
// Load the library SearchBarLib
$this->load->library('SearchBarLib');
diff --git a/application/controllers/jobs/AntragJob.php b/application/controllers/jobs/AntragJob.php
index 0663be94b..717561589 100755
--- a/application/controllers/jobs/AntragJob.php
+++ b/application/controllers/jobs/AntragJob.php
@@ -19,6 +19,8 @@ class AntragJob extends JOB_Controller
// Loads SanchoHelper
$this->load->helper('hlp_sancho_helper');
+ $this->load->library('AntragLib');
+
// Load Model
$this->load->model('education/Studierendenantrag_model', 'StudierendenantragModel');
$this->load->model('education/Studierendenantragstatus_model', 'StudierendenantragstatusModel');
@@ -172,7 +174,16 @@ class AntragJob extends JOB_Controller
$cc = $leitung['Details']->email;
// NOTE(chris): Sancho mail
- if (sendSanchoMail("Sancho_Mail_Antrag_Stgl", $data, $to, 'Anträge - Aktion(en) erforderlich', DEFAULT_SANCHO_HEADER_IMG, DEFAULT_SANCHO_FOOTER_IMG, '', $cc))
+ if (sendSanchoMail(
+ "Sancho_Mail_Antrag_Stgl",
+ $data,
+ $to,
+ 'Anträge - Aktion(en) erforderlich',
+ DEFAULT_SANCHO_HEADER_IMG,
+ DEFAULT_SANCHO_FOOTER_IMG,
+ '',
+ $cc
+ ))
$count++;
}
@@ -316,12 +327,52 @@ class AntragJob extends JOB_Controller
} else {
$deregisterStatus = getData($result);
+ $result = $this->antraglib->pauseAntrag(
+ $prestudent->studierendenantrag_id,
+ Studierendenantragstatus_model::INSERTVON_DEREGISTERED
+ );
+ if (isError($result))
+ $this->logError(getError($result));
+
$result = $this->prestudentlib->setAbbrecher($prestudent->prestudent_id, '', $insertvon);
if (isError($result)) {
$this->StudierendenantragstatusModel->delete($deregisterStatus);
$this->logError(getError($result));
} else {
$count++;
+
+ $datum_kp = new DateTime($prestudent->datum);
+ $dataMail = array(
+ 'name'=> trim($prestudent->vorname . ' '. $prestudent->nachname),
+ 'vorname' => $prestudent->vorname,
+ 'nachname' => $prestudent->nachname,
+ 'pers_kz'=> $prestudent->matrikelnr,
+ 'stg' => $prestudent->bezeichnung,
+ 'lvbezeichnung' => $prestudent->lvbezeichnung,
+ 'datum_kp' => $datum_kp->format('d.m.Y'),
+ 'studiensemester'=> $prestudent->studiensemester_kurzbz,
+ 'Orgform'=> $prestudent->orgform,
+ 'prestudent_id' => $prestudent->prestudent_id,
+ 'fristablauf' => $dateDeadline->format('d.m.Y')
+ );
+
+ $email = $this->StudentModel->getEmailFH($this->StudentModel->getUID($prestudent->prestudent_id));
+ // Mail to Student
+ if (!sendSanchoMail('Sancho_Mail_Antrag_W_DL_Stud', $dataMail, $email, 'Wiederholung: Frist abgelaufen')) {
+ $this->logWarning("Failed to send Notification to " . $email);
+ }
+
+ $result = $this->StudiengangModel->load($prestudent->studiengang_kz);
+ if (!hasData($result)) {
+ $this->logWarning('No Studiengang found');
+ continue;
+ }
+ $studiengang = current(getData($result));
+ $email = $studiengang->email;
+ // Mail to Assistenz
+ if (!sendSanchoMail('Sancho_Mail_Antrag_W_DL_Assist', $dataMail, $email, 'Wiederholung: Frist abgelaufen')) {
+ $this->logWarning("Failed to send Notification to " . $email);
+ }
}
}
}
@@ -339,8 +390,6 @@ class AntragJob extends JOB_Controller
{
$this->logInfo('Start Job handleAbmeldungenStglDeadline');
- $this->load->library('AntragLib');
-
$insertvon = $this->config->item('antrag_job_systemuser');
if (!$insertvon) {
$this->logError('Config "antrag_job_systemuser" nicht gesetzt');
@@ -364,7 +413,10 @@ class AntragJob extends JOB_Controller
$this->StudierendenantragModel->addSelect('s.insertamum');
$this->StudierendenantragModel->addSelect('s.insertvon');
- $this->StudierendenantragModel->db->where_in('public.get_rolle_prestudent(prestudent_id, studiensemester_kurzbz)', $this->config->item('antrag_prestudentstatus_whitelist'));
+ $this->StudierendenantragModel->db->where_in(
+ 'public.get_rolle_prestudent(prestudent_id, studiensemester_kurzbz)',
+ $this->config->item('antrag_prestudentstatus_whitelist')
+ );
$result = $this->StudierendenantragModel->getWithLastStatusWhere([
'typ' => Studierendenantrag_model::TYP_ABMELDUNG_STGL,
@@ -393,6 +445,10 @@ class AntragJob extends JOB_Controller
else {
$deregisterStatus = getData($result);
+ $result = $this->antraglib->pauseAntrag($antrag->studierendenantrag_id, Studierendenantragstatus_model::INSERTVON_DEREGISTERED);
+ if (isError($result))
+ $this->logError(getError($result));
+
$result = $this->prestudentlib->setAbbrecher(
$antrag->prestudent_id,
$antrag->studiensemester_kurzbz,
@@ -438,7 +494,6 @@ class AntragJob extends JOB_Controller
$this->logWarning("Failed to send Notification to " . $email);
}
}
-
}
}
$this->logInfo($count . "/" . count($antraege) . " Students set to Abbrecher");
@@ -569,12 +624,6 @@ class AntragJob extends JOB_Controller
}
}
- $this->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel');
- $result = $this->PrestudentstatusModel->loadLastWithStgDetails($prestudent->prestudent_id, $prestudent->studiensemester_kurzbz);
- if (hasData($result)) {
- $ausbildungssemester = current(getData($result))->semester;
- }
-
$dataMail = array(
'name'=> trim($prestudent->vorname . ' '. $prestudent->nachname),
'vorname' => $prestudent->vorname,
@@ -591,7 +640,7 @@ class AntragJob extends JOB_Controller
'fristablauf' => $fristende->format('d.m.Y'),
'pre_wiederholer_sem' => $next_sem,
'wiederholer_sem' => $sem_after_next_sem,
- 'sem' => $ausbildungssemester
+ 'sem' => $prestudent->ausbildungssemester
);
// NOTE(chris): Sancho mail
diff --git a/application/controllers/jobs/ReihungstestJob.php b/application/controllers/jobs/ReihungstestJob.php
index c31ed54c9..b55287439 100755
--- a/application/controllers/jobs/ReihungstestJob.php
+++ b/application/controllers/jobs/ReihungstestJob.php
@@ -1023,7 +1023,7 @@ class ReihungstestJob extends JOB_Controller
{
$studiengang = $this->StudiengangModel->load($stg);
$mailcontent = '';
-
+ $content = false;
foreach ($orgform AS $art=>$value)
{
// Orgform nur dazu schreiben, wenn es mehr als Eine gibt
@@ -1044,6 +1044,7 @@ class ReihungstestJob extends JOB_Controller
$mailcontent .= '
| '.$bewerber.' |
';
}
$mailcontent .= '
';
+ $content = true;
}
if (isset($value['AufnahmeHoeherePrio']) && !isEmptyArray($value['AufnahmeHoeherePrio']))
{
@@ -1058,6 +1059,7 @@ class ReihungstestJob extends JOB_Controller
$mailcontent .= '| '.$bewerber.' |
';
}
$mailcontent .= '';
+ $content = true;
}
if (isset($value['AbgewiesenHoeherePrio']) && !isEmptyArray($value['AbgewiesenHoeherePrio']))
{
@@ -1071,6 +1073,7 @@ class ReihungstestJob extends JOB_Controller
$mailcontent .= '| '.$bewerber.' |
';
}
$mailcontent .= '';
+ $content = true;
}
if ($bcc != '' && isset($value['AbgewiesenWeilBewerber']) && !isEmptyArray($value['AbgewiesenWeilBewerber']))
{
@@ -1085,13 +1088,14 @@ class ReihungstestJob extends JOB_Controller
$mailcontent .= '| '.$bewerber.' |
';
}
$mailcontent .= '';
+ $content = true;
}
}
$mailcontent_data_arr['table'] = $mailcontent;
// Send email in Sancho design
- if (!isEmptyString($mailcontent))
+ if (!isEmptyString($mailcontent) && $content === true)
{
sendSanchoMail(
'Sancho_ReihungstestteilnehmerJob',
diff --git a/application/controllers/system/MigrateContract.php b/application/controllers/system/MigrateContract.php
index 99b894473..f011be356 100644
--- a/application/controllers/system/MigrateContract.php
+++ b/application/controllers/system/MigrateContract.php
@@ -677,4 +677,35 @@ class MigrateContract extends CLI_Controller
else
return 0;
}
+
+ /**
+ * Habilitation wird aus der Tabelle bis.tbl_bisverwendung in die Tabelle public.tbl_mitarbeiter uebernommen
+ * Sofern die Person einmal in den Verwendungen eine habiliation eingetragen hat wird diese in den MA-Datensatz übernommen
+ * Da es in der regel öfter vorkommt dass das hakerl vergessen wurde beim Vertragswechsel als dass die person die habiliation verliert.
+ */
+ public function migrateHabilitation()
+ {
+ $this->load->model('ressource/Mitarbeiter_model','MitarbeiterModel');
+ $db = new DB_Model();
+
+ $qry = "
+ SELECT
+ distinct mitarbeiter_uid
+ FROM
+ bis.tbl_bisverwendung
+ WHERE
+ habilitation=true";
+
+ $resultHabilitation = $db->execReadOnlyQuery($qry);
+
+ if (isSuccess($resultHabilitation) && hasData($resultHabilitation))
+ {
+ $habilitationen = getData($resultHabilitation);
+
+ foreach ($habilitationen as $row_habilitationen)
+ {
+ $this->MitarbeiterModel->update($row_habilitationen->mitarbeiter_uid, array('habilitation'=>true));
+ }
+ }
+ }
}
diff --git a/application/controllers/system/MigrateSalary.php b/application/controllers/system/MigrateSalary.php
index e8771f913..4bd1d3e7d 100644
--- a/application/controllers/system/MigrateSalary.php
+++ b/application/controllers/system/MigrateSalary.php
@@ -3,7 +3,7 @@
* Job zur einmaligen Import der Gehälter
*
* Aufruf (Encode / im Filenmae mit %2F):
- * php index.ci.php system/MigrateSalary/import filename
+ * php index.ci.php system/MigrateSalary/import filename
*
*/
/*
@@ -34,7 +34,7 @@ class MigrateSalary extends CLI_Controller
$this->load->model('vertragsbestandteil/VertragsbestandteilStunden_model','VertragsbestandteilStundenModel');
$this->load->model('vertragsbestandteil/VertragsbestandteilFreitext_model','VertragsbestandteilFreitextModel');
$this->load->model('vertragsbestandteil/VertragsbestandteilFunktion_model','VertragsbestandteilFunktionModel');
-
+
}
// -----------------------------------------------------------------------------------------------------------------
@@ -45,7 +45,7 @@ class MigrateSalary extends CLI_Controller
*/
public function import($file)
{
-
+
// CSV Laden
$file = urldecode($file);
if($handle = fopen($file, "r"))
@@ -108,8 +108,8 @@ class MigrateSalary extends CLI_Controller
}
else
{
- if ($data[$i] != ''
- && isset($gehaltsarr[$gehaltsindex]) && isset($gehaltsarr[$gehaltsindex]['betrag'])
+ if ($data[$i] != ''
+ && isset($gehaltsarr[$gehaltsindex]) && isset($gehaltsarr[$gehaltsindex]['betrag'])
&& $gehaltsarr[$gehaltsindex]['betrag'] == $data[$i])
{
// Gehalt bleibt gleich
@@ -138,30 +138,31 @@ class MigrateSalary extends CLI_Controller
}
}
}
-
+
$monat++;
}
// Zeile zu Ende - Ende Datum setzen wenn nicht für alle Monate ein Eintrag vorhanden ist
if($monat < count($monate) && isset($gehaltsarr[$gehaltsindex]))
- $gehaltsarr[$gehaltsindex]['ende'] == $monate[$monat-1];
-
+ $gehaltsarr[$gehaltsindex]['ende'] = $monate[$monat-1];
+
}
$this->_saveGehalt($lastuser, $gehaltsarr);
}
}
/**
- * Ermittelt das passende Dienstverhaeltnis uns speichert den
+ * Ermittelt das passende Dienstverhaeltnis uns speichert den
* Gehaltsbestandteil
*/
private function _saveGehalt($uid, $gehaltsarr)
- {
+ {
$failed = false;
$this->db->trans_begin();
foreach($gehaltsarr as $row_gehalt)
{
+ //var_dump($row_gehalt);
$auszahlungen = 14;
$dvid = '';
$vbsid = '';
@@ -171,16 +172,18 @@ class MigrateSalary extends CLI_Controller
//DV und VBS Ermitteln
$dv = $this->DienstverhaeltnisModel->getDVByPersonUID($uid, $this->OE_DEFAULT, $row_gehalt['beginn']);
- if (!hasData($dv))
+ // Wenn keiner gefunden wird oder mit Monatsersteln nur ein externer gefunden wird, weitersuchen ob im Monat noch ein
+ // "richtiger" Vertrag startet
+ if (!hasData($dv) || getData($dv)[0]->vertragsart_kurzbz='externerLehrender')
{
$date = new DateTime($row_gehalt['beginn']);
$date->modify('last day of this month');
$last_day_this_month = $date->format('Y-m-d');
- // Wenn mit Monatsersten kein DV gefunden wird, wird stattdessen mit Monatsletzten gesucht um DVs zu finden
+ // Wenn mit Monatsersten kein DV gefunden wird, wird stattdessen mit Monatsletzten gesucht um DVs zu finden
// für Personen die erst später im Monat in ihr DV einsteigen
- $dv = $this->DienstverhaeltnisModel->getDVByPersonUID($uid, $this->OE_DEFAULT, $last_day_this_month);
-
+ $dv = $this->DienstverhaeltnisModel->getDVByPersonUIDOverlapping($uid, $this->OE_DEFAULT, $row_gehalt['beginn'], $last_day_this_month);
+
if (!hasData($dv))
{
echo "\nKein passendes DV gefunden für User ".$uid." und Datum ".$row_gehalt['beginn']." -> ROLLBACK\n";
@@ -189,34 +192,53 @@ class MigrateSalary extends CLI_Controller
}
else
{
- // Gehaltsstart wird auf den Start des DV korrigiert wenn nicht der Monatserste
- $row_gehalt['beginn'] = getData($dv)[0]->von;
+ $resultdata = getData($dv);
+ foreach($resultdata as $dvdata)
+ {
+ // Externer DV wird in Monatsmitte zu echten DV - daher weitersuchen bei externenDVs da
+ // diese sowieso kein Gehalt zugeordnet haben
+ if($dvdata->vertragsart_kurzbz != 'externerLehrender')
+ {
+ $dvid = $dvdata->dienstverhaeltnis_id;
+ // Gehaltsstart wird auf den Start des DV korrigiert wenn nicht der Monatserste
+ // nur wenn das Beginndatum vor dem DV-Start liegt da sonst das Datum korrigiert wird
+ // wenn der Vertragsbestandteil wechselt
+ if($row_gehalt['beginn'] < $dvdata->von)
+ $row_gehalt['beginn'] = $dvdata->von;
+ break;
+ }
+ }
}
}
-
- $resultdata = getData($dv);
- if (count($resultdata) !== 1)
+ else
{
- echo "Kein oder Mehrere DVs gefunden -> ROLLBACK";
+ $resultdata = getData($dv);
+
+ if (count($resultdata) == 1)
+ $dvid = $resultdata[0]->dienstverhaeltnis_id;
+ }
+
+ if ($dvid == '')
+ {
+ echo "Kein oder mehrere DVs gefunden -> ROLLBACK";
$failed = true;
break;
}
- $dvid = $resultdata[0]->dienstverhaeltnis_id;
-
$allin = $this->_isAllIn($dvid, $row_gehalt['beginn']);
$db = new DB_Model();
$resultVBS = $this->_getVBS($dvid, $row_gehalt['beginn']);
-
+
if (hasData($resultVBS))
{
$vbsid = getData($resultVBS)[0]->vertragsbestandteil_id;
+ $vbsbis = getData($resultVBS)[0]->bis;
}
else
{
- echo "Vertragsbestandteil wurde nicht gefunden -> ROLLBACK";
+ echo "Vertragsbestandteil fuer $uid DV $dvid wurde nicht gefunden mit Beginn ".$row_gehalt['beginn']."-> ROLLBACK";
$failed = true;
break;
}
@@ -246,7 +268,7 @@ class MigrateSalary extends CLI_Controller
);
if (isset($row_gehalt['ende']) && $row_gehalt['ende']!='')
$data['bis'] = $row_gehalt['ende'];
-
+
$resultVBS = $this->VertragsbestandteilModel->Insert($data);
if(!isSuccess($resultVBS))
{
@@ -286,7 +308,7 @@ class MigrateSalary extends CLI_Controller
);
if (isset($row_gehalt['ende']) && $row_gehalt['ende']!='')
$data['bis'] = $row_gehalt['ende'];
-
+
$resultVBS = $this->VertragsbestandteilModel->Insert($data);
if(!isSuccess($resultVBS))
{
@@ -356,16 +378,24 @@ class MigrateSalary extends CLI_Controller
$date->modify('last day of this month');
$last_day_this_month = $date->format('Y-m-d');
- // TODO: wenn das Dienstverhaeltnis in diesem Monat endet und nicht der Monatsletzte ist,
+ // Wenn das Dienstverhaeltnis in diesem Monat endet und nicht der Monatsletzte ist,
// dann muss hier das Ende Datum des DV stehen bzw das Ende
// oder das Ende des VBS falls die Person in der Monatsmitte Stunden wechselt
$data['bis'] = $last_day_this_month;
+
+ // Wenn der Vertragsbestandteil endet bevor das Gehalt endet, dann wir das Gehaltsende auf VBS Ende gesetzt
+ //echo "Ende des VBS: $vbsbis Ende des Gehalt: ".$data['bis'];
+ if ($vbsbis != '' && $vbsbis < $data['bis'])
+ {
+ $data['bis'] = $vbsbis;
+ //echo "Gehalt auf vbs ende gesetzt";
+ }
}
$ret = $this->GehaltsbestandteilModel->insert($data,
$this->GehaltsbestandteilModel->getEncryptedColumns()
);
- }
+ }
if(!$failed)
{
@@ -375,7 +405,7 @@ class MigrateSalary extends CLI_Controller
{
echo "ROLLBACK";
$this->db->trans_rollback();
- }
+ }
}
/**
@@ -386,17 +416,17 @@ class MigrateSalary extends CLI_Controller
$db = new DB_Model();
$qry = "
- SELECT
- *
- FROM
- hr.tbl_vertragsbestandteil
+ SELECT
+ *
+ FROM
+ hr.tbl_vertragsbestandteil
JOIN hr.tbl_vertragsbestandteil_freitext USING(vertragsbestandteil_id)
- WHERE
- dienstverhaeltnis_id=".$db->escape($dvid)."
- AND vertragsbestandteiltyp_kurzbz='freitext'
+ WHERE
+ dienstverhaeltnis_id=".$db->escape($dvid)."
+ AND vertragsbestandteiltyp_kurzbz='freitext'
AND ".$db->escape($datum)." BETWEEN von AND COALESCE(bis, '2999-12-31')
AND freitexttyp_kurzbz='allin'";
-
+
$resultAllIn = $db->execReadOnlyQuery($qry);
if (hasData($resultAllIn))
@@ -410,15 +440,15 @@ class MigrateSalary extends CLI_Controller
$db = new DB_Model();
$qry = "
- SELECT
- *
- FROM
- hr.tbl_vertragsbestandteil
- WHERE
- dienstverhaeltnis_id=".$db->escape($dvid)."
- AND vertragsbestandteiltyp_kurzbz='stunden'
+ SELECT
+ *
+ FROM
+ hr.tbl_vertragsbestandteil
+ WHERE
+ dienstverhaeltnis_id=".$db->escape($dvid)."
+ AND vertragsbestandteiltyp_kurzbz='stunden'
AND ".$db->escape($datum)." BETWEEN von AND COALESCE(bis, '2999-12-31')";
-
+
$resultVBS = $db->execReadOnlyQuery($qry);
return $resultVBS;
@@ -430,22 +460,22 @@ class MigrateSalary extends CLI_Controller
private function _getUser($svnr)
{
$db = new DB_Model();
-
+
$qry = "
- SELECT
- mitarbeiter_uid
- FROM
- public.tbl_person
+ SELECT
+ mitarbeiter_uid
+ FROM
+ public.tbl_person
JOIN public.tbl_benutzer using(person_id)
JOIN public.tbl_mitarbeiter ON(uid=mitarbeiter_uid)
WHERE
tbl_person.svnr = ". $db->escape($svnr)."
AND EXISTS(
- SELECT
- 1
- FROM
- hr.tbl_dienstverhaeltnis
- WHERE
+ SELECT
+ 1
+ FROM
+ hr.tbl_dienstverhaeltnis
+ WHERE
mitarbeiter_uid=tbl_mitarbeiter.mitarbeiter_uid
AND oe_kurzbz=". $db->escape($this->OE_DEFAULT)."
)
diff --git a/application/controllers/system/Navigation.php b/application/controllers/system/Navigation.php
index c3764b612..71ab1c81b 100755
--- a/application/controllers/system/Navigation.php
+++ b/application/controllers/system/Navigation.php
@@ -22,6 +22,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed');
* This controller operates between (interface) the JS (GUI) and the NavigationLib (back-end)
* Provides data to the ajax get calls about the filter
* This controller works with JSON calls on the HTTP GET or POST and the output is always JSON
+ * TODO(chris): deprecated
*/
class Navigation extends FHC_Controller
{
diff --git a/application/core/Auth_Controller.php b/application/core/Auth_Controller.php
index c407a106f..d170a7eca 100755
--- a/application/core/Auth_Controller.php
+++ b/application/core/Auth_Controller.php
@@ -7,6 +7,10 @@ if (!defined('BASEPATH')) exit('No direct script access allowed');
*/
abstract class Auth_Controller extends FHC_Controller
{
+ // Special Permissions
+ const PERM_ANONYMOUS = 'anonymous'; // Everyone
+ const PERM_LOGGED = 'logged_in'; // Every registered user
+
/**
* Extends this controller if authentication is required
*/
@@ -14,17 +18,41 @@ abstract class Auth_Controller extends FHC_Controller
{
parent::__construct();
- // Loads authentication library and starts authentication
- $this->load->library('AuthLib');
+ if (!is_array($requiredPermissions) || isEmptyArray($requiredPermissions))
+ show_error('The given permissions is not a valid array or it is an empty one');
+
+ if (!isset($requiredPermissions[$this->router->method]))
+ show_error('The given permission array does not contain the given method or is not correctly set');
+
+ $anonAllowed = false;
+ if ($requiredPermissions[$this->router->method] == self::PERM_ANONYMOUS)
+ $anonAllowed = true;
+ elseif (is_array($requiredPermissions[$this->router->method])
+ && in_array(self::PERM_ANONYMOUS, $requiredPermissions[$this->router->method]))
+ $anonAllowed = true;
- // Checks if the caller is allowed to access to this content
- $this->_isAllowed($requiredPermissions);
+ if ($anonAllowed) {
+ // Loads authentication library without authentication
+ $this->load->library('AuthLib', [false]);
+
+ // Loads helper since it would only be called on authentication
+ $this->load->helper('hlp_authentication');
+ } else {
+ // Loads authentication library and starts authentication
+ $this->load->library('AuthLib');
+
+ // Checks if the caller is allowed to access to this content
+ $this->_isAllowed($requiredPermissions);
+ }
}
/**
* Checks if the caller is allowed to access to this content with the given permissions
* If it is not allowed will set the HTTP header with code 401
* Wrapper for permissionlib->isEntitled
+ *
+ * @param array $requiredPermissions
+ * @return void
*/
private function _isAllowed($requiredPermissions)
{
@@ -34,28 +62,43 @@ abstract class Auth_Controller extends FHC_Controller
// Checks if this user is entitled to access to this content
if (!$this->permissionlib->isEntitled($requiredPermissions, $this->router->method))
{
- $this->output->set_status_header(REST_Controller::HTTP_UNAUTHORIZED); // set the HTTP header as unauthorized
-
- $this->load->library('EPrintfLib'); // loads the EPrintfLib to format the output
-
- // Prints the main error message
- $this->eprintflib->printError('You are not allowed to access to this content');
- // Prints the called controller name
- $this->eprintflib->printInfo('Controller name: '.$this->router->class);
- // Prints the called controller method name
- $this->eprintflib->printInfo('Method name: '.$this->router->method);
- // Prints the required permissions needed to access to this method
- $this->eprintflib->printInfo('Required permissions: '.$this->_rpsToString($requiredPermissions, $this->router->method));
-
+ $this->_outputAuthError($requiredPermissions);
exit; // immediately terminate the execution
}
}
+ /**
+ * Outputs an error message and sets the HTTP Header.
+ * This function is protected so that it can be overwritten.
+ *
+ * @param array $requiredPermissions
+ * @return void
+ */
+ protected function _outputAuthError($requiredPermissions)
+ {
+ $this->output->set_status_header(REST_Controller::HTTP_UNAUTHORIZED); // set the HTTP header as unauthorized
+
+ $this->load->library('EPrintfLib'); // loads the EPrintfLib to format the output
+
+ // Prints the main error message
+ $this->eprintflib->printError('You are not allowed to access to this content');
+ // Prints the called controller name
+ $this->eprintflib->printInfo('Controller name: '.$this->router->class);
+ // Prints the called controller method name
+ $this->eprintflib->printInfo('Method name: '.$this->router->method);
+ // Prints the required permissions needed to access to this method
+ $this->eprintflib->printInfo('Required permissions: '.$this->_rpsToString($requiredPermissions, $this->router->method));
+ }
+
/**
* Converts an array of permissions to a string that contains them as a comma separated list
* Ex: ", , "
+ *
+ * @param array $requiredPermissions
+ * @param string $method
+ * @return void
*/
- private function _rpsToString($requiredPermissions, $method)
+ final protected function _rpsToString($requiredPermissions, $method)
{
$strRequiredPermissions = ''; // string that contains all the required permissions needed to access to this method
diff --git a/application/core/FHCAPI_Controller.php b/application/core/FHCAPI_Controller.php
new file mode 100644
index 000000000..647032795
--- /dev/null
+++ b/application/core/FHCAPI_Controller.php
@@ -0,0 +1,231 @@
+returnObj['meta']) || !isset($this->returnObj['meta']['status'])) {
+ switch ($http_response_code) {
+ case 200:
+ $this->setStatus(self::STATUS_SUCCESS);
+ break;
+ case 400:
+ $this->setStatus(self::STATUS_FAIL);
+ break;
+ default:
+ $this->setStatus(self::STATUS_ERROR);
+ break;
+ }
+ }
+
+ return json_encode($this->returnObj);
+ });
+
+ // NOTE(chris): overwrite error_views_path before constructor
+ load_class('Config')->set_item('error_views_path', VIEWPATH.'errors'.DIRECTORY_SEPARATOR.'json'.DIRECTORY_SEPARATOR);
+
+ parent::__construct($requiredPermissions);
+
+ // For JSON Requests (as opposed to multipart/form-data) get the $_POST variable from the input stream instead
+ if ($this->input->get_request_header('Content-Type', true) == 'application/json')
+ $_POST = json_decode($this->security->xss_clean($this->input->raw_input_stream), true);
+ elseif (isset($_POST['_jsondata'])) {
+ $_POST = array_merge($_POST, json_decode($_POST['_jsondata'], true));
+ unset($_POST['_jsondata']);
+ }
+ }
+
+
+ // ---------------------------------------------------------------
+ // Handle Output object
+ // ---------------------------------------------------------------
+
+ /**
+ * @param array $data
+ * @param string $type (optional)
+ * @return void
+ */
+ public function addError($data, $type = null)
+ {
+ if (!isset($this->returnObj['errors']))
+ $this->returnObj['errors'] = [];
+
+ $error = [];
+
+ if (is_array($data)) {
+ if ($type == self::ERROR_TYPE_VALIDATION)
+ $error['messages'] = $data;
+ else
+ $error = $data;
+ } else {
+ $error['message'] = $data;
+ }
+
+ if ($type)
+ $error['type'] = $type;
+
+ $this->returnObj['errors'][] = $error;
+ }
+
+ /**
+ * @param mixed $data
+ * @return void
+ */
+ public function setData($data)
+ {
+ $this->returnObj['data'] = $data;
+ }
+
+ /**
+ * @param string $key
+ * @param mixed $value
+ * @return void
+ */
+ public function addMeta($key, $value)
+ {
+ if (!isset($this->returnObj['meta']))
+ $this->returnObj['meta'] = [];
+ $this->returnObj['meta'][$key] = $value;
+ }
+
+ /**
+ * @param string $status
+ * @return void
+ */
+ public function setStatus($status)
+ {
+ $this->addMeta('status', $status);
+ }
+
+
+ // ---------------------------------------------------------------
+ // Handle Output object - Shortcut functions
+ // ---------------------------------------------------------------
+
+ /**
+ * @param mixed $data (optional)
+ * @return void
+ */
+ protected function terminateWithSuccess($data = null)
+ {
+ $this->setData($data);
+ $this->setStatus(self::STATUS_SUCCESS);
+ exit;
+ }
+
+ /**
+ * @param array $errors
+ * @return void
+ */
+ protected function terminateWithValidationErrors($errors)
+ {
+ $this->output->set_status_header(REST_Controller::HTTP_BAD_REQUEST);
+ $this->addError($errors, self::ERROR_TYPE_VALIDATION);
+ $this->setStatus(self::STATUS_FAIL);
+ exit(EXIT_ERROR);
+ }
+
+ /**
+ * @param array $error
+ * @param string $type (optional)
+ * @param integer $status (optional)
+ * @return void
+ */
+ protected function terminateWithError($error, $type = null, $status = REST_Controller::HTTP_INTERNAL_SERVER_ERROR)
+ {
+ $this->output->set_status_header($status);
+ $this->addError($error, $type);
+ $this->setStatus(self::STATUS_ERROR);
+ exit;
+ }
+
+ /**
+ * @param stdclass $result
+ * @param string $errortype
+ * @return void
+ */
+ protected function getDataOrTerminateWithError($result, $errortype = self::ERROR_TYPE_GENERAL)
+ {
+ if (isError($result)) {
+ $this->terminateWithError(getError($result), $errortype);
+ }
+ return $result->retval;
+ }
+
+
+ // ---------------------------------------------------------------
+ // Security
+ // ---------------------------------------------------------------
+
+ /**
+ * Outputs an error message and sets the HTTP Header.
+ * This overwrites the default behaviour to output a json object.
+ *
+ * @param array $requiredPermissions
+ * @return void
+ */
+ protected function _outputAuthError($requiredPermissions)
+ {
+ $this->output->set_status_header(isLogged() ? REST_Controller::HTTP_FORBIDDEN : REST_Controller::HTTP_UNAUTHORIZED);
+
+ $this->addError([
+ 'message' => 'You are not allowed to access to this content',
+ 'controller' => $this->router->class,
+ 'method' => $this->router->method,
+ 'required_permissions' => $this->_rpsToString($requiredPermissions, $this->router->method)
+ ], self::ERROR_TYPE_AUTH);
+ }
+}
diff --git a/application/libraries/AntragLib.php b/application/libraries/AntragLib.php
index 298c3652f..ce4485279 100755
--- a/application/libraries/AntragLib.php
+++ b/application/libraries/AntragLib.php
@@ -62,9 +62,11 @@ class AntragLib
'insertvon' => $insertvon
]);
- // NOTE(chris): remove "preabbrecher" statusgrund for Stgl-Abmeldungen if set
+ // NOTE(chris): remove "preabbrecher" statusgrund and paused stati for sibling Anträge for Stgl-Abmeldungen if set
$res = $this->_ci->StudierendenantragModel->load($antrag_id);
if (hasData($res) && current(getData($res))->typ == Studierendenantrag_model::TYP_ABMELDUNG_STGL) {
+ $this->unpauseAntrag($antrag_id, Studierendenantragstatus_model::INSERTVON_ABMELDUNGSTGL);
+
$this->_ci->PrestudentstatusModel->addSelect('tbl_status_grund.statusgrund_kurzbz');
$res = $this->_ci->PrestudentstatusModel->getLastStatusWithStgEmail(current(getData($res))->prestudent_id, '', 'Student');
if (hasData($res) && current(getData($res))->statusgrund_kurzbz == 'preabbrecher') {
@@ -83,6 +85,67 @@ class AntragLib
return $result;
}
+ /**
+ * @param integer $antrag_id
+ * @param string $insertvon
+ *
+ * @return stdClass
+ */
+ public function pauseAntrag($antrag_id, $insertvon)
+ {
+ switch ($insertvon) {
+ case Studierendenantragstatus_model::INSERTVON_ABMELDUNGSTGL:
+ $result = $this->_ci->StudierendenantragstatusModel->stopAntraegeForAbmeldungStgl($antrag_id);
+ break;
+ case Studierendenantragstatus_model::INSERTVON_DEREGISTERED:
+ $result = $this->_ci->StudierendenantragstatusModel->stopAntraegeForAbbruchBy($antrag_id);
+ break;
+ default:
+ $result = $this->_ci->StudierendenantragstatusModel->insert([
+ 'studierendenantrag_id' => $antrag_id,
+ 'studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_PAUSE,
+ 'insertvon' => $insertvon
+ ]);
+ break;
+ }
+
+ return $result;
+ }
+
+ /**
+ * @param integer $antrag_id
+ * @param string $insertvon
+ *
+ * @return stdClass
+ */
+ public function unpauseAntrag($antrag_id, $insertvon)
+ {
+ if ($insertvon == Studierendenantragstatus_model::INSERTVON_DEREGISTERED)
+ return error($this->p->t('studierendenantrag', 'error_no_right'));
+ if ($insertvon == Studierendenantragstatus_model::INSERTVON_ABMELDUNGSTGL) {
+ return $this->_ci->StudierendenantragstatusModel->resumeAntraegeForAbmeldungStgl($antrag_id);
+ }
+ // NOTE(chris): get last status that is not pause
+ $this->_ci->StudierendenantragstatusModel->addOrder('insertamum');
+ $this->_ci->StudierendenantragstatusModel->addLimit(1);
+ $result = $this->_ci->StudierendenantragstatusModel->loadWhere([
+ 'studierendenantrag_id' => $antrag_id,
+ 'studierendenantrag_statustyp_kurzbz !=' => Studierendenantragstatus_model::STATUS_PAUSE
+ ]);
+ if (isError($result))
+ return $result;
+ if (!hasData($result))
+ return error($this->_ci->p->t('studierendenantrag', 'error_no_antragstatus', ['id' => $antrag_id]));
+ $status = current(getData($result));
+
+ $result = $this->_ci->StudierendenantragstatusModel->insert([
+ 'studierendenantrag_id' => $antrag_id,
+ 'studierendenantrag_statustyp_kurzbz' => $status->studierendenantrag_statustyp_kurzbz,
+ 'insertvon' => $insertvon
+ ]);
+ return $result;
+ }
+
/**
* NOTE(chris): permissions & verification must be handled outside
*
@@ -169,7 +232,7 @@ class AntragLib
if (isError($result))
$errors[] = getError($result);
else {
- $this->_ci->StudiengangModel->addJoin('public.tbl_prestudent ps','studiengang_kz');
+ $this->_ci->StudiengangModel->addJoin('public.tbl_prestudent ps', 'studiengang_kz');
$result = $this->_ci->StudiengangModel->loadWhere(['prestudent_id' => $antrag->prestudent_id]);
$stg = '';
$orgform = '';
@@ -190,6 +253,10 @@ class AntragLib
$vorlage ='Sancho_Mail_Antrag_A_Approve';
$subject = $this->_ci->p->t('studierendenantrag', 'mail_subject_A_Approve');
+ $result = $this->pauseAntrag($studierendenantrag_id, Studierendenantragstatus_model::INSERTVON_DEREGISTERED);
+ if (isError($result))
+ $errors[] = getError($result);
+
$result = $this->_ci->prestudentlib->setAbbrecher(
$antrag->prestudent_id,
$antrag->studiensemester_kurzbz,
@@ -208,7 +275,13 @@ class AntragLib
$data = [
'student' => $this->_ci->p->t('person', 'studentIn'),
'sem' => $antrag->studiensemester_kurzbz,
- 'linkPdf' => base_url('content/pdfExport.php?xml=Antrag' . $antrag->typ . '.xml.php&xsl=Antrag' . $antrag->typ . '&id=' . $antrag->studierendenantrag_id . '&output=pdf')
+ 'linkPdf' => base_url('content/pdfExport.php?xml=Antrag' .
+ $antrag->typ .
+ '.xml.php&xsl=Antrag' .
+ $antrag->typ .
+ '&id=' .
+ $antrag->studierendenantrag_id .
+ '&output=pdf')
];
if (hasData($result)) {
$person = current(getData($result));
@@ -229,6 +302,10 @@ class AntragLib
sendSanchoMail($vorlage, $data, $prestudent_status->email, $subject);
}
} else { // ($antrag->typ == Studierendenantrag_model::TYP_ABMELDUNG_STGL)
+ $result = $this->pauseAntrag($studierendenantrag_id, Studierendenantragstatus_model::INSERTVON_ABMELDUNGSTGL);
+ if (isError($result))
+ $errors[] = getError($result);
+
$result = $this->_ci->PrestudentstatusModel->getLastStatusWithStgEmail($antrag->prestudent_id, '', 'Student');
if (isError($result))
{
@@ -340,6 +417,10 @@ class AntragLib
if (isError($result))
return $result;
else {
+ $result = $this->pauseAntrag($studierendenantrag_id, Studierendenantragstatus_model::INSERTVON_DEREGISTERED);
+ // NOTE(chris): here we should have error handling but at the
+ // moment there is no way to notify the user for "soft" errors
+
$result = $this->_ci->prestudentlib->setAbbrecher(
$antrag->prestudent_id,
$antrag->studiensemester_kurzbz,
@@ -471,7 +552,6 @@ class AntragLib
'
Details:
' .
$error_msg;
} else {
-
$data = getData($data);
$result = $this->_ci->StudierendenantragstatusModel->insert([
@@ -582,7 +662,11 @@ class AntragLib
'nachname' => $data['person']->nachname,
'UID' => $data['UID'],
'sem' => $resultAntrag->studiensemester_kurzbz,
- 'linkPdf' => base_url('content/pdfExport.php?xml=AntragUnterbrechung.xml.php&xsl=AntragUnterbrechung&id=' . $studierendenantrag_id . '&output=pdf'),
+ 'linkPdf' => base_url(
+ 'content/pdfExport.php?xml=AntragUnterbrechung.xml.php&xsl=AntragUnterbrechung&id=' .
+ $studierendenantrag_id .
+ '&output=pdf'
+ ),
'insertvon' => $approvedBy
],
$data['prestudent_status']->email,
@@ -699,7 +783,9 @@ class AntragLib
'Orgform' => $data['prestudent_status']->orgform_kurzbz,
'prestudent_id' => $data['prestudent_status']->prestudent_id,
'abmeldungLink' => site_url('lehre/Studierendenantrag/abmeldung/' . $data['prestudent_status']->prestudent_id),
- 'abmeldungLinkCIS' => CIS_ROOT . 'index.ci.php/lehre/Studierendenantrag/abmeldung/' . $data['prestudent_status']->prestudent_id
+ 'abmeldungLinkCIS' => CIS_ROOT .
+ 'index.ci.php/lehre/Studierendenantrag/abmeldung/' .
+ $data['prestudent_status']->prestudent_id
],
$data['email'],
$this->_ci->p->t('studierendenantrag', 'mail_subject_U_Reject')
@@ -734,7 +820,7 @@ class AntragLib
return error($this->_ci->p->t('studierendenantrag', 'error_no_antrag_found', ['id' => $studierendenantrag_id]));
$result['antrag'] = $antrag = current($res);
- $this->_ci->StudiengangModel->addJoin('public.tbl_prestudent ps','studiengang_kz');
+ $this->_ci->StudiengangModel->addJoin('public.tbl_prestudent ps', 'studiengang_kz');
$res = $this->_ci->StudiengangModel->loadWhere(['prestudent_id' => $antrag->prestudent_id]);
if (hasData($res)) {
$result['studiengang'] = current(getData($res));
@@ -862,7 +948,9 @@ class AntragLib
$result = $this->_ci->StudierendenantragstatusModel->insert([
'studierendenantrag_id' => $antrag_id,
- 'studierendenantrag_statustyp_kurzbz' => $repeat ? Studierendenantragstatus_model::STATUS_CREATED : Studierendenantragstatus_model::STATUS_PASS,
+ 'studierendenantrag_statustyp_kurzbz' => $repeat
+ ? Studierendenantragstatus_model::STATUS_CREATED
+ : Studierendenantragstatus_model::STATUS_PASS,
'insertvon' => $insertvon
]);
@@ -878,8 +966,7 @@ class AntragLib
$email = $prestudent_status->email;
// NOTE(chris): Sancho mail
$lvzuweisungLink = site_url('lehre/Antrag/Wiederholung/assistenz/' . $antrag_id);
- if( defined('VILESCI_ROOT') )
- {
+ if (defined('VILESCI_ROOT')) {
$lvzuweisungLink = VILESCI_ROOT . 'index.ci.php/lehre/Antrag/Wiederholung/assistenz/' . $antrag_id;
}
sendSanchoMail(
@@ -888,7 +975,7 @@ class AntragLib
'antrag_id' => $antrag_id,
'stg' => $prestudent_status->stg_bezeichnung,
'Orgform' => $prestudent_status->orgform,
- 'lvzuweisungLink' => $lvzuweisungLink
+ 'lvzuweisungLink' => $lvzuweisungLink
],
$email,
$this->_ci->p->t('studierendenantrag', 'mail_subject_W_New')
@@ -1062,7 +1149,11 @@ class AntragLib
if (isError($result))
return $result;
if (!hasData($result))
- return error($this->_ci->p->t('studierendenantrag', 'error_no_stdsem', ['studiensemester_kurzbz' => $antrag->studiensemester_kurzbz]));
+ return error($this->_ci->p->t(
+ 'studierendenantrag',
+ 'error_no_stdsem',
+ ['studiensemester_kurzbz' => $antrag->studiensemester_kurzbz]
+ ));
$asem = current(getData($result));
foreach ($stdsems as $sem) {
@@ -1117,7 +1208,6 @@ class AntragLib
$lv->antrag_anmerkung = $lvszugewiesen[$lv->lehrveranstaltung_id]->anmerkung;
$lv->antrag_zugelassen = true;
}
-
}
} else {
$lvsA = null;
@@ -1224,10 +1314,10 @@ class AntragLib
* @param integer $prestudent_id
*
* @return \stdClass on success retval 0 means not a student;
- * retval 1 means Berechtigt;
- * retval -1 means has already an Antrag pending;
- * retval -2 means other Antrag pending;
- * retval -3 means in blacklist stg
+ * retval 1 means Berechtigt;
+ * retval -1 means has already an Antrag pending;
+ * retval -2 means other Antrag pending;
+ * retval -3 means in blacklist stg
*/
public function getPrestudentAbmeldeBerechtigt($prestudent_id)
{
@@ -1251,12 +1341,24 @@ class AntragLib
if (!in_array($result->status_kurzbz, $this->_ci->config->item('antrag_prestudentstatus_whitelist_abmeldung'))) {
$result = $this->_ci->StudierendenantragModel->loadWithStatusWhere([
- 'prestudent_id' => $prestudent_id,
- 'campus.get_status_studierendenantrag(studierendenantrag_id)' => Studierendenantragstatus_model::STATUS_APPROVED
- ], [
- Studierendenantrag_model::TYP_ABMELDUNG,
- Studierendenantrag_model::TYP_ABMELDUNG_STGL
- ]);
+ 'prestudent_id' => $prestudent_id,
+ 's.studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_APPROVED
+ ], [
+ Studierendenantrag_model::TYP_ABMELDUNG,
+ Studierendenantrag_model::TYP_ABMELDUNG_STGL
+ ]);
+ if (isError($result))
+ return $result;
+ if (hasData($result))
+ return success(-1);
+
+ $result = $this->_ci->StudierendenantragModel->loadWithStatusWhere([
+ 'prestudent_id' => $prestudent_id,
+ 's.studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_PAUSE
+ ], [
+ Studierendenantrag_model::TYP_ABMELDUNG,
+ Studierendenantrag_model::TYP_ABMELDUNG_STGL
+ ]);
if (isError($result))
return $result;
if (hasData($result))
@@ -1297,12 +1399,12 @@ class AntragLib
* @param string $studiensemester_kurzbz (optional)
*
* @return \stdClass on success retval 0 means not a student;
- * retval 1 means Berechtigt;
+ * retval 1 means Berechtigt;
* retval -1 means has already an Antrag pending;
* retval -2 means other Antrag pending;
* retval -3 means in blacklist stg
*/
- public function getPrestudentUnterbrechungsBerechtigt($prestudent_id, $studiensemester_kurzbz = null)
+ public function getPrestudentUnterbrechungsBerechtigt($prestudent_id, $studiensemester_kurzbz = null, $datum_wiedereinstieg = null)
{
$result = $this->_ci->PrestudentModel->load($prestudent_id);
if (isError($result))
@@ -1320,18 +1422,10 @@ class AntragLib
if (!hasData($result))
return success(0);
$result = current(getData($result));
+ $prestudent_stdsem = $result->studiensemester_kurzbz;
$datumStatus = $result->datum;
- if (!in_array($result->status_kurzbz, $this->_ci->config->item('antrag_prestudentstatus_whitelist'))) {
- $result = $this->_ci->StudierendenantragModel->loadWithStatusWhere([
- 'prestudent_id' => $prestudent_id,
- 'typ' => Studierendenantrag_model::TYP_UNTERBRECHUNG,
- 'campus.get_status_studierendenantrag(studierendenantrag_id)' => Studierendenantragstatus_model::STATUS_APPROVED
- ]);
- if (isError($result))
- return $result;
- if (hasData($result))
- return success(-1);
-
+ if (!in_array($result->status_kurzbz, $this->_ci->config->item('antrag_prestudentstatus_whitelist'))
+ && $result->status_kurzbz != 'Unterbrecher') {
return success(0);
}
$result = $this->_ci->StudierendenantragModel->loadWithStatusWhere(['prestudent_id' => $prestudent_id]);
@@ -1339,7 +1433,8 @@ class AntragLib
return $result;
if (!hasData($result))
return success(1);
- $result= getData($result);
+
+ $result = getData($result);
foreach ($result as $antrag)
{
if ($antrag->typ == Studierendenantrag_model::TYP_ABMELDUNG || $antrag->typ == Studierendenantrag_model::TYP_ABMELDUNG_STGL)
@@ -1349,11 +1444,11 @@ class AntragLib
elseif($antrag->status == Studierendenantragstatus_model::STATUS_APPROVED && $antrag->datum > $datumStatus)
return success(-2);
}
- if ($studiensemester_kurzbz && $antrag->typ == Studierendenantrag_model::TYP_UNTERBRECHUNG)
+ if ($antrag->typ == Studierendenantrag_model::TYP_UNTERBRECHUNG)
{
- // NOTE(chris): check if this is an old or canceled one
- if ($antrag->studiensemester_kurzbz == $studiensemester_kurzbz && $antrag->status != Studierendenantragstatus_model::STATUS_CANCELLED)
- return success(-1);
+ // NOTE(chris): Ignore canceled ones
+ if ($antrag->status == Studierendenantragstatus_model::STATUS_CANCELLED)
+ continue;
}
if ($antrag->typ == Studierendenantrag_model::TYP_WIEDERHOLUNG)
{
@@ -1362,6 +1457,17 @@ class AntragLib
}
}
+ if (!$studiensemester_kurzbz) {
+ $sems = $this->getSemesterForUnterbrechung($prestudent_id, $prestudent_stdsem);
+ if (!count(array_filter($sems, function ($item) {
+ return !$item['disabled'];
+ })))
+ return success(-1);
+ } else {
+ if ($this->_ci->StudierendenantragModel->hasRunningUnterbrechungBetween($prestudent_id, $studiensemester_kurzbz, $datum_wiedereinstieg))
+ return success(-1);
+ }
+
return success(1);
}
@@ -1406,7 +1512,27 @@ class AntragLib
$result = $this->_ci->StudierendenantragModel->loadWithStatusWhere([
'prestudent_id' => $prestudent_id,
'typ' => Studierendenantrag_model::TYP_WIEDERHOLUNG,
- 'campus.get_status_studierendenantrag(studierendenantrag_id)' => Studierendenantragstatus_model::STATUS_APPROVED
+ 's.studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_APPROVED
+ ]);
+ if (isError($result))
+ return $result;
+ if (hasData($result))
+ return success(-1);
+
+ $result = $this->_ci->StudierendenantragModel->loadWithStatusWhere([
+ 'prestudent_id' => $prestudent_id,
+ 'typ' => Studierendenantrag_model::TYP_WIEDERHOLUNG,
+ 's.studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_DEREGISTERED
+ ]);
+ if (isError($result))
+ return $result;
+ if (hasData($result))
+ return success(-1);
+
+ $result = $this->_ci->StudierendenantragModel->loadWithStatusWhere([
+ 'prestudent_id' => $prestudent_id,
+ 'typ' => Studierendenantrag_model::TYP_WIEDERHOLUNG,
+ 's.studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_PAUSE
]);
if (isError($result))
return $result;
@@ -1457,15 +1583,16 @@ class AntragLib
return success($result);
}
+ /**
+ * Gets details for the latest Antrag of one or more types
+ *
+ * @param integer $prestudent_id
+ * @param array|string $typ
+ *
+ * @return \stdClass
+ */
public function getDetailsForLastAntrag($prestudent_id, $typ = null)
{
- $result = $this->_ci->PrestudentstatusModel->loadLastWithStgDetails($prestudent_id);
- if (isError($result))
- return $result;
- if (!hasData($result))
- return error($this->_ci->p->t('studierendenantrag', 'error_no_prestudentstatus', ['prestudent_id' => $prestudent_id]));
- $resultDetails = current(getData($result));
-
$where = [
'prestudent_id' => $prestudent_id
];
@@ -1494,21 +1621,20 @@ class AntragLib
'prestudent_id' => $prestudent_id
]));
- $resultDetails->status = $resultAntrag->status;
- $resultDetails->statustyp = $resultAntrag->statustyp;
- $resultDetails->grund = $resultAntrag->grund;
- $resultDetails->studierendenantrag_id = $resultAntrag->studierendenantrag_id;
- $resultDetails->typ = $resultAntrag->typ;
- $resultDetails->datum = $resultAntrag->datum;
- $resultDetails->studiensemester_kurzbz = $resultAntrag->studiensemester_kurzbz;
-
- return success($resultDetails);
+ return $this->addDetailsToAntrag($resultAntrag);
}
+ /**
+ * Gets details for a specific Antrag
+ *
+ * @param integer $studierendenantrag_id
+ *
+ * @return \stdClass
+ */
public function getDetailsForAntrag($studierendenantrag_id)
{
$where = [
- 'studierendenantrag_id' => $studierendenantrag_id
+ 's.studierendenantrag_id' => $studierendenantrag_id
];
$result = $this->_ci->StudierendenantragModel->loadWithStatusWhere($where);
@@ -1519,76 +1645,99 @@ class AntragLib
return error($this->_ci->p->t('studierendenantrag', "error_no_antrag_found", ['id' => $studierendenantrag_id]));
$resultAntrag = current(getData($result));
- $result = $this->_ci->PrestudentstatusModel->loadLastWithStgDetails($resultAntrag->prestudent_id, $resultAntrag->studiensemester_kurzbz);
+ return $this->addDetailsToAntrag($resultAntrag);
+ }
+
+ /**
+ * Helper function for getDetailsForAntrag and getDetailsForLastAntrag
+ *
+ * @param \stdClass $antrag
+ *
+ * @return \stdClass
+ */
+ protected function addDetailsToAntrag($antrag)
+ {
+ $result = $this->_ci->PrestudentstatusModel->loadLastWithStgDetails(
+ $antrag->prestudent_id,
+ $antrag->studiensemester_kurzbz,
+ $antrag->insertamum
+ );
if (isError($result))
return $result;
if (!hasData($result)) {
- $result = $this->_ci->PrestudentstatusModel->loadLastWithStgDetails($resultAntrag->prestudent_id);
+ $result = $this->_ci->PrestudentstatusModel->loadLastWithStgDetails(
+ $antrag->prestudent_id,
+ null,
+ $antrag->insertamum
+ );
if (isError($result))
return $result;
if (!hasData($result))
- return error($this->_ci->p->t('studierendenantrag', 'error_no_prestudentstatus', $resultAntrag));
+ return error($this->_ci->p->t('studierendenantrag', 'error_no_prestudent_in_sem', $antrag));
+ $tmp = current(getData($result));
+ $this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
+ $res = $this->_ci->StudiensemesterModel->load($antrag->studiensemester_kurzbz);
+ if (hasData($res))
+ $tmp->studienjahr_kurzbz = current(getData($res))->studienjahr_kurzbz;
+ else
+ $tmp->studienjahr_kurzbz = '';
+ // NOTE(chris): the semester might not be correct on this fallback so we disable it
+ $tmp->semester = '';
}
- $resultDetails = current(getData($result));
- $resultDetails->status = $resultAntrag->status;
- $resultDetails->statustyp = $resultAntrag->statustyp;
- $resultDetails->grund = $resultAntrag->grund;
- $resultDetails->studierendenantrag_id = $resultAntrag->studierendenantrag_id;
- $resultDetails->typ = $resultAntrag->typ;
- $resultDetails->dms_id = $resultAntrag->dms_id;
- $resultDetails->datum_wiedereinstieg = $resultAntrag->datum_wiedereinstieg;
+ $result = current(getData($result));
- return success($resultDetails);
+ $result->status = $antrag->status;
+ $result->statustyp = $antrag->statustyp;
+ $result->status_insertvon = $antrag->status_insertvon;
+ $result->grund = $antrag->grund;
+ $result->studierendenantrag_id = $antrag->studierendenantrag_id;
+ $result->typ = $antrag->typ;
+ $result->datum = $antrag->datum;
+ $result->dms_id = $antrag->dms_id;
+ $result->datum_wiedereinstieg = $antrag->datum_wiedereinstieg;
+
+ return success($result);
}
- public function getSemesterForUnterbrechung($studiensemester_kurzbz)
+ /**
+ * Rearrange the free semester slots for a new Unterbrechung
+ *
+ * @param integer $prestudent_id
+ * @param string $studiensemester_kurzbz
+ *
+ * @return array
+ */
+ public function getSemesterForUnterbrechung($prestudent_id, $studiensemester_kurzbz)
{
- $this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
-
- $semester = [];
-
- $result = $this->_ci->StudiensemesterModel->getNextFrom($studiensemester_kurzbz);
- if (!hasData($result))
- return $semester;
- $nextSem = current(getData($result));
-
- $semester[0] = [
- 'studiensemester_kurzbz' => $studiensemester_kurzbz,
- 'wiedereinstieg' => [$nextSem]
- ];
-
- $result = $this->_ci->StudiensemesterModel->getNextFrom($nextSem->studiensemester_kurzbz);
- if (!hasData($result))
- return $semester;
-
- $currSemester = current(getData($result));
- $followingSemester = [$currSemester];
-
- $max = $this->_ci->config->item('unterbrecher_semester_max_length');
- if(!$max || $max < 1)
- $max = 2;
-
- for ($i = 1; $i < $max; $i++) {
- $result = $this->_ci->StudiensemesterModel->getNextFrom($currSemester->studiensemester_kurzbz);
- if (!hasData($result))
- break;
- $currSemester = current(getData($result));
- $followingSemester[] = $currSemester;
- }
-
- $semester[1] = [
- 'studiensemester_kurzbz' => $nextSem->studiensemester_kurzbz,
- 'wiedereinstieg' => $followingSemester
- ];
-
- //remove last Semester of the array
- array_pop($followingSemester);
-
- foreach ($followingSemester as $sem)
- $semester[0]['wiedereinstieg'][] = $sem;
-
- return $semester;
+ $result = $this->_ci->StudierendenantragModel->getFreeSlotsForUnterbrechung($prestudent_id, $studiensemester_kurzbz);
+ if (isError($result))
+ return [];
+ $result = getData($result);
+ if (!$result)
+ return [];
+ return array_reduce($result, function ($carry, $item) {
+ if (!isset($carry[$item->von]))
+ $carry[$item->von] = [
+ 'studienjahr_kurzbz' => $item->studienjahr_kurzbz,
+ 'studiensemester_kurzbz' => $item->von,
+ 'wiedereinstieg' => [],
+ 'disabled' => true
+ ];
+
+ $carry[$item->von]['wiedereinstieg'][] = [
+ 'studiensemester_kurzbz' => $item->bis,
+ 'start' => $item->ende,
+ 'disabled' => (boolean)$item->studierendenantrag_id
+ ];
+
+ if ($carry[$item->von]['disabled'] && !$item->studierendenantrag_id) {
+ $carry[$item->von]['disabled'] = false;
+ }
+
+ return $carry;
+ }, []);
+ return $result;
}
public function getAktivePrestudentenInStgs($studiengaenge, $query)
@@ -1664,7 +1813,6 @@ class AntragLib
return error($this->_ci->p->t('studierendenantrag', 'error_no_stg_antrag', ['id' => $antrag_id]));
$stg = current($result);
- $studiengang_kz = $stg->studiengang_kz;
$semester = $stg->ausbildungssemester;
$result = $this->_ci->StudierendenantragModel->load($antrag_id);
@@ -1726,9 +1874,7 @@ class AntragLib
$result = $this->getLvsForAntrag($antrag_id);
if (hasData($result)) {
$lvs = getData($result);
- $repeat_last = false;
if (isset($lvs['repeat_last'])) {
- $repeat_last = true;
unset($lvs['repeat_last']);
$vorlage .= '_Lst';
}
@@ -1895,6 +2041,26 @@ class AntragLib
return $this->hasAccessToAntrag($antrag_id, 'student/studierendenantrag');
}
+ /**
+ * @param integer $antrag_id
+ *
+ * @return boolean
+ */
+ public function isEntitledToPauseAntrag($antrag_id)
+ {
+ return ($this->hasAccessToAntrag($antrag_id, 'student/antragfreigabe') || $this->hasAccessToAntrag($antrag_id, 'student/studierendenantrag'));
+ }
+
+ /**
+ * @param integer $antrag_id
+ *
+ * @return boolean
+ */
+ public function isEntitledToUnpauseAntrag($antrag_id)
+ {
+ return ($this->hasAccessToAntrag($antrag_id, 'student/antragfreigabe') || $this->hasAccessToAntrag($antrag_id, 'student/studierendenantrag'));
+ }
+
/**
* @param integer $antrag_id
*
@@ -1935,6 +2101,36 @@ class AntragLib
return $this->hasAccessToAntrag($antrag_id, 'student/antragfreigabe');
}
+ /**
+ * @param integer $antrag_id
+ *
+ * @return boolean
+ */
+ public function antragCanBeManualPaused($antrag_id)
+ {
+ $this->_ci->StudierendenantragModel->db->where_not_in('campus.get_status_studierendenantrag(studierendenantrag_id)', [
+ Studierendenantragstatus_model::STATUS_DEREGISTERED,
+ Studierendenantragstatus_model::STATUS_APPROVED,
+ Studierendenantragstatus_model::STATUS_PAUSE
+ ]);
+ $result = $this->_ci->StudierendenantragModel->loadWhere([
+ 'studierendenantrag_id' => $antrag_id,
+ 'typ' => Studierendenantrag_model::TYP_WIEDERHOLUNG
+ ]);
+
+ return hasData($result);
+ }
+
+ /**
+ * @param integer $antrag_id
+ *
+ * @return boolean
+ */
+ public function antragCanBeManualUnpaused($antrag_id)
+ {
+ return $this->_ci->StudierendenantragModel->isManuallyPaused($antrag_id);
+ }
+
/**
* @param integer $antrag_id
* @param string|array $status
diff --git a/application/libraries/PermissionLib.php b/application/libraries/PermissionLib.php
index 09f89abee..bf8174cf4 100755
--- a/application/libraries/PermissionLib.php
+++ b/application/libraries/PermissionLib.php
@@ -21,6 +21,8 @@ require_once(FHCPATH.'include/functions.inc.php');
require_once(FHCPATH.'include/wawi_kostenstelle.class.php');
require_once(FHCPATH.'include/benutzerberechtigung.class.php');
+use \benutzerberechtigung as benutzerberechtigung;
+
class PermissionLib
{
// Available rights in the DB
@@ -65,8 +67,10 @@ class PermissionLib
if (!is_cli())
{
// API Caller rights initialization
+ $authObj = $this->_ci->authlib->getAuthObj();
self::$bb = new benutzerberechtigung();
- self::$bb->getBerechtigungen(($this->_ci->authlib->getAuthObj())->{AuthLib::AO_USERNAME});
+ if ($authObj)
+ self::$bb->getBerechtigungen($authObj->{AuthLib::AO_USERNAME});
}
}
@@ -166,6 +170,16 @@ class PermissionLib
if ($checkPermissions === true) break;
}
}
+ elseif ($permissions[$pCounter] == Auth_Controller::PERM_ANONYMOUS)
+ {
+ $checkPermissions = true;
+ break;
+ }
+ elseif ($permissions[$pCounter] == Auth_Controller::PERM_LOGGED)
+ {
+ $checkPermissions = isLogged();
+ break;
+ }
else
{
show_error('The given permission does not use the correct format');
diff --git a/application/libraries/vertragsbestandteil/Dienstverhaeltnis.php b/application/libraries/vertragsbestandteil/Dienstverhaeltnis.php
index 5745c2196..309d3dfdc 100644
--- a/application/libraries/vertragsbestandteil/Dienstverhaeltnis.php
+++ b/application/libraries/vertragsbestandteil/Dienstverhaeltnis.php
@@ -247,7 +247,7 @@ EOTXT;
$this->validationerrors[] = 'Das Beginndatum muss vor dem Endedatum liegen.';
}
- if( $this->checkoverlap && !($this->vertragsart_kurzbz === 'werkvertrag')
+ if( $this->checkoverlap && !(in_array($this->vertragsart_kurzbz, array('werkvertrag', 'studentischehilfskr')) )
&& $ci->VertragsbestandteilLib->isOverlappingExistingDV($this) )
{
$this->validationerrors[] = 'Es existiert bereits ein überlappendes Dienstverhältnis';
diff --git a/application/libraries/vertragsbestandteil/VertragsbestandteilLib.php b/application/libraries/vertragsbestandteil/VertragsbestandteilLib.php
index 8fb3900d5..297896a02 100644
--- a/application/libraries/vertragsbestandteil/VertragsbestandteilLib.php
+++ b/application/libraries/vertragsbestandteil/VertragsbestandteilLib.php
@@ -26,30 +26,35 @@ class VertragsbestandteilLib
{
const INCLUDE_FUTURE = true;
const DO_NOT_INCLUDE_FUTURE = false;
-
+
protected $CI;
/** @var Dienstverhaeltnis_model */
protected $DienstverhaeltnisModel;
/** @var Vertragsbestandteil_model */
protected $VertragsbestandteilModel;
- /**
+ /** @var Benutzer_model */
+ protected $BenutzerModel;
+ /**
* @var GehaltsbestandteilLib
*/
protected $GehaltsbestandteilLib;
-
+
protected $loggedInUser;
-
+
public function __construct()
{
$this->loggedInUser = getAuthUID();
$this->CI = get_instance();
- $this->CI->load->model('vertragsbestandteil/Dienstverhaeltnis_model',
+ $this->CI->load->model('vertragsbestandteil/Dienstverhaeltnis_model',
'DienstverhaeltnisModel');
$this->DienstverhaeltnisModel = $this->CI->DienstverhaeltnisModel;
- $this->CI->load->model('vertragsbestandteil/Vertragsbestandteil_model',
+ $this->CI->load->model('vertragsbestandteil/Vertragsbestandteil_model',
'VertragsbestandteilModel');
$this->VertragsbestandteilModel = $this->CI->VertragsbestandteilModel;
- $this->CI->load->library('vertragsbestandteil/GehaltsbestandteilLib',
+ $this->CI->load->model('person/benutzer_model',
+ 'BenutzerModel');
+ $this->BenutzerModel = $this->CI->BenutzerModel;
+ $this->CI->load->library('vertragsbestandteil/GehaltsbestandteilLib',
null, 'GehaltsbestandteilLib');
$this->GehaltsbestandteilLib = $this->CI->GehaltsbestandteilLib;
}
@@ -63,49 +68,54 @@ class VertragsbestandteilLib
} catch (Exception $ex)
{
log_message('debug', "Error handling json data from GUI. " . $ex->getMessage());
- }
+ }
return $ret;
}
+ public function fetchDienstverhaeltnisse($unternehmen, $stichtag=null, $mitarbeiteruid=null) {
+ $dvs = $this->DienstverhaeltnisModel->fetchDienstverhaeltnisse($unternehmen, $stichtag, $mitarbeiteruid);
+ return $dvs;
+ }
+
public function fetchDienstverhaeltnis($dienstverhaeltnis_id)
{
$result = $this->DienstverhaeltnisModel->load($dienstverhaeltnis_id);
$dv = null;
- if(null !== ($row = getData($result)))
+ if(null !== ($row = getData($result)))
{
$dv = new Dienstverhaeltnis();
$dv->hydrateByStdClass($row[0], true);
}
return $dv;
}
-
+
public function fetchVertragsbestandteile($dienstverhaeltnis_id, $stichtag=null, $includefuture=false)
{
$vbs = $this->VertragsbestandteilModel->getVertragsbestandteile($dienstverhaeltnis_id, $stichtag, $includefuture);
$gbs = $this->GehaltsbestandteilLib->fetchGehaltsbestandteile($dienstverhaeltnis_id, $stichtag, $includefuture);
-
+
$gbsByVBid = array();
- foreach( $gbs as $gb )
+ foreach( $gbs as $gb )
{
- if( intval($gb->getVertragsbestandteil_id()) > 0 )
+ if( intval($gb->getVertragsbestandteil_id()) > 0 )
{
- if( !isset($gbsByVBid[$gb->getVertragsbestandteil_id()])
+ if( !isset($gbsByVBid[$gb->getVertragsbestandteil_id()])
|| !is_array($gbsByVBid[$gb->getVertragsbestandteil_id()]) ) {
$gbsByVBid[$gb->getVertragsbestandteil_id()] = array();
}
$gbsByVBid[$gb->getVertragsbestandteil_id()][] = $gb;
}
}
-
+
foreach ($vbs as $vb)
{
- if( isset($gbsByVBid[$vb->getVertragsbestandteil_id()]) )
+ if( isset($gbsByVBid[$vb->getVertragsbestandteil_id()]) )
{
$vb->setGehaltsbestandteile($gbsByVBid[$vb->getVertragsbestandteil_id()]);
}
}
-
+
return $vbs;
}
@@ -113,22 +123,22 @@ class VertragsbestandteilLib
{
return $this->VertragsbestandteilModel->getVertragsbestandteil($vertragsbestandteil_id);
}
-
+
public function storeDienstverhaeltnis(Dienstverhaeltnis $dv)
{
if( intval($dv->getDienstverhaeltnis_id()) > 0 )
{
$this->updateDienstverhaeltnis($dv);
}
- else
+ else
{
- $this->insertDienstverhaeltnis($dv);
+ $this->insertDienstverhaeltnis($dv);
}
}
-
- public function storeVertragsbestandteil(Vertragsbestandteil $vertragsbestandteil)
+
+ public function storeVertragsbestandteil(Vertragsbestandteil $vertragsbestandteil)
{
- $this->CI->db->trans_begin();
+ $this->CI->db->trans_begin();
try
{
$this->setUIDtoPGSQL();
@@ -144,7 +154,7 @@ class VertragsbestandteilLib
{
log_message('debug', "Transaction failed");
throw new Exception("Transaction failed");
- }
+ }
$this->CI->db->trans_commit();
}
catch (Exception $ex)
@@ -152,7 +162,7 @@ class VertragsbestandteilLib
log_message('debug', "Transaction rolled back. " . $ex->getMessage());
$this->CI->db->trans_rollback();
throw new Exception('Storing Vertragsbestandteil failed.');
- }
+ }
}
public function deleteDienstverhaeltnis(Dienstverhaeltnis $dv)
@@ -220,13 +230,13 @@ class VertragsbestandteilLib
throw new Exception('Delete Vertragsbestandteil failed.');
}
}
-
+
protected function insertDienstverhaeltnis(Dienstverhaeltnis $dv)
{
$dv->setInsertvon($this->loggedInUser)
->setInsertamum(strftime('%Y-%m-%d %H:%M:%S'));
$ret = $this->DienstverhaeltnisModel->insert($dv->toStdClass());
- if( hasData($ret) )
+ if( hasData($ret) )
{
$dv->setDienstverhaeltnis_id(getData($ret));
}
@@ -235,14 +245,14 @@ class VertragsbestandteilLib
throw new Exception('error inserting dienstverhaeltnis');
}
}
-
+
protected function insertVertragsbestandteil(Vertragsbestandteil $vertragsbestandteil)
{
$vertragsbestandteil->setInsertvon($this->loggedInUser)
->setInsertamum(strftime('%Y-%m-%d %H:%M:%S'));
$vertragsbestandteil->beforePersist();
$ret = $this->VertragsbestandteilModel->insert($vertragsbestandteil->baseToStdClass());
- if( hasData($ret) )
+ if( hasData($ret) )
{
$vertragsbestandteil->setVertragsbestandteil_id(getData($ret));
}
@@ -254,19 +264,19 @@ class VertragsbestandteilLib
$specialisedModel = VertragsbestandteilFactory::getVertragsbestandteilDBModel(
$vertragsbestandteil->getVertragsbestandteiltyp_kurzbz());
$retspecial = $specialisedModel->insert($vertragsbestandteil->toStdClass());
-
+
if(isError($retspecial) )
{
- throw new Exception('error updating vertragsbestandteil '
+ throw new Exception('error updating vertragsbestandteil '
. $vertragsbestandteil->getVertragsbestandteiltyp_kurzbz());
}
-
- try
+
+ try
{
$gehaltsbestandteile = $vertragsbestandteil->getGehaltsbestandteile();
$this->GehaltsbestandteilLib->storeGehaltsbestandteile($gehaltsbestandteile);
- }
- catch(Exception $ex)
+ }
+ catch(Exception $ex)
{
throw new Exception('VertragsbestandteilLib insertVertragsbestandteil '
. 'failed to store Gehaltsbestandteile. ' . $ex->getMessage());
@@ -278,7 +288,7 @@ class VertragsbestandteilLib
if(!$dv->isDirty()) {
return;
}
-
+
$dv->setUpdatevon($this->loggedInUser)
->setUpdateamum(strftime('%Y-%m-%d %H:%M:%S'));
$ret = $this->DienstverhaeltnisModel->update($dv->getDienstverhaeltnis_id(),
@@ -288,20 +298,20 @@ class VertragsbestandteilLib
throw new Exception('error updating dienstverhaeltnis');
}
}
-
+
private function deleteVertragsbestandteilHelper(Vertragsbestandteil $vertragsbestandteil)
{
$specialisedModel = VertragsbestandteilFactory::getVertragsbestandteilDBModel(
$vertragsbestandteil->getVertragsbestandteiltyp_kurzbz());
$retspecial = $specialisedModel->delete($vertragsbestandteil->getVertragsbestandteil_id());
-
+
if(isError($retspecial) )
{
throw new Exception('error deleting vertragsbestandteil '
. $vertragsbestandteil->getVertragsbestandteiltyp_kurzbz());
}
-
+
try
{
$gehaltsbestandteile = $vertragsbestandteil->getGehaltsbestandteile();
@@ -320,76 +330,118 @@ class VertragsbestandteilLib
{
throw new Exception('error deleting vertragsbestandteil');
}
-
+
$vertragsbestandteil->afterDelete();
}
protected function updateVertragsbestandteil(Vertragsbestandteil $vertragsbestandteil)
{
- if($vertragsbestandteil->isDirty()) {
+ if($vertragsbestandteil->isDirty()) {
$vertragsbestandteil->setUpdatevon($this->loggedInUser)
->setUpdateamum(strftime('%Y-%m-%d %H:%M:%S'));
$vertragsbestandteil->beforePersist();
$basedata = $vertragsbestandteil->baseToStdClass();
- if( count((array) $basedata) > 0 )
+ if( count((array) $basedata) > 0 )
{
$ret = $this->VertragsbestandteilModel->update(
- $vertragsbestandteil->getVertragsbestandteil_id(),
+ $vertragsbestandteil->getVertragsbestandteil_id(),
$basedata);
if(isError($ret) )
{
throw new Exception('error updating vertragsbestandteil');
- }
+ }
}
$specialisedData = $vertragsbestandteil->toStdClass();
- if( count((array) $specialisedData) > 0 )
+ if( count((array) $specialisedData) > 0 )
{
$specialisedModel = VertragsbestandteilFactory::getVertragsbestandteilDBModel(
$vertragsbestandteil->getVertragsbestandteiltyp_kurzbz());
$retspecial = $specialisedModel->update(
- $vertragsbestandteil->getVertragsbestandteil_id(),
+ $vertragsbestandteil->getVertragsbestandteil_id(),
$specialisedData);
if(isError($retspecial) )
{
- throw new Exception('error updating vertragsbestandteil '
+ throw new Exception('error updating vertragsbestandteil '
. $vertragsbestandteil->getVertragsbestandteiltyp_kurzbz());
}
}
}
-
- try
+
+ try
{
$gehaltsbestandteile = $vertragsbestandteil->getGehaltsbestandteile();
$this->GehaltsbestandteilLib->storeGehaltsbestandteile($gehaltsbestandteile);
- }
- catch(Exception $ex)
+ }
+ catch(Exception $ex)
{
throw new Exception('VertragsbestandteilLib updateVertragsbestandteil '
. 'failed to store Gehaltsbestandteile. ' . $ex->getMessage());
}
}
-
- public function isOverlappingExistingDV(Dienstverhaeltnis $dv)
+
+ public function isOverlappingExistingDV(Dienstverhaeltnis $dv)
{
return $this->DienstverhaeltnisModel->isOverlappingExistingDV(
- $dv->getMitarbeiter_uid(),
- $dv->getOe_kurzbz(),
- $dv->getVon(),
+ $dv->getMitarbeiter_uid(),
+ $dv->getOe_kurzbz(),
+ $dv->getVon(),
$dv->getBis(),
$dv->getDienstverhaeltnis_id()
);
}
-
+
+ protected function hasOtherActiveDV(Dienstverhaeltnis $dv, $duedate)
+ {
+ $hasotheractivedv = false;
+ $result = $this->DienstverhaeltnisModel->getDVByPersonUID($dv->getMitarbeiter_uid(), null, $duedate);
+ $dvs = getData($result);
+ foreach ($dvs as $tmpdv)
+ {
+ if(intval($tmpdv->dienstverhaeltnis_id) !== intval($dv->getDienstverhaeltnis_id()))
+ {
+ $hasotheractivedv = true;
+ break;
+ }
+ }
+ return $hasotheractivedv;
+ }
+
+ /**
+ * like endDienstverhaeltnis, but also sets aktiv flag to false
+ */
+ public function deactivateDienstverhaeltnis(Dienstverhaeltnis $dv, $enddate, $deactivate)
+ {
+ $result = $this->endDienstverhaeltnis($dv, $enddate);
+ if ( $result === true)
+ {
+ if (!$deactivate) return $result;
+
+ if(!$this->hasOtherActiveDV($dv, $enddate))
+ {
+ $result = $this->BenutzerModel->update(
+ array('uid' => $dv->getMitarbeiter_uid()),
+ array(
+ 'aktiv' => false,
+ 'updateaktivam' => date('Y-m-d'),
+ 'updateaktivvon' => $this->loggedInUser
+ )
+ );
+ }
+ }
+
+ return $result;
+ }
+
public function endDienstverhaeltnis(Dienstverhaeltnis $dv, $enddate)
{
- if( $dv->getBis() !== null && $dv->getBis() < $enddate )
+ if( $dv->getBis() !== null && $dv->getBis() < $enddate )
{
return 'Dienstverhältnis ist bereits beendet.';
}
-
+
$this->CI->db->trans_begin();
try
{
@@ -401,13 +453,13 @@ class VertragsbestandteilLib
{
$this->GehaltsbestandteilLib->endGehaltsbestandteil($gb, $enddate);
}
-
+
$vbs = $this->fetchVertragsbestandteile($dv->getDienstverhaeltnis_id());
foreach ($vbs as $vb)
{
$this->endVertragsbestandteil($vb, $enddate);
- }
-
+ }
+
$dv->setBis($enddate);
$this->updateDienstverhaeltnis($dv);
@@ -428,23 +480,23 @@ class VertragsbestandteilLib
}
return true;
}
-
+
public function endVertragsbestandteil(Vertragsbestandteil $vertragsbestandteil, $enddate)
{
- if( $vertragsbestandteil->getBis() !== null && $vertragsbestandteil->getBis() < $enddate )
+ if( $vertragsbestandteil->getBis() !== null && $vertragsbestandteil->getBis() < $enddate )
{
return;
}
-
+
$vertragsbestandteil->setBis($enddate);
$this->updateVertragsbestandteil($vertragsbestandteil);
}
-
+
protected function setUIDtoPGSQL() {
$ret = $this->VertragsbestandteilModel
- ->execReadOnlyQuery('SET LOCAL pv21.uid TO \''
+ ->execReadOnlyQuery('SET LOCAL pv21.uid TO \''
. $this->loggedInUser . '\'');
- if(isError($ret))
+ if(isError($ret))
{
throw new Exception('error setting uid to pgsql');
}
diff --git a/application/models/codex/Bismeldestichtag_model.php b/application/models/codex/Bismeldestichtag_model.php
index 1a45f0fbd..6ab755c8b 100644
--- a/application/models/codex/Bismeldestichtag_model.php
+++ b/application/models/codex/Bismeldestichtag_model.php
@@ -11,4 +11,25 @@ class Bismeldestichtag_model extends DB_Model
$this->dbTable = 'bis.tbl_bismeldestichtag';
$this->pk = 'meldestichtag_id';
}
+
+ /**
+ * Gets last Bismeldestichtag for a Studiensemester.
+ * @param $studiensemester_kurzbz
+ * @return object success or error
+ */
+ public function getByStudiensemester($studiensemester_kurzbz)
+ {
+ $query = '
+ SELECT
+ meldestichtag
+ FROM
+ bis.tbl_bismeldestichtag
+ JOIN public.tbl_studiensemester USING (studiensemester_kurzbz)
+ WHERE
+ studiensemester_kurzbz = ?
+ ORDER BY meldestichtag DESC
+ LIMIT 1';
+
+ return $this->execQuery($query, array($studiensemester_kurzbz));
+ }
}
diff --git a/application/models/crm/Prestudentstatus_model.php b/application/models/crm/Prestudentstatus_model.php
index e5f043358..30e4f1a42 100755
--- a/application/models/crm/Prestudentstatus_model.php
+++ b/application/models/crm/Prestudentstatus_model.php
@@ -338,7 +338,7 @@ class Prestudentstatus_model extends DB_Model
return $this->loadWhere($where);
}
- public function loadLastWithStgDetails($prestudent_id, $studiensemester_kurzbz = null)
+ public function loadLastWithStgDetails($prestudent_id, $studiensemester_kurzbz = null, $max_date = null)
{
$this->load->config('studierendenantrag');
@@ -375,7 +375,8 @@ class Prestudentstatus_model extends DB_Model
$this->addLimit(1);
- $this->db->where_in($this->dbTable . '.status_kurzbz', $this->config->item('antrag_prestudentstatus_whitelist'));
+ if ($max_date)
+ $this->db->where($this->dbTable . '.insertamum <', $max_date);
$whereArr = [
$this->dbTable . '.prestudent_id' => $prestudent_id,
diff --git a/application/models/education/Pruefung_model.php b/application/models/education/Pruefung_model.php
index 217915ff1..3ecb3e3d2 100755
--- a/application/models/education/Pruefung_model.php
+++ b/application/models/education/Pruefung_model.php
@@ -116,7 +116,13 @@ class Pruefung_model extends DB_Model
$this->addJoin('public.tbl_person pers', 'person_id');
$this->addJoin('public.tbl_benutzer b', 's.student_uid=b.uid');
$this->addJoin('public.tbl_studiengang g', 'ps.studiengang_kz=g.studiengang_kz');
- $this->addJoin('public.tbl_prestudentstatus pss', 'pss.prestudent_id=ps.prestudent_id AND pss.studiensemester_kurzbz=le.studiensemester_kurzbz AND pss.status_kurzbz=get_rolle_prestudent(ps.prestudent_id, le.studiensemester_kurzbz)', 'LEFT');
+ $this->addJoin(
+ 'public.tbl_prestudentstatus pss',
+ 'pss.prestudent_id=ps.prestudent_id
+ AND pss.studiensemester_kurzbz=le.studiensemester_kurzbz
+ AND pss.status_kurzbz=get_rolle_prestudent(ps.prestudent_id, le.studiensemester_kurzbz)',
+ 'LEFT'
+ );
$this->addJoin('lehre.tbl_studienplan plan', 'studienplan_id', 'LEFT');
$this->addJoin('bis.tbl_orgform o', 'COALESCE(plan.orgform_kurzbz, pss.orgform_kurzbz, g.orgform_kurzbz)=o.orgform_kurzbz');
$this->db->join('campus.tbl_studierendenantrag a', 'ps.prestudent_id=a.prestudent_id and a.typ = ?', 'LEFT', false);
@@ -196,6 +202,7 @@ class Pruefung_model extends DB_Model
$this->addSelect('a.studierendenantrag_id');
$this->addSelect('a.typ');
$this->addSelect('campus.get_status_studierendenantrag(a.studierendenantrag_id) status');
+ $this->addSelect('pss.ausbildungssemester');
$this->addJoin('lehre.tbl_lehreinheit le', 'lehreinheit_id');
$this->addJoin('lehre.tbl_lehrveranstaltung lv', 'lehrveranstaltung_id');
@@ -204,12 +211,20 @@ class Pruefung_model extends DB_Model
$this->addJoin('public.tbl_person pers', 'person_id');
$this->addJoin('public.tbl_benutzer b', 's.student_uid=b.uid');
$this->addJoin('public.tbl_studiengang g', 'ps.studiengang_kz=g.studiengang_kz');
- $this->addJoin('public.tbl_prestudentstatus pss', 'pss.prestudent_id=ps.prestudent_id AND pss.studiensemester_kurzbz=le.studiensemester_kurzbz AND pss.status_kurzbz=get_rolle_prestudent(ps.prestudent_id, le.studiensemester_kurzbz)', 'LEFT');
+ $this->addJoin(
+ 'public.tbl_prestudentstatus pss',
+ 'pss.prestudent_id=ps.prestudent_id
+ AND pss.studiensemester_kurzbz=le.studiensemester_kurzbz
+ AND pss.status_kurzbz=get_rolle_prestudent(ps.prestudent_id, le.studiensemester_kurzbz)',
+ 'LEFT'
+ );
$this->addJoin('lehre.tbl_studienplan plan', 'studienplan_id', 'LEFT');
$this->addJoin('bis.tbl_orgform o', 'COALESCE(plan.orgform_kurzbz, pss.orgform_kurzbz, g.orgform_kurzbz)=o.orgform_kurzbz');
- $this->addJoin('campus.tbl_studierendenantrag a', 'ps.prestudent_id=a.prestudent_id and a.typ=' . $this->escape(Studierendenantrag_model::TYP_WIEDERHOLUNG), 'LEFT');
-
- $this->db->where_in("get_rolle_prestudent(ps.prestudent_id, null)", $this->config->item('antrag_prestudentstatus_whitelist'));
+ $this->addJoin(
+ 'campus.tbl_studierendenantrag a',
+ 'ps.prestudent_id=a.prestudent_id and a.typ=' . $this->escape(Studierendenantrag_model::TYP_WIEDERHOLUNG),
+ 'LEFT'
+ );
$this->db->where("g.aktiv", true);
@@ -267,6 +282,8 @@ class Pruefung_model extends DB_Model
$this->db->where("b.aktiv", true);
+ $this->db->where_in("get_rolle_prestudent(ps.prestudent_id, null)", $this->config->item('antrag_prestudentstatus_whitelist'));
+
if (is_array($status)) {
if (in_array(null, $status)) {
$status = array_filter($status);
diff --git a/application/models/education/Studierendenantrag_model.php b/application/models/education/Studierendenantrag_model.php
index ea481ebef..e138d1a1c 100755
--- a/application/models/education/Studierendenantrag_model.php
+++ b/application/models/education/Studierendenantrag_model.php
@@ -46,6 +46,8 @@ class Studierendenantrag_model extends DB_Model
$this->addSelect('datum_wiedereinstieg');
$this->addSelect($this->dbTable . '.typ');
$this->addSelect('st.studierendenantrag_statustyp_kurzbz as status');
+ $this->addSelect('s.insertvon as status_insertvon');
+ $this->addSelect('s.insertamum as status_insertamum');
$this->addSelect('dms_id');
$this->addSelect('st.bezeichnung[(' . $sql . ')] as statustyp');
@@ -54,7 +56,13 @@ class Studierendenantrag_model extends DB_Model
$this->addJoin('public.tbl_person', 'person_id');
$this->addJoin('public.tbl_studiengang stg', 'p.studiengang_kz=stg.studiengang_kz');
$this->addJoin('public.tbl_studiensemester ss', 'studiensemester_kurzbz');
- $this->addJoin('public.tbl_prestudentstatus ps', 'ps.prestudent_id=p.prestudent_id AND ps.studiensemester_kurzbz=ss.studiensemester_kurzbz AND ps.status_kurzbz=get_rolle_prestudent(p.prestudent_id, ss.studiensemester_kurzbz)', 'LEFT');
+ $this->addJoin(
+ 'public.tbl_prestudentstatus ps',
+ 'ps.prestudent_id=p.prestudent_id
+ AND ps.studiensemester_kurzbz=ss.studiensemester_kurzbz
+ AND ps.status_kurzbz=get_rolle_prestudent(p.prestudent_id, ss.studiensemester_kurzbz)',
+ 'LEFT'
+ );
$this->addJoin('lehre.tbl_studienplan plan', 'studienplan_id', 'LEFT');
$this->addJoin('bis.tbl_orgform of', 'of.orgform_kurzbz=COALESCE(plan.orgform_kurzbz, ps.orgform_kurzbz, stg.orgform_kurzbz)');
$this->addJoin(
@@ -76,7 +84,9 @@ class Studierendenantrag_model extends DB_Model
public function loadActiveForStudiengaenge($studiengaenge)
{
- // NOTE(chris): get language before changing things in the global db object because getUserLanguage() might use it and it should not have been tampered with
+ // NOTE(chris): get language before changing things in the global
+ // db object because getUserLanguage() might use it and it should
+ // not have been tampered with
$sql = "SELECT index FROM public.tbl_sprache WHERE sprache='" . getUserLanguage() . "' LIMIT 1";
$this->db->group_start();
@@ -85,7 +95,8 @@ class Studierendenantrag_model extends DB_Model
Studierendenantragstatus_model::STATUS_APPROVED,
Studierendenantragstatus_model::STATUS_REJECTED,
Studierendenantragstatus_model::STATUS_OBJECTION_DENIED,
- Studierendenantragstatus_model::STATUS_DEREGISTERED
+ Studierendenantragstatus_model::STATUS_DEREGISTERED,
+ Studierendenantragstatus_model::STATUS_PAUSE
]);
$this->db->or_group_start();
$this->db->where('s.studierendenantrag_statustyp_kurzbz', Studierendenantragstatus_model::STATUS_APPROVED);
@@ -133,12 +144,18 @@ class Studierendenantrag_model extends DB_Model
$lang = 'SELECT index FROM public.tbl_sprache WHERE sprache=' . $this->escape(getUserLanguage());
$this->addSelect('*');
- $this->addSelect('campus.get_status_studierendenantrag(studierendenantrag_id) status');
+ $this->addSelect($this->dbTable . '.grund AS grund');
+ $this->addSelect('s.studierendenantrag_statustyp_kurzbz status');
+ $this->addSelect('s.insertvon status_insertvon');
$this->addSelect('t.bezeichnung[(' . $lang . ')] statustyp');
+ $this->addJoin(
+ 'campus.tbl_studierendenantrag_status s',
+ 'campus.get_status_id_studierendenantrag(' . $this->dbTable . '.studierendenantrag_id)=s.studierendenantrag_status_id'
+ );
$this->addJoin(
'campus.tbl_studierendenantrag_statustyp t',
- 'campus.get_status_studierendenantrag(studierendenantrag_id)=t.studierendenantrag_statustyp_kurzbz'
+ 's.studierendenantrag_statustyp_kurzbz=t.studierendenantrag_statustyp_kurzbz'
);
if ($types && is_array($types)) {
@@ -168,7 +185,11 @@ class Studierendenantrag_model extends DB_Model
$this->addJoin(
'public.tbl_prestudentstatus s',
- $this->dbTable . '.prestudent_id=s.prestudent_id AND ' . $this->dbTable . '.studiensemester_kurzbz=s.studiensemester_kurzbz'
+ $this->dbTable . '.prestudent_id=s.prestudent_id
+ AND ' .
+ $this->dbTable . '.studiensemester_kurzbz=s.studiensemester_kurzbz
+ AND ' .
+ $this->dbTable . '.insertamum > s.insertamum'
);
$this->addJoin('public.tbl_prestudent p', $this->dbTable . '.prestudent_id=p.prestudent_id');
$this->addJoin('public.tbl_studiengang stg', 'studiengang_kz', 'LEFT');
@@ -180,8 +201,6 @@ class Studierendenantrag_model extends DB_Model
$this->addLimit(1);
- $this->db->where_in('s.status_kurzbz', $this->config->item('antrag_prestudentstatus_whitelist'));
-
return $this->loadWhere([
$this->pk => $antrag_id
]);
@@ -233,20 +252,45 @@ class Studierendenantrag_model extends DB_Model
$this->addSelect($this->dbTable . '.datum_wiedereinstieg');
$this->addSelect($this->dbTable . '.grund');
$this->addSelect($this->dbTable . '.dms_id');
- $this->addSelect("(SELECT count(1) FROM campus.tbl_studierendenantrag_status WHERE studierendenantrag_id = " . $this->dbTable . ".studierendenantrag_id AND studierendenantrag_statustyp_kurzbz = 'Genehmigt') AS isapproved", false);
+ $this->addSelect('s.insertvon AS status_insertvon');
+ $this->addSelect(
+ "(SELECT count(1) FROM campus.tbl_studierendenantrag_status WHERE studierendenantrag_id = " .
+ $this->dbTable .
+ ".studierendenantrag_id AND studierendenantrag_statustyp_kurzbz = 'Genehmigt') AS isapproved",
+ false
+ );
$this->addJoin('public.tbl_prestudent p', 'prestudent_id', 'RIGHT');
$this->addJoin('public.tbl_studiengang stg', 'p.studiengang_kz=stg.studiengang_kz');
- $this->addJoin('public.tbl_prestudentstatus ps', 'ps.prestudent_id=p.prestudent_id AND ps.studiensemester_kurzbz=' . $this->dbTable . '.studiensemester_kurzbz AND ps.status_kurzbz=get_rolle_prestudent(p.prestudent_id, ' . $this->dbTable . '.studiensemester_kurzbz)', 'LEFT');
+ $this->addJoin(
+ 'public.tbl_prestudentstatus ps',
+ 'ps.prestudent_id=p.prestudent_id AND ps.studiensemester_kurzbz=' .
+ $this->dbTable .
+ '.studiensemester_kurzbz AND ps.status_kurzbz=get_rolle_prestudent(p.prestudent_id, ' .
+ $this->dbTable .
+ '.studiensemester_kurzbz)',
+ 'LEFT'
+ );
$this->addJoin('lehre.tbl_studienplan plan', 'studienplan_id', 'LEFT');
$this->addJoin('bis.tbl_orgform of', 'of.orgform_kurzbz=COALESCE(plan.orgform_kurzbz, ps.orgform_kurzbz, stg.orgform_kurzbz)');
+ $this->addJoin(
+ 'campus.tbl_studierendenantrag_status s',
+ 'campus.get_status_id_studierendenantrag(' . $this->dbTable . '.studierendenantrag_id)=s.studierendenantrag_status_id',
+ 'LEFT'
+ );
$this->addJoin(
'campus.tbl_studierendenantrag_statustyp st',
- 'campus.get_status_studierendenantrag(studierendenantrag_id)=st.studierendenantrag_statustyp_kurzbz',
+ 's.studierendenantrag_statustyp_kurzbz=st.studierendenantrag_statustyp_kurzbz',
'LEFT'
);
- $this->db->where("(SELECT status_kurzbz FROM public.tbl_prestudentstatus WHERE prestudent_id=p.prestudent_id AND status_kurzbz='Student' LIMIT 1) IS NOT NULL", null, false);
+ $this->db->where("(
+ SELECT status_kurzbz
+ FROM public.tbl_prestudentstatus
+ WHERE prestudent_id=p.prestudent_id
+ AND status_kurzbz='Student'
+ LIMIT 1
+ ) IS NOT NULL", null, false);
return $this->loadWhere([
@@ -287,4 +331,144 @@ class Studierendenantrag_model extends DB_Model
return $this->loadWhere($where);
}
+
+ /**
+ * Checks if the Prestudent has an active Unterbrechung between
+ * the start of the given semester and the given enddate.
+ * If the enddate is omitted the end of the given semester is used.
+ *
+ * @param integer $prestudent_id
+ * @param string $studiensemester_kurzbz
+ * @param string $enddate (optional)
+ *
+ * @return boolean
+ */
+ public function hasRunningUnterbrechungBetween($prestudent_id, $studiensemester, $enddate = null)
+ {
+ $start = '(SELECT start FROM public.tbl_studiensemester WHERE studiensemester_kurzbz=' . $this->db->escape($studiensemester) . ')';
+ $end = $enddate
+ ? $this->db->escape($enddate)
+ : '(SELECT ende FROM public.tbl_studiensemester WHERE studiensemester_kurzbz=' . $this->db->escape($studiensemester) . ')';
+
+ $this->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz');
+ $this->db->where([
+ 'prestudent_id' => $prestudent_id,
+ 'typ' => Studierendenantrag_model::TYP_UNTERBRECHUNG,
+ 'campus.get_status_studierendenantrag(studierendenantrag_id) !=' => Studierendenantragstatus_model::STATUS_CANCELLED,
+ 'start < ' . $end => null,
+ 'datum_wiedereinstieg > ' . $start => null,
+ ]);
+ return (boolean)$this->db->count_all_results($this->dbTable);
+ }
+
+ /**
+ * Gets free semester slots for a new Unterbrechung.
+ *
+ * @param integer $prestudent_id
+ * @param string $studiensemester_kurzbz (optional)
+ *
+ * @return stdClass
+ */
+ public function getFreeSlotsForUnterbrechung($prestudent_id, $studiensemester = null)
+ {
+ $max_starters = 2;
+ $max_length = max(
+ 2,
+ (integer)$this->config->item('unterbrecher_semester_max_length')
+ );
+
+
+ $subquery = '';
+ if ($studiensemester)
+ $subquery = 'SELECT start FROM public.tbl_studiensemester WHERE studiensemester_kurzbz=?';
+ else
+ $subquery = 'SELECT start FROM public.tbl_studiensemester WHERE studiensemester_kurzbz=public.get_stdsem_prestudent (?, null)';
+
+ $sql = "WITH numbered_sems AS (
+ SELECT
+ a.studienjahr_kurzbz AS studienjahr_kurzbz,
+ a.studiensemester_kurzbz AS von,
+ b.studiensemester_kurzbz AS bis,
+ a.start AS start,
+ b.start AS ende,
+ ROW_NUMBER() OVER (
+ PARTITION BY a.studiensemester_kurzbz
+ ORDER BY b.start
+ ) AS row_number
+ FROM public.tbl_studiensemester a
+ LEFT JOIN public.tbl_studiensemester b ON (b.start > a.ende)
+ ),
+ last_sems AS (
+ SELECT *
+ FROM numbered_sems
+ WHERE numbered_sems.row_number <= ?
+ )
+ SELECT s.von, s.bis, s.start, s.ende, studierendenantrag_id, studienjahr_kurzbz
+ FROM last_sems s
+ LEFT JOIN (
+ SELECT studierendenantrag_id, start, datum_wiedereinstieg AS ende
+ FROM campus.tbl_studierendenantrag
+ LEFT JOIN public.tbl_studiensemester USING(studiensemester_kurzbz)
+ WHERE typ=?
+ AND campus.get_status_studierendenantrag(studierendenantrag_id) != ?
+ AND prestudent_id=?
+ ) a ON (s.start < a.ende AND s.ende > a.start)
+ WHERE s.start >= (" . $subquery . ")
+ ORDER BY s.start, s.ende
+ LIMIT ?;";
+
+ return $this->execQuery($sql, [
+ $max_length,
+ self::TYP_UNTERBRECHUNG,
+ Studierendenantragstatus_model::STATUS_CANCELLED,
+ $prestudent_id,
+ $studiensemester ?: $prestudent_id,
+ $max_length * $max_starters
+ ]);
+ }
+
+ /**
+ * Returns if an Antrag is manually paused
+ *
+ * @param integer $antrag_id
+ *
+ * @return boolean
+ */
+ public function isManuallyPaused($antrag_id)
+ {
+ $this->addJoin(
+ 'campus.tbl_studierendenantrag_status s',
+ 'campus.get_status_id_studierendenantrag(' . $this->dbTable . '.studierendenantrag_id)=s.studierendenantrag_status_id'
+ );
+
+ $this->db->where([
+ 's.studierendenantrag_id' => $antrag_id,
+ 's.studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_PAUSE
+ ]);
+
+ $this->db->group_start();
+ $this->db->where_not_in('s.insertvon', [
+ Studierendenantragstatus_model::INSERTVON_DEREGISTERED,
+ Studierendenantragstatus_model::INSERTVON_ABMELDUNGSTGL
+ ]);
+ $this->db->or_group_start();
+ $this->db->where('s.insertvon', Studierendenantragstatus_model::INSERTVON_ABMELDUNGSTGL);
+ $this->db->where('1 !=', '(
+ SELECT COUNT(*)%2
+ FROM campus.tbl_studierendenantrag_status i
+ WHERE i.studierendenantrag_id = s.studierendenantrag_id
+ AND i.insertamum > (
+ SELECT ii.insertamum
+ FROM campus.tbl_studierendenantrag_status ii
+ WHERE ii.studierendenantrag_id = s.studierendenantrag_id
+ AND ii.insertvon <> ' . $this->escape(Studierendenantragstatus_model::INSERTVON_ABMELDUNGSTGL) . '
+ ORDER BY ii.insertamum DESC
+ LIMIT 1
+ )
+ )', false);
+ $this->db->group_end();
+ $this->db->group_end();
+
+ return hasData($this->load());
+ }
}
diff --git a/application/models/education/Studierendenantragstatus_model.php b/application/models/education/Studierendenantragstatus_model.php
index c134cc4ee..cf9cce1be 100755
--- a/application/models/education/Studierendenantragstatus_model.php
+++ b/application/models/education/Studierendenantragstatus_model.php
@@ -15,6 +15,10 @@ class Studierendenantragstatus_model extends DB_Model
const STATUS_OBJECTED = 'Beeinsprucht';
const STATUS_OBJECTION_DENIED = 'EinspruchAbgelehnt';
const STATUS_DEREGISTERED = 'Abgemeldet';
+ const STATUS_PAUSE = 'Pause';
+
+ const INSERTVON_ABMELDUNGSTGL = "AbmeldungStgl";
+ const INSERTVON_DEREGISTERED = "Studienabbruch";
/**
* Constructor
@@ -49,4 +53,157 @@ class Studierendenantragstatus_model extends DB_Model
return $this->loadWhere($where);
}
+
+ public function stopAntraegeForAbmeldungStgl($antrag_id)
+ {
+ $sql = 'INSERT INTO campus.tbl_studierendenantrag_status
+ (studierendenantrag_id, studierendenantrag_statustyp_kurzbz, insertvon, insertamum)
+ SELECT studierendenantrag_id, ?, ?, (
+ SELECT insertamum
+ FROM campus.tbl_studierendenantrag_status
+ WHERE studierendenantrag_status_id = campus.get_status_id_studierendenantrag(?)
+ )
+ FROM campus.tbl_studierendenantrag
+ WHERE prestudent_id = (
+ SELECT prestudent_id
+ FROM campus.tbl_studierendenantrag
+ WHERE studierendenantrag_id = ?
+ )
+ AND studierendenantrag_id <> ?
+ AND (
+ (
+ typ = ?
+ AND campus.get_status_studierendenantrag(studierendenantrag_id) IN ?
+ ) OR (
+ typ = ?
+ AND campus.get_status_studierendenantrag(studierendenantrag_id) IN ?
+ ) OR (
+ typ = ?
+ AND campus.get_status_studierendenantrag(studierendenantrag_id) IN ?
+ )
+ )';
+
+ return $this->execQuery($sql, [
+ self::STATUS_PAUSE,
+ self::INSERTVON_ABMELDUNGSTGL,
+ $antrag_id,
+ $antrag_id,
+ $antrag_id,
+ Studierendenantrag_model::TYP_ABMELDUNG,
+ [
+ Studierendenantragstatus_model::STATUS_CREATED
+ ],
+ Studierendenantrag_model::TYP_UNTERBRECHUNG,
+ [
+ Studierendenantragstatus_model::STATUS_CREATED
+ ],
+ Studierendenantrag_model::TYP_WIEDERHOLUNG,
+ [
+ Studierendenantragstatus_model::STATUS_REQUESTSENT_1,
+ Studierendenantragstatus_model::STATUS_REQUESTSENT_2,
+ Studierendenantragstatus_model::STATUS_CREATED,
+ Studierendenantragstatus_model::STATUS_LVSASSIGNED,
+ Studierendenantragstatus_model::STATUS_PAUSE
+ ],
+ ]);
+ }
+
+ public function resumeAntraegeForAbmeldungStgl($antrag_id)
+ {
+ $sql = 'INSERT INTO campus.tbl_studierendenantrag_status
+ (studierendenantrag_id, studierendenantrag_statustyp_kurzbz, insertvon, insertamum)
+ SELECT studierendenantrag_id, (
+ SELECT studierendenantrag_statustyp_kurzbz
+ FROM campus.tbl_studierendenantrag_status s
+ WHERE s.studierendenantrag_id=a.studierendenantrag_id
+ AND campus.get_status_id_studierendenantrag(a.studierendenantrag_id) <> studierendenantrag_status_id
+ ORDER BY insertamum DESC
+ LIMIT 1
+ ), ?, (
+ SELECT insertamum
+ FROM campus.tbl_studierendenantrag_status
+ WHERE studierendenantrag_status_id = campus.get_status_id_studierendenantrag(?)
+ )
+ FROM campus.tbl_studierendenantrag a
+ WHERE prestudent_id = (
+ SELECT prestudent_id
+ FROM campus.tbl_studierendenantrag
+ WHERE studierendenantrag_id = ?
+ )
+ AND typ <> ?
+ AND campus.get_status_studierendenantrag(studierendenantrag_id) = ?
+ ';
+
+ return $this->execQuery($sql, [
+ self::INSERTVON_ABMELDUNGSTGL,
+ $antrag_id,
+ $antrag_id,
+ Studierendenantrag_model::TYP_ABMELDUNG_STGL,
+ Studierendenantragstatus_model::STATUS_PAUSE
+ ]);
+ }
+
+ public function stopAntraegeForAbbruchBy($antrag_id)
+ {
+ $sql = 'INSERT INTO campus.tbl_studierendenantrag_status
+ (studierendenantrag_id, studierendenantrag_statustyp_kurzbz, insertvon, insertamum)
+ SELECT studierendenantrag_id, ?, ?, (
+ SELECT insertamum
+ FROM campus.tbl_studierendenantrag_status
+ WHERE studierendenantrag_status_id = campus.get_status_id_studierendenantrag(?)
+ )
+ FROM campus.tbl_studierendenantrag
+ WHERE prestudent_id = (
+ SELECT prestudent_id
+ FROM campus.tbl_studierendenantrag
+ WHERE studierendenantrag_id = ?
+ )
+ AND studierendenantrag_id <> ?
+ AND (
+ (
+ typ = ?
+ AND campus.get_status_studierendenantrag(studierendenantrag_id) NOT IN ?
+ ) OR (
+ typ = ?
+ AND campus.get_status_studierendenantrag(studierendenantrag_id) NOT IN ?
+ ) OR (
+ typ = ?
+ AND campus.get_status_studierendenantrag(studierendenantrag_id) NOT IN ?
+ ) OR (
+ typ = ?
+ AND campus.get_status_studierendenantrag(studierendenantrag_id) NOT IN ?
+ )
+ )';
+
+ return $this->execQuery($sql, [
+ self::STATUS_PAUSE,
+ self::INSERTVON_DEREGISTERED,
+ $antrag_id,
+ $antrag_id,
+ $antrag_id,
+ Studierendenantrag_model::TYP_ABMELDUNG,
+ [
+ Studierendenantragstatus_model::STATUS_APPROVED,
+ Studierendenantragstatus_model::STATUS_CANCELLED
+ ],
+ Studierendenantrag_model::TYP_UNTERBRECHUNG,
+ [
+ Studierendenantragstatus_model::STATUS_APPROVED,
+ Studierendenantragstatus_model::STATUS_CANCELLED,
+ Studierendenantragstatus_model::STATUS_REMINDERSENT,
+ Studierendenantragstatus_model::STATUS_REJECTED
+ ],
+ Studierendenantrag_model::TYP_ABMELDUNG_STGL,
+ [
+ Studierendenantragstatus_model::STATUS_CANCELLED,
+ Studierendenantragstatus_model::STATUS_DEREGISTERED,
+ Studierendenantragstatus_model::STATUS_OBJECTION_DENIED
+ ],
+ Studierendenantrag_model::TYP_WIEDERHOLUNG,
+ [
+ Studierendenantragstatus_model::STATUS_DEREGISTERED,
+ Studierendenantragstatus_model::STATUS_APPROVED
+ ],
+ ]);
+ }
}
diff --git a/application/models/organisation/Studiengang_model.php b/application/models/organisation/Studiengang_model.php
index 1e4917f78..e306ce950 100755
--- a/application/models/organisation/Studiengang_model.php
+++ b/application/models/organisation/Studiengang_model.php
@@ -610,7 +610,7 @@ class Studiengang_model extends DB_Model
$this->addJoin('public.tbl_student stud', 'p.prestudent_id=stud.prestudent_id', 'LEFT');
$this->db->where_in($this->dbTable . '.studiengang_kz', $studiengang_kzs);
- $this->db->where_in('ps.status_kurzbz', $this->config->item('antrag_prestudentstatus_whitelist'));
+ $this->db->where_in('ps.status_kurzbz', $this->config->item('antrag_prestudentstatus_whitelist_abmeldung'));
$this->db->where($this->dbTable . ".aktiv", true);
if ($not_antrag_typ !== null && is_array($not_antrag_typ)) {
diff --git a/application/models/ressource/Zeitaufzeichnung_model.php b/application/models/ressource/Zeitaufzeichnung_model.php
index b44861d13..8639a716a 100755
--- a/application/models/ressource/Zeitaufzeichnung_model.php
+++ b/application/models/ressource/Zeitaufzeichnung_model.php
@@ -21,4 +21,26 @@ class Zeitaufzeichnung_model extends DB_Model
return $this->execQuery($qry);
}
+
+ public function getFullInterval($uid, $fromDate, $toDate)
+ {
+ $qry = <<execQuery($qry, array($uid, $fromDate, $toDate, $uid, $fromDate, $toDate, $fromDate, $toDate));
+ }
}
diff --git a/application/models/vertragsbestandteil/Dienstverhaeltnis_model.php b/application/models/vertragsbestandteil/Dienstverhaeltnis_model.php
index 5b276c55e..2fdfcffe2 100644
--- a/application/models/vertragsbestandteil/Dienstverhaeltnis_model.php
+++ b/application/models/vertragsbestandteil/Dienstverhaeltnis_model.php
@@ -18,7 +18,7 @@ class Dienstverhaeltnis_model extends DB_Model
$result = null;
$qry = "
- SELECT
+ SELECT
dv.dienstverhaeltnis_id,
tbl_benutzer.uid,
tbl_mitarbeiter.personalnummer,
@@ -30,8 +30,8 @@ class Dienstverhaeltnis_model extends DB_Model
org.oe_kurzbz,
org.bezeichnung oe_bezeichnung,
dv.von,
- dv.bis,
- dv.vertragsart_kurzbz,
+ dv.bis,
+ dv.vertragsart_kurzbz,
dv.updateamum,
dv.updatevon
FROM tbl_mitarbeiter
@@ -59,13 +59,13 @@ class Dienstverhaeltnis_model extends DB_Model
";
return $this->execQuery($qry, $data);
-
+
}
public function getDVByID($dvid) {
$this->addSelect('hr.tbl_dienstverhaeltnis.*, public.tbl_organisationseinheit.bezeichnung as unternehmen');
$this->addJoin('public.tbl_organisationseinheit', 'hr.tbl_dienstverhaeltnis.oe_kurzbz = public.tbl_organisationseinheit.oe_kurzbz');
- $result = $this->load($dvid);
+ $result = $this->load($dvid);
if (hasData($result)) {
return $result;
@@ -81,7 +81,7 @@ class Dienstverhaeltnis_model extends DB_Model
$datestring = $date->format("Y-m-d");
$qry = "
- SELECT
+ SELECT
dv.dienstverhaeltnis_id,
tbl_benutzer.uid,
tbl_mitarbeiter.personalnummer,
@@ -115,26 +115,26 @@ class Dienstverhaeltnis_model extends DB_Model
$params = array_merge($params, array($dvid, $dvid));
$dvidclause = <<= COALESCE(vb.von, '1970-01-01'::date)
- AND
- COALESCE(dv.bis::date, '2170-12-31'::date) <= COALESCE(vb.bis, '2170-12-31')
+ AND
+ vb.vertragsbestandteiltyp_kurzbz = 'karenz'
+ AND
+ dv.von::date >= COALESCE(vb.von, '1970-01-01'::date)
+ AND
+ COALESCE(dv.bis::date, '2170-12-31'::date) <= COALESCE(vb.bis, '2170-12-31')
) = 0
AND dv.dienstverhaeltnis_id != ?
EODVIDC;
-
+
}
-
+
$query = <<= dv.von
+ AND
+ COALESCE(?::date, '2170-12-31'::date) >= dv.von
AND (
- SELECT
- COUNT(*) AS karenzen
- FROM
- hr.tbl_vertragsbestandteil vb
- WHERE
+ SELECT
+ COUNT(*) AS karenzen
+ FROM
+ hr.tbl_vertragsbestandteil vb
+ WHERE
vb.dienstverhaeltnis_id = dv.dienstverhaeltnis_id
- AND
- vb.vertragsbestandteiltyp_kurzbz = 'karenz'
- AND
- ?::date >= COALESCE(vb.von, '1970-01-01'::date)
- AND
- COALESCE(?::date, '2170-12-31'::date) <= COALESCE(vb.bis, '2170-12-31')
- ) = 0
+ AND
+ vb.vertragsbestandteiltyp_kurzbz = 'karenz'
+ AND
+ ?::date >= COALESCE(vb.von, '1970-01-01'::date)
+ AND
+ COALESCE(?::date, '2170-12-31'::date) <= COALESCE(vb.bis, '2170-12-31')
+ ) = 0
{$dvidclause}
EOSQL;
-
+
$ret = $this->execReadOnlyQuery($query, $params);
-
+
if( ($dvcount = getData($ret)) && ($dvcount[0]->dvcount > 0) ) {
return true;
}
-
- return false;
+
+ return false;
}
-}
\ No newline at end of file
+
+ public function getDVByPersonUIDOverlapping($uid, $oe_kurzbz=null, $beginn=null, $ende=null)
+ {
+ $result = null;
+
+ $qry = "
+ SELECT
+ dv.dienstverhaeltnis_id,
+ tbl_benutzer.uid,
+ tbl_mitarbeiter.personalnummer,
+ tbl_mitarbeiter.kurzbz,
+ tbl_mitarbeiter.lektor,
+ tbl_mitarbeiter.fixangestellt,
+ tbl_person.person_id,
+ tbl_benutzer.alias,
+ org.oe_kurzbz,
+ org.bezeichnung oe_bezeichnung,
+ dv.von,
+ dv.bis,
+ dv.vertragsart_kurzbz,
+ dv.updateamum,
+ dv.updatevon
+ FROM tbl_mitarbeiter
+ JOIN tbl_benutzer ON tbl_mitarbeiter.mitarbeiter_uid::text = tbl_benutzer.uid::text
+ JOIN tbl_person USING (person_id)
+ JOIN hr.tbl_dienstverhaeltnis dv ON(tbl_benutzer.uid::text = dv.mitarbeiter_uid::text)
+ JOIN public.tbl_organisationseinheit org USING(oe_kurzbz)
+ WHERE tbl_benutzer.uid=?";
+ $data = array($uid);
+
+ if(!is_null($oe_kurzbz))
+ {
+ $qry.=" AND oe_kurzbz=?";
+ $data[] = $oe_kurzbz;
+ }
+
+ if (!is_null($beginn) && !is_null($ende))
+ {
+ $qry.=" AND (?,?) OVERLAPS (dv.von, COALESCE(dv.bis, '2999-12-31'))";
+ $data[] = $beginn;
+ $data[] = $ende;
+ }
+
+ $qry .="
+ ORDER BY dv.von desc
+ ";
+
+ return $this->execQuery($qry, $data);
+
+ }
+
+ public function fetchDienstverhaeltnisse($unternehmen, $stichtag=null, $mitarbeiteruid=null) {
+ $where = "oe_kurzbz = " . $this->escape($unternehmen);
+ if( !is_null($stichtag) )
+ {
+ $where .= " AND " . $this->escape($stichtag) . " BETWEEN COALESCE(von, '1970-01-01') AND COALESCE(bis, '2070-12-31')";
+ }
+ if( !is_null($mitarbeiteruid) )
+ {
+ $where .= " AND mitarbeiter_uid = " . $this->escape($mitarbeiteruid);
+ }
+ $res = $this->loadWhere($where);
+ $dvs = array();
+ if(hasData($res) )
+ {
+ $dvs = getData($res);
+ }
+ return $dvs;
+ }
+}
diff --git a/application/views/errors/json/html/error_404.php b/application/views/errors/json/html/error_404.php
new file mode 100644
index 000000000..0caade2b1
--- /dev/null
+++ b/application/views/errors/json/html/error_404.php
@@ -0,0 +1,65 @@
+
+
+
+
+404 Page Not Found
+
+
+
+
+
+
+
+
+
diff --git a/application/views/errors/json/html/error_db.php b/application/views/errors/json/html/error_db.php
new file mode 100644
index 000000000..dce6a7572
--- /dev/null
+++ b/application/views/errors/json/html/error_db.php
@@ -0,0 +1,49 @@
+', $msg);
+
+$msgs = [];
+
+$error = [
+ 'heading' => $heading
+];
+
+/** NOTE(chris): extract Error Number and SQL
+ * @see: DB_driver.php:692
+ */
+if (substr(current($msg), 0, 14) == 'Error Number: ') {
+ $code = substr(array_shift($msg), 14);
+ if ($code)
+ $error['code'] = (int)$code;
+ $msgs[] = array_shift($msg);
+ $error['sql'] = array_shift($msg);
+}
+
+/** NOTE(chris): extract Line Number and Filename
+ * @see: DB_driver.php:1782
+ * @see: DB_driver.php:1783
+ */
+if (count($msg) >= 2) {
+ if (substr(end($msg), 0, 13) == 'Line Number: ' && substr(prev($msg), 0, 10) == 'Filename: ') {
+ $error['line'] = (int)substr(array_pop($msg), 13);
+ $error['filename'] = substr(array_pop($msg), 10);
+ }
+}
+
+foreach ($msg as $m)
+ $msgs[] = $m;
+
+
+if (count($msgs) == 1)
+ $error['message'] = current($msgs);
+else
+ $error['messages'] = $msgs;
+
+$g_result->addError($error, FHCAPI_Controller::ERROR_TYPE_DB);
+$g_result->setStatus(FHCAPI_Controller::STATUS_ERROR);
diff --git a/application/views/errors/json/html/error_exception.php b/application/views/errors/json/html/error_exception.php
new file mode 100644
index 000000000..7984bd13e
--- /dev/null
+++ b/application/views/errors/json/html/error_exception.php
@@ -0,0 +1,27 @@
+ $message,
+ 'class' => get_class($exception),
+ 'filename' => $exception->getFile(),
+ 'line' => $exception->getLine()
+];
+
+if (defined('SHOW_DEBUG_BACKTRACE') && SHOW_DEBUG_BACKTRACE === true) {
+ $error['backtrace'] = [];
+ foreach (debug_backtrace() as $err) {
+ if (isset($err['file']) && strpos($err['file'], realpath(BASEPATH)) !== 0) {
+ $error['backtrace'][] = [
+ 'file' => $err['file'],
+ 'line' => $err['line'],
+ 'function' => $err['function']
+ ];
+ }
+ }
+}
+
+$g_result->addError($error, FHCAPI_Controller::ERROR_TYPE_EXCEPTION);
+$g_result->setStatus(FHCAPI_Controller::STATUS_ERROR);
diff --git a/application/views/errors/json/html/error_general.php b/application/views/errors/json/html/error_general.php
new file mode 100644
index 000000000..e69494463
--- /dev/null
+++ b/application/views/errors/json/html/error_general.php
@@ -0,0 +1,20 @@
+
', $msg);
+
+$error = [
+ 'heading' => $heading
+];
+if (count($msg) == 1)
+ $error['message'] = current($msg);
+else
+ $error['messages'] = $msg;
+
+$g_result->addError($error, FHCAPI_Controller::ERROR_TYPE_GENERAL);
+$g_result->setStatus(FHCAPI_Controller::STATUS_ERROR);
diff --git a/application/views/errors/json/html/error_php.php b/application/views/errors/json/html/error_php.php
new file mode 100644
index 000000000..91f2abf3c
--- /dev/null
+++ b/application/views/errors/json/html/error_php.php
@@ -0,0 +1,31 @@
+ $message,
+ 'severity' => $severity,
+ 'filename' => $filepath,
+ 'line' => $line
+];
+
+if (defined('SHOW_DEBUG_BACKTRACE') && SHOW_DEBUG_BACKTRACE === true) {
+ $error['backtrace'] = [];
+ foreach (debug_backtrace() as $err) {
+ if (isset($err['file']) && strpos($err['file'], realpath(BASEPATH)) !== 0) {
+ $error['backtrace'][] = [
+ 'file' => $err['file'],
+ 'line' => $err['line'],
+ 'function' => $err['function']
+ ];
+ }
+ }
+}
+
+// TODO(chris): change type with severity
+$g_result->addError($error, 'php');
+
+if (((E_ERROR | E_PARSE | E_COMPILE_ERROR | E_CORE_ERROR | E_USER_ERROR) & $severity) === $severity) {
+ $g_result->setStatus('error');
+}
diff --git a/application/views/lehre/Antrag/Create.php b/application/views/lehre/Antrag/Create.php
index ace9902de..dcfd29e42 100755
--- a/application/views/lehre/Antrag/Create.php
+++ b/application/views/lehre/Antrag/Create.php
@@ -11,6 +11,7 @@ $sitesettings = array(
'customJSModules' => array('public/js/apps/lehre/Antrag.js'),
'customCSSs' => array(
'public/css/Fhc.css',
+ 'public/css/components/primevue.css',
'vendor/vuejs/vuedatepicker_css/main.css'
),
'customJSs' => array(
@@ -31,9 +32,9 @@ $this->load->view(
array('public/js/apps/lehre/Antrag/Leitung.js'),
'customCSSs' => array(
- 'public/css/Fhc.css'
+ 'public/css/Fhc.css',
+ 'public/css/components/primevue.css',
),
'customJSs' => array(
)
diff --git a/application/views/lehre/Antrag/Student/List.php b/application/views/lehre/Antrag/Student/List.php
index 84b44afad..e2a4511c5 100755
--- a/application/views/lehre/Antrag/Student/List.php
+++ b/application/views/lehre/Antrag/Student/List.php
@@ -10,7 +10,8 @@ $sitesettings = array(
),
'customJSModules' => array('public/js/apps/lehre/Antrag/Student.js'),
'customCSSs' => array(
- 'public/css/Fhc.css'
+ 'public/css/Fhc.css',
+ 'public/css/components/primevue.css',
),
'customJSs' => array(
)
@@ -38,7 +39,10 @@ $this->load->view(
@@ -63,7 +67,16 @@ $this->load->view(
| = $antrag->studierendenantrag_id; ?> |
= $this->p->t('studierendenantrag', 'antrag_typ_' . $antrag->typ); ?> |
- = $antrag->status_bezeichnung; ?> |
+
+ =
+ (
+ $antrag->status == Studierendenantragstatus_model::STATUS_PAUSE
+ && $antrag->status_insertvon == Studierendenantragstatus_model::INSERTVON_DEREGISTERED
+ )
+ ? $this->p->t('studierendenantrag', 'status_stop')
+ : $antrag->status_bezeichnung;
+ ?>
+ |
= $antrag->studiensemester_kurzbz; ?> |
= (new DateTime($antrag->datum))->format('d.m.Y'); ?> |
= $antrag->datum_wiedereinstieg ? (new DateTime($antrag->datum_wiedereinstieg))->format('d.m.Y') : ''; ?> |
@@ -74,15 +87,32 @@ $this->load->view(
-
+
@@ -100,18 +130,78 @@ $this->load->view(
-
- typ != Studierendenantrag_model::TYP_WIEDERHOLUNG && in_array($antrag->status, [
- Studierendenantragstatus_model::STATUS_APPROVED,
- Studierendenantragstatus_model::STATUS_OBJECTED,
- Studierendenantragstatus_model::STATUS_OBJECTION_DENIED,
- Studierendenantragstatus_model::STATUS_REMINDERSENT
- ])) { ?>
-
+
+
+
+ typ) {
+ case Studierendenantrag_model::TYP_ABMELDUNG:
+ $allowed = [
+ Studierendenantragstatus_model::STATUS_APPROVED
+ ];
+ break;
+ case Studierendenantrag_model::TYP_ABMELDUNG_STGL:
+ $allowed = [
+ Studierendenantragstatus_model::STATUS_APPROVED,
+ Studierendenantragstatus_model::STATUS_OBJECTED,
+ Studierendenantragstatus_model::STATUS_OBJECTION_DENIED,
+ Studierendenantragstatus_model::STATUS_DEREGISTERED
+ ];
+ break;
+ case Studierendenantrag_model::TYP_UNTERBRECHUNG:
+ $allowed = [
+ Studierendenantragstatus_model::STATUS_APPROVED,
+ Studierendenantragstatus_model::STATUS_REMINDERSENT
+ ];
+ break;
+ case Studierendenantrag_model::TYP_WIEDERHOLUNG:
+ $allowed = [
+ Studierendenantragstatus_model::STATUS_DEREGISTERED
+ ];
+ break;
+ }
+ if (in_array($antrag->status, $allowed)) { ?>
+
+
+
+
- typ == Studierendenantrag_model::TYP_WIEDERHOLUNG && $antrag->status == Studierendenantragstatus_model::STATUS_APPROVED) { ?>
- = $this->p->t('studierendenantrag', 'btn_show_lvs'); ?>
-
+ typ == Studierendenantrag_model::TYP_WIEDERHOLUNG
+ && $antrag->status == Studierendenantragstatus_model::STATUS_APPROVED
+ ) { ?>
+
+ = $this->p->t('studierendenantrag', 'btn_show_lvs'); ?>
+
+
= $this->p->t('studierendenantrag', 'my_lvs'); ?>
diff --git a/application/views/lehre/Antrag/Wiederholung/Student.php b/application/views/lehre/Antrag/Wiederholung/Student.php
index 5a9fc2fb4..e51cfd1bc 100755
--- a/application/views/lehre/Antrag/Wiederholung/Student.php
+++ b/application/views/lehre/Antrag/Wiederholung/Student.php
@@ -14,6 +14,8 @@ $sitesettings = array(
),
'customJSModules' => array('public/js/apps/lehre/Antrag/Lvzuweisung.js'),
'customCSSs' => array(
+ 'public/css/Fhc.css',
+ 'public/css/components/primevue.css',
),
'customJSs' => array(
)
@@ -30,7 +32,7 @@ $this->load->view(
= $this->p->t('studierendenantrag', 'title_lvzuweisen', ['name' => $antrag->name]);?>
- status != Studierendenantragstatus_model::STATUS_CREATED && $antrag->status != Studierendenantragstatus_model::STATUS_LVSASSIGNED) ? ' disabled' : ''; ?>>
+ status != Studierendenantragstatus_model::STATUS_CREATED && $antrag->status != Studierendenantragstatus_model::STATUS_LVSASSIGNED) ? ' disabled' : ''; ?>>
diff --git a/application/views/system/logs/testSearch.php b/application/views/system/logs/testSearch.php
index 882b953f5..57ed0d48a 100755
--- a/application/views/system/logs/testSearch.php
+++ b/application/views/system/logs/testSearch.php
@@ -1,13 +1,12 @@
'Test Search',
- 'jquery3' => true,
'bootstrap5' => true,
'fontawesome6' => true,
- 'tablesorter2' => true,
+ 'tabulator5' => true,
+ 'primevue3' => true,
+ 'axios027' => true,
'vue3' => true,
- 'ajaxlib' => true,
- 'jqueryui1' => true,
'filtercomponent' => true,
'navigationcomponent' => true,
'phrases' => array(
@@ -17,8 +16,8 @@
'customCSSs' => array(
'public/css/components/verticalsplit.css',
'public/css/components/searchbar.css',
+ 'public/css/components/primevue.css',
),
- 'customJSs' => array('vendor/axios/axios/axios.min.js'),
'customJSModules' => array('public/js/apps/TestSearch.js')
);
@@ -40,17 +39,17 @@
-
+
-
+
-
+
-
+
diff --git a/cis/private/info/service_uebersicht.php b/cis/private/info/service_uebersicht.php
index 27759e6c6..348a82b0d 100755
--- a/cis/private/info/service_uebersicht.php
+++ b/cis/private/info/service_uebersicht.php
@@ -45,25 +45,22 @@ echo '
-
-
-
-
-
-';
+
+
+
+
+
+ ';
+
+const MOODLE_ADDON_KURZBZ = 'moodle';
// Load Addons to get Moodle_Path
$addon_obj = new addon();
-if ($addon_obj->loadAddons())
+
+// include moodle addon config if active
+if ($addon_obj->checkActiveAddon(MOODLE_ADDON_KURZBZ) && file_exists('../../../addons/'.MOODLE_ADDON_KURZBZ.'/config.inc.php'))
{
- if (count($addon_obj->result) > 0)
- {
- foreach ($addon_obj->result as $row)
- {
- if (file_exists('../../../addons/'.$row->kurzbz.'/config.inc.php'))
- include_once('../../../addons/'.$row->kurzbz.'/config.inc.php');
- }
- }
+ include_once('../../../addons/'.MOODLE_ADDON_KURZBZ.'/config.inc.php');
}
echo '
@@ -117,6 +114,7 @@ echo '
';
+$servicekategorie_arr = $service->getKategorieArray();
if($oe_kurzbz!='')
{
@@ -134,6 +132,7 @@ echo '
| '.$p->t("global/bezeichnung").' |
'.$p->t("services/leistung").' |
'.$p->t("services/design").' |
+ '.$p->t("services/kritikalitaet").' |
'.$p->t("services/details").' |
@@ -159,6 +158,8 @@ foreach($service->result as $row)
echo '',$design,' | ';
//echo '',$betrieb,' | ';
//echo '',$operativ,' | ';
+ $title = (isset($servicekategorie_arr[$row->servicekategorie_kurzbz])?$servicekategorie_arr[$row->servicekategorie_kurzbz]:'');
+ echo '',$title,' | ';
echo ''.($row->content_id!=''?'Details':'');
if (defined("ADDON_MOODLE_PATH"))
echo ' '.($row->ext_id!=''?'Beschreibung':'');
diff --git a/cis/private/lehre/anwesenheitsliste.php b/cis/private/lehre/anwesenheitsliste.php
index 8b1f28408..0ba5531c8 100755
--- a/cis/private/lehre/anwesenheitsliste.php
+++ b/cis/private/lehre/anwesenheitsliste.php
@@ -62,7 +62,7 @@
$stsem = $_GET['stsem'];
else
die($p->t('anwesenheitsliste/studiensemesterIstUngueltig'));
-
+
$covidhelper = new CovidHelper();
?>
";
- $qry = "SELECT *, tbl_lehreinheitgruppe.studiengang_kz, tbl_lehreinheitgruppe.semester FROM lehre.tbl_lehreinheit JOIN lehre.tbl_lehreinheitgruppe USING(lehreinheit_id) JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id)
- WHERE lehrveranstaltung_id='$lvid' AND studiensemester_kurzbz=".$db->db_add_param($stsem);
-
$qry = "SELECT *, tbl_lehreinheitgruppe.studiengang_kz, tbl_lehreinheitgruppe.semester ,tbl_lehreinheit.lehrform_kurzbz
FROM lehre.tbl_lehreinheit
JOIN lehre.tbl_lehreinheitgruppe USING(lehreinheit_id)
@@ -213,7 +210,7 @@ $covidhelper = new CovidHelper();
$covid_content = "".$p->t('anwesenheitsliste/covidstatuslisten')." | ".$covid_content." ";
else
$covid_content = ($covidhelper->isUdfDefined()) ? $p->t('anwesenheitsliste/keineStudentenVorhanden') : '';
-
+
if($aw_content!='')
$aw_content = "".$p->t('anwesenheitsliste/anwesenheitslisten')." | ".$aw_content." ";
else
@@ -241,9 +238,9 @@ $covidhelper = new CovidHelper();
{
$covid_content = '';
}
-
+
echo "
-
+
| $aw_content |
$covid_content |
diff --git a/cis/private/lehre/benotungstool/lvgesamtnoteverwalten.php b/cis/private/lehre/benotungstool/lvgesamtnoteverwalten.php
index 6dce2b6ae..a799c9fad 100755
--- a/cis/private/lehre/benotungstool/lvgesamtnoteverwalten.php
+++ b/cis/private/lehre/benotungstool/lvgesamtnoteverwalten.php
@@ -102,6 +102,22 @@ $noten_obj->getAll();
$sprachen = new sprache();
$sprachen->getAll(true);
+
+$noten_array = array();
+$js_noten='';
+foreach ($noten_obj->result as $row)
+{
+ $js_noten .= " noten_array['" . $row->note . "']='" . addslashes($row->bezeichnung) . "';\n";
+ $noten_array[$row->note]['bezeichnung'] = $row->bezeichnung;
+ $noten_array[$row->note]['positiv'] = $row->positiv;
+ $noten_array[$row->note]['aktiv'] = $row->aktiv;
+ $noten_array[$row->note]['lehre'] = $row->lehre;
+ $noten_array[$row->note]['lkt_ueberschreibbar'] = $row->lkt_ueberschreibbar;
+ $noten_array[$row->note]['anmerkung'] = $row->anmerkung;
+ foreach ($sprachen->result as $s)
+ $noten_array[$row->note]['bezeichnung_mehrsprachig'][$s->sprache] = $row->bezeichnung_mehrsprachig[$s->sprache];
+}
+
$errormsg = '';
// eingetragene lv-gesamtnoten freigeben
@@ -326,19 +342,7 @@ echo '
var noten_array = Array();
';
-$noten_array = array();
-foreach ($noten_obj->result as $row)
-{
- echo " noten_array['" . $row->note . "']='" . addslashes($row->bezeichnung) . "';\n";
- $noten_array[$row->note]['bezeichnung'] = $row->bezeichnung;
- $noten_array[$row->note]['positiv'] = $row->positiv;
- $noten_array[$row->note]['aktiv'] = $row->aktiv;
- $noten_array[$row->note]['lehre'] = $row->lehre;
- $noten_array[$row->note]['lkt_ueberschreibbar'] = $row->lkt_ueberschreibbar;
- $noten_array[$row->note]['anmerkung'] = $row->anmerkung;
- foreach ($sprachen->result as $s)
- $noten_array[$row->note]['bezeichnung_mehrsprachig'][$s->sprache] = $row->bezeichnung_mehrsprachig[$s->sprache];
-}
+echo $js_noten;
?>
@@ -806,16 +810,16 @@ foreach ($noten_obj->result as $row)
for(row in rows)
{
linenumber++;
- if( rows[row] == '' )
+ if( rows[row] == '' )
{
//skip empty lines
continue;
}
zeile = rows[row].split(" ");
-
+
if( zeile.length < 2 )
{
- alertMsg = alertMsg + "Zeile " + linenumber + ': '
+ alertMsg = alertMsg + "Zeile " + linenumber + ': '
+ 'Zu wenig Paramter - 2 erforderlich. '
+ 'Die Zeile wurde uebersprungen.' + "\n\n";
continue;
@@ -917,36 +921,36 @@ foreach ($noten_obj->result as $row)
for(row in rows)
{
linenumber++;
- if( rows[row] == '' )
+ if( rows[row] == '' )
{
//skip empty lines
continue;
}
zeile = rows[row].split(" ");
-
+
if( zeile.length < 3 )
{
- alertMsg = alertMsg + "Zeile " + linenumber + ': '
+ alertMsg = alertMsg + "Zeile " + linenumber + ': '
+ 'Zu wenig Paramter - 3 erforderlich. '
+ 'Die Zeile wurde uebersprungen.' + "\n\n";
continue;
}
-
+
if( zeile[1] == '' && zeile[2] == '' )
{
- // ignore lines just copied from excel
+ // ignore lines just copied from excel
continue;
}
-
- if( zeile[2] == '' )
+
+ if( zeile[2] == '' )
{
alertMsg = alertMsg + "Zeile " + linenumber + ': '
+ "Die Note oder Punkte fehlen. "
+ "Die Zeile wurde uebersprungen. \n\n";
- continue;
+ continue;
}
-
- if (CIS_GESAMTNOTE_PUNKTE == false)
+
+ if (CIS_GESAMTNOTE_PUNKTE == false)
{
// check for valid grades
if (validGrades.indexOf(zeile[2]) === -1)
@@ -958,7 +962,7 @@ foreach ($noten_obj->result as $row)
}
}
- if( !zeile[1].match(/[0-9]{2}\.[0-9]{2}\.[0-9]{4}/) )
+ if( !zeile[1].match(/[0-9]{2}\.[0-9]{2}\.[0-9]{4}/) )
{
alertMsg = alertMsg + "Zeile " + linenumber + ': '
+ "Das Datum "+zeile[1]+" fehlt oder ist nicht zulaessig. "
diff --git a/cis/private/lehre/benotungstool/nachpruefungeintragen.php b/cis/private/lehre/benotungstool/nachpruefungeintragen.php
index 873c0f173..55954fcda 100755
--- a/cis/private/lehre/benotungstool/nachpruefungeintragen.php
+++ b/cis/private/lehre/benotungstool/nachpruefungeintragen.php
@@ -251,7 +251,7 @@ else
// deshalb wird hier versucht eine passende Lehreinheit zu ermitteln.
$lehreinheit_id = getLehreinheit($db, $lvid, $student_uid, $stsem);
- $response = savePruefung($lvid, $student_uid, $stsem, $lehreinheit_id, $datum, $typ, $note);
+ $response = savePruefung($lvid, $student_uid, $stsem, $lehreinheit_id, $datum, $typ, $note, $punkte);
echo $response;
}
else
diff --git a/cis/private/lehre/notenliste.xls.php b/cis/private/lehre/notenliste.xls.php
index 63cf45d29..6c8db5246 100755
--- a/cis/private/lehre/notenliste.xls.php
+++ b/cis/private/lehre/notenliste.xls.php
@@ -114,12 +114,15 @@ else
$format_highlight->setFgColor(15);
$format_highlight->setBorder(1);
$format_highlight->setBorderColor('white');
+ $format_highlight->setAlign('left');
+ $format_highlight->setNumFormat(49);
$format_highlightright=& $workbook->addFormat();
$format_highlightright->setFgColor(15);
$format_highlightright->setBorder(1);
$format_highlightright->setBorderColor('white');
$format_highlightright->setAlign('right');
+ $format_highlightright->setNumFormat(49);
$format_highlightright_date=& $workbook->addFormat();
$format_highlightright_date->setFgColor(15);
@@ -318,17 +321,23 @@ else
$worksheet->write($lines,1,$elem->uid);
$worksheet->write($lines,2,$elem->nachname.$inc);
- $worksheet->write($lines,3,$elem->vorname);
- //wenn Wahlname vorhanden überschreibt dieser den Vornamen
- $worksheet->write($lines,3,$elem->wahlname);
- $worksheet->write($lines,4,'="'.$elem->semester.$elem->verband.$elem->gruppe.'"');
- $worksheet->write($lines,5,'="'.trim($elem->matrikelnr).'"',$format_highlight);
+ if( NULL !== $elem->wahlname )
+ {
+ //wenn Wahlname vorhanden überschreibt dieser den Vornamen
+ $worksheet->write($lines,3,$elem->wahlname);
+ }
+ else
+ {
+ $worksheet->write($lines,3,$elem->vorname);
+ }
+ $worksheet->write($lines,4,$elem->semester.$elem->verband.$elem->gruppe);
+ $worksheet->write($lines,5,trim($elem->matrikelnr),$format_highlight);
$worksheet->write($lines,6, $note, $format_highlightright);
// Nachprüfung
if (defined('CIS_GESAMTNOTE_PRUEFUNG_TERMIN2') && CIS_GESAMTNOTE_PRUEFUNG_TERMIN2)
{
- $worksheet->write($lines,8, '="'.trim($elem->matrikelnr).'"', $format_highlight);
+ $worksheet->write($lines,8, trim($elem->matrikelnr), $format_highlight);
$pr = new Pruefung();
$pr->getPruefungen($elem->uid, "Termin2", $lvid, $sem);
$output2 = $pr->result;
@@ -349,7 +358,7 @@ else
// Nachprüfung
if (defined('CIS_GESAMTNOTE_PRUEFUNG_TERMIN3') && CIS_GESAMTNOTE_PRUEFUNG_TERMIN3)
{
- $worksheet->write($lines,12, '="'.trim($elem->matrikelnr).'"', $format_highlight);
+ $worksheet->write($lines,12, trim($elem->matrikelnr), $format_highlight);
$pr = new Pruefung();
$pr->getPruefungen($elem->uid, "Termin3", $lvid, $sem);
$output3 = $pr->result;
diff --git a/cis/private/pdfExport.php b/cis/private/pdfExport.php
index 6db6f885a..ad2bb1fae 100755
--- a/cis/private/pdfExport.php
+++ b/cis/private/pdfExport.php
@@ -65,6 +65,11 @@ $xsl_stg_kz = 0;
$sign = false;
+/* Signing on CIS disabled
+if(isset($_GET['sign']))
+ $sign = true;
+*/
+
// Direkte uebergabe des Studienganges dessen Vorlage verwendet werden soll
if (isset($_GET['xsl_stg_kz']))
$xsl_stg_kz = $_GET['xsl_stg_kz'];
@@ -298,22 +303,18 @@ if ((((isset($_GET["uid"]) && $user == $_GET["uid"])) || $rechte->isBerechtigt('
$dokument->setFilename($filename);
- if (!$dokument->create($output))
- die($dokument->errormsg);
-
if ($sign === true)
{
- if ($dokument->sign($user))
- {
- $dokument->output();
- }
- else
+ if (!$dokument->sign($user))
{
echo $dokument->errormsg;
}
}
- else
- $dokument->output();
+
+ if (!$dokument->create($output))
+ die($dokument->errormsg);
+
+ $dokument->output();
$dokument->close();
}
else
diff --git a/cis/private/tools/zeitaufzeichnung_projektliste.php b/cis/private/tools/zeitaufzeichnung_projektliste.php
index c96e816df..817f266a2 100755
--- a/cis/private/tools/zeitaufzeichnung_projektliste.php
+++ b/cis/private/tools/zeitaufzeichnung_projektliste.php
@@ -60,7 +60,7 @@ if (isset($_GET['uid']))
$rechte = new benutzerberechtigung();
$rechte->getBerechtigungen($uid);
- if ($rechte->isBerechtigt('admin') || (in_array($_GET['uid'], $untergebenen_arr)))
+ if ($rechte->isBerechtigt('admin') || $rechte->isBerechtigt('mitarbeiter/zeitsperre') || (in_array($_GET['uid'], $untergebenen_arr)))
{
$uid = $_GET['uid'];
}
diff --git a/config/vilesci.config-default.inc.php b/config/vilesci.config-default.inc.php
index ddcf8d563..a372bc9da 100755
--- a/config/vilesci.config-default.inc.php
+++ b/config/vilesci.config-default.inc.php
@@ -283,7 +283,7 @@ define('FAS_DOPPELTE_BUCHUNGSTYPEN_CHECK', serialize(
'StudiengebuehrRestzahlung' => array('StudiengebuehrErhoeht', 'Studiengebuehr', 'StudiengebuehrRestzahlung'),
'OEH' => array('OEH')
))
-));
+);
// Spezialnoten die am Zeunigs und Diplomasupplement ignoriert werden
define('ZEUGNISNOTE_NICHT_ANZEIGEN',serialize(array('iar', 'nz')));
@@ -295,4 +295,13 @@ define ('DEFAULT_LEHRMODUS','regulaer');
//Echter Dienstvertrag
define ('DEFAULT_ECHTER_DIENSTVERTRAG',[103,110]);
+//Buchungstypen die fix auf eine bestimmte Kostenstelle gebucht werden sollen
+//Buchungstyp => Studiengang_kz
+define('FAS_BUCHUNGSTYP_FIXE_KOSTENSTELLE', serialize(
+ array(
+ 'Test_1' => 0,
+ 'Test_2' => 2
+ )
+));
+
?>
diff --git a/content/fas.xul.php b/content/fas.xul.php
index abe7f613e..29515eae6 100755
--- a/content/fas.xul.php
+++ b/content/fas.xul.php
@@ -141,7 +141,9 @@ foreach($addon_obj->result as $addon)
+
+
@@ -518,6 +520,13 @@ foreach($addon_obj->result as $addon)
command = "menu-dokumente-antrag-abmeldung:command"
accesskey = "&menu-dokumente-antrag-abmeldung.accesskey;"
/>
+
| |