diff --git a/application/config/navigation.php b/application/config/navigation.php index 1d8efb4c5..400e414ad 100644 --- a/application/config/navigation.php +++ b/application/config/navigation.php @@ -51,6 +51,16 @@ $config['navigation_header'] = array( 'sort' => 30, 'requiredPermissions' => 'infocenter:r' ), + 'lehrauftrag' => array( + 'link' => site_url('lehre/lehrauftrag/Lehrauftrag/Dashboard'), + 'description' => 'Lehrauftrag', + 'expand' => true, + 'sort' => 40, + 'requiredPermissions' => array( + 'lehre/lehrauftrag_bestellen:r', + 'lehre/lehrauftrag_erteilen:r' + ) + ) ) ), 'Personen' => array( @@ -125,3 +135,48 @@ $config['navigation_menu']['organisation/Reihungstest/index'] = array( 'target' => '_blank' ) ); + +$config['navigation_menu']['lehre/lehrauftrag/Lehrauftrag/*'] = array( + 'lehrauftragDashboard' => array( + 'link' => site_url('lehre/lehrauftrag/Lehrauftrag/Dashboard'), + 'description' => 'Dashboard', + 'icon' => 'dashboard', + 'sort' => 1, + 'requiredPermissions' => array('lehre/lehrauftrag_bestellen:r','lehre/lehrauftrag_erteilen:r') + ),'lehrauftragBestellen' => array( + 'link' => site_url('lehre/lehrauftrag/Lehrauftrag'), + 'description' => 'Lehrauftrag bestellen', + 'icon' => '', + 'sort' => 1, + 'requiredPermissions' => 'lehre/lehrauftrag_bestellen:r' + ), + 'lehrauftragErteilen' => array( + 'link' => site_url('lehre/lehrauftrag/LehrauftragErteilen'), + 'description' => 'Lehrauftrag erteilen', + 'icon' => '', + 'sort' => 1, + 'requiredPermissions' => 'lehre/lehrauftrag_erteilen:r' + ) +); +$config['navigation_menu']['lehre/lehrauftrag/LehrauftragErteilen/*'] = array( + 'lehrauftragDashboard' => array( + 'link' => site_url('lehre/lehrauftrag/Lehrauftrag/Dashboard'), + 'description' => 'Dashboard', + 'icon' => 'dashboard', + 'sort' => 1, + 'requiredPermissions' => array('lehre/lehrauftrag_bestellen:r','lehre/lehrauftrag_erteilen:r') + ),'lehrauftragBestellen' => array( + 'link' => site_url('lehre/lehrauftrag/Lehrauftrag'), + 'description' => 'Lehrauftrag bestellen', + 'icon' => '', + 'sort' => 1, + 'requiredPermissions' => 'lehre/lehrauftrag_bestellen:r' + ), + 'lehrauftragErteilen' => array( + 'link' => site_url('lehre/lehrauftrag/LehrauftragErteilen'), + 'description' => 'Lehrauftrag erteilen', + 'icon' => '', + 'sort' => 1, + 'requiredPermissions' => 'lehre/lehrauftrag_erteilen:r' + ) +); diff --git a/application/controllers/lehre/lehrauftrag/Lehrauftrag.php b/application/controllers/lehre/lehrauftrag/Lehrauftrag.php new file mode 100644 index 000000000..70c054186 --- /dev/null +++ b/application/controllers/lehre/lehrauftrag/Lehrauftrag.php @@ -0,0 +1,360 @@ + 'lehre/lehrauftrag_bestellen:r', + 'orderLehrauftrag' => 'lehre/lehrauftrag_bestellen:rw', + 'Dashboard' => array('lehre/lehrauftrag_bestellen:r', 'lehre/lehrauftrag_erteilen:rw') + ) + ); + + // Load models + $this->load->model('system/Benutzerrolle_model', 'BenutzerrolleModel'); + $this->load->model('organisation/Organisationseinheit_model', 'OrganisationseinheitModel'); + $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + $this->load->model('organisation/Studiengang_model', 'StudiengangModel'); + $this->load->model('accounting/Vertrag_model', 'VertragModel'); + + // Load libraries + $this->load->library('WidgetLib'); + $this->load->library('PermissionLib'); + + // Load helpers + $this->load->helper('array'); + $this->load->helper('url'); + $this->load->helper('hlp_sancho_helper'); + + // Load language phrases + $this->loadPhrases( + array( + 'global', + 'ui', + 'lehre' + ) + ); + + $this->_setAuthUID(); // sets property uid + + $this->setControllerId(); // sets the controller id + } + + /** + * Display of Custom Dashboard for Lehraufträge App + * Charts are hooked from Reporting Addon + */ + public function Dashboard() + { + $this->load->view('lehre/lehrauftrag/Dashboard.php'); + } + + // ----------------------------------------------------------------------------------------------------------------- + // Public methods + /** + * Main page of Lehrauftrag + */ + public function index() + { + // Set studiengang selected for studiengang dropdown + $studiengang_kz = $this->input->get('studiengang'); // if provided by selected studiengang + $studiengang_kz = ($studiengang_kz == 'null' ? null : $studiengang_kz); + + // Retrieve studiengaenge the user is entitled for to populate studiengang dropdown + if (!$studiengang_kz_arr = $this->permissionlib->getSTG_isEntitledFor(self::BERECHTIGUNG_LEHRAUFTRAG_BESTELLEN)) { + show_error('Fehler bei Berechtigungsprüfung'); + } + + // If studiengang_kz get param was set, check against entitled stg + if (!is_null($studiengang_kz)) + { + if (!in_array($studiengang_kz, $studiengang_kz_arr)) + { + show_error('Keine Berechtigung für diesen Studiengang'); + } + } + + // Set studiensemester selected for studiengang dropdown + $studiensemester_kurzbz = $this->input->get('studiensemester'); // if provided by selected studiensemester + if (is_null($studiensemester_kurzbz)) // else set next studiensemester as default value + { + $studiensemester = $this->StudiensemesterModel->getNext(); + if (hasData($studiensemester)) + { + $studiensemester_kurzbz = $studiensemester->retval[0]->studiensemester_kurzbz; + } + elseif (isError($studiensemester)) + { + show_error($studiensemester->error); + } + } + + // Set ausbildungssemester selected for ausbildungssemester dropdown + $ausbildungssemester = $this->input->get('ausbildungssemester'); // if provided by selected ausbildungssemester + $ausbildungssemester = ($ausbildungssemester == 'null' ? null : $ausbildungssemester); + + $view_data = array( + 'studiengang_selected' => $studiengang_kz, + 'studiengang' => $studiengang_kz_arr, + 'studiensemester_selected' => $studiensemester_kurzbz, + 'ausbildungssemester_selected' => $ausbildungssemester, + ); + + $this->load->view('lehre/lehrauftrag/orderLehrauftrag.php', $view_data); + } + + public function orderLehrauftrag() + { + $new_lehrvertrag_data_arr = array(); // information of new lehrvertraege to be used in mail + $lehrauftrag_arr = json_decode($this->input->post('selected_data')); + + // Loop through lehraufträge + if(is_array($lehrauftrag_arr)) + { + foreach($lehrauftrag_arr as $lehrauftrag) + { + $lehreinheit_id = (isset($lehrauftrag->lehreinheit_id)) ? $lehrauftrag->lehreinheit_id : null; + $lehrveranstaltung_id = (isset($lehrauftrag->lehrveranstaltung_id)) ? $lehrauftrag->lehrveranstaltung_id : null; + $person_id = (isset($lehrauftrag->person_id)) ? $lehrauftrag->person_id : null; + $mitarbeiter_uid = (isset($lehrauftrag->mitarbeiter_uid)) ? $lehrauftrag->mitarbeiter_uid : null; + $vertrag_id = (isset($lehrauftrag->vertrag_id)) ? $lehrauftrag->vertrag_id : null; + $projektarbeit_id = (isset($lehrauftrag->projektarbeit_id)) ? $lehrauftrag->projektarbeit_id : null; + $stunden = (isset($lehrauftrag->stunden)) ? $lehrauftrag->stunden : 0; + $betrag = (isset($lehrauftrag->betrag)) ? $lehrauftrag->betrag : 0; + $studiensemester_kurzbz = (isset($lehrauftrag->studiensemester_kurzbz)) ? $lehrauftrag->studiensemester_kurzbz : null; + $studiengang_kz = (isset($lehrauftrag->studiengang_kz)) ? $lehrauftrag->studiengang_kz : null; + + // Check if user is entitled to order this Lehrauftrag + if (!$this->permissionlib->isBerechtigt(self::BERECHTIGUNG_LEHRAUFTRAG_BESTELLEN, 'suid', $studiengang_kz)){ + show_error('Keine Bestellberechtigung für diesen Studiengang: '. $studiengang_kz); + } + + // update contract if contract exists and the betrag was changed + if (!is_null($vertrag_id)) + { + $this->VertragModel->addSelect('vertragsstunden, betrag'); + + if($result = getData($this->VertragModel->load($vertrag_id))) + { + $vertrag_betrag = $result[0]->betrag; + $vertrag_stunden = $result[0]->vertragsstunden; + } + + $hasChanged = ($betrag != floatval($vertrag_betrag) || $stunden != $vertrag_stunden) ? true : false; + + if ($hasChanged) + { + $result = $this->VertragModel->updateVertrag( + $vertrag_id, + $stunden, + $betrag, + $mitarbeiter_uid + ); + + if (isSuccess($result)) + { + $json []= array( + 'row_index' => $lehrauftrag->row_index, + 'bestellt' => date('Y-m-d'), + 'vertrag_betrag' => $betrag, + 'vertrag_stunden' => $stunden, + 'erteilt' => null + ); + } + } + } + // else save new contract + else + { + $result = $this->VertragModel->save( + $person_id, + $mitarbeiter_uid, + $lehrveranstaltung_id, + $lehreinheit_id, + $projektarbeit_id, + $stunden, + $betrag, + $studiensemester_kurzbz + ); + + if (isSuccess($result)) + { + $json []= array( + 'row_index' => $lehrauftrag->row_index, + 'bestellt' => date('Y-m-d'), + 'vertrag_betrag' => $betrag, + 'vertrag_stunden' => $stunden + ); + } + + $new_lehrvertrag_data_arr[] = array( + 'studiensemester_kurzbz' => $lehrauftrag->studiensemester_kurzbz, + 'studiengang_kz' => $lehrauftrag->studiengang_kz, + 'lv_oe_kurzbz' => $lehrauftrag->lv_oe_kurzbz + ); + } + } + } + + if (isset($json) && !isEmptyArray($json)) + { + $this->outputJsonSuccess($json); + } + + // Send email to Mitarbeiter + // if(!$this->_sendMail($new_lehrvertrag_data_arr)) // TODO: slows down Bestell-process -> better chronjob? + { + // return error information // TODO: implement after decision regarding communication process + } + } + + // ----------------------------------------------------------------------------------------------------------------- + // Private methods + + /** + * Retrieve the UID of the logged user and checks if it is valid + */ + private function _setAuthUID() + { + $this->_uid = getAuthUID(); + + if (!$this->_uid) show_error('User authentification failed'); + } + + private function _sendMail($lehrvertrag_data_arr) + { + // Cluster data of new lehrvertraege as needed to send mail + $lehrvertrag_data_arr = $this->_cluster_newVertragData($lehrvertrag_data_arr); + + foreach ($lehrvertrag_data_arr as $lehrvertrag_data) + { + // Get mail recipients + $result = $this->BenutzerrolleModel->getBenutzerByBerechtigung('lehre/lehrauftrag_erteilen', $lehrvertrag_data['lv_oe_kurzbz']); + + // If given lv organisational unit has no authorized user, check if is a Kompetenzfeld. + // If so, look up for authorized user on Department level. + if (!hasData($result)) { + $result = $this->OrganisationseinheitModel->getParent($lehrvertrag_data['lv_oe_kurzbz']); + + if (hasData($result)) { + if ($result->retval[0]->organisationseinheittyp_kurzbz === 'Department') { + $result = $this->BenutzerrolleModel->getBenutzerByBerechtigung('lehre/lehrauftrag_erteilen', $result->retval[0]->oe_kurzbz); + } + } + } + + // Set mail recipients (department assistance/leader) + $to = ''; + $to_arr = array(); + foreach ($result->retval as $berechtigung) { + $to_arr []= $berechtigung->uid . '@' . DOMAIN; // TODO: als array, dann splitten mit ;? oder als array lassen? + } + $to = implode(', ', $to_arr); + + // Set link to lehrauftrag-site with preselected studiengang and studiensemester of new lehrauftraege + $url = site_url(self::LEHRAUFTRAG_URI).'?studiensemester='. $lehrvertrag_data['studiensemester_kurzbz']. '&studiengang='. $lehrvertrag_data['studiengang_kz']; + + // Prepare mail content + $content_data_arr = array( + 'anzahl' => $lehrvertrag_data['amount_new_lehrvertraege'], + 'studiengang' => $lehrvertrag_data['studiengang_kz'], + 'studiensemester' => $lehrvertrag_data['studiensemester_kurzbz'], + 'link' => anchor($url, 'Lehrverträge Übersicht') + ); + + // Send mail + sendSanchoMail( + 'LehrauftragBestellMail', + $content_data_arr, + $to, + 'Bestellung neuer Lehraufträge', + 'sancho_header_min_bw.jpg', + 'sancho_footer_min_bw.jpg' + ); + } + } + + /** + * Clusters data as needed for _sendMail. + * Makes array of new lehrvertraege unique (by studiensemester, studiengang and lv_oe_kurzbz) + * Adds the amount of lehrvertraege of each unique array element. + * @param $new_lehrvertrag_data_arr + * @return array + */ + private function _cluster_newVertragData($new_lehrvertrag_data_arr) + { + $unique_new_lehrvertrag_data_arr = array_unique($new_lehrvertrag_data_arr, SORT_REGULAR); + foreach ($unique_new_lehrvertrag_data_arr as &$new_lehrvertrag) + { + $cnt = 1; + foreach ($new_lehrvertrag_data_arr as $item) + { + if ($new_lehrvertrag['studiensemester_kurzbz'] === $item['studiensemester_kurzbz'] && + $new_lehrvertrag['studiengang_kz'] === $item['studiengang_kz'] && + $new_lehrvertrag['lv_oe_kurzbz'] === $item['lv_oe_kurzbz']) + { + $new_lehrvertrag['amount_new_lehrvertraege'] = $cnt++; + } + } + } + + return $unique_new_lehrvertrag_data_arr; + } + + private function validateGetPost($lehrauftrag){ + $lehreinheit_id = (isset($lehrauftrag['lehreinheit_id']) && is_numeric($lehrauftrag['lehreinheit_id'])) ? $lehrauftrag['lehreinheit_id'] : null; + $lehrveranstaltung_id = (isset($lehrauftrag['lehrveranstaltung_id']) && is_numeric($lehrauftrag['lehrveranstaltung_id'])) ? $lehrauftrag['lehrveranstaltung_id'] : null; + $person_id = (isset($lehrauftrag['person_id']) && is_numeric($lehrauftrag['person_id'])) ? $lehrauftrag['person_id'] : null; + $mitarbeiter_uid = (isset($lehrauftrag['mitarbeiter_uid']) && is_string($lehrauftrag['mitarbeiter_uid'])) ? $lehrauftrag['mitarbeiter_uid'] : null; + $vertrag_id = (isset($lehrauftrag['vertrag_id']) && is_numeric($lehrauftrag['vertrag_id'])) ? $lehrauftrag['vertrag_id'] : null; + $projektarbeit_id = (isset($lehrauftrag['projektarbeit_id']) && is_numeric($lehrauftrag['projektarbeit_id'])) ? $lehrauftrag['projektarbeit_id'] : null; + $stunden = (isset($lehrauftrag['stunden']) && is_numeric($lehrauftrag['stunden'])) ? $lehrauftrag['stunden'] : null; + $betrag = (isset($lehrauftrag['betrag']) && is_numeric($lehrauftrag['betrag'])) ? $lehrauftrag['betrag'] : null; + $studiensemester_kurzbz = (isset($lehrauftrag['studiensemester_kurzbz']) && is_string($lehrauftrag['studiensemester_kurzbz'])) ? $lehrauftrag['betrag'] : null; + + return array( + $lehreinheit_id, + $lehrveranstaltung_id, + $person_id, + $mitarbeiter_uid, + $vertrag_id, + $projektarbeit_id, + $stunden, + $betrag, + $studiensemester_kurzbz + ); + +// LIST IS TO BE SET ABOVE!!!: +// list( +// $lehreinheit_id, +// $lehrveranstaltung_id, +// $person_id, +// $mitarbeiter_uid, +// $vertrag_id, +// $projektarbeit_id, +// $stunden, +// $betrag, +// $studiensemester_kurzbz +// ) = $this->_validateGetPost($lehrauftrag); + } +} diff --git a/application/controllers/lehre/lehrauftrag/LehrauftragAkzeptieren.php b/application/controllers/lehre/lehrauftrag/LehrauftragAkzeptieren.php new file mode 100644 index 000000000..8ed9aa320 --- /dev/null +++ b/application/controllers/lehre/lehrauftrag/LehrauftragAkzeptieren.php @@ -0,0 +1,202 @@ + 'lehre/lehrauftrag_akzeptieren:r', + 'acceptLehrauftrag' => 'lehre/lehrauftrag_akzeptieren:rw', + 'checkInkludierteLehre' => 'lehre/lehrauftrag_akzeptieren:rw' + ) + ); + + // Load models + $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + $this->load->model('accounting/Vertrag_model', 'VertragModel'); + $this->load->model('accounting/Vertragvertragsstatus_model', 'VertragvertragsstatusModel'); + $this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel'); + $this->load->model('codex/Bisverwendung_model', 'BisverwendungModel'); + $this->load->model('person/Benutzer_model', 'BenutzerModel'); + + // Load libraries + $this->load->library('WidgetLib'); + $this->load->library('PermissionLib'); + $this->load->library('AuthLib'); + + // Load helpers + $this->load->helper('array'); + $this->load->helper('url'); + + // Load language phrases + $this->loadPhrases( + array( + 'global', + 'ui', + 'lehre' + ) + ); + + $this->_setAuthUID(); // sets property uid + + $this->setControllerId(); // sets the controller id + } + + // ----------------------------------------------------------------------------------------------------------------- + // Public methods + + /** + * Main page of Lehrauftrag + */ + public function index() + { + // Set studiensemester selected for studiengang dropdown + $studiensemester_kurzbz = $this->input->get('studiensemester'); // if provided by selected studiensemester + if (is_null($studiensemester_kurzbz)) // else set next studiensemester as default value + { + $studiensemester = $this->StudiensemesterModel->getNext(); + if (hasData($studiensemester)) + { + $studiensemester_kurzbz = $studiensemester->retval[0]->studiensemester_kurzbz; + } + elseif (isError($studiensemester)) + { + show_error($studiensemester->error); + } + } + + $view_data = array( + 'studiensemester_selected' => $studiensemester_kurzbz + ); + + $this->load->view('lehre/lehrauftrag/acceptLehrauftrag.php', $view_data); + } + + /** + * Set the contract status of Lehrauftrag to 'akzeptiert'. + * Performed on ajax call. + */ + public function acceptLehrauftrag() + { + // Verify password + $password = $this->input->post('password'); + if (!isEmptyString($password)) + { + $result = $this->authlib->checkUserAuthByUsernamePassword($this->_uid, $password); + if (isError($result)) + { + return $this->outputJsonError('Passwort ist inkorrekt'); // exit if password is incorrect + } + } + else + { + show_error('Password is missing'); + } + + // Loop through lehraufträge + $lehrauftrag_arr = $this->input->post('selected_data'); + + if(is_array($lehrauftrag_arr)) + { + foreach($lehrauftrag_arr as $lehrauftrag) + { + $vertrag_id = (!is_null($lehrauftrag['vertrag_id'])) ? $lehrauftrag['vertrag_id'] : null; + + // Check if user is entitled to accept this Lehrauftrag + // * first retrieve person_id of the contract + $this->VertragModel->addSelect('person_id'); + + if ($result = getData($this->VertragModel->load($vertrag_id))) + { + // * then find the uid of that contracts person_id + $this->BenutzerModel->addSelect('uid'); + + if ($result = getData($this->BenutzerModel->getFromPersonId($result[0]->person_id))) + { + // * finally check uid of contract against the logged in user + if ($result[0]->uid != $this->_uid) + { + show_error('Keine Berechtigung für diesen Vertrag'); + } + } + else + { + show_error($result->retval); + } + } + else + { + show_error($result->retval); + } + + // Set status to accepted + $result = $this->VertragvertragsstatusModel->setStatus($vertrag_id, $this->_uid, 'akzeptiert'); + + if ($result->retval) + { + $json []= array( + 'row_index' => $lehrauftrag['row_index'], + 'akzeptiert' => date('Y-m-d') + ); + } + } + + // Output json to ajax + if (isset($json) && !isEmptyArray($json)) + { + $this->outputJsonSuccess($json); + } + } + } + + /** + * Check if lectors latest active Verwendung has inkludierte Lehre + * - inkludierte_lehre is null: freelancer lector -> has NO inkludierte Lehre + * - inkludierte_lehre -1: fix employed lector -> all inclusive Lehre + * - inkludierte_lehre > 0: fix employed lector -> given value is inclusive Lehre + */ + public function checkInkludierteLehre() + { + $result = $this->BisverwendungModel->getLast($this->_uid); + + if (hasData($result)) + { + $this->outputJsonSuccess(!is_null($result->retval[0]->inkludierte_lehre)); + } + else + { + $this->outputJsonError($result->retval); + } + } + + // ----------------------------------------------------------------------------------------------------------------- + // Private methods + + /** + * Retrieve the UID of the logged user and checks if it is valid + */ + private function _setAuthUID() + { + $this->_uid = getAuthUID(); + + if (!$this->_uid) show_error('User authentification failed'); + } + +} diff --git a/application/controllers/lehre/lehrauftrag/LehrauftragErteilen.php b/application/controllers/lehre/lehrauftrag/LehrauftragErteilen.php new file mode 100644 index 000000000..1fe5a924a --- /dev/null +++ b/application/controllers/lehre/lehrauftrag/LehrauftragErteilen.php @@ -0,0 +1,193 @@ + 'lehre/lehrauftrag_erteilen:r', + 'approveLehrauftrag' => 'lehre/lehrauftrag_erteilen:rw' + ) + ); + + // Load models + $this->load->model('system/Benutzerrolle_model', 'BenutzerrolleModel'); + $this->load->model('organisation/Organisationseinheit_model', 'OrganisationseinheitModel'); + $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + $this->load->model('organisation/Studiengang_model', 'StudiengangModel'); + $this->load->model('accounting/Vertrag_model', 'VertragModel'); + $this->load->model('accounting/Vertragvertragsstatus_model', 'VertragvertragsstatusModel'); + + // Load libraries + $this->load->library('WidgetLib'); + $this->load->library('PermissionLib'); + + // Load helpers + $this->load->helper('array'); + $this->load->helper('url'); + + // Load language phrases + $this->loadPhrases( + array( + 'global', + 'ui', + 'lehre' + ) + ); + + $this->_setAuthUID(); // sets property uid + + $this->setControllerId(); // sets the controller id + } + + // ----------------------------------------------------------------------------------------------------------------- + // Public methods + + /** + * Main page of Lehrauftrag + */ + public function index() + { + // Set studiengang to be selected in studiengang dropdown + $oe_kurzbz = $this->input->get('organisationseinheit'); // if provided by selected studiengang + $oe_kurzbz = ($oe_kurzbz == 'null' ? null : $oe_kurzbz); + + // Retrieve studiengaenge the user is entitled for to populate studiengang dropdown + if (!$oe_kurzbz_arr = $this->permissionlib->getOE_isEntitledFor(self::BERECHTIGUNG_LEHRAUFTRAG_ERTEILEN)) + { + show_error('Fehler bei Berechtigungsprüfung'); + } + + // If oe_kurzbz get param was set, check against entitled stg + if (!is_null($oe_kurzbz)) + { + if (!in_array($oe_kurzbz, $oe_kurzbz_arr)) + { + show_error('Keine Berechtigung für diese Organisationseinheit'); + } + } + + // Set studiensemester selected for studiengang dropdown + $studiensemester_kurzbz = $this->input->get('studiensemester'); // if provided by selected studiensemester + if (is_null($studiensemester_kurzbz)) // else set next studiensemester as default value + { + $studiensemester = $this->StudiensemesterModel->getNext(); + if (hasData($studiensemester)) + { + $studiensemester_kurzbz = $studiensemester->retval[0]->studiensemester_kurzbz; + } + elseif (isError($studiensemester)) + { + show_error($studiensemester->error); + } + } + + // Set ausbildungssemester selected for ausbildungssemester dropdown + $ausbildungssemester = $this->input->get('ausbildungssemester'); // if provided by selected ausbildungssemester + $ausbildungssemester = ($ausbildungssemester == 'null' ? null : $ausbildungssemester); + + $view_data = array( + 'organisationseinheit_selected' => $oe_kurzbz, + 'organisationseinheit' => $oe_kurzbz_arr, + 'studiensemester_selected' => $studiensemester_kurzbz, + 'ausbildungssemester_selected' => $ausbildungssemester, + ); + + $this->load->view('lehre/lehrauftrag/approveLehrauftrag.php', $view_data); + } + + /** + * Set the contract status of Lehrauftrag to 'erteilt'. + * Performed on ajax call. + */ + public function approveLehrauftrag() + { + $lehrauftrag_arr = json_decode($this->input->post('selected_data')); + + if (is_array($lehrauftrag_arr)) + { + foreach ($lehrauftrag_arr as $lehrauftrag) + { + $mitarbeiter_uid = (isset($lehrauftrag->mitarbeiter_uid)) ? $lehrauftrag->mitarbeiter_uid : null; + $vertrag_id = (isset($lehrauftrag->vertrag_id)) ? $lehrauftrag->vertrag_id : null; + + $lv_oe_kurzbz = null; + + // Retrieve organisational unit to which the lehrveranstaltung of the contract belongs to + // * first get lehrveranstaltung + $result = $this->VertragModel->getLehreinheitData($vertrag_id, 'lehrveranstaltung_id'); + if (hasData($result)) + { + // * then get corresponding organisational unit + $this->load->model('education/Lehrveranstaltung_model', 'Lehrveranstaltung_model'); + $result = $this->LehrveranstaltungModel->load($result->retval[0]->lehrveranstaltung_id); + if (hasData($result)) + { + $lv_oe_kurzbz = $result->retval[0]->oe_kurzbz; + } + elseif (isError(($result))) + { + show_error($result->retval); + } + } + elseif (isError($result)) + { + show_error($result->retval); + } + + // Check if user is entitled to approve this lehrauftrag (by permission and organisational unit) + if (!$this->permissionlib->isBerechtigt(self::BERECHTIGUNG_LEHRAUFTRAG_ERTEILEN, 'suid', $lv_oe_kurzbz)){ + show_error('Keine Erteilberechtigung für diese Organisationseinheit: '. $lv_oe_kurzbz); + } + + // Approve lehrauftrag by setting vertragsstatus to 'erteilt' + $result = $this->VertragvertragsstatusModel->setStatus($vertrag_id, $mitarbeiter_uid, 'erteilt'); + + if ($result->retval) { + $json [] = array( + 'row_index' => $lehrauftrag->row_index, + 'erteilt' => date('Y-m-d') + ); + } + } + } + // output json to ajax + if (isset($json) && !isEmptyArray($json)) + { + $this->outputJsonSuccess($json); + } + } + + // ----------------------------------------------------------------------------------------------------------------- + // Private methods + + /** + * Retrieve the UID of the logged user and checks if it is valid + */ + private function _setAuthUID() + { + $this->_uid = getAuthUID(); + + if (!$this->_uid) show_error('User authentification failed'); + } + +} diff --git a/application/controllers/organisation/Studienjahr.php b/application/controllers/organisation/Studienjahr.php index c3c841df9..e154734d4 100644 --- a/application/controllers/organisation/Studienjahr.php +++ b/application/controllers/organisation/Studienjahr.php @@ -20,7 +20,7 @@ class Studienjahr extends Auth_Controller 'editStudienjahr' => 'basis/studiensemester:rw', 'newStudienjahr' => 'basis/studiensemester:rw', 'insStudienjahr' => 'basis/studiensemester:rw', - 'saveStudienjahr' => 'basis/studiensemester:rw', + 'updateStudienjahr' => 'basis/studiensemester:rw', 'deleteStudienjahr' => 'basis/studiensemester:rw' ) ); @@ -117,6 +117,10 @@ class Studienjahr extends Auth_Controller public function insStudienjahr() { $data = $this->__retrieveStudienjahrData(); + $studienjahr_exists = $this->StudienjahrModel->load($data['studienjahr_kurzbz']); + if (hasData($studienjahr_exists)) + show_error("Studienjahr existiert bereits"); + $studienjahr = $this->StudienjahrModel->insert($data); if ($studienjahr->error) @@ -177,7 +181,7 @@ class Studienjahr extends Auth_Controller * replaces slash in Kurzbezeichnung with underscore * saved=true is a GET parameter passed for showing save message */ - public function saveStudienjahr() + public function updateStudienjahr() { $data = $this->__retrieveStudienjahrData(); $studienjahr = $this->StudienjahrModel->update($data['studienjahr_kurzbz'], $data); diff --git a/application/controllers/organisation/Studiensemester.php b/application/controllers/organisation/Studiensemester.php index cdca4997d..1e1aa45ee 100644 --- a/application/controllers/organisation/Studiensemester.php +++ b/application/controllers/organisation/Studiensemester.php @@ -20,7 +20,7 @@ class Studiensemester extends Auth_Controller 'editStudiensemester' => 'basis/studiensemester:rw', 'newStudiensemester' => 'basis/studiensemester:rw', 'insStudiensemester' => 'basis/studiensemester:rw', - 'saveStudiensemester' => 'basis/studiensemester:rw', + 'updateStudiensemester' => 'basis/studiensemester:rw', 'deleteStudiensemester' => 'basis/studiensemester:rw' ) ); @@ -108,6 +108,11 @@ class Studiensemester extends Auth_Controller public function insStudiensemester() { $data = $this->__retrieveStudiensemesterData(); + + $studiensemester_exists = $this->StudiensemesterModel->load($data['studiensemester_kurzbz']); + if (hasData($studiensemester_exists)) + show_error("Studiensemester existiert bereits"); + $semester = $this->StudiensemesterModel->insert($data); if ($semester->error) @@ -185,7 +190,7 @@ class Studiensemester extends Auth_Controller * redirects to edit page after inserting * saved=true is a GET parameter passed for showing save message */ - public function saveStudiensemester() + public function updateStudiensemester() { $data = $this->__retrieveStudiensemesterData(); $semester = $this->StudiensemesterModel->update($data['studiensemester_kurzbz'], $data); @@ -214,5 +219,4 @@ class Studiensemester extends Auth_Controller redirect("/organisation/studiensemester/listStudiensemester"); } - } diff --git a/application/controllers/system/Filters.php b/application/controllers/widgets/Filters.php similarity index 70% rename from application/controllers/system/Filters.php rename to application/controllers/widgets/Filters.php index b29bd2bb0..b5cbc07ea 100644 --- a/application/controllers/system/Filters.php +++ b/application/controllers/widgets/Filters.php @@ -3,7 +3,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); /** - * This controller operates between (interface) the JS (GUI) and the FiltersLib (back-end) + * This controller operates between (interface) the JS (GUI) and the FilterWidgetLib (back-end) * Provides data to the ajax get calls about the filter * Accepts 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 @@ -12,10 +12,10 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); */ class Filters extends FHC_Controller { - const FILTER_PAGE_PARAM = 'filter_page'; + const FILTER_UNIQUE_ID = 'filterUniqueId'; /** - * Calls the parent's constructor and loads the FiltersLib + * Calls the parent's constructor and loads the FilterWidgetLib */ public function __construct() { @@ -24,8 +24,8 @@ class Filters extends FHC_Controller // Loads authentication library and starts authentication $this->load->library('AuthLib'); - // Loads the FiltersLib with HTTP GET/POST parameters - $this->_loadFiltersLib(); + // Loads the FilterWidgetLib with HTTP GET/POST parameters + $this->_loadFilterWidgetLib(); // Checks if the caller is allow to read this data $this->_isAllowed(); @@ -39,7 +39,7 @@ class Filters extends FHC_Controller */ public function getFilter() { - $this->outputJsonSuccess($this->filterslib->getSession()); + $this->outputJsonSuccess($this->filterwidgetlib->getSession()); } /** @@ -48,7 +48,7 @@ class Filters extends FHC_Controller public function rowNumber() { $rowNumber = 0; - $dataset = $this->filterslib->getSessionElement(FiltersLib::SESSION_DATASET); + $dataset = $this->filterwidgetlib->getSessionElement(FilterWidgetLib::SESSION_DATASET); if (isset($dataset) && is_array($dataset)) { @@ -66,7 +66,7 @@ class Filters extends FHC_Controller { $selectedFields = $this->input->post('selectedFields'); - if ($this->filterslib->sortSelectedFields($selectedFields) == true) + if ($this->filterwidgetlib->sortSelectedFields($selectedFields) == true) { $this->getFilter(); } @@ -84,7 +84,7 @@ class Filters extends FHC_Controller { $selectedField = $this->input->post('selectedField'); - if ($this->filterslib->removeSelectedField($selectedField) == true) + if ($this->filterwidgetlib->removeSelectedField($selectedField) == true) { $this->getFilter(); } @@ -101,7 +101,7 @@ class Filters extends FHC_Controller { $selectedField = $this->input->post('selectedField'); - if ($this->filterslib->addSelectedField($selectedField) == true) + if ($this->filterwidgetlib->addSelectedField($selectedField) == true) { $this->getFilter(); } @@ -118,7 +118,7 @@ class Filters extends FHC_Controller { $appliedFilter = $this->input->post('appliedFilter'); - if ($this->filterslib->removeAppliedFilter($appliedFilter) == true) + if ($this->filterwidgetlib->removeAppliedFilter($appliedFilter) == true) { $this->outputJsonSuccess('Removed'); } @@ -138,7 +138,7 @@ class Filters extends FHC_Controller $appliedFiltersConditions = $this->input->post('appliedFiltersConditions'); $appliedFiltersOptions = $this->input->post('appliedFiltersOptions'); - if ($this->filterslib->applyFilters( + if ($this->filterwidgetlib->applyFilters( $appliedFilters, $appliedFiltersOperations, $appliedFiltersConditions, @@ -160,7 +160,7 @@ class Filters extends FHC_Controller { $filter = $this->input->post('filter'); - if ($this->filterslib->addFilter($filter) == true) + if ($this->filterwidgetlib->addFilter($filter) == true) { $this->getFilter(); } @@ -177,7 +177,7 @@ class Filters extends FHC_Controller { $customFilterDescription = $this->input->post('customFilterDescription'); - if ($this->filterslib->saveCustomFilter($customFilterDescription) == true) + if ($this->filterwidgetlib->saveCustomFilter($customFilterDescription) == true) { $this->outputJsonSuccess('Saved'); } @@ -194,7 +194,7 @@ class Filters extends FHC_Controller { $filter_id = $this->input->post('filter_id'); - if ($this->filterslib->removeCustomFilter($filter_id) == true) + if ($this->filterwidgetlib->removeCustomFilter($filter_id) == true) { $this->outputJsonSuccess('Removed'); } @@ -211,7 +211,7 @@ class Filters extends FHC_Controller public function setNavigationMenu() { // Generates the filters structure array - $filterMenu = $this->filterslib->generateFilterMenu($this->input->get(FiltersLib::NAVIGATION_PAGE)); + $filterMenu = $this->filterwidgetlib->generateFilterMenu($this->input->get(FilterWidgetLib::NAVIGATION_PAGE)); $this->outputJsonSuccess('Success'); } @@ -221,7 +221,7 @@ class Filters extends FHC_Controller */ public function reloadDataset() { - $this->filterslib->reloadDataset(); + $this->filterwidgetlib->reloadDataset(); $this->outputJsonSuccess('Success'); } @@ -234,38 +234,40 @@ class Filters extends FHC_Controller */ private function _isAllowed() { - if (!$this->filterslib->isAllowed()) + if (!$this->filterwidgetlib->isAllowed()) { $this->terminateWithJsonError('You are not allowed to access to this content'); } } /** - * Loads the FiltersLib with the FILTER_PAGE_PARAM parameter - * If the parameter FILTER_PAGE_PARAM is not given then the execution of the controller is terminated and + * Loads the FilterWidgetLib 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 _loadFiltersLib() + private function _loadFilterWidgetLib() { - // If the parameter FILTER_PAGE_PARAM is present in the HTTP GET or POST - if (isset($_GET[self::FILTER_PAGE_PARAM]) || isset($_POST[self::FILTER_PAGE_PARAM])) + // If the parameter FILTER_UNIQUE_ID is present in the HTTP GET or POST + if (isset($_GET[self::FILTER_UNIQUE_ID]) || isset($_POST[self::FILTER_UNIQUE_ID])) { // If it is present in the HTTP GET - if (isset($_GET[self::FILTER_PAGE_PARAM])) + if (isset($_GET[self::FILTER_UNIQUE_ID])) { - $filterPage = $this->input->get(self::FILTER_PAGE_PARAM); // is retrieved from the HTTP GET + $filterUniqueId = $this->input->get(self::FILTER_UNIQUE_ID); // is retrieved from the HTTP GET } - elseif (isset($_POST[self::FILTER_PAGE_PARAM])) // Else if it is present in the HTTP POST + elseif (isset($_POST[self::FILTER_UNIQUE_ID])) // Else if it is present in the HTTP POST { - $filterPage = $this->input->post(self::FILTER_PAGE_PARAM); // is retrieved from the HTTP POST + $filterUniqueId = $this->input->post(self::FILTER_UNIQUE_ID); // is retrieved from the HTTP POST } - // Loads the FiltersLib that contains all the used logic - $this->load->library('FiltersLib', array(self::FILTER_PAGE_PARAM => $filterPage)); + // Loads the FilterWidgetLib that contains all the used logic + $this->load->library('FilterWidgetLib'); + + $this->filterwidgetlib->setFilterUniqueId($filterUniqueId); } else // Otherwise an error will be written in the output { - $this->terminateWithJsonError('Parameter "'.self::FILTER_PAGE_PARAM.'" not provided!'); + $this->terminateWithJsonError('Parameter "'.self::FILTER_UNIQUE_ID.'" not provided!'); } } } diff --git a/application/controllers/widgets/Tables.php b/application/controllers/widgets/Tables.php new file mode 100644 index 000000000..21161ff9f --- /dev/null +++ b/application/controllers/widgets/Tables.php @@ -0,0 +1,105 @@ +load->library('AuthLib'); + + // Loads the tablewidgetlib with HTTP GET/POST parameters + $this->_loadTableWidgetLib(); + + // Checks if the caller is allow to read this data + $this->_isAllowed(); + } + + //------------------------------------------------------------------------------------------------------------------ + // Public methods + + /** + * Retrieves data about the current filter from the session and will be written on the output in JSON format + */ + public function getTable() + { + $this->outputJsonSuccess($this->tablewidgetlib->getSession()); + } + + /** + * Retrieves the number of records present in the current dataset and will be written on the output in JSON format + */ + public function rowNumber() + { + $rowNumber = 0; + $dataset = $this->tablewidgetlib->getSessionElement(TableWidgetLib::SESSION_DATASET); + + if (isset($dataset) && is_array($dataset)) + { + $rowNumber = count($dataset); + } + + $this->outputJsonSuccess($rowNumber); + } + + //------------------------------------------------------------------------------------------------------------------ + // Private methods + + /** + * Checks if the user is allowed to use this filter + */ + private function _isAllowed() + { + if (!$this->tablewidgetlib->isAllowed()) + { + $this->terminateWithJsonError('You are not allowed to access to this content'); + } + } + + /** + * Loads the tablewidgetlib with the TABLE_UNIQUE_ID parameter + * If the parameter TABLE_UNIQUE_ID is not given then the execution of the controller is terminated and + * an error message is printed + */ + private function _loadTableWidgetLib() + { + // If the parameter TABLE_UNIQUE_ID is present in the HTTP GET or POST + if (isset($_GET[self::TABLE_UNIQUE_ID]) || isset($_POST[self::TABLE_UNIQUE_ID])) + { + // If it is present in the HTTP GET + if (isset($_GET[self::TABLE_UNIQUE_ID])) + { + $tableUniqueId = $this->input->get(self::TABLE_UNIQUE_ID); // is retrieved from the HTTP GET + } + elseif (isset($_POST[self::TABLE_UNIQUE_ID])) // Else if it is present in the HTTP POST + { + $tableUniqueId = $this->input->post(self::TABLE_UNIQUE_ID); // is retrieved from the HTTP POST + } + + // Loads the tablewidgetlib that contains all the used logic + $this->load->library('TableWidgetLib'); + + $this->tablewidgetlib->setTableUniqueId($tableUniqueId); + } + else // Otherwise an error will be written in the output + { + $this->terminateWithJsonError('Parameter "'.self::TABLE_UNIQUE_ID.'" not provided!'); + } + } +} diff --git a/application/libraries/FiltersLib.php b/application/libraries/FilterWidgetLib.php similarity index 96% rename from application/libraries/FiltersLib.php rename to application/libraries/FilterWidgetLib.php index 6875d16ec..0117377a5 100644 --- a/application/libraries/FiltersLib.php +++ b/application/libraries/FilterWidgetLib.php @@ -5,7 +5,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); /** * FilterWidget logic */ -class FiltersLib +class FilterWidgetLib { // Session parameters names const SESSION_NAME = 'FHC_FILTER_WIDGET'; // Filter session name @@ -22,6 +22,7 @@ class FiltersLib const SESSION_RELOAD_DATASET = 'reloadDataset'; const SESSION_DATASET_REPRESENTATION = 'datasetRepresentation'; const SESSION_DATASET_REP_OPTIONS = 'datasetRepresentationOptions'; + const SESSION_DATASET_REP_FIELDS_DEFS = 'datasetRepresentationFieldsDefinitions'; // Alias for the dynamic table used to retrieve the dataset const DATASET_TABLE_ALIAS = 'datasetFilterTable'; @@ -53,18 +54,23 @@ class FiltersLib const MARK_ROW = 'markRow'; // ...to hide the options for a filter - const HIDE_HEADER = 'hideHeader'; + const HIDE_OPTIONS = 'hideOptions'; + const HIDE_SELECT_FIELDS = 'hideSelectFields'; + const HIDE_SELECT_FILTERS = 'hideSelectFilters'; const HIDE_SAVE = 'hideSave'; const CUSTOM_MENU = 'customMenu'; // ...to specify if the menu for this filter is custom (true) or not (false) + const HIDE_MENU = 'hideMenu'; // ...to specify if the menu should be shown or not // ...to specify how to represent the dataset (ex: tablesorter, pivotUI, ...) const DATASET_REPRESENTATION = 'datasetRepresentation'; const DATASET_REP_OPTIONS = 'datasetRepOptions'; + const DATASET_REP_FIELDS_DEFS = 'datasetRepFieldsDefs'; // Different dataset representations const DATASET_REP_TABLESORTER = 'tablesorter'; const DATASET_REP_PIVOTUI = 'pivotUI'; + const DATASET_REP_TABULATOR = 'tabulator'; // Filter operations values const OP_EQUAL = 'equal'; @@ -84,7 +90,7 @@ class FiltersLib const FILTER_PHRASES_CATEGORY = 'FilterWidget'; // The category used to store phrases for the FilterWidget - const FILTER_PAGE_PARAM = 'filter_page'; // Filter page parameter name + const FILTER_UNIQUE_ID = 'filterUniqueId'; // Filter page parameter name const PERMISSION_FILTER_METHOD = 'FilterWidget'; // Name for fake method to be checked by the PermissionLib const PERMISSION_TYPE = 'rw'; @@ -107,8 +113,6 @@ class FiltersLib public function __construct($params = null) { $this->_ci =& get_instance(); // get code igniter instance - - $this->_filterUniqueId = $this->_getFilterUniqueId($params); // sets the id for the related filter widget } //------------------------------------------------------------------------------------------------------------------ @@ -689,7 +693,7 @@ class FiltersLib public function generateFilterMenu($navigationPage) { // Loads the NavigationLib for the current page (given as parameter) - $this->_ci->load->library('NavigationLib', array(FiltersLib::NAVIGATION_PAGE => $navigationPage)); + $this->_ci->load->library('NavigationLib', array(FilterWidgetLib::NAVIGATION_PAGE => $navigationPage)); $filterMenu = null; $currentMenu = $this->_ci->navigationlib->getSessionMenu(); // The navigation menu currently stored in session @@ -771,7 +775,7 @@ class FiltersLib ); // Sets in the session only the element related to the filters menu - $this->_ci->navigationlib->setSessionElementMenu(FiltersLib::NAV_MENU_FILTER_KEY, $filterMenu); + $this->_ci->navigationlib->setSessionElementMenu(FilterWidgetLib::NAV_MENU_FILTER_KEY, $filterMenu); } } } @@ -784,14 +788,14 @@ class FiltersLib * NOTE: The default value is the URI where the FilterWidget is called * If the fhc_controller_id is present then is also used */ - private function _getFilterUniqueId($params) + public function setFilterUniqueIdByParams($params) { if ($params != null && is_array($params) - && isset($params[self::FILTER_PAGE_PARAM]) - && !isEmptyString($params[self::FILTER_PAGE_PARAM])) + && isset($params[self::FILTER_UNIQUE_ID]) + && !isEmptyString($params[self::FILTER_UNIQUE_ID])) { - $filterUniqueId = $params[self::FILTER_PAGE_PARAM]; + $filterUniqueId = $params[self::FILTER_UNIQUE_ID]; } else { @@ -799,6 +803,14 @@ class FiltersLib $filterUniqueId = $this->_ci->router->directory.$this->_ci->router->class.'/'.$this->_ci->router->method; } + $this->setFilterUniqueId($filterUniqueId); + } + + /** + * + */ + public function setFilterUniqueId($filterUniqueId) + { // If the FHC_CONTROLLER_ID parameter is present in the HTTP GET if (isset($_GET[self::FHC_CONTROLLER_ID])) { @@ -809,7 +821,7 @@ class FiltersLib $filterUniqueId .= '/'.$this->_ci->input->post(self::FHC_CONTROLLER_ID); // then use it } - return $filterUniqueId; + $this->_filterUniqueId = $filterUniqueId; } /** diff --git a/application/libraries/PermissionLib.php b/application/libraries/PermissionLib.php index b84359216..348c8b87b 100644 --- a/application/libraries/PermissionLib.php +++ b/application/libraries/PermissionLib.php @@ -254,6 +254,45 @@ class PermissionLib return !$this->_inLAPersonIdsBlacklist($person_id) && $this->_hasLAPermissions(); } + /** + * Returns the study programs the person is entitled for. + * @param null $berechtigung_kurzbz If given, only study programs are retrieved according to organisational units + * assigned to that permission. + * @return array|bool array of studiengang_kz the person is entitled for. False on error. + */ + public function getSTG_isEntitledFor($berechtigung_kurzbz = null) + { + $studiengang_kz_arr = array(); + + if (self::$bb->getStgKz($berechtigung_kurzbz)) + { + return $studiengang_kz_arr = self::$bb->getStgKz($berechtigung_kurzbz); + } + else + { + return false; + } + } + + /** + * Returns the organisational units the person is entitled for. + * @param null $berechtigung_kurzbz + * @return array|bool array of oe_kurzbz the person is entitled for. False on error. + */ + public function getOE_isEntitledFor($berechtigung_kurzbz = null) + { + $oe_kurzbz_arr = array(); + + if (self::$bb->getOEkurzbz($berechtigung_kurzbz)) + { + return $oe_kurzbz_arr = self::$bb->getOEkurzbz($berechtigung_kurzbz); + } + else + { + return false; + } + } + //------------------------------------------------------------------------------------------------------------------ // Private methods diff --git a/application/libraries/TableWidgetLib.php b/application/libraries/TableWidgetLib.php new file mode 100644 index 000000000..009103e68 --- /dev/null +++ b/application/libraries/TableWidgetLib.php @@ -0,0 +1,206 @@ +_ci =& get_instance(); // get code igniter instance + } + + //------------------------------------------------------------------------------------------------------------------ + // Public methods + + /** + * Checks if at least one of the permissions given as parameter (requiredPermissions) belongs + * to the authenticated user, if confirmed then is allowed to use this FilterWidget. + * If the parameter requiredPermissions is NOT given or is not present in the session, + * then NO one is allow to use this FilterWidget + * Wrapper method to permissionlib->hasAtLeastOne + */ + public function isAllowed($requiredPermissions = null) + { + $this->_ci->load->library('PermissionLib'); // Load permission library + + // Gets the required permissions from the session if they are not provided as parameter + $rq = $requiredPermissions; + if ($rq == null) $rq = $this->getSessionElement(self::REQUIRED_PERMISSIONS_PARAMETER); + + return $this->_ci->permissionlib->hasAtLeastOne($rq, self::PERMISSION_TABLE_METHOD, self::PERMISSION_TYPE); + } + + /** + * Wrapper method to the session helper funtions to retrieve the whole session for this filter + */ + public function getSession() + { + return getSessionElement(self::SESSION_NAME, $this->_tableUniqueId); + } + + /** + * Wrapper method to the session helper funtions to retrieve one element from the session of this filter + */ + public function getSessionElement($name) + { + $session = getSessionElement(self::SESSION_NAME, $this->_tableUniqueId); + + if (isset($session[$name])) + { + return $session[$name]; + } + + return null; + } + + /** + * Wrapper method to the session helper funtions to set the whole session for this filter + */ + public function setSession($data) + { + setSessionElement(self::SESSION_NAME, $this->_tableUniqueId, $data); + } + + /** + * Wrapper method to the session helper funtions to set one element in the session for this filter + */ + public function setSessionElement($name, $value) + { + $session = getSessionElement(self::SESSION_NAME, $this->_tableUniqueId); + + $session[$name] = $value; + + setSessionElement(self::SESSION_NAME, $this->_tableUniqueId, $session); // stores the single value + } + + /** + * Generate the query to retrieve the dataset for a filter + */ + public function generateDatasetQuery($query) + { + return 'SELECT * FROM ('.$query.') '.self::DATASET_TABLE_ALIAS; + } + + /** + * Retrieves the dataset from the DB + */ + public function getDataset($datasetQuery) + { + $dataset = null; + + if ($datasetQuery != null) + { + $this->_ci->load->model('system/Filters_model', 'FiltersModel'); + + // Execute the given SQL statement suppressing error messages + $dataset = @$this->_ci->FiltersModel->execReadOnlyQuery($datasetQuery); + } + + return $dataset; + } + + /** + * Retrieves metadata from the last executed query + */ + public function getExecutedQueryMetaData() + { + return $this->_ci->FiltersModel->getExecutedQueryMetaData(); + } + + /** + * Retrieves the list of fields from the last executed query + */ + public function getExecutedQueryListFields() + { + return $this->_ci->FiltersModel->getExecutedQueryListFields(); + } + + /** + * Return an unique string that identify this filter widget + * NOTE: The default value is the URI where the FilterWidget is called + * If the fhc_controller_id is present then is also used + */ + public function setTableUniqueIdByParams($params) + { + if ($params != null + && is_array($params) + && isset($params[self::TABLE_UNIQUE_ID]) + && !isEmptyString($params[self::TABLE_UNIQUE_ID])) + { + $tableUniqueId = $this->_ci->router->directory.$this->_ci->router->class.'/'. + $this->_ci->router->method.'/'. + $params[self::TABLE_UNIQUE_ID]; + + $this->setTableUniqueId($tableUniqueId); + } + } + + /** + * Set the _tableUniqueId property + */ + public function setTableUniqueId($tableUniqueId) + { + $this->_tableUniqueId = $tableUniqueId; + } +} diff --git a/application/models/accounting/Vertrag_model.php b/application/models/accounting/Vertrag_model.php index cd4b466d6..44b8a0881 100644 --- a/application/models/accounting/Vertrag_model.php +++ b/application/models/accounting/Vertrag_model.php @@ -10,5 +10,324 @@ class Vertrag_model extends DB_Model parent::__construct(); $this->dbTable = 'lehre.tbl_vertrag'; $this->pk = 'vertrag_id'; + + $this->load->model('accounting/Vertragvertragsstatus_model', 'VertragvertragsstatusModel'); + $this->load->model('education/Lehreinheitmitarbeiter_model', 'LehreinheitmitarbeiterModel'); + $this->load->model('education/Projektbetreuer_model', 'ProjektbetreuerModel'); } + + /** + * Saves Vertrag for a Lehrauftrag and sets Vertragsstatus to 'bestellt'. + * Also updates vertrag_id in tbl_lehreinheitmitarbeiter or tbl_projektbetreuer. + * @param $person_id + * @param $lehrveranstaltung_id + * @param $lehreinheit_id + * @param $projektarbeit_id + * @param $betrag Monetary amount of that Lehreinheit / Projektbetreuung. + * @param $vertragsstunden Working hours of that Lehreinheit / Projektbetreuung. + * @param $studiensemester_kurzbz + * @param $vertragstyp_kurzbz + * @return array|null On success object. On failure null. + */ + public function save($person_id, $mitarbeiter_uid, $lehrveranstaltung_id, $lehreinheit_id, $projektarbeit_id = null, $vertragsstunden, $betrag, $studiensemester_kurzbz) + { + $person_id = (isset($person_id) && is_numeric($person_id)) + ? $person_id + : show_error('peron_id must be set and numeric.'); + $lehreinheit_id = (isset($lehreinheit_id) && is_numeric($lehreinheit_id)) + ? $lehreinheit_id + : show_error('lehreinheit_id must be set and numeric.'); + $lehrveranstaltung_id = (isset($lehrveranstaltung_id) && is_numeric($lehrveranstaltung_id)) + ? $lehrveranstaltung_id + : show_error('lehrveranstaltung_id must be set and numeric.'); + $projektarbeit_id = (isset($projektarbeit_id) && is_numeric($projektarbeit_id)) + ? $projektarbeit_id + : null; + $vertragsstunden = (isset($vertragsstunden) && is_numeric($vertragsstunden)) + ? $vertragsstunden + : 0; + $betrag = (isset($betrag) && is_numeric($betrag)) + ? $betrag + : 0; + $mitarbeiter_uid = (isset($mitarbeiter_uid) && is_string($mitarbeiter_uid)) + ? $mitarbeiter_uid + : show_error('mitarbeiter_uid must be set and a string value.');; + + $vertragstyp_kurzbz = (is_null($projektarbeit_id)) ? 'Lehrauftrag' : 'Betreuung'; + + // First check if Vertrag already exists for that Lehrauftrag or for that Projektbetreuerauftrag + if ($vertragstyp_kurzbz == 'Lehrauftrag') + { + if ($this->LehreinheitmitarbeiterModel->hasVertrag($mitarbeiter_uid, $lehreinheit_id)) + { + return success(null); // Exit if Lehrauftrag already has Vertrag + } + } + elseif ($vertragstyp_kurzbz == 'Betreuung') + { + if ($this->ProjektbetreuerModel->hasVertrag($person_id, $projektarbeit_id)) + { + return success(null); // Exit if Projektbetreuung already has Vertrag + } + } + + // If Vertrag does not exist, create now + // Vertragsbezeichnung + $bezeichnung = $this->_writeVertragsbezeichung($lehrveranstaltung_id, $studiensemester_kurzbz); + + // Start DB transaction + $this->db->trans_start(false); + + // Insert Vertragsdata + $result = $this->insert( + array( + 'person_id' => $person_id, + 'lehrveranstaltung_id' => $lehrveranstaltung_id, + 'vertragstyp_kurzbz' => $vertragstyp_kurzbz, + 'bezeichnung' => $bezeichnung, + 'betrag' => $betrag, + 'insertamum' => 'NOW()', + 'insertvon' => getAuthUID(), + 'vertragsdatum' => 'NOW()', + 'vertragsstunden' => $vertragsstunden, + 'vertragsstunden_studiensemester_kurzbz' => $studiensemester_kurzbz + ) + ); + + // Retrieve primary key + $vertrag_id = $result->retval; + + // If Vertrag was created successfully, update vertrag_id + if (isSuccess($result)) + { + // if Lehrtätigkeit, update vertrag_id in tbl_lehreinheitmitarbeiter + if ($vertragstyp_kurzbz == 'Lehrauftrag') + { + $this->load->model('education/Lehreinheitmitarbeiter_model', 'LehreinheitmitarbeiterModel'); + $result = $this->LehreinheitmitarbeiterModel->update( + array( + 'lehreinheit_id' => $lehreinheit_id, + 'mitarbeiter_uid' =>$mitarbeiter_uid + ), + array( + 'vertrag_id' => $vertrag_id + ) + ); + } + // if (Projekt-)Betreuung, update vertrag_id in tbl_projektbetreuer + elseif ($vertragstyp_kurzbz == 'Betreuung') + { + $this->load->model('education/Projektbetreuer_model', 'ProjektbetreuerModel'); + $result = $this->ProjektbetreuerModel->update( + array( + 'person_id' => $person_id, + 'projektarbeit_id' => $projektarbeit_id + ), + array( + 'vertrag_id' => $vertrag_id + ) + ); + } + } + + // If updating vertrag_id was successfully, set Status to 'bestellt' + if (isSuccess($result)) + { + $result = $this->VertragvertragsstatusModel->setStatus($vertrag_id, $mitarbeiter_uid, 'bestellt'); + } + + // Transaction complete! + $this->db->trans_complete(); + + // Check if everything went ok during the transaction + if ($this->db->trans_status() === false || isError($result)) + { + $this->db->trans_rollback(); + return error($result->msg, EXIT_ERROR); + } + else + { + $this->db->trans_commit(); + return success($vertrag_id); + } + } + + /** + * Updates Vertrag and, if resets vertragsstatus as follows: + * - if vertragsstatus 'erteilt': delete status 'erteilt' and update date of status 'bestellt' + * - if vertragsstatus 'bestellt': update date of status 'bestellt' + * @param $vertrag_obj Object with vertrag properties vertrag_id, vertragsstunden, betrag. + * @param $mitarbeiter_uid + */ + public function updateVertrag($vertrag_id, $vertragsstunden, $betrag, $mitarbeiter_uid) + { + $vertrag_id = (isset($vertrag_id) && is_numeric($vertrag_id)) + ? $vertrag_id + : show_error('vertrag_id must be set and numeric.'); + $vertragsstunden = (isset($vertragsstunden) && is_numeric($vertragsstunden)) + ? $vertragsstunden + : 0; + $betrag = (isset($betrag) && is_numeric($betrag)) + ? $betrag + : 0; + $mitarbeiter_uid = (isset($mitarbeiter_uid) && is_string($mitarbeiter_uid)) + ? $mitarbeiter_uid + : show_error('mitarbeiter_uid must be set and a string value.'); + + // Start DB transaction + $this->db->trans_start(false); + + // Update contract + $result = $this->update( + $vertrag_id, + array( + 'vertragsstunden' => $vertragsstunden, + 'betrag' => $betrag, + 'updateamum' => $this->escape('NOW()'), + 'updatevon' => getAuthUID() + ) + ); + + // If last vertragsstatus is 'erteilt', delete the status + if (isSuccess($result)) + { + $result = $this->VertragvertragsstatusModel->getLastStatus($vertrag_id, $mitarbeiter_uid); + + $lastStatus = getData($result)[0]->vertragsstatus_kurzbz; + + if ($lastStatus == 'erteilt') + { + $result = $this->VertragvertragsstatusModel->deleteStatus($vertrag_id, 'erteilt'); + } + } + + // Update date of status 'bestellt' + if (isSuccess($result)) + { + $result = $this->VertragvertragsstatusModel->updateStatus($vertrag_id, 'bestellt'); + } + + // Transaction complete! + $this->db->trans_complete(); + + // Check if everything went ok during the transaction + if ($this->db->trans_status() === false || isError($result)) + { + $this->db->trans_rollback(); + return error($result->msg, EXIT_ERROR); + } + else + { + $this->db->trans_commit(); + return success('Contract successfully updated.'); + } + } + + /** + * Gets Lehreinheit ID corresponding to the contract. + * @param $vertrag_id + * @return array + */ + public function getLehreinheitID($vertrag_id) + { + $vertragstyp_kurzbz = null; + + $this->addSelect('vertragstyp_kurzbz'); + if ($result = getData($this->load($vertrag_id))) + { + $vertragstyp_kurzbz = $result[0]->vertragstyp_kurzbz; + } + else + { + return error('Fehler beim Laden des Vertrags.'); + } + + if ($vertragstyp_kurzbz == 'Lehrauftrag') + { + $this->LehreinheitmitarbeiterModel->addSelect('lehreinheit_id'); + if ($result = $this->LehreinheitmitarbeiterModel->loadWhere(array('vertrag_id' => $vertrag_id))) + { + return success($result->retval); + } + else + { + return error('Fehler beim Ermitteln der Lehreinheit ID'); + } + + } + elseif ($vertragstyp_kurzbz == 'Betreuung') + { + $this->addSelect('lehreinheit_id'); + $this->addJoin('lehre.tbl_projektbetreuer', 'vertrag_id'); + $this->addJoin('lehre.tbl_projektarbeit', 'projektarbeit_id'); + if ($result = $this->loadWhere(array('vertrag_id' => $vertrag_id))) + { + return success($result->retval); + } + else + { + return error('Fehler beim Ermitteln der Lehreinheit ID'); + } + } + } + + /** + * Gets (table) data of lehreinheit_id corresponding to the contract. + * @param integer $vertrag_id + * @param string $select To restrict fields, pass select string. e.g. 'lehrveranstaltung_id'. + * @return array + */ + public function getLehreinheitData($vertrag_id, $select = '*') + { + if ($result = getData($this->getLehreinheitID($vertrag_id))) + { + $this->load->model('education/Lehreinheit_model', 'LehreinheitModel'); + $this->LehreinheitModel->addSelect($select); + + if($result = $this->LehreinheitModel->load($result[0]->lehreinheit_id)) + { + return success($result->retval); + } + else + { + return error('Fehler beim Laden der Lehreinheit'); + } + } + else + { + return error('Fehler beim Ermitteln der Lehreinheit ID'); + } + } + + // ----------------------------------------------------------------------------------------------------------------- + // Private methods + + /** + * Generate contract description. + * Example: WS2017-BEE3-LIA-LAB + * @param $lehrveranstaltung_id + * @param $studiensemester_kurzbz Studiensemester of Lehrauftrag (= when the lector will teach the lehrveranstaltung) + * @return string Returns e.g. WS2017-BBE5-GAP-LAB + */ + private function _writeVertragsbezeichung($lehrveranstaltung_id, $studiensemester_kurzbz) + { + $bezeichnung = ''; + $this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel'); + $this->LehrveranstaltungModel->addSelect('tbl_lehrveranstaltung.semester, tbl_lehrveranstaltung.kurzbz AS "lv_kurzbz", lehrform_kurzbz, public.tbl_studiengang.typ, public.tbl_studiengang.kurzbz'); + $this->LehrveranstaltungModel->addJoin('lehre.tbl_studienplan_lehrveranstaltung', 'lehrveranstaltung_id'); + $this->LehrveranstaltungModel->addJoin('lehre.tbl_studienplan', 'studienplan_id'); + $this->LehrveranstaltungModel->addJoin('lehre.tbl_studienordnung', 'studienordnung_id'); + $this->LehrveranstaltungModel->addJoin('public.tbl_studiengang', 'public.tbl_studiengang.studiengang_kz = lehre.tbl_studienordnung.studiengang_kz'); + $result = $this->LehrveranstaltungModel->load($lehrveranstaltung_id); + + if (hasData($result)) + { + $bezeichnung = $studiensemester_kurzbz. '-'; + $bezeichnung.= strtoupper($result->retval[0]->typ. $result->retval[0]->kurzbz). $result->retval[0]->semester. '-'; + $bezeichnung.= $result->retval[0]->lv_kurzbz. '-'; + $bezeichnung.= $result->retval[0]->lehrform_kurzbz; + } + + return $bezeichnung; + } } diff --git a/application/models/accounting/Vertragvertragsstatus_model.php b/application/models/accounting/Vertragvertragsstatus_model.php new file mode 100644 index 000000000..7e76ef494 --- /dev/null +++ b/application/models/accounting/Vertragvertragsstatus_model.php @@ -0,0 +1,134 @@ +dbTable = 'lehre.tbl_vertrag_vertragsstatus'; + $this->pk = array('vertragsstatus_kurzbz', 'vertrag_id'); + $this->hasSequence = false; + } + + /** + * Check if Vertrag has the given Vertragsstatus. + * @param integer $vertrag_id + * @param string $mitarbeiter_uid + * @param string $vertragsstatus_kurzbz + * @return array + */ + public function hasStatus($vertrag_id, $mitarbeiter_uid, $vertragsstatus_kurzbz) + { + $this->addSelect('1'); + $this->addLimit(1); + + return $this->loadWhere(array( + 'vertrag_id' => $vertrag_id, + 'uid' => $mitarbeiter_uid, + 'vertragsstatus_kurzbz' => $vertragsstatus_kurzbz + )); + } + + /** + * Get the latest Vertragsstatus for the given Vertrag and Mitarbeiter + * @param integer $vertrag_id + * @param string $mitarbeiter_uid + * @return array + */ + public function getLastStatus($vertrag_id, $mitarbeiter_uid) + { + $this->addSelect('vertragsstatus_kurzbz'); + $this->addOrder('datum', 'DESC'); + $this->addLimit(1); + return $this->loadWhere( + array( + 'vertrag_id' => $vertrag_id, + 'uid' => $mitarbeiter_uid + ) + ); + } + + /** + * Set Vertragsstatus for the given Vertrag and Mitarbeiter. + * @param $vertrag_id + * @param $vertragsstatus_kurzbz + * @param $mitarbeiter_uid + * @return array|null On success object, retval is true. Null if status already exist for this vertrag. + */ + public function setStatus($vertrag_id, $mitarbeiter_uid, $vertragsstatus_kurzbz){ + + // Check if vertrag has already this status + $result = $this->hasStatus($vertrag_id, $mitarbeiter_uid, $vertragsstatus_kurzbz); + + if (hasData($result)) + { + return success(null); // return null if status is already set + } + + // If new status should be 'akzeptiert', the latest status has to be 'erteilt' + if ($vertragsstatus_kurzbz == 'akzeptiert') + { + $result = $this->getLastStatus($vertrag_id, $mitarbeiter_uid); + $last_status = getData($result)[0]->vertragsstatus_kurzbz; + + if ($last_status != 'erteilt') + { + return success(null); // return null if latest status is not 'erteilt' + } + } + + // Set new status if passed all checks + return $this->insert( + array( + 'vertrag_id' => $vertrag_id, + 'vertragsstatus_kurzbz' => $vertragsstatus_kurzbz, + 'uid' => $mitarbeiter_uid, + 'datum' => $this->escape('NOW()'), + 'insertvon' => getAuthUID(), + 'insertamum' => $this->escape('NOW()') + ) + ); + } + + /** + * Updates the date of the given vertragsstatus. + * @param $vertrag_id + * @param $vertragsstatus_kurzbz + * @return array + */ + public function updateStatus($vertrag_id, $vertragsstatus_kurzbz) + { + $user = getAuthUID(); + return $this->update( + array( + 'vertrag_id' => $vertrag_id, + 'vertragsstatus_kurzbz' => $vertragsstatus_kurzbz + ), + array( + 'datum' => $this->escape('NOW()'), + 'updateamum' => $this->escape('NOW()'), + 'updatevon' => $user, + ) + ); + } + + /** + * Deletes the given vertragsstatus of the contract. + * @param $vertrag_id + * @param $vertragsstatus_kurbz + * @return array + */ + public function deleteStatus($vertrag_id, $vertragsstatus_kurzbz) + { + return $this->delete( + array( + 'vertrag_id' => $vertrag_id, + 'vertragsstatus_kurzbz' => $vertragsstatus_kurzbz + ) + ); + } + + +} diff --git a/application/models/codex/Bisverwendung_model.php b/application/models/codex/Bisverwendung_model.php index fa2cf84d0..20f942865 100644 --- a/application/models/codex/Bisverwendung_model.php +++ b/application/models/codex/Bisverwendung_model.php @@ -11,4 +11,34 @@ class Bisverwendung_model extends DB_Model $this->dbTable = 'bis.tbl_bisverwendung'; $this->pk = 'bisverwendung_id'; } + + /** + * Get latest (active) Verwendung of the user. + * @param string $uid + * @param bool $active If false, returns latest Verwendung no matter if actual or not (ignores ending/beginning date). + * @return array + */ + public function getLast($uid, $active = true) + { + $this->addLimit(1); + + if ($active) + { + $condition = ' + mitarbeiter_uid = '. $this->escape($uid). ' + AND ( beginn <= NOW() OR beginn IS NULL ) + AND ( ende >= NOW() OR ende IS NULL ) + ORDER BY ende DESC NULLS LAST, beginn DESC NULLS LAST + '; + } + else + { + $condition = ' + mitarbeiter_uid = '. $this->escape($uid). ' + ORDER BY ende DESC NULLS LAST, beginn DESC NULLS LAST + '; + } + + return $this->loadWhere($condition); + } } diff --git a/application/models/education/Lehreinheitmitarbeiter_model.php b/application/models/education/Lehreinheitmitarbeiter_model.php index ee11dcd01..dd5c7c858 100644 --- a/application/models/education/Lehreinheitmitarbeiter_model.php +++ b/application/models/education/Lehreinheitmitarbeiter_model.php @@ -11,4 +11,34 @@ class Lehreinheitmitarbeiter_model extends DB_Model $this->dbTable = 'lehre.tbl_lehreinheitmitarbeiter'; $this->pk = array('mitarbeiter_uid', 'lehreinheit_id'); } + + /** + * Checks if Lehrauftrag has a contract. + * @param $mitarbeiter_uid + * @param $lehreinheit_id + * @return array|bool|int Returns vertrag_id if contract exists. False if doesnt exist. On error array. + */ + public function hasVertrag($mitarbeiter_uid, $lehreinheit_id) + { + if(is_string($mitarbeiter_uid) && is_numeric($lehreinheit_id)) + { + $result = $this->load(array( + 'mitarbeiter_uid' => $mitarbeiter_uid, + 'lehreinheit_id' => $lehreinheit_id + )); + + if (hasData($result)) + { + return (is_null($result->retval[0]->vertrag_id)) ? false : intval($result->retval[0]->vertrag_id); + } + else + { + return error($result->msg, EXIT_ERROR); + } + } + else + { + return error ('Incorrect parameter type'); + } + } } diff --git a/application/models/education/Projektbetreuer_model.php b/application/models/education/Projektbetreuer_model.php index 32743be82..746e4c052 100644 --- a/application/models/education/Projektbetreuer_model.php +++ b/application/models/education/Projektbetreuer_model.php @@ -11,4 +11,34 @@ class Projektbetreuer_model extends DB_Model $this->dbTable = 'lehre.tbl_projektbetreuer'; $this->pk = array('betreuerart_kurzbz', 'projektarbeit_id', 'person_id'); } + + /** + * Checks if Projektauftrag has a contract. + * @param $person_id + * @param $projektarbeit_id + * @return array|bool|int Returns vertrag_id if contract exists. False if doesnt exist. On error array. + */ + public function hasVertrag($person_id, $projektarbeit_id) + { + if (is_numeric($person_id) && is_numeric($projektarbeit_id)) + { + $result = $this->load(array( + 'person_id' => $person_id, + 'projektarbeit_id' => $projektarbeit_id + )); + + if (hasData($result)) + { + return (is_null($result->retval[0]->vertrag_id)) ? false : intval($result->retval[0]->vertrag_id); + } + else + { + return error($result->msg, EXIT_ERROR); + } + } + else + { + return error ('Incorrect parameter type'); + } + } } diff --git a/application/models/organisation/Organisationseinheit_model.php b/application/models/organisation/Organisationseinheit_model.php index f9353c7b3..3efc8472a 100644 --- a/application/models/organisation/Organisationseinheit_model.php +++ b/application/models/organisation/Organisationseinheit_model.php @@ -165,4 +165,27 @@ class Organisationseinheit_model extends DB_Model return $this->execQuery(sprintf($query, $aktivstring, $aktivstring), array($oe_kurzbz)); } + /** + * Get one parent only. + * Easily retrieve department of a studiengang or fakultät of department etc. + * @param $oe_kurzbz + * @return array|null + */ + public function getParent($oe_kurzbz) + { + if (is_string($oe_kurzbz)) + { + $condition = ' + oe_kurzbz = ( + SELECT + oe_parent_kurzbz + FROM + public.tbl_organisationseinheit + WHERE + oe_kurzbz = \''. $oe_kurzbz. '\' + ) + '; + } + return $this->loadWhere($condition); + } } diff --git a/application/models/organisation/Studiensemester_model.php b/application/models/organisation/Studiensemester_model.php index 9878ab5be..9cdde7a52 100644 --- a/application/models/organisation/Studiensemester_model.php +++ b/application/models/organisation/Studiensemester_model.php @@ -13,6 +13,22 @@ class Studiensemester_model extends DB_Model $this->hasSequence = false; } + // Get next study semester + public function getNext() + { + $query = ' + SELECT * + FROM + public.tbl_studiensemester + WHERE + start > now() + ORDER BY start + LIMIT 1; + '; + + return $this->execQuery($query); + } + /** * getLastOrAktSemester */ diff --git a/application/models/person/Benutzer_model.php b/application/models/person/Benutzer_model.php index 46e5bdb98..dc5b95779 100644 --- a/application/models/person/Benutzer_model.php +++ b/application/models/person/Benutzer_model.php @@ -15,8 +15,7 @@ class Benutzer_model extends DB_Model public function getFromPersonId($person_id) { - /*$this->addSelect('uid, aktiv, alias');*/ - $this->loadWhere(array('person_id' => $person_id)); + return $this->loadWhere(array('person_id' => $person_id, 'aktiv' => true)); } } diff --git a/application/models/person/Benutzerfunktion_model.php b/application/models/person/Benutzerfunktion_model.php index 02a27e87a..30abfdf51 100644 --- a/application/models/person/Benutzerfunktion_model.php +++ b/application/models/person/Benutzerfunktion_model.php @@ -104,4 +104,38 @@ class Benutzerfunktion_model extends DB_Model return $this->execQuery($query, $parametersArray); } + + /** + * Get active Studiengangsleitung(en) of the user by UID. + * @param $uid + */ + public function getSTGLByUID($uid) + { + $query = ' + SELECT + uid, + oe_kurzbz, + studiengang_kz, + typ, + tbl_studiengang.bezeichnung + FROM + public.tbl_benutzerfunktion + JOIN public.tbl_studiengang USING (oe_kurzbz) + WHERE + funktion_kurzbz = \'Leitung\' + AND (datum_von IS NULL OR datum_von <= now()) + AND (datum_bis IS NULL OR datum_bis >= now()) + AND uid = ? + ORDER BY + oe_kurzbz + '; + + $parameters_array = array(); + if (is_string($uid)) + { + $parameters_array[] = $uid; + } + + return $this->execQuery($query, $parameters_array); + } } diff --git a/application/models/ressource/Mitarbeiter_model.php b/application/models/ressource/Mitarbeiter_model.php index 1e03a0ecd..ccaeacd0d 100644 --- a/application/models/ressource/Mitarbeiter_model.php +++ b/application/models/ressource/Mitarbeiter_model.php @@ -11,4 +11,33 @@ class Mitarbeiter_model extends DB_Model $this->dbTable = 'public.tbl_mitarbeiter'; $this->pk = 'mitarbeiter_uid'; } + + /** + * Checks if the user is a Mitarbeiter. + * @param string $uid + * @param boolean null $fixangestellt + * @return array + */ + public function isMitarbeiter($uid, $fixangestellt = null) + { + $this->addSelect('1'); + + if (is_bool($fixangestellt)) + { + $result = $this->loadWhere(array('mitarbeiter_uid' => $uid, 'fixangestellt' => $fixangestellt)); + } + else // default + { + $result = $this->loadWhere(array('mitarbeiter_uid' => $uid)); + } + + if(hasData($result)) + { + return success(true); + } + else + { + return success(false); + } + } } diff --git a/application/models/system/Benutzerrolle_model.php b/application/models/system/Benutzerrolle_model.php index 13ebf57b6..5ce96a622 100644 --- a/application/models/system/Benutzerrolle_model.php +++ b/application/models/system/Benutzerrolle_model.php @@ -36,4 +36,22 @@ class Benutzerrolle_model extends DB_Model return $result; } + + /** + * Get user who are authorized with berechtigung and, if given, authorized for the specific organisational unit. + * @param $berechtigung_kurzbz + * @param null $oe_kurzbz + * @return array + */ + public function getBenutzerByBerechtigung($berechtigung_kurzbz, $oe_kurzbz = null){ + + $condition = array('berechtigung_kurzbz' => $berechtigung_kurzbz); + + if (is_string($oe_kurzbz)) + { + $condition['oe_kurzbz'] = $oe_kurzbz; + } + + return $this->loadWhere($condition); + } } \ No newline at end of file diff --git a/application/views/lehre/lehrauftrag/Dashboard.php b/application/views/lehre/lehrauftrag/Dashboard.php new file mode 100644 index 000000000..a14cefa7a --- /dev/null +++ b/application/views/lehre/lehrauftrag/Dashboard.php @@ -0,0 +1,38 @@ +load->view( + 'templates/FHC-Header', + array( + 'title' => 'Lehrauftrag bestellen', + 'jquery' => true, + 'jqueryui' => true, + 'bootstrap' => true, + 'fontawesome' => true, + 'sbadmintemplate' => true, + 'ajaxlib' => true, + 'dialoglib' => true, + 'navigationwidget' => true, + 'addons' => true, + ) +); +?> + +
+ widgetlib->widget('NavigationWidget'); ?> ++ Sobald Ihnen ein oder mehrere Lehraufträge erteilt wurden, können Sie diese annehmen. +
+ Nur Lehraufträge mit dem Status 'erteilt' können gewählt werden.
+ Angenommene Lehraufträge oder Lehraufträge in Bearbeitung werden nur zu Ihrer Information angezeigt.
+
| + | + | + | ||
| BESTELLEN (Studiengangsleitung) |
+ + | ERTEILEN (Department-/Kompetenzfeldleitung) |
+ + | ANNEHMEN (LektorIn) |
+
| + | + | + | + + | |||
| Alle Alle Lehraufträge mit jedem Status, auch geänderte und Dummy-Aufträge |
+ Neu Nur Lehraufträge, die im FAS über die Zuteilung eines Lehrenden zu einer Lehreinheit/einem Projekt angelegt und noch nicht bestellt worden sind |
+ Bestellt Nur bestellte UND geänderte bestellte Lehraufträge |
+ Erteilt Nur erteilte UND geänderte erteilte Lehraufträge |
+ Angenommen Nur vom Lehrenden angenommene Lehraufträge |
+ Geändert Nur geänderte Lehraufträge, die den Status 'bestellt' oder 'erteilt' haben |
+ Dummies Nur Lehraufträge, die mit einem Dummylektor angelegt sind |
+
| + | + | + | ||
| BESTELLEN (Studiengangsleitung) |
+ + | ERTEILEN (Department-/Kompetenzfeldleitung) |
+ + | ANNEHMEN (LektorIn) |
+
| + | + | + | + + | |||
| Alle Alle Lehraufträge mit jedem Status, auch geänderte und Dummy-Aufträge |
+ Neu Nur Lehraufträge, die im FAS über die Zuteilung eines Lehrenden zu einer Lehreinheit/einem Projekt angelegt und noch nicht bestellt worden sind |
+ Bestellt Nur bestellte UND geänderte bestellte Lehraufträge |
+ Erteilt Nur erteilte UND geänderte erteilte Lehraufträge |
+ Angenommen Nur vom Lehrenden angenommene Lehraufträge |
+ Geändert Nur geänderte Lehraufträge, die den Status 'bestellt' oder 'erteilt' haben |
+ Dummies Nur Lehraufträge, die mit einem Dummylektor angelegt sind |
+