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/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..2a264736b 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'); } @@ -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'); ?> +
+
+ +
+
+ +
+
+ +
+ +
+
+ + +load->view('templates/FHC-Footer'); ?> diff --git a/application/views/lehre/lehrauftrag/acceptLehrauftrag.php b/application/views/lehre/lehrauftrag/acceptLehrauftrag.php new file mode 100644 index 000000000..951dbfadf --- /dev/null +++ b/application/views/lehre/lehrauftrag/acceptLehrauftrag.php @@ -0,0 +1,130 @@ +load->view( + 'templates/FHC-Header', + array( + 'title' => 'Lehrauftrag annehmen', + 'jquery' => true, + 'jqueryui' => true, + 'jquerycheckboxes' => true, + 'bootstrap' => true, + 'fontawesome' => true, + 'sbadmintemplate' => false, + 'tabulator' => true, + 'momentjs' => true, + 'ajaxlib' => true, + 'dialoglib' => true, + 'tablewidget' => true, + 'navigationwidget' => true, + 'phrases' => array( + 'global' => array('lehrauftraegeAnnehmen'), + ), + 'customJSs' => array( + 'public/js/bootstrapper.js', + 'public/js/lehre/lehrauftrag/acceptLehrauftrag.js') + ) +); + +?> + + +
+
+ + +
+ +
+ + +
+
+
+

Wie nehme ich Lehraufträge an?

+
+

+ Sobald Ihnen ein oder mehrere Lehraufträge erteilt wurden, können Sie diese annehmen. +

    +
  1. Klicken Sie unten auf das Status-Icon 'Nur erteilte anzeigen' oder 'Alle anzeigen'
  2. +
  3. Wählen Sie einzelne Lehraufträge mit Klick auf die Zeilen oder alle über den Button 'Alle auswählen'.
  4. +
  5. Geben Sie Ihr CIS-Passwort ein und klicken auf Lehrauftrag annehmen.
  6. +
+

+
+
+

Warum kann ich manche Lehraufträge nicht auswählen?

+
+

+ 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. +

+
+
+
+
+ + +
+
+
+
+ widgetlib->widget( + 'Studiensemester_widget', + array( + DropdownWidget::SELECTED_ELEMENT => $studiensemester_selected + ), + array( + 'name' => 'studiensemester', + 'id' => 'studiensemester' + ) + ); + ?> +
+ +
+
+
+ + +
+
+ load->view('lehre/lehrauftrag/acceptLehrauftragData.php'); ?> +
+
+
+ + +
+
+ +
+
+
+ + + + +
+
+
+ +
+
+
+ + +load->view('templates/FHC-Footer'); ?> diff --git a/application/views/lehre/lehrauftrag/acceptLehrauftragData.php b/application/views/lehre/lehrauftrag/acceptLehrauftragData.php new file mode 100644 index 000000000..0999d7ae6 --- /dev/null +++ b/application/views/lehre/lehrauftrag/acceptLehrauftragData.php @@ -0,0 +1,386 @@ + $query, + 'tableUniqueId' => 'acceptLehrauftrag', + 'requiredPermissions' => 'lehre/lehrauftrag_akzeptieren', + 'datasetRepresentation' => 'tabulator', + 'reloadDataset' => true, // reload query on page refresh + 'columnsAliases' => array( // TODO: use phrasen + 'Status', // alias for row_index, because row_index is formatted to display the status icons + 'LV-Teil', + 'LV-ID', + 'PA-ID', + 'Studiensemester', + 'Studiengang-KZ', + 'Studiengang', + 'OrgForm', + 'Person-ID', + 'Typ', + 'Auftrag', + 'Semester', + 'Organisationseinheit', + 'Gruppe', + 'Stunden', + 'Betrag', + 'Vertrag-ID', + 'Vertrag-Stunden', + 'Vertrag-Betrag', + 'UID', + 'Bestellt', + 'Erteilt', + 'Angenommen', + 'Bestellt von', + 'Erteilt von', + 'Angenommen von' + ), + 'datasetRepOptions' => '{ + height: 550, + layout: "fitColumns", // fit columns to width of table + responsiveLayout: "hide", // hide columns that dont fit on the table + movableColumns: true, // allows changing column + headerFilterPlaceholder: " ", + index: "row_index", // assign specific column as unique id (important for row indexing) + selectable: true, // allow row selection + selectableRangeMode: "click", // allow range selection using shift end click on end of range + selectablePersistence:false, // deselect previously selected rows when table is filtered, sorted or paginated + selectableCheck: function(row){ + return func_selectableCheck(row); + }, + footerElement: func_footerElement(), + rowUpdated:function(row){ + func_rowUpdated(row); + }, + rowSelectionChanged:function(data, rows){ + func_rowSelectionChanged(data, rows); + }, + rowFormatter:function(row){ + func_rowFormatter(row); + }, + tableBuilt: function(){ + func_tableBuilt(this); + }, + renderComplete:function(){ + func_renderComplete(this); + }, + renderStarted:function(){ + func_renderStarted(this); + } + }', // tabulator properties + 'datasetRepFieldsDefs' => '{ + row_index: {visible:false}, // necessary for row indexing + lehreinheit_id: {headerFilter:"input", bottomCalc:"count", bottomCalcFormatter:function(cell){return "Anzahl: " + cell.getValue();}, width: "7%"}, + lehrveranstaltung_id: {headerFilter:"input", width: "5%"}, + projektarbeit_id: {visible: false}, + studiensemester_kurzbz: {visible: false}, + studiengang_kz: {visible: false}, + stg_typ_kurzbz: {headerFilter:"input", width: "5%"}, + orgform_kurzbz: {headerFilter:"input"}, + person_id: {visible: false}, + typ: {headerFilter:"input", width: "7%"}, + auftrag: {headerFilter:"input", width: "23%"}, + semester: {headerFilter:"input"}, + lv_oe_kurzbz: {headerFilter:"input", width: "12%"}, + gruppe: {headerFilter:"input", width: "5%"}, + stunden: {align:"right", formatter: form_formatNulltoStringNumber, formatterParams:{precision:1}, + headerFilter:"input", headerFilterFunc: hf_filterStringnumberWithOperator, + bottomCalc:"sum", bottomCalcParams:{precision:1}, width: "5%"}, + betrag: {align:"right", formatter: form_formatNulltoStringNumber, + headerFilter:"input", headerFilterFunc: hf_filterStringnumberWithOperator, + bottomCalc:"sum", bottomCalcParams:{precision:2}, bottomCalcFormatter:"money", bottomCalcFormatterParams:{decimal: ",", thousand: ".", symbol:"€"}, + width: "8%"}, + vertrag_id: {visible: false}, + vertrag_stunden: {visible: false}, + vertrag_betrag: {visible: false}, + mitarbeiter_uid: {visible: false}, + bestellt: {align:"center", headerFilter:"input", mutator: mut_formatStringDate, tooltip: bestellt_tooltip}, + erteilt: {align:"center", headerFilter:"input", mutator: mut_formatStringDate, tooltip: erteilt_tooltip}, + akzeptiert: {align:"center", headerFilter:"input", mutator: mut_formatStringDate, tooltip: akzeptiert_tooltip}, + bestellt_von: {visible: false}, + erteilt_von: {visible: false}, + akzeptiert_von: {visible: false} + }', // col properties +); + +echo $this->widgetlib->widget('TableWidget', $filterWidgetArray); + +?> diff --git a/application/views/lehre/lehrauftrag/approveLehrauftrag.php b/application/views/lehre/lehrauftrag/approveLehrauftrag.php new file mode 100644 index 000000000..61cdd124d --- /dev/null +++ b/application/views/lehre/lehrauftrag/approveLehrauftrag.php @@ -0,0 +1,228 @@ +load->view( + 'templates/FHC-Header', + array( + 'title' => 'Lehrauftrag erteilen', + 'jquery' => true, + 'jqueryui' => true, + 'jquerycheckboxes' => true, + 'bootstrap' => true, + 'fontawesome' => true, + 'sbadmintemplate' => true, + 'tabulator' => true, + 'momentjs' => true, + 'ajaxlib' => true, + 'dialoglib' => true, + 'tablewidget' => true, + 'navigationwidget' => true, + 'phrases' => array( + 'global' => array('lehrauftraegeErteilen'), + ), + 'customJSs' => array( + 'public/js/bootstrapper.js', + 'public/js/lehre/lehrauftrag/approveLehrauftrag.js' + ) + ) +); + +?> + + + widgetlib->widget('NavigationWidget'); ?> +
+
+ + +
+ +
+ + +
+
+
+ +

Lehrauftrag Standard-Bestellprozess

+
+ + + + + + + + + + + + + + + +
BESTELLEN
(Studiengangsleitung)
ERTEILEN
(Department-/Kompetenzfeldleitung)
ANNEHMEN
(LektorIn)
+
+
+ +

Lehraufträge erteilen

+
+ Sobald Lehraufträge bestellt wurden, können Sie diese hier erteilen.
+ Erteilte Lehraufträge können von den Lehrenden angenommen werden.
+
    +
  1. Klicken Sie unten auf das Status-Icon 'Nur bestellte anzeigen' oder 'Alle anzeigen'
  2. +
  3. Wählen Sie die zu erteilenden Lehraufträge selbst oder alle über den Button 'Alle auswählen'.
  4. +
  5. Klicken Sie auf Lehrauftrag erteilen.
  6. +
+
+
+ +

Geänderte Lehraufträge

+
+ Im FAS können Änderungen an Stunden/Stundensatz eines Lehrauftrags durchgeführt werden, solange dieser nicht vom Lehrenden angenommen wurde.
+ Wenn Änderungen an bereits bestellten oder erteilten Lehraufträgen vorgenommen wurden, müssen diese vom Studiengang erneut bestellt werden.
+ Bei bereits erteilten Lehraufträgen wird zusätzlich der Status 'erteilt' zurückgesetzt. +
+
+ +

Warum kann ich manche Lehraufträge nicht auswählen?

+
+ Nur Lehraufträge mit dem Status 'bestellt' können gewählt werden.
+ Neue, Bestellte, Akzeptierte oder geänderte Lehraufträge werden nur zu Ihrer Information angezeigt und sind daher NICHT wählbar. +
+
+ +

Filter

+
+ + + + + + + + + + + + + + + + + + + + +
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
+
+
+ +

Auswahl

+
+
    +
  • Einzeln auswählen: Strg + Klick auf einzelne Zeile(n)
  • +
  • Bereich auswählen: Shift + Klick auf Anfangs- und Endzeile
  • +
  • Alle auswählen: Button 'Alle auswählen'
  • +
+
+
+ +
+
+
+ + +
+
+
+
+ widgetlib->widget( + 'Studiensemester_widget', + array( + DropdownWidget::SELECTED_ELEMENT => $studiensemester_selected + ), + array( + 'name' => 'studiensemester', + 'id' => 'studiensemester' + ) + ); + ?> +
+
+ widgetlib->widget( + 'Organisationseinheit_widget', + array( + DropdownWidget::SELECTED_ELEMENT => $organisationseinheit_selected, + 'organisationseinheit' => $organisationseinheit + ), + array( + 'name' => 'organisationseinheit', + 'id' => 'organisationseinheit' + ) + ); + ?> +
+
+ widgetlib->widget( + 'Ausbildungssemester_widget', + array( + DropdownWidget::SELECTED_ELEMENT => $ausbildungssemester_selected, + 'number_semester' => 6 + ), + array( + 'name' => 'ausbildungssemester', + 'id' => 'ausbildungssemester' + ) + ); + ?> +
+ +
+
+
+ + +
+
+ load->view('lehre/lehrauftrag/approveLehrauftragData.php'); ?> +
+
+
+ + +
+
+ + +
+
+ +
+
+
+ + +load->view('templates/FHC-Footer'); ?> diff --git a/application/views/lehre/lehrauftrag/approveLehrauftragData.php b/application/views/lehre/lehrauftrag/approveLehrauftragData.php new file mode 100644 index 000000000..616450a5c --- /dev/null +++ b/application/views/lehre/lehrauftrag/approveLehrauftragData.php @@ -0,0 +1,406 @@ + $query, + 'tableUniqueId' => 'approveLehrauftrag', + 'requiredPermissions' => 'lehre/lehrauftrag_erteilen', + 'datasetRepresentation' => 'tabulator', + 'reloadDataset' => true, // reload query on page refresh + 'columnsAliases' => array( // TODO: use phrasen + 'Status', // alias for row_index, because row_index is formatted to display the status icons + 'Personalnummer', + 'LV-Teil', + 'LV-ID', + 'LV', + 'PA-ID', + 'Studiensemester', + 'Studiengang-KZ', + 'Studiengang', + 'OrgForm', + 'Person-ID', + 'Typ', + 'Auftrag', + 'Semester', + 'Organisationseinheit', + 'Gruppe', + 'Lektor', + 'Stunden', + 'Betrag', + 'Vertrag-ID', + 'Vertrag-Stunden', + 'Vertrag-Betrag', + 'UID', + 'Bestellt', + 'Erteilt', + 'Angenommen', + 'Bestellt von', + 'Erteilt von', + 'Angenommen von' + ), + 'datasetRepOptions' => '{ + height: 700, + layout: "fitColumns", // fit columns to width of table + responsiveLayout: "hide", // hide columns that dont fit on the table + movableColumns: true, // allows changing column + headerFilterPlaceholder: " ", + groupBy:"lehrveranstaltung_id", + groupToggleElement:"header", //toggle group on click anywhere in the group header + groupHeader: function(value, count, data, group){ + return func_groupHeader(data); + }, + columnCalcs:"both", // show column calculations at top and bottom of table and in groups + index: "row_index", // assign specific column as unique id (important for row indexing) + selectable: true, // allow row selection + selectableRangeMode: "click", // allow range selection using shift end click on end of range + selectablePersistence:false, // deselect previously selected rows when table is filtered, sorted or paginated + selectableCheck: function(row){ + return func_selectableCheck(row); + }, + initialFilter: func_initialFilter(), + footerElement: func_footerElement(), + rowUpdated:function(row){ + func_rowUpdated(row); + }, + rowSelectionChanged:function(data, rows){ + func_rowSelectionChanged(data, rows); + }, + rowFormatter:function(row) + { + func_rowFormatter(row); + }, + renderStarted:function(){ + func_renderStarted(this); + }, + tableBuilt: function(){ + func_tableBuilt(this); + } + }', // tabulator properties + 'datasetRepFieldsDefs' => '{ + // column status is built dynamically in funcTableBuilt(), + row_index: {visible:false}, // necessary for row indexing + personalnummer: {visible: false}, + lehreinheit_id: {headerFilter:"input", bottomCalc:"count", width: "7%", + bottomCalcFormatter:function(cell){return "Anzahl: " + cell.getValue();},}, + lehrveranstaltung_id: {headerFilter:"input"}, + lv_bezeichnung: {visible: false}, + projektarbeit_id: {visible: false}, + studiensemester_kurzbz: {headerFilter:"input"}, + studiengang_kz: {visible: false}, + stg_typ_kurzbz: {visible: false}, + orgform_kurzbz: {headerFilter:"input"}, + person_id: {visible: false}, + typ: {headerFilter:"input"}, + auftrag: {headerFilter:"input", width:"20%"}, + semester: {headerFilter:"input"}, + lv_oe_kurzbz: {headerFilter:"input"}, + gruppe: {headerFilter:"input"}, + lektor: {headerFilter:"input"}, + stunden: {align:"right", formatter: form_formatNulltoStringNumber, formatterParams:{precision:1}, + headerFilter:"input", headerFilterFunc: hf_filterStringnumberWithOperator, + bottomCalc:"sum", bottomCalcParams:{precision:1}}, + betrag: {align:"right", formatter: form_formatNulltoStringNumber, + headerFilter:"input", headerFilterFunc: hf_filterStringnumberWithOperator, + bottomCalc:"sum", bottomCalcParams:{precision:2}, bottomCalcFormatter:"money", bottomCalcFormatterParams:{decimal: ",", thousand: ".", symbol:"€"}}, + vertrag_id: {visible: false}, + vertrag_stunden: {visible: false}, + vertrag_betrag: {visible: false}, + mitarbeiter_uid: {visible: false}, + bestellt: {align:"center", headerFilter:"input", mutator: mut_formatStringDate, tooltip: bestellt_tooltip}, + erteilt: {align:"center", headerFilter:"input", mutator: mut_formatStringDate, tooltip: erteilt_tooltip}, + akzeptiert: {align:"center", headerFilter:"input", mutator: mut_formatStringDate, tooltip: akzeptiert_tooltip}, + bestellt_von: {visible: false}, + erteilt_von: {visible: false}, + akzeptiert_von: {visible: false}, + }', // col properties +); + +echo $this->widgetlib->widget('TableWidget', $filterWidgetArray); + +?> diff --git a/application/views/lehre/lehrauftrag/orderLehrauftrag.php b/application/views/lehre/lehrauftrag/orderLehrauftrag.php new file mode 100644 index 000000000..abcb3dbc4 --- /dev/null +++ b/application/views/lehre/lehrauftrag/orderLehrauftrag.php @@ -0,0 +1,229 @@ +load->view( + 'templates/FHC-Header', + array( + 'title' => 'Lehrauftrag bestellen', + 'jquery' => true, + 'jqueryui' => true, + 'jquerycheckboxes' => true, + 'bootstrap' => true, + 'fontawesome' => true, + 'sbadmintemplate' => true, + 'tabulator' => true, + 'momentjs' => true, + 'ajaxlib' => true, + 'dialoglib' => true, + 'tablewidget' => true, + 'navigationwidget' => true, + 'phrases' => array( + 'global' => array('lehrauftraegeBestellen'), + ), + 'customJSs' => array( + 'public/js/bootstrapper.js', + 'public/js/lehre/lehrauftrag/orderLehrauftrag.js' + ) + ) +); +?> + + + widgetlib->widget('NavigationWidget'); ?> +
+
+ + +
+ +
+ + +
+
+
+ +

Lehrauftrag Standard-Bestellprozess

+
+ + + + + + + + + + + + + + + +
BESTELLEN
(Studiengangsleitung)
ERTEILEN
(Department-/Kompetenzfeldleitung)
ANNEHMEN
(LektorIn)
+
+
+ +

Lehraufträge bestellen

+
+ Sobald im FAS ein Lehrauftrag/eine Projektbetreuung angelegt wurde, können Sie diese hier bestellen.
+ Bestellte Lehraufträge sind zur Erteilung freigegeben.
+
    +
  1. Klicken Sie unten auf das Status-Icon 'Nur neue anzeigen', 'Nur geänderte anzeigen' oder 'Alle anzeigen'
  2. +
  3. Wählen Sie die zu bestellenden Lehraufträge selbst oder über den Button 'Alle auswählen'.
  4. +
  5. Klicken Sie auf Lehrauftrag bestellen.
  6. +
+ Für jeden bestellten Lehrauftrag legt das System einen Vertrag an. +
+
+ +

Geänderte Lehraufträge

+
+ Im FAS können Änderungen an Stunden/Stundensatz eines Lehrauftrags durchgeführt werden, solange dieser nicht vom Lehrenden angenommen wurde.
+ Wenn Änderungen an bereits bestellten oder erteilten Lehraufträgen vorgenommen wurden, werden diese in einem tooltip angezeigt.
+ Fahren Sie dazu mit der Maus über dem Status-Icon am Beginn der Zeile.
+
+
+ +

Warum kann ich manche Lehraufträge nicht auswählen?

+
+ Nur Lehraufträge mit dem Status 'neu' und 'geändert' können bestellt werden.
+ Erteilte oder akzeptierte Lehraufträge werden nur zu Ihrer Information angezeigt und sind daher NICHT wählbar. +
+
+ +

Filter

+
+ + + + + + + + + + + + + + + + + + + + +
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
+
+
+ +

Auswahl

+
+
    +
  • Einzeln auswählen: Strg + Klick auf einzelne Zeile(n)
  • +
  • Bereich auswählen: Shift + Klick auf Anfangs- und Endzeile
  • +
  • Alle auswählen: Button 'Alle auswählen'
  • +
+
+
+ +
+
+
+ + +
+
+
+
+ widgetlib->widget( + 'Studiensemester_widget', + array( + DropdownWidget::SELECTED_ELEMENT => $studiensemester_selected + ), + array( + 'name' => 'studiensemester', + 'id' => 'studiensemester' + ) + ); + ?> +
+
+ widgetlib->widget( + 'Studiengang_widget', + array( + DropdownWidget::SELECTED_ELEMENT => $studiengang_selected, + 'studiengang' => $studiengang + ), + array( + 'name' => 'studiengang', + 'id' => 'studiengang' + ) + ); + ?> +
+
+ widgetlib->widget( + 'Ausbildungssemester_widget', + array( + DropdownWidget::SELECTED_ELEMENT => $ausbildungssemester_selected, + 'number_semester' => 6 + ), + array( + 'name' => 'ausbildungssemester', + 'id' => 'ausbildungssemester' + ) + ); + ?> +
+ +
+
+
+ + +
+
+ load->view('lehre/lehrauftrag/orderLehrauftragData.php'); ?> +
+
+
+ + +
+
+ + +
+
+ +
+
+
+ + +load->view('templates/FHC-Footer'); ?> diff --git a/application/views/lehre/lehrauftrag/orderLehrauftragData.php b/application/views/lehre/lehrauftrag/orderLehrauftragData.php new file mode 100644 index 000000000..2abf658e8 --- /dev/null +++ b/application/views/lehre/lehrauftrag/orderLehrauftragData.php @@ -0,0 +1,412 @@ + $query, + 'tableUniqueId' => 'orderLehrauftrag', + 'requiredPermissions' => 'lehre/lehrauftrag_bestellen', + 'datasetRepresentation' => 'tabulator', + 'reloadDataset' => true, // reload query on page refresh + 'columnsAliases' => array( // TODO: use phrasen + 'Status', // alias for row_index, because row_index is formatted to display the status icons + 'Personalnummer', + 'LV-Teil', + 'LV-ID', + 'LV', + 'PA-ID', + 'Studiensemester', + 'Studiengang-KZ', + 'Studiengang', + 'OrgForm', + 'Person-ID', + 'Typ', + 'Auftrag', + 'Semester', + 'Organisationseinheit', + 'Gruppe', + 'Lektor', + 'Stunden', + 'Stundensatz', + 'Betrag', + 'Vertrag-ID', + 'Vertrag-Stunden', + 'Vertrag-Betrag', + 'UID', + 'Bestellt', + 'Erteilt', + 'Angenommen', + 'Bestellt von', + 'Erteilt von', + 'Angenommen von' + ), + 'datasetRepOptions' => '{ + height: 700, + layout:"fitColumns", // fit columns to width of table + responsiveLayout:"hide", // hide columns that dont fit on the table + movableColumns: true, // allows changing column + headerFilterPlaceholder: " ", + groupBy:"lehrveranstaltung_id", + groupToggleElement:"header", //toggle group on click anywhere in the group header + groupHeader: function(value, count, data, group){ + return func_groupHeader(data); + }, + footerElement: func_footerElement(), + columnCalcs:"both", // show column calculations at top and bottom of table and in groups + index: "row_index", // assign specific column as unique id (important for row indexing) + selectable: true, // allows row selection + selectableRangeMode: "click", // allows range selection using shift end click on end of range + selectablePersistence:false, // deselect previously selected rows when table is filtered, sorted or paginated + selectableCheck: function(row){ + return func_selectableCheck(row); + }, + rowUpdated:function(row){ + func_rowUpdated(row); + }, + rowSelectionChanged:function(data, rows){ + func_rowSelectionChanged(data, rows); + }, + rowFormatter:function(row){ + func_rowFormatter(row); + }, + renderStarted:function(){ + func_renderStarted(this); + }, + tableBuilt: function(){ + func_tableBuilt(this); + }, + dataLoaded: function(data){ + func_dataLoaded(data, this); + }, + }', // tabulator properties + 'datasetRepFieldsDefs' => '{ + // column status is built dynamically in funcTableBuilt() + row_index: {visible: false}, + personalnummer: {visible: false}, + lehreinheit_id: {headerFilter:"input", bottomCalc:"count", width: "7%", + bottomCalcFormatter:function(cell){return "Anzahl: " + cell.getValue();}}, + lehrveranstaltung_id: {headerFilter:"input"}, + lv_bezeichnung: {visible: false}, + projektarbeit_id: {visible: false}, + studiensemester_kurzbz: {headerFilter:"input"}, + studiengang_kz: {visible: false}, + stg_typ_kurzbz: {visible: false}, + orgform_kurzbz: {headerFilter:"input"}, + person_id: {visible: false}, + typ: {headerFilter:"input"}, + auftrag: {headerFilter:"input", width:"20%"}, + semester: {headerFilter:"input"}, + lv_oe_kurzbz: {headerFilter:"input"}, + gruppe: {headerFilter:"input"}, + lektor: {headerFilter:"input"}, + stunden: {align:"right", formatter: form_formatNulltoStringNumber, formatterParams:{precision:1}, + headerFilter:"input", headerFilterFunc: hf_filterStringnumberWithOperator, + bottomCalc:"sum", bottomCalcParams:{precision:1}}, + stundensatz: {visible: false}, + betrag: {align:"right", formatter: form_formatNulltoStringNumber, + headerFilter:"input", headerFilterFunc: hf_filterStringnumberWithOperator, + bottomCalc:"sum", bottomCalcParams:{precision:2}, bottomCalcFormatter:"money", + bottomCalcFormatterParams:{decimal: ",", thousand: ".", symbol:"€"}}, + vertrag_id: {visible: false}, + vertrag_stunden: {visible: false}, + vertrag_betrag: {visible: false}, + mitarbeiter_uid: {visible: false}, + bestellt: {align:"center", headerFilter:"input", mutator: mut_formatStringDate, tooltip: bestellt_tooltip}, + erteilt: {align:"center", headerFilter:"input", mutator: mut_formatStringDate, tooltip: erteilt_tooltip}, + akzeptiert: {align:"center", headerFilter:"input", mutator: mut_formatStringDate, tooltip: akzeptiert_tooltip}, + bestellt_von: {visible: false}, + erteilt_von: {visible: false}, + akzeptiert_von: {visible: false}, + }', // col properties +); + +echo $this->widgetlib->widget('TableWidget', $filterWidgetArray); + +?> diff --git a/application/views/system/infocenter/infocenterData.php b/application/views/system/infocenter/infocenterData.php index 49f0c7af6..6cafc6192 100644 --- a/application/views/system/infocenter/infocenterData.php +++ b/application/views/system/infocenter/infocenterData.php @@ -101,7 +101,7 @@ FROM tbl_prestudentstatus spss WHERE spss.prestudent_id = pss.prestudent_id AND spss.status_kurzbz = '.$REJECTED_STATUS.' - AND spss.studiensemester_kurzbz IN (SELECT ss.studiensemester_kurzbz FROM public.tbl_studiensemester ss WHERE ss.ende > + AND spss.studiensemester_kurzbz IN (SELECT ss.studiensemester_kurzbz FROM public.tbl_studiensemester ss WHERE ss.ende > (SELECT start FROM public.tbl_studiensemester sss WHERE studiensemester_kurzbz = '.$STUDIENSEMESTER.')) ) ORDER BY pss.datum DESC, pss.insertamum DESC, pss.ext_id DESC @@ -127,7 +127,7 @@ FROM tbl_prestudentstatus spss WHERE spss.prestudent_id = pss.prestudent_id AND spss.status_kurzbz = '.$REJECTED_STATUS.' - AND spss.studiensemester_kurzbz IN (SELECT ss.studiensemester_kurzbz FROM public.tbl_studiensemester ss WHERE ss.ende > + AND spss.studiensemester_kurzbz IN (SELECT ss.studiensemester_kurzbz FROM public.tbl_studiensemester ss WHERE ss.ende > (SELECT start FROM public.tbl_studiensemester sss WHERE studiensemester_kurzbz = '.$STUDIENSEMESTER.')) ) LIMIT 1 @@ -152,7 +152,7 @@ FROM tbl_prestudentstatus spss WHERE spss.prestudent_id = pss.prestudent_id AND spss.status_kurzbz = '.$REJECTED_STATUS.' - AND spss.studiensemester_kurzbz IN (SELECT ss.studiensemester_kurzbz FROM public.tbl_studiensemester ss WHERE ss.ende > + AND spss.studiensemester_kurzbz IN (SELECT ss.studiensemester_kurzbz FROM public.tbl_studiensemester ss WHERE ss.ende > (SELECT start FROM public.tbl_studiensemester sss WHERE studiensemester_kurzbz = '.$STUDIENSEMESTER.')) ) LIMIT 1 @@ -178,7 +178,7 @@ FROM tbl_prestudentstatus spss WHERE spss.prestudent_id = pss.prestudent_id AND spss.status_kurzbz = '.$REJECTED_STATUS.' - AND spss.studiensemester_kurzbz IN (SELECT ss.studiensemester_kurzbz FROM public.tbl_studiensemester ss WHERE ss.ende > + AND spss.studiensemester_kurzbz IN (SELECT ss.studiensemester_kurzbz FROM public.tbl_studiensemester ss WHERE ss.ende > (SELECT start FROM public.tbl_studiensemester sss WHERE studiensemester_kurzbz = '.$STUDIENSEMESTER.')) ) LIMIT 1 @@ -202,7 +202,7 @@ FROM tbl_prestudentstatus spss WHERE spss.prestudent_id = pss.prestudent_id AND spss.status_kurzbz = '.$REJECTED_STATUS.' - AND spss.studiensemester_kurzbz IN (SELECT ss.studiensemester_kurzbz FROM public.tbl_studiensemester ss WHERE ss.ende > + AND spss.studiensemester_kurzbz IN (SELECT ss.studiensemester_kurzbz FROM public.tbl_studiensemester ss WHERE ss.ende > (SELECT start FROM public.tbl_studiensemester sss WHERE studiensemester_kurzbz = '.$STUDIENSEMESTER.')) ) LIMIT 1 diff --git a/application/views/templates/FHC-Header.php b/application/views/templates/FHC-Header.php index 43112dd7b..3c1327d5f 100644 --- a/application/views/templates/FHC-Header.php +++ b/application/views/templates/FHC-Header.php @@ -25,10 +25,13 @@ $jqueryui = isset($jqueryui) ? $jqueryui : false; $jquerycheckboxes = isset($jquerycheckboxes) ? $jquerycheckboxes : false; $jquerytreetable = isset($jquerytreetable) ? $jquerytreetable : false; + $momentjs = isset($momentjs) ? $momentjs : false; $navigationwidget = isset($navigationwidget) ? $navigationwidget : false; $pivotui = isset($pivotui) ? $pivotui : false; $sbadmintemplate = isset($sbadmintemplate) ? $sbadmintemplate : false; $tablesorter = isset($tablesorter) ? $tablesorter : false; + $tablewidget = isset($tablewidget) ? $tablewidget : false; + $tabulator = isset($tabulator) ? $tabulator : false; $tinymce = isset($tinymce) ? $tinymce : false; ?> @@ -79,6 +82,13 @@ generateCSSsInclude('vendor/mottie/tablesorter/dist/css/jquery.tablesorter.pager.min.css'); } + // Tabulator CSS + if ($tabulator === true) + { + generateCSSsInclude('vendor/olifolkerd/tabulator/dist/css/bootstrap/tabulator_bootstrap.min.css'); + generateCSSsInclude('public/css/Tabulator.css'); + } + // -------------------------------------------------------------------------------------------------------- // From public folder @@ -134,6 +144,14 @@ // NOTE: keep it after jQuery includes if ($jquerytreetable === true) generateJSsInclude('vendor/ludo/jquery-treetable/jquery.treetable.js'); + // MomentJS + if ($momentjs === true) + { + generateJSsInclude('vendor/moment/momentjs/min/moment.min.js'); + generateJSsInclude('vendor/moment/momentjs/locale/de-at.js'); + generateJSsInclude('vendor/moment/momentjs/locale/en-ie.js'); + } + // PivotUI CSS if ($pivotui === true) { @@ -148,6 +166,13 @@ generateJSsInclude('vendor/mottie/tablesorter/dist/js/extras/jquery.tablesorter.pager.min.js'); } + // Tabulator JS + if ($tabulator === true) + { + generateJSsInclude('vendor/olifolkerd/tabulator/dist/js/tabulator.min.js'); + generateJSsInclude('vendor/olifolkerd/tabulator/dist/js/jquery_wrapper.min.js'); + } + // Tinymce JS if ($tinymce === true) generateJSsInclude('vendor/tinymce/tinymce/tinymce.min.js'); @@ -179,6 +204,9 @@ // PhrasesLib JS if ($phrases != null) generateJSsInclude('public/js/PhrasesLib.js'); + // TableWidget JS + if ($tablewidget === true) generateJSsInclude('public/js/TableWidget.js'); + // Load addon hooks JS // NOTE: keep it as the latest but one if ($addons === true) generateAddonsJSsInclude($calledPath.'/'.$calledMethod); diff --git a/application/views/widgets/filter/filter.php b/application/views/widgets/filter/filter.php index dc20e58b6..a9b8ad1f1 100644 --- a/application/views/widgets/filter/filter.php +++ b/application/views/widgets/filter/filter.php @@ -1,4 +1,5 @@ -
+ +
@@ -6,40 +7,7 @@
- -
-
- -
-
- -
- -
- -
- - -
- -
- -
- - -
- -
-
-
-
-
- -
+
diff --git a/application/views/widgets/filter/filterOptions.php b/application/views/widgets/filter/filterOptions.php new file mode 100644 index 000000000..6f1dd3885 --- /dev/null +++ b/application/views/widgets/filter/filterOptions.php @@ -0,0 +1,35 @@ + + +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + +
+ +
+
+
+
+
+ +
diff --git a/application/views/widgets/filter/tableDataset.php b/application/views/widgets/filter/tableDataset.php index ca917503a..2f1b94e61 100644 --- a/application/views/widgets/filter/tableDataset.php +++ b/application/views/widgets/filter/tableDataset.php @@ -1,8 +1,7 @@ -
+
-
diff --git a/application/views/widgets/filter/tabulatorDataset.php b/application/views/widgets/filter/tabulatorDataset.php new file mode 100644 index 000000000..f5efc50b3 --- /dev/null +++ b/application/views/widgets/filter/tabulatorDataset.php @@ -0,0 +1 @@ +
diff --git a/application/views/widgets/table/pivotUIDataset.php b/application/views/widgets/table/pivotUIDataset.php new file mode 100644 index 000000000..0b43fcdac --- /dev/null +++ b/application/views/widgets/table/pivotUIDataset.php @@ -0,0 +1 @@ +
diff --git a/application/views/widgets/table/table.php b/application/views/widgets/table/table.php new file mode 100644 index 000000000..e73aec335 --- /dev/null +++ b/application/views/widgets/table/table.php @@ -0,0 +1,17 @@ + +
+
+ + +
+ + +
+ +
+ + +
+ +
+
diff --git a/application/views/widgets/table/tableDataset.php b/application/views/widgets/table/tableDataset.php new file mode 100644 index 000000000..7c2f26ea5 --- /dev/null +++ b/application/views/widgets/table/tableDataset.php @@ -0,0 +1,7 @@ + + + + + + +
diff --git a/application/views/widgets/table/tabulatorDataset.php b/application/views/widgets/table/tabulatorDataset.php new file mode 100644 index 000000000..4984284bc --- /dev/null +++ b/application/views/widgets/table/tabulatorDataset.php @@ -0,0 +1 @@ +
diff --git a/application/widgets/Ausbildungssemester_widget.php b/application/widgets/Ausbildungssemester_widget.php new file mode 100644 index 000000000..8200d8a63 --- /dev/null +++ b/application/widgets/Ausbildungssemester_widget.php @@ -0,0 +1,43 @@ +id = $i; + $ausbildungssemester_obj->description = $i; + + $ausbildungssemester_arr []= $ausbildungssemester_obj; + } + + $this->setElementsArray( + success($ausbildungssemester_arr), + true, + $this->p->t('lehre', 'ausbildungssemester'), + 'No Ausbildungssemester found' + ); + + $this->loadDropDownView($widgetData); + } +} \ No newline at end of file diff --git a/application/widgets/FilterWidget.php b/application/widgets/FilterWidget.php index 84a4d138b..d168744c8 100644 --- a/application/widgets/FilterWidget.php +++ b/application/widgets/FilterWidget.php @@ -7,9 +7,11 @@ class FilterWidget extends Widget { // Paths of the views const WIDGET_URL_FILTER = 'widgets/filter/filter'; + const WIDGET_URL_FILTER_OPTIONS = 'widgets/filter/filterOptions'; const WIDGET_URL_SELECT_FIELDS = 'widgets/filter/selectFields'; const WIDGET_URL_DATASET_TABLESORTER = 'widgets/filter/tableDataset'; const WIDGET_URL_DATASET_PIVOTUI = 'widgets/filter/pivotUIDataset'; + const WIDGET_URL_DATASET_TABULATOR = 'widgets/filter/tabulatorDataset'; const WIDGET_URL_SELECT_FILTERS = 'widgets/filter/selectFilters'; const WIDGET_URL_SAVE_FILTER = 'widgets/filter/saveFilter'; @@ -40,14 +42,19 @@ class FilterWidget extends Widget // To have a column in the GUI with checkboxes to select rows in the table private $_checkboxes; - // To hide the GUI to operate or save the filter widget - private $_hideHeader; - private $_hideSave; + // To hide the GUI to operate with the filter widget or to save a custom filter + private $_hideOptions; // if true hides all the options + private $_hideSelectFields; // if true hides the fields selection + private $_hideSelectFilters; // if true hides the filters selections + private $_hideSave; // if true hides the GUI to save a custom filter + private $_hideMenu; // if true then the menu is not shown private $_customMenu; // if true then method _setFilterMenu is NOT called private $_datasetRepresentation; // dataset representation (ex: tablesorter, pivotUI, ...) private $_datasetRepresentationOptions; // dataset representation options for tablesorter, pivotUI, ... + private $_datasetRepFieldsDefs; // dataset representation attributes for each record field + private $_reloadDataset; // Force Reload of Dataset private static $_FilterWidgetInstance; // static property that contains the instance of itself @@ -61,18 +68,20 @@ class FilterWidget extends Widget self::$_FilterWidgetInstance = $this; // set static property $_FilterWidgetInstance with this instance - $this->load->library('FiltersLib'); // Loads the FiltersLib that contains all the used logic + $this->load->library('FilterWidgetLib'); // Loads the FilterWidgetLib that contains all the used logic $this->_initFilterWidget($args); // checks parameters and initialize properties + $this->filterwidgetlib->setFilterUniqueIdByParams($args); + // Let's start if it's allowed // NOTE: If it is NOT allowed then no data are loaded - if ($this->filterslib->isAllowed($this->_requiredPermissions)) + if ($this->filterwidgetlib->isAllowed($this->_requiredPermissions)) { $this->_startFilterWidget(); // If a custom menu is not used, then default menu is used - if ($this->_customMenu != true) $this->_setFilterMenu(); + if ($this->_hideMenu != true && $this->_customMenu != true) $this->_setFilterMenu(); } } @@ -84,18 +93,33 @@ class FilterWidget extends Widget */ public function display($widgetData) { - $this->view(self::WIDGET_URL_FILTER); // GUI starts here + $this->view(self::WIDGET_URL_FILTER, array( + 'app' => $this->_app, + 'dataset' => $this->_datasetName, + 'filterid' => $this->_filterId + )); // GUI starts here } //------------------------------------------------------------------------------------------------------------------ // Public static methods used to load views and to access statically to some properies of the FilterWidget + /** + * Loads the view related to the filter options + */ + public static function loadViewFilterOptions() + { + if (self::$_FilterWidgetInstance->_hideOptions != true) + { + self::_loadView(self::WIDGET_URL_FILTER_OPTIONS); + } + } + /** * Loads the view related to the selected fields */ public static function loadViewSelectFields() { - if (self::$_FilterWidgetInstance->_hideHeader != true) + if (self::$_FilterWidgetInstance->_hideSelectFields != true) { self::_loadView(self::WIDGET_URL_SELECT_FIELDS); } @@ -106,7 +130,7 @@ class FilterWidget extends Widget */ public static function loadViewSelectFilters() { - if (self::$_FilterWidgetInstance->_hideHeader != true) + if (self::$_FilterWidgetInstance->_hideSelectFilters != true) { self::_loadView(self::WIDGET_URL_SELECT_FILTERS); } @@ -128,15 +152,20 @@ class FilterWidget extends Widget */ public static function loadViewDataset() { - if (self::$_FilterWidgetInstance->_datasetRepresentation == FiltersLib::DATASET_REP_TABLESORTER) + if (self::$_FilterWidgetInstance->_datasetRepresentation == FilterWidgetLib::DATASET_REP_TABLESORTER) { self::_loadView(self::WIDGET_URL_DATASET_TABLESORTER); } - if (self::$_FilterWidgetInstance->_datasetRepresentation == FiltersLib::DATASET_REP_PIVOTUI) + if (self::$_FilterWidgetInstance->_datasetRepresentation == FilterWidgetLib::DATASET_REP_PIVOTUI) { self::_loadView(self::WIDGET_URL_DATASET_PIVOTUI); } + + if (self::$_FilterWidgetInstance->_datasetRepresentation == FilterWidgetLib::DATASET_REP_TABULATOR) + { + self::_loadView(self::WIDGET_URL_DATASET_TABULATOR); + } } //------------------------------------------------------------------------------------------------------------------ @@ -164,115 +193,144 @@ class FilterWidget extends Widget $this->_formatRow = null; $this->_markRow = null; $this->_checkboxes = null; - $this->_hideHeader = null; + $this->_hideOptions = null; + $this->_hideSelectFields = null; + $this->_hideSelectFilters = null; $this->_hideSave = null; + $this->_hideMenu = null; $this->_customMenu = null; $this->_datasetRepresentation = null; $this->_datasetRepresentationOptions = null; + $this->_datasetRepFieldsDefs = null; // Retrieved the required permissions parameter if present - if (isset($args[FiltersLib::REQUIRED_PERMISSIONS_PARAMETER])) + if (isset($args[FilterWidgetLib::REQUIRED_PERMISSIONS_PARAMETER])) { - $this->_requiredPermissions = $args[FiltersLib::REQUIRED_PERMISSIONS_PARAMETER]; + $this->_requiredPermissions = $args[FilterWidgetLib::REQUIRED_PERMISSIONS_PARAMETER]; } // Parameters needed to retrieve univocally a filter from DB - if (isset($args[FiltersLib::APP_PARAMETER])) + if (isset($args[FilterWidgetLib::APP_PARAMETER])) { - $this->_app = $args[FiltersLib::APP_PARAMETER]; + $this->_app = $args[FilterWidgetLib::APP_PARAMETER]; } - if (isset($args[FiltersLib::DATASET_NAME_PARAMETER])) + if (isset($args[FilterWidgetLib::DATASET_NAME_PARAMETER])) { - $this->_datasetName = $args[FiltersLib::DATASET_NAME_PARAMETER]; + $this->_datasetName = $args[FilterWidgetLib::DATASET_NAME_PARAMETER]; } - if (isset($args[FiltersLib::FILTER_KURZBZ_PARAMETER])) + if (isset($args[FilterWidgetLib::FILTER_KURZBZ_PARAMETER])) { - $this->_filterKurzbz = $args[FiltersLib::FILTER_KURZBZ_PARAMETER]; + $this->_filterKurzbz = $args[FilterWidgetLib::FILTER_KURZBZ_PARAMETER]; } - if (isset($args[FiltersLib::FILTER_ID])) + if (isset($args[FilterWidgetLib::FILTER_ID])) { - $this->_filterId = $args[FiltersLib::FILTER_ID]; + $this->_filterId = $args[FilterWidgetLib::FILTER_ID]; } // How to retrieve data for the filter: SQL statement or a result from DB - if (isset($args[FiltersLib::QUERY_PARAMETER])) + if (isset($args[FilterWidgetLib::QUERY_PARAMETER])) { - $this->_query = $args[FiltersLib::QUERY_PARAMETER]; + $this->_query = $args[FilterWidgetLib::QUERY_PARAMETER]; } - if (isset($args[FiltersLib::DATASET_RELOAD_PARAMETER])) + if (isset($args[FilterWidgetLib::DATASET_RELOAD_PARAMETER])) { - $this->_reloadDataset = $args[FiltersLib::DATASET_RELOAD_PARAMETER]; + $this->_reloadDataset = $args[FilterWidgetLib::DATASET_RELOAD_PARAMETER]; } // Parameter is used to add extra columns to the dataset - if (isset($args[FiltersLib::ADDITIONAL_COLUMNS]) - && is_array($args[FiltersLib::ADDITIONAL_COLUMNS]) - && count($args[FiltersLib::ADDITIONAL_COLUMNS]) > 0) + if (isset($args[FilterWidgetLib::ADDITIONAL_COLUMNS]) + && is_array($args[FilterWidgetLib::ADDITIONAL_COLUMNS]) + && count($args[FilterWidgetLib::ADDITIONAL_COLUMNS]) > 0) { - $this->_additionalColumns = $args[FiltersLib::ADDITIONAL_COLUMNS]; + $this->_additionalColumns = $args[FilterWidgetLib::ADDITIONAL_COLUMNS]; } // Parameter is used to add use aliases for the columns fo the dataset - if (isset($args[FiltersLib::COLUMNS_ALIASES]) - && is_array($args[FiltersLib::COLUMNS_ALIASES]) - && count($args[FiltersLib::COLUMNS_ALIASES]) > 0) + if (isset($args[FilterWidgetLib::COLUMNS_ALIASES]) + && is_array($args[FilterWidgetLib::COLUMNS_ALIASES]) + && count($args[FilterWidgetLib::COLUMNS_ALIASES]) > 0) { - $this->_columnsAliases = $args[FiltersLib::COLUMNS_ALIASES]; + $this->_columnsAliases = $args[FilterWidgetLib::COLUMNS_ALIASES]; } // Parameter that contains a function to format the rows of the dataset - if (isset($args[FiltersLib::FORMAT_ROW]) && is_callable($args[FiltersLib::FORMAT_ROW])) + if (isset($args[FilterWidgetLib::FORMAT_ROW]) && is_callable($args[FilterWidgetLib::FORMAT_ROW])) { - $this->_formatRow = $args[FiltersLib::FORMAT_ROW]; + $this->_formatRow = $args[FilterWidgetLib::FORMAT_ROW]; } // Parameter that contains a function to mark in the GUI the rows of the dataset - if (isset($args[FiltersLib::MARK_ROW]) && is_callable($args[FiltersLib::MARK_ROW])) + if (isset($args[FilterWidgetLib::MARK_ROW]) && is_callable($args[FilterWidgetLib::MARK_ROW])) { - $this->_markRow = $args[FiltersLib::MARK_ROW]; + $this->_markRow = $args[FilterWidgetLib::MARK_ROW]; } // Parameter used to specify the column of the dataset that will be used // as id of the checkboxes column in the GUI - if (isset($args[FiltersLib::CHECKBOXES])) + if (isset($args[FilterWidgetLib::CHECKBOXES])) { - $this->_checkboxes = $args[FiltersLib::CHECKBOXES]; + $this->_checkboxes = $args[FilterWidgetLib::CHECKBOXES]; } - // To specify if the header to operate with the FilterWidget is shown or not - if (isset($args[FiltersLib::HIDE_HEADER]) && is_bool($args[FiltersLib::HIDE_HEADER])) + // To specify if the filter options are shown ot not + if (isset($args[FilterWidgetLib::HIDE_OPTIONS]) && is_bool($args[FilterWidgetLib::HIDE_OPTIONS])) { - $this->_hideHeader = $args[FiltersLib::HIDE_HEADER]; + $this->_hideOptions = $args[FilterWidgetLib::HIDE_OPTIONS]; + } + + // To specify if the form to select fields is shown or not + if (isset($args[FilterWidgetLib::HIDE_SELECT_FIELDS]) && is_bool($args[FilterWidgetLib::HIDE_SELECT_FIELDS])) + { + $this->_hideSelectFields = $args[FilterWidgetLib::HIDE_SELECT_FIELDS]; + } + + // To specify if the form to select filters is shown or not + if (isset($args[FilterWidgetLib::HIDE_SELECT_FILTERS]) && is_bool($args[FilterWidgetLib::HIDE_SELECT_FILTERS])) + { + $this->_hideSelectFilters = $args[FilterWidgetLib::HIDE_SELECT_FILTERS]; } // To specify if the form to save a custom FilterWidget is shown or not - if (isset($args[FiltersLib::HIDE_SAVE]) && is_bool($args[FiltersLib::HIDE_SAVE])) + if (isset($args[FilterWidgetLib::HIDE_SAVE]) && is_bool($args[FilterWidgetLib::HIDE_SAVE])) { - $this->_hideSave = $args[FiltersLib::HIDE_SAVE]; + $this->_hideSave = $args[FilterWidgetLib::HIDE_SAVE]; + } + + // If the menu should be shown or not + if (isset($args[FilterWidgetLib::HIDE_MENU]) && is_bool($args[FilterWidgetLib::HIDE_MENU])) + { + $this->_hideMenu = $args[FilterWidgetLib::HIDE_MENU]; } // If a custom menu is set - if (isset($args[FiltersLib::CUSTOM_MENU]) && is_bool($args[FiltersLib::CUSTOM_MENU])) + if (isset($args[FilterWidgetLib::CUSTOM_MENU]) && is_bool($args[FilterWidgetLib::CUSTOM_MENU])) { - $this->_customMenu = $args[FiltersLib::CUSTOM_MENU]; + $this->_customMenu = $args[FilterWidgetLib::CUSTOM_MENU]; } // To specify how to represent the dataset (ex: tablesorter, pivotUI, ...) - if (isset($args[FiltersLib::DATASET_REPRESENTATION]) - && ($args[FiltersLib::DATASET_REPRESENTATION] == FiltersLib::DATASET_REP_TABLESORTER - || $args[FiltersLib::DATASET_REPRESENTATION] == FiltersLib::DATASET_REP_PIVOTUI)) + if (isset($args[FilterWidgetLib::DATASET_REPRESENTATION]) + && ($args[FilterWidgetLib::DATASET_REPRESENTATION] == FilterWidgetLib::DATASET_REP_TABLESORTER + || $args[FilterWidgetLib::DATASET_REPRESENTATION] == FilterWidgetLib::DATASET_REP_PIVOTUI + || $args[FilterWidgetLib::DATASET_REPRESENTATION] == FilterWidgetLib::DATASET_REP_TABULATOR)) { - $this->_datasetRepresentation = $args[FiltersLib::DATASET_REPRESENTATION]; + $this->_datasetRepresentation = $args[FilterWidgetLib::DATASET_REPRESENTATION]; } // To specify options for the dataset representation (ex: tablesorter, pivotUI, ...) - if (isset($args[FiltersLib::DATASET_REP_OPTIONS]) && !isEmptyString($args[FiltersLib::DATASET_REP_OPTIONS])) + if (isset($args[FilterWidgetLib::DATASET_REP_OPTIONS]) && !isEmptyString($args[FilterWidgetLib::DATASET_REP_OPTIONS])) { - $this->_datasetRepresentationOptions = $args[FiltersLib::DATASET_REP_OPTIONS]; + $this->_datasetRepresentationOptions = $args[FilterWidgetLib::DATASET_REP_OPTIONS]; + } + + // To specify how to represent each record field + if (isset($args[FilterWidgetLib::DATASET_REP_FIELDS_DEFS]) && !isEmptyString($args[FilterWidgetLib::DATASET_REP_FIELDS_DEFS])) + { + $this->_datasetRepFieldsDefs = $args[FilterWidgetLib::DATASET_REP_FIELDS_DEFS]; } } @@ -287,32 +345,36 @@ class FilterWidget extends Widget } else { - if ((!isset($args[FiltersLib::APP_PARAMETER]) && !isset($args[FiltersLib::DATASET_NAME_PARAMETER])) - && !isset($args[FiltersLib::FILTER_ID])) + if ((!isset($args[FilterWidgetLib::APP_PARAMETER]) && !isset($args[FilterWidgetLib::DATASET_NAME_PARAMETER])) + && !isset($args[FilterWidgetLib::FILTER_ID])) { show_error( - 'The parameters ("'.FiltersLib::APP_PARAMETER.'" and "'.FiltersLib::DATASET_NAME_PARAMETER.') OR "'. - FiltersLib::FILTER_ID.'" must be specified' + 'The parameters ("'.FilterWidgetLib::APP_PARAMETER.'" AND "'.FilterWidgetLib::DATASET_NAME_PARAMETER.') OR "'. + FilterWidgetLib::FILTER_ID.'" must be specified' ); } - if (!isset($args[FiltersLib::QUERY_PARAMETER])) + if (!isset($args[FilterWidgetLib::QUERY_PARAMETER])) { - show_error('The parameters "'.FiltersLib::QUERY_PARAMETER.'" must be specified'); + show_error('The parameters "'.FilterWidgetLib::QUERY_PARAMETER.'" must be specified'); } - if (!isset($args[FiltersLib::DATASET_REPRESENTATION])) + if (!isset($args[FilterWidgetLib::DATASET_REPRESENTATION])) { - show_error('The parameter "'.FiltersLib::DATASET_REPRESENTATION.'" must be specified'); + show_error('The parameter "'.FilterWidgetLib::DATASET_REPRESENTATION.'" must be specified'); } - if (isset($args[FiltersLib::DATASET_REPRESENTATION]) - && $args[FiltersLib::DATASET_REPRESENTATION] != FiltersLib::DATASET_REP_TABLESORTER - && $args[FiltersLib::DATASET_REPRESENTATION] != FiltersLib::DATASET_REP_PIVOTUI) + if (isset($args[FilterWidgetLib::DATASET_REPRESENTATION]) + && $args[FilterWidgetLib::DATASET_REPRESENTATION] != FilterWidgetLib::DATASET_REP_TABLESORTER + && $args[FilterWidgetLib::DATASET_REPRESENTATION] != FilterWidgetLib::DATASET_REP_PIVOTUI + && $args[FilterWidgetLib::DATASET_REPRESENTATION] != FilterWidgetLib::DATASET_REP_TABULATOR) { show_error( - 'The parameter "'.FiltersLib::DATASET_REPRESENTATION. - '" must be IN ("'.FiltersLib::DATASET_REP_TABLESORTER.'", "'.FiltersLib::DATASET_REP_PIVOTUI.'")' + 'The parameter "'.FilterWidgetLib::DATASET_REPRESENTATION. + '" must be IN ("' + .FilterWidgetLib::DATASET_REP_TABLESORTER.'", "' + .FilterWidgetLib::DATASET_REP_PIVOTUI.'", "' + .FilterWidgetLib::DATASET_REP_TABULATOR.'")' ); } } @@ -324,51 +386,49 @@ class FilterWidget extends Widget private function _startFilterWidget() { // Read the all session for this filter widget - $session = $this->filterslib->getSession(); + $session = $this->filterwidgetlib->getSession(); // If session is NOT empty -> a filter was already loaded if ($session != null) { // Retrieve the filterId stored in the session - $sessionFilterId = $this->filterslib->getSessionElement(FiltersLib::FILTER_ID); + $sessionFilterId = $this->filterwidgetlib->getSessionElement(FilterWidgetLib::FILTER_ID); // If the filter loaded in session is NOT the same that is being requested then empty the session if ($this->_filterId != $sessionFilterId) { - $this->filterslib->setSession(null); + $this->filterwidgetlib->setSession(null); $session = null; } else // else if the filter loaded in session is the same that is being requested { // Get SESSION_RELOAD_DATASET from the session - $sessionReloadDataset = $this->filterslib->getSessionElement(FiltersLib::SESSION_RELOAD_DATASET); + $sessionReloadDataset = $this->filterwidgetlib->getSessionElement(FilterWidgetLib::SESSION_RELOAD_DATASET); // if Filter changed or reload is forced by parameter then reload the Dataset if ($this->_reloadDataset === true || $sessionReloadDataset === true) { // Set as false to stop changing the dataset - $this->filterslib->setSessionElement(FiltersLib::SESSION_RELOAD_DATASET, false); + $this->filterwidgetlib->setSessionElement(FilterWidgetLib::SESSION_RELOAD_DATASET, false); // Generate dataset query using filters from the session - $datasetQuery = $this->filterslib->generateDatasetQuery( + $datasetQuery = $this->filterwidgetlib->generateDatasetQuery( $this->_query, - $this->filterslib->getSessionElement(FiltersLib::SESSION_FILTERS) + $this->filterwidgetlib->getSessionElement(FilterWidgetLib::SESSION_FILTERS) ); // Then retrieve dataset from DB - $dataset = $this->filterslib->getDataset($datasetQuery); + $dataset = $this->filterwidgetlib->getDataset($datasetQuery); // Save changes into session if data are valid if (!isError($dataset)) { $this->_formatDataset($dataset); // marks rows using markRow and format rowns using formatRow - $this->load->model('system/Filters_model', 'FiltersModel'); - // Set the new dataset and its attributes in the session - $this->filterslib->setSessionElement(FiltersLib::SESSION_METADATA, $this->FiltersModel->getExecutedQueryMetaData()); - $this->filterslib->setSessionElement(FiltersLib::SESSION_ROW_NUMBER, count($dataset->retval)); - $this->filterslib->setSessionElement(FiltersLib::SESSION_DATASET, $dataset->retval); + $this->filterwidgetlib->setSessionElement(FilterWidgetLib::SESSION_METADATA, $this->FiltersModel->getExecutedQueryMetaData()); + $this->filterwidgetlib->setSessionElement(FilterWidgetLib::SESSION_ROW_NUMBER, count($dataset->retval)); + $this->filterwidgetlib->setSessionElement(FilterWidgetLib::SESSION_DATASET, $dataset->retval); } } } @@ -378,7 +438,7 @@ class FilterWidget extends Widget if ($session == null) { // Load filter definition data from DB - $definition = $this->filterslib->loadDefinition( + $definition = $this->filterwidgetlib->loadDefinition( $this->_filterId, $this->_app, $this->_datasetName, @@ -386,44 +446,43 @@ class FilterWidget extends Widget ); // Checks and parse json present into the definition - $parsedFilterJson = $this->filterslib->parseFilterJson($definition); + $parsedFilterJson = $this->filterwidgetlib->parseFilterJson($definition); if ($parsedFilterJson != null) // if the json is valid { // Generate dataset query - $datasetQuery = $this->filterslib->generateDatasetQuery($this->_query, $parsedFilterJson->filters); + $datasetQuery = $this->filterwidgetlib->generateDatasetQuery($this->_query, $parsedFilterJson->filters); // Then retrieve dataset from DB - $dataset = $this->filterslib->getDataset($datasetQuery); + $dataset = $this->filterwidgetlib->getDataset($datasetQuery); // Try to load the name of the filter using the PhrasesLib - $filterName = $this->filterslib->getFilterName($parsedFilterJson); + $filterName = $this->filterwidgetlib->getFilterName($parsedFilterJson); // Save changes into session if data are valid if (!isError($dataset)) { $this->_formatDataset($dataset); // marks rows using markRow and format rowns using formatRow - $this->load->model('system/Filters_model', 'FiltersModel'); - // Stores an array that contains all the data useful for - $this->filterslib->setSession( + $this->filterwidgetlib->setSession( array( - FiltersLib::FILTER_ID => $this->_filterId, // the current filter id - FiltersLib::APP_PARAMETER => $this->_app, // the current app parameter - FiltersLib::DATASET_NAME_PARAMETER => $this->_datasetName, // the carrent dataset name - FiltersLib::SESSION_FILTER_NAME => $filterName, // the current filter name - FiltersLib::SESSION_FIELDS => $this->FiltersModel->getExecutedQueryListFields(), // all the fields of the dataset - FiltersLib::SESSION_SELECTED_FIELDS => $this->_getColumnsNames($parsedFilterJson->columns), // all the selected fields - FiltersLib::SESSION_COLUMNS_ALIASES => $this->_columnsAliases, // all the fields aliases - FiltersLib::SESSION_ADDITIONAL_COLUMNS => $this->_additionalColumns, // additional columns - FiltersLib::SESSION_CHECKBOXES => $this->_checkboxes, // the name of the field used to build the checkboxes column - FiltersLib::SESSION_FILTERS => $parsedFilterJson->filters, // all the filters used to filter the dataset - FiltersLib::SESSION_METADATA => $this->FiltersModel->getExecutedQueryMetaData(), // the metadata of the dataset - FiltersLib::SESSION_ROW_NUMBER => count($dataset->retval), // the number of loaded rows by this filter - FiltersLib::SESSION_DATASET => $dataset->retval, // the entire dataset - FiltersLib::SESSION_RELOAD_DATASET => false, // if the dataset must be reloaded, not needed the first time - FiltersLib::SESSION_DATASET_REPRESENTATION => $this->_datasetRepresentation, // the choosen dataset representation - FiltersLib::SESSION_DATASET_REP_OPTIONS => $this->_datasetRepresentationOptions // the choosen dataset representation options + FilterWidgetLib::FILTER_ID => $this->_filterId, // the current filter id + FilterWidgetLib::APP_PARAMETER => $this->_app, // the current app parameter + FilterWidgetLib::DATASET_NAME_PARAMETER => $this->_datasetName, // the carrent dataset name + FilterWidgetLib::SESSION_FILTER_NAME => $filterName, // the current filter name + FilterWidgetLib::SESSION_FIELDS => $this->FiltersModel->getExecutedQueryListFields(), // all the fields of the dataset + FilterWidgetLib::SESSION_SELECTED_FIELDS => $this->_getColumnsNames($parsedFilterJson->columns), // all the selected fields + FilterWidgetLib::SESSION_COLUMNS_ALIASES => $this->_columnsAliases, // all the fields aliases + FilterWidgetLib::SESSION_ADDITIONAL_COLUMNS => $this->_additionalColumns, // additional columns + FilterWidgetLib::SESSION_CHECKBOXES => $this->_checkboxes, // the name of the field used to build the checkboxes column + FilterWidgetLib::SESSION_FILTERS => $parsedFilterJson->filters, // all the filters used to filter the dataset + FilterWidgetLib::SESSION_METADATA => $this->FiltersModel->getExecutedQueryMetaData(), // the metadata of the dataset + FilterWidgetLib::SESSION_ROW_NUMBER => count($dataset->retval), // the number of loaded rows by this filter + FilterWidgetLib::SESSION_DATASET => $dataset->retval, // the entire dataset + FilterWidgetLib::SESSION_RELOAD_DATASET => false, // if the dataset must be reloaded, not needed the first time + FilterWidgetLib::SESSION_DATASET_REPRESENTATION => $this->_datasetRepresentation, // the choosen dataset representation + FilterWidgetLib::SESSION_DATASET_REP_OPTIONS => $this->_datasetRepresentationOptions, // the choosen dataset representation options + FilterWidgetLib::SESSION_DATASET_REP_FIELDS_DEFS => $this->_datasetRepFieldsDefs // the choosen dataset representation record fields definition ) ); } @@ -432,7 +491,7 @@ class FilterWidget extends Widget // To be always stored in the session, otherwise is not possible to load data from Filters controller // NOTE: must the latest operation to be performed in the session to be shure that is always present - $this->filterslib->setSessionElement(FiltersLib::REQUIRED_PERMISSIONS_PARAMETER, $this->_requiredPermissions); + $this->filterwidgetlib->setSessionElement(FilterWidgetLib::REQUIRED_PERMISSIONS_PARAMETER, $this->_requiredPermissions); } /** @@ -441,7 +500,7 @@ class FilterWidget extends Widget private function _setFilterMenu() { // Generates the filters structure array - $filterMenu = $this->filterslib->generateFilterMenu( + $filterMenu = $this->filterwidgetlib->generateFilterMenu( $this->router->directory.$this->router->class.'/'.$this->router->method ); } diff --git a/application/widgets/Organisationseinheit_widget.php b/application/widgets/Organisationseinheit_widget.php index 67d1598b0..e4fbfe2ba 100644 --- a/application/widgets/Organisationseinheit_widget.php +++ b/application/widgets/Organisationseinheit_widget.php @@ -5,16 +5,34 @@ class Organisationseinheit_widget extends DropdownWidget public function display($widgetData) { $this->load->model('organisation/Organisationseinheit_model', 'OrganisationseinheitModel'); - + if (isset($widgetData['typ'])) - $typ = $widgetData['typ']; + { + $this->setElementsArray($this->OrganisationseinheitModel->getRecursiveList($widgetData['typ'])); + } + // If 'organisationseinheit' (array of specific oe_kurzbz) is given, retrieve these organisational units only + elseif (isset($widgetData['organisationseinheit']) && !empty($widgetData['organisationseinheit'])) + { + $condition = ' + oe_kurzbz IN (\''. implode('\',\'', $widgetData['organisationseinheit']) . '\') AND + aktiv = TRUE + '; + $this->addSelectToModel($this->OrganisationseinheitModel, 'oe_kurzbz', 'organisationseinheittyp_kurzbz || \' \' || bezeichnung'); + $this->OrganisationseinheitModel->addOrder('organisationseinheittyp_kurzbz', 'ASC'); + $this->setElementsArray( + $this->OrganisationseinheitModel->loadWhere($condition), + true, + $this->p->t('lehre', 'organisationseinheit'), + 'No organisational units found' + ); + } + // Default: retrieve tree of all organisational units else - $typ = null; - - // NOTE: no need to call addSelectToModel because getRecursiveList already returns - // the correct names of the fields - - $this->setElementsArray($this->OrganisationseinheitModel->getRecursiveList($typ)); + { + // NOTE: no need to call addSelectToModel because getRecursiveList already returns + // the correct names of the fields + $this->setElementsArray($this->OrganisationseinheitModel->getRecursiveList()); + } $this->loadDropDownView($widgetData); } diff --git a/application/widgets/Studiengang_widget.php b/application/widgets/Studiengang_widget.php index a09c865f5..250f2a9bc 100644 --- a/application/widgets/Studiengang_widget.php +++ b/application/widgets/Studiengang_widget.php @@ -8,15 +8,29 @@ class Studiengang_widget extends DropdownWidget $this->load->model('organisation/Studiengang_model', 'StudiengangModel'); $this->StudiengangModel->addOrder('kurzbzlang'); - $this->addSelectToModel($this->StudiengangModel, 'studiengang_kz', '\'(\' || kurzbzlang || \') \' || bezeichnung'); - - $this->setElementsArray( - $this->StudiengangModel->loadWhere(array('aktiv' => true)), - true, - 'Select a studiengang...', - 'No studiengaenge found' - ); - + $this->addSelectToModel($this->StudiengangModel, 'studiengang_kz', '\'(\' || upper(typ||kurzbz) || \') \' || tbl_studiengang.bezeichnung'); + + // If 'studiengang' (array of specific studiengaenge) is given, retrieve these studiengaenge only + if (isset($widgetData['studiengang']) && !empty($widgetData['studiengang'])) + { + $condition = ' + studiengang_kz IN ('. implode(',', $widgetData['studiengang']) . ') AND + aktiv = true + '; + } + // Default: retrieve all studiengaenge + else + { + $condition = array('aktiv' => true); + } + + $this->setElementsArray( + $this->StudiengangModel->loadWhere($condition), + true, + $this->p->t('lehre', 'studiengang'), + 'No studiengaenge found' + ); + $this->loadDropDownView(); } } \ No newline at end of file diff --git a/application/widgets/Studiensemester_widget.php b/application/widgets/Studiensemester_widget.php index bc1c0a201..dc6e28d38 100644 --- a/application/widgets/Studiensemester_widget.php +++ b/application/widgets/Studiensemester_widget.php @@ -6,14 +6,14 @@ class Studiensemester_widget extends DropdownWidget { // Studiensemester $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); - $this->StudiensemesterModel->addOrder('studiensemester_kurzbz', 'DESC'); + $this->StudiensemesterModel->addOrder('start', 'DESC'); $this->addSelectToModel($this->StudiensemesterModel, 'studiensemester_kurzbz', 'studiensemester_kurzbz'); $this->setElementsArray( $this->StudiensemesterModel->load(), true, - 'Select a studiensemester...', + $this->p->t('lehre', 'studiensemester'), 'No studiensemester found' ); diff --git a/application/widgets/TableWidget.php b/application/widgets/TableWidget.php new file mode 100644 index 000000000..a0f64b291 --- /dev/null +++ b/application/widgets/TableWidget.php @@ -0,0 +1,415 @@ +load->library('TableWidgetLib'); // Loads the TableWidgetLib that contains all the used logic + + $this->_initTableWidget($args); // checks parameters and initialize properties + + $this->tablewidgetlib->setTableUniqueIdByParams($args); + + // Let's start if it's allowed + // NOTE: If it is NOT allowed then no data are loaded + if ($this->tablewidgetlib->isAllowed($this->_requiredPermissions)) + { + $this->_startTableWidget($args[TableWidgetLib::TABLE_UNIQUE_ID]); + } + } + + //------------------------------------------------------------------------------------------------------------------ + // Public methods + + /** + * Called when echoing the table widget call + */ + public function display($widgetData) + { + $this->view(self::WIDGET_URL_TABLE, array( + 'tableUniqueId' => $widgetData[TableWidgetLib::TABLE_UNIQUE_ID] + )); // GUI starts here + } + + //------------------------------------------------------------------------------------------------------------------ + // Public static methods used to load views and to access statically to some properies of the TableWidget + + /** + * Loads the view related to the dataset, here is decided how to represent the dataset (ex: tablesorter, pivotUI, ...) + */ + public static function loadViewDataset() + { + if (self::$_TableWidgetInstance->_datasetRepresentation == TableWidgetLib::DATASET_REP_TABLESORTER) + { + self::_loadView(self::WIDGET_URL_DATASET_TABLESORTER); + } + + if (self::$_TableWidgetInstance->_datasetRepresentation == TableWidgetLib::DATASET_REP_PIVOTUI) + { + self::_loadView(self::WIDGET_URL_DATASET_PIVOTUI); + } + + if (self::$_TableWidgetInstance->_datasetRepresentation == TableWidgetLib::DATASET_REP_TABULATOR) + { + self::_loadView(self::WIDGET_URL_DATASET_TABULATOR); + } + } + + //------------------------------------------------------------------------------------------------------------------ + // Private methods + + /** + * Checks parameters and initialize all the properties of this TableWidget + */ + private function _initTableWidget($args) + { + $this->_checkParameters($args); + + // If here then everything is ok + + // Initialize class properties + $this->_requiredPermissions = null; + $this->_reloadDataset = null; + $this->_query = null; + $this->_additionalColumns = null; + $this->_columnsAliases = null; + $this->_formatRow = null; + $this->_markRow = null; + $this->_checkboxes = null; + $this->_datasetRepresentation = null; + $this->_datasetRepresentationOptions = null; + $this->_datasetRepFieldsDefs = null; + + // Retrieved the required permissions parameter if present + if (isset($args[TableWidgetLib::REQUIRED_PERMISSIONS_PARAMETER])) + { + $this->_requiredPermissions = $args[TableWidgetLib::REQUIRED_PERMISSIONS_PARAMETER]; + } + + // How to retrieve data for the table: SQL statement or a result from DB + if (isset($args[TableWidgetLib::QUERY_PARAMETER])) + { + $this->_query = $args[TableWidgetLib::QUERY_PARAMETER]; + } + + if (isset($args[TableWidgetLib::DATASET_RELOAD_PARAMETER])) + { + $this->_reloadDataset = $args[TableWidgetLib::DATASET_RELOAD_PARAMETER]; + } + + // Parameter is used to add extra columns to the dataset + if (isset($args[TableWidgetLib::ADDITIONAL_COLUMNS]) + && is_array($args[TableWidgetLib::ADDITIONAL_COLUMNS]) + && count($args[TableWidgetLib::ADDITIONAL_COLUMNS]) > 0) + { + $this->_additionalColumns = $args[TableWidgetLib::ADDITIONAL_COLUMNS]; + } + + // Parameter is used to add use aliases for the columns fo the dataset + if (isset($args[TableWidgetLib::COLUMNS_ALIASES]) + && is_array($args[TableWidgetLib::COLUMNS_ALIASES]) + && count($args[TableWidgetLib::COLUMNS_ALIASES]) > 0) + { + $this->_columnsAliases = $args[TableWidgetLib::COLUMNS_ALIASES]; + } + + // Parameter that contains a function to format the rows of the dataset + if (isset($args[TableWidgetLib::FORMAT_ROW]) && is_callable($args[TableWidgetLib::FORMAT_ROW])) + { + $this->_formatRow = $args[TableWidgetLib::FORMAT_ROW]; + } + + // Parameter that contains a function to mark in the GUI the rows of the dataset + if (isset($args[TableWidgetLib::MARK_ROW]) && is_callable($args[TableWidgetLib::MARK_ROW])) + { + $this->_markRow = $args[TableWidgetLib::MARK_ROW]; + } + + // Parameter used to specify the column of the dataset that will be used + // as id of the checkboxes column in the GUI + if (isset($args[TableWidgetLib::CHECKBOXES])) + { + $this->_checkboxes = $args[TableWidgetLib::CHECKBOXES]; + } + + // To specify how to represent the dataset (ex: tablesorter, pivotUI, ...) + if (isset($args[TableWidgetLib::DATASET_REPRESENTATION]) + && ($args[TableWidgetLib::DATASET_REPRESENTATION] == TableWidgetLib::DATASET_REP_TABLESORTER + || $args[TableWidgetLib::DATASET_REPRESENTATION] == TableWidgetLib::DATASET_REP_PIVOTUI + || $args[TableWidgetLib::DATASET_REPRESENTATION] == TableWidgetLib::DATASET_REP_TABULATOR)) + { + $this->_datasetRepresentation = $args[TableWidgetLib::DATASET_REPRESENTATION]; + } + + // To specify options for the dataset representation (ex: tablesorter, pivotUI, ...) + if (isset($args[TableWidgetLib::DATASET_REP_OPTIONS]) && !isEmptyString($args[TableWidgetLib::DATASET_REP_OPTIONS])) + { + $this->_datasetRepresentationOptions = $args[TableWidgetLib::DATASET_REP_OPTIONS]; + } + + // To specify how to represent each record field + if (isset($args[TableWidgetLib::DATASET_REP_FIELDS_DEFS]) && !isEmptyString($args[TableWidgetLib::DATASET_REP_FIELDS_DEFS])) + { + $this->_datasetRepFieldsDefs = $args[TableWidgetLib::DATASET_REP_FIELDS_DEFS]; + } + } + + /** + * Checks the required parameters used to call this TableWidget + */ + private function _checkParameters($args) + { + if (!is_array($args) || (is_array($args) && count($args) == 0)) + { + show_error('Second parameter of the widget call must be a NOT empty associative array'); + } + else + { + if (!isset($args[TableWidgetLib::TABLE_UNIQUE_ID])) + { + show_error('The parameter "'.TableWidgetLib::TABLE_UNIQUE_ID.'" must be specified'); + } + + if (!isset($args[TableWidgetLib::QUERY_PARAMETER])) + { + show_error('The parameters "'.TableWidgetLib::QUERY_PARAMETER.'" must be specified'); + } + + if (!isset($args[TableWidgetLib::DATASET_REPRESENTATION])) + { + show_error('The parameter "'.TableWidgetLib::DATASET_REPRESENTATION.'" must be specified'); + } + + if (isset($args[TableWidgetLib::DATASET_REPRESENTATION]) + && $args[TableWidgetLib::DATASET_REPRESENTATION] != TableWidgetLib::DATASET_REP_TABLESORTER + && $args[TableWidgetLib::DATASET_REPRESENTATION] != TableWidgetLib::DATASET_REP_PIVOTUI + && $args[TableWidgetLib::DATASET_REPRESENTATION] != TableWidgetLib::DATASET_REP_TABULATOR) + { + show_error( + 'The parameter "'.TableWidgetLib::DATASET_REPRESENTATION. + '" must be IN ("' + .TableWidgetLib::DATASET_REP_TABLESORTER.'", "' + .TableWidgetLib::DATASET_REP_PIVOTUI.'", "' + .TableWidgetLib::DATASET_REP_TABULATOR.'")' + ); + } + } + } + + /** + * Contains all the logic used to load all the data needed to the TableWidget + */ + private function _startTableWidget($tableUniqueId) + { + // Read the all session for this table widget + $session = $this->tablewidgetlib->getSession(); + + // If session is NOT empty -> a table was already loaded + if ($session != null) + { + // Get SESSION_RELOAD_DATASET from the session + $sessionReloadDataset = $this->tablewidgetlib->getSessionElement(TableWidgetLib::SESSION_RELOAD_DATASET); + + // if Filter changed or reload is forced by parameter then reload the Dataset + if ($this->_reloadDataset === true || $sessionReloadDataset === true) + { + // Set as false to stop changing the dataset + $this->tablewidgetlib->setSessionElement(TableWidgetLib::SESSION_RELOAD_DATASET, false); + + // Generate dataset query using tables from the session + $datasetQuery = $this->tablewidgetlib->generateDatasetQuery($this->_query); + + // Then retrieve dataset from DB + $dataset = $this->tablewidgetlib->getDataset($datasetQuery); + + // Save changes into session if data are valid + if (!isError($dataset)) + { + $this->_formatDataset($dataset); // marks rows using markRow and format rowns using formatRow + + // Set the new dataset and its attributes in the session + $this->tablewidgetlib->setSessionElement(TableWidgetLib::SESSION_METADATA, $this->tablewidgetlib->getExecutedQueryMetaData()); + $this->tablewidgetlib->setSessionElement(TableWidgetLib::SESSION_ROW_NUMBER, count($dataset->retval)); + $this->tablewidgetlib->setSessionElement(TableWidgetLib::SESSION_DATASET, $dataset->retval); + } + } + } + + // If the session is empty -> first time that this table is loaded + if ($session == null) + { + // Generate dataset query + $datasetQuery = $this->tablewidgetlib->generateDatasetQuery($this->_query); + + // Then retrieve dataset from DB + $dataset = $this->tablewidgetlib->getDataset($datasetQuery); + + // Save changes into session if data are valid + if (!isError($dataset)) + { + $this->_formatDataset($dataset); // marks rows using markRow and format rowns using formatRow + + // Stores an array that contains all the data useful for + $this->tablewidgetlib->setSession( + array( + TableWidgetLib::TABLE_UNIQUE_ID => $tableUniqueId, // table unique id + TableWidgetLib::SESSION_FIELDS => $this->tablewidgetlib->getExecutedQueryListFields(), // all the fields of the dataset + TableWidgetLib::SESSION_COLUMNS_ALIASES => $this->_columnsAliases, // all the fields aliases + TableWidgetLib::SESSION_ADDITIONAL_COLUMNS => $this->_additionalColumns, // additional columns + TableWidgetLib::SESSION_CHECKBOXES => $this->_checkboxes, // the name of the field used to build the checkboxes column + TableWidgetLib::SESSION_METADATA => $this->tablewidgetlib->getExecutedQueryMetaData(), // the metadata of the dataset + TableWidgetLib::SESSION_ROW_NUMBER => count($dataset->retval), // the number of loaded rows by this table + TableWidgetLib::SESSION_DATASET => $dataset->retval, // the entire dataset + TableWidgetLib::SESSION_RELOAD_DATASET => false, // if the dataset must be reloaded, not needed the first time + TableWidgetLib::SESSION_DATASET_REPRESENTATION => $this->_datasetRepresentation, // the choosen dataset representation + TableWidgetLib::SESSION_DATASET_REP_OPTIONS => $this->_datasetRepresentationOptions, // the choosen dataset representation options + TableWidgetLib::SESSION_DATASET_REP_FIELDS_DEFS => $this->_datasetRepFieldsDefs // the choosen dataset representation record fields definition + ) + ); + } + } + + // To be always stored in the session, otherwise is not possible to load data from Filters controller + // NOTE: must the latest operation to be performed in the session to be shure that is always present + $this->tablewidgetlib->setSessionElement(TableWidgetLib::REQUIRED_PERMISSIONS_PARAMETER, $this->_requiredPermissions); + } + + /** + * Calls the method _markRow and _formatRow to marks rows using markRow and format rowns using formatRow + * NOTE: this method operates directly on the retrieved dataset: parameter passed by reference + */ + private function _formatDataset(&$rawDataset) + { + if (hasData($rawDataset) && is_array($rawDataset->retval)) + { + // For each row of the data set + for ($rowCounter = 0; $rowCounter < count($rawDataset->retval); $rowCounter++) + { + // Calls the methods to mark and to format a row + // NOTE: keep this order! the markRow function given as parameter is supposing to work + // on a raw dataset, NOT on a formatted one + $rawDataset->retval[$rowCounter]->MARK_ROW_CLASS = $this->_markRow($rawDataset->retval[$rowCounter]); + $this->_formatRow($rawDataset->retval[$rowCounter]); + } + } + } + + /** + * Formats the columns of all the rows of the entire dataset + * - converts booleans into strings "true" and "false" + * - format dates using the format string defined in DEFAULT_DATE_FORMAT + * Calls the parameter formatRow if it was given and if it is a valid funtion + * NOTE: this method operates directly on the retrieved dataset: parameter passed by reference + */ + private function _formatRow(&$rawDatasetRow) + { + // For each column of the row + foreach ($rawDatasetRow as $columnName => $columnValue) + { + // Basic conversions + if (is_bool($columnValue)) + { + $rawDatasetRow->{$columnName} = ($columnValue === true ? 'true' : 'false'); + } + elseif (DateTime::createFromFormat('Y-m-d H:i:s', $columnValue) !== false) + { + $rawDatasetRow->{$columnName} = date(self::DEFAULT_DATE_FORMAT, strtotime($columnValue)); + } + } + + // If a valid function call the given formatRow + if ($this->_formatRow != null && is_callable($this->_formatRow)) + { + $formatRowFunction = $this->_formatRow; + $rawDatasetRow = $formatRowFunction($rawDatasetRow); + } + } + + /** + * Returns a string that contains a class name used to mark rows in the dataset table + * Calls the parameter markRow if it was given and if it is a valid funtion + */ + private function _markRow($rawDatasetRow) + { + // If a valid function call the given markRow + if ($this->_markRow != null && is_callable($this->_markRow)) + { + $markRowFunction = $this->_markRow; + $class = $markRowFunction($rawDatasetRow); + } + + return !isset($class) ? '' : $class; + } + + /** + * Utility method that retrieves the name of the columns present in a table JSON definition + */ + private function _getColumnsNames($columns) + { + $columnsNames = array(); + + foreach ($columns as $key => $obj) + { + if (isset($obj->name)) + { + $columnsNames[] = $obj->name; + } + } + + return $columnsNames; + } + + /** + * Loads a view using the given viewName and eventually other parameters + */ + private static function _loadView($viewName, $parameters = null) + { + $ci =& get_instance(); + $ci->load->view($viewName, $parameters); + } +} diff --git a/composer.json b/composer.json index c37ee91c6..636c6da42 100644 --- a/composer.json +++ b/composer.json @@ -162,6 +162,17 @@ } } }, + { + "type": "package", + "package": { + "name": "moment/momentjs", + "version": "2.24.0", + "dist": { + "url": "https://github.com/moment/moment/archive/2.24.0.zip", + "type": "zip" + } + } + }, { "type": "package", "package": { @@ -173,6 +184,17 @@ } } }, + { + "type": "package", + "package": { + "name": "olifolkerd/tabulator", + "version": "4.2.7", + "dist": { + "url": "https://github.com/olifolkerd/tabulator/archive/4.2.7.zip", + "type": "zip" + } + } + }, { "type": "package", "package": { @@ -253,6 +275,7 @@ "ludo/jquery-treetable": "^3.2", + "moment/momentjs": "2.24.0", "michelf/php-markdown": "1.5.0", "ml/json-ld": "1.*", "mottie/tablesorter": "^2.29", @@ -261,6 +284,8 @@ "netcarver/textile": "^3.5", "nicolaskruchten/pivottable": "^2.21.0", + "olifolkerd/tabulator": "4.2.7", + "phpseclib/phpseclib": "^2.0", "rmariuzzo/jquery-checkboxes": "1.0.7", diff --git a/composer.lock b/composer.lock index e5b050e96..0b869361a 100644 --- a/composer.lock +++ b/composer.lock @@ -1134,6 +1134,17 @@ ], "time": "2018-11-18T20:26:18+00:00" }, + { + "name": "moment/momentjs", + "version": "2.24.0", + "dist": { + "type": "zip", + "url": "https://github.com/moment/moment/archive/2.24.0.zip", + "reference": null, + "shasum": null + }, + "type": "library" + }, { "name": "mottie/tablesorter", "version": "v2.31.1", @@ -1237,16 +1248,16 @@ }, { "name": "netcarver/textile", - "version": "v3.7.1", + "version": "v3.7.2", "source": { "type": "git", "url": "https://github.com/textile/php-textile.git", - "reference": "377933125dd30d708804c545bf33da87a3c1b0f4" + "reference": "c24d68d9f4d099f9c2434e71024f2a6140dc1594" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/textile/php-textile/zipball/377933125dd30d708804c545bf33da87a3c1b0f4", - "reference": "377933125dd30d708804c545bf33da87a3c1b0f4", + "url": "https://api.github.com/repos/textile/php-textile/zipball/c24d68d9f4d099f9c2434e71024f2a6140dc1594", + "reference": "c24d68d9f4d099f9c2434e71024f2a6140dc1594", "shasum": "" }, "require": { @@ -1331,18 +1342,29 @@ ], "time": "2018-11-04T18:21:09+00:00" }, + { + "name": "olifolkerd/tabulator", + "version": "4.2.7", + "dist": { + "type": "zip", + "url": "https://github.com/olifolkerd/tabulator/archive/4.2.7.zip", + "reference": null, + "shasum": null + }, + "type": "library" + }, { "name": "phpseclib/phpseclib", - "version": "2.0.15", + "version": "2.0.20", "source": { "type": "git", "url": "https://github.com/phpseclib/phpseclib.git", - "reference": "11cf67cf78dc4acb18dc9149a57be4aee5036ce0" + "reference": "d6819a55b05e123db1e881d8b230d57f912126be" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/11cf67cf78dc4acb18dc9149a57be4aee5036ce0", - "reference": "11cf67cf78dc4acb18dc9149a57be4aee5036ce0", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/d6819a55b05e123db1e881d8b230d57f912126be", + "reference": "d6819a55b05e123db1e881d8b230d57f912126be", "shasum": "" }, "require": { @@ -2138,16 +2160,16 @@ }, { "name": "tinymce/tinymce", - "version": "4.9.4", + "version": "4.9.5", "source": { "type": "git", "url": "https://github.com/tinymce/tinymce-dist.git", - "reference": "3a997f24eb54d890b1c88f22cff03092e0b73378" + "reference": "5c6d8f4a6dda33b379068bb12678a2b2b2271fb4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/tinymce/tinymce-dist/zipball/3a997f24eb54d890b1c88f22cff03092e0b73378", - "reference": "3a997f24eb54d890b1c88f22cff03092e0b73378", + "url": "https://api.github.com/repos/tinymce/tinymce-dist/zipball/5c6d8f4a6dda33b379068bb12678a2b2b2271fb4", + "reference": "5c6d8f4a6dda33b379068bb12678a2b2b2271fb4", "shasum": "" }, "type": "component", @@ -2245,16 +2267,16 @@ }, { "name": "twig/twig", - "version": "v1.41.0", + "version": "v1.42.2", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "575cd5028362da591facde1ef5d7b94553c375c9" + "reference": "21707d6ebd05476854805e4f91b836531941bcd4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/575cd5028362da591facde1ef5d7b94553c375c9", - "reference": "575cd5028362da591facde1ef5d7b94553c375c9", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/21707d6ebd05476854805e4f91b836531941bcd4", + "reference": "21707d6ebd05476854805e4f91b836531941bcd4", "shasum": "" }, "require": { @@ -2264,12 +2286,12 @@ "require-dev": { "psr/container": "^1.0", "symfony/debug": "^2.7", - "symfony/phpunit-bridge": "^3.4.19|^4.1.8" + "symfony/phpunit-bridge": "^3.4.19|^4.1.8|^5.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.41-dev" + "dev-master": "1.42-dev" } }, "autoload": { diff --git a/config/global.config-default.inc.php b/config/global.config-default.inc.php index fa131a8aa..308058fba 100644 --- a/config/global.config-default.inc.php +++ b/config/global.config-default.inc.php @@ -126,6 +126,12 @@ define('FAS_UDF', true); // Legt fest ob Aufnahmegruppen bei Reihungstests verwaltet werden true|false define('FAS_REIHUNGSTEST_AUFNAHMEGRUPPEN',false); +// Legt fest, ob Vertragsdetails zum Lehrauftrag im Reiter LektorInnenzuteilung angezeigt werden +define('FAS_LV_LEKTORINNENZUTEILUNG_VERTRAGSDETAILS_ANZEIGEN', false); + +// Legt fest, ob Vertragsdetails zum Projektauftrag im Reiter Projektarbeit angezeigt werden +define('FAS_STUDIERENDE_PROJEKTARBEIT_VERTRAGSDETAILS_ANZEIGEN', false); + // Anzeigeoptionen für LV-Plan Menü define('CIS_LVPLAN_EXPORT_ANZEIGEN',true); define('CIS_LVPLAN_PERSONENAUSWAHL_ANZEIGEN',true); diff --git a/content/lvplanung/lehrveranstaltungDBDML.php b/content/lvplanung/lehrveranstaltungDBDML.php index a150a0262..2b3090221 100644 --- a/content/lvplanung/lehrveranstaltungDBDML.php +++ b/content/lvplanung/lehrveranstaltungDBDML.php @@ -17,7 +17,8 @@ * * Authors: Christian Paminger , * Andreas Oesterreicher and - * Rudolf Hangl . + * Rudolf Hangl + * Cristina Hainberger . */ // **************************************** @@ -31,6 +32,7 @@ // * - Lehreinheitmitarbeiter Zuteilung hinzufuegen/bearbeiten/loeschen // * - Lehreinheitgruppe Zutelung hinzufuegen/loeschen // * - Lehreinheit anlegen/bearbeiten/loeschen +// * - Lehrauftrag (Vertrag) loeschen (stornieren) // **************************************** require_once('../../config/vilesci.config.inc.php'); @@ -691,50 +693,58 @@ if(!$error) //Lehreinheitmitarbeiterzuteilung loeschen if(isset($_POST['lehreinheit_id']) && is_numeric($_POST['lehreinheit_id']) && isset($_POST['mitarbeiter_uid'])) { - //Wenn der Mitarbeiter im Stundenplan verplant ist, dann wird das Loeschen verhindert - $qry = "SELECT stundenplandev_id as id FROM lehre.tbl_stundenplandev WHERE lehreinheit_id=".$db->db_add_param($_POST['lehreinheit_id'], FHC_INTEGER)." AND mitarbeiter_uid=".$db->db_add_param($_POST['mitarbeiter_uid'])." - UNION - SELECT stundenplan_id as id FROM lehre.tbl_stundenplan WHERE lehreinheit_id=".$db->db_add_param($_POST['lehreinheit_id'], FHC_INTEGER)." AND mitarbeiter_uid=".$db->db_add_param($_POST['mitarbeiter_uid']); - if($db->db_query($qry)) + // Wenn der Mitarbeiter schon einen Vertrag hat, wird das Loeschen verhindert + if (isset($_POST['vertrag_id']) && is_numeric($_POST['vertrag_id'])) { - if($db->db_num_rows()>0) + $return = false; + $errormsg = 'Löschen nur nach Stornierung des Vertrags möglich.'; + } + else + { + //Wenn der Mitarbeiter im Stundenplan verplant ist, dann wird das Loeschen verhindert + $qry = "SELECT stundenplandev_id as id FROM lehre.tbl_stundenplandev WHERE lehreinheit_id=".$db->db_add_param($_POST['lehreinheit_id'], FHC_INTEGER)." AND mitarbeiter_uid=".$db->db_add_param($_POST['mitarbeiter_uid'])." + UNION + SELECT stundenplan_id as id FROM lehre.tbl_stundenplan WHERE lehreinheit_id=".$db->db_add_param($_POST['lehreinheit_id'], FHC_INTEGER)." AND mitarbeiter_uid=".$db->db_add_param($_POST['mitarbeiter_uid']); + if($db->db_query($qry)) { - $return = false; - $errormsg = 'Diese/r LektorIn kann nicht gelöscht werden da er schon verplant ist'; - } - else - { - $leg = new lehreinheitmitarbeiter(); - if($leg->load($_POST['lehreinheit_id'], $_POST['mitarbeiter_uid'])) + if($db->db_num_rows()>0) { - // Wenn ein Vertrag dazu angelegt ist, dann diesen mitloeschen - if($leg->vertrag_id!='') + $return = false; + $errormsg = 'Diese/r LektorIn kann nicht gelöscht werden da er schon verplant ist'; + } + else + { + $leg = new lehreinheitmitarbeiter(); + if($leg->load($_POST['lehreinheit_id'], $_POST['mitarbeiter_uid'])) { - $vertrag = new vertrag(); - $vertrag->delete($leg->vertrag_id); - } - - if($leg->delete($_POST['lehreinheit_id'], $_POST['mitarbeiter_uid'])) - { - $return = true; + // Wenn ein Vertrag dazu angelegt ist, dann diesen mitloeschen + if($leg->vertrag_id!='') + { + $vertrag = new vertrag(); + $vertrag->delete($leg->vertrag_id); + } + if($leg->delete($_POST['lehreinheit_id'], $_POST['mitarbeiter_uid'])) + { + $return = true; + } + else + { + $return = false; + $errormsg = $leg->errormsg; + } } else { $return = false; - $errormsg = $leg->errormsg; + $errormsg='Fehlgeschlagen:'.$leg->errormsg; } } - else - { - $return = false; - $errormsg='Fehlgeschlagen:'.$leg->errormsg; - } } - } - else - { - $return = false; - $errormsg = 'Fehler:'.$qry; + else + { + $return = false; + $errormsg = 'Fehler:'.$qry; + } } } else @@ -1715,6 +1725,102 @@ if(!$error) } } } + elseif(isset($_POST['type']) && $_POST['type']=='getLastVertragsstatus') + { + if(isset($_POST['vertrag_id'])) + { + $vertrag = new vertrag(); + if($vertrag->getAllStatus($_POST['vertrag_id'])) + { + $vertraege = $vertrag->result; + foreach($vertraege as $vertrag) + { + $data = $vertrag->vertragsstatus_kurzbz; + $return = true; + break; // exit loop because only last (most actual) vertrag item is needed + } + + } + else + { + $errormsg = 'Fehler beim Laden des Vertragsstatus'; + $return = false; + } + } + else + { + $errormsg = 'VertragsID muss uebergeben werden'; + $return = false; + } + } + elseif(isset($_POST['type']) && $_POST['type']=='cancelVertrag') + { + $error = false; + + // Check if user is entitled to cancel this contract + if (isset($_POST['vertrag_id']) && is_numeric($_POST['vertrag_id'])) + { + // * first find lehrveranstaltung_id of the contracts lehrveranstaltung + $vertrag = new vertrag(); + $vertrag->load($_POST['vertrag_id']); + $lva = new lehrveranstaltung($vertrag->lehrveranstaltung_id); + + // * then check if the user has permissions to cancel the corresponding lv-organisational units + if (!$rechte->isBerechtigtMultipleOe('admin', $lva->getAllOe(), 'suid') && + !$rechte->isBerechtigtMultipleOe('lehre/lehrauftrag_bestellen', $lva->getAllOe(), 'suid')) + { + $error = true; + $return = false; + $errormsg = 'Keine Berechtigung'; + } + } + + if (!$error) + { + if(isset($_POST['mitarbeiter_uid'])) + { + $vertrag = new vertrag(); + if($vertrag->cancel($_POST['vertrag_id'], $_POST['mitarbeiter_uid'])) + { + $return = true; + } + else + { + $errormsg = 'Fehler beim Ausführen des Vertragsstornos'; + $return = false; + } + } + elseif(isset($_POST['person_id'])) + { + $benutzer = new Benutzer(); + if($benutzer->getBenutzerFromPerson($_POST['person_id'])) + { + $mitarbeiter_uid = $benutzer->result[0]->uid; + + $vertrag = new vertrag(); + if($vertrag->cancel($_POST['vertrag_id'], $mitarbeiter_uid)) + { + $return = true; + } + else + { + $errormsg = 'Fehler beim Ausführen des Vertragsstornos'; + $return = false; + } + } + else + { + $errormsg = 'Benutzer konnte nicht von PersonID geladen werden'; + $return = false; + } + } + } + else + { + $errormsg = 'VertragsID und MitarbeiterUID müssen uebergeben werden'; + $return = false; + } + } else { $return = false; diff --git a/content/lvplanung/lehrveranstaltungdetailoverlay.xul.php b/content/lvplanung/lehrveranstaltungdetailoverlay.xul.php index de6c7cf17..57338add2 100644 --- a/content/lvplanung/lehrveranstaltungdetailoverlay.xul.php +++ b/content/lvplanung/lehrveranstaltungdetailoverlay.xul.php @@ -35,6 +35,9 @@ $rechte->getBerechtigungen($user); echo ''; +// Vertragsdetails: Anzeige wird über config Eintrag bestimmt +$is_hidden = (!defined('FAS_LV_LEKTORINNENZUTEILUNG_VERTRAGSDETAILS_ANZEIGEN') || FAS_LV_LEKTORINNENZUTEILUNG_VERTRAGSDETAILS_ANZEIGEN == true) ? 'false' : 'true'; + ?> '; - + isBerechtigt('lv-plan/lektorentfernen')) { @@ -429,10 +432,10 @@ echo ''; - + - + - - + + + +