diff --git a/application/config/anrechnung.php b/application/config/anrechnung.php index c2e38385c..768ec3197 100644 --- a/application/config/anrechnung.php +++ b/application/config/anrechnung.php @@ -6,10 +6,6 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); // Deadline for Application given as Time-Interval after Semesterstart. $config['interval_blocking_application'] = 'P1M'; -// Application submission period given by start- and enddate. -$config['submit_application_start'] = '05.09.2022'; -$config['submit_application_end'] = '22.09.2022'; - // Lehrveranstaltungen with these grades will be blocked for application $config['grades_blocking_application'] = array( 5, // nicht genügend @@ -19,4 +15,9 @@ $config['grades_blocking_application'] = array( 14, // nicht bestanden, 15, // nicht teilgenommen 18 // unentschuldigt -); \ No newline at end of file +); + +//Enables Fachbereichsleiter instead of LV Leiter +$config['fbl'] = FALSE; +//Enables Info Mails +$config['send_mail'] = TRUE; diff --git a/application/config/navigation.php b/application/config/navigation.php index 092c00cc5..56d142d08 100644 --- a/application/config/navigation.php +++ b/application/config/navigation.php @@ -164,7 +164,14 @@ $config['navigation_header'] = array( 'expand' => true, 'sort' => 20, 'requiredPermissions' => 'system/developer:r' - ) + ), + 'anrechnungen' => array( + 'link' => site_url('lehre/anrechnung/AdminAnrechnung'), + 'description' => 'Anrechnungen', + 'expand' => true, + 'sort' => 30, + 'requiredPermissions' => 'lehre/anrechnungszeitfenster:rw' + ) ) ) ) @@ -184,6 +191,15 @@ $config['navigation_menu']['Vilesci/index'] = array( ) ); +$config['navigation_menu']['Vilesci/index'] = array( + 'dashboard' => array( + 'link' => '#', + 'description' => 'Dashboard', + 'icon' => 'dashboard', + 'sort' => 1 + ) +); + $config['navigation_menu']['organisation/Reihungstest/index'] = array( 'reihungstestverwalung' => array( 'link' => base_url('vilesci/stammdaten/reihungstestverwaltung.php'), @@ -267,10 +283,18 @@ $config['navigation_menu']['system/issues/Issues/*'] = array( 'fehlerzustaendigkeiten' => array( 'link' => site_url('system/issues/IssuesZustaendigkeiten'), 'description' => 'Fehler Zuständigkeiten', - 'icon' => 'cogs', + 'icon' => 'users', 'sort' => 100, 'target' => '_blank', 'requiredPermissions' => array('admin:rw') - ) + ), + 'fehlerkonfiguration' => array( + 'link' => site_url('system/issues/IssuesKonfiguration'), + 'description' => 'Fehler Konfiguration', + 'icon' => 'cogs', + 'sort' => 200, + 'target' => '_blank', + 'requiredPermissions' => array('admin:rw') + ), ); diff --git a/application/config/studierendenantrag.php b/application/config/studierendenantrag.php new file mode 100644 index 000000000..3f28e5d50 --- /dev/null +++ b/application/config/studierendenantrag.php @@ -0,0 +1,169 @@ + null, 'dokument_kurzbz' => null, 'kategorie_kurzbz' => null]; +$config['unterbrechung_dms'] = ['oe_kurzbz' => null, 'dokument_kurzbz' => null, 'kategorie_kurzbz' => 'Akte']; + +/** + * UPLOAD + */ + +/** + * Allowed filetypes for attachment upload in unterbrechung antrag + * + * @var array An array of fileextensions + */ +$config['unterbrechung_dms_filetypes'] = ['jpg', 'pdf']; + + +/** + * GRADES + */ + +/** + * On wiederholung the student must repeat certain lvs. + * This lvs will be graded with this id + * + * @var integer tbl_note.note + */ +$config['wiederholung_note_angerechnet'] = 19; + +/** + * On wiederholung the student can not attend certain lvs. + * Those lvs will be graded with this id + * + * @var integer tbl_note.note + */ +$config['wiederholung_note_nicht_zugelassen'] = 20; + + +/** + * JOBS + */ + +/** + * The Job will remind for every Unterbrecher who has a + * wiedereinstieg_datum between the date the Job is run + * and the modified date + * e.g.: If the Job is running on 2023-04-20 and the modifier + * is '+3 days' it will remind of everyone that + * has a wiedereinstiegs_datum between 2023-04-20 and 2023-04-23 + * + * @var string A string formated as PHP DateTime modifier + * @see https://www.php.net/manual/de/datetime.modify.php + */ +$config['unterbrechung_job_remind_wiedereinstieg_date_modifier'] = '+3 days'; + +/** + * The Job will sent a request to everyone who faild the 3rd committee exam + * and respecting the given conditions (not repeated yet, stg not in blacklist) + * to decide if he/she will repeat or not + * + * First request + * + * @var string A string formated as PHP DateTime modifier + * @see https://www.php.net/manual/de/datetime.modify.php + */ +$config['wiederholung_job_request_1_date_modifier'] = '+0 days'; + +/** + * Second request + * + * @var string A string formated as PHP DateTime modifier + * @see https://www.php.net/manual/de/datetime.modify.php + */ +$config['wiederholung_job_request_2_date_modifier'] = '+3 weeks'; + +/** + * Final deadline - after this the student will be abgemeldet if he hasn't chosen yet + * + * @var string A string formated as PHP DateTime modifier + * @see https://www.php.net/manual/de/datetime.modify.php + */ +$config['wiederholung_job_deadline_date_modifier'] = '+1 month'; + +/** + * before this exam dates for Wiederholer will be ignored + * + * @var string A string formated as Date + * + */ +$config['digitalization_start'] = '2022-07-01'; + + + + +/** + * Objection period - the student will be abgemeldet if he hasn't objected in this period + * + * @var string A string formated as PHP DateTime modifier + * @see https://www.php.net/manual/de/datetime.modify.php + */ +$config['abmeldung_job_deadline_date_modifier'] = '+2 weeks'; + + + +/** + * System User - uid of a user that is allowed to set prestudentstatus + * + * @var string + */ +$config['antrag_job_systemuser'] = ''; + + +/** + * WHITELISTS + */ + +/** + * List of stati who entitle a prestudent to create an Antrag + * + * @var array Array of tbl_status.status_kurzbz's + */ +$config['antrag_prestudentstatus_whitelist'] = ['Student', 'Diplomand']; + + +/** + * BLACKLISTS + */ + +/** + * List of Statusgründe that prevent a prestudent from create an Wiederholungsantrag + * + * @var array An array of tbl_status_grund.statusgrund_id's + */ +$config['status_gruende_wiederholer'] = [16, 15]; + +/** + * Blacklisted for abmeldung anträge + * + * @var array An array of tbl_studiengang.studiengang_kz's + */ +$config['stgkz_blacklist_abmeldung'] = []; + +/** + * Blacklisted for unterbrechung anträge + * + * @var array An array of tbl_studiengang.studiengang_kz's + */ +$config['stgkz_blacklist_unterbrechung'] = []; + +/** + * Blacklisted for wiederholung anträge + * + * @var array An array of tbl_studiengang.studiengang_kz's + */ +$config['stgkz_blacklist_wiederholung'] = []; + +/** + * Blacklisted noten for negative committee exams + * noten with this ids won't be seen as negative + * + * @var array An array of noten ids + */ +$config['note_blacklist_wiederholung'] = []; diff --git a/application/controllers/codex/UHSTAT1.php b/application/controllers/codex/UHSTAT1.php new file mode 100644 index 000000000..4486f9d74 --- /dev/null +++ b/application/controllers/codex/UHSTAT1.php @@ -0,0 +1,438 @@ +load->library('form_validation'); + + // load ci helpers + $this->load->helper(array('form', 'url')); + + // load libraries + $this->load->library('AuthLib'); + $this->load->library('PermissionLib'); + + // load models + $this->load->model('codex/Oehbeitrag_model', 'OehbeitragModel'); + $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + $this->load->model('system/Sprache_model', 'SpracheModel'); + $this->load->model('codex/Abschluss_model', 'AbschlussModel'); + $this->load->model('codex/Uhstat1daten_model', 'Uhstat1datenModel'); + + $this->loadPhrases( + array( + 'ui', + 'uhstat' + ) + ); + + $this->_uid = getAuthUID(); + + // set form field information + $this->_uhstat1Fields = array( + 'mutter_geburtsstaat' => array('name' => 'Geburtsstaat Mutter'), + 'mutter_geburtsjahr' => array('name' => 'Geburtsjahr Mutter'), + 'mutter_bildungsstaat' => array('name' => 'Bildungsstaat Mutter'), + 'mutter_bildungmax' => array( + 'name' => 'Geburtsjahr Mutter', + 'rules' => array( + 'callback_bildungsstaat_bildungmax_check[m]' => array( + 'bildungsstaat_bildungmax_check' => $this->p->t('uhstat', 'ausbildungBildungsstaatUebereinstimmung') + ) + ) + ), + 'vater_geburtsstaat' => array('name' => 'Geburtsstaat Vater'), + 'vater_geburtsjahr' => array('name' => 'Geburtsjahr Vater'), + 'vater_bildungsstaat' => array('name' => 'Bildungsstaat Vater'), + 'vater_bildungmax' => array('name' => 'Geburtsjahr Vater'), + 'vater_bildungmax' => array( + 'name' => 'Geburtsjahr Vater', + 'rules' => array( + 'callback_bildungsstaat_bildungmax_check[v]' => array( + 'bildungsstaat_bildungmax_check' => $this->p->t('uhstat', 'ausbildungBildungsstaatUebereinstimmung') + ) + ) + ) + ); + } + + // ----------------------------------------------------------------------------------------------------------------- + // Public methods + + public function index() + { + $formMetaData = $this->_getFormMetaData(); + + if (isError($formMetaData)) show_error(getError($formMetaData)); + + if (!hasData($formMetaData)) show_error("No form meta data could be loaded"); + + $uhstatData = $this->_getUHSTAT1Data(); + + if (isError($uhstatData)) show_error(getError($uhstatData)); + + $this->load->view("codex/uhstat1.php", array( + 'formMetaData' => getData($formMetaData), + 'uhstatData' => getData($uhstatData) + ) + ); + } + + /** + * Add or update UHSTAT1 data + */ + public function saveUHSTAT1Data() + { + $saved = false; + + $person_id = $this->_getValidPersonId('sui'); + + $this->form_validation->set_error_delimiters('', ''); + + foreach ($this->_uhstat1Fields as $field => $params) + { + // all fields are required + $ruleNames = 'required'; + $ruleMessages = array('required' => $this->p->t('uhstat', 'angabeFehlt')); + + // add additional rules + if (isset($params['rules'])) + { + foreach ($params['rules'] as $ruleName => $ruleMessage) + { + $ruleNames .= '|'.$ruleName; + $ruleMessages = array_merge($ruleMessages, $ruleMessage); + } + } + + $this->form_validation->set_rules( + $field, + $params['name'], + $ruleNames, + $ruleMessages + ); + } + + $uhstat1datenRes = null; + if ($this->form_validation->run()) // if valid + { + // get post fields + $uhstatData = array(); + foreach ($this->_uhstat1Fields as $field => $params) + { + $uhstatData[$field] = $this->input->post($field); + } + + // check if entry already exists + $uhstat1datenloadRes = $this->Uhstat1datenModel->loadWhere(array('person_id' => $person_id)); + + // if yes, update + if (hasData($uhstat1datenloadRes)) + { + $uhstatData['updateamum'] = 'NOW()'; + $uhstatData['updatevon'] = $this->_uid; + $uhstat1datenRes = $this->Uhstat1datenModel->update( + array('person_id' => $person_id), + $uhstatData + ); + } + else // otherwise insert + { + $uhstatData['insertamum'] = 'NOW()'; + $uhstatData['insertvon'] = $this->_uid; + $uhstat1datenRes = $this->Uhstat1datenModel->insert( + array_merge($uhstatData, array('person_id' => $person_id)) + ); + } + } + + $formMetaData = $this->_getFormMetaData(); + + if (isError($formMetaData)) show_error(getError($formMetaData)); + + if (!hasData($formMetaData)) show_error("No form meta data could be loaded"); + + $successMessage = ''; + $errorMessage = ''; + // pass success/error messages to view + if (isset($uhstat1datenRes)) + { + if (isSuccess($uhstat1datenRes)) + { + $successMessage = $this->p->t('uhstat', 'erfolgreichGespeichert'); + $saved = true; + } + else + $errorMessage = $this->p->t('uhstat', 'fehlerBeimSpeichern'); + } + + // load view with form data + $this->load->view("codex/uhstat1.php", array( + 'formMetaData' => getData($formMetaData), + 'saved' => $saved, + 'successMessage' => $successMessage, + 'errorMessage' => $errorMessage + ) + ); + } + + /** + * Check callback for Bildungsstaat - if Bildungsstaat is Austria, a highest education should be in Austria. + * @param $bildungmax + * @param $bildungsstaat_typ - mother (m) or father (v) + * @return bool true if valid, false otherwise + */ + public function bildungsstaat_bildungmax_check($bildungmax, $bildungsstaat_typ) + { + // valid if no type passed + if (!isset($bildungsstaat_typ) || !isset($bildungmax)) return true; + + // get correct input + if ($bildungsstaat_typ == 'm') // mutter + $bildungsstaat = $this->input->post('mutter_bildungsstaat'); + elseif ($bildungsstaat_typ == 'v') // vater + $bildungsstaat = $this->input->post('vater_bildungsstaat'); + else + return true; + + if (!isset($bildungsstaat)) return true; + + // find out if abschluss is in Austria + $this->AbschlussModel->addSelect("in_oesterreich"); + $abschlussRes = $this->AbschlussModel->load($bildungmax); + + if (hasData($abschlussRes)) + { + $in_oesterreich = getData($abschlussRes)[0]->in_oesterreich; + // invalid if abschluss in Austria, but not Bildungsstaat, or abschluss not in Austria, but Bildungsstaat in Austria + return ($in_oesterreich && $bildungsstaat == self::CODEX_OESTERREICH) || (!$in_oesterreich && $bildungsstaat != self::CODEX_OESTERREICH); + } + + return false; + } + + /** + * Deletes UHSTAT1 entry. + */ + public function deleteUHSTAT1Data() + { + $saved = false; + + // uhstat data can only be deleted with permission + if (!$this->_checkPermission('suid')) show_error('no permission'); + + $person_id = $this->_getValidPersonId('suid'); + + $uhstat1datenRes = $this->Uhstat1datenModel->delete( + array('person_id' => $person_id) + ); + + $formMetaData = $this->_getFormMetaData(); + + if (isError($formMetaData)) show_error(getError($formMetaData)); + + if (!hasData($formMetaData)) show_error("No form meta data could be loaded"); + + $successMessage = ''; + $errorMessage = ''; + // pass success/error messages to view + if (isset($uhstat1datenRes)) + { + if (isSuccess($uhstat1datenRes)) + { + $successMessage = $this->p->t('uhstat', 'erfolgreichGeloescht'); + } + else + $errorMessage = $this->p->t('uhstat', 'fehlerBeimLoeschen'); + } + + // load view with form data + $this->load->view("codex/uhstat1.php", array( + 'formMetaData' => getData($formMetaData), + 'successMessage' => $successMessage, + 'errorMessage' => $errorMessage + ) + ); + } + + // ----------------------------------------------------------------------------------------------------------------- + // Private methods + + /** + * Gets initial data needed to display UHSTAT1 form. + */ + private function _getFormMetaData() + { + $person_id = $this->_getValidPersonId('s'); + + // read only display param + $readOnly = $this->input->get('readOnly'); + + // depending on permissions, editing or deleting is possible + $editPermission = $this->_checkPermission('sui'); + $deletePermission = $this->_checkPermission('suid'); + + $languageIdx = $this->_getLanguageIndex(); + + $formMetaData = array( + 'nation' => array(), + 'abschluss_oesterreich' => array(), + 'abschluss_nicht_oesterreich' => array(), + 'jahre' => array(), + 'person_id' => $person_id, + 'editPermission' => $editPermission, + 'deletePermission' => $deletePermission, + 'readOnly' => $readOnly + ); + + // get person data + $this->load->model('person/Person_model', 'PersonModel'); + $this->PersonModel->addSelect("vorname, nachname"); + $personRes = $this->PersonModel->load($person_id); + + if (isError($personRes)) return $personRes; + + if (hasData($personRes)) + { + $person = getData($personRes)[0]; + $formMetaData['vorname'] = $person->vorname; + $formMetaData['nachname'] = $person->nachname; + } + + $nationTextFieldName = $languageIdx == 1 ? 'langtext' : 'engltext'; + + // get nation list + $this->load->model('codex/Nation_model', 'NationModel'); + + $this->NationModel->addSelect("nation_code, $nationTextFieldName AS nation_text"); + $this->NationModel->addOrder("nation_text"); + $nationRes = $this->NationModel->loadWhere('sperre IS NULL OR sperre = FALSE'); + + if (isError($nationRes)) return $nationRes; + + if (hasData($nationRes)) + { + $nations = getData($nationRes); + + // put austria in beginning of selection + foreach ($nations as $nation) + { + if ($nation->nation_code == self::CODEX_OESTERREICH) array_unshift($nations, $nation); + } + + $formMetaData['nation'] = $nations; + } + + // get abschluss list + $abschlussRes = $this->AbschlussModel->getActiveAbschluesse($languageIdx); + + if (isError($abschlussRes)) return $abschlussRes; + + $abschlussData = getData($abschlussRes); + + if (hasData($abschlussRes)) + { + foreach (getData($abschlussRes) as $abschluss) + { + if ($abschluss->in_oesterreich === true) + $formMetaData['abschluss_oesterreich'][] = $abschluss; + elseif ($abschluss->in_oesterreich === false) + $formMetaData['abschluss_nicht_oesterreich'][] = $abschluss; + else + { + $formMetaData['abschluss_oesterreich'][] = $abschluss; + $formMetaData['abschluss_nicht_oesterreich'][] = $abschluss; + } + } + } + + // get realistic birth years, dated back from current year + $currYear = date("Y"); + $formMetaData['jahre'] = range($currYear - self::UPPER_BOUNDARY_YEARS, $currYear - self::LOWER_BOUNDARY_YEARS); + + return success($formMetaData); + } + + /** + * Gets initial data needed to display UHSTAT1 form. + */ + private function _getUHSTAT1Data() + { + $person_id = $this->_getValidPersonId('s'); + + $this->Uhstat1datenModel->addSelect( + implode(', ', array_keys($this->_uhstat1Fields)) + ); + $uhstatRes = $this->Uhstat1datenModel->loadWhere(array('person_id' => $person_id)); + + if (isError($uhstatRes)) return $uhstatRes; + + return success(hasData($uhstatRes) ? getData($uhstatRes)[0] : null); + } + + /** + * Gets language index of currently logged in user. + * @return int (the index, start at 1) + */ + private function _getLanguageIndex() + { + $idx = 1; + $this->SpracheModel->addSelect('index'); + $langRes = $this->SpracheModel->loadWhere(array('sprache' => getUserLanguage())); + + if (hasData($langRes)) + { + $idx = getData($langRes)[0]->index; + } + + return $idx; + } + + /** + * Gets Id of person having permissions to manage UHSTAT1 data. + * Can be passed as parameter or be in session. + * @return int person_id + */ + private function _getValidPersonId($berechtigungsArt) + { + // if coming from bewerbungstool - person id is in session (person must be logged in bewerbungstool) + if (isset($_SESSION[self::PERSON_ID_SESSION_INDEX]) && is_numeric($_SESSION[self::PERSON_ID_SESSION_INDEX])) + return $_SESSION[self::PERSON_ID_SESSION_INDEX]; + + // if person id passed directly... + $person_id = $this->input->post('person_id'); + if (!isset($person_id)) $person_id = $this->input->get('person_id'); + + if (!isset($person_id) || !is_numeric($person_id)) show_error("invalid person id"); + + // ...check if there is a permission for editing UHSTAT1 data + if ($this->_checkPermission($berechtigungsArt)) return $person_id; + + show_error("No permission"); + } + + /** + * Checks if logged user has the UHSTAT management permission. + * @param $art - type of permission, e.g. suid for full permissions + * @return bool + */ + private function _checkPermission($art) + { + return $this->permissionlib->isBerechtigt(self::BERECHTIGUNG_UHSTAT_VERWALTEN, $art); + } +} diff --git a/application/controllers/components/Antrag/Abmeldung.php b/application/controllers/components/Antrag/Abmeldung.php new file mode 100644 index 000000000..f30de6803 --- /dev/null +++ b/application/controllers/components/Antrag/Abmeldung.php @@ -0,0 +1,218 @@ +load->library('AuthLib'); + $this->load->library('AntragLib'); + + // Load language phrases + $this->loadPhrases([ + 'studierendenantrag' + ]); + } + + //------------------------------------------------------------------------------------------------------------------ + // Public methods + + /** + * Retrieves data of the current studiengang for the current user + */ + + public function getDetailsForNewAntrag($prestudent_id) + { + if (!$this->antraglib->isEntitledToCreateAntragFor($prestudent_id, true)) { + $this->output->set_status_header(403); + return $this->outputJsonError('Forbidden'); + } + $result = $this->antraglib->getPrestudentAbmeldeBerechtigt($prestudent_id); + if (isError($result)) { + $this->output->set_status_header(500); + return $this->outputJsonError(getError($result)); + } + $result = $result->retval; + if (!$result) { + $this->output->set_status_header(403); + return $this->outputJsonError($this->p->t('studierendenantrag', 'error_no_student')); + } + elseif ($result == -3) + { + $this->output->set_status_header(403); + return $this->outputJsonError($this->p->t('studierendenantrag', 'error_stg_blacklist')); + } + elseif ($result == -1) + { + $result = $this->antraglib->getDetailsForLastAntrag( + $prestudent_id, + [ + Studierendenantrag_model::TYP_ABMELDUNG, + Studierendenantrag_model::TYP_ABMELDUNG_STGL + ] + ); + if (isError($result)) { + return $this->outputJsonError(getError($result)); + } + + $data = getData($result); + + $data->canCancel = ( + $data->status == Studierendenantragstatus_model::STATUS_CREATED && + $this->antraglib->isEntitledToCancelAntrag($data->studierendenantrag_id) + ); + + return $this->outputJsonSuccess($data); + } + + $result = $this->antraglib->getDetailsForNewAntrag($prestudent_id); + if (isError($result)) { + return $this->outputJsonError(getError($result)); + } + + $this->outputJsonSuccess(getData($result)); + } + + public function getDetailsForAntrag($studierendenantrag_id) + { + if (!$this->antraglib->isEntitledToShowAntrag($studierendenantrag_id)) return show_404(); + + $result = $this->antraglib->getDetailsForAntrag($studierendenantrag_id); + if (isError($result)) { + return $this->outputJsonError(getError($result)); + } + + $data = getData($result); + + if ($data->typ !== Studierendenantrag_model::TYP_ABMELDUNG_STGL && $data->typ !== Studierendenantrag_model::TYP_ABMELDUNG) + return show_404(); + + $data->canCancel = ( + $data->status == Studierendenantragstatus_model::STATUS_CREATED && + $this->antraglib->isEntitledToCancelAntrag($data->studierendenantrag_id) + ); + + $this->outputJsonSuccess($data); + } + + public function createAntrag() + { + $this->load->library('form_validation'); + + $_POST = json_decode($this->input->raw_input_stream, true); + + $this->form_validation->set_rules('studiensemester', 'Studiensemester', 'required'); + $this->form_validation->set_rules('prestudent_id', 'Prestudent ID', 'required'); + $this->form_validation->set_rules('grund', 'Grund', 'required'); + + if ($this->form_validation->run() == false) + { + return $this->outputJsonError($this->form_validation->error_array()); + } + + $grund = $this->input->post('grund'); + $studiensemester = $this->input->post('studiensemester'); + $prestudent_id = $this->input->post('prestudent_id'); + + $result = $this->antraglib->getPrestudentAbmeldeBerechtigt($prestudent_id); + if (isError($result)) { + return $this->outputJsonError(['db' => getError($result)]); + } + $result = $result->retval; + if (!$result) + { + return $this->outputJsonError(['db' => $this->p->t('studierendenantrag', 'error_no_student')]); + } + elseif ($result == -3) + { + return $this->outputJsonError(['db' => $this->p->t('studierendenantrag', 'error_stg_blacklist')]); + } + elseif ($result < 0) + { + return $this->outputJsonError(['db' => $this->p->t('studierendenantrag', 'error_antrag_exists')]); + } + + $result = $this->antraglib->createAbmeldung($prestudent_id, $studiensemester, getAuthUID(), $grund); + if (isError($result)) + { + return $this->outputJsonError(['db' => getError($result)]); + } + + $result = $this->antraglib->getDetailsForAntrag(getData($result)); + if (!hasData($result)) + return $this->outputJsonSuccess(true); + + $data = getData($result); + $data->canCancel = (boolean)$this->antraglib->isEntitledToCancelAntrag($data->studierendenantrag_id); + + $this->outputJsonSuccess($data); + } + + public function cancelAntrag() + { + $this->load->library('form_validation'); + + $_POST = json_decode($this->input->raw_input_stream, true); + + $this->form_validation->set_rules('antrag_id', 'Antrag ID', 'required'); + + if ($this->form_validation->run() == false) + { + return $this->outputJsonError($this->form_validation->error_array()); + } + + $antrag_id = $this->input->post('antrag_id'); + if(!$this->antraglib->isEntitledToCancelAntrag($antrag_id)) + { + $this->output->set_status_header(403); + + return $this->outputJsonError('Forbidden'); + } + + $result = $this->antraglib->cancelAntrag($antrag_id, getAuthUID()); + if(isError($result)) + { + return $this->outputJsonError(['db' => getError($result)]); + } + + $result = $this->antraglib->getDetailsForAntrag($antrag_id); + + if (!hasData($result)) + return $this->outputJsonSuccess($antrag_id); + $this->outputJsonSuccess(getData($result)); + } + + public function getStudiengaengeAssistenz() + { + $this->load->library('PermissionLib'); + + $_POST = json_decode($this->input->raw_input_stream, true); + $query = $this->input->post('query'); + + $studiengaenge = $this->permissionlib->getSTG_isEntitledFor('student/studierendenantrag'); + + $result = $this->antraglib->getAktivePrestudentenInStgs($studiengaenge, $query); + if (isError($result)) { + return $this->outputJsonError(getError($result)); + } + $result = getData($result); + if (!$result) { + return $this->outputJsonSuccess([]); + } + + return $this->outputJsonSuccess($result); + } +} diff --git a/application/controllers/components/Antrag/Leitung.php b/application/controllers/components/Antrag/Leitung.php new file mode 100644 index 000000000..f6b184351 --- /dev/null +++ b/application/controllers/components/Antrag/Leitung.php @@ -0,0 +1,413 @@ +load->library('AuthLib'); + $this->load->library('AntragLib'); + + // Load language phrases + $this->loadPhrases([ + 'studierendenantrag' + ]); + } + + + //------------------------------------------------------------------------------------------------------------------ + // Public methods + + public function getActiveStgs() + { + $studiengaenge = $this->permissionlib->getSTG_isEntitledFor('student/antragfreigabe'); + $stgsNeuanlage = $this->permissionlib->getSTG_isEntitledFor('student/studierendenantrag'); + + $stgs = []; + + if ($studiengaenge) { + $result = $this->StudierendenantragModel->loadForStudiengaenge($studiengaenge); + + if (isError($result)) + return $this->outputJson($result); + $antraege = getData($result) ?: []; + + foreach ($antraege as $antrag) { + if (!isset($stgs[$antrag->studiengang_kz])) { + $stgs[$antrag->studiengang_kz] = new stdClass(); + $stgs[$antrag->studiengang_kz]->bezeichnung = $antrag->bezeichnung; + $stgs[$antrag->studiengang_kz]->orgform = $antrag->orgform; + $stgs[$antrag->studiengang_kz]->studiengang_kz = $antrag->studiengang_kz; + } + } + } + + if ($stgsNeuanlage) { + $result = $this->StudierendenantragModel->loadForStudiengaenge($stgsNeuanlage); + + if (isError($result)) + return $this->outputJson($result); + $antraege = getData($result) ?: []; + + foreach ($antraege as $antrag) { + if (!isset($stgs[$antrag->studiengang_kz])) { + $stgs[$antrag->studiengang_kz] = new stdClass(); + $stgs[$antrag->studiengang_kz]->bezeichnung = $antrag->bezeichnung; + $stgs[$antrag->studiengang_kz]->orgform = $antrag->orgform; + $stgs[$antrag->studiengang_kz]->studiengang_kz = $antrag->studiengang_kz; + } + } + } + + $this->outputJsonSuccess($stgs); + } + + public function getAntraege($studiengang = null) + { + + if($studiengang) + $studiengaenge = [$studiengang]; + else { + $studiengaenge =$this->permissionlib->getSTG_isEntitledFor('student/antragfreigabe'); + if(!is_array($studiengaenge)) + $studiengaenge = []; + + + $stgsNeuanlage = $this->permissionlib->getSTG_isEntitledFor('student/studierendenantrag'); + if(!is_array($stgsNeuanlage)) + $stgsNeuanlage = []; + + $studiengaenge = array_unique(array_merge($studiengaenge, $stgsNeuanlage)); + } + + + $antraege = []; + if ($studiengaenge) { + $result = $this->StudierendenantragModel->loadForStudiengaenge($studiengaenge); + if (isError($result)) { + $this->output->set_status_header(500); + return $this->outputJson('Internal Server Error'); + } + if(hasData($result)) + { + $antraege = getData($result); + } + } + + $this->outputJson($antraege); + } + + public function reopenAntrag() + { + $this->load->library('form_validation'); + + $_POST = json_decode($this->input->raw_input_stream, true); + + $this->form_validation->set_rules( + 'studierendenantrag_id', + 'Studierenden Antrag', + 'required|callback_isEntitledToReopenAntrag', + [ + 'isEntitledToReopenAntrag' => $this->p->t('studierendenantrag', 'error_no_right') + ] + ); + + if ($this->form_validation->run() == false) + { + return $this->outputJsonError($this->form_validation->error_array()); + } + + $studierendenantrag_id = $this->input->post('studierendenantrag_id'); + + $result = $this->antraglib->reopenWiederholung($studierendenantrag_id, getAuthUID()); + + if (isError($result)) + return $this->outputJsonError(['studierendenantrag_id' => getError($result)]); + + $this->outputJsonSuccess($studierendenantrag_id); + } + + public function objectAntrag() + { + $this->load->library('form_validation'); + + $_POST = json_decode($this->input->raw_input_stream, true); + + $this->form_validation->set_rules( + 'studierendenantrag_id', + 'Studierenden Antrag', + 'required|callback_isEntitledToObjectAntrag|callback_canBeObjected', + [ + 'isEntitledToObjectAntrag' => $this->p->t('studierendenantrag', 'error_no_right'), + 'canBeObjected' => $this->p->t('studierendenantrag', 'error_no_objection') + ] + ); + + if ($this->form_validation->run() == false) + { + return $this->outputJsonError($this->form_validation->error_array()); + } + + $studierendenantrag_id = $this->input->post('studierendenantrag_id'); + + $result = $this->antraglib->objectAbmeldung($studierendenantrag_id, getAuthUID()); + + if (isError($result)) + return $this->outputJsonError(['studierendenantrag_id' => getError($result)]); + + $this->outputJsonSuccess($studierendenantrag_id); + } + + public function objectionDeny() + { + $this->load->library('form_validation'); + + $_POST = json_decode($this->input->raw_input_stream, true); + + $this->form_validation->set_rules( + 'studierendenantrag_id', + 'Studierenden Antrag', + 'required|callback_isEntitledToObjectAntrag|callback_isObjected', + [ + 'isEntitledToObjectAntrag' => $this->p->t('studierendenantrag', 'error_no_right'), + 'isObjected' => $this->p->t('studierendenantrag', 'error_not_objected') + ] + ); + + if ($this->form_validation->run() == false) + { + return $this->outputJsonError($this->form_validation->error_array()); + } + + $studierendenantrag_id = $this->input->post('studierendenantrag_id'); + $grund = $this->input->post('grund'); + + $result = $this->antraglib->denyObjectionAbmeldung($studierendenantrag_id, getAuthUID(), $grund); + + if (isError($result)) + return $this->outputJsonError(['studierendenantrag_id' => getError($result)]); + + $this->outputJsonSuccess($studierendenantrag_id); + } + + public function objectionApprove() + { + $this->load->library('form_validation'); + + $_POST = json_decode($this->input->raw_input_stream, true); + + $this->form_validation->set_rules( + 'studierendenantrag_id', + 'Studierenden Antrag', + 'required|callback_isEntitledToObjectAntrag|callback_isObjected', + [ + 'isEntitledToObjectAntrag' => $this->p->t('studierendenantrag', 'error_no_right'), + 'isObjected' => $this->p->t('studierendenantrag', 'error_not_objected') + ] + ); + + if ($this->form_validation->run() == false) + { + return $this->outputJsonError($this->form_validation->error_array()); + } + + $studierendenantrag_id = $this->input->post('studierendenantrag_id'); + + $result = $this->antraglib->cancelAntrag($studierendenantrag_id, getAuthUID()); + + if (isError($result)) + return $this->outputJsonError(['studierendenantrag_id' => getError($result)]); + + $this->outputJsonSuccess($studierendenantrag_id); + } + + public function isEntitledToReopenAntrag($studierendenantrag_id) + { + return $this->antraglib->isEntitledToReopenAntrag($studierendenantrag_id); + } + + public function isEntitledToObjectAntrag($studierendenantrag_id) + { + return $this->antraglib->isEntitledToObjectAntrag($studierendenantrag_id); + } + + public function isEntitledToRejectAntrag($studierendenantrag_id) + { + return $this->antraglib->isEntitledToRejectAntrag($studierendenantrag_id); + } + + public function canBeObjected($studierendenantrag_id) + { + return $this->antraglib->hasType($studierendenantrag_id, Studierendenantrag_model::TYP_ABMELDUNG_STGL); + } + + public function isObjected($studierendenantrag_id) + { + return $this->antraglib->hasStatus($studierendenantrag_id, Studierendenantragstatus_model::STATUS_OBJECTED); + } + + + public function approveAbmeldung() + { + $this->load->library('form_validation'); + + $_POST = json_decode($this->input->raw_input_stream, true); + + $this->form_validation->set_rules( + 'studierendenantrag_id', + 'Studierenden Antrag', + 'required|callback_isEntitledToApproveAntrag', + [ + 'isEntitledToApproveAntrag' => $this->p->t('studierendenantrag', 'error_no_right') + ] + ); + + if ($this->form_validation->run() == false) + { + return $this->outputJsonError($this->form_validation->error_array()); + } + + $studierendenantrag_id = $this->input->post('studierendenantrag_id'); + + $result = $this->antraglib->approveAbmeldung([$studierendenantrag_id], getAuthUID()); + if (isError($result)) + { + return $this->outputJsonError(['db' => getError($result)]); + } + + return $this->outputJsonSuccess($studierendenantrag_id); + } + + public function approveAbmeldungStgl() + { + return $this->approveAbmeldung(); + } + + public function approveUnterbrechung() + { + $this->load->library('form_validation'); + + $_POST = json_decode($this->input->raw_input_stream, true); + + $this->form_validation->set_rules( + 'studierendenantrag_id', + 'Studierenden Antrag', + 'required|callback_isEntitledToApproveAntrag', + [ + 'isEntitledToApproveAntrag' => $this->p->t('studierendenantrag', 'error_no_right') + ] + ); + + if ($this->form_validation->run() == false) + { + return $this->outputJsonError($this->form_validation->error_array()); + } + + $studierendenantrag_id = $this->input->post('studierendenantrag_id'); + + $result = $this->antraglib->approveUnterbrechung([$studierendenantrag_id], getAuthUID()); + if (isError($result)) + { + return $this->outputJsonError(['db' => getError($result)]); + } + + return $this->outputJsonSuccess($studierendenantrag_id); + } + + public function rejectUnterbrechung() + { + $this->load->library('form_validation'); + + $_POST = json_decode($this->input->raw_input_stream, true); + + $this->form_validation->set_rules( + 'studierendenantrag_id', + 'Studierenden Antrag', + 'required|callback_isEntitledToRejectAntrag', + [ + 'isEntitledToRejectAntrag' => $this->p->t('studierendenantrag', 'error_no_right') + ] + ); + $this->form_validation->set_rules('grund', 'Grund', 'required'); + + if ($this->form_validation->run() == false) + { + return $this->outputJsonError($this->form_validation->error_array()); + } + + $studierendenantrag_id = $this->input->post('studierendenantrag_id'); + $grund = $this->input->post('grund'); + + $result = $this->antraglib->rejectUnterbrechung([$studierendenantrag_id], getAuthUID(), $grund); + if (isError($result)) + { + return $this->outputJsonError(['db' => getError($result)]); + } + + return $this->outputJsonSuccess($studierendenantrag_id); + } + + public function approveWiederholung() + { + $this->load->library('form_validation'); + + $_POST = json_decode($this->input->raw_input_stream, true); + + $this->form_validation->set_rules( + 'studierendenantrag_id', + 'Studierenden Antrag', + 'required|callback_isEntitledToApproveAntrag', + [ + 'isEntitledToApproveAntrag' => $this->p->t('studierendenantrag', 'error_no_right') + ] + ); + + if ($this->form_validation->run() == false) + { + return $this->outputJsonError($this->form_validation->error_array()); + } + + $studierendenantrag_id = $this->input->post('studierendenantrag_id'); + + $result = $this->antraglib->approveWiederholung($studierendenantrag_id, getAuthUID()); + if (isError($result)) + { + return $this->outputJsonError(['db' => getError($result)]); + } + + return $this->outputJsonSuccess($studierendenantrag_id); + } + + public function isEntitledToApproveAntrag($studierendenantrag_id) + { + return $this->antraglib->isEntitledToApproveAntrag($studierendenantrag_id); + } + + public function getHistory($studierendenantrag_id) + { + if (!$this->antraglib->isEntitledToSeeHistoryForAntrag($studierendenantrag_id)) { + $this->output->set_status_header(403); + return $this->outputJson('Forbidden'); + } + + $result = $this->antraglib->getAntragHistory($studierendenantrag_id); + if (isError($result)) { + return $this->outputJsonError(getError($result)); + } + + $this->outputJsonSuccess(getData($result) ?: []); + } +} diff --git a/application/controllers/components/Antrag/Unterbrechung.php b/application/controllers/components/Antrag/Unterbrechung.php new file mode 100644 index 000000000..33bd0035d --- /dev/null +++ b/application/controllers/components/Antrag/Unterbrechung.php @@ -0,0 +1,233 @@ +load->config('studierendenantrag'); + + // Libraries + $this->load->library('AuthLib'); + $this->load->library('AntragLib'); + + // Load language phrases + $this->loadPhrases([ + 'studierendenantrag', + 'ui' + ]); + } + + + //------------------------------------------------------------------------------------------------------------------ + // Public methods + + public function getDetailsForNewAntrag($prestudent_id) + { + if (!$this->antraglib->isEntitledToCreateAntragFor($prestudent_id, false)) { + $this->output->set_status_header(403); + return $this->outputJsonError('Forbidden'); + } + $result = $this->antraglib->getPrestudentUnterbrechungsBerechtigt($prestudent_id); + if (isError($result)) { + $this->output->set_status_header(500); + return $this->outputJsonError(getError($result)); + } + $result = $result->retval; + if (!$result) { + $this->output->set_status_header(403); + return $this->outputJsonError($this->p->t('studierendenantrag', 'error_no_student')); + } + elseif ($result == -1) + { + $result = $this->antraglib->getDetailsForLastAntrag($prestudent_id, Studierendenantrag_model::TYP_UNTERBRECHUNG); + if (isError($result)) { + return $this->outputJsonError(getError($result)); + } + + return $this->outputJsonSuccess(getData($result)); + } + elseif ($result == -2) + { + $result = $this->antraglib->getDetailsForLastAntrag($prestudent_id); + if (isError($result)) { + return $this->outputJsonError(getError($result)); + } + + $result = getData($result); + $this->output->set_status_header(400); + return $this->outputJsonError($this->p->t('studierendenantrag', 'error_antrag_pending', [ + 'typ' => $this->p->t('studierendenantrag', 'antrag_typ_' . $result->typ) + ])); + } + elseif ($result == -3) + { + $this->output->set_status_header(403); + return $this->outputJsonError($this->p->t('studierendenantrag', 'error_stg_blacklist')); + } + $result = $this->antraglib->getDetailsForNewAntrag($prestudent_id); + if (isError($result)) { + return $this->outputJsonError(getError($result)); + } + + $data = getData($result); + + $data->studiensemester = $this->antraglib->getSemesterForUnterbrechung($data->studiensemester_kurzbz); + + $this->outputJsonSuccess($data); + } + + public function getDetailsForAntrag($studierendenantrag_id) + { + if (!$this->antraglib->isEntitledToShowAntrag($studierendenantrag_id)) return show_404(); + + $result = $this->antraglib->getDetailsForAntrag($studierendenantrag_id); + if (isError($result)) { + return $this->outputJsonError(getError($result)); + } + + $data = getData($result); + + if ($data->typ !== Studierendenantrag_model::TYP_UNTERBRECHUNG) + return show_404(); + + $this->outputJsonSuccess($data); + } + + public function createAntrag() + { + $this->load->library('form_validation'); + + $this->form_validation->set_rules('studiensemester', 'Studiensemester', 'required'); + $this->form_validation->set_rules('prestudent_id', 'Prestudent ID', 'required'); + $this->form_validation->set_rules('grund', 'Grund', 'required'); + $this->form_validation->set_rules( + 'datum_wiedereinstieg', + 'Datum Wiedereinstieg', + 'required|callback_isValidDate|callback_isDateInFuture', + [ + 'isValidDate' => $this->p->t('ui', 'error_invalid_date'), + 'isDateInFuture' => $this->p->t('ui', 'error_invalid_date') + ] + ); + + if ($this->form_validation->run() == false) + { + return $this->outputJsonError($this->form_validation->error_array()); + } + + $grund = $this->input->post('grund'); + $studiensemester = $this->input->post('studiensemester'); + $prestudent_id = $this->input->post('prestudent_id'); + $datum_wiedereinstieg = $this->input->post('datum_wiedereinstieg'); + $dms_id = null; + + $result = $this->antraglib->getPrestudentUnterbrechungsBerechtigt($prestudent_id); + if (isError($result)) { + return $this->outputJsonError(['db' => getError($result)]); + } + $result = $result->retval; + if (!$result) + { + return $this->outputJsonError(['db' => $this->p->t('studierendenantrag', 'error_no_student')]); + } + elseif ($result == -3) + { + return $this->outputJsonError(['db' => $this->p->t('studierendenantrag', 'error_stg_blacklist')]); + } + elseif ($result < 0) + { + return $this->outputJsonError(['db' => $this->p->t('studierendenantrag', 'error_antrag_exists')]); + } + + if(isset($_FILES['attachment']) && (!isset($_FILES['attachment']['error']) || $_FILES['attachment']['error'] != UPLOAD_ERR_NO_FILE)) + { + $this->load->library('DmsLib'); + + $dms = $this->config->item('unterbrechung_dms'); + if (!count(array_filter($dms, function ($v) { + return $v !== null; + }))) + $dms = ['kategorie_kurzbz' => 'Akte']; + $dms['version'] = 0; + + $allowed_filetypes = $this->config->item('unterbrechung_dms_filetypes') ?: ['*']; + $result = $this->dmslib->upload($dms, 'attachment', $allowed_filetypes); + if(isError($result)) + { + return $this->outputJsonError(['db' => getError($result)]); + } + $dms_id = getData($result)['dms_id']; + } + + $result = $this->antraglib->createUnterbrechung($prestudent_id, $studiensemester, getAuthUID(), $grund, $datum_wiedereinstieg, $dms_id); + if(isError($result)) + { + return $this->outputJsonError(['db' => getError($result)]); + } + + $antragId = getData($result); + $result = $this->antraglib->getDetailsForAntrag($antragId); + + if(!hasData($result)) + return $this->outputJsonSuccess($antragId); + $this->outputJsonSuccess(getData($result)); + } + + public function cancelAntrag() + { + $this->load->library('form_validation'); + + $_POST = json_decode($this->input->raw_input_stream, true); + + $this->form_validation->set_rules('antrag_id', 'Antrag ID', 'required'); + + if ($this->form_validation->run() == false) + { + return $this->outputJsonError($this->form_validation->error_array()); + } + + $antrag_id = $this->input->post('antrag_id'); + + $result = $this->antraglib->cancelAntrag($antrag_id, getAuthUID()); + if (isError($result)) + { + return $this->outputJsonError(['db' => getError($result)]); + } + + $result = $this->antraglib->getDetailsForAntrag($antrag_id); + + if (!hasData($result)) + return $this->outputJsonSuccess($antrag_id); + $this->outputJsonSuccess(getData($result)); + } + + public function isValidDate($date) + { + try { + new DateTime($date); + } catch (Exception $e) { + return false; + } + return true; + } + + public function isDateInFuture($date) + { + return new DateTime() < new DateTime($date); + } +} diff --git a/application/controllers/components/Antrag/Wiederholung.php b/application/controllers/components/Antrag/Wiederholung.php new file mode 100644 index 000000000..515771224 --- /dev/null +++ b/application/controllers/components/Antrag/Wiederholung.php @@ -0,0 +1,372 @@ +load->config('studierendenantrag'); + + // Libraries + $this->load->library('AuthLib'); + $this->load->library('PermissionLib'); + $this->load->library('AntragLib'); + + $requiredPermissions = [ + 'saveLvs' => ['student/studierendenantrag:w'], + 'getLvsAsRdf' => ['student/studierendenantrag:r', 'student/noten:r'], + 'moveLvsToZeugnis' => ['student/studierendenantrag:w', 'student/noten:w'] + ]; + + if (isset($requiredPermissions[$this->router->method])) { + if (!$this->permissionlib->isEntitled($requiredPermissions, $this->router->method)) { + $this->output->set_status_header(REST_Controller::HTTP_FORBIDDEN); + $this->outputJson('Forbidden'); + exit; + } + } + + // Load language phrases + $this->loadPhrases([ + 'global', + 'studierendenantrag' + ]); + } + + + //------------------------------------------------------------------------------------------------------------------ + // Public methods + + /** + * Retrieves data of the current studiengang for the current user + */ + + public function getDetailsForNewAntrag($prestudent_id) + { + if (!$this->antraglib->isEntitledToCreateAntragFor($prestudent_id, false)) { + $this->output->set_status_header(REST_Controller::HTTP_FORBIDDEN); + return $this->outputJsonError('Forbidden'); + } + $result = $this->antraglib->getPrestudentWiederholungsBerechtigt($prestudent_id); + if (isError($result)) { + $this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR); + return $this->outputJsonError(getError($result)); + } + $result = $result->retval; + if (!$result) { + $this->output->set_status_header(REST_Controller::HTTP_FORBIDDEN); + return $this->outputJsonError($this->p->t('studierendenantrag', 'error_no_student_no_failed_exam')); + } + elseif ($result == -1) + { + $result = $this->antraglib->getDetailsForLastAntrag($prestudent_id, Studierendenantrag_model::TYP_WIEDERHOLUNG); + if (isError($result)) { + return $this->outputJsonError(getError($result)); + } + + $data = getData($result); + + $result = $this->antraglib->getFailedExamForPrestudent($prestudent_id); + // NOTE(chris): error handling for this function should already happenden in antraglib->getPrestudentWiederholungsBerechtigt() + $pruefungsdata = current(getData($result)); + + $data->studiensemester_kurzbz = $pruefungsdata->studiensemester_kurzbz; + $data->lvbezeichnung = $pruefungsdata->lvbezeichnung; + $data->pruefungsdatum = $pruefungsdata->datum; + + return $this->outputJsonSuccess($data); + } + elseif ($result == -2) + { + $result = $this->antraglib->getDetailsForLastAntrag($prestudent_id); + if (isError($result)) { + return $this->outputJsonError(getError($result)); + } + + $result = getData($result); + $this->output->set_status_header(REST_Controller::HTTP_BAD_REQUEST); + return $this->outputJsonError($this->p->t('studierendenantrag', 'error_antrag_pending', [ + 'typ' => $this->p->t('studierendenantrag', 'antrag_typ_' . $result->typ) + ])); + } + elseif ($result == -3) + { + $this->output->set_status_header(REST_Controller::HTTP_BAD_REQUEST); + return $this->outputJsonError($this->p->t('studierendenantrag', 'error_stg_blacklist')); + } + + $result = $this->antraglib->getDetailsForNewAntrag($prestudent_id); + if (isError($result)) { + return $this->outputJsonError(getError($result)); + } + + $data = getData($result); + + $result = $this->antraglib->getFailedExamForPrestudent($prestudent_id); + // NOTE(chris): error handling for this function should already happenden in antraglib->getPrestudentWiederholungsBerechtigt() + $pruefungsdata = current(getData($result)); + + $data->studiensemester_kurzbz = $pruefungsdata->studiensemester_kurzbz; + $data->lvbezeichnung = $pruefungsdata->lvbezeichnung; + $data->pruefungsdatum = $pruefungsdata->datum; + + $this->outputJsonSuccess($data); + } + + public function createAntrag() + { + $this->createAntragWithStatus(true); + } + + public function cancelAntrag() + { + $this->createAntragWithStatus(false); + } + + protected function createAntragWithStatus($repeat) + { + $this->load->library('form_validation'); + + $_POST = json_decode($this->input->raw_input_stream, true); + + $this->form_validation->set_rules('prestudent_id', 'Prestudent ID', 'required'); + $this->form_validation->set_rules('studiensemester', 'Studiensemester', 'required'); + + if ($this->form_validation->run() == false) + { + return $this->outputJsonError($this->form_validation->error_array()); + } + + $prestudent_id = $this->input->post('prestudent_id'); + $studiensemester = $this->input->post('studiensemester'); + + $result = $this->antraglib->getPrestudentWiederholungsBerechtigt($prestudent_id); + if (isError($result)) { + return $this->outputJsonError(['db' => getError($result)]); + } + $result = $result->retval; + if (!$result) + { + return $this->outputJsonError(['db' => $this->p->t('studierendenantrag', 'error_no_student')]); + } + elseif ($result == -2) + { + return $this->outputJsonError(['db' => $this->p->t('studierendenantrag', 'error_antrag_exists')]); + } + elseif ($result == -3) + { + return $this->outputJsonError(['db' => $this->p->t('studierendenantrag', 'error_stg_blacklist')]); + } + + $result = $this->antraglib->createWiederholung($prestudent_id, $studiensemester, getAuthUID(), $repeat); + if(isError($result)) + { + return $this->outputJsonError(['db' => getError($result)]); + } + + $antragId = getData($result); + $result = $this->antraglib->getDetailsForAntrag($antragId); + + if(!hasData($result)) + return $this->outputJsonSuccess(true); + + $data = getData($result); + + $result = $this->antraglib->getFailedExamForPrestudent($prestudent_id); + // NOTE(chris): error handling for this function should already happenden in antraglib->getPrestudentWiederholungsBerechtigt() + $pruefungsdata = current(getData($result)); + + $data->studiensemester_kurzbz = $pruefungsdata->studiensemester_kurzbz; + $data->lvbezeichnung = $pruefungsdata->lvbezeichnung; + $data->pruefungsdatum = $pruefungsdata->datum; + + $this->outputJsonSuccess($data); + } + + + public function getLvs($antrag_id) + { + $result = $this->antraglib->getLvsForAntrag($antrag_id); + if (isError($result)) { + $error = getError($result); + if ($error == 'Forbidden') + $this->output->set_status_header(REST_Controller::HTTP_FORBIDDEN); + return $this->outputJsonError(getError($result)); + } + $lvs = getData($result); + + $this->outputJsonSuccess($lvs); + } + + public function saveLvs() + { + $result = $this->getPostJSON(); + $antragsLvs = array_merge($result->forbiddenLvs, $result->mandatoryLvs); + + $insert = array_map(function ($lv) { + return [ + 'studierendenantrag_id' => $lv->studierendenantrag_id, + 'lehrveranstaltung_id' => $lv->lehrveranstaltung_id, + 'note' => $lv->zugelassen + ? ($lv->zugelassen == 1 ? 0 : $this->config->item('wiederholung_note_angerechnet')) + : $this->config->item('wiederholung_note_nicht_zugelassen'), + 'anmerkung' => $lv->anmerkung, + 'insertvon' => getAuthUID(), + 'studiensemester_kurzbz' => $lv->studiensemester_kurzbz + ]; + }, $antragsLvs); + + $antrag_ids = array_unique(array_map(function ($lv) { + return $lv['studierendenantrag_id']; + }, $insert)); + + foreach ($antrag_ids as $antrag_id) { + $result = $this->StudierendenantragModel->loadIdAndStatusWhere([ + 'studierendenantrag_id' => $antrag_id + ]); + if (isError($result)) + return $this->outputJsonError(getError($result)); + if (!hasData($result)) + return $this->outputJsonError($this->p->t('studierendenantrag', 'error_no_antrag_found', ['id' => $antrag_id])); + $antrag = current(getData($result)); + if ($antrag->status != Studierendenantragstatus_model::STATUS_CREATED && $antrag->status != Studierendenantragstatus_model::STATUS_LVSASSIGNED) + return $this->outputJsonError($this->p->t('studierendenantrag', 'error_antrag_locked')); + } + + if(!$antragsLvs) + return $this->outputJsonError($this->p->t('studierendenantrag', 'error_no_lv')); + + $result = $this->antraglib->saveLvs($insert); + + if (isError($result)) + return $this->outputJsonError(getError($result)); + + $this->outputJsonSuccess(getData($result)); + } + + public function getLvsAsRdf($prestudent_id) + { + // header für no cache + $this->output->set_header("Cache-Control: no-cache"); + $this->output->set_header("Cache-Control: post-check=0, pre-check=0", false); + $this->output->set_header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); + $this->output->set_header("Pragma: no-cache"); + $this->output->set_header("Content-type: application/xhtml+xml"); + + $this->load->library('VariableLib', ['uid' => getAuthUID()]); + $sem_akt = $this->variablelib->getVar('semester_aktuell'); + + + $result = $this->antraglib->getLvsForPrestudent($prestudent_id, $sem_akt); + if (isError($result)) { + return $this->outputJsonError(getError($result)); + } + + $lvs = getData($result) ?: []; + $rdf_url = 'http://www.technikum-wien.at/antragnote'; + + $this->load->view('lehre/Antrag/Wiederholung/getLvs.rdf.php', [ + 'url' => $rdf_url, + 'lvs' => $lvs + ]); + } + + public function moveLvsToZeugnis() + { + $anzahl = $this->input->post('anzahl'); + $student_uid = $this->input->post('student_uid'); + $this->load->model('education/Studierendenantraglehrveranstaltung_model', 'StudierendenantraglehrveranstaltungModel'); + $this->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel'); + + $errormsg = array(); + + for($i=0; $i<$anzahl; $i++) + { + $id = $this->input->post('studierendenantrag_lehrveranstaltung_id_' . $i); + $result =$this->StudierendenantraglehrveranstaltungModel->load($id); + if(isError($result)) + { + $errormsg[] = getError($result); + } + elseif(!hasData($result)) + { + $errormsg[] = $this->p->t('studierendenantrag', 'error_no_lv_in_application'); + } + else + { + $antragLv = getData($result)[0]; + $result= $this->ZeugnisnoteModel->load([ + 'lehrveranstaltung_id'=> $antragLv->lehrveranstaltung_id, + 'student_uid'=> $student_uid, + 'studiensemester_kurzbz' => $antragLv->studiensemester_kurzbz + ]); + if(isError($result)) + { + $errormsg[] = getError($result); + } + else + { + if (hasData($result)) + { + $result = $this->ZeugnisnoteModel->update( + [ + 'lehrveranstaltung_id'=> $antragLv->lehrveranstaltung_id, + 'student_uid'=> $student_uid, + 'studiensemester_kurzbz' => $antragLv->studiensemester_kurzbz + ], + [ + 'note'=> $antragLv->note, + 'uebernahmedatum' => date('c'), + 'benotungsdatum' => $antragLv->insertamum, + 'updateamum' => date('c'), + 'bemerkung'=>$antragLv->anmerkung, + 'updatevon'=>getAuthUID() + ] + ); + } + else + { + $result = $this->ZeugnisnoteModel->insert([ + 'lehrveranstaltung_id'=> $antragLv->lehrveranstaltung_id, + 'student_uid'=> $student_uid, + 'studiensemester_kurzbz' => $antragLv->studiensemester_kurzbz, + 'note'=> $antragLv->note, + 'uebernahmedatum' => date('c'), + 'benotungsdatum' => $antragLv->insertamum, + 'insertamum' => date('c'), + 'bemerkung'=>$antragLv->anmerkung, + 'insertvon'=>getAuthUID() + ]); + } + if(isError($result)) + { + $errormsg[] = getError($result); + } + } + } + } + + if($errormsg) + $return = false; + else + $return = true; + + $this->load->view('lehre/Antrag/Wiederholung/moveLvs.rdf.php', [ + 'return' => $return, + 'errormsg' => $errormsg + ]); + } +} diff --git a/application/controllers/components/Filter.php b/application/controllers/components/Filter.php index ab7e1493e..bde7d7ed7 100644 --- a/application/controllers/components/Filter.php +++ b/application/controllers/components/Filter.php @@ -26,6 +26,9 @@ class Filter extends FHC_Controller // Loads authentication library and starts authentication $this->load->library('AuthLib'); + // Loads the FiltersModel + $this->load->model('system/Filters_model', 'FiltersModel'); + // Loads the FilterCmptLib with HTTP GET/POST parameters $this->_startFilterCmptLib(); } diff --git a/application/controllers/components/Phrasen.php b/application/controllers/components/Phrasen.php new file mode 100644 index 000000000..87516ce00 --- /dev/null +++ b/application/controllers/components/Phrasen.php @@ -0,0 +1,22 @@ +load->library('PhrasesLib', [$module], 'pj'); + $this->outputJsonSuccess(json_decode($this->pj->getJSON())); + } +} diff --git a/application/controllers/components/SearchBar.php b/application/controllers/components/SearchBar.php index 09a49e163..dd3c22690 100644 --- a/application/controllers/components/SearchBar.php +++ b/application/controllers/components/SearchBar.php @@ -17,6 +17,9 @@ class SearchBar extends FHC_Controller { parent::__construct(); + // Loads the AuthLib and starts the authentication + $this->load->library('AuthLib'); + // Load the library SearchBarLib $this->load->library('SearchBarLib'); } diff --git a/application/controllers/jobs/AnrechnungJob.php b/application/controllers/jobs/AnrechnungJob.php index 7aae80d54..5784830b6 100644 --- a/application/controllers/jobs/AnrechnungJob.php +++ b/application/controllers/jobs/AnrechnungJob.php @@ -37,6 +37,9 @@ class AnrechnungJob extends JOB_Controller $this->load->helper('hlp_sancho_helper'); $this->load->library('AnrechnungLib'); + + // Load configs + $this->load->config('anrechnung'); } /** @@ -213,7 +216,7 @@ class AnrechnungJob extends JOB_Controller 'datentabelle' => $anrechnungen_table, 'link' => anchor($url, 'Anrechnungsanträge Übersicht') ); - + // Send mail sendSanchoMail( 'AnrechnungAntragStellen', @@ -227,6 +230,82 @@ class AnrechnungJob extends JOB_Controller $this->logInfo('SUCCEDED: Sending emails to STGL about yesterdays new Anrechnungen succeded.'); } + // Send Sancho mail to LV-Leitung (fallback Lectors) that were requested for recommendation yesterday. + public function sendMailRecommendationRequests(){ + + $this->logInfo('Start AnrechnungJob sendMailRecommendationRequests to inform lecturers about yesterdays requests for recommendation.'); + + // Get Anrechnungen, für die gestern eine Empfehlung angefragt worden ist + $this->AnrechnungModel->addSelect('astat.anrechnung_id, astat.datum, astat.insertamum'); + $this->AnrechnungModel->addDistinct('astat.anrechnung_id'); + $this->AnrechnungModel->addJoin('lehre.tbl_anrechnung_anrechnungstatus astat', 'anrechnung_id'); + + $result = $this->AnrechnungModel->loadWhere(' + studiensemester_kurzbz = (SELECT studiensemester_kurzbz FROM tbl_studiensemester WHERE now()::date BETWEEN start AND ende) + AND genehmigt_von IS NULL + AND empfehlung_anrechnung IS NULL + AND status_kurzbz = '. $this->db->escape(self::ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR) .' -- in Bearbeitung durch Lektor + AND NOW()::date = (astat.datum + interval \'1 day\') -- nur gestrige Empfehlungsanfrage + ORDER BY astat.anrechnung_id, astat.datum DESC, astat.insertamum DESC -- nur letzten status dabei prüfen + '); + + // Exit, wenn es gestern keine Empfehlungsanfragen gab + if (!hasData($result)) + { + $this->logInfo('End AnrechnungJob sendMailRecommendationRequests, because no recommendations were requested yesterday.'); + exit; + } + + $anrechnung_id_arr = array_column(getData($result), 'anrechnung_id'); + + $arr_lvLector_arr = array(); + foreach ($anrechnung_id_arr as $anrechnung_id) + { + // Get full name of Fachbereichsleitung or LV Leitung. + if($this->config->item('fbl') === TRUE) + { + $arr_lvLector_arr[] = $this->anrechnunglib->getLeitungOfLvOe($anrechnung_id); + } + else + { + $arr_lvLector_arr[] = $this->anrechnunglib->getLectors($anrechnung_id); // Returns LV Leitung. If not present, then all lectors of LV. + } + } + + // Unique lector array to send only one mail per lector + $arr_lvLector_arr = array_unique($arr_lvLector_arr, SORT_REGULAR); + + // Link to 'Anrechnungen prüfen' dashboard + $url = + CIS_ROOT. 'cis/index.php?menu='. + CIS_ROOT. 'cis/menu.php?content_id=&content='. + CIS_ROOT. index_page(). self::REVIEW_ANRECHNUNG_URI; + + foreach ($arr_lvLector_arr as $lvLector_arr) + { + foreach ($lvLector_arr as $lector) + { + // Prepare mail content + $fields = array( + 'vorname' => $lector->vorname, + 'stgl_name' => 'Die Studiengangsleitung', + 'link' => anchor($url, 'Anrechnungsanträge Übersicht') + ); + + // Send mail + sendSanchoMail( + 'AnrechnungEmpfehlungAnfordern', + $fields, + $lector->uid. '@'. DOMAIN, + 'Deine Empfehlung wird benötigt zur Anerkennung nachgewiesener Kenntnisse' + ); + } + } + + $this->logInfo('SUCCEDED AnrechnungJob sendMailRecommendationRequests'); + + } + /** * Send Sancho mail to students, whose Anrechnungen were approved 24 hours ago. */ @@ -308,7 +387,7 @@ class AnrechnungJob extends JOB_Controller $db = new DB_Model(); $result = $db->execReadOnlyQuery($qry); - + // Exit if there are no rejected Anrechnungen if (!hasData($result)) { @@ -361,9 +440,9 @@ html; $result = $this->AnrechnungModel->loadWhere(' studiensemester_kurzbz = ( - SELECT studiensemester_kurzbz FROM tbl_studiensemester WHERE now()::date BETWEEN start AND ende) + SELECT studiensemester_kurzbz FROM tbl_studiensemester WHERE now()::date BETWEEN start AND ende ) - AND genehmigt_von IS NULL + AND genehmigt_von IS NULL AND empfehlung_anrechnung IS NULL AND status_kurzbz = '. $this->db->escape(self::ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR) .' -- in Bearbeitung durch Lektor AND NOW()::date = (astat.datum + interval \'1 week\') -- eine Woche nach Empfehlungsanfrage @@ -376,7 +455,7 @@ html; $this->logInfo('End AnrechnungJob sendMailRemindRecommendation, because no recommendations to be done.'); exit; } - + $anrechnung_id_arr = array_column(getData($result), 'anrechnung_id'); $arr_lvLector_arr = array(); @@ -435,7 +514,7 @@ html; 'vorname' => $stgl->vorname ); } - + return $stglMailAdress_arr; } // If not available, get assistance mail address diff --git a/application/controllers/jobs/AntragJob.php b/application/controllers/jobs/AntragJob.php new file mode 100644 index 000000000..2e72041ff --- /dev/null +++ b/application/controllers/jobs/AntragJob.php @@ -0,0 +1,615 @@ +load->config('studierendenantrag'); + + // Loads SanchoHelper + $this->load->helper('hlp_sancho_helper'); + + // Load Model + $this->load->model('education/Studierendenantrag_model', 'StudierendenantragModel'); + $this->load->model('education/Studierendenantragstatus_model', 'StudierendenantragstatusModel'); + $this->load->model('education/Pruefung_model', 'PruefungModel'); + $this->load->model('person/Kontakt_model', 'KontaktModel'); + $this->load->model('crm/Student_model', 'StudentModel'); + $this->load->model('organisation/Studiengang_model', 'StudiengangModel'); + $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + } + + /** + * Send infomail to Stgl + */ + public function sendStglSammelmail() + { + $this->load->model('person/Person_model', 'PersonModel'); + + $this->logInfo('Start Job sendStglSammelmail'); + + $this->load->model('organisation/Studiengang_model', 'StudiengangModel'); + + $this->StudierendenantragModel->addJoin('public.tbl_prestudent', 'prestudent_id'); + $this->db->group_start(); + $this->db->where('typ', Studierendenantrag_model::TYP_ABMELDUNG); + $this->db->where('campus.get_status_studierendenantrag(studierendenantrag_id)', Studierendenantragstatus_model::STATUS_CREATED); + $this->db->group_end(); + + $this->db->or_group_start(); + $this->db->where('typ', Studierendenantrag_model::TYP_ABMELDUNG_STGL); + $this->db->where('campus.get_status_studierendenantrag(studierendenantrag_id)', Studierendenantragstatus_model::STATUS_CREATED); + $this->db->group_end(); + + $this->db->or_group_start(); + $this->db->where('typ', Studierendenantrag_model::TYP_UNTERBRECHUNG); + $this->db->where('campus.get_status_studierendenantrag(studierendenantrag_id)', Studierendenantragstatus_model::STATUS_CREATED); + $this->db->group_end(); + + $this->db->or_group_start(); + $this->db->where('typ', Studierendenantrag_model::TYP_WIEDERHOLUNG); + $this->db->where('campus.get_status_studierendenantrag(studierendenantrag_id)', Studierendenantragstatus_model::STATUS_LVSASSIGNED); + $this->db->group_end(); + + $result = $this->StudierendenantragModel->load(); + if(isError($result)) + return $this->logError(getError($result)); + + if(!hasData($result)) + return $this->logInfo('End Job sendStglSammelmail: 0 Mails sent'); + + $antraege = getData($result); + + $stgs = array(); + $stgLeitungen = array(); + + foreach ($antraege as $antrag) + { + if (!isset($stgs[$antrag->studiengang_kz])) + { + $result = $this->StudiengangModel->getLeitung($antrag->studiengang_kz); + if (isError($result)) + { + $this->logError(getError($result)); + continue; + } + if (!hasData($result)) + { + $this->logError('Keine Leitung für Studiengang ' . $antrag->studiengang_kz . ' gefunden!'); + continue; + } + + $leitung = current(getData($result)); + if (!isset($stgLeitungen[$leitung->uid])) + { + $stgLeitungen[$leitung->uid] = [ 'Details' => $leitung, 'stgs' => [] ]; + } + $stgLeitungen[$leitung->uid]['stgs'][] = $antrag->studiengang_kz; + + $result = $this->StudierendenantragModel->getStgAndSem($antrag->studierendenantrag_id); + if (isError($result)) + { + $this->logError(getError($result)); + continue; + } + if (!hasData($result)) + { + $this->logError('Keine Details für Studiengang ' . $antrag->studiengang_kz . ' gefunden!'); + continue; + } + $details = current(getData($result)); + + $stgs[$antrag->studiengang_kz] = [ + 'Abmeldung' => [], + 'Unterbrechung' => [], + 'Wiederholung' => [], + 'Details' => $details + ]; + } + $stgs[$antrag->studiengang_kz][str_replace('Stgl', '', $antrag->typ)] = $antrag; + } + + $this->load->model('system/Sprache_model', 'SpracheModel'); + $result = $this->SpracheModel->loadWhere(['content' => true]); + if (isError($result)) { + $this->logError(getError($result)); + $languages = [DEFAULT_LANGUAGE]; + } elseif (!hasData($result)) { + $languages = [DEFAULT_LANGUAGE]; + } else { + $languages = array_map(function ($row) { + return $row->sprache; + }, getData($result)); + } + + $count = 0; + foreach ($stgLeitungen as $leitung) + { + $data = [ + 'name' => trim($leitung['Details']->vorname . ' ' . $leitung['Details']->nachname), + 'vorname' => $leitung['Details']->vorname, + 'nachname' => $leitung['Details']->nachname + ]; + + foreach ($languages as $lang) { + unset($this->p); + $this->loadPhrases(['studierendenantrag'], $lang); + + $table = ''; + foreach ($leitung['stgs'] as $studiengang_kz) { + $rows = ''; + $stg = $stgs[$studiengang_kz]; + foreach (['Abmeldung', 'Unterbrechung', 'Wiederholung'] as $typ) { + $c = count($stg[$typ]); + if ($c) { + $rows .= $this->p->t('studierendenantrag', 'mail_part_x_new_' . $typ, ['count' => $c]); + } + } + $table .= $this->p->t('studierendenantrag', 'mail_part_table', [ + 'stg_bezeichnung' => $stg['Details']->bezeichnung, + 'stg_orgform_kurzbz' => $stg['Details']->orgform_kurzbz, + 'rows' => $rows + ]); + } + $data['table_' . $lang] = $table; + } + + $data['table'] = $data['table_' . DEFAULT_LANGUAGE]; + $data['leitungLink'] = APP_ROOT. 'index.ci.php/lehre/Studierendenantrag/leitung'; + + //Mail an Stgl und Assistenz + $to = $leitung['Details']->uid . '@' . DOMAIN; + $cc = $leitung['Details']->email; + + // NOTE(chris): Sancho mail + if (sendSanchoMail("Sancho_Mail_Antrag_Stgl", $data, $to, 'Anträge - Aktion(en) erforderlich', DEFAULT_SANCHO_HEADER_IMG, DEFAULT_SANCHO_FOOTER_IMG, '', $cc)) + $count++; + } + + $this->logInfo($count . " Emails erfolgreich versandt"); + + $this->logInfo('End Job sendStglSammelmail'); + } + + /** + * Send reminder to Assistant for Wiedereinstieg Unterbrecher + * + */ + public function sendReminderWiedereinstieg() + { + $now = new DateTime(); + $modifier = $this->config->item('unterbrechung_job_remind_wiedereinstieg_date_modifier'); + if (!$modifier) + return $this->logError('Konnte Job nicht starten: Config "unterbrechung_job_remind_wiedereinstieg_date_modifiers" nicht gesetzt'); + + $end = new DateTime(); + $end->modify($modifier); + + $this->logInfo(sprintf( + 'Start Job sendReminderWiedereinstieg (Wiedereinstieg zwischen %s - %s)', + $now->format('Y-m-d'), + $end->format('Y-m-d') + )); + + $result = $this->StudierendenantragModel->getAntraegeWhereWiedereinstiegBetween($now, $end); + + if(isError($result)) + { + $this->logError(getError($result)); + $this->logInfo('Ende Job sendReminderWiedereinstieg'); + return; + } + + $antraege = getData($result) ?: []; + $count = 0; + foreach ($antraege as $antrag) + { + $res = $this->StudierendenantragModel->getStgAndSem($antrag->studierendenantrag_id); + $stg = ''; + $orgform = ''; + if (hasData($res)) { + $studiengang = current(getData($res)); + $stg = $studiengang->bezeichnung; + $orgform = $studiengang->orgform_kurzbz; + } + + $datum = new DateTime($antrag->datum_wiedereinstieg); + $data = array( + 'prestudent' => $antrag->prestudent_id, + 'name' => trim($antrag->vorname . ' '. $antrag->nachname), + 'datum_wiedereinstieg' => $datum->format('d.m.Y'), + 'vorname' => $antrag->vorname, + 'nachname' => $antrag->nachname, + 'Orgform' => $orgform, + 'stg' => $stg + ); + $result = $this->StudentModel->loadWhere(['prestudent_id'=> $antrag->prestudent_id]); + if (hasData($result)) { + $student = current(getData($result)); + $data['UID'] = $student->student_uid; + } + + // NOTE(chris): Sancho mail + if(sendSanchoMail('Sancho_Mail_Antrag_U_Reminder', $data, $antrag->email, 'Reminder: Unterbrechung Wiedereinstieg')) + { + $count++; + $this->StudierendenantragstatusModel->insert([ + 'studierendenantrag_id' => $antrag->studierendenantrag_id, + 'studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_REMINDERSENT, + 'insertvon' => 'AntragJob' + ]); + } + } + $this->logInfo($count . ' Reminder gesendet - Ende Job sendReminderWiedereinstieg'); + } + + /** + * Set Wiederholer after deadline to Abbrecher + * + */ + public function handleWiederholerDeadline() + { + $this->logInfo('Start Job handleWiederholerDeadline'); + + $this->load->library('PrestudentLib'); + + $insertvon = $this->config->item('antrag_job_systemuser'); + if (!$insertvon) { + $this->logError('Config "antrag_job_systemuser" nicht gesetzt'); + $this->logInfo('Ende Job handleWiederholerDeadline'); + return; + } + + $modifier_deadline = $this->config->item('wiederholung_job_deadline_date_modifier'); + if (!$modifier_deadline) { + $this->logError('Config "wiederholung_job_deadline_date_modifier" nicht gesetzt'); + $this->logInfo('Ende Job handleWiederholerDeadline'); + return; + } + + $digi_start= $this->config->item('digitalization_start'); + if($digi_start) + $digi_start = new DateTime($digi_start); + + $dateDeadline = new DateTime(); + $dateDeadline->sub(DateInterval::createFromDateString($modifier_deadline)); + + $result = $this->PruefungModel->getAllPrestudentsWhereCommitteeExamFailed( + [ + null, + Studierendenantragstatus_model::STATUS_REQUESTSENT_1, + Studierendenantragstatus_model::STATUS_REQUESTSENT_2 + ], + $dateDeadline, + $digi_start + ); + if(isError($result)) + { + $this->logError(getError($result)); + } + else + { + $prestudents = getData($result) ?: []; + $count = 0; + + $prestudents = $this->prestudentsGetUnique($prestudents); + + + foreach ($prestudents as $prestudent) + { + $result = $this->prestudentlib->setAbbrecher($prestudent->prestudent_id, $prestudent->studiensemester_kurzbz, $insertvon); + if (isError($result)) + $this->logError(getError($result)); + else + $count++; + } + $this->logInfo($count . " Students set to Abbrecher"); + } + + $this->logInfo('Ende Job handleWiederholerDeadline'); + } + + /** + * Set Abmeldungen after deadline to Abbrecher + * + */ + public function handleAbmeldungenStglDeadline() + { + $this->logInfo('Start Job handleAbmeldungenStglDeadline'); + + $this->load->library('AntragLib'); + + $insertvon = $this->config->item('antrag_job_systemuser'); + if (!$insertvon) { + $this->logError('Config "antrag_job_systemuser" nicht gesetzt'); + $this->logInfo('Ende Job handleAbmeldungenStglDeadline'); + return; + } + + $modifier_deadline = $this->config->item('abmeldung_job_deadline_date_modifier'); + if (!$modifier_deadline) { + $this->logError('Config "abmeldung_job_deadline_date_modifier" nicht gesetzt'); + $this->logInfo('Ende Job handleAbmeldungenStglDeadline'); + return; + } + + $dateDeadline = new DateTime(); + $dateDeadline->sub(DateInterval::createFromDateString($modifier_deadline)); + + $this->StudierendenantragModel->addSelect('prestudent_id'); + $this->StudierendenantragModel->addSelect('studiensemester_kurzbz'); + $this->StudierendenantragModel->addSelect('s.insertamum'); + $this->StudierendenantragModel->addSelect('s.insertvon'); + + $this->StudierendenantragModel->db->where_in('public.get_rolle_prestudent(prestudent_id, studiensemester_kurzbz)', $this->config->item('antrag_prestudentstatus_whitelist')); + + $result = $this->StudierendenantragModel->getWithLastStatusWhere([ + 'typ' => Studierendenantrag_model::TYP_ABMELDUNG_STGL, + 'studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_APPROVED, + 's.insertamum <=' => $dateDeadline->format('c') + ]); + + if(isError($result)) + { + $this->logError(getError($result)); + } + else + { + $antraege = getData($result) ?: []; + $count = 0; + + foreach ($antraege as $antrag) + { + $result = $this->prestudentlib->setAbbrecher( + $antrag->prestudent_id, + $antrag->studiensemester_kurzbz, + 'AntragJob', + 'abbrecherStgl', + $antrag->insertamum, + null, + $antrag->insertvon ?: $insertvon + ); + if (isError($result)) + $this->logError(getError($result)); + else + { + $count++; + $result = $this->PrestudentModel->load($antrag->prestudent_id); + if(!hasData($result)) { + $this->logWarning('No Prestudent found'); + continue; + } + $prestudent = current(getData($result)); + $result = $this->StudiengangModel->load($prestudent->studiengang_kz); + if(!hasData($result)) { + $this->logWarning('No Studiengang found'); + continue; + } + $studiengang = current(getData($result)); + $result = $this->PersonModel->loadPrestudent($antrag->prestudent_id); + if(!hasData($result)) + { + $this->logWarning('No Person found'); + continue; + } + $person = current(getData($result)); + $email = $studiengang->email; + $dataMail = array( + 'prestudent' => $antrag->prestudent_id, + 'studiensemester' => $antrag->studiensemester_kurzbz, + 'name' => trim($person->vorname . ' '. $person->nachname), + ); + + if(!sendSanchoMail('Sancho_Mail_Antrag_A_Assist', $dataMail, $email, 'Einspruchsfrist abgelaufen')) + { + $this->logWarning("Failed to send Notification to " . $email); + } + } + } + $this->logInfo($count . "/" . count($antraege) . " Students set to Abbrecher"); + } + $this->logInfo('Ende Job handleAbmeldungenStglDeadline'); + } + + /** + * Send Request to Student do Decide between Wiederholung and Verzicht + * + */ + public function sendAufforderungWiederholer() + { + $this->logInfo('Start Job sendAufforderungWiederholer'); + + $modifier_request_1 = $this->config->item('wiederholung_job_request_1_date_modifier'); + $modifier_request_2 = $this->config->item('wiederholung_job_request_2_date_modifier'); + $modifier_deadline = $this->config->item('wiederholung_job_deadline_date_modifier'); + + $digi_start = $this->config->item('digitalization_start'); + if ($digi_start) { + try { + $digi_start = new DateTime($digi_start); + } catch(Exception $e) { + } + } + + if ($modifier_deadline) { + $dateDeadline = new DateTime(); + $dateDeadline->sub(DateInterval::createFromDateString($modifier_deadline)); + + if ($digi_start) + $dateDeadline = max($digi_start, $dateDeadline); + } else { + $dateDeadline = $digi_start ?: null; + } + + //first request + if ($modifier_request_1) { + $dateStichtag = new DateTime(); + $dateStichtag->sub(DateInterval::createFromDateString($modifier_request_1)); + if (!$dateDeadline || $dateStichtag > $dateDeadline) + $this->sendReminder( + 'Request1', + null, + Studierendenantragstatus_model::STATUS_REQUESTSENT_1, + $dateDeadline, + $dateStichtag, + $modifier_deadline, + 'Aufforderung: Bekanntgabe Wiederholung' + ); + } else + $this->logError('Config "wiederholung_job_request_1_date_modifier" nicht gesetzt'); + + //second request + if ($modifier_request_2) { + $dateStichtag = new DateTime(); + $dateStichtag->sub(DateInterval::createFromDateString($modifier_request_2)); + if (!$dateDeadline || $dateStichtag > $dateDeadline) + $this->sendReminder( + 'Request2', + Studierendenantragstatus_model::STATUS_REQUESTSENT_1, + Studierendenantragstatus_model::STATUS_REQUESTSENT_2, + $dateDeadline, + $dateStichtag, + $modifier_deadline, + 'Reminder Aufforderung: Bekanntgabe Wiederholung' + ); + } else + $this->logError('Config "wiederholung_job_request_2_date_modifier" nicht gesetzt'); + + $this->logInfo('Ende Job sendAufforderungWiederholer'); + } + + protected function prestudentsGetUnique($prestudents) + { + $result = []; + foreach ($prestudents as $prestudent) { + if (!isset($result[$prestudent->prestudent_id])) + $result[$prestudent->prestudent_id] = $prestudent; + else { + if ($result[$prestudent->prestudent_id]->datum > $prestudent->datum) + $result[$prestudent->prestudent_id] = $prestudent; + } + } + return $result; + } + + protected function sendReminder($name, $status_from, $status_to, $deadline, $date_stichtag, $modifier_deadline, $subject) + { + $this->logInfo('Start Job sendAufforderungWiederholer ' . $name); + + $result = $this->PruefungModel->getAllPrestudentsWhereCommitteeExamFailed($status_from, $date_stichtag, $deadline); + + if(isError($result)) + { + $this->logError(getError($result)); + } + else + { + $prestudents = getData($result) ?: []; + $count = 0; + + $prestudents = $this->prestudentsGetUnique($prestudents); + + foreach ($prestudents as $prestudent) + { + $stg_kz = $prestudent->studiengang_kz; + if (in_array($stg_kz, $this->config->item('stgkz_blacklist_wiederholung'))) + continue; + $url = site_url('lehre/Studierendenantrag/wiederholung/' . $prestudent->prestudent_id); + $urlCIS = CIS_ROOT . 'index.ci.php/lehre/Studierendenantrag/wiederholung/' . $prestudent->prestudent_id; + $email = $this->StudentModel->getEmailFH($this->StudentModel->getUID($prestudent->prestudent_id)); + + $fristende = new DateTime($prestudent->datum); + $fristende->add(DateInterval::createFromDateString($modifier_deadline)); + + $datum_kp = new DateTime($prestudent->datum); + + $result = $this->StudiensemesterModel->getNextFrom($prestudent->studiensemester_kurzbz); + $next_sem = ""; + $sem_after_next_sem = ""; + if (hasData($result)) { + $next_sem = current(getData($result))->studiensemester_kurzbz; + $result = $this->StudiensemesterModel->getNextFrom($next_sem); + if (hasData($result)) { + $sem_after_next_sem = current(getData($result))->studiensemester_kurzbz; + } + } + + $this->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel'); + $result = $this->PrestudentstatusModel->loadLastWithStgDetails($prestudent->prestudent_id, $prestudent->studiensemester_kurzbz); + if (hasData($result)) { + $ausbildungssemester = current(getData($result))->semester; + } + + $dataMail = array( + 'name'=> trim($prestudent->vorname . ' '. $prestudent->nachname), + 'vorname' => $prestudent->vorname, + 'nachname' => $prestudent->nachname, + 'pers_kz'=> $prestudent->matrikelnr, + 'stg' => $prestudent->bezeichnung, + 'lvbezeichnung' => $prestudent->lvbezeichnung, + 'datum_kp' => $datum_kp->format('d.m.Y'), + 'studiensemester'=> $prestudent->studiensemester_kurzbz, + 'Orgform'=> $prestudent->orgform, + 'prestudent_id' => $prestudent->prestudent_id, + 'url' => $url, + 'urlCIS' => $urlCIS, + 'fristablauf' => $fristende->format('d.m.Y'), + 'pre_wiederholer_sem' => $next_sem, + 'wiederholer_sem' => $sem_after_next_sem, + 'sem' => $ausbildungssemester + ); + + // NOTE(chris): Sancho mail + if(sendSanchoMail('Sancho_Mail_Antrag_W_' . $name, $dataMail, $email, $subject)) + { + $antrag_id = null; + $result = $this->StudierendenantragModel->loadWhere([ + 'prestudent_id' => $prestudent->prestudent_id, + 'typ' => Studierendenantrag_model::TYP_WIEDERHOLUNG + ]); + if (isError($result)) + $this->logError(getError($result)); + elseif (hasData($result)) + $antrag_id = current(getData($result) ?: []) -> studierendenantrag_id; + if ($antrag_id == null) + { + $result = $this->StudierendenantragModel->insert([ + 'prestudent_id' => $prestudent->prestudent_id, + 'studiensemester_kurzbz'=> $prestudent->studiensemester_kurzbz, + 'datum' => date('c'), + 'typ' => Studierendenantrag_model::TYP_WIEDERHOLUNG, + 'insertvon' => 'AntragJob' + ]); + if (isError($result)) + $this->logError(getError($result)); + else + $antrag_id = getData($result); + } + if ($antrag_id) + { + $result = $this->StudierendenantragstatusModel->insert([ + 'studierendenantrag_id' => $antrag_id, + 'studierendenantrag_statustyp_kurzbz' => $status_to, + 'insertvon' => 'AntragJob' + ]); + if (isError($result)) + $this->logError(getError($result)); + } + $count++; + } + } + $this->logInfo($count . " Mails '" . $subject . "' sent"); + } + $this->logInfo('Ende Job sendAufforderungWiederholer ' . $name); + } +} diff --git a/application/controllers/jobs/IssueResolver.php b/application/controllers/jobs/IssueResolver.php index 78e867936..cf97b7f68 100755 --- a/application/controllers/jobs/IssueResolver.php +++ b/application/controllers/jobs/IssueResolver.php @@ -44,6 +44,7 @@ class IssueResolver extends IssueResolver_Controller 'CORE_STUDENTSTATUS_0012' => 'CORE_STUDENTSTATUS_0012', 'CORE_STUDENTSTATUS_0013' => 'CORE_STUDENTSTATUS_0013', 'CORE_STUDENTSTATUS_0014' => 'CORE_STUDENTSTATUS_0014', + 'CORE_STUDENTSTATUS_0015' => 'CORE_STUDENTSTATUS_0015', 'CORE_PERSON_0001' => 'CORE_PERSON_0001', 'CORE_PERSON_0002' => 'CORE_PERSON_0002', 'CORE_PERSON_0003' => 'CORE_PERSON_0003', diff --git a/application/controllers/jobs/PlausiIssueProducer.php b/application/controllers/jobs/PlausiIssueProducer.php index 943d7aa46..b667e835d 100644 --- a/application/controllers/jobs/PlausiIssueProducer.php +++ b/application/controllers/jobs/PlausiIssueProducer.php @@ -1,16 +1,29 @@ load->library('issues/PlausicheckProducerLib'); - $this->load->library('IssuesLib'); + $this->load->library('issues/PlausicheckDefinitionLib'); + + // load models + $this->load->model('organisation/studiensemester_model', 'StudiensemesterModel'); + + // get current Studiensemester + $studiensemesterRes = $this->StudiensemesterModel->getAkt(); + if (hasData($studiensemesterRes)) $this->_currentStudiensemester = getData($studiensemesterRes)[0]->studiensemester_kurzbz; + + // set fehler which can be produced by the job + // structure: fehler_kurzbz => class (library) name for resolving + $this->_fehlerLibMappings = $this->plausicheckdefinitionlib->getFehlerLibMappings(); } /** @@ -20,43 +33,10 @@ class PlausiIssueProducer extends JOB_Controller */ public function run($studiensemester_kurzbz = null, $studiengang_kz = null) { - $fehlerKurzbz = $this->plausicheckproducerlib->getFehlerKurzbz(); + // get Studiensemester + if (isEmptyString($studiensemester_kurzbz)) $studiensemester_kurzbz = $this->_currentStudiensemester; - $this->logInfo("Plausicheck issue producer job started"); - - // get the data returned by Plausicheck - foreach ($fehlerKurzbz as $fehler_kurzbz) - { - // execute the check - $this->logInfo("Checking " . $fehler_kurzbz . "..."); - $plausicheckRes = $this->plausicheckproducerlib->producePlausicheckIssue($fehler_kurzbz, $studiensemester_kurzbz, $studiengang_kz); - - if (isError($plausicheckRes)) $this->logError(getError($plausicheckRes)); - - if (hasData($plausicheckRes)) - { - $plausicheckData = getData($plausicheckRes); - - foreach ($plausicheckData as $plausiData) - { - // get the data needed for issue production - $person_id = isset($plausiData['person_id']) ? $plausiData['person_id'] : null; - $oe_kurzbz = isset($plausiData['oe_kurzbz']) ? $plausiData['oe_kurzbz'] : null; - $fehlertext_params = isset($plausiData['fehlertext_params']) ? $plausiData['fehlertext_params'] : null; - $resolution_params = isset($plausiData['resolution_params']) ? $plausiData['resolution_params'] : null; - - // write the issue - $addIssueRes = $this->issueslib->addFhcIssue($fehler_kurzbz, $person_id, $oe_kurzbz, $fehlertext_params, $resolution_params); - - // log if error, or log info if inserted new issue - if (isError($addIssueRes)) - $this->logError(getError($addIssueRes)); - elseif (hasData($addIssueRes) && is_integer(getData($addIssueRes))) - $this->logInfo("Plausicheck issue " . $fehler_kurzbz . " successfully produced, person_id: " . $person_id); - } - } - } - - $this->logInfo("Plausicheck issue producer job stopped"); + // producing issues for semester and optionally Studiengang + $this->producePlausicheckIssues(array('studiensemester_kurzbz' => $studiensemester_kurzbz, 'studiengang_kz' => $studiengang_kz)); } } diff --git a/application/controllers/jobs/ReihungstestJob.php b/application/controllers/jobs/ReihungstestJob.php index ab6c429a0..8a1729d95 100644 --- a/application/controllers/jobs/ReihungstestJob.php +++ b/application/controllers/jobs/ReihungstestJob.php @@ -3,6 +3,9 @@ if (!defined('BASEPATH')) exit('No direct script access allowed'); class ReihungstestJob extends JOB_Controller { + + const LAST_DAYS_PRESTUDENTSTATUS = 5; + /** * Constructor */ @@ -464,7 +467,7 @@ class ReihungstestJob extends JOB_Controller $this->PrestudentstatusModel->addJoin('public.tbl_person', 'person_id'); $yesterdays_applicants_arr = $this->PrestudentstatusModel->loadWhere(' - status_kurzbz = \'Interessent\' AND + status_kurzbz IN (\'Interessent\', \'Bewerber\') AND typ = \'b\' AND bestaetigtam = current_date - 1 '); @@ -826,7 +829,7 @@ class ReihungstestJob extends JOB_Controller AND tbl_studiengang.typ IN ('b', 'm') ) SELECT * FROM prst - WHERE prestudenstatus_datum >= (SELECT CURRENT_DATE - 1) + WHERE prestudenstatus_datum >= (SELECT CURRENT_DATE - ". self::LAST_DAYS_PRESTUDENTSTATUS .") AND (studiengang_typ = 'b' OR (studiengang_typ = 'm' AND EXISTS (SELECT 1 /* Master Studiengänge berücksichtigen wenn auch Bachelor im gleichen Semester */ FROM prst prstb WHERE studiengang_typ = 'b' @@ -868,7 +871,8 @@ class ReihungstestJob extends JOB_Controller tbl_person.nachname, tbl_person.vorname, tbl_prestudent.*, - tbl_studiengang.typ AS studiengang_typ + tbl_studiengang.typ AS studiengang_typ, + tbl_prestudentstatus.datum FROM PUBLIC.tbl_person JOIN PUBLIC.tbl_prestudent USING (person_id) JOIN PUBLIC.tbl_prestudentstatus USING (prestudent_id) @@ -901,7 +905,7 @@ class ReihungstestJob extends JOB_Controller $mailArray[$rowNiedrPrios->studiengang_kz][$rowNiedrPrios->orgform_kurzbz]['AufnahmeHoeherePrio'][] = $rowNiedrPrios->nachname.' '.$rowNiedrPrios->vorname.' ('.$rowNiedrPrios->prestudent_id.')'; } - elseif ($rowNiedrPrios->laststatus == 'Bewerber') + elseif ($rowNiedrPrios->laststatus == 'Bewerber' && $row_ps->prestudenstatus_datum > $rowNiedrPrios->datum) { // Abgewiesenen-Status mit Statusgrund "Aufnahme anderer Studiengang" (ID 5) setzen $lastStatus = $this->PrestudentstatusModel->getLastStatus($rowNiedrPrios->prestudent_id); @@ -927,7 +931,7 @@ class ReihungstestJob extends JOB_Controller = $rowNiedrPrios->nachname.' '.$rowNiedrPrios->vorname.' ('.$rowNiedrPrios->prestudent_id.')'; } } - elseif ($rowNiedrPrios->laststatus == 'Wartender') + elseif ($rowNiedrPrios->laststatus == 'Wartender' && $row_ps->prestudenstatus_datum > $rowNiedrPrios->datum) { // Abgewiesenen-Status mit Statusgrund "Aufnahme anderer Studiengang" (ID 5) setzen // Mail zur Info an Assistenz schicken diff --git a/application/controllers/lehre/Antrag/Attachment.php b/application/controllers/lehre/Antrag/Attachment.php new file mode 100644 index 000000000..073a03df0 --- /dev/null +++ b/application/controllers/lehre/Antrag/Attachment.php @@ -0,0 +1,82 @@ +load->model('education/Studierendenantrag_model', 'StudierendenantragModel'); + + $this->load->library('DmsLib'); + $this->load->library('AuthLib'); + $this->load->library('PermissionLib'); + } + + // ----------------------------------------------------------------------------------------------------------------- + // Public methods + + /** + * @param integer $dms_id + * + * @return void + */ + public function show($dms_id) + { + $result = $this->StudierendenantragModel->loadWhere(['dms_id' => $dms_id]); + if (!getData($result)) + return show_404(); + + if (!$this->permissionlib->isBerechtigt('student/antragfreigabe')) + { + $isSamePerson = false; + $antraege = getData($result); + $this->load->model('crm/Prestudent_model', 'PrestudentModel'); + foreach ($antraege as $antrag) + { + $prestudent = $this->PrestudentModel->load($antrag->prestudent_id); + if(hasData($prestudent)) + { + if(current(getData($prestudent))->person_id == getAuthPersonId()) + { + $isSamePerson = true; + break; + } + } + } + + if ($isSamePerson == false) + { + $this->output->set_status_header(REST_Controller::HTTP_FORBIDDEN); // set the HTTP header as unauthorized + + $this->load->library('EPrintfLib'); // loads the EPrintfLib to format the output + + // Prints the main error message + $this->eprintflib->printError('You are not allowed to access to this content'); + // Prints the called controller name + $this->eprintflib->printInfo('Controller name: '.$this->router->class); + // Prints the called controller method name + $this->eprintflib->printInfo('Method name: '.$this->router->method); + // Prints the required permissions needed to access to this method + $this->eprintflib->printInfo('Required permissions: student/antragfreigabe'); + + return show_error('You are not entitled to read this document'); + } + } + + $result = $this->dmslib->download($dms_id); + if (isError($result)) + return show_error(getError($result)); + + $this->outputFile(getData($result)); + } +} diff --git a/application/controllers/lehre/Antrag/Wiederholung.php b/application/controllers/lehre/Antrag/Wiederholung.php new file mode 100644 index 000000000..2aa57d733 --- /dev/null +++ b/application/controllers/lehre/Antrag/Wiederholung.php @@ -0,0 +1,48 @@ + 'student/studierendenantrag:w' + ]); + + $this->load->library('AntragLib'); + + // Load language phrases + $this->loadPhrases([ + 'studierendenantrag' + ]); + } + + // ----------------------------------------------------------------------------------------------------------------- + // Public methods + public function assistenz($antrag_id) + { + + $result = $this->antraglib->getDetailsForAntrag($antrag_id); + + if (isError($result)) + return show_error(getError($result)); + + if (!hasData($result)) + return show_404(); + + $this->load->view('lehre/Antrag/Wiederholung/Student', [ + 'antrag_id' => $antrag_id, + 'antrag' => getData($result) + ]); + } +} diff --git a/application/controllers/lehre/Studierendenantrag.php b/application/controllers/lehre/Studierendenantrag.php new file mode 100644 index 000000000..d6d6b2c50 --- /dev/null +++ b/application/controllers/lehre/Studierendenantrag.php @@ -0,0 +1,188 @@ +load->library('AuthLib'); + $this->load->library('AntragLib'); + + // Load Models + $this->load->model('education/Studierendenantrag_model', 'StudierendenantragModel'); + + // Load language phrases + $this->loadPhrases([ + 'studierendenantrag' + ]); + + if (strtolower($this->router->method) === 'leitung') + $this->_isAllowed([ + 'leitung' => ['student/studierendenantrag:r', 'student/antragfreigabe:r'] + ]); + } + + // ----------------------------------------------------------------------------------------------------------------- + // Public methods + public function index() + { + $dataAntrag = $this->StudierendenantragModel->loadForPerson(getAuthPersonId()); + if (isError($dataAntrag)) + return show_error(getError($dataAntrag)); + $dataAntrag = (getData($dataAntrag) ? : []); + $prestudentenArr = array(); + + foreach ($dataAntrag as $antrag) + { + if (!isset($prestudentenArr[$antrag->prestudent_id])) + { + $prestudentenArr[$antrag->prestudent_id] = array( + 'allowedNewTypes' => array(), + 'antraege'=> array(), + 'bezeichnungStg' => $antrag->bezeichnung, + 'bezeichnungOrgform' => $antrag->orgform + ); + + $result = $this->antraglib->getPrestudentWiederholungsBerechtigt($antrag->prestudent_id); + if (getData($result) == 1) + $prestudentenArr[$antrag->prestudent_id]['allowedNewTypes'][] = 'Wiederholung'; + + $result = $this->antraglib->getPrestudentUnterbrechungsBerechtigt($antrag->prestudent_id); + if (getData($result) == 1) + $prestudentenArr[$antrag->prestudent_id]['allowedNewTypes'][] = 'Unterbrechung'; + + $result = $this->antraglib->getPrestudentAbmeldeBerechtigt($antrag->prestudent_id); + if (getData($result) == 1) + $prestudentenArr[$antrag->prestudent_id]['allowedNewTypes'][] = 'Abmeldung'; + } + if ($antrag->studierendenantrag_id == null) + continue; + if ($antrag->typ == Studierendenantrag_model::TYP_ABMELDUNG_STGL && (!$antrag->isapproved)) + continue; + + $prestudentenArr[$antrag->prestudent_id]['antraege'][] = $antrag; + } + + $this->load->view('lehre/Antrag/Student/List', [ + 'antraege' => $prestudentenArr + ]); + } + + public function leitung() + { + $stgL = $this->permissionlib->getSTG_isEntitledFor('student/antragfreigabe') ?: []; + + $stgA = $this->permissionlib->getSTG_isEntitledFor('student/studierendenantrag') ?: []; + + $this->load->view('lehre/Antrag/Leitung/List', [ + 'stgA' => $stgA, + 'stgL' => $stgL + ]); + } + + public function abmeldung($prestudent_id, $studierendenantrag_id = null) + { + $this->load->view('lehre/Antrag/Create', [ + 'prestudent_id' => $prestudent_id, + 'studierendenantrag_id' => $studierendenantrag_id, + 'antrag_type' => 'Abmeldung' + ]); + } + + public function abmeldungstgl($prestudent_id, $studierendenantrag_id = null) + { + $this->load->view('lehre/Antrag/Create', [ + 'prestudent_id' => $prestudent_id, + 'studierendenantrag_id' => $studierendenantrag_id, + 'antrag_type' => 'AbmeldungStgl' + ]); + } + + public function unterbrechung($prestudent_id, $studierendenantrag_id = null) + { + $this->load->view('lehre/Antrag/Create', [ + 'prestudent_id' => $prestudent_id, + 'studierendenantrag_id' => $studierendenantrag_id, + 'antrag_type' => 'Unterbrechung' + ]); + } + + public function wiederholung($prestudent_id, $studierendenantrag_id = null) + { + $this->load->view('lehre/Antrag/Create', [ + 'prestudent_id' => $prestudent_id, + 'studierendenantrag_id' => $studierendenantrag_id, + 'antrag_type' => 'Wiederholung' + ]); + } + + /** + * Checks if the caller is allowed to access to this content with the given permissions + * If it is not allowed will set the HTTP header with code 401 + * Wrapper for permissionlib->isEntitled + */ + private function _isAllowed($requiredPermissions) + { + // Loads permission lib + $this->load->library('PermissionLib'); + + // Checks if this user is entitled to access to this content + if (!$this->permissionlib->isEntitled($requiredPermissions, $this->router->method)) + { + $this->output->set_status_header(REST_Controller::HTTP_UNAUTHORIZED); // set the HTTP header as unauthorized + + $this->load->library('EPrintfLib'); // loads the EPrintfLib to format the output + + // Prints the main error message + $this->eprintflib->printError('You are not allowed to access to this content'); + // Prints the called controller name + $this->eprintflib->printInfo('Controller name: '.$this->router->class); + // Prints the called controller method name + $this->eprintflib->printInfo('Method name: '.$this->router->method); + // Prints the required permissions needed to access to this method + $this->eprintflib->printInfo('Required permissions: '.$this->_rpsToString($requiredPermissions, $this->router->method)); + + exit; // immediately terminate the execution + } + } + + /** + * Converts an array of permissions to a string that contains them as a comma separated list + * Ex: ", , " + */ + private function _rpsToString($requiredPermissions, $method) + { + $strRequiredPermissions = ''; // string that contains all the required permissions needed to access to this method + + if (isset($requiredPermissions[$method])) // if the called method is present in the permissions array + { + // If it is NOT then convert it into an array + $rpsMethod = $requiredPermissions[$method]; + if (!is_array($rpsMethod)) + { + $rpsMethod = array($rpsMethod); + } + + // Copy all the permissions into $strRequiredPermissions separated by a comma + for ($i = 0; $i < count($rpsMethod); $i++) + { + $strRequiredPermissions .= $rpsMethod[$i].', '; + } + + $strRequiredPermissions = rtrim($strRequiredPermissions, ', '); + } + + return $strRequiredPermissions; + } +} diff --git a/application/controllers/lehre/anrechnung/AdminAnrechnung.php b/application/controllers/lehre/anrechnung/AdminAnrechnung.php new file mode 100644 index 000000000..3c3fd3fc2 --- /dev/null +++ b/application/controllers/lehre/anrechnung/AdminAnrechnung.php @@ -0,0 +1,187 @@ + 'lehre/anrechnungszeitfenster:rw', + 'save' => 'lehre/anrechnungszeitfenster:rw', + 'edit' => 'lehre/anrechnungszeitfenster:rw', + 'delete' => 'lehre/anrechnungszeitfenster:rw' + ) + ); + + // Load models + $this->load->model('education/Anrechnung_model', 'AnrechnungModel'); + $this->load->model('education/Anrechnungszeitraum_model', 'AnrechnungszeitraumModel'); + $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + + // Load libraries + $this->load->library('WidgetLib'); + $this->load->library('PermissionLib'); + $this->load->library('AnrechnungLib'); + + + // Load language phrases + $this->loadPhrases( + array( + 'global', + 'ui', + 'lehre', + 'anrechnung', + 'table' + ) + ); + + $this->_setAuthUID(); + + $this->setControllerId(); + } + + public function index() + { + // Set nearest Studiensemester as default + $result = $this->StudiensemesterModel->getNearest(); + $studiensemester_kurzbz = hasData($result) ? getData($result)[0]->studiensemester_kurzbz : ''; + + // Get existing Anrechnungszeitraeume + $this->AnrechnungszeitraumModel->addOrder('anrechnungszeitraum_id', 'DESC'); + $result = $this->AnrechnungszeitraumModel->load(); + $anrechnungszeitraum_arr = hasData($result) ? getData($result) : array(); + + $viewData = array( + 'studiensemester_kurzbz' => $studiensemester_kurzbz, + 'anrechnungszeitraum_arr' => $anrechnungszeitraum_arr + ); + + $this->load->view('lehre/anrechnung/adminAnrechnung.php', $viewData); + } + + /** + * Save new Anrechnungszeitraum. + */ + public function save() + { + $this->_validate($this->input->post()); + + $studiensemester_kurzbz = $this->input->post('studiensemester_kurzbz'); + $anrechnungstart = $this->input->post('anrechnungstart'); + $anrechnungende = $this->input->post('anrechnungende'); + + $result = $this->AnrechnungszeitraumModel->insertAzr($studiensemester_kurzbz, $anrechnungstart, $anrechnungende); + + if (isError($result)) + { + $this->terminateWithJsonError(getError($result)); + } + + if (hasData($result)) + { + $this->outputJsonSuccess(array('anrechnungszeitraum_id' => getData($result))); + } + } + + /** + * Edit Anrechnungszeitraum. + */ + public function edit() + { + $this->_validate($this->input->post()); + + $anrechnungszeitraum_id = $this->input->post('anrechnungszeitraum_id'); + $studiensemester_kurzbz = $this->input->post('studiensemester_kurzbz'); + $anrechnungstart = $this->input->post('anrechnungstart'); + $anrechnungende = $this->input->post('anrechnungende'); + + $result = $this->AnrechnungszeitraumModel->updateAzr( + $anrechnungszeitraum_id, + $studiensemester_kurzbz, + $anrechnungstart, + $anrechnungende + ); + + if (isError($result)) + { + $this->terminateWithJsonError(getError($result)); + } + + if (hasData($result)) + { + $this->outputJsonSuccess(array('anrechnungszeitraum_id' => getData($result))); + } + } + + /** + * Delete Anrechnungszeitraum. + */ + public function delete() + { + $anrechnungszeitraum_id = $this->input->post('anrechnungszeitraum_id'); + + $result = $this->AnrechnungszeitraumModel->deleteAzr($anrechnungszeitraum_id); + + if (isError($result)) + { + $this->terminateWithJsonError(getError($result)); + } + + if (hasData($result)) + { + $this->outputJsonSuccess(array('anrechnungszeitraum_id' => getData($result))); + } + } + + /** + * Validates post parameters. + * + * @param $post + */ + private function _validate($post) + { + $studiensemester_kurzbz = $post['studiensemester_kurzbz']; + $anrechnungstart = $post['anrechnungstart']; + $anrechnungende = $post['anrechnungende']; + + if (isEmptyString($studiensemester_kurzbz) + || isEmptyString($anrechnungstart) + || isEmptyString($anrechnungende)) + { + $this->terminateWithJsonError($this->p->t('ui', 'errorFelderFehlen')); + } + + if ($anrechnungstart > $anrechnungende) + { + $this->terminateWithJsonError($this->p->t('ui', 'errorStartdatumNachEndedatum')); + } + + $result = $this->StudiensemesterModel->load($studiensemester_kurzbz); + $studiensemester = getData($result)[0]; + + if ($anrechnungstart < $studiensemester->start || $anrechnungstart > $studiensemester->ende) + { + $this->terminateWithJsonError($this->p->t('ui', 'errorStartdatumNichtInStudiensemester')); + } + + if ($anrechnungende < $studiensemester->start || $anrechnungende > $studiensemester->ende) + { + $this->terminateWithJsonError($this->p->t('ui', 'errorEndedatumNichtInStudiensemester')); + } + + + } + + /** + * 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'); + } +} \ No newline at end of file diff --git a/application/controllers/lehre/anrechnung/ApproveAnrechnungDetail.php b/application/controllers/lehre/anrechnung/ApproveAnrechnungDetail.php index 1f5c853db..3a62ff7d9 100644 --- a/application/controllers/lehre/anrechnung/ApproveAnrechnungDetail.php +++ b/application/controllers/lehre/anrechnung/ApproveAnrechnungDetail.php @@ -33,6 +33,9 @@ class approveAnrechnungDetail extends Auth_Controller ) ); + //Load configs + $this->load->config('anrechnung'); + // Load models $this->load->model('education/Anrechnung_model', 'AnrechnungModel'); $this->load->model('education/Anrechnungstatus_model', 'AnrechnungstatusModel'); @@ -90,7 +93,8 @@ class approveAnrechnungDetail extends Auth_Controller $antragData = $this->anrechnunglib->getAntragData( $anrechnungData->prestudent_id, $anrechnungData->studiensemester_kurzbz, - $anrechnungData->lehrveranstaltung_id + $anrechnungData->lehrveranstaltung_id, + $anrechnungData->anrechnung_id ); // Get Empfehlung data @@ -209,71 +213,64 @@ class approveAnrechnungDetail extends Auth_Controller */ public function requestRecommendation() { - $data = $this->input->post('data'); + $anrechnung_id = $this->input->post('anrechnung_id'); - if(isEmptyArray($data)) + if(isEmptyString($anrechnung_id)) { return $this->outputJsonError('Fehler beim Übertragen der Daten.'); } $retval = array(); - $counter = 0; + + // Check if Anrechnungs-LV has lector + if (!$this->anrechnunglib->LVhasLector($anrechnung_id)) + { + $this->terminateWithJsonError('LV has no lector'); + } - foreach ($data as $item) - { - // Check if Anrechnungs-LV has lector - if (!$this->anrechnunglib->LVhasLector($item['anrechnung_id'])) - { - // Count up LV with no lector - $counter++; + // Get Fachbereichsleitung or LV Leitung. + if($this->config->item('fbl') === TRUE) + { + $result = $this->anrechnunglib->getLeitungOfLvOe($anrechnung_id); + } + else + { + // If LV Leitung is not present, gets all LV lectors. + $result = $this->anrechnunglib->getLectors($anrechnung_id); + } - // Break, if LV has no lector - break; - } + $empfehlungsanfrage_an = !isEmptyArray($result) ? implode(', ', array_column($result, 'fullname')) : ''; - // Get full name of LV Leitung. - // If LV Leitung is not present, get full name of LV lectors. - $lector_arr = $this->anrechnunglib->getLectors($item['anrechnung_id']); - $empfehlungsanfrage_an = !isEmptyArray($lector_arr) - ? implode(', ', array_column($lector_arr, 'fullname')) - : ''; - - // Request Recommendation - if($this->anrechnunglib->requestRecommendation($item['anrechnung_id'])) - { - $retval[]= array( - 'anrechnung_id' => $item['anrechnung_id'], - 'status_kurzbz' => self::ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR, - 'status_bezeichnung' => $this->anrechnunglib->getStatusbezeichnung(self::ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR), - 'empfehlung_anrechnung' => null, - 'empfehlungsanfrageAm' => (new DateTime())->format('d.m.Y'), - 'empfehlungsanfrageAn' => $empfehlungsanfrage_an - ); - } - } - - /** - * Send mails to lectors - * NOTE: mails are sent at the end to ensure sending only ONE mail to each LV-Leitung or lector - * even if they are required for more recommendations - * */ - if (!isEmptyArray($retval)) - { - self::_sendSanchoMailToLectors($retval); - - // Output json to ajax - return $this->outputJsonSuccess($retval); - } + // Request Recommendation + if ($this->anrechnunglib->requestRecommendation($anrechnung_id)) + { + $retval[]= array( + 'anrechnung_id' => $anrechnung_id, + 'status_kurzbz' => self::ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR, + 'status_bezeichnung' => $this->anrechnunglib->getStatusbezeichnung(self::ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR), + 'empfehlung_anrechnung' => null, + 'empfehlungsanfrageAm' => (new DateTime())->format('d.m.Y'), + 'empfehlungsanfrageAn' => $empfehlungsanfrage_an + ); + } // Output json to ajax - if (isEmptyArray($retval) && $counter > 0) - { - return $this->outputJsonError( - "Empfehlung wurde nicht angefordert,\nDer LV sind keine LektorInnen zugeteilt." - ); - } + if ($empfehlungsanfrage_an == '') + { + $this->terminateWithJsonError( + "Empfehlung wurde nicht angefordert,\nDer LV sind keine LektorInnen zugeteilt." + ); + } - return $this->outputJsonError($this->p->t('ui', 'errorNichtAusgefuehrt')); + if (isEmptyArray($retval)) + { + $this->terminateWithJsonError("Empfehlung wurde nicht angefordert"); + } + else + { + // Output json to ajax + return $this->outputJsonSuccess($retval); + } } /** @@ -467,39 +464,33 @@ class approveAnrechnungDetail extends Auth_Controller /** * Send mail to lectors asking for recommendation. (first to LV-Leitung, if not present to all lectors of lv) - * @param $mail_params + * @param $anrechnung_id * @return bool */ - private function _sendSanchoMailToLectors($mail_params) + private function _sendSanchoMailToLectors($anrechnung_id) { - // Get Lehrveranstaltungen - $anrechnung_arr = array(); - - foreach ($mail_params as $item) - { - $this->AnrechnungModel->addSelect('lehrveranstaltung_id, studiensemester_kurzbz'); - $anrechnung_arr[]= array( - 'lehrveranstaltung_id' => $this->AnrechnungModel->load($item['anrechnung_id'])->retval[0]->lehrveranstaltung_id, - 'studiensemester_kurzbz' => $this->AnrechnungModel->load($item['anrechnung_id'])->retval[0]->studiensemester_kurzbz - ); - } - - $anrechnung_arr = array_unique($anrechnung_arr, SORT_REGULAR); - + $lehrveranstaltung_id = $this->AnrechnungModel->load($anrechnung_id)->retval[0]->lehrveranstaltung_id; + $studiensemester_kurzbz = $this->AnrechnungModel->load($anrechnung_id)->retval[0]->studiensemester_kurzbz; /** - * Get lectors (prio for LV-Leitung, if not present to all lectors of LV. + * Get mail receivers. + * If config is default (lectors): prio for LV-Leitung, if not present to all lectors of LV. * Anyway this function will receive a unique array to avoid sending more mails to one and the same lector. * **/ - $lector_arr = $this->_getLectors($anrechnung_arr); + if ($this->config->item('fbl') === TRUE) + { + $receiver_arr = $this->_getLeitungOfLvOe($lehrveranstaltung_id); + } + else + { + $receiver_arr = $this->_getLectors($studiensemester_kurzbz, $lehrveranstaltung_id); + } - - - // Send mail to lectors - foreach ($lector_arr as $lector) + // Send mail + foreach ($receiver_arr as $receiver) { - $to = $lector->uid; - $vorname = $lector->vorname; + $to = $receiver->uid. '@'. DOMAIN;; + $vorname = $receiver->vorname; // Get full name of stgl $this->load->model('person/Person_model', 'PersonModel'); @@ -537,35 +528,30 @@ class approveAnrechnungDetail extends Auth_Controller * @param $anrechnung_arr * @return array */ - private function _getLectors($anrechnung_arr) + private function _getLectors($studiensemester_kurzbz, $lehrveranstaltung_id) { $lector_arr = array(); - // Get lectors - foreach($anrechnung_arr as $anrechnung) - { - $this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel'); - $result = $this->LehrveranstaltungModel->getLecturersByLv($anrechnung['studiensemester_kurzbz'], $anrechnung['lehrveranstaltung_id']); + $result = $this->LehrveranstaltungModel->getLecturersByLv($studiensemester_kurzbz, $lehrveranstaltung_id); - if (!$result = getData($result)) - { - show_error('Failed retrieving lectors of Lehrveranstaltung'); - } + if (!$result = getData($result)) + { + show_error('Failed retrieving lectors of Lehrveranstaltung'); + } - // Check if lv has LV-Leitung - $key = array_search(true, array_column($result, 'lvleiter')); + // Check if lv has LV-Leitung + $key = array_search(true, array_column($result, 'lvleiter')); - // If lv has LV-Leitung, keep only the one - if ($key !== false) - { - $lector_arr[]= $result[$key]; - } - // ...otherwise keep all lectors - else - { - $lector_arr = array_merge($lector_arr, $result); - } - } + // If lv has LV-Leitung, keep only the one + if ($key !== false) + { + $lector_arr[]= $result[$key]; + } + // ...otherwise keep all lectors + else + { + $lector_arr = array_merge($lector_arr, $result); + } /** * NOTE: This step is only done to make the array unique by uid, vorname and nachname in the following step @@ -584,6 +570,14 @@ class approveAnrechnungDetail extends Auth_Controller } + // Get Leitungen of Lehrveranstaltungs-Organisationseinheit + private function _getLeitungOfLvOe($lehrveranstaltung_id) + { + $result = $this->LehrveranstaltungModel->getLeitungOfLvOe($lehrveranstaltung_id); + + return hasData($result) ? getData($result) : show_error('Failed retrieving Leitung of Lehrveranstaltungs-Organisationseinheit'); + } + private function _saveEmpfehlungsNotiz($anrechnung_id, $empfehlungstext, $notiz_id) { $this->load->model('person/Notiz_model', 'NotizModel'); @@ -606,8 +600,5 @@ class approveAnrechnungDetail extends Auth_Controller trim($empfehlungstext), $this->_uid ); - - } - } diff --git a/application/controllers/lehre/anrechnung/ApproveAnrechnungUebersicht.php b/application/controllers/lehre/anrechnung/ApproveAnrechnungUebersicht.php index 9eb0c9734..b5a44b8f6 100644 --- a/application/controllers/lehre/anrechnung/ApproveAnrechnungUebersicht.php +++ b/application/controllers/lehre/anrechnung/ApproveAnrechnungUebersicht.php @@ -28,6 +28,9 @@ class approveAnrechnungUebersicht extends Auth_Controller ) ); + // Load configs + $this->load->config('anrechnung'); + // Load models $this->load->model('education/Anrechnung_model', 'AnrechnungModel'); $this->load->model('education/Anrechnungstatus_model', 'AnrechnungstatusModel'); @@ -78,6 +81,19 @@ class approveAnrechnungUebersicht extends Auth_Controller show_error(getError($studiengang_kz_arr)); } + // Get oes the user is entitled for + $oe_kurzbz_arr_schreibberechtigt = array(); + if ($oe_arr = $this->permissionlib->getOE_isEntitledFor(self::BERECHTIGUNG_ANRECHNUNG_GENEHMIGEN)) + { + foreach($oe_arr as $oe) + { + $berechtigt = $this->permissionlib->isBerechtigt(self::BERECHTIGUNG_ANRECHNUNG_GENEHMIGEN, 'suid', $oe); + + if ($berechtigt) $oe_kurzbz_arr_schreibberechtigt[]= $oe; + } + } + + // Check if permission is readonly $hasReadOnlyAccess = $this->permissionlib->isBerechtigt(self::BERECHTIGUNG_ANRECHNUNG_GENEHMIGEN, 's') && !$this->permissionlib->isBerechtigt(self::BERECHTIGUNG_ANRECHNUNG_GENEHMIGEN, 'suid'); @@ -87,9 +103,11 @@ class approveAnrechnungUebersicht extends Auth_Controller $viewData = array( 'studiensemester_selected' => $studiensemester_kurzbz, - 'studiengaenge_entitled' => $studiengang_kz_arr, + 'studiengaenge_entitled' => $studiengang_kz_arr, // alle STG mit Lese- und Schreibberechtigung + 'oes_schreibberechtigt' => $oe_kurzbz_arr_schreibberechtigt, // alle STG nur mit Schreibberechtigung 'hasReadOnlyAccess' => $hasReadOnlyAccess, - 'hasCreateAnrechnungAccess' => $hasCreateAnrechnungAccess + 'hasCreateAnrechnungAccess' => $hasCreateAnrechnungAccess, + 'configFachbereichsleitung' => $this->config->item('fbl') ); $this->load->view('lehre/anrechnung/approveAnrechnungUebersicht.php', $viewData); @@ -207,14 +225,20 @@ class approveAnrechnungUebersicht extends Auth_Controller // Request Recommendation if($this->anrechnunglib->requestRecommendation($item['anrechnung_id'])) { - // Get full name of LV Leitung. - // If LV Leitung is not present, get full name of LV lectors. - $lector_arr = $this->anrechnunglib->getLectors($item['anrechnung_id']); - $empfehlungsanfrage_an = !isEmptyArray($lector_arr) - ? implode(', ', array_column($lector_arr, 'fullname')) - : ''; + // Get full name of Fachbereichsleitung or LV Leitung. + if($this->config->item('fbl') === TRUE) + { + $result = $this->anrechnunglib->getLeitungOfLvOe($item['anrechnung_id']); + } + else + { + // If LV Leitung is not present, get full name of LV lectors. + $result = $this->anrechnunglib->getLectors($item['anrechnung_id']); + } - $retval[]= array( + $empfehlungsanfrage_an = !isEmptyArray($result) ? implode(', ', array_column($result, 'fullname')) : ''; + + $retval[]= array( 'anrechnung_id' => $item['anrechnung_id'], 'status_kurzbz' => self::ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR, 'status_bezeichnung' => $this->anrechnunglib->getStatusbezeichnung(self::ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR), @@ -225,23 +249,18 @@ class approveAnrechnungUebersicht extends Auth_Controller } } - /** - * Send mails to lectors - * NOTE: mails are sent at the end to ensure sending only ONE mail to each LV-Leitung or lector - * even if they are required for more recommendations - * */ - if (!isEmptyArray($retval)) - { - self::_sendSanchoMailToLectors($retval); - } - // Output json to ajax - if (isEmptyArray($retval) && $counter == 0) + if (isEmptyArray($retval)) { - return $this->outputJsonError('Es wurden keine Empfehlungen angefordert'); + if ($counter > 0) + { + $this->terminateWithJsonError('Bei '. $counter.' LV sind keine LektorInnen zugeteilt.'); + } + + $this->terminateWithJsonError('Es wurden keine Empfehlungen angefordert'); } - return $this->outputJsonSuccess($retval); + $this->outputJsonSuccess($retval); } /** @@ -316,7 +335,7 @@ class approveAnrechnungUebersicht extends Auth_Controller * @param $mail_params * @return bool */ - private function _sendSanchoMailToLectors($mail_params) + private function _sendSanchoMail($mail_params) { // Get Lehrveranstaltungen $anrechnung_arr = array(); @@ -332,18 +351,25 @@ class approveAnrechnungUebersicht extends Auth_Controller $anrechnung_arr = array_unique($anrechnung_arr, SORT_REGULAR); - - /** - * Get lectors (prio for LV-Leitung, if not present to all lectors of LV. - * Anyway this function will receive a unique array to avoid sending more mails to one and the same lector. - * **/ - $lector_arr = $this->_getLectors($anrechnung_arr); + /** + * Get mail receivers. + * If retrieving lectors: prio for LV-Leitung, if not present to all lectors of LV. + * This function will receive a unique array to avoid sending more mails to one and the same user. + **/ + if($this->config->item('fbl') === TRUE) + { + $receiver_arr = $this->_getLeitungOfLvOe($anrechnung_arr); + } + else + { + $receiver_arr = $this->_getLectors($anrechnung_arr); + } // Send mail to lectors - foreach ($lector_arr as $lector) + foreach ($receiver_arr as $receiver) { - $to = $lector->uid; - $vorname = $lector->vorname; + $to = $receiver->uid. '@'. DOMAIN; + $vorname = $receiver->vorname; // Get full name of stgl $this->load->model('person/Person_model', 'PersonModel'); @@ -427,4 +453,34 @@ class approveAnrechnungUebersicht extends Auth_Controller return $lector_arr; } + + /** + * Get Leitungen of Lehrveranstaltungs-Organisationseinheit with unique uids. + * + * @param $anrechnung_arr + * @return array + */ + private function _getLeitungOfLvOe($anrechnung_arr) + { + $oeLeitung_arr = array(); + + // Get Leitungen + foreach($anrechnung_arr as $anrechnung) + { + $this->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel'); + $result = $this->LehrveranstaltungModel->getLeitungOfLvOe($anrechnung['lehrveranstaltung_id']); + + if (!hasData($result)) + { + show_error('No Leitung found'); + } + + $oeLeitung_arr = array_merge($oeLeitung_arr, getData($result)); + } + + // Make array unique + $oeLeitung_arr = array_unique($oeLeitung_arr, SORT_REGULAR); + + return $oeLeitung_arr; + } } diff --git a/application/controllers/lehre/anrechnung/RequestAnrechnung.php b/application/controllers/lehre/anrechnung/RequestAnrechnung.php index fbaac9b3e..3cba756cf 100644 --- a/application/controllers/lehre/anrechnung/RequestAnrechnung.php +++ b/application/controllers/lehre/anrechnung/RequestAnrechnung.php @@ -80,11 +80,7 @@ class requestAnrechnung extends Auth_Controller $prestudent_id = getData($result)[0]->prestudent_id; // Check if application deadline is expired - $is_expired = self::_isExpired( - $this->config->item('submit_application_start'), - $this->config->item('submit_application_end'), - $studiensemester_kurzbz - ); + $is_expired = $this->_isExpired($studiensemester_kurzbz); // Check if Lehrveranstaltung was already graded with application blocking grades $is_blocked = self::_LVhasBlockingGrades($studiensemester_kurzbz, $lehrveranstaltung_id); @@ -93,7 +89,7 @@ class requestAnrechnung extends Auth_Controller $anrechnungData = $this->anrechnunglib->getAnrechnungDataByLv($lehrveranstaltung_id, $studiensemester_kurzbz, $prestudent_id); // Get Antrag data - $antragData = $this->anrechnunglib->getAntragData($prestudent_id, $studiensemester_kurzbz, $lehrveranstaltung_id); + $antragData = $this->anrechnunglib->getAntragData($prestudent_id, $studiensemester_kurzbz, $lehrveranstaltung_id, $anrechnungData->anrechnung_id); $viewData = array( 'antragData' => $antragData, @@ -115,6 +111,8 @@ class requestAnrechnung extends Auth_Controller $lehrveranstaltung_id = $this->input->post('lv_id'); $studiensemester_kurzbz = $this->input->post('studiensemester'); $bestaetigung = $this->input->post('bestaetigung'); + $begruendung_ects = $this->input->post('begruendung_ects'); + $begruendung_lvinhalt = $this->input->post('begruendung_lvinhalt'); // Validate data if (empty($_FILES['uploadfile']['name'])) @@ -125,7 +123,9 @@ class requestAnrechnung extends Auth_Controller if (isEmptyString($begruendung_id) || isEmptyString($anmerkung) || isEmptyString($lehrveranstaltung_id) || - isEmptyString($studiensemester_kurzbz)) + isEmptyString($studiensemester_kurzbz) || + isEmptyString($begruendung_ects) || + isEmptyString($begruendung_lvinhalt)) { return $this->outputJsonError($this->p->t('ui', 'errorFelderFehlen')); } @@ -152,10 +152,10 @@ class requestAnrechnung extends Auth_Controller return $this->outputJsonError($this->p->t('anrechnung', 'antragBereitsGestellt')); } - // Exit if application is not for actual studysemester - if (!self::_applicationIsForActualSS($studiensemester_kurzbz)) + // Exit if application is a past ( < actual ) studysemester + if (self::_applicationIsPastSS($studiensemester_kurzbz)) { - return $this->outputJsonError($this->p->t('anrechnung', 'antragNurImAktSS')); + return $this->outputJsonError($this->p->t('anrechnung', 'antragNichtFuerVerganganeSS')); } // Upload document @@ -176,7 +176,9 @@ class requestAnrechnung extends Auth_Controller $lehrveranstaltung_id, $begruendung_id, $lastInsert_dms_id, - $anmerkung + $anmerkung, + $begruendung_ects, + $begruendung_lvinhalt ); if (isError($result)) @@ -234,32 +236,30 @@ class requestAnrechnung extends Auth_Controller * @return bool True if deadline is expired * @throws Exception */ - private function _isExpired($start, $ende, $studiensemester_kurzbz) + private function _isExpired($studiensemester_kurzbz) { - $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + $today = new DateTime('today midnight'); - // If start is not given, set to Semesterstart. - if (!isset($start) || isEmptyString($start)) - { - $this->StudiensemesterModel->addSelect('start'); - $result = $this->StudiensemesterModel->load($studiensemester_kurzbz); - $start = getData($result)[0]->start; - } + // Load all Anrechnungszeitfenster for this Studiensemester + $this->load->model('education/Anrechnungszeitraum_model', 'AnrechnungszeitraumModel'); + $result = $this->AnrechnungszeitraumModel->loadWhere(array('studiensemester_kurzbz' => $studiensemester_kurzbz)); - // If ende is not given, set to Semesterende. - if (!isset($ende) || isEmptyString($ende)) - { - $this->StudiensemesterModel->addSelect('ende'); - $result = $this->StudiensemesterModel->load($studiensemester_kurzbz); - $ende = getData($result)[0]->ende; - } + if (hasData($result)) + { + // Loop through Anrechnungszeitfenster + foreach (getData($result) as $azrObj) + { + $start = new DateTime($azrObj->anrechnungstart); + $ende = new DateTime($azrObj->anrechnungende); - $today = new DateTime('today midnight'); - $start = new DateTime($start); - $ende = new DateTime($ende); + // Return false if today is at least within one Anrechnungszeitraum + if (($today >= $start && $today <= $ende)) return false; - // True if expired - return ($today < $start || $today > $ende); + } + } + + // Return true if today is in none Anrechnungszeitraum + return true; } /** @@ -312,18 +312,21 @@ class requestAnrechnung extends Auth_Controller } /** - * Check if applications' study semester is actual study semester. + * Check if applications' study semester is < actual study semester. * * @param $studiensemester_kurzbz * @return bool */ - private function _applicationIsForActualSS($studiensemester_kurzbz) + private function _applicationIsPastSS($studiensemester_kurzbz) { $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); $result = $this->StudiensemesterModel->getNearest(); - $actual_ss = getData($result)[0]->studiensemester_kurzbz; + $actual_ss = getData($result)[0]; - return $studiensemester_kurzbz == $actual_ss; + $result = $this->StudiensemesterModel->load($studiensemester_kurzbz); + $anrechnung_ss = getData($result)[0]; + + return $anrechnung_ss->ende < $actual_ss->start; } private function _LVhasBlockingGrades($studiensemester_kurzbz, $lehrveranstaltung_id) diff --git a/application/controllers/lehre/anrechnung/ReviewAnrechnungDetail.php b/application/controllers/lehre/anrechnung/ReviewAnrechnungDetail.php index 1bd92004d..d141a0635 100644 --- a/application/controllers/lehre/anrechnung/ReviewAnrechnungDetail.php +++ b/application/controllers/lehre/anrechnung/ReviewAnrechnungDetail.php @@ -28,6 +28,9 @@ class reviewAnrechnungDetail extends Auth_Controller ) ); + // Load configs + $this->load->config('anrechnung'); + // Load models $this->load->model('education/Anrechnung_model', 'AnrechnungModel'); $this->load->model('education/Anrechnungstatus_model', 'AnrechnungstatusModel'); @@ -84,16 +87,21 @@ class reviewAnrechnungDetail extends Auth_Controller $antragData = $this->anrechnunglib->getAntragData( $anrechnungData->prestudent_id, $anrechnungData->studiensemester_kurzbz, - $anrechnungData->lehrveranstaltung_id + $anrechnungData->lehrveranstaltung_id, + $anrechnungData->anrechnung_id ); // Get Empfehlung data $empfehlungData = $this->anrechnunglib->getEmpfehlungData($anrechnung_id); + // False if LV-Leitung is present and user is not LV-Leitung. Otherwise always true. + $isEmpfehlungsberechtigt = $this->anrechnunglib->isEmpfehlungsberechtigt($anrechnung_id); + $viewData = array( 'antragData' => $antragData, 'anrechnungData' => $anrechnungData, - 'empfehlungData' => $empfehlungData + 'empfehlungData' => $empfehlungData, + 'isEmpfehlungsberechtigt' => $isEmpfehlungsberechtigt ); $this->load->view('lehre/anrechnung/reviewAnrechnungDetail.php', $viewData); @@ -140,10 +148,13 @@ class reviewAnrechnungDetail extends Auth_Controller * Send mails to STGL (if not present STGL, send to STGL assistance) * NOTE: mails are sent at the end to ensure sending only one mail to each STGL * */ - if (!$this->_sendSanchoMails($json, true)) - { - return $this->outputJsonError('Failed sending emails'); - } + if ($this->config->item('send_mail') === TRUE) + { + if (!$this->_sendSanchoMails($json, true)) + { + return $this->outputJsonError('Failed sending emails'); + } + } return $this->outputJsonSuccess($json); } @@ -191,10 +202,13 @@ class reviewAnrechnungDetail extends Auth_Controller if (isset($json) && !isEmptyArray($json)) { // Send mails to STGL (if not present STGL, send to STGL assistance) - if (!$this->_sendSanchoMails($json, false)) - { - return $this->outputJsonError('Failed sending emails'); - } + if ($this->config->item('send_mail') === TRUE) + { + if (!$this->_sendSanchoMails($json, false)) + { + return $this->outputJsonError('Failed sending emails'); + } + } return $this->outputJsonSuccess($json); } @@ -253,8 +267,14 @@ class reviewAnrechnungDetail extends Auth_Controller show_error('Failed retrieving Anrechnung'); } - $result = $this->LehrveranstaltungModel - ->getLecturersByLv($result->studiensemester_kurzbz, $result->lehrveranstaltung_id); + if($this->config->item('fbl') === TRUE) + { + $result = $this->LehrveranstaltungModel->getLeitungOfLvOe($result->lehrveranstaltung_id); + } + else + { + $result = $this->LehrveranstaltungModel->getLecturersByLv($result->studiensemester_kurzbz, $result->lehrveranstaltung_id); + } if($result = getData($result)) { @@ -282,14 +302,20 @@ class reviewAnrechnungDetail extends Auth_Controller show_error('Failed retrieving Anrechnung'); } - $result = $this->LehrveranstaltungModel - ->getLecturersByLv($result->studiensemester_kurzbz, $result->lehrveranstaltung_id); + if($this->config->item('fbl') === TRUE) + { + $result = $this->LehrveranstaltungModel->getLeitungOfLvOe($result->lehrveranstaltung_id); + } + else + { + $result = $this->LehrveranstaltungModel->getLecturersByLv($result->studiensemester_kurzbz, $result->lehrveranstaltung_id); + } if($result = getData($result)) { - $entitled_lector_arr = array_column($result, 'uid'); + $entitled_uid_arr = array_column($result, 'uid'); - if (in_array($this->_uid, $entitled_lector_arr)) + if (in_array($this->_uid, $entitled_uid_arr)) { return; } diff --git a/application/controllers/lehre/anrechnung/ReviewAnrechnungUebersicht.php b/application/controllers/lehre/anrechnung/ReviewAnrechnungUebersicht.php index c63d0af69..6d4107936 100644 --- a/application/controllers/lehre/anrechnung/ReviewAnrechnungUebersicht.php +++ b/application/controllers/lehre/anrechnung/ReviewAnrechnungUebersicht.php @@ -26,6 +26,9 @@ class reviewAnrechnungUebersicht extends Auth_Controller ) ); + // Load configs + $this->load->config('anrechnung'); + // Load models $this->load->model('education/Anrechnung_model', 'AnrechnungModel'); $this->load->model('education/Anrechnungstatus_model', 'AnrechnungstatusModel'); @@ -72,7 +75,8 @@ class reviewAnrechnungUebersicht extends Auth_Controller } $viewData = array( - 'studiensemester_selected' => $studiensemester_kurzbz + 'studiensemester_selected' => $studiensemester_kurzbz, + 'configFachbereichsleitung' => $this->config->item('fbl') ); $this->load->view('lehre/anrechnung/reviewAnrechnungUebersicht.php', $viewData); @@ -111,16 +115,19 @@ class reviewAnrechnungUebersicht extends Auth_Controller * Send mails to STGL (if not present STGL, send to STGL assistance) * NOTE: mails are sent at the end to ensure sending only one mail to each STGL * */ - if (!$this->_sendSanchoMails($json, true)) - { - show_error('Failed sending emails'); - } + if ($this->config->item('send_mail') === TRUE) + { + if (!$this->_sendSanchoMails($json, true)) + { + show_error('Failed sending emails'); + } + } return $this->outputJsonSuccess($json); } else { - return $this->outputJsonError($this->p->t('ui', 'errorNichtAusgefuehrt')); + $this->terminateWithJsonError($this->p->t('ui', 'errorNichtAusgefuehrt')); } } @@ -154,10 +161,13 @@ class reviewAnrechnungUebersicht extends Auth_Controller if (isset($json) && !isEmptyArray($json)) { // Send mails to STGL (if not present STGL, send to STGL assistance) - if (!$this->_sendSanchoMails($json, false)) - { - show_error('Failed sending emails'); - } + if ($this->config->item('send_mail') === TRUE) + { + if (!$this->_sendSanchoMails($json, false)) + { + show_error('Failed sending emails'); + } + } return $this->outputJsonSuccess($json); } @@ -217,14 +227,20 @@ class reviewAnrechnungUebersicht extends Auth_Controller show_error('Failed retrieving Anrechnung'); } - $result = $this->LehrveranstaltungModel - ->getLecturersByLv($result->studiensemester_kurzbz, $result->lehrveranstaltung_id); + if ($this->config->item('fbl') === TRUE) + { + $result = $this->LehrveranstaltungModel->getLeitungOfLvOe($result->lehrveranstaltung_id); + } + else + { + $result = $this->LehrveranstaltungModel->getLecturersByLv($result->studiensemester_kurzbz, $result->lehrveranstaltung_id); + } if($result = getData($result)) { - $entitled_lector_arr = array_column($result, 'uid'); + $entitled_uid_arr = array_column($result, 'uid'); - if (in_array($this->_uid, $entitled_lector_arr)) + if (in_array($this->_uid, $entitled_uid_arr)) { return; } diff --git a/application/controllers/system/infocenter/InfoCenter.php b/application/controllers/system/infocenter/InfoCenter.php index d027e559e..cf0c6755a 100644 --- a/application/controllers/system/infocenter/InfoCenter.php +++ b/application/controllers/system/infocenter/InfoCenter.php @@ -21,6 +21,7 @@ class InfoCenter extends Auth_Controller const FREIGEGEBEN_PAGE = 'freigegeben'; const REIHUNGSTESTABSOLVIERT_PAGE = 'reihungstestAbsolviert'; const ABGEWIESEN_PAGE = 'abgewiesen'; + const AUFGENOMMEN_PAGE = 'aufgenommen'; const SHOW_DETAILS_PAGE = 'showDetails'; const SHOW_ZGV_DETAILS_PAGE = 'showZGVDetails'; const ZGV_UBERPRUEFUNG_PAGE = 'ZGVUeberpruefung'; @@ -115,6 +116,7 @@ class InfoCenter extends Auth_Controller 'index' => 'infocenter:r', 'freigegeben' => 'infocenter:r', 'abgewiesen' => 'infocenter:r', + 'aufgenommen' => 'infocenter:r', 'reihungstestAbsolviert' => 'infocenter:r', 'showDetails' => 'infocenter:r', 'showZGVDetails' => 'lehre/zgvpruefung:r', @@ -142,12 +144,6 @@ class InfoCenter extends Auth_Controller 'reloadNotizen' => array('infocenter:r', 'lehre/zgvpruefung:r'), 'reloadLogs' => 'infocenter:r', 'outputAkteContent' => array('infocenter:r', 'lehre/zgvpruefung:r'), - 'getPostponeDate' => array('infocenter:r', 'lehre/zgvpruefung:r'), - 'park' => 'infocenter:rw', - 'unpark' => 'infocenter:rw', - 'setOnHold' => 'infocenter:rw', - 'removeOnHold' => array('infocenter:rw', 'lehre/zgvpruefung:rw'), - 'getStudienjahrEnd' => array('infocenter:r', 'lehre/zgvpruefung:r'), 'setNavigationMenuArrayJson' => 'infocenter:r', 'getAbsageData' => 'infocenter:r', 'saveAbsageForAll' => 'infocenter:rw', @@ -164,6 +160,7 @@ class InfoCenter extends Auth_Controller $this->load->model('crm/Statusgrund_model', 'StatusgrundModel'); $this->load->model('crm/ZGVPruefung_model', 'ZGVPruefungModel'); $this->load->model('crm/ZGVPruefungStatus_model', 'ZGVPruefungStatusModel'); + $this->load->model('crm/Rueckstellung_model', 'RueckstellungModel'); $this->load->model('person/Notiz_model', 'NotizModel'); $this->load->model('person/Person_model', 'PersonModel'); $this->load->model('system/Message_model', 'MessageModel'); @@ -233,6 +230,16 @@ class InfoCenter extends Auth_Controller $this->load->view('system/infocenter/infocenterAbgewiesen.php'); } + + /** + * Aufgenommene page of the InfoCenter tool + */ + public function aufgenommen() + { + $this->_setNavigationMenu(self::AUFGENOMMEN_PAGE); // define the navigation menu for this page + + $this->load->view('system/infocenter/infocenterAufgenommen.php'); + } /** * @@ -319,7 +326,7 @@ class InfoCenter extends Auth_Controller show_error('Person does not exist!'); $origin_page = $this->input->get(self::ORIGIN_PAGE); - if ($origin_page == self::INDEX_PAGE) + if (in_array($origin_page, array(self::INDEX_PAGE, self::ABGEWIESEN_PAGE))) { // mark person as locked for editing $result = $this->PersonLockModel->lockPerson($person_id, $this->_uid, self::APP); @@ -364,7 +371,14 @@ class InfoCenter extends Auth_Controller if (isError($result)) show_error(getError($result)); - $redirectLink = '/'.self::INFOCENTER_URI.'?'.self::FHC_CONTROLLER_ID.'='.$this->getControllerId(); + $origin_page = $this->input->get(self::ORIGIN_PAGE); + + if ($origin_page === self::ABGEWIESEN_PAGE) + $redirectLink = self::INFOCENTER_URI. '/' .self::ABGEWIESEN_PAGE; + else + $redirectLink = '/'.self::INFOCENTER_URI; + + $redirectLink .= '?'.self::FHC_CONTROLLER_ID.'='.$this->getControllerId(); // Force reload of Dataset after Unlock $redirectLink .= '&'.self::KEEP_TABLESORTER_FILTER.'=true'; @@ -606,7 +620,7 @@ class InfoCenter extends Auth_Controller } /** - * Sendet bei einer neuen ZGV Prüfung die Mail raus an den Studiengang + * Sendet bei einer neuen ZGV Prüfung eine Mail an den Studiengang */ private function sendZgvMail($mail, $typ, $person){ $data = array( @@ -697,7 +711,7 @@ class InfoCenter extends Auth_Controller /** * Fügt einen neuen ZGV Status hinzu oder updated einen bestehenden - * Falls es erfolgreich war, sendet er die Mail raus + * Falls es erfolgreich war, wird eine Mail rausgeschickt */ public function zgvRueckfragen() { @@ -751,7 +765,8 @@ class InfoCenter extends Auth_Controller $this->sendZgvMail($mail, $typ, $person); elseif (isError($insert)) $this->terminateWithJsonError('Fehler beim Speichern'); - }else + } + else { $insert = $this->ZGVPruefungModel->insert( array( @@ -781,7 +796,7 @@ class InfoCenter extends Auth_Controller } $hold = false; - if ($this->personloglib->getOnHoldDate($person_id) !== null) + if (hasData($this->RueckstellungModel->getByPersonId($person_id, 'onhold_zgv'))) $hold = true; $this->outputJsonSuccess( @@ -1162,107 +1177,7 @@ class InfoCenter extends Auth_Controller ->set_output($aktecontent->retval) ->_display(); } - - /** - * Gets the date until which a person is parked - * @param $person_id - */ - public function getPostponeDate($person_id) - { - $result = array( - 'type' => null, - 'date' => null - ); - - $parkedDate = $this->personloglib->getParkedDate($person_id); - - if (isset($parkedDate)) - { - $result['type'] = 'parked'; - $result['date'] = $parkedDate; - } - else - { - $onholdDate = $this->personloglib->getOnHoldDate($person_id); - - if (isset($onholdDate)) - { - $result['type'] = 'onhold'; - $result['date'] = $onholdDate; - } - } - - $this->outputJsonSuccess($result); - } - - /** - * Initializes parking of a person, i.e. a person is not expected to do any actions while parked - */ - public function park() - { - $person_id = $this->input->post('person_id'); - $date = $this->input->post('parkdate'); - - $result = $this->personloglib->park($person_id, date_format(date_create($date), 'Y-m-d'), self::TAETIGKEIT, self::APP, null, $this->_uid); - - $this->outputJson($result); - } - - /** - * Removes parking of a person - */ - public function unPark() - { - $person_id = $this->input->post('person_id'); - - $result = $this->personloglib->unPark($person_id); - - $this->outputJson($result); - } - - /** - * Sets a person on hold ("zurückstellen") - */ - public function setOnHold() - { - $person_id = $this->input->post('person_id'); - $date = $this->input->post('onholddate'); - - $result = $this->personloglib->setOnHold($person_id, date_format(date_create($date), 'Y-m-d'), self::TAETIGKEIT, self::APP, null, $this->_uid); - - $this->outputJson($result); - } - - /** - * Removed on hold status of a person - */ - public function removeOnHold() - { - $person_id = $this->input->post('person_id'); - - $result = $this->personloglib->removeOnHold($person_id); - - $this->outputJson($result); - } - - /** - * Gets the End date of the current Studienjahr - */ - public function getStudienjahrEnd() - { - $this->load->model('organisation/studienjahr_model', 'StudienjahrModel'); - - $result = $this->StudienjahrModel->getCurrStudienjahr(); - - $json = null; - - if (hasData($result)) - { - $json = $result->retval[0]->ende; - } - - $this->outputJsonSuccess(array($json)); - } + /** * Wrapper for setNavigationMenu, returns JSON message @@ -1484,7 +1399,6 @@ class InfoCenter extends Auth_Controller if($nachreichungAm < $today) $this->terminateWithJsonError($this->p->t('infocenter', 'nachreichDatumNichtVergangenheit')); - $akte = $this->AkteModel->loadWhere(array('person_id' => $person_id, 'dokument_kurzbz' => $allowedTypes[$typ])); if (hasData($akte)) { @@ -1631,6 +1545,7 @@ class InfoCenter extends Auth_Controller $freigegebenLink = site_url(self::INFOCENTER_URI.'/'.self::FREIGEGEBEN_PAGE); $reihungstestAbsolviertLink = site_url(self::INFOCENTER_URI.'/'.self::REIHUNGSTESTABSOLVIERT_PAGE); $abgewiesenLink = site_url(self::INFOCENTER_URI.'/'.self::ABGEWIESEN_PAGE); + $aufgenommenLink = site_url(self::INFOCENTER_URI.'/'.self::AUFGENOMMEN_PAGE); $currentFilterId = $this->input->get(self::FILTER_ID); if (isset($currentFilterId)) @@ -1638,6 +1553,7 @@ class InfoCenter extends Auth_Controller $freigegebenLink .= '?'.self::PREV_FILTER_ID.'='.$currentFilterId; $reihungstestAbsolviertLink .= '?'.self::PREV_FILTER_ID.'='.$currentFilterId; $abgewiesenLink .= '?'.self::PREV_FILTER_ID.'='.$currentFilterId; + $aufgenommenLink .= '?'.self::PREV_FILTER_ID.'='.$currentFilterId; } $this->navigationlib->setSessionMenu( @@ -1688,7 +1604,19 @@ class InfoCenter extends Auth_Controller null, // subscriptLinkValue '', // target 30 // sort - ) + ), + 'aufgenommen' => $this->navigationlib->oneLevel( + 'Aufgenommene', // description + $aufgenommenLink, // link + null, // children + 'check', // icon + null, // subscriptDescription + false, // expand + null, // subscriptLinkClass + null, // subscriptLinkValue + '', // target + 40 // sort + ), ) ); } @@ -1716,6 +1644,9 @@ class InfoCenter extends Auth_Controller if ($origin_page === self::ABGEWIESEN_PAGE) $link = site_url(self::INFOCENTER_URI.'/'.self::ABGEWIESEN_PAGE); + if ($origin_page === self::AUFGENOMMEN_PAGE) + $link = site_url(self::INFOCENTER_URI.'/'.self::AUFGENOMMEN_PAGE); + $prevFilterId = $this->input->get(self::PREV_FILTER_ID); if (isset($prevFilterId)) { diff --git a/application/controllers/system/infocenter/Rueckstellung.php b/application/controllers/system/infocenter/Rueckstellung.php new file mode 100644 index 000000000..62af633ca --- /dev/null +++ b/application/controllers/system/infocenter/Rueckstellung.php @@ -0,0 +1,135 @@ + array('infocenter:r', 'lehre/zgvpruefung:r'), + 'set' => array('infocenter:r', 'lehre/zgvpruefung:r'), + 'delete' => array('infocenter:r', 'lehre/zgvpruefung:r'), + 'getStatus' => array('infocenter:rw', 'lehre/zgvpruefung:rw') + ) + ); + + $this->load->model('crm/Rueckstellung_model', 'RueckstellungModel'); + $this->load->model('crm/RueckstellungStatus_model', 'RueckstellungStatusModel'); + $this->load->model('person/Person_model', 'PersonModel'); + $this->load->library('PersonLogLib'); + + $this->_setAuthUID(); // sets property uid + + $this->_ci =& get_instance(); // get code igniter instance + } + + public function get($person_id) + { + $result = null; + $rueckstellung = $this->_ci->RueckstellungModel->getByPersonId($person_id); + + if (isError($rueckstellung)) + $this->terminateWithJsonError($this->_ci->p->t('ui', 'fehlerBeimLesen')); + + if (hasData($rueckstellung)) + { + $rueckstellung = getData($rueckstellung)[0]; + $fullName = getData($this->_ci->PersonModel->getFullName($rueckstellung->insertvon)); + + $result = array( + 'von' => $fullName, + 'bezeichnung' => $rueckstellung->bezeichnung, + 'bis' => $rueckstellung->datum_bis, + 'status_kurzbz' => $rueckstellung->status_kurzbz + ); + + if ($rueckstellung->status_kurzbz === 'parked' && $rueckstellung->datum_bis < date('Y-m-d')) + { + $this->_ci->RueckstellungModel->delete(array('person_id' => $person_id, 'status_kurzbz' => 'parked')); + $result = null; + } + } + + $this->outputJsonSuccess($result); + } + + public function set() + { + $person_id = $this->input->post('person_id'); + $datum_bis = $this->input->post('datum_bis'); + $status_kurzbz = $this->input->post('status_kurzbz'); + + $result = $this->_ci->RueckstellungModel->insert( + array('person_id' => $person_id, + 'status_kurzbz' => $status_kurzbz, + 'datum_bis' => date_format(date_create($datum_bis), 'Y-m-d'), + 'insertvon' => $this->_uid + ) + ); + + if (isError($result)) + $this->terminateWithJsonError(getError($result)); + + $this->_log($person_id, $status_kurzbz); + + $this->outputJson($result); + } + + public function delete() + { + $person_id = $this->input->post('person_id'); + $status = $this->input->post('status'); + + $result = $this->_ci->RueckstellungModel->delete(array('person_id' => $person_id, 'status_kurzbz' => $status)); + + if (isError($result)) + $this->terminateWithJsonError($this->_ci->p->t('ui', 'fehlerBeimSpeichern')); + + $this->outputJson($result); + } + + public function getStatus($aktiv = true) + { + $this->_ci->RueckstellungStatusModel->addOrder('sort'); + $result = $this->_ci->RueckstellungStatusModel->loadWhere(array('aktiv' => $aktiv)); + + if (isError($result)) + $this->terminateWithJsonError($this->_ci->p->t('ui', 'fehlerBeimLesen')); + + $this->outputJsonSuccess(getData($result)); + } + + /** + * 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 _log($person_id, $status_kurzbz) + { + $message = "Person $person_id set to $status_kurzbz"; + + $this->_ci->personloglib->log( + $person_id, + 'Action', + array( + 'name' => 'Person status set', + 'message' => $message, + 'success' => true + ), + 'bewerbung', + 'infocenter', + null, + $this->_uid + ); + } +} \ No newline at end of file diff --git a/application/controllers/system/issues/Issues.php b/application/controllers/system/issues/Issues.php index 6d959a024..44c2ff5d3 100644 --- a/application/controllers/system/issues/Issues.php +++ b/application/controllers/system/issues/Issues.php @@ -26,6 +26,7 @@ class Issues extends Auth_Controller // Load models $this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel'); $this->load->model('organisation/Organisationseinheit_model', 'OrganisationseinheitModel'); + $this->load->model('system/Sprache_model', 'SpracheModel'); $this->loadPhrases( array( @@ -45,10 +46,11 @@ class Issues extends Auth_Controller public function index() { $oes_for_issues = $this->_getOesForIssues(); + $language_index = $this->_getLanguageIndex(); $this->load->view( 'system/issues/issues', - $oes_for_issues + array_merge($oes_for_issues, array('language_index' => $language_index)) ); } @@ -166,4 +168,28 @@ class Issues extends Auth_Controller 'all_oe_kurzbz_berechtigt' => $all_oe_kurzbz_berechtigt ); } + + /** + * Gets language index of currently logged in user. + * @return object int (the index, start at 1) + */ + private function _getLanguageIndex() + { + $idx = 1; + $this->SpracheModel->addSelect('sprache, index'); + $langRes = $this->SpracheModel->load(); + + if (hasData($langRes)) + { + $userLang = getUserLanguage(); + $lang = getData($langRes); + + foreach ($lang as $l) + { + if ($l->sprache == $userLang) $idx = $l->index; + } + } + + return $idx; + } } diff --git a/application/controllers/system/issues/IssuesKonfiguration.php b/application/controllers/system/issues/IssuesKonfiguration.php new file mode 100644 index 000000000..a19a2a93b --- /dev/null +++ b/application/controllers/system/issues/IssuesKonfiguration.php @@ -0,0 +1,305 @@ + 'admin:r', + 'getApps' => 'admin:r', + 'getFehlerKonfigurationByApp' => 'admin:r', + 'saveFehlerKonfiguration' => 'admin:rw', + 'deleteKonfiguration' => 'admin:rw', + 'deleteKonfigurationsWerte' => 'admin:rw' + ) + ); + + // Load libraries + $this->load->library('IssuesLib'); + $this->load->library('WidgetLib'); + + // Load models + $this->load->model('system/Fehlerkonfigurationstyp_model', 'FehlerkonfigurationstypModel'); + $this->load->model('system/Fehlerkonfiguration_model', 'FehlerkonfigurationModel'); + + $this->loadPhrases( + array( + 'global', + 'ui', + 'filter', + 'fehlermonitoring' + ) + ); + + $this->_setAuthUID(); // sets property uid + $this->setControllerId(); // sets the controller id + } + + // ----------------------------------------------------------------------------------------------------------------- + // Public methods + + /** + * Load initial view. + */ + public function index() + { + $this->load->view("system/issues/issuesKonfiguration.php"); + } + + /** + * Loads all Apps to which Fehler exist. + */ + public function getApps() + { + $this->FehlerModel->addDistinct(); + $this->FehlerModel->addSelect('app'); + $this->FehlerModel->addJoin('system.tbl_fehler_konfigurationstyp', 'app'); + $this->FehlerModel->addOrder('app'); + + $appRes = $this->FehlerModel->load(); + + $this->outputJson($appRes); + } + + /** + * Gets all fehlercodes, optionally by app. + */ + public function getFehlerKonfigurationByApp() + { + $app = $this->input->get('app'); + + // get all Konfiguration types, optionally filtered by app + $this->FehlerkonfigurationstypModel->addSelect('konfigurationstyp_kurzbz, konfigurationsdatentyp, beschreibung'); + $this->FehlerkonfigurationstypModel->addOrder('konfigurationstyp_kurzbz'); + $konfRes = isEmptyString($app) + ? $this->FehlerkonfigurationstypModel->load() + : $this->FehlerkonfigurationstypModel->loadWhere(array('app' => $app)); + + if (isError($konfRes)) $this->terminateWithJsonError($this->p->t('fehlermonitoring', 'fehlerFehlerKonfigurationLaden')); + + // get all Fehler, optionally filtered by app + $params = array('fehlercode_extern' => null); + $this->FehlerModel->addSelect('fehlercode, fehler_kurzbz, fehlertyp_kurzbz, fehlertext'); + $this->FehlerModel->addOrder('fehlercode'); + if (!isEmptyString($app)) $params['app'] = $app; + $fehlerRes = $this->FehlerModel->loadWhere($params); + + if (isError($fehlerRes)) $this->terminateWithJsonError($this->p->t('fehlermonitoring', 'fehlerFehlerLaden')); + + // return object with retrieved data + $konfObj = new StdClass(); + $konfObj->konfigurationstypen = array(); + $konfObj->fehler = array(); + + if (hasData($konfRes)) $konfObj->konfigurationstypen = getData($konfRes); + if (hasData($fehlerRes)) $konfObj->fehler = getData($fehlerRes); + + $this->outputJsonSuccess($konfObj); + } + + /** + * Saves a Fehler configuration, inserts new configuration or updates existing. + * Checks if datatype of passed configuration is correct. + */ + public function saveFehlerKonfiguration() + { + $result = null; + $konfigurationstyp_kurzbz = $this->input->post('konfigurationstyp_kurzbz'); + $fehlercode = $this->input->post('fehlercode'); + $konfigurationsWert = $this->input->post('konfigurationsWert'); + + // check if all params passed + if (isEmptyString($konfigurationstyp_kurzbz)) $this->terminateWithJsonError($this->p->t('fehlermonitoring', 'ungueltigerKonfigurationstyp')); + + if (isEmptyString($fehlercode)) $this->terminateWithJsonError($this->p->t('fehlermonitoring', 'fehlercodeFehlt')); + + // separate by semicolon if multiple values passed + $konfigurationsWert = explode(';', $konfigurationsWert); + + // check konfigurationswert + + // get the expected data type + $dataType = self::STRING_DATA_TYPE; + $this->FehlerkonfigurationstypModel->addSelect('konfigurationsdatentyp'); + $konfigtypRes = $this->FehlerkonfigurationstypModel->loadWhere(array('konfigurationstyp_kurzbz' => $konfigurationstyp_kurzbz)); + + if (hasData($konfigtypRes)) + { + $konfigurationsdatentyp = getData($konfigtypRes)[0]->konfigurationsdatentyp; + foreach ($konfigurationsWert as $idx => $konfWert) + { + // check if data type correct + $valid = false; + switch ($konfigurationsdatentyp) + { + case self::INTEGER_DATA_TYPE: + $valid = (string)(int)$konfWert == $konfWert; + $konfigurationsWert[$idx] = (int) $konfWert; + break; + case self::FLOAT_DATA_TYPE: + $valid = (string)(float)$konfWert == $konfWert; + $konfigurationsWert[$idx] = (float) $konfWert; + break; + default: + $valid = is_string($konfWert) && preg_match('/^[A-Za-z0-9_]+$/', $konfWert); + } + if (!$valid) $this->terminateWithJsonError($this->p->t('fehlermonitoring', 'ungueltigerKonfigurationswert', array($konfigurationsdatentyp))); + } + } + + // check if konfiguration already set for the fehlercode + $this->FehlerkonfigurationModel->addSelect('konfiguration'); + $fehlerkonfigurationRes = $this->FehlerkonfigurationModel->loadWhere( + array( + 'konfigurationstyp_kurzbz' => $konfigurationstyp_kurzbz, + 'fehlercode' => $fehlercode + ) + ); + + if (isError($fehlerkonfigurationRes)) $this->terminateWithJsonError($this->p->t('fehlermonitoring', 'fehlerFehlerKonfigurationLaden')); + + // if konfiguration exists, update by add konfiguration values to existing + if (hasData($fehlerkonfigurationRes)) + { + $fehlerkonfiguration = getData($fehlerkonfigurationRes); + + $existingKonf = json_decode($fehlerkonfiguration[0]->konfiguration); + + if (!$existingKonf) $this->terminateWithJsonError($this->p->t('fehlermonitoring', 'fehlerJsonDekodierung')); + + if (!is_array($existingKonf)) $existingKonf = array($existingKonf); + + $newKonf = json_encode(array_values(array_unique(array_merge($existingKonf, $konfigurationsWert)))); + if (!$newKonf) $this->terminateWithJsonError("error when encoding JSON"); + + $result = $this->FehlerkonfigurationModel->update( + array('konfigurationstyp_kurzbz' => $konfigurationstyp_kurzbz, 'fehlercode' => $fehlercode), + array('konfiguration' => $newKonf, 'updateamum' => 'NOW()', 'updatevon' => $this->_uid) + ); + } + else // if no konfiguration exists, add new konfiguration entry + { + $newKonf = json_encode($konfigurationsWert); + if (!$newKonf) $this->terminateWithJsonError("error when encoding JSON"); + + $result = $this->FehlerkonfigurationModel->insert( + array( + 'konfigurationstyp_kurzbz' => $konfigurationstyp_kurzbz, + 'fehlercode' => $fehlercode, + 'konfiguration' => $newKonf, + 'insertvon' => $this->_uid + ) + ); + } + + // output result (insert or update) + $this->outputJson($result); + } + + /** + * Deletes values of a Konfiguration. + */ + public function deleteKonfigurationsWerte() + { + $konfigurationstyp_kurzbz = $this->input->post('konfigurationstyp_kurzbz'); + $fehlercode = $this->input->post('fehlercode'); + $konfigurationsWert = $this->input->post('konfigurationsWert'); + + // check if Konfigurationstyp correctly passed + if (isEmptyString($konfigurationstyp_kurzbz)) $this->terminateWithJsonError($this->p->t('fehlermonitoring', 'ungueltigerKonfigurationstyp')); + + // check if fehlercode correctly passed + if (isEmptyString($fehlercode)) $this->terminateWithJsonError($this->p->t('fehlermonitoring', 'fehlercodeFehlt')); + + // separate by semicolon if multiple values passed + $konfigurationsWert = explode(';', $konfigurationsWert); + + // check if konfiguration already set for the fehlercode + $this->FehlerkonfigurationModel->addSelect('konfiguration'); + $fehlerkonfigurationRes = $this->FehlerkonfigurationModel->loadWhere( + array( + 'konfigurationstyp_kurzbz' => $konfigurationstyp_kurzbz, + 'fehlercode' => $fehlercode + ) + ); + + if (!hasData($fehlerkonfigurationRes)) $this->terminateWithJsonError($this->p->t('fehlermonitoring', 'fehlerFehlerKonfigurationLaden')); + + // if konfiguration exists, update values + if (hasData($fehlerkonfigurationRes)) + { + $fehlerkonfiguration = getData($fehlerkonfigurationRes); + + $existingKonf = json_decode($fehlerkonfiguration[0]->konfiguration); + + if (!$existingKonf) $this->terminateWithJsonError($this->p->t('fehlermonitoring', 'fehlerJsonDekodierung')); + + if (!is_array($existingKonf)) $existingKonf = array($existingKonf); + + $newKonfArr = array_values(array_diff($existingKonf, $konfigurationsWert)); + + // if no konfiguration values left, delete whole entry + if (isEmptyArray($newKonfArr)) + { + $this->outputJson( + $this->FehlerkonfigurationModel->delete( + array('konfigurationstyp_kurzbz' => $konfigurationstyp_kurzbz, 'fehlercode' => $fehlercode) + ) + ); + } + else + { + $newKonf = json_encode($newKonfArr); + if (!$newKonf) $this->terminateWithJsonError("error when encoding JSON"); + + // if there are still values, delete only part of the konfiguration + $this->outputJson( + $this->FehlerkonfigurationModel->update( + array('konfigurationstyp_kurzbz' => $konfigurationstyp_kurzbz, 'fehlercode' => $fehlercode), + array('konfiguration' => $newKonf, 'updateamum' => 'NOW()', 'updatevon' => $this->_uid) + ) + ); + } + } + } + + /** + * Deletes a Konfiguration. + */ + public function deleteKonfiguration() + { + $konfigurationstyp_kurzbz = $this->input->post('konfigurationstyp_kurzbz'); + $fehlercode = $this->input->post('fehlercode'); + + // check if Konfigurationstyp correctly passed + if (isEmptyString($konfigurationstyp_kurzbz)) $this->terminateWithJsonError($this->p->t('fehlermonitoring', 'ungueltigerKonfigurationstyp')); + + // check if fehlercode correctly passed + if (isEmptyString($fehlercode)) $this->terminateWithJsonError($this->p->t('fehlermonitoring', 'fehlercodeFehlt')); + + $this->outputJson( + $this->FehlerkonfigurationModel->delete( + array('konfigurationstyp_kurzbz' => $konfigurationstyp_kurzbz, 'fehlercode' => $fehlercode) + ) + ); + } + + /** + * 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/issues/IssuesZustaendigkeiten.php b/application/controllers/system/issues/IssuesZustaendigkeiten.php index fd3e6192a..d7bf9836e 100644 --- a/application/controllers/system/issues/IssuesZustaendigkeiten.php +++ b/application/controllers/system/issues/IssuesZustaendigkeiten.php @@ -26,7 +26,6 @@ class IssuesZustaendigkeiten extends Auth_Controller // Load models $this->load->model('organisation/Organisationseinheit_model', 'OrganisationseinheitModel'); $this->load->model('system/Fehler_model', 'FehlerModel'); - $this->load->model('system/Fehler_model', 'FehlerModel'); $this->load->model('system/Fehlerzustaendigkeiten_model', 'FehlerzustaendigkeitenModel'); $this->loadPhrases( @@ -70,7 +69,7 @@ class IssuesZustaendigkeiten extends Auth_Controller { $app = $this->input->get('app'); - //$this->FehlerModel->addSelect('fehlercode, fehler_kurzbz, fehlertext, fehlertyp_kurzbz'); + $this->FehlerModel->addSelect('fehlercode, fehler_kurzbz, fehlertext, fehlertyp_kurzbz, app'); $this->FehlerModel->addOrder('fehlercode'); $fehlerRes = isset($app) ? $this->FehlerModel->loadWhere(array('app' => $app)) : $this->FehlerModel->load(); diff --git a/application/controllers/system/issues/Plausichecks.php b/application/controllers/system/issues/Plausichecks.php index 748361321..53ff8afe8 100644 --- a/application/controllers/system/issues/Plausichecks.php +++ b/application/controllers/system/issues/Plausichecks.php @@ -4,6 +4,8 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); class Plausichecks extends Auth_Controller { + const GENERIC_ISSUE_OCCURED_TEXT = 'Issue aufgetreten'; + public function __construct() { parent::__construct( @@ -14,7 +16,8 @@ class Plausichecks extends Auth_Controller ); // Load libraries - $this->load->library('issues/PlausicheckProducerLib'); + $this->load->library('issues/PlausicheckProducerLib', array('app' => 'core')); + $this->load->library('issues/PlausicheckDefinitionLib'); $this->load->library('WidgetLib'); // Load models @@ -42,18 +45,43 @@ class Plausichecks extends Auth_Controller $fehler_kurzbz = $this->input->get('fehler_kurzbz'); // issues array for passing issue texts - $issueTexts = array(); + $allIssues = array(); // all fehler kurzbz which are going to be checked - $fehlerKurzbz = !isEmptyString($fehler_kurzbz) ? array($fehler_kurzbz) : $this->plausicheckproducerlib->getFehlerKurzbz(); + $fehlerKurzbz = !isEmptyString($fehler_kurzbz) ? array($fehler_kurzbz) : $this->plausicheckdefinitionlib->getFehlerKurzbz(); + $fehlerLibMappings = $this->plausicheckdefinitionlib->getFehlerLibMappings(); // set Studiengang to null if not passed if (isEmptyString($studiengang_kz)) $studiengang_kz = null; // get the data returned by Plausicheck foreach ($fehlerKurzbz as $fehler_kurzbz) { + // get Text and fehlercode of the Fehler + $this->FehlerModel->addSelect('fehlercode, fehlertext, fehlertyp_kurzbz'); + $fehlerRes = $this->FehlerModel->loadWhere(array('fehler_kurzbz' => $fehler_kurzbz)); + + if (isError($fehlerRes)) $this->terminateWithJsonError(getError($fehlerRes)); + + // do not check error if no data + if (!hasData($fehlerRes)) continue; + + // get the error data + $fehler = getData($fehlerRes)[0]; + + // initialize issue array + $allIssues[$fehler_kurzbz] = array('fehlercode' => $fehler->fehlercode, 'data' => array()); + + // get library name for producing issue + $libName = $fehlerLibMappings[$fehler_kurzbz]; + // execute the check - $issueTexts[$fehler_kurzbz] = array(); - $plausicheckRes = $this->plausicheckproducerlib->producePlausicheckIssue($fehler_kurzbz, $studiensemester_kurzbz, $studiengang_kz); + $plausicheckRes = $this->plausicheckproducerlib->producePlausicheckIssue( + $libName, + $fehler_kurzbz, + array( + 'studiensemester_kurzbz' => $studiensemester_kurzbz, + 'studiengang_kz' => $studiengang_kz + ) + ); if (isError($plausicheckRes)) $this->terminateWithJsonError(getError($plausicheckRes)); @@ -67,21 +95,17 @@ class Plausichecks extends Auth_Controller $person_id = isset($plausiData['person_id']) ? $plausiData['person_id'] : null; $oe_kurzbz = isset($plausiData['oe_kurzbz']) ? $plausiData['oe_kurzbz'] : null; $fehlertext_params = isset($plausiData['fehlertext_params']) ? $plausiData['fehlertext_params'] : null; - $resolution_params = isset($plausiData['resolution_params']) ? $plausiData['resolution_params'] : null; - - // get Text of the Fehler - $this->FehlerModel->addSelect('fehlertext'); - $fehlerRes = $this->FehlerModel->loadWhere(array('fehler_kurzbz' => $fehler_kurzbz)); - - if (isError($fehlerRes)) $this->outputJsonError(getError($fehlerRes)); // optionally replace fehler parameters in text, output the fehlertext - if (hasData($fehlerRes)) + if (!isEmptyString($fehler->fehlertext)) { - $fehlerText = getData($fehlerRes)[0]->fehlertext; + $fehlercode = $fehler->fehlercode; + $fehlerText = $fehler->fehlertext; + $fehlerTyp = $fehler->fehlertyp_kurzbz; if (!isEmptyArray($fehlertext_params)) { + // replace placeholder with params, if present if (count($fehlertext_params) != substr_count($fehlerText, '%s')) $this->terminateWithJsonError('Wrong number of parameters for Fehlertext, fehler_kurzbz ' . $fehler_kurzbz); @@ -90,13 +114,25 @@ class Plausichecks extends Auth_Controller if (isset($person_id)) $fehlerText .= "; person_id: $person_id"; if (isset($oe_kurzbz)) $fehlerText .= "; oe_kurzbz: $oe_kurzbz"; - $issueTexts[$fehler_kurzbz][] = $fehlerText; + + $issueObj = new StdClass(); + $issueObj->fehlertext = $fehlerText; + $issueObj->type = $fehlerTyp; + $allIssues[$fehler_kurzbz]['data'][] = $issueObj; } + else // if no issue text found, use generic text + { + $fehlerText = self::GENERIC_ISSUE_OCCURED_TEXT; + } + + // add generic parameters to issue text + if (isset($person_id)) $fehlerText .= "; person_id: $person_id"; + if (isset($oe_kurzbz)) $fehlerText .= "; oe_kurzbz: $oe_kurzbz"; } } } - $this->outputJsonSuccess($issueTexts); + $this->outputJsonSuccess($allIssues); } /** @@ -121,13 +157,38 @@ class Plausichecks extends Auth_Controller if (isError($studiengaengeRes)) show_error(getError($studiengaengeRes)); - $fehlerKurzbz = $this->plausicheckproducerlib->getFehlerKurzbz(); + $fehlerKurzbz = $this->plausicheckdefinitionlib->getFehlerKurzbz(); + + $db = new DB_Model(); + + // get fehlercodes for fehler_kurzbz + $fehlerRes = $db->execReadOnlyQuery( + 'SELECT + fehler_kurzbz, fehlercode + FROM + system.tbl_fehler + WHERE + fehler_kurzbz IN ?', + array($fehlerKurzbz) + ); + + if (isError($fehlerRes)) show_error(getError($fehlerRes)); + + $fehlerKurzbzCodeMappings = array(); + if (hasData($fehlerRes)) + { + $fehler = getData($fehlerRes); + foreach ($fehler as $fe) + { + $fehlerKurzbzCodeMappings[$fe->fehler_kurzbz] = $fe->fehlercode; + } + } return array( 'semester' => hasData($studiensemesterRes) ? getData($studiensemesterRes) : array(), 'currsemester' => hasData($currSemRes) ? getData($currSemRes) : array(), 'studiengaenge' => hasData($studiengaengeRes) ? getData($studiengaengeRes) : array(), - 'fehler' => $fehlerKurzbz + 'fehlerKurzbzCodeMappings' => $fehlerKurzbzCodeMappings ); } } diff --git a/application/controllers/system/messages/FASMessages.php b/application/controllers/system/messages/FASMessages.php index 55d1da25f..e2169af9b 100644 --- a/application/controllers/system/messages/FASMessages.php +++ b/application/controllers/system/messages/FASMessages.php @@ -37,7 +37,7 @@ class FASMessages extends Auth_Controller // Loads the view to write a new message with a template $this->load->view( - 'system/messages/htmlWriteTemplate', + 'system/messages/FAShtmlWriteTemplate', $this->CLMessagesModel->prepareHtmlWriteTemplatePrestudents($prestudents) ); } @@ -53,7 +53,7 @@ class FASMessages extends Auth_Controller // Loads the view to write a new message with a template $this->load->view( - 'system/messages/htmlWriteTemplate', + 'system/messages/FAShtmlWriteTemplate', $this->CLMessagesModel->prepareHtmlWriteTemplatePrestudents($prestudents, $message_id, $recipient_id) ); } diff --git a/application/core/IIssueExistsChecker.php b/application/core/IIssueExistsChecker.php deleted file mode 100644 index 7f5a6b6e5..000000000 --- a/application/core/IIssueExistsChecker.php +++ /dev/null @@ -1,21 +0,0 @@ -behebung_parameter) ? json_decode($issue->behebung_parameter, true) : array() ); - // if called from extension (extension name set), path includes extension names, otherwise it is the core library folder - $libRootPath = isset($this->_extensionName) ? 'extensions/' . $this->_extensionName . '/' : ''; + // if called from extension (extension name set), path includes extension names + $libRootPath = isset($this->_extensionName) ? self::EXTENSIONS_FOLDER . '/' . $this->_extensionName . '/' : ''; + + // path for loading issue library $issuesLibPath = $libRootPath . self::ISSUE_RESOLVERS_FOLDER . '/'; - $issuesLibFilePath = DOC_ROOT . self::CI_PATH . '/' . $libRootPath . 'libraries/' . self::ISSUE_RESOLVERS_FOLDER . '/' . $libName . '.php'; + + // file path of library for check if file exists + $issuesLibFilePath = DOC_ROOT . self::CI_PATH + . '/' . $libRootPath . self::CI_LIBRARY_FOLDER . '/' . self::ISSUE_RESOLVERS_FOLDER . '/' . $libName . '.php'; // check if library file exists if (!file_exists($issuesLibFilePath)) diff --git a/application/core/PlausiIssueProducer_Controller.php b/application/core/PlausiIssueProducer_Controller.php new file mode 100644 index 000000000..0dce7a487 --- /dev/null +++ b/application/core/PlausiIssueProducer_Controller.php @@ -0,0 +1,66 @@ +_extensionName) ? $this->_extensionName : null; + + // load libraries + $this->load->library('issues/PlausicheckProducerLib', array('extensionName' => $extensionName, 'app' => $this->_app)); + $this->load->library('IssuesLib'); + } + + protected function producePlausicheckIssues($params) + { + $this->logInfo("Plausicheck issue producer job started"); + + // get the data returned by Plausicheck + foreach ($this->_fehlerLibMappings as $fehler_kurzbz => $libName) + { + // execute the check + $this->logInfo("Checking " . $fehler_kurzbz . "..."); + $plausicheckRes = $this->plausicheckproducerlib->producePlausicheckIssue( + $libName, + $fehler_kurzbz, + $params + ); + + if (isError($plausicheckRes)) $this->logError(getError($plausicheckRes)); + + if (hasData($plausicheckRes)) + { + $plausicheckData = getData($plausicheckRes); + + foreach ($plausicheckData as $plausiData) + { + // get the data needed for issue production + $person_id = isset($plausiData['person_id']) ? $plausiData['person_id'] : null; + $oe_kurzbz = isset($plausiData['oe_kurzbz']) ? $plausiData['oe_kurzbz'] : null; + $fehlertext_params = isset($plausiData['fehlertext_params']) ? $plausiData['fehlertext_params'] : null; + $resolution_params = isset($plausiData['resolution_params']) ? $plausiData['resolution_params'] : null; + + // write the issue + $addIssueRes = $this->issueslib->addFhcIssue($fehler_kurzbz, $person_id, $oe_kurzbz, $fehlertext_params, $resolution_params); + + // log if error, or log info if inserted new issue + if (isError($addIssueRes)) + $this->logError(getError($addIssueRes)); + elseif (hasData($addIssueRes) && is_integer(getData($addIssueRes))) + $this->logInfo("Plausicheck issue " . $fehler_kurzbz . " successfully produced, person_id: " . $person_id); + } + } + } + + $this->logInfo("Plausicheck issue producer job stopped"); + } +} diff --git a/application/helpers/hlp_common_helper.php b/application/helpers/hlp_common_helper.php index 913d29b54..707d055ea 100644 --- a/application/helpers/hlp_common_helper.php +++ b/application/helpers/hlp_common_helper.php @@ -18,6 +18,8 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); +use \DateTime as DateTime; + // ------------------------------------------------------------------------ // Collection of utility functions for general purpose // ------------------------------------------------------------------------ @@ -405,3 +407,17 @@ function findResource($path, $resource, $subdir = false, $extraDir = null) return null; } +/** + * check if String can be converted to a date + */ +function isValidDate($dateString) +{ + try + { + return (new DateTime($dateString)) !== false; + } + catch(Exception $e) + { + return false; + } +} diff --git a/application/libraries/AnrechnungLib.php b/application/libraries/AnrechnungLib.php index 86a81fb55..8ee1891b5 100644 --- a/application/libraries/AnrechnungLib.php +++ b/application/libraries/AnrechnungLib.php @@ -37,19 +37,30 @@ class AnrechnungLib * @param $lv_id * @return StdClass */ - public function getAntragData($prestudent_id, $studiensemester_kurzbz, $lv_id) + public function getAntragData($prestudent_id, $studiensemester_kurzbz, $lv_id, $anrechnung_id = null) { $antrag_data = new StdClass(); // Get students UID. $uid = $this->ci->StudentModel->getUID($prestudent_id); - - // Get lehrveranstaltung data. Break, if course is not assigned to student. - if(!$lv = getData($this->ci->LehrveranstaltungModel->getLvByStudent($uid, $studiensemester_kurzbz, $lv_id))[0]) + + // If Anrechnung exists + if (is_numeric($anrechnung_id)) { - show_error('You are not assigned to this course yet.'); + // Just load LV by lv_id + $result = $this->ci->LehrveranstaltungModel->load($lv_id); + $lv = getData($result)[0]; } - + // If Anrechnung not exists + else + { + // Load LV, but check if student is assigned to that LV. Break, if not. + if(!$lv = getData($this->ci->LehrveranstaltungModel->getLvByStudent($uid, $studiensemester_kurzbz, $lv_id))[0]) + { + show_error('You are not assigned to this course yet.'); + } + } + // Get the students personal data if (!$person = getData($this->ci->PersonModel->getByUid($uid))[0]) { @@ -163,6 +174,8 @@ class AnrechnungLib $anrechnung_data->insertvon = ''; $anrechnung_data->studiensemester_kurzbz = ''; $anrechnung_data->empfehlung = ''; + $anrechnung_data->begruendung_ects = ''; + $anrechnung_data->begruendung_lvinhalt = ''; $anrechnung_data->status_kurzbz = ''; $anrechnung_data->status = getUserLanguage() == 'German' ? 'neu' : 'new'; $anrechnung_data->dokumentname = ''; @@ -274,14 +287,21 @@ class AnrechnungLib if (hasData($result)) { $empfehlung_data->empfehlungsanfrageAm = (new DateTime($result->retval[0]->insertamum))->format('d.m.Y'); - - // Get lectors who received request for recommendation - $lector_arr = self::getLectors($anrechnung_id); - - if (!isEmptyArray($lector_arr)) - { - $empfehlung_data->empfehlungsanfrageAn = implode(', ', array_column($lector_arr, 'fullname')); - } + + // Get users who received request for recommendation + if($this->ci->config->item('fbl') === TRUE) + { + $res = $this->getLeitungOfLvOe($anrechnung_id); + } + else + { + $res = $this->getLectors($anrechnung_id); + } + + if (!isEmptyArray($res)) + { + $empfehlung_data->empfehlungsanfrageAn = implode(', ', array_column($res, 'fullname')); + } } if (is_null($anrechnung->empfehlung_anrechnung)) @@ -741,6 +761,25 @@ class AnrechnungLib // Continue, if LV has no lector (there is no one to ask for recommendation) return hasData($result) ? true : false; } + + /** + * Check if user is allowed to recommend Anrechnung. + * + * @param $anrechnung_id + * @return bool + */ + public function isEmpfehlungsberechtigt($anrechnung_id) + { + if($this->ci->config->item('fbl') === TRUE) + { + return true; + } + // Get lv-leitungen or, if not present, all lectors of lv. + $lector_arr = $this->getLectors($anrechnung_id); + + // Return false if lv-leitung is present and user is not lv-leitung. Otherways return always true. + return in_array(getAuthUID(), array_column($lector_arr, 'uid')); + } /** * Get LV Leitung. If not present, get all LV lectors. @@ -774,11 +813,14 @@ class AnrechnungLib // Check if lv has LV-Leitung $key = array_search(true, array_column($result, 'lvleiter')); - - // If lv has LV-Leitung, keep only the one + + // If lv has 1 or more LV-Leitungen, keep only them if ($key !== false) { - $lector_arr[]= $result[$key]; + foreach ($result as $lector) + { + if ($lector->lvleiter) $lector_arr[]= $lector; + } } // ...otherwise keep all lectors else @@ -803,6 +845,40 @@ class AnrechnungLib return $lector_arr; } + /** + * Get Leitung of Lehrveranstaltungs-Organisationseinheit. + * + * @param $anrechnung_id + * @return false|mixed|null + */ + public function getLeitungOfLvOe($anrechnung_id) + { + $this->ci->AnrechnungModel->addSelect('lehrveranstaltung_id'); + $result = $this->ci->AnrechnungModel->load($anrechnung_id); + + $lehrveranstaltung_id = getData($result)[0]->lehrveranstaltung_id; + + // Get Leitungen + $result = $this->ci->LehrveranstaltungModel->getLeitungOfLvOe($lehrveranstaltung_id); + + if (!hasData($result)) + { + return false; + } + + $oeLeitung_arr = getData($result); + + foreach ($oeLeitung_arr as $oeLeitung) + { + $oeLeitung->fullname = $oeLeitung->vorname. ' '. $oeLeitung->nachname; + } + + // Now make the array unique + $oeLeitung_arr = array_unique($oeLeitung_arr, SORT_REGULAR); + + return $oeLeitung_arr; + } + // Return an object with Anrechnungdata private function _setAnrechnungDataObject($anrechnung) { @@ -820,6 +896,8 @@ class AnrechnungLib $anrechnung_data->insertvon= $anrechnung->insertvon; $anrechnung_data->studiensemester_kurzbz= $anrechnung->studiensemester_kurzbz; $anrechnung_data->empfehlung= $anrechnung->empfehlung_anrechnung; + $anrechnung_data->begruendung_ects = $anrechnung->begruendung_ects; + $anrechnung_data->begruendung_lvinhalt = $anrechnung->begruendung_lvinhalt; // Get last status_kurzbz $result = $this->ci->AnrechnungModel->getLastAnrechnungstatus($anrechnung->anrechnung_id); diff --git a/application/libraries/AntragLib.php b/application/libraries/AntragLib.php new file mode 100644 index 000000000..e3cc5bf14 --- /dev/null +++ b/application/libraries/AntragLib.php @@ -0,0 +1,1884 @@ +_ci =& get_instance(); + + // Configs + $this->_ci->load->config('studierendenantrag'); + + // Models + $this->_ci->load->model('education/Studierendenantrag_model', 'StudierendenantragModel'); + $this->_ci->load->model('education/Studierendenantragstatus_model', 'StudierendenantragstatusModel'); + $this->_ci->load->model('education/Studierendenantraglehrveranstaltung_model', 'StudierendenantraglehrveranstaltungModel'); + $this->_ci->load->model('organisation/Studiengang_model', 'StudiengangModel'); + $this->_ci->load->model('crm/Prestudent_model', 'PrestudentModel'); + $this->_ci->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel'); + $this->_ci->load->model('person/Person_model', 'PersonModel'); + $this->_ci->load->model('education/Pruefung_model', 'PruefungModel'); + + // Helper + $this->_ci->load->helper('hlp_sancho_helper'); + + // Libraries + $this->_ci->load->library('PermissionLib'); + $this->_ci->load->library('PrestudentLib'); + } + + /** + * @param integer $antrag_id + * @param string $insertvon + * + * @return stdClass + */ + public function cancelAntrag($antrag_id, $insertvon) + { + $result = $this->_ci->StudierendenantragstatusModel->insert([ + 'studierendenantrag_id' => $antrag_id, + 'studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_CANCELLED, + 'insertvon' => $insertvon + ]); + + return $result; + } + + /** + * NOTE(chris): permissions & verification must be handled outside + * + * @param integer $prestudent_id + * @param string $studiensemester_kurzbz + * @param string $insertvon + * @param string $grund + * + * @return stdClass + */ + public function createAbmeldung($prestudent_id, $studiensemester_kurzbz, $insertvon, $grund) + { + $result = $this->_ci->PrestudentModel->load($prestudent_id); + if (isError($result)) + return $result; + if(!hasData($result)) + return error($this->_ci->p->t('studierendenantrag', "error_no_prestudent", ['prestudent_id' => $prestudent_id])); + + $prestudent = getData($result)[0]; + if($prestudent->person_id == getAuthPersonId()) + $typ = Studierendenantrag_model::TYP_ABMELDUNG; + else + $typ = Studierendenantrag_model::TYP_ABMELDUNG_STGL; + + $result = $this->_ci->StudierendenantragModel->insert([ + 'prestudent_id' => $prestudent_id, + 'studiensemester_kurzbz'=> $studiensemester_kurzbz, + 'datum' => date('c'), + 'typ' => $typ, + 'insertvon' => $insertvon, + 'grund' => $grund + ]); + + if (isError($result)) + return $result; + + $antrag_id = getData($result); + + $result = $this->_ci->StudierendenantragstatusModel->insert([ + 'studierendenantrag_id' => $antrag_id, + 'studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_CREATED, + 'insertvon' => $insertvon + ]); + + if (isError($result)) + return $result; + + return success($antrag_id); + } + + /** + * @param array $studierendenantrag_ids + * @param string $insertvon + * + * @return stdClass + */ + public function approveAbmeldung($studierendenantrag_ids, $insertvon) + { + $this->_ci->load->model('crm/Student_model', 'StudentModel'); + + $errors = []; + foreach ($studierendenantrag_ids as $studierendenantrag_id) { + $result = $this->_ci->StudierendenantragModel->load($studierendenantrag_id); + if (isError($result)) + { + $errors[] = getError($result); + continue; + } + if(!hasData($result)) + { + $errors[] = $this->_ci->p->t('studierendenantrag', 'error_no_antrag_found', ['id' => $studierendenantrag_id]); + continue; + } + $antrag = getData($result)[0]; + + $insertam = date('c'); + + $result = $this->_ci->StudierendenantragstatusModel->insert([ + 'studierendenantrag_id' => $studierendenantrag_id, + 'studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_APPROVED, + 'insertvon' => $insertvon, + 'insertamum' => $insertam + ]); + if (isError($result)) + $errors[] = getError($result); + else { + $this->_ci->StudiengangModel->addJoin('public.tbl_prestudent ps','studiengang_kz'); + $result = $this->_ci->StudiengangModel->loadWhere(['prestudent_id' => $antrag->prestudent_id]); + $stg = ''; + $orgform = ''; + if (hasData($result)) { + $studiengang = current(getData($result)); + $stg = $studiengang->bezeichnung; + } + if ($antrag->typ == Studierendenantrag_model::TYP_ABMELDUNG) + { + $resultPrestudentStatus = $this->_ci->PrestudentstatusModel->getLastStatusWithStgEmail($antrag->prestudent_id); + if (isError($resultPrestudentStatus)) + $errors[] = getError($resultPrestudentStatus); + + else { + $prestudent_status = getData($resultPrestudentStatus)[0]; + $orgform = $prestudent_status->orgform_kurzbz; + + $vorlage ='Sancho_Mail_Antrag_A_Approve'; + $subject = $this->_ci->p->t('studierendenantrag', 'mail_subject_A_Approve'); + + $result = $this->_ci->prestudentlib->setAbbrecher( + $antrag->prestudent_id, + $antrag->studiensemester_kurzbz, + $insertvon, + 'abbrecherStud', + $antrag->datum, + $insertam + ); + if (isError($result)) + { + $errors[] = getError($result); + return $errors; + } + + $result = $this->_ci->PersonModel->loadPrestudent($antrag->prestudent_id); + $data = [ + 'student' => $this->_ci->p->t('person', 'studentIn'), + 'sem' => $antrag->studiensemester_kurzbz, + 'linkPdf' => base_url('content/pdfExport.php?xml=Antrag' . $antrag->typ . '.xml.php&xsl=Antrag' . $antrag->typ . '&id=' . $antrag->studierendenantrag_id . '&output=pdf') + ]; + if (hasData($result)) { + $person = current(getData($result)); + $data['student'] = trim($person->vorname . ' ' . $person->nachname); + $data['vorname'] = $person->vorname; + $data['nachname'] = $person->nachname; + } + $result = $this->_ci->StudentModel->loadWhere(['prestudent_id'=> $antrag->prestudent_id]); + if (hasData($result)) { + $student = current(getData($result)); + $data['UID'] = $student->student_uid; + } + + $data['Orgform'] = $prestudent_status->orgform; + $data['stg'] = $stg; + + // NOTE(chris): Sancho mail + sendSanchoMail($vorlage, $data, $prestudent_status->email, $subject); + } + } else { // ($antrag->typ == Studierendenantrag_model::TYP_ABMELDUNG_STGL) + $result = $this->_ci->PrestudentstatusModel->getLastStatusWithStgEmail($antrag->prestudent_id, '', 'Student'); + if (isError($result)) + { + $errors[] = getError($result); + continue; + } + if(!hasData($result)) + { + $errors[] = $this->_ci->p->t('studierendenantrag', 'error_no_prestudentstatus', ['prestudent_id' => $antrag->prestudent_id]); + continue; + } + $prestudentstatus = getData($result)[0]; + $orgform = $prestudentstatus->orgform_kurzbz; + + $result = $this->_ci->PrestudentstatusModel->withGrund('preabbrecher')->update([ + 'prestudent_id' => $prestudentstatus->prestudent_id, + 'status_kurzbz'=>$prestudentstatus->status_kurzbz, + 'studiensemester_kurzbz'=>$prestudentstatus->studiensemester_kurzbz, + 'ausbildungssemester'=>$prestudentstatus->ausbildungssemester + ], []); + if (isError($result)) + { + $errors[] = getError($result); + continue; + } + } + + $res = $this->_ci->PrestudentModel->load($antrag->prestudent_id); + + if (hasData($res)) { + $prestudent = current(getData($res)); + $res = $this->_ci->PersonModel->load($prestudent->person_id); + if (hasData($res)) { + $person = current(getData($res)); + $name = trim($person->vorname . ' ' . $person->nachname); + $vorname = $person->vorname; + $nachname = $person->nachname; + } else { + $name = $this->_ci->p->t('person', 'studentIn'); + $vorname = ''; + $nachname = $name; + } + $res = $this->_ci->StudentModel->loadWhere(['prestudent_id' => $antrag->prestudent_id]); + if (hasData($res)) { + $email = $this->_ci->StudentModel->getEmailFH(current(getData($res))->student_uid); + $vorlage = $antrag->typ == Studierendenantrag_model::TYP_ABMELDUNG ? 'Student' : 'Stgl'; + + // NOTE(chris): Sancho mail + sendSanchoMail( + 'Sancho_Mail_Antrag_A_' . $vorlage, + [ + 'name' => $name, + 'grund' => $antrag->grund, + 'vorname' => $vorname, + 'nachname' => $nachname, + 'Orgform' => $orgform, + 'stg' => $stg + ], + $email, + $this->_ci->p->t('studierendenantrag', 'mail_subject_A_' . $vorlage) + ); + } + } + } + } + + if (count($errors)) + return error(implode(',', $errors)); + + return success(); + } + + /** + * @param integer $studierendenantrag_id + * @param string $insertvon + * + * @return stdClass + */ + public function denyObjectionAbmeldung($studierendenantrag_id, $insertvon, $grund = null) + { + $result = $this->_ci->StudierendenantragModel->load($studierendenantrag_id); + if (isError($result)) + { + return $result; + } + if(!hasData($result)) + { + return error($this->_ci->p->t('studierendenantrag', 'error_no_antrag_found', ['id' => $studierendenantrag_id])); + } + $antrag = getData($result)[0]; + + $result = $this->_ci->StudierendenantragstatusModel->loadWhere([ + 'studierendenantrag_id' => $studierendenantrag_id, + 'studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_APPROVED + ]); + if (isError($result)) + return $result; + if (!hasData($result)) + return error($this->_ci->p->t('studierendenantrag', 'error_not_approved')); + + $status = current(getData($result)); + + $result = $this->_ci->StudierendenantragstatusModel->insert([ + 'studierendenantrag_id' => $studierendenantrag_id, + 'studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_OBJECTION_DENIED, + 'grund' => $grund, + 'insertvon' => $insertvon + ]); + if (isError($result)) + return $result; + else { + $result = $this->_ci->prestudentlib->setAbbrecher( + $antrag->prestudent_id, + $antrag->studiensemester_kurzbz, + $insertvon, + 'abbrecherStgl', + $status->insertamum + ); + + if (isError($result)) + return $result; + + $res = $this->_ci->PrestudentModel->load($antrag->prestudent_id); + + if (hasData($res)) { + $this->_ci->load->model('crm/Student_model', 'StudentModel'); + + $prestudent = current(getData($res)); + $res = $this->_ci->PersonModel->load($prestudent->person_id); + if (hasData($res)) { + $person = current(getData($res)); + $name = trim($person->vorname . ' ' . $person->nachname); + $vorname = $person->vorname; + $nachname = $person->nachname; + } else { + $name = $this->_ci->p->t('person', 'studentIn'); + } + + $res = $this->_ci->StudentModel->loadWhere(['prestudent_id' => $antrag->prestudent_id]); + if (hasData($res)) { + $email = $this->_ci->StudentModel->getEmailFH(current(getData($res))->student_uid); + + $res = $this->_ci->StudierendenantragModel->getStgAndSem($antrag->studierendenantrag_id); + $stg = ''; + $orgform = ''; + if (hasData($res)) { + $studiengang = current(getData($res)); + $stg = $studiengang->bezeichnung; + $orgform = $studiengang->orgform_kurzbz; + } + + sendSanchoMail( + 'Sancho_Mail_Antrag_A_ObjDenied', + [ + 'name' => $name, + 'vorname' => $vorname, + 'nachname' => $nachname, + 'grund' => $grund, + 'Orgform' => $orgform, + 'stg' => $stg + ], + $email, + $this->_ci->p->t('studierendenantrag', 'mail_subject_A_ObjectionDenied') + ); + } + } + } + + return success(); + } + + /** + * NOTE(chris): permissions & verification must be handled outside + * + * @param integer $prestudent_id + * @param string $studiensemester_kurzbz + * @param string $insertvon + * @param string $grund + * @param string $datum_wiedereinstieg + * + * @return stdClass + */ + public function createUnterbrechung($prestudent_id, $studiensemester_kurzbz, $insertvon, $grund, $datum_wiedereinstieg, $dms_id) + { + $datum_wiedereinstieg = new DateTime($datum_wiedereinstieg); + $datum_wiedereinstieg = $datum_wiedereinstieg->format("Y-m-d"); + $result = $this->_ci->StudierendenantragModel->insert([ + 'prestudent_id' => $prestudent_id, + 'studiensemester_kurzbz'=> $studiensemester_kurzbz, + 'datum' => date('c'), + 'typ' => Studierendenantrag_model::TYP_UNTERBRECHUNG, + 'insertvon' => $insertvon, + 'grund' => $grund, + 'datum_wiedereinstieg' => $datum_wiedereinstieg, + 'dms_id' => $dms_id + ]); + + if (isError($result)) + return $result; + + $antrag_id = getData($result); + + $result = $this->_ci->StudierendenantragstatusModel->insert([ + 'studierendenantrag_id' => $antrag_id, + 'studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_CREATED, + 'insertvon' => $insertvon + ]); + + if (isError($result)) + return $result; + + return success($antrag_id); + } + + + /** + * @param array $studierendenantrag_ids + * @param string $insertvon + * + * @return stdClass + */ + public function approveUnterbrechung($studierendenantrag_ids, $insertvon) + { + $this->_ci->load->model('person/Kontakt_model', 'KontaktModel'); + $this->_ci->load->model('crm/Student_model', 'StudentModel'); + + $errors = []; + + foreach ($studierendenantrag_ids as $studierendenantrag_id) + { + $data = $this->getDataForUnterbrechung($studierendenantrag_id); + + if (isError($data)) { + $error_msg = getError($data); + if (is_array($error_msg) && isset($error_msg['message'])) + $error_msg = $error_msg['message']; + + $errors['failed_' . $studierendenantrag_id] = 'Could not approve Unterbrechung for studierendenantrag_id: ' . + $studierendenantrag_id . + '
Details:
' . + $error_msg; + } else { + + $data = getData($data); + + $result = $this->_ci->StudierendenantragstatusModel->insert([ + 'studierendenantrag_id' => $studierendenantrag_id, + 'studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_APPROVED, + 'insertvon' => $insertvon + ]); + if (isError($result)) + { + $errors['failed_' . $studierendenantrag_id] = $this->_ci->p->t('studierendenantrag', 'error_U_Approve', [ + 'studierendenantrag_id' => $studierendenantrag_id, + 'message' => getError($result)['message'] + ]); + } + else + { + $studierendenantrag_status_id = getData($result); + $resultAntrag = $this->_ci->StudierendenantragModel->load($studierendenantrag_id); + if (isError($resultAntrag)) + return $resultAntrag; + $resultAntrag = getData($resultAntrag); + if (!$resultAntrag) + return error($this->_ci->p->t('studierendenantrag', 'error_no_antrag_found', ['id' => $studierendenantrag_id])); + $resultAntrag = current($resultAntrag); + + // Prestudentstatus und Unterbrechungsfolgeaktionen setzen + $result = $this->_ci->prestudentlib->setUnterbrecher( + $resultAntrag->prestudent_id, + $resultAntrag->studiensemester_kurzbz, + $studierendenantrag_id + ); + + if (isError($result)) { + $this->_ci->StudierendenantragstatusModel->delete($studierendenantrag_status_id); + return $result; + } + + + //Mail + $subject = $this->_ci->p->t('studierendenantrag', 'mail_subject_U_Approve'); + $mail = []; + + if (isset($data['errors']['person_id'])) + { + //send assistenz mit id + $errors[] = $this->_ci->p->t('studierendenantrag', 'error_mail_and_name', ['message' => $data['errors']['person_id']]); + $mail['ass'] = $this->_ci->p->t('studierendenantrag', 'StudentIn', ['prestudent_id' => $data['antrag']->prestudent_id]); + } + elseif (isset($data['errors']['email'])) + { + if (isset($data['errors']['person'])) + { + //send assistenz mit id + $errors[] = $this->_ci->p->t('studierendenantrag', 'error_mail_and_name', [ + 'message' => $data['errors']['email'] . '
' . $data['errors']['person'] + ]); + $mail['ass'] = $this->_ci->p->t('studierendenantrag', 'StudentIn', ['prestudent_id' => $data['antrag']->prestudent_id]); + } + else + { + //send assistenz mit name + $errors[] = $this->_ci->p->t('studierendenantrag', 'error_mail', ['message' => $data['errors']['email']]); + $mail['ass'] = trim($data['person']->vorname . ' ' . $data['person']->nachname); + } + } + else + { + if (isset($data['errors']['person'])) + { + //send assistenz mit id & student mit "Student/in" + $errors[] = $this->_ci->p->t('studierendenantrag', 'error_name', ['message' => $data['errors']['person']]); + $mail['ass'] = $this->_ci->p->t('studierendenantrag', 'StudentIn', ['prestudent_id' => $data['antrag']->prestudent_id]); + $mail['stu'] = $this->_ci->p->t('person', 'StudentIn'); + } + else + { + //send normal + $mail['ass'] = $mail['stu'] = trim($data['person']->vorname . ' ' . $data['person']->nachname); + } + } + + if (isset($mail['ass'])) { + // NOTE(chris): Sancho mail + $mailVorlage = 'Sancho_Mail_Antrag_U_Approve'; + + $result = $this->_ci->StudentModel->loadWhere(['prestudent_id'=> $data['antrag']->prestudent_id]); + if (hasData($result)) { + $student = current(getData($result)); + $data['UID'] = $student->student_uid; + } + + $result = $this->_ci->PersonModel->getFullName($insertvon); + if (isError($result)) + return $result; + $approvedBy = $insertvon; + if (hasData($result)) + { + $approvedBy = getData($result); + } + + if (!sendSanchoMail( + $mailVorlage, + [ + 'name' => $mail['ass'], + 'stg' => $data['studiengang']->bezeichnung, + 'Orgform' => $data['prestudent_status']->orgform_kurzbz, + 'vorname' => $data['person']->vorname, + 'nachname' => $data['person']->nachname, + 'UID' => $data['UID'], + 'sem' => $resultAntrag->studiensemester_kurzbz, + 'linkPdf' => base_url('content/pdfExport.php?xml=AntragUnterbrechung.xml.php&xsl=AntragUnterbrechung&id=' . $studierendenantrag_id . '&output=pdf'), + 'insertvon' => $approvedBy + ], + $data['prestudent_status']->email, + $subject + )) { + $errors[] = $this->_ci->p->t('studierendenantrag', 'error_mail_to', $data['prestudent_status']); + } + } + if (isset($mail['stu'])) { + // NOTE(chris): Sancho mail + $mailVorlage = 'Sancho_Mail_Antrag_U_Student'; + if ($data['studienbeitrag']) + $mailVorlage .= '_SB'; + if (!sendSanchoMail( + $mailVorlage, + [ + 'name' => $mail['stu'], + 'stg' => $data['studiengang']->bezeichnung, + 'Orgform' => $data['prestudent_status']->orgform_kurzbz, + 'vorname' => $data['person']->vorname, + 'nachname' => $data['person']->nachname + ], + $data['email'], + $subject + )) { + $errors[] = $this->_ci->p->t('studierendenantrag', 'error_mail_to', $data); + } + } + } + } + } + + if (count($errors)) + return error($errors); + + return success(); + } + + /** + * @param array $studierendenantrag_ids + * @param string $insertvon + * @param string $grund + * + * @return stdClass + */ + public function rejectUnterbrechung($studierendenantrag_ids, $insertvon, $grund) + { + $this->_ci->load->model('person/Kontakt_model', 'KontaktModel'); + $this->_ci->load->model('crm/Student_model', 'StudentModel'); + + $errors = []; + + foreach ($studierendenantrag_ids as $studierendenantrag_id) { + $data = $this->getDataForUnterbrechung($studierendenantrag_id); + + if (isError($data)) { + $error_msg = getError($data); + if (is_array($error_msg) && isset($error_msg['message'])) + $error_msg = $error_msg['message']; + + $errors['failed_' . $studierendenantrag_id] = $this->_ci->p->t('studierendenantrag', 'error_U_Reject', [ + 'studierendenantrag_id' => $studierendenantrag_id, + 'message' => $error_msg + ]); + } else { + $data = getData($data); + + $result = $this->_ci->StudierendenantragstatusModel->insert([ + 'studierendenantrag_id' => $studierendenantrag_id, + 'studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_REJECTED, + 'insertvon' => $insertvon, + 'grund' => $grund + ]); + if (isError($result)) { + $errors['failed_' . $studierendenantrag_id] = $this->_ci->p->t('studierendenantrag', 'error_U_Reject', [ + 'studierendenantrag_id' => $studierendenantrag_id, + 'message' => getError($result)['message'] + ]); + } else { + $name = ''; + + if (isset($data['errors']['person_id']) || isset($data['errors']['email'])) { + $error_msg = []; + if (isset($data['errors']['person_id'])) + $error_msg[] = $data['errors']['person_id']; + if (isset($data['errors']['email'])) + $error_msg[] = $data['errors']['email']; + $error_msg = $this->_ci->p->t('studierendenantrag', 'error_mail', ['message' => implode('
', $error_msg)]); + $errors[] = $error_msg; + } else { + if (isset($data['errors']['person'])) { + //send student mit "Student/in" + $errors[] = $this->_ci->p->t('studierendenantrag', 'error_name', ['message' => $data['errors']['person']]); + $name = $this->_ci->p->t('person', 'studentIn'); + $vorname = ""; + $nachname = $name; + } else { + //send normal + $name = trim($data['person']->vorname . ' ' . $data['person']->nachname); + $vorname = $data['person']->vorname; + $nachname = $data['person']->nachname; + } + } + if ($name) + // NOTE(chris): Sancho mail + if (!sendSanchoMail( + 'Sancho_Mail_Antrag_U_Reject', + [ + 'name' => $name, + 'vorname' => $vorname, + 'nachname' => $nachname, + 'grund' => $grund, + 'stg' => $data['studiengang']->bezeichnung, + 'Orgform' => $data['prestudent_status']->orgform_kurzbz, + 'prestudent_id' => $data['prestudent_status']->prestudent_id, + 'abmeldungLink' => site_url('lehre/Studierendenantrag/abmeldung/' . $data['prestudent_status']->prestudent_id), + 'abmeldungLinkCIS' => CIS_ROOT . 'index.ci.php/lehre/Studierendenantrag/abmeldung/' . $data['prestudent_status']->prestudent_id + ], + $data['email'], + $this->_ci->p->t('studierendenantrag', 'mail_subject_U_Reject') + )) + $errors[] = $this->_ci->p->t('studierendenantrag', 'error_mail_to', $data); + } + } + } + + if (count($errors)) + return error($errors); + + return success(); + } + + /** + * @param integer $studierendenantrag_id + * + * @return array + */ + private function getDataForUnterbrechung($studierendenantrag_id) + { + $result = []; + $errors = []; + + $res = $this->_ci->StudierendenantragModel->load($studierendenantrag_id); + if (isError($res)) + return $res; + + $res = getData($res); + if (!$res) + return error($this->_ci->p->t('studierendenantrag', 'error_no_antrag_found', ['id' => $studierendenantrag_id])); + + $result['antrag'] = $antrag = current($res); + $this->_ci->StudiengangModel->addJoin('public.tbl_prestudent ps','studiengang_kz'); + $res = $this->_ci->StudiengangModel->loadWhere(['prestudent_id' => $antrag->prestudent_id]); + if (hasData($res)) { + $result['studiengang'] = current(getData($res)); + } + else{ + $result['studiengang'] = new stdClass(); + $result['studiengang']->bezeichnung = ""; + } + + $res = $this->_ci->PrestudentstatusModel->getLastStatusWithStgEmail($antrag->prestudent_id); + if (isError($res)) + return $res; + + $res = getData($res); + if (!$res) + return error($this->_ci->p->t('studierendenantrag', 'error_no_prestudentstatus', $antrag)); + + $result['prestudent_status'] = current($res); + + + $res = $this->_ci->PrestudentModel->load($antrag->prestudent_id); + + if (isError($res)) { + $errors['person_id'] = getError($res); + } else { + $res = getData($res); + if (!$res) { + $errors['person_id'] = $this->_ci->p->t('studierendenantrag', 'error_no_prestudent', $antrag); + } else { + $person_id = current($res)->person_id; + + $res = $this->_ci->PersonModel->load($person_id); + if (isError($res)) { + $errors['person'] = getError($res); + } else { + $res = getData($res); + if (!$res) { + $errors['person'] = $this->_ci->p->t('studierendenantrag', 'error_no_person', ['person_id' => $person_id]); + } else { + $result['person'] = current($res); + } + } + + $res = $this->_ci->StudentModel->loadWhere(['prestudent_id' => $antrag->prestudent_id]); + if (isError($res)) { + $errors['email'] = getError($res); + } else { + $res = getData($res); + + if (!$res) { + $errors['email'] = $this->_ci->p->t('studierendenantrag', 'error_no_email', ['person_id' => $person_id]); + } else { + $result['email'] = $this->_ci->StudentModel->getEmailFH(current($res)->student_uid); + } + } + } + } + + $result['studienbeitrag'] = false; + if (!isset($errors['person_id'])) { + $date_target = new DateTime( + $this->_ci->config->item('frist_rueckzahlung_studiengebuer_' . substr($result['antrag']->studiensemester_kurzbz, 0, 2)) . + substr($result['antrag']->studiensemester_kurzbz, 2) + ); + $date_created = new DateTime($result['antrag']->datum); + if ($date_created < $date_target) { + $this->_ci->load->model('crm/Konto_model', 'KontoModel'); + $result['studienbeitrag'] = $this->_ci->KontoModel->checkStudienbeitragFromPerson( + $person_id, + $result['antrag']->studiensemester_kurzbz + ); + } + } + + $result['errors'] = $errors; + + return success($result); + } + + /** + * @param integer $prestudent_id + * @param string $studiensemester_kurzbz + * @param string $insertvon + * @param boolean $repeat + * + * @return stdClass + */ + public function createWiederholung($prestudent_id, $studiensemester_kurzbz, $insertvon, $repeat) + { + $result = $this->_ci->StudierendenantragModel->loadIdAndStatusWhere([ + 'prestudent_id' => $prestudent_id, + 'studiensemester_kurzbz'=> $studiensemester_kurzbz, + 'typ' => Studierendenantrag_model::TYP_WIEDERHOLUNG + ]); + + $antrag_id = null; + if (hasData($result)) { + $antrag = current(getData($result)); + if ($antrag->status == Studierendenantragstatus_model::STATUS_REOPENED || + $antrag->status == Studierendenantragstatus_model::STATUS_REQUESTSENT_1 || + $antrag->status == Studierendenantragstatus_model::STATUS_REQUESTSENT_2) + { + $antrag_id = $antrag->studierendenantrag_id; + } + else + { + return error($this->_ci->p->t('global', 'antragBereitsGestellt')); + } + } + + if ($antrag_id === null) { + $result = $this->_ci->StudierendenantragModel->insert([ + 'prestudent_id' => $prestudent_id, + 'studiensemester_kurzbz'=> $studiensemester_kurzbz, + 'datum' => date('c'), + 'typ' => Studierendenantrag_model::TYP_WIEDERHOLUNG, + 'insertvon' => $insertvon + ]); + + if (isError($result)) + return $result; + + $antrag_id = getData($result); + } + + $result = $this->_ci->StudierendenantragstatusModel->insert([ + 'studierendenantrag_id' => $antrag_id, + 'studierendenantrag_statustyp_kurzbz' => $repeat ? Studierendenantragstatus_model::STATUS_CREATED : Studierendenantragstatus_model::STATUS_PASS, + 'insertvon' => $insertvon + ]); + + if ($repeat) { + $res = $this->_ci->PrestudentstatusModel->getLastStatusWithStgEmail($prestudent_id); + if (isError($res)) + return $res; + $res = getData($res); + if (!$res) + return error($this->_ci->p->t('studierendenantrag', 'error_no_prestudentstatus', ['prestudent_id' => $prestudent_id])); + + $prestudent_status = current($res); + $email = $prestudent_status->email; + // NOTE(chris): Sancho mail + $lvzuweisungLink = site_url('lehre/Antrag/Wiederholung/assistenz/' . $antrag_id); + if( defined('VILESCI_ROOT') ) + { + $lvzuweisungLink = VILESCI_ROOT . 'index.ci.php/lehre/Antrag/Wiederholung/assistenz/' . $antrag_id; + } + sendSanchoMail( + 'Sancho_Mail_Antrag_W_New', + [ + 'antrag_id' => $antrag_id, + 'stg' => $prestudent_status->stg_bezeichnung, + 'Orgform' => $prestudent_status->orgform, + 'lvzuweisungLink' => $lvzuweisungLink + ], + $email, + $this->_ci->p->t('studierendenantrag', 'mail_subject_W_New') + ); + } + + if (isError($result)) + return $result; + + return success($antrag_id); + } + + /** + * @param integer $studierendenantrag_id + * @param string $insertvon + * + * @return stdClass + */ + public function reopenWiederholung($studierendenantrag_id, $insertvon) + { + $result = $this->_ci->StudierendenantragstatusModel->insert([ + 'studierendenantrag_id' => $studierendenantrag_id, + 'studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_REOPENED, + 'insertvon' => $insertvon + ]); + return $result; + } + + /** + * @param integer $studierendenantrag_id + * @param string $objectedvon + * + * @return stdClass + */ + public function objectAbmeldung($studierendenantrag_id, $objectedvon) + { + $result = $this->_ci->StudierendenantragstatusModel->insert([ + 'studierendenantrag_id' => $studierendenantrag_id, + 'studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_OBJECTED, + 'insertvon' => $objectedvon + ]); + return $result; + } + + public function getWiederholungsAntraege($status) + { + $studiengaenge = $this->_ci->permissionlib->getSTG_isEntitledFor('student/studierendenantrag'); + $result = $this->_ci->StudierendenantragModel->loadForStudiengaenge( + $studiengaenge, + Studierendenantrag_model::TYP_WIEDERHOLUNG, + $status + ); + if (!getData($result)) + return $result; + $result = getData($result); + $grouped = []; + + foreach ($result as $item) { + if (!isset($grouped[$item->studiengang_kz])) { + $grouped[$item->studiengang_kz] = [ + 'bezeichnung' => $item->bezeichnung, + 'bezeichnung_mehrsprachig' => $item->bezeichnung_mehrsprachig, + 'antraege' => [] + ]; + } + $grouped[$item->studiengang_kz]['antraege'][] = $item; + } + + return success($grouped); + } + + public function getLvsForAntrag($antrag_id) + { + $this->_ci->load->model('education/Lehrveranstaltung_model', 'LehrveranstaltungModel'); + $this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + $this->_ci->load->model('organisation/Studienplan_model', 'StudienplanModel'); + + $result = $this->_ci->StudierendenantragModel->load($antrag_id); + if (isError($result)) + return $result; + $result = getData($result); + if (!$result) + return error($this->_ci->p->t('studierendenantrag', 'error_no_antrag_found', ['id' => $antrag_id])); + $antrag = current($result); + + + $result = $this->_ci->StudierendenantragModel->getStgAndSem($antrag_id); + if (isError($result)) + return $result; + $result = getData($result); + if (!$result) + return error($this->_ci->p->t('studierendenantrag', 'error_no_stg_and_sem', ['id' => $antrag_id])); + $result = current($result); + $studiengang_kz = $result->studiengang_kz; + $orgform_kurzbz = $result->orgform_kurzbz; + $ausbildungssemester = $result->ausbildungssemester; + $sprache = $result->sprache; + + // NOTE(chris): check permission + $allowedStgs = $this->_ci->permissionlib->getSTG_isEntitledFor('student/studierendenantrag') ?: []; + if (!in_array($studiengang_kz, $allowedStgs)) { + $allowedStgs = $this->_ci->permissionlib->getSTG_isEntitledFor('student/antragfreigabe') ?: []; + if (!in_array($studiengang_kz, $allowedStgs)) { + if(!$this->isOwnAntrag($antrag_id)) + return error('Forbidden'); + } + } + + + $result = $this->_ci->StudiensemesterModel->getNextFrom($antrag->studiensemester_kurzbz); + if (isError($result)) + return $result; + $result = getData($result); + if (!$result) + return error($this->_ci->p->t('studierendenantrag', 'error_no_sem_after', ['semester' => $antrag->studiensemester_kurzbz])); + $semA = current($result)->studiensemester_kurzbz; + + $result = $this->_ci->StudiensemesterModel->getNextFrom($semA); + if (isError($result)) + return $result; + $result = getData($result); + if (!$result) + return error($this->_ci->p->t('studierendenantrag', 'error_no_sem_after', ['semester' => $semA])); + $semB = current($result)->studiensemester_kurzbz; + + $result = $this->_ci->StudierendenantraglehrveranstaltungModel->loadWhere(['studierendenantrag_id' => $antrag_id]); + if (isError($result)) + return $result; + $result = getData($result) ?: []; + + $lvszugewiesen = array(); + foreach ($result as $lv) + { + $lvszugewiesen[$lv->lehrveranstaltung_id] = $lv; + } + + $result = $this->getLvsByStgStsemAndSem( + $studiengang_kz, + $orgform_kurzbz, + $semA, + $ausbildungssemester + 1, + $antrag->prestudent_id, + $antrag->studiensemester_kurzbz, + $sprache + ); + if (isError($result)) + return $result; + $lvsA = $result->retval; // NOTE(chris): don't use getData() because we want to differenciate [] and null + if ($lvsA) { + foreach($lvsA as $lv) + { + if (isset($lvszugewiesen[$lv->lehrveranstaltung_id]) && + ($lvszugewiesen[$lv->lehrveranstaltung_id]->note == $this->_ci->config->item('wiederholung_note_nicht_zugelassen'))) + { + $lv->antrag_zugelassen = true; + $lv->antrag_anmerkung = $lvszugewiesen[$lv->lehrveranstaltung_id]->anmerkung; + } + } + } + + $result = $this->getLvsByStgStsemAndSem( + $studiengang_kz, + $orgform_kurzbz, + $semB, + $ausbildungssemester, + $antrag->prestudent_id, + $antrag->studiensemester_kurzbz, + $sprache + ); + if (isError($result)) + return $result; + $lvsB = getData($result) ?: []; + foreach($lvsB as $lv) + { + if(isset($lvszugewiesen[$lv->lehrveranstaltung_id]) && ($lvszugewiesen[$lv->lehrveranstaltung_id]->note == 0)) + { + $lv->antrag_anmerkung = $lvszugewiesen[$lv->lehrveranstaltung_id]->anmerkung; + $lv->antrag_zugelassen = true; + } + // TODO(manu): eventuelle Änderungen taggen + } + + return success([ + '1' . $semA => $lvsA, + '2' . $semB => $lvsB ?: [] + ]); + } + + public function getLvsByStgStsemAndSem( + $studiengang_kz, + $orgform_kurzbz, + $studiensemester_kurzbz, + $ausbildungssemester, + $prestudent_id, + $note_stsem, + $sprache + ) { + $this->_ci->load->model('organisation/Studienplan_model', 'StudienplanModel'); + + $result = $this->_ci->StudienplanModel->getStudienplaeneBySemester( + $studiengang_kz, + $studiensemester_kurzbz, + $ausbildungssemester, + $orgform_kurzbz + ); + if (isError($result)) + return $result; + $result = getData($result); + if (!$result) { + $result = $this->_ci->StudiengangModel->load($studiengang_kz); + if (isError($result)) + return $result; + if (!hasData($result)) + return error($this->_ci->p->t('studierendenantrag', 'error_no_stg', ['studiengang_kz' => $studiengang_kz])); + $stg = current(getData($result)); + + if ($ausbildungssemester > $stg->max_semester) + return success(); + return error($this->_ci->p->t('studierendenantrag', 'error_no_studienplan', [ + 'studiengang_kz' => $studiengang_kz, + 'studiensemester_kurzbz' => $studiensemester_kurzbz, + 'semester' => $ausbildungssemester + ])); + } + if (count($result) > 1) { + $langmap = array_unique(array_map(function ($a) { + return $a->sprache; + }, $result)); + if ($sprache + && count($langmap) == count($result) + && in_array($sprache, $langmap) + ) { + $result = array_filter($result, function ($a) use ($sprache) { + return $a->sprache == $sprache; + }); + } else { + return error($this->_ci->p->t('studierendenantrag', 'error_multiple_studienplan', [ + 'studiengang_kz' => $studiengang_kz, + 'studiensemester_kurzbz' => $studiensemester_kurzbz, + 'semester' => $ausbildungssemester + ])); + } + } + $studienplan = current($result); + + return $this->_ci->StudienplanModel->getStudienplanLehrveranstaltungForPrestudent( + $studienplan->studienplan_id, + $ausbildungssemester, + $prestudent_id, + $note_stsem + ); + } + + /** + * Checks if a prestudent can submit an Antrag for Abmeldung + * + * @param integer $prestudent_id + * + * @return \stdClass on success retval 0 means not a student; + * retval 1 means Berechtigt; + * retval -1 means has already an Antrag pending; + * retval -2 means other Antrag pending; + * retval -3 means in blacklist stg + */ + public function getPrestudentAbmeldeBerechtigt($prestudent_id) + { + $result = $this->_ci->PrestudentModel->load($prestudent_id); + if (isError($result)) + return $result; + if (!hasData($result)) + return success(0); + $result = current(getData($result)); + $stg_kz = $result->studiengang_kz; + if (in_array($stg_kz, $this->_ci->config->item('stgkz_blacklist_abmeldung'))) + return success(-3); + + $result = $this->_ci->PrestudentstatusModel->getLastStatus($prestudent_id); + if (isError($result)) + return $result; + if (!hasData($result)) + return success(0); + $result = current(getData($result)); + $datumStatus = $result->datum; + + if (!in_array($result->status_kurzbz, $this->_ci->config->item('antrag_prestudentstatus_whitelist'))) { + $result = $this->_ci->StudierendenantragModel->loadWithStatusWhere([ + 'prestudent_id' => $prestudent_id, + 'campus.get_status_studierendenantrag(studierendenantrag_id)' => Studierendenantragstatus_model::STATUS_APPROVED + ], [ + Studierendenantrag_model::TYP_ABMELDUNG, + Studierendenantrag_model::TYP_ABMELDUNG_STGL + ]); + if (isError($result)) + return $result; + if (hasData($result)) + return success(-1); + + return success(0); + } + + $result = $this->_ci->StudierendenantragModel->loadWithStatusWhere(['prestudent_id' => $prestudent_id]); + if (isError($result)) + return $result; + if (!hasData($result)) + return success(1); + $result= getData($result); + foreach ($result as $antrag) + { + if ($antrag->typ == Studierendenantrag_model::TYP_ABMELDUNG || $antrag->typ == Studierendenantrag_model::TYP_ABMELDUNG_STGL) + { + if ($antrag->status == Studierendenantragstatus_model::STATUS_CREATED) + return success(-1); + elseif ($antrag->status == Studierendenantragstatus_model::STATUS_APPROVED && $antrag->datum > $datumStatus) + return success(-1); + } + if ($antrag->typ == Studierendenantrag_model::TYP_WIEDERHOLUNG) + { + if($antrag->status == Studierendenantragstatus_model::STATUS_PASS) + return success(-2); + } + } + + return success(1); + } + + /** + * Checks if a prestudent can submit an Antrag for Unterbrechung + * + * @param integer $prestudent_id + * @param string $studiensemester_kurzbz (optional) + * + * @return \stdClass on success retval 0 means not a student; + * retval 1 means Berechtigt; + * retval -1 means has already an Antrag pending; + * retval -2 means other Antrag pending; + * retval -3 means in blacklist stg + */ + public function getPrestudentUnterbrechungsBerechtigt($prestudent_id, $studiensemester_kurzbz = null) + { + $result = $this->_ci->PrestudentModel->load($prestudent_id); + if (isError($result)) + return $result; + if (!hasData($result)) + return success(0); + $result = current(getData($result)); + $stg_kz = $result->studiengang_kz; + if (in_array($stg_kz, $this->_ci->config->item('stgkz_blacklist_unterbrechung'))) + return success(-3); + + $result = $this->_ci->PrestudentstatusModel->getLastStatus($prestudent_id); + if (isError($result)) + return $result; + if (!hasData($result)) + return success(0); + $result = current(getData($result)); + $datumStatus = $result->datum; + if (!in_array($result->status_kurzbz, $this->_ci->config->item('antrag_prestudentstatus_whitelist'))) { + $result = $this->_ci->StudierendenantragModel->loadWithStatusWhere([ + 'prestudent_id' => $prestudent_id, + 'typ' => Studierendenantrag_model::TYP_UNTERBRECHUNG, + 'campus.get_status_studierendenantrag(studierendenantrag_id)' => Studierendenantragstatus_model::STATUS_APPROVED + ]); + if (isError($result)) + return $result; + if (hasData($result)) + return success(-1); + + return success(0); + } + $result = $this->_ci->StudierendenantragModel->loadWithStatusWhere(['prestudent_id' => $prestudent_id]); + if (isError($result)) + return $result; + if (!hasData($result)) + return success(1); + $result= getData($result); + foreach ($result as $antrag) + { + if ($antrag->typ == Studierendenantrag_model::TYP_ABMELDUNG || $antrag->typ == Studierendenantrag_model::TYP_ABMELDUNG_STGL) + { + if($antrag->status == Studierendenantragstatus_model::STATUS_CREATED) + return success(-2); + elseif($antrag->status == Studierendenantragstatus_model::STATUS_APPROVED && $antrag->datum > $datumStatus) + return success(-2); + } + if ($studiensemester_kurzbz && $antrag->typ == Studierendenantrag_model::TYP_UNTERBRECHUNG) + { + // NOTE(chris): check if this is an old or canceled one + if ($antrag->studiensemester_kurzbz == $studiensemester_kurzbz && $antrag->status != Studierendenantragstatus_model::STATUS_CANCELLED) + return success(-1); + } + if ($antrag->typ == Studierendenantrag_model::TYP_WIEDERHOLUNG) + { + if($antrag->status == Studierendenantragstatus_model::STATUS_PASS) + return success(-2); + } + } + + return success(1); + } + + /** + * Checks if a prestudent can submit an Antrag for Wiederholung + * + * @param integer $prestudent_id + * + * @return \stdClass on success retval 0 means not a student; + * retval 1 means Berechtigt; + * retval -1 means has already an Antrag pending; + * retval -2 means other Antrag pending; + * retval -3 means in blacklist stg + */ + public function getPrestudentWiederholungsBerechtigt($prestudent_id) + { + $result = $this->_ci->PrestudentModel->load($prestudent_id); + if (isError($result)) + return $result; + if (!hasData($result)) + return success(0); + $result = current(getData($result)); + $stg_kz = $result->studiengang_kz; + if (in_array($stg_kz, $this->_ci->config->item('stgkz_blacklist_wiederholung'))) + return success(-3); + + $result = $this->getFailedExamForPrestudent($prestudent_id); + if (isError($result)) + return $result; + if (!hasData($result)) + return success(0); + + $result = $this->_ci->PrestudentstatusModel->getLastStatus($prestudent_id); + if (isError($result)) + return $result; + if (!hasData($result)) + return success(0); + + $result = current(getData($result)); + $datumStatus = $result->datum; + if (!in_array($result->status_kurzbz, $this->_ci->config->item('antrag_prestudentstatus_whitelist'))) { + $result = $this->_ci->StudierendenantragModel->loadWithStatusWhere([ + 'prestudent_id' => $prestudent_id, + 'typ' => Studierendenantrag_model::TYP_WIEDERHOLUNG, + 'campus.get_status_studierendenantrag(studierendenantrag_id)' => Studierendenantragstatus_model::STATUS_APPROVED + ]); + if (isError($result)) + return $result; + if (hasData($result)) + return success(-1); + + return success(0); + } + $result = $this->_ci->StudierendenantragModel->loadWithStatusWhere(['prestudent_id' => $prestudent_id]); + if (isError($result)) + return $result; + if (!hasData($result)) + return success(1); + $result= getData($result); + foreach ($result as $antrag) + { + if ($antrag->typ == Studierendenantrag_model::TYP_ABMELDUNG || $antrag->typ == Studierendenantrag_model::TYP_ABMELDUNG_STGL) + { + if($antrag->status == Studierendenantragstatus_model::STATUS_CREATED) + return success(-2); + elseif($antrag->status == Studierendenantragstatus_model::STATUS_APPROVED && $antrag->datum > $datumStatus) + return success(-2); + } + if ($antrag->typ == Studierendenantrag_model::TYP_WIEDERHOLUNG) + { + return success(-1); + } + } + + return success(1); + } + + /** + * Gets details for a new Antrag + * + * @param integer $prestudent_id + * + * @return \stdClass + */ + public function getDetailsForNewAntrag($prestudent_id) + { + $result = $this->_ci->PrestudentstatusModel->loadLastWithStgDetails($prestudent_id); + if (isError($result)) + return $result; + if (!hasData($result)) + return error($this->_ci->p->t('studierendenantrag', 'error_no_prestudentstatus', ['prestudent_id' => $prestudent_id])); + $result = current(getData($result)); + return success($result); + } + + public function getDetailsForLastAntrag($prestudent_id, $typ = null) + { + $result = $this->_ci->PrestudentstatusModel->loadLastWithStgDetails($prestudent_id); + if (isError($result)) + return $result; + if (!hasData($result)) + return error($this->_ci->p->t('studierendenantrag', 'error_no_prestudentstatus', ['prestudent_id' => $prestudent_id])); + $resultDetails = current(getData($result)); + + $where = [ + 'prestudent_id' => $prestudent_id + ]; + $types = null; + if ($typ) { + if (is_array($typ)) + $types = $typ; + else + $where['typ'] = $typ; + } + $result = $this->_ci->StudierendenantragModel->loadWithStatusWhere($where, $types); + if (isError($result)) + return $result; + + $antraege = getData($result) ?: []; + $resultAntrag = null; + foreach ($antraege as $antrag) { + if ($antrag->status != Studierendenantragstatus_model::STATUS_CANCELLED) { + $resultAntrag = $antrag; + break; + } + } + if (!$resultAntrag) + return error($this->_ci->p->t('studierendenantrag', 'error_no_antrag_found_prestudent', [ + 'typ' => $typ ?: '', + 'prestudent_id' => $prestudent_id + ])); + + $resultDetails->status = $resultAntrag->status; + $resultDetails->statustyp = $resultAntrag->statustyp; + $resultDetails->grund = $resultAntrag->grund; + $resultDetails->studierendenantrag_id = $resultAntrag->studierendenantrag_id; + $resultDetails->typ = $resultAntrag->typ; + + return success($resultDetails); + } + + public function getDetailsForAntrag($studierendenantrag_id) + { + $where = [ + 'studierendenantrag_id' => $studierendenantrag_id + ]; + + $result = $this->_ci->StudierendenantragModel->loadWithStatusWhere($where); + if (isError($result)) + return $result; + + if (!hasData($result)) + return error($this->_ci->p->t('studierendenantrag', "error_no_antrag_found", ['id' => $studierendenantrag_id])); + $resultAntrag = current(getData($result)); + + $result = $this->_ci->PrestudentstatusModel->loadLastWithStgDetails($resultAntrag->prestudent_id, $resultAntrag->studiensemester_kurzbz); + if (isError($result)) + return $result; + if (!hasData($result)) { + $result = $this->_ci->PrestudentstatusModel->loadLastWithStgDetails($resultAntrag->prestudent_id); + if (isError($result)) + return $result; + if (!hasData($result)) + return error($this->_ci->p->t('studierendenantrag', 'error_no_prestudentstatus', $resultAntrag)); + } + $resultDetails = current(getData($result)); + + $resultDetails->status = $resultAntrag->status; + $resultDetails->statustyp = $resultAntrag->statustyp; + $resultDetails->grund = $resultAntrag->grund; + $resultDetails->studierendenantrag_id = $resultAntrag->studierendenantrag_id; + $resultDetails->typ = $resultAntrag->typ; + $resultDetails->dms_id = $resultAntrag->dms_id; + $resultDetails->datum_wiedereinstieg = $resultAntrag->datum_wiedereinstieg; + + return success($resultDetails); + } + + public function getSemesterForUnterbrechung($studiensemester_kurzbz) + { + $this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + + $semester = []; + + $result = $this->_ci->StudiensemesterModel->getNextFrom($studiensemester_kurzbz); + if (!hasData($result)) + return $semester; + $nextSem = current(getData($result)); + + $semester[0] = [ + 'studiensemester_kurzbz' => $studiensemester_kurzbz, + 'wiedereinstieg' => [$nextSem] + ]; + + $result = $this->_ci->StudiensemesterModel->getNextFrom($nextSem->studiensemester_kurzbz); + if (!hasData($result)) + return $semester; + + $currSemester = current(getData($result)); + $followingSemester = [$currSemester]; + + $max = $this->_ci->config->item('unterbrecher_semester_max_length'); + if(!$max || $max < 1) + $max = 2; + + for ($i = 1; $i < $max; $i++) { + $result = $this->_ci->StudiensemesterModel->getNextFrom($currSemester->studiensemester_kurzbz); + if (!hasData($result)) + break; + $currSemester = current(getData($result)); + $followingSemester[] = $currSemester; + } + + $semester[1] = [ + 'studiensemester_kurzbz' => $nextSem->studiensemester_kurzbz, + 'wiedereinstieg' => $followingSemester + ]; + + //remove last Semester of the array + array_pop($followingSemester); + + foreach ($followingSemester as $sem) + $semester[0]['wiedereinstieg'][] = $sem; + + return $semester; + } + + public function getAktivePrestudentenInStgs($studiengaenge, $query) + { + $blacklist = $this->_ci->config->item('stgkz_blacklist_abmeldung'); + $studiengaenge = array_diff($studiengaenge, $blacklist); + return $this->_ci->StudiengangModel->getAktivePrestudenten( + $studiengaenge, + [ Studierendenantrag_model::TYP_ABMELDUNG ], + $query + ); + } + + public function getFailedExamForPrestudent($prestudent_id) + { + return $this->_ci->PruefungModel->loadWhereCommitteeExamFailedForPrestudent($prestudent_id); + } + + public function saveLvs($lvArray) + { + $result = $this->_ci->StudierendenantraglehrveranstaltungModel->deleteWhere([ + 'studierendenantrag_id' => $lvArray[0]['studierendenantrag_id'] + ]); + if (isError($result)) + return $result; + + $result = $this->_ci->StudierendenantraglehrveranstaltungModel->insertBatch($lvArray); + if (isError($result)) + return $result; + + $result = $this->_ci->StudierendenantragstatusModel->insert([ + 'studierendenantrag_id' => $lvArray[0]['studierendenantrag_id'], + 'studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_LVSASSIGNED, + 'insertvon' => $lvArray[0]['insertvon'] + ]); + if (isError($result)) + return $result; + + $antrag_status_id = getData($result); + $result = $this->_ci->StudierendenantragstatusModel->loadWithTyp($antrag_status_id); + + return $result; + } + + public function approveWiederholung($antrag_id, $insertvon) + { + $this->_ci->load->model('crm/Student_model', 'StudentModel'); + + $result = $this->_ci->StudierendenantragstatusModel->insert([ + 'studierendenantrag_id' => $antrag_id, + 'studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_APPROVED, + 'insertvon' => $insertvon + ]); + + if (isError($result)) { + return $result; + } + + $result = $this->_ci->StudierendenantragModel->getStgEmail($antrag_id); + if (isError($result)) + return $result; + $result = getData($result); + if (!$result) + return error($this->_ci->p->t('studierendenantrag', 'error_no_stg_email', ['id' => $antrag_id])); + + $email = current($result)->email; + + $result = $this->_ci->StudierendenantragModel->getStgAndSem($antrag_id); + if (isError($result)) + return $result; + $result = getData($result); + if (!$result) + return error($this->_ci->p->t('studierendenantrag', 'error_no_stg_antrag', ['id' => $antrag_id])); + + $stg = current($result); + $studiengang_kz = $stg->studiengang_kz; + $semester = $stg->ausbildungssemester; + + $result = $this->_ci->StudierendenantragModel->load($antrag_id); + if (isError($result)) + return $result; + if (!hasData($result)) + return error($this->_ci->p->t('studierendenantrag', 'error_no_antrag_found', ['id' => $antrag_id])); + $result = current(getData($result)); + $prestudent_id = $result->prestudent_id; + + $result = $this->_ci->PersonModel->loadPrestudent($prestudent_id); + if (isError($result)) + return $result; + if (!hasData($result)) + return error($this->_ci->p->t('studierendenantrag', 'error_no_person_prestudent', ['prestudent_id' => $prestudent_id])); + $person = current(getData($result)); + $student = trim($person->vorname . ' ' . $person->nachname); + + $result = $this->_ci->PersonModel->getFullName($insertvon); + if (isError($result)) + return $result; + $mitarbeiter = $insertvon; + if (hasData($result)) { + $mitarbeiter = getData($result); + } + + $result = $this->_ci->StudentModel->loadWhere(['prestudent_id'=> $prestudent_id]); + if (hasData($result)) { + $studentObj = current(getData($result)); + $student_uid = $studentObj->student_uid; + } + else + $student_uid = ''; + + // NOTE(chris): Sancho mail + if (!sendSanchoMail( + 'Sancho_Mail_Antrag_W_Approve', + [ + 'antrag_id' => $antrag_id, + 'stg' => $stg->bezeichnung, + 'sem' => $semester, + 'student' => $student, + 'mitarbeiter' => $mitarbeiter, + 'Orgform' => $stg->orgform_kurzbz, + 'UID' => $student_uid + ], + $email, + $this->_ci->p->t('studierendenantrag', 'mail_subject_W_Approve') + )) + return error($this->_ci->p->t('studierendenantrag', 'error_mail_to', ['email' => $email])); + + if ($student_uid) { + $email = $this->_ci->StudentModel->getEmailFH($student_uid); + + $sem_not_allowed = $sem_to_repeat = ''; + $list_not_allowed = $list_to_repeat = $this->_ci->p->t('studierendenantrag', 'mail_part_error_no_lvs'); + + $result = $this->getLvsForAntrag($antrag_id); + if (hasData($result)) { + $lvs = getData($result); + foreach ($lvs as $sem => $lv_list) { + $lvs_filtered = array_filter($lv_list, function ($el) { + return property_exists($el, 'antrag_zugelassen') && $el->antrag_zugelassen; + }); + if (substr($sem, 0, 1) == '1') { + $sem_not_allowed = substr($sem, 1); + $list_not_allowed = array_map(function ($el) { + return $el->bezeichnung . '(' . $el->lehrform_kurzbz . ')'; + }, $lvs_filtered); + $list_not_allowed = '
  • ' . implode('
  • ', $list_not_allowed) . '
'; + } else { + $sem_to_repeat = substr($sem, 1); + $list_to_repeat = array_map(function ($el) { + return $el->bezeichnung . '(' . $el->lehrform_kurzbz . ')'; + }, $lvs_filtered); + $list_to_repeat = '
  • ' . implode('
  • ', $list_to_repeat) . '
'; + } + } + } + + // NOTE(chris): Sancho mail + sendSanchoMail( + 'Sancho_Mail_Antrag_W_Student', + [ + 'antrag_id' => $antrag_id, + 'stg' => $stg->bezeichnung, + 'sem' => $semester, + 'mitarbeiter' => $mitarbeiter, + 'student' => $student, + 'sem_not_allowed' => $sem_not_allowed, + 'list_not_allowed' => $list_not_allowed, + 'sem_to_repeat' => $sem_to_repeat, + 'list_to_repeat' => $list_to_repeat, + 'Orgform' => $stg->orgform_kurzbz + ], + $email, + $this->_ci->p->t('studierendenantrag', 'mail_subject_W_Student') + ); + } + + + return success(); + } + + public function getAntragHistory($antrag_id) + { + $result = $this->_ci->StudierendenantragstatusModel->loadWithTypWhere([ + 'studierendenantrag_id' => $antrag_id + ]); + return $result; + } + + + /** + * @param integer $studierendenantrag_id + * + * @return boolean + */ + protected function isOwnAntrag($studierendenantrag_id) + { + if ($studierendenantrag_id == null) + return false; + $result = $this->_ci->StudierendenantragModel->loadForPerson(getAuthPersonId()); + if (!hasData($result)) + return false; + $antraege = array_map(function ($antrag) { + return $antrag->studierendenantrag_id; + }, getData($result)); + + return in_array($studierendenantrag_id, $antraege); + } + + /** + * @param integer $studierendenantrag_id + * @param string $permission either 'student/antragfreigabe' or 'student/studierendenantrag' + * + * @return boolean + */ + protected function hasAccessToAntrag($studierendenantrag_id, $permission) + { + $studiengaenge = $this->_ci->permissionlib->getSTG_isEntitledFor($permission); + if (!$studiengaenge) + return false; + $result = $this->_ci->StudierendenantragModel->isInStudiengang($studierendenantrag_id, $studiengaenge); + return (boolean)getData($result); + } + + /** + * @param integer $antrag_id + * + * @return boolean + */ + public function isEntitledToShowAntrag($antrag_id) + { + return + ( + $this->isOwnAntrag($antrag_id) || + $this->hasAccessToAntrag($antrag_id, 'student/antragfreigabe') || + $this->hasAccessToAntrag($antrag_id, 'student/studierendenantrag') + ); + } + + /** + * @param integer $antrag_id + * + * @return boolean + */ + public function isEntitledToSeeHistoryForAntrag($antrag_id) + { + return + ( + $this->isOwnAntrag($antrag_id) || + $this->hasAccessToAntrag($antrag_id, 'student/antragfreigabe') || + $this->hasAccessToAntrag($antrag_id, 'student/studierendenantrag') + ); + } + + /** + * @param integer $prestudent_id + * @param boolean $checkAssistencePermission + * + * @return boolean + */ + public function isEntitledToCreateAntragFor($prestudent_id, $checkAssistencePermission = false) + { + $result = $this->_ci->PrestudentModel->load($prestudent_id); + if (!hasData($result)) + return false; + + $result = getData($result)[0]; + $person_id = $result->person_id; + + if (getAuthPersonId() == $person_id) + return true; + + if ($checkAssistencePermission) + { + $studiengaenge = $this->_ci->permissionlib->getSTG_isEntitledFor('student/studierendenantrag'); + if (in_array($result->studiengang_kz, $studiengaenge ?: [])) + return true; + } + + return false; + } + + /** + * @param integer $antrag_id + * + * @return boolean + */ + public function isEntitledToCancelAntrag($antrag_id) + { + $result = $this->_ci->StudierendenantragModel->load($antrag_id); + if (!hasData($result)) + return false; + $antrag = current(getData($result)); + + if ($antrag->typ != Studierendenantrag_model::TYP_ABMELDUNG_STGL) + return $this->isOwnAntrag($antrag_id); + + return $this->hasAccessToAntrag($antrag_id, 'student/studierendenantrag'); + } + + /** + * @param integer $antrag_id + * + * @return boolean + */ + public function isEntitledToReopenAntrag($antrag_id) + { + return $this->hasAccessToAntrag($antrag_id, 'student/studierendenantrag'); + } + + /** + * @param integer $antrag_id + * + * @return boolean + */ + public function isEntitledToObjectAntrag($antrag_id) + { + return ($this->hasAccessToAntrag($antrag_id, 'student/antragfreigabe') || $this->hasAccessToAntrag($antrag_id, 'student/studierendenantrag')); + } + + /** + * @param integer $antrag_id + * + * @return boolean + */ + public function isEntitledToApproveAntrag($antrag_id) + { + return $this->hasAccessToAntrag($antrag_id, 'student/antragfreigabe'); + } + + /** + * @param integer $antrag_id + * + * @return boolean + */ + public function isEntitledToRejectAntrag($antrag_id) + { + return $this->hasAccessToAntrag($antrag_id, 'student/antragfreigabe'); + } + + /** + * @param integer $antrag_id + * @param string|array $status + * + * @return boolean + */ + public function hasStatus($antrag_id, $status) + { + $result = $this->_ci->StudierendenantragModel->getWithLastStatusWhere(['s.studierendenantrag_id' => $antrag_id]); + if (!hasData($result)) + return false; + $lastStatus = getData($result)[0]; + + if (!is_array($status)) + $status = [$status]; + + return in_array($lastStatus->studierendenantrag_statustyp_kurzbz, $status); + } + + /** + * @param integer $antrag_id + * @param string|array $type + * + * @return boolean + */ + public function hasType($antrag_id, $type) + { + $result = $this->_ci->StudierendenantragModel->load($antrag_id); + if (!hasData($result)) + return false; + $antrag = getData($result)[0]; + + if (!is_array($type)) + $type = [$type]; + + return in_array($antrag->typ, $type); + } + + + /** + * @param integer $antrag_id + * + * @return boolean + */ + public function getLvsForPrestudent($prestudent_id, $studiensemester_kurzbz) + { + $result = $this->_ci->StudierendenantraglehrveranstaltungModel->getLvsForPrestudent($prestudent_id, $studiensemester_kurzbz); + return $result; + } +} diff --git a/application/libraries/AuthLib.php b/application/libraries/AuthLib.php index ae30d41fa..de9c15350 100644 --- a/application/libraries/AuthLib.php +++ b/application/libraries/AuthLib.php @@ -551,10 +551,7 @@ class AuthLib // Needed information $this->_ci->PersonModel->addSelect('person_id, vorname, nachname, uid'); // Retrieves the uid if it is possible for active users - $this->_ci->PersonModel->addJoin( - '(SELECT uid, person_id FROM public.tbl_benutzer WHERE aktiv = TRUE) tb', 'person_id', - 'LEFT' - ); + $this->_ci->PersonModel->addJoin('public.tbl_benutzer', 'person_id', 'LEFT'); // Execute query with where clause $personResult = $this->_ci->PersonModel->loadWhere($queryParamsArray); diff --git a/application/libraries/DmsLib.php b/application/libraries/DmsLib.php index fccfe503b..774ebdc79 100644 --- a/application/libraries/DmsLib.php +++ b/application/libraries/DmsLib.php @@ -595,6 +595,8 @@ class DmsLib if (isError($insDmsResult)) return $insDmsResult; $upload_data['dms_id'] = getData($insDmsResult); + if(isset($upload_data['file_type']) && !isset($dms['mimetype'])) + $dms['mimetype'] = $upload_data['file_type']; // Insert DMS version $insVersionResult = $this->_ci->DmsVersionModel->insert( diff --git a/application/libraries/MailLib.php b/application/libraries/MailLib.php index dbbc22f08..60dd52342 100644 --- a/application/libraries/MailLib.php +++ b/application/libraries/MailLib.php @@ -182,6 +182,7 @@ class MailLib { if ($this->sended == $this->email_number_per_time_range) { + $this->sended = 0; sleep($this->email_time_range); // Wait!!! } } diff --git a/application/libraries/PersonLogLib.php b/application/libraries/PersonLogLib.php index fe9a82504..f4f434fad 100644 --- a/application/libraries/PersonLogLib.php +++ b/application/libraries/PersonLogLib.php @@ -7,9 +7,6 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); */ class PersonLogLib { - const PARKED_LOGNAME = 'Parked'; - const ONHOLD_LOGNAME = 'Onhold'; - /** * Constructor */ @@ -78,168 +75,6 @@ class PersonLogLib else show_error(getError($result)); } - - /** - * Parks a person, i.e. marks a person so no actions are expected for the person (e.g. as a prestudent) - * Done by adding a logentry in the future - * @param $person_id - * @param $date - * @param $taetigkeit_kurzbz - * @param string $app - * @param null $oe_kurzbz - * @param null $user - * @return insert object - */ - public function park($person_id, $date, $taetigkeit_kurzbz, $app = 'core', $oe_kurzbz = null, $user = null) - { - $onhold = $this->getOnHoldDate($person_id); - - if (hasData($onhold)) - return error("Person already on hold"); - - $logjson = array( - 'name' => self::PARKED_LOGNAME - ); - - return $this->_savePsLog($person_id, $date, $taetigkeit_kurzbz, $logjson, $app, $oe_kurzbz, $user); - } - - /** - * Unparks a person, i.e. removes all log entries in the future with logname for parking - * @param $person_id - * @return array with deleted logids - */ - public function unPark($person_id) - { - $deleted = array(); - - $result = $this->ci->PersonLogModel->getLogsInFuture($person_id); - if (hasData($result)) - { - foreach ($result->retval as $log) - { - $logdata = json_decode($log->logdata); - if (isset($logdata->name) && $logdata->name === self::PARKED_LOGNAME) - { - $delresult = $this->ci->PersonLogModel->deleteLog($log->log_id); - if (isSuccess($delresult)) - { - $deleted[] = $log->log_id; - } - } - } - } - - return success($deleted); - } - - /** - * Gets date until which a person is parked - * @param $person_id - * @return the date if person is parked, null otherwise - */ - public function getParkedDate($person_id) - { - $result = $this->ci->PersonLogModel->getLogsInFuture($person_id); - - $parkeddate = null; - - if (hasData($result)) - { - foreach ($result->retval as $log) - { - $logdata = json_decode($log->logdata); - if (isset($logdata->name) && $logdata->name === self::PARKED_LOGNAME) - { - $parkeddate = $log->zeitpunkt; - break; - } - } - } - - return $parkeddate; - } - - /** - * Sets person on hold, i.e. marks a person so no actions are expected for the person (e.g. as a prestudent). - * Done by adding a logentry with a special name. can be undone only manually by clicking button. - * @param $person_id - * @param $date - * @param $taetigkeit_kurzbz - * @param string $app - * @param null $oe_kurzbz - * @param null $user - * @return array - */ - public function setOnHold($person_id, $date, $taetigkeit_kurzbz, $app = 'core', $oe_kurzbz = null, $user = null) - { - $parked = $this->getParkedDate($person_id); - - if (hasData($parked)) - return error("Person already parked"); - - $logjson = array( - 'name' => self::ONHOLD_LOGNAME - ); - - return $this->_savePsLog($person_id, $date, $taetigkeit_kurzbz, $logjson, $app, $oe_kurzbz, $user); - } - - /** - * Removes on hold status, i.e. removes all log entries with logname for on hold - * @param $person_id - * @return array - */ - public function removeOnHold($person_id) - { - $deleted = array(); - - $result = $this->ci->PersonLogModel->filterLog($person_id); - if (hasData($result)) - { - foreach ($result->retval as $log) - { - $logdata = json_decode($log->logdata); - if (isset($logdata->name) && $logdata->name === self::ONHOLD_LOGNAME) - { - $delresult = $this->ci->PersonLogModel->deleteLog($log->log_id); - if (isSuccess($delresult)) - { - $deleted[] = $log->log_id; - } - } - } - } - return success($deleted); - } - - /** - * Gets date until which a person is on hold - * @param $person_id - * @return the date if person is on hold, null otherwise - */ - public function getOnHoldDate($person_id) - { - $result = $this->ci->PersonLogModel->filterLog($person_id); - - $onholddate = null; - - if (hasData($result)) - { - foreach ($result->retval as $log) - { - $logdata = json_decode($log->logdata); - if (isset($logdata->name) && $logdata->name === self::ONHOLD_LOGNAME) - { - $onholddate = $log->zeitpunkt; - break; - } - } - } - - return $onholddate; - } - /** * Saves a processstate log with specified parameters, including a specified log date. * @param $person_id diff --git a/application/libraries/PrestudentLib.php b/application/libraries/PrestudentLib.php new file mode 100644 index 000000000..989e14585 --- /dev/null +++ b/application/libraries/PrestudentLib.php @@ -0,0 +1,412 @@ +_ci =& get_instance(); + + // // Configs + // $this->_ci->load->config('studierendenantrag'); + + // // Models + $this->_ci->load->model('crm/Prestudent_model', 'PrestudentModel'); + $this->_ci->load->model('crm/Student_model', 'StudentModel'); + $this->_ci->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel'); + $this->_ci->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel'); + $this->_ci->load->model('organisation/Lehrverband_model', 'LehrverbandModel'); + $this->_ci->load->model('education/Studentlehrverband_model', 'StudentlehrverbandModel'); + $this->_ci->load->model('person/Benutzer_model', 'BenutzerModel'); + $this->_ci->load->model('organisation/Studiengang_model', 'StudiengangModel'); + } + + public function setAbbrecher($prestudent_id, $studiensemester_kurzbz, $insertvon = null, $statusgrund_kurzbz = null, $datum = null, $bestaetigtam = null, $bestaetigtvon = null) + { + if (!$insertvon) + $insertvon = getAuthUID(); + if (!$bestaetigtvon) + $bestaetigtvon = $insertvon; + + $result = $this->_ci->PrestudentstatusModel->getLastStatus($prestudent_id, $studiensemester_kurzbz); + if (isError($result)) + return $result; + $result = getData($result); + if (!$result) + return error($this->_ci->p->t('studierendenantrag', 'error_no_prestudent_in_sem', [ + 'prestudent_id' => $prestudent_id, + 'studiensemester_kurzbz' => $studiensemester_kurzbz + ])); + + $prestudent_status = current($result); + + $result = $this->_ci->StudentModel->loadWhere(['prestudent_id' => $prestudent_id]); + + if (isError($result)) + return $result; + $result = getData($result); + if (!$result) + return error($this->_ci->p->t('studierendenantrag', 'error_no_student_for_prestudent', ['prestudent_id' => $prestudent_id])); + + $student = current($result); + + if(!$datum) + $datum = date('c'); + + if(!$bestaetigtam) + $bestaetigtam = date('c'); + + //Status und Statusgrund updaten + $result = $this->_ci->PrestudentstatusModel->withGrund($statusgrund_kurzbz)->insert([ + 'prestudent_id' => $prestudent_id, + 'status_kurzbz' => Prestudentstatus_model::STATUS_ABBRECHER, + 'studiensemester_kurzbz' => $studiensemester_kurzbz, + 'ausbildungssemester' => $prestudent_status->ausbildungssemester, + 'datum' => $datum, + 'insertvon' => $insertvon, + 'insertamum' => date('c'), + 'orgform_kurzbz'=> $prestudent_status->orgform_kurzbz, + 'studienplan_id'=> $prestudent_status->studienplan_id, + 'bestaetigtvon' => $bestaetigtvon, + 'bestaetigtam' => $bestaetigtam + ]); + + if (isError($result)) + return $result; + + + //Verband anlegen + $result = $this->_ci->LehrverbandModel->load([ + 'studiengang_kz' => $student->studiengang_kz, + 'semester' => 0, + 'verband' => 'A', + 'gruppe' => '' + ]); + + if (isError($result)) + return $result; + $result = getData($result); + if (!$result) + { + $result = $this->_ci->LehrverbandModel->load([ + 'studiengang_kz' => $student->studiengang_kz, + 'semester' => 0, + 'verband' => '', + 'gruppe' => '' + ]); + if (isError($result)) + return $result; + $result = getData($result); + + if(!$result) + { + $this->_ci->LehrverbandModel->insert([ + 'studiengang_kz' => $student->studiengang_kz, + 'semester' => 0, + 'verband' => '', + 'gruppe' => '', + 'bezeichnung' => 'Ab-Unterbrecher', + 'aktiv' => true, + ]); + } + + $this->_ci->LehrverbandModel->insert([ + 'studiengang_kz' => $student->studiengang_kz, + 'semester' => 0, + 'verband' => 'A', + 'gruppe' => '', + 'bezeichnung' => 'Abbrecher', + 'aktiv' => true + ]); + } + + //noch nicht eingetragene Zeugnisnoten auf 9 setzen + $result = $this->_ci->ZeugnisnoteModel->getZeugnisnoten($student->student_uid, $studiensemester_kurzbz); + if (isError($result)) + return $result; + $result = getData($result) ?: []; + + foreach ($result as $lv) + { + if (!$lv->note) + { + $result = $this->_ci->ZeugnisnoteModel->insert([ + 'note' => 9, + 'studiensemester_kurzbz' => $lv->studiensemester_kurzbz, + 'student_uid' => $lv->uid, + 'lehrveranstaltung_id' => $lv->lehrveranstaltung_id + ]); + if (isError($result)) { + $result = $this->_ci->ZeugnisnoteModel->update([ + 'studiensemester_kurzbz' => $lv->studiensemester_kurzbz, + 'student_uid' => $lv->uid, + 'lehrveranstaltung_id' => $lv->lehrveranstaltung_id + ], [ + 'note' => 9 + ]); + + if (isError($result)) + return $result; + } + } + } + + + //Update Aktionen + + //StudentModel updaten + $this->_ci->StudentModel->update([ + 'student_uid' => $student->student_uid + ], [ + 'verband' => 'A', + 'gruppe' => '', + 'semester' => 0, + 'updatevon' => $insertvon, + 'updateamum' => date('c') + ]); + + //Studentlehrverband setzen + $this->_ci->StudentlehrverbandModel->update([ + 'studiensemester_kurzbz' => $studiensemester_kurzbz, + 'student_uid' => $student->student_uid + ], [ + 'studiengang_kz' => $student->studiengang_kz, + 'semester' => 0, + 'verband' => 'A', + 'gruppe' => '', + 'updateamum' => date('c'), + 'updatevon' => $insertvon + ]); + + //Benutzer inaktiv setzen + $this->_ci->BenutzerModel->update([ + 'uid' => $student->student_uid + ], [ + 'aktiv' => false, + 'updateaktivvon' => $insertvon, + 'updateaktivam' => date('c'), + 'updatevon' => $insertvon, + 'updateamum' => date('c') + ]); + + return success(); + } + + public function setUnterbrecher($prestudent_id, $studiensemester_kurzbz, $studierendenantrag_id, $insertvon = null) + { + $ausbildungssemester_plus = 0; + if (!$insertvon) + $insertvon = getAuthUID(); + + $result = $this->_ci->PrestudentstatusModel->getLastStatus($prestudent_id, $studiensemester_kurzbz); + if (isError($result)) + return $result; + $result = getData($result); + if (!$result) { + //NOTE(manu): only valid if nextSemester focus max + + $result = $this->_ci->PrestudentstatusModel->getLastStatus($prestudent_id); + if (isError($result)) + return $result; + $result = getData($result); + + //check if ausbildungssemester is last + $this->_ci->StudiengangModel->addJoin('public.tbl_prestudent p', 'studiengang_kz'); + $res = $this->_ci->StudiengangModel->loadWhere(['p.prestudent_id' => $prestudent_id]); + if(isError($res)) + return $res; + if(!hasData($res)) + return error($this->_ci->p->t('studierendenantrag', 'error_no_stg_for_prestudent', [ + 'prestudent_id' => $prestudent_id + ])); + + $studiengang = current(getData($res)); + $prestudent_status = current($result); + if($prestudent_status->ausbildungssemester + 1 < $studiengang->max_semester) + $ausbildungssemester_plus = 1; + + if(!$result) + { + return error($this->_ci->p->t('studierendenantrag', 'error_no_prestudent_in_sem', [ + 'prestudent_id' => $prestudent_id, + 'studiensemester_kurzbz' => $studiensemester_kurzbz + ])); + } + } + + $prestudent_status = current($result); + $result = $this->_ci->StudentModel->loadWhere(['prestudent_id' => $prestudent_id]); + + if (isError($result)) + return $result; + $result = getData($result); + if (!$result) + return error($this->_ci->p->t('studierendenantrag', 'error_no_student_for_prestudent', ['prestudent_id' => $prestudent_id])); + + $student = current($result); + + $resultAntrag = $this->_ci->StudierendenantragModel->load($studierendenantrag_id); + if (isError($resultAntrag)) + return $resultAntrag; + $resultAntrag = getData($resultAntrag); + if (!$resultAntrag) + return error($this->_ci->p->t('studierendenantrag', 'error_no_antrag_found', ['id' => $studierendenantrag_id])); + + $antrag = current($resultAntrag); + + //Status updaten + $result = $this->_ci->PrestudentstatusModel->insert([ + 'prestudent_id' => $prestudent_id, + 'status_kurzbz' => Prestudentstatus_model::STATUS_UNTERBRECHER, + 'studiensemester_kurzbz' => $studiensemester_kurzbz, + 'ausbildungssemester' => $prestudent_status->ausbildungssemester + $ausbildungssemester_plus, + 'datum' => date('c'), + 'insertvon' => $insertvon, + 'insertamum' => date('c'), + 'orgform_kurzbz'=> $prestudent_status->orgform_kurzbz, + 'studienplan_id'=> $prestudent_status->studienplan_id, + 'bestaetigtvon' => $insertvon, + 'bestaetigtam' => date('c'), + 'anmerkung'=> 'Wiedereinstieg ' . $antrag->datum_wiedereinstieg + ]); + + if (isError($result)) + return $result; + + //Verband anlegen + $result = $this->_ci->LehrverbandModel->load([ + 'studiengang_kz' => $student->studiengang_kz, + 'semester' => 0, + 'verband' => 'B', + 'gruppe' => '' + ]); + + if (isError($result)) + return $result; + $result = getData($result); + if (!$result) + { + $result = $this->_ci->LehrverbandModel->load([ + 'studiengang_kz' => $student->studiengang_kz, + 'semester' => 0, + 'verband' => '', + 'gruppe' => '' + ]); + if (isError($result)) + return $result; + $result = getData($result); + + if(!$result) + { + $this->_ci->LehrverbandModel->insert([ + 'studiengang_kz' => $student->studiengang_kz, + 'semester' => 0, + 'verband' => '', + 'gruppe' => '', + 'bezeichnung' => 'Ab-Unterbrecher', + 'aktiv' => true, + ]); + } + + $this->_ci->LehrverbandModel->insert([ + 'studiengang_kz' => $student->studiengang_kz, + 'semester' => 0, + 'verband' => 'B', + 'gruppe' => '', + 'bezeichnung' => 'Unterbrecher', + 'aktiv' => true + ]); + } + + //noch nicht eingetragene Zeugnisnoten auf 9 setzen + $result = $this->_ci->ZeugnisnoteModel->getZeugnisnoten($student->student_uid, $studiensemester_kurzbz); + if (isError($result)) + return $result; + $result = getData($result) ?: []; + + foreach ($result as $lv) + { + if (!$lv->note) + { + $result = $this->_ci->ZeugnisnoteModel->insert([ + 'note' => 9, + 'studiensemester_kurzbz' => $lv->studiensemester_kurzbz, + 'student_uid' => $lv->uid, + 'lehrveranstaltung_id' => $lv->lehrveranstaltung_id + ]); + if (isError($result)) { + $result = $this->_ci->ZeugnisnoteModel->update([ + 'studiensemester_kurzbz' => $lv->studiensemester_kurzbz, + 'student_uid' => $lv->uid, + 'lehrveranstaltung_id' => $lv->lehrveranstaltung_id + ], [ + 'note' => 9 + ]); + + if (isError($result)) + return $result; + } + } + } + + + //Update Aktionen + + //StudentModel updaten + $this->_ci->StudentModel->update([ + 'student_uid' => $student->student_uid + ], [ + 'verband' => 'B', + 'gruppe' => '', + 'semester' => 0, + 'updatevon' => $insertvon, + 'updateamum' => date('c') + ]); + + //Studentlehrverband setzen + $result = $this->_ci->StudentlehrverbandModel->loadWhere([ + 'studiensemester_kurzbz' => $studiensemester_kurzbz, + 'student_uid' => $student->student_uid + ]); + if (hasData($result)) { + $this->_ci->StudentlehrverbandModel->update([ + 'studiensemester_kurzbz' => $studiensemester_kurzbz, + 'student_uid' => $student->student_uid + ], [ + 'studiengang_kz' => $student->studiengang_kz, + 'semester' => 0, + 'verband' => 'B', + 'gruppe' => '', + 'updateamum' => date('c'), + 'updatevon' => $insertvon + ]); + } else { + $this->_ci->StudentlehrverbandModel->insert([ + 'student_uid' => $student->student_uid, + 'studiensemester_kurzbz' => $studiensemester_kurzbz, + 'studiengang_kz' => $student->studiengang_kz, + 'semester' => 0, + 'verband' => 'B', + 'gruppe' => '', + 'insertamum' => date('c'), + 'insertvon' => $insertvon + ]); + } + + return success(); + } +} diff --git a/application/libraries/SignatureLib.php b/application/libraries/SignatureLib.php new file mode 100644 index 000000000..c44ffc5f6 --- /dev/null +++ b/application/libraries/SignatureLib.php @@ -0,0 +1,85 @@ + 30000000) + { + $returnObject = new stdClass(); + $returnObject->code = 1; + $returnObject->error = 1; + $returnObject->retval = 'File to big'; + + return $returnObject; + } + + // Get the content of the given file + $inputFileContent = file_get_contents($inputFileName); + if ($inputFileContent === false) // if failed + { + error_log('An error occurred while getting the content from: '.$inputFileName); + } + else + { + // Posts the given file content + file name and expects a response in JSON format + $resultPost = \Httpful\Request::post(SIGNATUR_URL.'/'.SIGNATUR_LIST_API) + ->sendsJson() + ->authenticateWith(SIGNATUR_USER, SIGNATUR_PASSWORD) + ->body('{"filename": "'.basename($inputFileName).'", "content": "'.base64_encode($inputFileContent).'"}') + ->expectsJson() + ->send(); + } + } + catch(\Httpful\Exception\ConnectionErrorException $cee) // Httpful exception + { + error_log($cee->getMessage()); + } + catch (Exception $e) // any other exception + { + error_log($e->getMessage()); + } + + // If the response is fine + if (isset($resultPost->body) && is_object($resultPost->body) + && isset($resultPost->body->retval) && is_array($resultPost->body->retval)) + { + return $resultPost->body->retval; + } + + // Otherwise return a null as error + return null; + } +} diff --git a/application/libraries/issues/PlausicheckDefinitionLib.php b/application/libraries/issues/PlausicheckDefinitionLib.php new file mode 100644 index 000000000..cef28a736 --- /dev/null +++ b/application/libraries/issues/PlausicheckDefinitionLib.php @@ -0,0 +1,55 @@ + class (library) name for resolving + private $_fehlerLibMappings = array( + 'AbbrecherAktiv' => 'AbbrecherAktiv', + 'AbschlussstatusFehlt' => 'AbschlussstatusFehlt', + 'AktSemesterNull' => 'AktSemesterNull', + 'AktiverStudentOhneStatus' => 'AktiverStudentOhneStatus', + 'AusbildungssemPrestudentUngleichAusbildungssemStatus' => 'AusbildungssemPrestudentUngleichAusbildungssemStatus', + 'BewerberNichtZumRtAngetreten' => 'BewerberNichtZumRtAngetreten', + 'DatumAbschlusspruefungFehlt' => 'DatumAbschlusspruefungFehlt', + 'DatumSponsionFehlt' => 'DatumSponsionFehlt', + 'DatumStudiensemesterFalscheReihenfolge' => 'DatumStudiensemesterFalscheReihenfolge', + 'FalscheAnzahlAbschlusspruefungen' => 'FalscheAnzahlAbschlusspruefungen', + 'FalscheAnzahlHeimatadressen' => 'FalscheAnzahlHeimatadressen', + 'FalscheAnzahlZustelladressen' => 'FalscheAnzahlZustelladressen', + 'GbDatumWeitZurueck' => 'GbDatumWeitZurueck', + 'InaktiverStudentAktiverStatus' => 'InaktiverStudentAktiverStatus', + 'IncomingHeimatNationOesterreich' => 'IncomingHeimatNationOesterreich', + 'IncomingOhneIoDatensatz' => 'IncomingOhneIoDatensatz', + 'IncomingOrGsFoerderrelevant' => 'IncomingOrGsFoerderrelevant', + 'InskriptionVorLetzerBismeldung' => 'InskriptionVorLetzerBismeldung', + 'NationNichtOesterreichAberGemeinde' => 'NationNichtOesterreichAberGemeinde', + 'OrgformStgUngleichOrgformPrestudent' => 'OrgformStgUngleichOrgformPrestudent', + 'PrestudentMischformOhneOrgform' => 'PrestudentMischformOhneOrgform', + 'StgPrestudentUngleichStgStudienplan' => 'StgPrestudentUngleichStgStudienplan', + 'StgPrestudentUngleichStgStudent' => 'StgPrestudentUngleichStgStudent', + 'StudentstatusNachAbbrecher' => 'StudentstatusNachAbbrecher' + //'StudienplanUngueltig' => 'StudienplanUngueltig' + ); + + /** + * Gets all fehler_kurzbz-library mappings for fehler which need to be checked. + */ + public function getFehlerLibMappings() + { + return $this->_fehlerLibMappings; + } + + /** + * Gets all fehler_kurzbz for fehler which need to be checked. + */ + public function getFehlerKurzbz() + { + return array_keys($this->_fehlerLibMappings); + } +} diff --git a/application/libraries/issues/PlausicheckLib.php b/application/libraries/issues/PlausicheckLib.php deleted file mode 100644 index 5105169dd..000000000 --- a/application/libraries/issues/PlausicheckLib.php +++ /dev/null @@ -1,1305 +0,0 @@ -_ci =& get_instance(); // get ci instance - - // load models - $this->_ci->load->model('crm/Prestudent_model', 'PrestudentModel'); - $this->_ci->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel'); - $this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); - - // get database for queries - $this->_db = new DB_Model(); - } - - //------------------------------------------------------------------------------------------------------------------ - // Studiengang checks - - /** - * Studiengang should be the same for prestudent and student. - * @param studiengang_kz int if check is to be executed for certain Studiengang - * @param prestudent_id int if check is to be executed only for one prestudent - * @return success with prestudents or error - */ - public function getStgPrestudentUngleichStgStudent($studiengang_kz = null, $prestudent_id = null) - { - $params = array(); - - $qry = " - SELECT - pre.person_id, pre.prestudent_id, stg.oe_kurzbz prestudent_stg_oe_kurzbz, student_stg.oe_kurzbz student_stg_oe_kurzbz - FROM - public.tbl_prestudent pre - JOIN public.tbl_student stud USING(prestudent_id) - JOIN public.tbl_person pers USING(person_id) - JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz - JOIN public.tbl_studiengang student_stg ON stud.studiengang_kz = student_stg.studiengang_kz - WHERE - stud.studiengang_kz != pre.studiengang_kz"; - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($prestudent_id)) - { - $qry .= " AND pre.prestudent_id = ?"; - $params[] = $prestudent_id; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - /** - * Orgform of a Studiengang in Studienplan should be the same as orgform of student. - * @param studiensemester_kurzbz string check is to be executed for certain Studiensemester - * @param studiengang_kz int if check is to be executed for certain Studiengang - * @param prestudent_id int if check is to be executed only for one prestudent - * @return success with prestudents or error - */ - public function getOrgformStgUngleichOrgformPrestudent($studiensemester_kurzbz, $studiengang_kz = null, $prestudent_id = null) - { - $params = array($studiensemester_kurzbz); - - $qry = " - SELECT - prestudent.person_id, prestudent.prestudent_id, status.studiensemester_kurzbz, - studiengang.orgform_kurzbz AS stg_orgform, status.orgform_kurzbz AS student_orgform, - prestudent.studiengang_kz AS student_studiengang, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz - FROM - public.tbl_studiengang studiengang - JOIN public.tbl_student student USING(studiengang_kz) - JOIN public.tbl_prestudent prestudent USING(prestudent_id) - JOIN public.tbl_prestudentstatus status USING(prestudent_id) - JOIN public.tbl_benutzer benutzer on(benutzer.uid = student.student_uid) - JOIN public.tbl_studiengang stg ON prestudent.studiengang_kz = stg.studiengang_kz - WHERE - benutzer.aktiv = true - AND status.status_kurzbz='Student' - AND studiengang.studiengang_kz < 10000 - AND status.studiensemester_kurzbz = ? - AND NOT EXISTS( - SELECT 1 FROM lehre.tbl_studienplan - JOIN lehre.tbl_studienordnung USING(studienordnung_id) - WHERE - tbl_studienordnung.studiengang_kz = prestudent.studiengang_kz - AND tbl_studienplan.orgform_kurzbz = status.orgform_kurzbz)"; - - if (isset($prestudent_id)) - { - $qry .= " AND prestudent.prestudent_id = ?"; - $params[] = $prestudent_id; - } - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - $qry .= " - ORDER BY student_uid"; - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - /** - * Students in "mixed" Studiengang should have Orgform. - * @param studiensemester_kurzbz string check is to be executed for certain Studiensemester - * @param studiengang_kz int if check is to be executed for certain Studiengang - * @param prestudent_id int if check is to be executed only for one prestudent - * @return success with prestudents or error - */ - public function getPrestudentMischformOhneOrgform($studiensemester_kurzbz, $studiengang_kz = null, $prestudent_id = null) - { - $params = array($studiensemester_kurzbz); - - $qry = " - SELECT - pre.person_id, pre.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, status.studiensemester_kurzbz - FROM - public.tbl_prestudent pre - JOIN public.tbl_person USING(person_id) - JOIN public.tbl_prestudentstatus status USING(prestudent_id) - JOIN public.tbl_studiengang stg USING(studiengang_kz) - WHERE - status.status_kurzbz IN ('Bewerber', 'Student') - AND stg.mischform - AND (status.orgform_kurzbz='' OR status.orgform_kurzbz IS NULL) - AND status.studiensemester_kurzbz=?"; - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($prestudent_id)) - { - $qry .= " AND pre.prestudent_id = ?"; - $params[] = $prestudent_id; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - /** - * Studiengang should be the same for prestudent and studienplan. - * @param studiengang_kz int if check is to be executed for certain Studiengang - * @param prestudent_id int if check is to be executed only for one prestudent - * @param studienordnung_id int if check is to be executed only for a certain studienordnung_id - * @return success with prestudents or error - */ - public function getStgPrestudentUngleichStgStudienplan($studiengang_kz = null, $prestudent_id = null, $studienordnung_id = null) - { - $params = array(); - - $qry = " - SELECT - DISTINCT ON (ps.prestudent_id) ps.person_id, ps.prestudent_id, stordnung.studienordnung_id, - stplan.bezeichnung AS studienplan, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz - FROM - public.tbl_prestudent ps - JOIN public.tbl_prestudentstatus USING(prestudent_id) - JOIN lehre.tbl_studienplan stplan USING(studienplan_id) - JOIN lehre.tbl_studienordnung stordnung USING(studienordnung_id) - JOIN public.tbl_person USING(person_id) - JOIN public.tbl_studiengang stg ON ps.studiengang_kz = stg.studiengang_kz - WHERE - ps.studiengang_kz<>stordnung.studiengang_kz - AND stg.melderelevant"; - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($prestudent_id)) - { - $qry .= " AND ps.prestudent_id = ?"; - $params[] = $prestudent_id; - } - - if (isset($studienordnung_id)) - { - $qry .= " AND stordnung.studienordnung_id = ?"; - $params[] = $studienordnung_id; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - //------------------------------------------------------------------------------------------------------------------ - // Studentstatus checks - - /** - * Abbrecher cannot be active. - * @param studiengang_kz int if check is to be executed for certain Studiengang - * @param prestudent_id int if check is to be executed only for one prestudent - * @return success with prestudents or error - */ - public function getAbbrecherAktiv($studiengang_kz = null, $prestudent_id = null) - { - $params = array(); - - $qry = " - SELECT - pre.person_id, pre.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz - FROM - public.tbl_prestudentstatus pre_status - JOIN public.tbl_prestudent pre USING(prestudent_id) - JOIN public.tbl_student student USING(prestudent_id) - JOIN public.tbl_benutzer benutzer on(benutzer.uid=student.student_uid) - JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz - WHERE - pre_status.status_kurzbz ='Abbrecher' - AND benutzer.aktiv=true"; - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($prestudent_id)) - { - $qry .= " AND pre.prestudent_id = ?"; - $params[] = $prestudent_id; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - /** - * There shouldn't be any status after Abbrecher status. - * @param studiengang_kz int if check is to be executed for certain Studiengang - * @param prestudent_id int if check is to be executed only for one prestudent - * @return success with prestudents or error - */ - public function getStudentstatusNachAbbrecher($studiengang_kz = null, $prestudent_id = null) - { - $params = array(); - - $qry = " - SELECT - prestudent.person_id, prestudent.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz - FROM - public.tbl_student student - JOIN public.tbl_prestudent prestudent USING(prestudent_id) - JOIN public.tbl_prestudentstatus prestatus USING(prestudent_id) - JOIN public.tbl_studiengang stg ON prestudent.studiengang_kz = stg.studiengang_kz - WHERE - prestatus.status_kurzbz = 'Abbrecher' - AND get_rolle_prestudent(prestudent.prestudent_id, prestatus.studiensemester_kurzbz) <> 'Abbrecher'"; - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($prestudent_id)) - { - $qry .= " AND prestudent.prestudent_id = ?"; - $params[] = $prestudent_id; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - /** - * Ausbildungssemester of prestudent (lehrverband) must be the same as Ausbildungssemester of prestudentstatus. - * @param studiensemester_kurzbz string check is to be executed for certain Studiensemester - * @param studiengang_kz int if check is to be executed for certain Studiengang - * @param prestudent_id int if check is to be executed only for one prestudent - * @return success with prestudents or error - */ - public function getAusbildungssemPrestudentUngleichAusbildungssemStatus($studiensemester_kurzbz, $studiengang_kz = null, $prestudent_id = null) - { - $params = array($studiensemester_kurzbz, $studiensemester_kurzbz, $studiensemester_kurzbz); - - $qry = " - SELECT - DISTINCT(student.student_uid), student.student_uid, prestudent.person_id, prestudent.prestudent_id, - status.ausbildungssemester AS status_ausbildungssemester, lv.semester AS student_ausbildungssemester, status.studiensemester_kurzbz, - stg.oe_kurzbz AS prestudent_stg_oe_kurzbz - FROM - public.tbl_student student - JOIN public.tbl_studentlehrverband lv USING(student_uid) - JOIN public.tbl_prestudent prestudent USING(prestudent_id) - JOIN public.tbl_prestudentstatus status USING(prestudent_id) - JOIN public.tbl_studiengang stg ON prestudent.studiengang_kz = stg.studiengang_kz - WHERE - status.studiensemester_kurzbz = ? - AND lv.studiensemester_kurzbz = ? - AND status.status_kurzbz NOT IN ('Interessent','Bewerber','Aufgenommener','Wartender','Abgewiesener','Unterbrecher') - AND get_rolle_prestudent (prestudent_id, ?)='Student' - AND status.ausbildungssemester != lv.semester"; - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($prestudent_id)) - { - $qry .= " AND prestudent.prestudent_id = ?"; - $params[] = $prestudent_id; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - /** - * Students with active status should have an active Benutzer. - * @param studiensemester_kurzbz string check is to be executed for certain Studiensemester - * @param studiengang_kz int if check is to be executed for certain Studiengang - * @param prestudent_id int if check is to be executed only for one prestudent - * @return success with prestudents or error - */ - public function getInaktiverStudentAktiverStatus($studiensemester_kurzbz, $studiengang_kz = null, $prestudent_id = null) - { - $aktStudiensemesterRes = $this->_ci->StudiensemesterModel->getAkt(); - - if (isError($aktStudiensemesterRes)) return $aktStudiensemesterRes; - - $studiensemester_kurzbz = hasData($aktStudiensemesterRes) ? getData($aktStudiensemesterRes)[0]->studiensemester_kurzbz : ''; - - $params = array($studiensemester_kurzbz); - - $qry = " - SELECT - DISTINCT(student.student_uid), prestudent.person_id, prestudent.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz - FROM - public.tbl_benutzer benutzer - JOIN public.tbl_student student on(benutzer.uid = student.student_uid) - JOIN public.tbl_prestudent prestudent USING(prestudent_id) - JOIN public.tbl_studiengang stg ON prestudent.studiengang_kz = stg.studiengang_kz - WHERE - benutzer.aktiv=false - AND EXISTS (SELECT 1 FROM public.tbl_prestudentstatus WHERE prestudent_id = prestudent.prestudent_id AND studiensemester_kurzbz = ?) - AND get_rolle_prestudent(prestudent_id, NULL) IN ('Student', 'Diplomand', 'Unterbrecher', 'Praktikant') - AND stg.melderelevant - AND prestudent.bismelden"; - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($prestudent_id)) - { - $qry .= " AND prestudent.prestudent_id = ?"; - $params[] = $prestudent_id; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - /** - * Students of a semester shouldn't start studies before the date of Bismeldung. - * e.g. If student studies in WS2022 datum of status shouldn't be before 15.4.2020 - * e.g. If student studies in SS2022 datum of status shouldn't be before 15.11.2022 - * @param studiensemester_kurzbz string check is to be executed for certain Studiensemester - * @param studiengang_kz int if check is to be executed for certain Studiengang - * @param prestudent_id int if check is to be executed only for one prestudent - * @return success with prestudents or error - */ - public function getInskriptionVorLetzerBismeldung($studiensemester_kurzbz, $studiengang_kz = null, $prestudent_id = null) - { - // get Bismeldedatum - $datumBis = $this->_getBisdateFromSemester($studiensemester_kurzbz); - - $params = array($datumBis, $studiensemester_kurzbz, $datumBis); - - // get active students - $qry = " - SELECT - DISTINCT ON (student.student_uid) ? AS datum_bismeldung, - prestudent.person_id, prestudent.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, status.studiensemester_kurzbz - FROM - public.tbl_benutzer benutzer - JOIN public.tbl_student student on(benutzer.uid = student.student_uid) - JOIN public.tbl_prestudent prestudent USING(prestudent_id) - JOIN public.tbl_prestudentstatus status USING(prestudent_id) - JOIN public.tbl_studiengang stg ON prestudent.studiengang_kz = stg.studiengang_kz - WHERE - benutzer.aktiv=true - AND status.studiensemester_kurzbz = ? - /* inscription date before date of first student status */ - AND ( - SELECT datum - FROM public.tbl_prestudentstatus - WHERE prestudent_id = prestudent.prestudent_id - AND studiensemester_kurzbz = status.studiensemester_kurzbz - AND status_kurzbz = 'Student' - ORDER BY datum, insertamum, ext_id - LIMIT 1 - ) < ? - AND stg.melderelevant - AND prestudent.bismelden"; - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($prestudent_id)) - { - $qry .= " AND prestudent.prestudent_id = ?"; - $params[] = $prestudent_id; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - /** - * Status Dates and status studysemester dates should be in correct order. - * @param studiengang_kz int if check is to be executed for certain Studiengang - * @param prestudent_id int if check is to be executed only for one prestudent - * @return success with prestudents or error - */ - public function getDatumStudiensemesterFalscheReihenfolge($studiengang_kz = null, $prestudent_id = null) - { - $params = array(); - - // all active students with Status student in current semester - $qry = " - SELECT DISTINCT ON (prestudent_id) * - FROM ( - SELECT - prestudent.person_id, prestudent.prestudent_id, - stg.studiengang_kz, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, - ROW_NUMBER () OVER ( - PARTITION BY prestudent.prestudent_id - ORDER BY sem.start DESC, status.datum DESC, status.insertamum DESC, status.ext_id DESC - ) AS reihenfolge_semester, - ROW_NUMBER () OVER ( - PARTITION BY prestudent.prestudent_id - ORDER BY status.datum DESC, status.insertamum DESC, status.ext_id DESC - ) AS reihenfolge_datum - FROM - public.tbl_student student - JOIN public.tbl_benutzer benutzer on(student.student_uid = benutzer.uid) - JOIN public.tbl_prestudent prestudent USING(prestudent_id) - JOIN public.tbl_prestudentstatus status USING(prestudent_id) - JOIN public.tbl_studiensemester sem USING(studiensemester_kurzbz) - JOIN public.tbl_studiengang stg ON prestudent.studiengang_kz = stg.studiengang_kz - WHERE - benutzer.aktiv=true - AND status.status_kurzbz='Student' - ) reihenfolge - WHERE reihenfolge_semester <> reihenfolge_datum"; - - if (isset($studiengang_kz)) - { - $qry .= " AND studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($prestudent_id)) - { - $qry .= " AND prestudent_id = ?"; - $params[] = $prestudent_id; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - /** - * Students with active Benutzer should have a status in the current semester. - * @param studiengang_kz int if check is to be executed for certain Studiengang - * @param prestudent_id int if check is to be executed only for one prestudent - * @return success with prestudents or error - */ - public function getAktiverStudentOhneStatus($studiengang_kz = null, $prestudent_id = null) - { - $params = array(); - - $qry = " - SELECT - DISTINCT (student_uid), prestudent.person_id, prestudent.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz - FROM - public.tbl_student student - JOIN public.tbl_benutzer benutzer on (benutzer.uid = student.student_uid) - JOIN public.tbl_prestudent prestudent USING(prestudent_id) - JOIN public.tbl_studiengang stg ON prestudent.studiengang_kz = stg.studiengang_kz - WHERE - benutzer.aktiv=TRUE - AND stg.melderelevant - AND prestudent.bismelden - AND NOT EXISTS ( - SELECT 1 - FROM public.tbl_prestudentstatus - JOIN public.tbl_studiensemester sem USING (studiensemester_kurzbz) - WHERE prestudent_id = prestudent.prestudent_id - /* buffer of four months, as status are often entered later */ - AND sem.ende::date > NOW() - interval '4 months' - )"; - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($prestudent_id)) - { - $qry .= " AND prestudent.prestudent_id = ?"; - $params[] = $prestudent_id; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - /** - * Studienplan should be valid in current Ausbildungssemester of prestudent. - * @param studiensemester_kurzbz string check is to be executed for certain Studiensemester - * @param studiengang_kz int if check is to be executed for certain Studiengang - * @param prestudent_id int if check is to be executed only for one prestudent - * @return success with prestudents or error - */ - public function getStudienplanUngueltig($studiensemester_kurzbz, $studiengang_kz = null, $prestudent_id = null) - { - $params = array($studiensemester_kurzbz); - - $qry = " - SELECT - DISTINCT pre.person_id, pre.prestudent_id, - tbl_studienplan.bezeichnung AS studienplan, - status.status_kurzbz, - status.studiensemester_kurzbz, - status.ausbildungssemester, - stg.oe_kurzbz AS prestudent_stg_oe_kurzbz - FROM - public.tbl_prestudent pre - JOIN public.tbl_prestudentstatus status USING(prestudent_id) - JOIN public.tbl_person USING(person_id) - JOIN lehre.tbl_studienplan USING(studienplan_id) - JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz - WHERE - status_kurzbz in('Student', 'Interessent','Bewerber','Aufgenommener') - AND NOT EXISTS ( - SELECT - 1 - FROM - lehre.tbl_studienplan_semester - WHERE - studienplan_id=status.studienplan_id - AND tbl_studienplan_semester.semester = status.ausbildungssemester - AND tbl_studienplan_semester.studiensemester_kurzbz = status.studiensemester_kurzbz - ) - AND status.studiensemester_kurzbz=? - AND pre.bismelden - AND stg.melderelevant"; - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($prestudent_id)) - { - $qry .= " AND tbl_prestudent.prestudent_id = ?"; - $params[] = $prestudent_id; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - /** - * Students with finished studies should have exactly one final exam. - * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester - * @param studiengang_kz int if check is to be executed for certain Studiengang - * @param prestudent_id int if check is to be executed only for one prestudent - * @return success with prestudents or error - */ - public function getFalscheAnzahlAbschlusspruefungen($studiensemester_kurzbz = null, $studiengang_kz = null, $prestudent_id = null) - { - $params = array(); - - $qry = " - SELECT * FROM ( - SELECT - DISTINCT ON(pre.prestudent_id) pre.person_id, pre.prestudent_id, student_uid, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, - ( - SELECT COUNT(*) - FROM lehre.tbl_abschlusspruefung - WHERE student_uid = stud.student_uid - AND abschlussbeurteilung_kurzbz != 'nicht' - AND abschlussbeurteilung_kurzbz IS NOT NULL - ) AS anzahl_abschlusspruefungen - FROM - public.tbl_prestudent pre - JOIN public.tbl_student stud USING(prestudent_id) - JOIN public.tbl_prestudentstatus status USING(prestudent_id) - JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz - WHERE - status_kurzbz = 'Absolvent' - AND pre.bismelden - AND stg.melderelevant - AND NOT EXISTS ( /* exclude gs */ - SELECT 1 - FROM bis.tbl_mobilitaet - WHERE prestudent_id = pre.prestudent_id - AND studiensemester_kurzbz = status.studiensemester_kurzbz - )"; - - if (isset($studiensemester_kurzbz)) - { - $qry .= " AND status.studiensemester_kurzbz = ?"; - $params[] = $studiensemester_kurzbz; - } - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($prestudent_id)) - { - $qry .= " AND pre.prestudent_id = ?"; - $params[] = $prestudent_id; - } - - $qry .= ") studenten - WHERE anzahl_abschlusspruefungen != 1"; - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - /** - * Date of final exam shouldn't be missing for Absolvent. - * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester - * @param studiengang_kz int if check is to be executed for certain Studiengang - * @param abschlusspruefung_id int if check is to be executed for a certain Abschlussprüfung - * @return success with prestudents or error - */ - public function getDatumAbschlusspruefungFehlt($studiensemester_kurzbz = null, $studiengang_kz = null, $abschlusspruefung_id = null) - { - $results = array(); - - $pruefungenRes = $this->_getInvalidAbschlusspruefungen($studiensemester_kurzbz, $studiengang_kz, $abschlusspruefung_id); - - if (isError($pruefungenRes)) return $pruefungenRes; - - if (hasData($pruefungenRes)) - { - $pruefungen = getData($pruefungenRes); - - foreach ($pruefungen as $pruefung) - { - if (isEmptyString($pruefung->datum)) $results[] = $pruefung; - } - } - - return success($results); - } - - /** - * Date of sponsion shouldn't be missing for Absolvent. - * @param studiensemester_kurzbz string check is to be executed for certain Studiensemester - * @param studiengang_kz int if check is to be executed for certain Studiengang - * @param abschlusspruefung_id int if check is to be executed only for a certain Abschlussprüfung - * @return success with prestudents or error - */ - public function getDatumSponsionFehlt($studiensemester_kurzbz = null, $studiengang_kz = null, $abschlusspruefung_id = null) - { - $results = array(); - - $pruefungenRes = $this->_getInvalidAbschlusspruefungen($studiensemester_kurzbz, $studiengang_kz, $abschlusspruefung_id); - - if (isError($pruefungenRes)) return $pruefungenRes; - - if (hasData($pruefungenRes)) - { - $pruefungen = getData($pruefungenRes); - - foreach ($pruefungen as $pruefung) - { - if (isEmptyString($pruefung->sponsion)) $results[] = $pruefung; - } - } - - return success($results); - } - - /** - * Bewerber should have participated in Reihungstest. - * @param studiensemester_kurzbz string check is to be executed for certain Studiensemester - * @param studiengang_kz int if check is to be executed for certain Studiengang - * @param prestudent_id int if check is to be executed only for one prestudent - * @return success with prestudents or error - */ - public function getBewerberNichtZumRtAngetreten($studiensemester_kurzbz, $studiengang_kz = null, $prestudent_id = null) - { - $previousStudiensemesterRes = $this->_ci->StudiensemesterModel->getPreviousFrom($studiensemester_kurzbz); - - if (isError($previousStudiensemesterRes)) return $previousStudiensemesterRes; - - $params = array($studiensemester_kurzbz); - - $qry = " - SELECT - prestudent.person_id, prestudent.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, status.studiensemester_kurzbz - FROM - public.tbl_prestudent prestudent - JOIN public.tbl_prestudentstatus status ON(prestudent.prestudent_id=status.prestudent_id) - JOIN public.tbl_person USING(person_id) - LEFT JOIN bis.tbl_orgform USING(orgform_kurzbz) - JOIN public.tbl_studiengang stg USING(studiengang_kz) - WHERE - status_kurzbz='Bewerber' - AND reihungstestangetreten=false - AND stg.melderelevant - AND prestudent.bismelden"; - - if (hasData($previousStudiensemesterRes)) - { - $previousStudiensemester = getData($previousStudiensemesterRes)[0]->studiensemester_kurzbz; - $qry .= " AND (studiensemester_kurzbz=? OR studiensemester_kurzbz=?)"; - $params[] = $previousStudiensemester; - } - else - { - $qry .= " AND studiensemester_kurzbz=?"; - } - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($prestudent_id)) - { - $qry .= " AND prestudent.prestudent_id = ?"; - $params[] = $prestudent_id; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - /** - * Current Ausbildungssemester shouldn't be 0. - * @param studiensemester_kurzbz string check is to be executed for certain Studiensemester - * @param studiengang_kz int if check is to be executed for certain Studiengang - * @param prestudent_id int if check is to be executed only for one prestudent - * @return success with prestudents or error - */ - public function getAktSemesterNull($studiensemester_kurzbz, $studiengang_kz = null, $prestudent_id = null) - { - $params = array($studiensemester_kurzbz); - - $qry = " - SELECT - DISTINCT pre.person_id, pre.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, prestat.studiensemester_kurzbz - FROM - public.tbl_prestudent pre - JOIN public.tbl_prestudentstatus prestat USING(prestudent_id) - JOIN public.tbl_studiengang stg USING(studiengang_kz) - WHERE - prestat.status_kurzbz != 'Incoming' - AND prestat.studiensemester_kurzbz = ? - AND ausbildungssemester = 0 - AND stg.melderelevant - AND pre.bismelden"; - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($prestudent_id)) - { - $qry .= " AND pre.prestudent_id = ?"; - $params[] = $prestudent_id; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - /** - * Prestudent should have a final status. - * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester - * @param studiengang_kz int if check is to be executed for certain Studiengang - * @param prestudent_id int if check is to be executed only for one prestudent - * @return success with prestudents or error - */ - public function getAbschlussstatusFehlt($studiensemester_kurzbz = null, $studiengang_kz = null, $prestudent_id = null) - { - $params = array(); - - $qry = " - SELECT - DISTINCT ON (pre.prestudent_id) - pre.person_id, pre.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, status.studiensemester_kurzbz - FROM - public.tbl_prestudent pre - JOIN public.tbl_person USING(person_id) - JOIN public.tbl_prestudentstatus status USING(prestudent_id) - JOIN public.tbl_studiengang stg USING(studiengang_kz) - WHERE - NOT EXISTS( /*student does not study anymore*/ - SELECT - 1 - FROM - public.tbl_prestudentstatus ps - JOIN public.tbl_studiensemester USING(studiensemester_kurzbz) - WHERE - prestudent_id=pre.prestudent_id - /* 4 months: There might be Diplomanden, in summer months end status is often not entered yet */ - AND tbl_studiensemester.ende>now() - interval '4 months' - ) - /* check only valid begininng with 2018 */ - AND '2018-01-01'<(SELECT max(datum) FROM public.tbl_prestudentstatus WHERE prestudent_id=pre.prestudent_id) - AND NOT EXISTS( /* no end status */ - SELECT 1 - FROM public.tbl_prestudentstatus ps - WHERE - prestudent_id=pre.prestudent_id - AND status_kurzbz IN('Abbrecher','Abgewiesener','Absolvent','Incoming') - ) - AND stg.melderelevant - AND pre.bismelden"; - - if (isset($studiensemester_kurzbz)) - { - $prevStudiensemesterRes = $this->_ci->StudiensemesterModel->getPreviousFrom($studiensemester_kurzbz); - - if (isError($prevStudiensemesterRes)) return $prevStudiensemesterRes; - - if (hasData($prevStudiensemesterRes)) - { - // if Studiensemester given, check only if has status in current or previous semester - $prevStudiensemester = getData($prevStudiensemesterRes)[0]->studiensemester_kurzbz; - $qry .= " AND EXISTS ( - SELECT 1 - FROM public.tbl_prestudentstatus ps - WHERE studiensemester_kurzbz IN (?, ?) - AND ps.prestudent_id = pre.prestudent_id - )"; - $params[] = $prevStudiensemester; - $params[] = $studiensemester_kurzbz; - } - } - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($prestudent_id)) - { - $qry .= " AND pre.prestudent_id = ?"; - $params[] = $prestudent_id; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - //------------------------------------------------------------------------------------------------------------------ - // Person checks - - /** - * Birthdate is too long ago. - * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester - * @param studiengang_kz int if check is to be executed for certain Studiengang - * @param person_id int if check is to be executed only for one person - * @return success with prestudents or error - */ - public function getGbDatumWeitZurueck($studiensemester_kurzbz = null, $studiengang_kz = null, $person_id = null) - { - $params = array(); - - $qry = " - SELECT - pers.person_id - FROM - public.tbl_person pers - WHERE - pers.gebdatum < '1920-01-01' - AND EXISTS ( - SELECT 1 - FROM public.tbl_prestudent - JOIN public.tbl_prestudentstatus status USING(prestudent_id) - JOIN public.tbl_studiengang stg USING(studiengang_kz) - WHERE person_id = pers.person_id"; - - if (isset($studiensemester_kurzbz)) - { - $qry .= " AND status.studiensemester_kurzbz = ?"; - $params[] = $studiensemester_kurzbz; - } - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - $qry .= ")"; - - if (isset($person_id)) - { - $qry .= " AND pers.person_id = ?"; - $params[] = $person_id; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - /** - * Nation is not Austria, but address has austrian Gemeinde. - * @param studiengang_kz int if check is to be executed for certain Studiengang - * @param person_id int if check is to be executed only for one person - * @return success with prestudents or error - */ - public function getNationNichtOesterreichAberGemeinde($studiengang_kz = null, $person_id = null) - { - $params = array(); - - $qry = "SELECT DISTINCT tbl_person.person_id, adr.gemeinde, adr.adresse_id - FROM - public.tbl_adresse adr - JOIN public.tbl_prestudent USING(person_id) - JOIN public.tbl_person USING(person_id) - JOIN public.tbl_student USING(prestudent_id) - JOIN public.tbl_benutzer ON(uid=student_uid) - JOIN public.tbl_studiengang stg ON tbl_prestudent.studiengang_kz = stg.studiengang_kz - WHERE - adr.nation!='A' - AND tbl_benutzer.aktiv - AND gemeinde NOT IN ('Münster') - AND EXISTS(SELECT 1 FROM bis.tbl_gemeinde WHERE name = adr.gemeinde)"; - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($person_id)) - { - $qry .= " AND tbl_person.person_id = ?"; - $params[] = $person_id; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - /** - * Students should have exactly one home address. - * @param studiensemester_kurzbz string check is to be executed for certain Studiensemester - * @param studiengang_kz int if check is to be executed for certain Studiengang - * @param person_id int if check is to be executed only for one person - * @return success with prestudents or error - */ - public function getFalscheAnzahlHeimatadressen($studiensemester_kurzbz = null, $studiengang_kz = null, $person_id = null) - { - $params = array(); - - $qry = " - SELECT - DISTINCT person_id - FROM - ( - SELECT person_id, COUNT(adresse_id) AS anzahl_adressen - FROM public.tbl_adresse addr - WHERE heimatadresse IS TRUE - GROUP BY person_id - ) adressen - JOIN public.tbl_person USING(person_id) - JOIN public.tbl_prestudent pre USING(person_id) - JOIN public.tbl_prestudentstatus status USING(prestudent_id) - JOIN public.tbl_student USING(prestudent_id) - JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz - WHERE - anzahl_adressen != 1 - AND stg.melderelevant - AND pre.bismelden"; - - if (isset($studiensemester_kurzbz)) - { - $qry .= " AND status.studiensemester_kurzbz = ?"; - $params[] = $studiensemester_kurzbz; - } - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($person_id)) - { - $qry .= " AND person_id = ?"; - $params[] = $person_id; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - /** - * Students should have exactly one delivery address. - * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester - * @param studiengang_kz int if check is to be executed for certain Studiengang - * @param person_id int if check is to be executed only for one person - * @return success with prestudents or error - */ - public function getFalscheAnzahlZustelladressen($studiensemester_kurzbz = null, $studiengang_kz = null, $person_id = null) - { - $params = array(); - - $qry = " - SELECT - DISTINCT person_id - FROM - ( - SELECT person_id, COUNT(adresse_id) AS anzahl_adressen - FROM public.tbl_adresse addr - WHERE zustelladresse IS TRUE - GROUP BY person_id - ) adressen - JOIN public.tbl_person USING(person_id) - JOIN public.tbl_prestudent pre USING(person_id) - JOIN public.tbl_prestudentstatus status USING(prestudent_id) - JOIN public.tbl_student USING(prestudent_id) - JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz - WHERE - anzahl_adressen != 1 - AND stg.melderelevant - AND pre.bismelden"; - - if (isset($studiensemester_kurzbz)) - { - $qry .= " AND status.studiensemester_kurzbz = ?"; - $params[] = $studiensemester_kurzbz; - } - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($person_id)) - { - $qry .= " AND person_id = ?"; - $params[] = $person_id; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - //------------------------------------------------------------------------------------------------------------------ - // I/O checks - - /** - * Incoming shouldn't have austrian home address. - * @param studiensemester_kurzbz string check is to be executed for certain Studiensemester - * @param studiengang_kz int if check is to be executed for certain Studiengang - * @param person_id int if check is to be executed only for one person - * @return success with prestudents or error - */ - public function getIncomingHeimatNationOesterreich($studiensemester_kurzbz, $studiengang_kz = null, $person_id = null) - { - $params = array($studiensemester_kurzbz); - - $qry = " - SELECT - DISTINCT pers.person_id, status.studiensemester_kurzbz - FROM - public.tbl_prestudent pre - JOIN public.tbl_prestudentstatus status USING(prestudent_id) - JOIN public.tbl_person pers USING(person_id) - JOIN public.tbl_adresse addr USING(person_id) - JOIN public.tbl_studiengang stg USING(studiengang_kz) - WHERE - status.status_kurzbz = 'Incoming' - AND addr.nation = 'A' - AND addr.heimatadresse - AND status.studiensemester_kurzbz = ? - AND stg.melderelevant - AND pre.bismelden"; - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($person_id)) - { - $qry .= " AND pers.person_id = ?"; - $params[] = $person_id; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - /** - * Incoming should have IN/OUT data. - * @param studiengang_kz int if check is to be executed for certain Studiengang - * @param prestudent_id int if check is to be executed only for one prestudent - * @return success with prestudents or error - */ - public function getIncomingOhneIoDatensatz($studiengang_kz = null, $prestudent_id = null) - { - $params = array(); - - $qry = " - SELECT - DISTINCT ON(student_uid, nachname, vorname) - tbl_person.person_id, - tbl_prestudent.prestudent_id, - stg.oe_kurzbz AS prestudent_stg_oe_kurzbz - FROM - public.tbl_student - JOIN public.tbl_benutzer ON(student_uid=uid) - JOIN public.tbl_person USING(person_id) - JOIN public.tbl_prestudent USING(prestudent_id) - JOIN public.tbl_prestudentstatus ON(tbl_prestudent.prestudent_id=tbl_prestudentstatus.prestudent_id) - JOIN public.tbl_studiengang stg ON(stg.studiengang_kz=tbl_student.studiengang_kz) - WHERE - bismelden=TRUE - AND status_kurzbz='Incoming' AND NOT EXISTS (SELECT 1 FROM bis.tbl_bisio WHERE student_uid=tbl_student.student_uid) - AND stg.melderelevant"; - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($prestudent_id)) - { - $qry .= " AND tbl_prestudent.prestudent_id = ?"; - $params[] = $prestudent_id; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - /** - * Incoming or gemeinsame Studien students should not receive funding (not be förderrelevant). - * @param studiensemester_kurzbz string check is to be executed for certain Studiensemester - * @param studiengang_kz int if check is to be executed for certain Studiengang - * @param prestudent_id int if check is to be executed only for one prestudent - * @return object success or error - */ - public function getIncomingOrGsFoerderrelevant($studiensemester_kurzbz = null, $studiengang_kz = null, $prestudent_id = null) - { - $params = array(); - - $qry = " - SELECT - DISTINCT ON(prestudent_id) - pers.person_id, - ps.prestudent_id, - stg.oe_kurzbz AS prestudent_stg_oe_kurzbz - FROM - public.tbl_student stud - JOIN public.tbl_benutzer ON(student_uid=uid) - JOIN public.tbl_person pers USING(person_id) - JOIN public.tbl_prestudent ps USING(prestudent_id) - JOIN public.tbl_prestudentstatus status USING(prestudent_id) - JOIN public.tbl_studiengang stg ON(stg.studiengang_kz=stud.studiengang_kz) - WHERE - ( - status.status_kurzbz = 'Incoming' - OR EXISTS ( - SELECT 1 - FROM - bis.tbl_mobilitaet - JOIN public.tbl_prestudent USING(prestudent_id) - WHERE - prestudent_id = ps.prestudent_id - AND gsstudientyp_kurzbz = 'Extern' - ) - ) - AND (ps.foerderrelevant <> FALSE OR ps.foerderrelevant IS NULL) - AND bismelden=TRUE - AND stg.melderelevant"; - - if (isset($studiensemester_kurzbz)) - { - $qry .= " AND status.studiensemester_kurzbz = ?"; - $params[] = $studiensemester_kurzbz; - } - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($prestudent_id)) - { - $qry .= " AND ps.prestudent_id = ?"; - $params[] = $prestudent_id; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - //------------------------------------------------------------------------------------------------------------------ - // Private methods - - /** - * Get final exams in a semester which are invalid (e.g. missing data) - * @param studiensemester_kurzbz string if check is to be executed for certain Studiengang - * @param studiengang_kz int if check is to be executed for certain Studiengang - * @param abschlusspruefung_id int if check is to be executed for certain Abschlussprüfung - */ - private function _getInvalidAbschlusspruefungen($studiensemester_kurzbz = null, $studiengang_kz = null, $abschlusspruefung_id = null) - { - $params = array(); - - $qry = " - SELECT - pre.person_id, pre.prestudent_id, - pruefung.sponsion, pruefung.datum, pruefung.abschlusspruefung_id, - stg.oe_kurzbz AS prestudent_stg_oe_kurzbz - FROM - public.tbl_prestudent pre - JOIN public.tbl_student stud USING(prestudent_id) - JOIN public.tbl_prestudentstatus prestatus USING(prestudent_id) - JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz - JOIN lehre.tbl_abschlusspruefung pruefung ON stud.student_uid = pruefung.student_uid - WHERE - status_kurzbz = 'Absolvent' - AND NOT EXISTS ( /* exclude gs */ - SELECT 1 - FROM bis.tbl_mobilitaet - WHERE prestudent_id = pre.prestudent_id - AND studiensemester_kurzbz = prestatus.studiensemester_kurzbz - ) - AND abschlussbeurteilung_kurzbz!='nicht' - AND abschlussbeurteilung_kurzbz IS NOT NULL - AND (pruefung.datum IS NULL OR pruefung.sponsion IS NULL) - AND pre.bismelden - AND stg.melderelevant"; - - if (isset($studiensemester_kurzbz)) - { - $qry .= " AND prestatus.studiensemester_kurzbz = ?"; - $params[] = $studiensemester_kurzbz; - } - - if (isset($studiengang_kz)) - { - $qry .= " AND stg.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - if (isset($abschlusspruefung_id)) - { - $qry .= " AND pruefung.abschlusspruefung_id = ?"; - $params[] = $abschlusspruefung_id; - } - - return $this->_db->execReadOnlyQuery($qry, $params); - } - - /** - * Gets Bismeldedate from Studiensemester. - * @param studiensemester_kurzbz string - */ - private function _getBisdateFromSemester($studiensemester_kurzbz) - { - $semesterYear = substr($studiensemester_kurzbz, 2, 6); - $semesterType = substr($studiensemester_kurzbz, 0, 2); - - if ($semesterType == 'SS') - { - return date_format(date_create(($semesterYear - 1)."-11-15"), 'Y-m-d'); - } - - if ($semesterType == 'WS') - { - return date_format(date_create($semesterYear."-04-15"), 'Y-m-d'); - } - } -} diff --git a/application/libraries/issues/PlausicheckProducerLib.php b/application/libraries/issues/PlausicheckProducerLib.php index c1e15151f..c32f1f863 100644 --- a/application/libraries/issues/PlausicheckProducerLib.php +++ b/application/libraries/issues/PlausicheckProducerLib.php @@ -4,77 +4,70 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); class PlausicheckProducerLib { - const CI_LIBRARY_PATH = 'application/libraries'; + const CI_PATH = 'application'; + const CI_LIBRARY_FOLDER = 'libraries'; + const EXTENSIONS_FOLDER = 'extensions'; const PLAUSI_ISSUES_FOLDER = 'issues/plausichecks'; const EXECUTE_PLAUSI_CHECK_METHOD_NAME = 'executePlausiCheck'; private $_ci; // ci instance - private $_currentStudiensemester; // current Studiensemester + private $_extensionName; // name of extension + private $_app; // name of application + private $_konfiguration = array(); // konfigratio parameters - // set fehler which can be produced by the job - // structure: fehler_kurzbz => class (library) name for resolving - private $_fehlerLibMappings = array( - 'AbbrecherAktiv' => 'AbbrecherAktiv', - 'AbschlussstatusFehlt' => 'AbschlussstatusFehlt', - 'AktSemesterNull' => 'AktSemesterNull', - 'AktiverStudentOhneStatus' => 'AktiverStudentOhneStatus', - 'AusbildungssemPrestudentUngleichAusbildungssemStatus' => 'AusbildungssemPrestudentUngleichAusbildungssemStatus', - 'BewerberNichtZumRtAngetreten' => 'BewerberNichtZumRtAngetreten', - 'DatumAbschlusspruefungFehlt' => 'DatumAbschlusspruefungFehlt', - 'DatumSponsionFehlt' => 'DatumSponsionFehlt', - 'DatumStudiensemesterFalscheReihenfolge' => 'DatumStudiensemesterFalscheReihenfolge', - 'FalscheAnzahlAbschlusspruefungen' => 'FalscheAnzahlAbschlusspruefungen', - 'FalscheAnzahlHeimatadressen' => 'FalscheAnzahlHeimatadressen', - 'FalscheAnzahlZustelladressen' => 'FalscheAnzahlZustelladressen', - 'GbDatumWeitZurueck' => 'GbDatumWeitZurueck', - 'InaktiverStudentAktiverStatus' => 'InaktiverStudentAktiverStatus', - 'IncomingHeimatNationOesterreich' => 'IncomingHeimatNationOesterreich', - 'IncomingOhneIoDatensatz' => 'IncomingOhneIoDatensatz', - 'IncomingOrGsFoerderrelevant' => 'IncomingOrGsFoerderrelevant', - 'InskriptionVorLetzerBismeldung' => 'InskriptionVorLetzerBismeldung', - 'NationNichtOesterreichAberGemeinde' => 'NationNichtOesterreichAberGemeinde', - 'OrgformStgUngleichOrgformPrestudent' => 'OrgformStgUngleichOrgformPrestudent', - 'PrestudentMischformOhneOrgform' => 'PrestudentMischformOhneOrgform', - 'StgPrestudentUngleichStgStudienplan' => 'StgPrestudentUngleichStgStudienplan', - 'StgPrestudentUngleichStgStudent' => 'StgPrestudentUngleichStgStudent', - 'StudentstatusNachAbbrecher' => 'StudentstatusNachAbbrecher' - //'StudienplanUngueltig' => 'StudienplanUngueltig' - ); - - public function __construct() + public function __construct($params = null) { + // set extension name if called from extension + if (isset($params['extensionName'])) $this->_extensionName = $params['extensionName']; + + // set application + $app = isset($params['app']) ? $params['app'] : null; + $this->_ci =& get_instance(); // get ci instance // load models - $this->_ci->load->model('organisation/studiensemester_model', 'StudiensemesterModel'); + $this->_ci->load->model('system/Fehlerkonfiguration_model', 'FehlerkonfigurationModel'); - // get current Studiensemester - $studiensemesterRes = $this->_ci->StudiensemesterModel->getAkt(); - if (hasData($studiensemesterRes)) $this->_currentStudiensemester = getData($studiensemesterRes)[0]->studiensemester_kurzbz; + // get all configuration parameters for the application + $fehlerkonfigurationRes = $this->_ci->FehlerkonfigurationModel->getKonfiguration($app); + + if (hasData($fehlerkonfigurationRes)) + { + $fehlerkonfiguration = getData($fehlerkonfigurationRes); + + foreach ($fehlerkonfiguration as $fk) + { + $this->_konfiguration[$fk->fehler_kurzbz][$fk->konfigurationstyp_kurzbz] = $fk->konfiguration; + } + } } /** - * Executes check for a fehler_kurzbz, returns the result. - * @param $fehler_kurzbz string - * @param $studiensemester_kurzbz string optionally needed for issue production - * @param $studiengang_kz int optionally needed for issue production + * Executes plausicheck using a given library, returns the result. + * @param $libName string name of library producing the issue + * @param $fehler_kurzbz string unique short name of fehler, for which issue is produced + * @param $params parameters passed to issue production method */ - public function producePlausicheckIssue($fehler_kurzbz, $studiensemester_kurzbz = null, $studiengang_kz = null) + public function producePlausicheckIssue($libName, $fehler_kurzbz, $params) { - $libName = $this->_fehlerLibMappings[$fehler_kurzbz]; + // if called from extension (extension name set), path includes extension names + $libRootPath = isset($this->_extensionName) ? self::EXTENSIONS_FOLDER . '/' . $this->_extensionName . '/' : ''; - // get Studiensemester - if (isEmptyString($studiensemester_kurzbz)) $studiensemester_kurzbz = $this->_currentStudiensemester; + // path for loading issue library + $issuesLibPath = $libRootPath . self::PLAUSI_ISSUES_FOLDER . '/'; - // get path of library for issue to be produced - $issuesLibPath = DOC_ROOT . self::CI_LIBRARY_PATH . '/' . self::PLAUSI_ISSUES_FOLDER . '/'; - $issuesLibFilePath = $issuesLibPath . $libName . '.php'; + // file path of library for check if file exists + $issuesLibFilePath = DOC_ROOT . self::CI_PATH + . '/' . $libRootPath . self::CI_LIBRARY_FOLDER . '/' . self::PLAUSI_ISSUES_FOLDER . '/' . $libName . '.php'; // check if library file exists if (!file_exists($issuesLibFilePath)) return error("Issue library file " . $issuesLibFilePath . " does not exist"); + // load konfiguration parameters of the fehler_kurzbz + $config = isset($this->_konfiguration[$fehler_kurzbz]) ? $this->_konfiguration[$fehler_kurzbz] : null; + // load library connected to fehlercode - $this->_ci->load->library(self::PLAUSI_ISSUES_FOLDER . '/'.$libName); + $this->_ci->load->library($issuesLibPath . $libName, $config); $lowercaseLibName = mb_strtolower($libName); @@ -82,21 +75,7 @@ class PlausicheckProducerLib if (!is_callable(array($this->_ci->{$lowercaseLibName}, self::EXECUTE_PLAUSI_CHECK_METHOD_NAME))) return error("Method " . self::EXECUTE_PLAUSI_CHECK_METHOD_NAME . " is not defined in library $lowercaseLibName"); - // pass the data needed for issue check - $paramsForCheck = array( - 'studiensemester_kurzbz' => $studiensemester_kurzbz, - 'studiengang_kz' => $studiengang_kz - ); - // call the function for checking for issue production - return $this->_ci->{$lowercaseLibName}->{self::EXECUTE_PLAUSI_CHECK_METHOD_NAME}($paramsForCheck); - } - - /** - * Gets all fehler_kurzbz for fehler which need to be checked. - */ - public function getFehlerKurzbz() - { - return array_keys($this->_fehlerLibMappings); + return $this->_ci->{$lowercaseLibName}->{self::EXECUTE_PLAUSI_CHECK_METHOD_NAME}($params); } } diff --git a/application/libraries/issues/plausichecks/AbbrecherAktiv.php b/application/libraries/issues/plausichecks/AbbrecherAktiv.php index cc6e2996a..9eae389b5 100644 --- a/application/libraries/issues/plausichecks/AbbrecherAktiv.php +++ b/application/libraries/issues/plausichecks/AbbrecherAktiv.php @@ -13,11 +13,14 @@ class AbbrecherAktiv extends PlausiChecker { $results = array(); + // get parameters from config + $exkludierte_studiengang_kz = isset($this->_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null; + // pass parameters needed for plausicheck $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; // get all students failing the plausicheck - $prestudentRes = $this->_ci->plausichecklib->getAbbrecherAktiv($studiengang_kz); + $prestudentRes = $this->getAbbrecherAktiv($studiengang_kz, null, $exkludierte_studiengang_kz); if (isError($prestudentRes)) return $prestudentRes; @@ -40,4 +43,49 @@ class AbbrecherAktiv extends PlausiChecker // return the results return success($results); } + + /** + * Abbrecher cannot be active. + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param prestudent_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + public function getAbbrecherAktiv($studiengang_kz = null, $prestudent_id = null, $exkludierte_studiengang_kz = null) + { + $params = array(); + + $qry = " + SELECT + pre.person_id, pre.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz + FROM + public.tbl_prestudentstatus pre_status + JOIN public.tbl_prestudent pre USING(prestudent_id) + JOIN public.tbl_student student USING(prestudent_id) + JOIN public.tbl_benutzer benutzer on(benutzer.uid=student.student_uid) + JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz + WHERE + pre_status.status_kurzbz ='Abbrecher' + AND benutzer.aktiv=true"; + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND pre.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } } diff --git a/application/libraries/issues/plausichecks/AbschlussstatusFehlt.php b/application/libraries/issues/plausichecks/AbschlussstatusFehlt.php index 66615220a..3690e1331 100644 --- a/application/libraries/issues/plausichecks/AbschlussstatusFehlt.php +++ b/application/libraries/issues/plausichecks/AbschlussstatusFehlt.php @@ -13,12 +13,20 @@ class AbschlussstatusFehlt extends PlausiChecker { $results = array(); + // get parameters from config + $exkludierte_studiengang_kz = isset($this->_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null; + // pass parameters needed for plausicheck $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; // get all students failing the plausicheck - $prestudentRes = $this->_ci->plausichecklib->getAbschlussstatusFehlt($studiensemester_kurzbz, $studiengang_kz); + $prestudentRes = $this->getAbschlussstatusFehlt( + $studiensemester_kurzbz, + $studiengang_kz, + null, + $exkludierte_studiengang_kz + ); if (isError($prestudentRes)) return $prestudentRes; @@ -41,4 +49,95 @@ class AbschlussstatusFehlt extends PlausiChecker // return the results return success($results); } + + /** + * Prestudent should have a final status. + * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param prestudent_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + public function getAbschlussstatusFehlt( + $studiensemester_kurzbz = null, + $studiengang_kz = null, + $prestudent_id = null, + $exkludierte_studiengang_kz = null + ) { + $params = array(); + + $qry = " + SELECT + DISTINCT ON (pre.prestudent_id) + pre.person_id, pre.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, status.studiensemester_kurzbz + FROM + public.tbl_prestudent pre + JOIN public.tbl_person USING(person_id) + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_studiengang stg USING(studiengang_kz) + WHERE + NOT EXISTS( /*student does not study anymore*/ + SELECT + 1 + FROM + public.tbl_prestudentstatus ps + JOIN public.tbl_studiensemester USING(studiensemester_kurzbz) + WHERE + prestudent_id=pre.prestudent_id + /* 4 months: There might be Diplomanden, in summer months end status is often not entered yet */ + AND tbl_studiensemester.ende>now() - interval '4 months' + ) + /* check only valid begininng with 2018 */ + AND '2018-01-01'<(SELECT max(datum) FROM public.tbl_prestudentstatus WHERE prestudent_id=pre.prestudent_id) + AND NOT EXISTS( /* no end status */ + SELECT 1 + FROM public.tbl_prestudentstatus ps + WHERE + prestudent_id=pre.prestudent_id + AND status_kurzbz IN('Abbrecher','Abgewiesener','Absolvent','Incoming') + ) + AND stg.melderelevant + AND pre.bismelden"; + + if (isset($studiensemester_kurzbz)) + { + $prevStudiensemesterRes = $this->_ci->StudiensemesterModel->getPreviousFrom($studiensemester_kurzbz); + + if (isError($prevStudiensemesterRes)) return $prevStudiensemesterRes; + + if (hasData($prevStudiensemesterRes)) + { + // if Studiensemester given, check only if has status in current or previous semester + $prevStudiensemester = getData($prevStudiensemesterRes)[0]->studiensemester_kurzbz; + $qry .= " AND EXISTS ( + SELECT 1 + FROM public.tbl_prestudentstatus ps + WHERE studiensemester_kurzbz IN (?, ?) + AND ps.prestudent_id = pre.prestudent_id + )"; + $params[] = $prevStudiensemester; + $params[] = $studiensemester_kurzbz; + } + } + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND pre.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } } diff --git a/application/libraries/issues/plausichecks/AktSemesterNull.php b/application/libraries/issues/plausichecks/AktSemesterNull.php index d55506d68..1223a2720 100644 --- a/application/libraries/issues/plausichecks/AktSemesterNull.php +++ b/application/libraries/issues/plausichecks/AktSemesterNull.php @@ -13,12 +13,15 @@ class AktSemesterNull extends PlausiChecker { $results = array(); + // get parameters from config + $exkludierte_studiengang_kz = isset($this->_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null; + // pass parameters needed for plausicheck $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; // get all students failing the plausicheck - $prestudentRes = $this->_ci->plausichecklib->getAktSemesterNull($studiensemester_kurzbz, $studiengang_kz); + $prestudentRes = $this->getAktSemesterNull($studiensemester_kurzbz, $studiengang_kz, null, $exkludierte_studiengang_kz); if (isError($prestudentRes)) return $prestudentRes; @@ -47,4 +50,51 @@ class AktSemesterNull extends PlausiChecker // return the results return success($results); } + + /** + * Current Ausbildungssemester shouldn't be 0. + * @param studiensemester_kurzbz string check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param prestudent_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + public function getAktSemesterNull($studiensemester_kurzbz, $studiengang_kz = null, $prestudent_id = null, $exkludierte_studiengang_kz = null) + { + $params = array($studiensemester_kurzbz); + + $qry = " + SELECT + DISTINCT pre.person_id, pre.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, prestat.studiensemester_kurzbz + FROM + public.tbl_prestudent pre + JOIN public.tbl_prestudentstatus prestat USING(prestudent_id) + JOIN public.tbl_studiengang stg USING(studiengang_kz) + WHERE + prestat.status_kurzbz != 'Incoming' + AND prestat.studiensemester_kurzbz = ? + AND ausbildungssemester = 0 + AND stg.melderelevant + AND pre.bismelden"; + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND pre.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } } diff --git a/application/libraries/issues/plausichecks/AktiverStudentOhneStatus.php b/application/libraries/issues/plausichecks/AktiverStudentOhneStatus.php index 2dfd9f866..94fe5cc8d 100644 --- a/application/libraries/issues/plausichecks/AktiverStudentOhneStatus.php +++ b/application/libraries/issues/plausichecks/AktiverStudentOhneStatus.php @@ -13,11 +13,14 @@ class AktiverStudentOhneStatus extends PlausiChecker { $results = array(); + // get parameters from config + $exkludierte_studiengang_kz = isset($this->_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null; + // pass parameters needed for plausicheck $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; // get all students failing the plausicheck - $prestudentRes = $this->_ci->plausichecklib->getAktiverStudentOhneStatus($studiengang_kz); + $prestudentRes = $this->getAktiverStudentOhneStatus($studiengang_kz, null, $exkludierte_studiengang_kz); if (isError($prestudentRes)) return $prestudentRes; @@ -40,4 +43,57 @@ class AktiverStudentOhneStatus extends PlausiChecker // return the results return success($results); } + + /** + * Students with active Benutzer should have a status in the current semester. + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param prestudent_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + public function getAktiverStudentOhneStatus($studiengang_kz = null, $prestudent_id = null, $exkludierte_studiengang_kz = null) + { + $params = array(); + + $qry = " + SELECT + DISTINCT (student_uid), prestudent.person_id, prestudent.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz + FROM + public.tbl_student student + JOIN public.tbl_benutzer benutzer on (benutzer.uid = student.student_uid) + JOIN public.tbl_prestudent prestudent USING(prestudent_id) + JOIN public.tbl_studiengang stg ON prestudent.studiengang_kz = stg.studiengang_kz + WHERE + benutzer.aktiv=TRUE + AND stg.melderelevant + AND prestudent.bismelden + AND NOT EXISTS ( + SELECT 1 + FROM public.tbl_prestudentstatus + JOIN public.tbl_studiensemester sem USING (studiensemester_kurzbz) + WHERE prestudent_id = prestudent.prestudent_id + /* buffer of four months, as status are often entered later */ + AND sem.ende::date > NOW() - interval '4 months' + )"; + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND prestudent.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } } diff --git a/application/libraries/issues/plausichecks/AktiverStudentstatusOhneKontobuchung.php b/application/libraries/issues/plausichecks/AktiverStudentstatusOhneKontobuchung.php new file mode 100644 index 000000000..28684388f --- /dev/null +++ b/application/libraries/issues/plausichecks/AktiverStudentstatusOhneKontobuchung.php @@ -0,0 +1,120 @@ +_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null; + + // pass parameters needed for plausicheck + $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; + $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; + + // get all students failing the plausicheck + $prestudentRes = $this->getAktiverStudentstatusOhneKontobuchung( + $studiensemester_kurzbz, + $studiengang_kz, + null, + $exkludierte_studiengang_kz + ); + + if (isError($prestudentRes)) return $prestudentRes; + + if (hasData($prestudentRes)) + { + $prestudents = getData($prestudentRes); + + // populate results with data necessary for writing issues + foreach ($prestudents as $prestudent) + { + $results[] = array( + 'person_id' => $prestudent->person_id, + 'oe_kurzbz' => $prestudent->prestudent_stg_oe_kurzbz, + 'fehlertext_params' => array( + 'prestudent_id' => $prestudent->prestudent_id, + 'studiensemester_kurzbz' => $prestudent->studiensemester_kurzbz + ), + 'resolution_params' => array( + 'prestudent_id' => $prestudent->prestudent_id, + 'studiensemester_kurzbz' => $prestudent->studiensemester_kurzbz + ) + ); + } + } + + // return the results + return success($results); + } + + /** + * Student with active status should have been charged, i.e. have a Kontobuchung with a negative or zero value. + * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param prestudent_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + public function getAktiverStudentstatusOhneKontobuchung( + $studiensemester_kurzbz, + $studiengang_kz = null, + $prestudent_id = null, + $exkludierte_studiengang_kz = null + ) { + $params = array($studiensemester_kurzbz); + + $qry = " + SELECT + DISTINCT ON (pre.prestudent_id) + pre.person_id, pre.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, status.studiensemester_kurzbz + FROM + public.tbl_prestudent pre + JOIN public.tbl_person pers USING(person_id) + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_studiengang stg USING(studiengang_kz) + WHERE + status.studiensemester_kurzbz = ? + AND status.status_kurzbz IN ('Student', 'Incoming') + AND NOT EXISTS ( + SELECT 1 + FROM + public.tbl_konto + WHERE + person_id = pers.person_id + AND studiensemester_kurzbz = status.studiensemester_kurzbz + AND buchungsnr_verweis IS NULL + AND betrag <= 0 + ) + AND stg.melderelevant + AND pre.bismelden"; + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND pre.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } +} diff --git a/application/libraries/issues/plausichecks/AusbildungssemPrestudentUngleichAusbildungssemStatus.php b/application/libraries/issues/plausichecks/AusbildungssemPrestudentUngleichAusbildungssemStatus.php index ca967a97f..00ff16ae0 100644 --- a/application/libraries/issues/plausichecks/AusbildungssemPrestudentUngleichAusbildungssemStatus.php +++ b/application/libraries/issues/plausichecks/AusbildungssemPrestudentUngleichAusbildungssemStatus.php @@ -13,14 +13,19 @@ class AusbildungssemPrestudentUngleichAusbildungssemStatus extends PlausiChecker { $results = array(); + // get parameters from config + $exkludierte_studiengang_kz = isset($this->_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null; + // pass parameters needed for plausicheck $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; // get all students failing the plausicheck - $prestudentRes = $this->_ci->plausichecklib->getAusbildungssemPrestudentUngleichAusbildungssemStatus( + $prestudentRes = $this->getAusbildungssemPrestudentUngleichAusbildungssemStatus( $studiensemester_kurzbz, - $studiengang_kz + $studiengang_kz, + null, + $exkludierte_studiengang_kz ); if (isError($prestudentRes)) return $prestudentRes; @@ -53,4 +58,59 @@ class AusbildungssemPrestudentUngleichAusbildungssemStatus extends PlausiChecker // return the results return success($results); } + + /** + * Ausbildungssemester of prestudent (lehrverband) must be the same as Ausbildungssemester of prestudentstatus. + * @param studiensemester_kurzbz string check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param prestudent_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + public function getAusbildungssemPrestudentUngleichAusbildungssemStatus( + $studiensemester_kurzbz, + $studiengang_kz = null, + $prestudent_id = null, + $exkludierte_studiengang_kz = null + ) { + $params = array($studiensemester_kurzbz, $studiensemester_kurzbz, $studiensemester_kurzbz); + + $qry = " + SELECT + DISTINCT(student.student_uid), student.student_uid, prestudent.person_id, prestudent.prestudent_id, + status.ausbildungssemester AS status_ausbildungssemester, lv.semester AS student_ausbildungssemester, status.studiensemester_kurzbz, + stg.oe_kurzbz AS prestudent_stg_oe_kurzbz + FROM + public.tbl_student student + JOIN public.tbl_studentlehrverband lv USING(student_uid) + JOIN public.tbl_prestudent prestudent USING(prestudent_id) + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_studiengang stg ON prestudent.studiengang_kz = stg.studiengang_kz + WHERE + status.studiensemester_kurzbz = ? + AND lv.studiensemester_kurzbz = ? + AND status.status_kurzbz NOT IN ('Interessent','Bewerber','Aufgenommener','Wartender','Abgewiesener','Unterbrecher') + AND get_rolle_prestudent (prestudent_id, ?)='Student' + AND status.ausbildungssemester != lv.semester"; + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND prestudent.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } } diff --git a/application/libraries/issues/plausichecks/BewerberNichtZumRtAngetreten.php b/application/libraries/issues/plausichecks/BewerberNichtZumRtAngetreten.php index 35d954236..4a9655d13 100644 --- a/application/libraries/issues/plausichecks/BewerberNichtZumRtAngetreten.php +++ b/application/libraries/issues/plausichecks/BewerberNichtZumRtAngetreten.php @@ -13,12 +13,20 @@ class BewerberNichtZumRtAngetreten extends PlausiChecker { $results = array(); + // get parameters from config + $exkludierte_studiengang_kz = isset($this->_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null; + // pass parameters needed for plausicheck $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; // get all students failing the plausicheck - $prestudentRes = $this->_ci->plausichecklib->getBewerberNichtZumRtAngetreten($studiensemester_kurzbz, $studiengang_kz); + $prestudentRes = $this->getBewerberNichtZumRtAngetreten( + $studiensemester_kurzbz, + $studiengang_kz, + null, + $exkludierte_studiengang_kz + ); if (isError($prestudentRes)) return $prestudentRes; @@ -44,4 +52,72 @@ class BewerberNichtZumRtAngetreten extends PlausiChecker // return the results return success($results); } + + /** + * Bewerber should have participated in Reihungstest. + * @param studiensemester_kurzbz string check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param prestudent_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + public function getBewerberNichtZumRtAngetreten( + $studiensemester_kurzbz, + $studiengang_kz = null, + $prestudent_id = null, + $exkludierte_studiengang_kz = null + ) { + $this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + $previousStudiensemesterRes = $this->_ci->StudiensemesterModel->getPreviousFrom($studiensemester_kurzbz); + + if (isError($previousStudiensemesterRes)) return $previousStudiensemesterRes; + + $params = array($studiensemester_kurzbz); + + $qry = " + SELECT + prestudent.person_id, prestudent.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, status.studiensemester_kurzbz + FROM + public.tbl_prestudent prestudent + JOIN public.tbl_prestudentstatus status ON(prestudent.prestudent_id=status.prestudent_id) + JOIN public.tbl_person USING(person_id) + LEFT JOIN bis.tbl_orgform USING(orgform_kurzbz) + JOIN public.tbl_studiengang stg USING(studiengang_kz) + WHERE + status_kurzbz='Bewerber' + AND reihungstestangetreten=false + AND stg.melderelevant + AND prestudent.bismelden"; + + if (hasData($previousStudiensemesterRes)) + { + $previousStudiensemester = getData($previousStudiensemesterRes)[0]->studiensemester_kurzbz; + $qry .= " AND (studiensemester_kurzbz=? OR studiensemester_kurzbz=?)"; + $params[] = $previousStudiensemester; + } + else + { + $qry .= " AND studiensemester_kurzbz=?"; + } + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND prestudent.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } } diff --git a/application/libraries/issues/plausichecks/DatumAbschlusspruefungFehlt.php b/application/libraries/issues/plausichecks/DatumAbschlusspruefungFehlt.php index 7a2555b69..f606e2c8c 100644 --- a/application/libraries/issues/plausichecks/DatumAbschlusspruefungFehlt.php +++ b/application/libraries/issues/plausichecks/DatumAbschlusspruefungFehlt.php @@ -13,12 +13,20 @@ class DatumAbschlusspruefungFehlt extends PlausiChecker { $results = array(); + // get parameters from config + $exkludierte_studiengang_kz = isset($this->_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null; + // pass parameters needed for plausicheck $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; // get all students failing the plausicheck - $prestudentRes = $this->_ci->plausichecklib->getDatumAbschlusspruefungFehlt($studiensemester_kurzbz, $studiengang_kz); + $prestudentRes = $this->getDatumAbschlusspruefungFehlt( + $studiensemester_kurzbz, + $studiengang_kz, + null, + $exkludierte_studiengang_kz + ); if (isError($prestudentRes)) return $prestudentRes; @@ -44,4 +52,72 @@ class DatumAbschlusspruefungFehlt extends PlausiChecker // return the results return success($results); } + + /** + * Date of final exam shouldn't be missing for Absolvent. + * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param abschlusspruefung_id int if check is to be executed for a certain Abschlussprüfung + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + public function getDatumAbschlusspruefungFehlt( + $studiensemester_kurzbz = null, + $studiengang_kz = null, + $abschlusspruefung_id = null, + $exkludierte_studiengang_kz = null + ) { + $params = array(); + + $qry = " + SELECT + pre.person_id, pre.prestudent_id, + pruefung.sponsion, pruefung.datum, pruefung.abschlusspruefung_id, + stg.oe_kurzbz AS prestudent_stg_oe_kurzbz + FROM + public.tbl_prestudent pre + JOIN public.tbl_student stud USING(prestudent_id) + JOIN public.tbl_prestudentstatus prestatus USING(prestudent_id) + JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz + JOIN lehre.tbl_abschlusspruefung pruefung ON stud.student_uid = pruefung.student_uid + WHERE + status_kurzbz = 'Absolvent' + AND NOT EXISTS ( /* exclude gs */ + SELECT 1 + FROM bis.tbl_mobilitaet + WHERE prestudent_id = pre.prestudent_id + AND studiensemester_kurzbz = prestatus.studiensemester_kurzbz + ) + AND abschlussbeurteilung_kurzbz!='nicht' + AND abschlussbeurteilung_kurzbz IS NOT NULL + AND pruefung.datum IS NULL + AND pre.bismelden + AND stg.melderelevant"; + + if (isset($studiensemester_kurzbz)) + { + $qry .= " AND prestatus.studiensemester_kurzbz = ?"; + $params[] = $studiensemester_kurzbz; + } + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($abschlusspruefung_id)) + { + $qry .= " AND pruefung.abschlusspruefung_id = ?"; + $params[] = $abschlusspruefung_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } } diff --git a/application/libraries/issues/plausichecks/DatumSponsionFehlt.php b/application/libraries/issues/plausichecks/DatumSponsionFehlt.php index 102a89656..210ae6f01 100644 --- a/application/libraries/issues/plausichecks/DatumSponsionFehlt.php +++ b/application/libraries/issues/plausichecks/DatumSponsionFehlt.php @@ -13,12 +13,20 @@ class DatumSponsionFehlt extends PlausiChecker { $results = array(); + // get parameters from config + $exkludierte_studiengang_kz = isset($this->_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null; + // pass parameters needed for plausicheck $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; // get all students failing the plausicheck - $prestudentRes = $this->_ci->plausichecklib->getDatumSponsionFehlt($studiensemester_kurzbz, $studiengang_kz); + $prestudentRes = $this->getDatumSponsionFehlt( + $studiensemester_kurzbz, + $studiengang_kz, + null, + $exkludierte_studiengang_kz + ); if (isError($prestudentRes)) return $prestudentRes; @@ -44,4 +52,72 @@ class DatumSponsionFehlt extends PlausiChecker // return the results return success($results); } + + /** + * Date of sponsion shouldn't be missing for Absolvent. + * @param studiensemester_kurzbz string check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param abschlusspruefung_id int if check is to be executed only for a certain Abschlussprüfung + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + public function getDatumSponsionFehlt( + $studiensemester_kurzbz = null, + $studiengang_kz = null, + $abschlusspruefung_id = null, + $exkludierte_studiengang_kz = null + ) { + $params = array(); + + $qry = " + SELECT + pre.person_id, pre.prestudent_id, + pruefung.sponsion, pruefung.datum, pruefung.abschlusspruefung_id, + stg.oe_kurzbz AS prestudent_stg_oe_kurzbz + FROM + public.tbl_prestudent pre + JOIN public.tbl_student stud USING(prestudent_id) + JOIN public.tbl_prestudentstatus prestatus USING(prestudent_id) + JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz + JOIN lehre.tbl_abschlusspruefung pruefung ON stud.student_uid = pruefung.student_uid + WHERE + status_kurzbz = 'Absolvent' + AND NOT EXISTS ( /* exclude gs */ + SELECT 1 + FROM bis.tbl_mobilitaet + WHERE prestudent_id = pre.prestudent_id + AND studiensemester_kurzbz = prestatus.studiensemester_kurzbz + ) + AND abschlussbeurteilung_kurzbz!='nicht' + AND abschlussbeurteilung_kurzbz IS NOT NULL + AND pruefung.sponsion IS NULL + AND pre.bismelden + AND stg.melderelevant"; + + if (isset($studiensemester_kurzbz)) + { + $qry .= " AND prestatus.studiensemester_kurzbz = ?"; + $params[] = $studiensemester_kurzbz; + } + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($abschlusspruefung_id)) + { + $qry .= " AND pruefung.abschlusspruefung_id = ?"; + $params[] = $abschlusspruefung_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } } diff --git a/application/libraries/issues/plausichecks/DatumStudiensemesterFalscheReihenfolge.php b/application/libraries/issues/plausichecks/DatumStudiensemesterFalscheReihenfolge.php index ab8566e47..381bea7df 100644 --- a/application/libraries/issues/plausichecks/DatumStudiensemesterFalscheReihenfolge.php +++ b/application/libraries/issues/plausichecks/DatumStudiensemesterFalscheReihenfolge.php @@ -13,11 +13,14 @@ class DatumStudiensemesterFalscheReihenfolge extends PlausiChecker { $results = array(); + // get parameters from config + $exkludierte_studiengang_kz = isset($this->_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null; + // pass parameters needed for plausicheck $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; // get all students failing the plausicheck - $prestudentRes = $this->_ci->plausichecklib->getDatumStudiensemesterFalscheReihenfolge($studiengang_kz); + $prestudentRes = $this->getDatumStudiensemesterFalscheReihenfolge($studiengang_kz, null, $exkludierte_studiengang_kz); if (isError($prestudentRes)) return $prestudentRes; @@ -42,4 +45,64 @@ class DatumStudiensemesterFalscheReihenfolge extends PlausiChecker // return the results return success($results); } + + /** + * Status Dates and status studysemester dates should be in correct order. + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param prestudent_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if check is to be executed only for certain Studiengaenge + * @return success with prestudents or error + */ + public function getDatumStudiensemesterFalscheReihenfolge($studiengang_kz = null, $prestudent_id = null, $exkludierte_studiengang_kz = null) + { + $params = array(); + + // all active students with Status student in current semester + $qry = " + SELECT DISTINCT ON (prestudent_id) * + FROM ( + SELECT + prestudent.person_id, prestudent.prestudent_id, + stg.studiengang_kz, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, + ROW_NUMBER () OVER ( + PARTITION BY prestudent.prestudent_id + ORDER BY sem.start DESC, status.datum DESC, status.insertamum DESC, status.ext_id DESC + ) AS reihenfolge_semester, + ROW_NUMBER () OVER ( + PARTITION BY prestudent.prestudent_id + ORDER BY status.datum DESC, status.insertamum DESC, status.ext_id DESC + ) AS reihenfolge_datum + FROM + public.tbl_student student + JOIN public.tbl_benutzer benutzer on(student.student_uid = benutzer.uid) + JOIN public.tbl_prestudent prestudent USING(prestudent_id) + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_studiensemester sem USING(studiensemester_kurzbz) + JOIN public.tbl_studiengang stg ON prestudent.studiengang_kz = stg.studiengang_kz + WHERE + benutzer.aktiv=true + AND status.status_kurzbz='Student' + ) reihenfolge + WHERE reihenfolge_semester <> reihenfolge_datum"; + + if (isset($studiengang_kz)) + { + $qry .= " AND studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } } diff --git a/application/libraries/issues/plausichecks/FalscheAnzahlAbschlusspruefungen.php b/application/libraries/issues/plausichecks/FalscheAnzahlAbschlusspruefungen.php index 7fbe2d828..1021fe85a 100644 --- a/application/libraries/issues/plausichecks/FalscheAnzahlAbschlusspruefungen.php +++ b/application/libraries/issues/plausichecks/FalscheAnzahlAbschlusspruefungen.php @@ -13,12 +13,20 @@ class FalscheAnzahlAbschlusspruefungen extends PlausiChecker { $results = array(); + // get parameters from config + $exkludierte_studiengang_kz = isset($this->_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null; + // pass parameters needed for plausicheck $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; // get all students failing the plausicheck - $prestudentRes = $this->_ci->plausichecklib->getFalscheAnzahlAbschlusspruefungen($studiensemester_kurzbz, $studiengang_kz); + $prestudentRes = $this->getFalscheAnzahlAbschlusspruefungen( + $studiensemester_kurzbz, + $studiengang_kz, + null, + $exkludierte_studiengang_kz + ); if (isError($prestudentRes)) return $prestudentRes; @@ -41,4 +49,77 @@ class FalscheAnzahlAbschlusspruefungen extends PlausiChecker // return the results return success($results); } + + /** + * Students with finished studies should have exactly one final exam. + * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param prestudent_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + public function getFalscheAnzahlAbschlusspruefungen( + $studiensemester_kurzbz = null, + $studiengang_kz = null, + $prestudent_id = null, + $exkludierte_studiengang_kz = null + ) { + $params = array(); + + $qry = " + SELECT * FROM ( + SELECT + DISTINCT ON(pre.prestudent_id) pre.person_id, pre.prestudent_id, student_uid, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, + ( + SELECT COUNT(*) + FROM lehre.tbl_abschlusspruefung + WHERE student_uid = stud.student_uid + AND abschlussbeurteilung_kurzbz != 'nicht' + AND abschlussbeurteilung_kurzbz IS NOT NULL + ) AS anzahl_abschlusspruefungen + FROM + public.tbl_prestudent pre + JOIN public.tbl_student stud USING(prestudent_id) + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz + WHERE + status_kurzbz = 'Absolvent' + AND pre.bismelden + AND stg.melderelevant + AND NOT EXISTS ( /* exclude gs */ + SELECT 1 + FROM bis.tbl_mobilitaet + WHERE prestudent_id = pre.prestudent_id + AND studiensemester_kurzbz = status.studiensemester_kurzbz + )"; + + if (isset($studiensemester_kurzbz)) + { + $qry .= " AND status.studiensemester_kurzbz = ?"; + $params[] = $studiensemester_kurzbz; + } + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND pre.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + $qry .= ") studenten + WHERE anzahl_abschlusspruefungen != 1"; + + return $this->_db->execReadOnlyQuery($qry, $params); + } } diff --git a/application/libraries/issues/plausichecks/FalscheAnzahlHeimatadressen.php b/application/libraries/issues/plausichecks/FalscheAnzahlHeimatadressen.php index eac50a88a..b3551904e 100644 --- a/application/libraries/issues/plausichecks/FalscheAnzahlHeimatadressen.php +++ b/application/libraries/issues/plausichecks/FalscheAnzahlHeimatadressen.php @@ -13,12 +13,20 @@ class FalscheAnzahlHeimatadressen extends PlausiChecker { $results = array(); + // get parameters from config + $exkludierte_studiengang_kz = isset($this->_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null; + // pass parameters needed for plausicheck $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; // get all students failing the plausicheck - $personRes = $this->_ci->plausichecklib->getFalscheAnzahlHeimatadressen($studiensemester_kurzbz, $studiengang_kz); + $personRes = $this->getFalscheAnzahlHeimatadressen( + $studiensemester_kurzbz, + $studiengang_kz, + null, + $exkludierte_studiengang_kz + ); if (isError($personRes)) return $personRes; @@ -39,4 +47,67 @@ class FalscheAnzahlHeimatadressen extends PlausiChecker // return the results return success($results); } + + /** + * Students should have exactly one home address. + * @param studiensemester_kurzbz string check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param person_id int if check is to be executed only for one person + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + public function getFalscheAnzahlHeimatadressen( + $studiensemester_kurzbz = null, + $studiengang_kz = null, + $person_id = null, + $exkludierte_studiengang_kz = null + ) { + $params = array(); + + $qry = " + SELECT + DISTINCT person_id + FROM + ( + SELECT person_id, COUNT(adresse_id) AS anzahl_adressen + FROM public.tbl_adresse addr + WHERE heimatadresse IS TRUE + GROUP BY person_id + ) adressen + JOIN public.tbl_person USING(person_id) + JOIN public.tbl_prestudent pre USING(person_id) + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_student USING(prestudent_id) + JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz + WHERE + anzahl_adressen != 1 + AND stg.melderelevant + AND pre.bismelden"; + + if (isset($studiensemester_kurzbz)) + { + $qry .= " AND status.studiensemester_kurzbz = ?"; + $params[] = $studiensemester_kurzbz; + } + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($person_id)) + { + $qry .= " AND person_id = ?"; + $params[] = $person_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } } diff --git a/application/libraries/issues/plausichecks/FalscheAnzahlZustelladressen.php b/application/libraries/issues/plausichecks/FalscheAnzahlZustelladressen.php index e2fc4a781..9d72b0236 100644 --- a/application/libraries/issues/plausichecks/FalscheAnzahlZustelladressen.php +++ b/application/libraries/issues/plausichecks/FalscheAnzahlZustelladressen.php @@ -13,12 +13,20 @@ class FalscheAnzahlZustelladressen extends PlausiChecker { $results = array(); + // get parameters from config + $exkludierte_studiengang_kz = isset($this->_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null; + // pass parameters needed for plausicheck $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; // get all students failing the plausicheck - $personRes = $this->_ci->plausichecklib->getFalscheAnzahlZustelladressen($studiensemester_kurzbz, $studiengang_kz); + $personRes = $this->getFalscheAnzahlZustelladressen( + $studiensemester_kurzbz, + $studiengang_kz, + null, + $exkludierte_studiengang_kz + ); if (isError($personRes)) return $personRes; @@ -39,4 +47,67 @@ class FalscheAnzahlZustelladressen extends PlausiChecker // return the results return success($results); } + + /** + * Students should have exactly one delivery address. + * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param person_id int if check is to be executed only for one person + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + public function getFalscheAnzahlZustelladressen( + $studiensemester_kurzbz = null, + $studiengang_kz = null, + $person_id = null, + $exkludierte_studiengang_kz = null + ) { + $params = array(); + + $qry = " + SELECT + DISTINCT person_id + FROM + ( + SELECT person_id, COUNT(adresse_id) AS anzahl_adressen + FROM public.tbl_adresse addr + WHERE zustelladresse IS TRUE + GROUP BY person_id + ) adressen + JOIN public.tbl_person USING(person_id) + JOIN public.tbl_prestudent pre USING(person_id) + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_student USING(prestudent_id) + JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz + WHERE + anzahl_adressen != 1 + AND stg.melderelevant + AND pre.bismelden"; + + if (isset($studiensemester_kurzbz)) + { + $qry .= " AND status.studiensemester_kurzbz = ?"; + $params[] = $studiensemester_kurzbz; + } + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($person_id)) + { + $qry .= " AND person_id = ?"; + $params[] = $person_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } } diff --git a/application/libraries/issues/plausichecks/GbDatumWeitZurueck.php b/application/libraries/issues/plausichecks/GbDatumWeitZurueck.php index 7a7cf0d6f..04e1cf97b 100644 --- a/application/libraries/issues/plausichecks/GbDatumWeitZurueck.php +++ b/application/libraries/issues/plausichecks/GbDatumWeitZurueck.php @@ -13,12 +13,15 @@ class GbDatumWeitZurueck extends PlausiChecker { $results = array(); + // get parameters from config + $exkludierte_studiengang_kz = isset($this->_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null; + // pass parameters needed for plausicheck $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; // get all students failing the plausicheck - $personRes = $this->_ci->plausichecklib->getGbDatumWeitZurueck($studiensemester_kurzbz, $studiengang_kz); + $personRes = $this->getGbDatumWeitZurueck($studiensemester_kurzbz, $studiengang_kz, null, $exkludierte_studiengang_kz); if (isError($personRes)) return $personRes; @@ -39,4 +42,63 @@ class GbDatumWeitZurueck extends PlausiChecker // return the results return success($results); } + + /** + * Birthdate is too long ago. + * @param studiensemester_kurzbz string if check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param person_id int if check is to be executed only for one person + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + public function getGbDatumWeitZurueck( + $studiensemester_kurzbz = null, + $studiengang_kz = null, + $person_id = null, + $exkludierte_studiengang_kz = null + ) { + $params = array(); + + $qry = " + SELECT + pers.person_id + FROM + public.tbl_person pers + WHERE + pers.gebdatum < '1920-01-01' + AND EXISTS ( + SELECT 1 + FROM public.tbl_prestudent + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_studiengang stg USING(studiengang_kz) + WHERE person_id = pers.person_id"; + + if (isset($studiensemester_kurzbz)) + { + $qry .= " AND status.studiensemester_kurzbz = ?"; + $params[] = $studiensemester_kurzbz; + } + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + $qry .= ")"; + + if (isset($person_id)) + { + $qry .= " AND pers.person_id = ?"; + $params[] = $person_id; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } } diff --git a/application/libraries/issues/plausichecks/InaktiverStudentAktiverStatus.php b/application/libraries/issues/plausichecks/InaktiverStudentAktiverStatus.php index 76fd477e3..dead2b1e7 100644 --- a/application/libraries/issues/plausichecks/InaktiverStudentAktiverStatus.php +++ b/application/libraries/issues/plausichecks/InaktiverStudentAktiverStatus.php @@ -13,12 +13,20 @@ class InaktiverStudentAktiverStatus extends PlausiChecker { $results = array(); + // get parameters from config + $exkludierte_studiengang_kz = isset($this->_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null; + // pass parameters needed for plausicheck $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; // get all students failing the plausicheck - $prestudentRes = $this->_ci->plausichecklib->getInaktiverStudentAktiverStatus($studiensemester_kurzbz, $studiengang_kz); + $prestudentRes = $this->getInaktiverStudentAktiverStatus( + $studiensemester_kurzbz, + $studiengang_kz, + null, + $exkludierte_studiengang_kz + ); if (isError($prestudentRes)) return $prestudentRes; @@ -44,4 +52,62 @@ class InaktiverStudentAktiverStatus extends PlausiChecker // return the results return success($results); } + + /** + * Students with active status should have an active Benutzer. + * @param studiensemester_kurzbz string check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param prestudent_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + public function getInaktiverStudentAktiverStatus( + $studiensemester_kurzbz, + $studiengang_kz = null, + $prestudent_id = null, + $exkludierte_studiengang_kz = null + ) { + $aktStudiensemesterRes = $this->_ci->StudiensemesterModel->getAkt(); + + if (isError($aktStudiensemesterRes)) return $aktStudiensemesterRes; + + $studiensemester_kurzbz = hasData($aktStudiensemesterRes) ? getData($aktStudiensemesterRes)[0]->studiensemester_kurzbz : ''; + + $params = array($studiensemester_kurzbz); + + $qry = " + SELECT + DISTINCT(student.student_uid), prestudent.person_id, prestudent.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz + FROM + public.tbl_benutzer benutzer + JOIN public.tbl_student student on(benutzer.uid = student.student_uid) + JOIN public.tbl_prestudent prestudent USING(prestudent_id) + JOIN public.tbl_studiengang stg ON prestudent.studiengang_kz = stg.studiengang_kz + WHERE + benutzer.aktiv=false + AND EXISTS (SELECT 1 FROM public.tbl_prestudentstatus WHERE prestudent_id = prestudent.prestudent_id AND studiensemester_kurzbz = ?) + AND get_rolle_prestudent(prestudent_id, NULL) IN ('Student', 'Diplomand', 'Unterbrecher', 'Praktikant') + AND stg.melderelevant + AND prestudent.bismelden"; + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND prestudent.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } } diff --git a/application/libraries/issues/plausichecks/IncomingHeimatNationOesterreich.php b/application/libraries/issues/plausichecks/IncomingHeimatNationOesterreich.php index 51726d969..5276164dc 100644 --- a/application/libraries/issues/plausichecks/IncomingHeimatNationOesterreich.php +++ b/application/libraries/issues/plausichecks/IncomingHeimatNationOesterreich.php @@ -13,12 +13,20 @@ class IncomingHeimatNationOesterreich extends PlausiChecker { $results = array(); + // get parameters from config + $exkludierte_studiengang_kz = isset($this->_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null; + // pass parameters needed for plausicheck $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; // get all students failing the plausicheck - $personRes = $this->_ci->plausichecklib->getIncomingHeimatNationOesterreich($studiensemester_kurzbz, $studiengang_kz); + $personRes = $this->getIncomingHeimatNationOesterreich( + $studiensemester_kurzbz, + $studiengang_kz, + null, + $exkludierte_studiengang_kz + ); if (isError($personRes)) return $personRes; @@ -39,4 +47,58 @@ class IncomingHeimatNationOesterreich extends PlausiChecker // return the results return success($results); } + + /** + * Incoming shouldn't have austrian home address. + * @param studiensemester_kurzbz string check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param person_id int if check is to be executed only for one person + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + public function getIncomingHeimatNationOesterreich( + $studiensemester_kurzbz, + $studiengang_kz = null, + $person_id = null, + $exkludierte_studiengang_kz = null + ) { + $params = array($studiensemester_kurzbz); + + $qry = " + SELECT + DISTINCT pers.person_id, status.studiensemester_kurzbz + FROM + public.tbl_prestudent pre + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_person pers USING(person_id) + JOIN public.tbl_adresse addr USING(person_id) + JOIN public.tbl_studiengang stg USING(studiengang_kz) + WHERE + status.status_kurzbz = 'Incoming' + AND addr.nation = 'A' + AND addr.heimatadresse + AND status.studiensemester_kurzbz = ? + AND stg.melderelevant + AND pre.bismelden"; + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($person_id)) + { + $qry .= " AND pers.person_id = ?"; + $params[] = $person_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } } diff --git a/application/libraries/issues/plausichecks/IncomingOhneIoDatensatz.php b/application/libraries/issues/plausichecks/IncomingOhneIoDatensatz.php index 9681554e5..e08280f83 100644 --- a/application/libraries/issues/plausichecks/IncomingOhneIoDatensatz.php +++ b/application/libraries/issues/plausichecks/IncomingOhneIoDatensatz.php @@ -13,11 +13,14 @@ class IncomingOhneIoDatensatz extends PlausiChecker { $results = array(); + // get parameters from config + $exkludierte_studiengang_kz = isset($this->_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null; + // pass parameters needed for plausicheck $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; // get all students failing the plausicheck - $prestudentRes = $this->_ci->plausichecklib->getIncomingOhneIoDatensatz($studiengang_kz); + $prestudentRes = $this->getIncomingOhneIoDatensatz($studiengang_kz, null, $exkludierte_studiengang_kz); if (isError($prestudentRes)) return $prestudentRes; @@ -40,4 +43,54 @@ class IncomingOhneIoDatensatz extends PlausiChecker // return the results return success($results); } + + /** + * Incoming should have IN/OUT data. + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param prestudent_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + public function getIncomingOhneIoDatensatz($studiengang_kz = null, $prestudent_id = null, $exkludierte_studiengang_kz = null) + { + $params = array(); + + $qry = " + SELECT + DISTINCT ON(student_uid, nachname, vorname) + tbl_person.person_id, + tbl_prestudent.prestudent_id, + stg.oe_kurzbz AS prestudent_stg_oe_kurzbz + FROM + public.tbl_student + JOIN public.tbl_benutzer ON(student_uid=uid) + JOIN public.tbl_person USING(person_id) + JOIN public.tbl_prestudent USING(prestudent_id) + JOIN public.tbl_prestudentstatus ON(tbl_prestudent.prestudent_id=tbl_prestudentstatus.prestudent_id) + JOIN public.tbl_studiengang stg ON(stg.studiengang_kz=tbl_student.studiengang_kz) + WHERE + bismelden=TRUE + AND status_kurzbz='Incoming' AND NOT EXISTS (SELECT 1 FROM bis.tbl_bisio WHERE student_uid=tbl_student.student_uid) + AND stg.melderelevant"; + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND tbl_prestudent.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } } diff --git a/application/libraries/issues/plausichecks/IncomingOrGsFoerderrelevant.php b/application/libraries/issues/plausichecks/IncomingOrGsFoerderrelevant.php index 0e12ccac8..4d789f71a 100644 --- a/application/libraries/issues/plausichecks/IncomingOrGsFoerderrelevant.php +++ b/application/libraries/issues/plausichecks/IncomingOrGsFoerderrelevant.php @@ -13,12 +13,20 @@ class IncomingOrGsFoerderrelevant extends PlausiChecker { $results = array(); + // get parameters from config + $exkludierte_studiengang_kz = isset($this->_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null; + // pass parameters needed for plausicheck $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; // get all students failing the plausicheck - $prestudentRes = $this->_ci->plausichecklib->getIncomingOrGsFoerderrelevant($studiensemester_kurzbz, $studiengang_kz); + $prestudentRes = $this->getIncomingOrGsFoerderrelevant( + $studiensemester_kurzbz, + $studiengang_kz, + null, + $exkludierte_studiengang_kz + ); if (isError($prestudentRes)) return $prestudentRes; @@ -41,4 +49,77 @@ class IncomingOrGsFoerderrelevant extends PlausiChecker // return the results return success($results); } + + /** + * Incoming or gemeinsame Studien students should not receive funding (not be förderrelevant). + * @param studiensemester_kurzbz string check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param prestudent_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return object success or error + */ + public function getIncomingOrGsFoerderrelevant( + $studiensemester_kurzbz = null, + $studiengang_kz = null, + $prestudent_id = null, + $exkludierte_studiengang_kz = null + ) { + $params = array(); + + $qry = " + SELECT + DISTINCT ON(prestudent_id) + pers.person_id, + ps.prestudent_id, + stg.oe_kurzbz AS prestudent_stg_oe_kurzbz + FROM + public.tbl_student stud + JOIN public.tbl_benutzer ON(student_uid=uid) + JOIN public.tbl_person pers USING(person_id) + JOIN public.tbl_prestudent ps USING(prestudent_id) + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_studiengang stg ON(stg.studiengang_kz=stud.studiengang_kz) + WHERE + ( + status.status_kurzbz = 'Incoming' + OR EXISTS ( + SELECT 1 + FROM + bis.tbl_mobilitaet + JOIN public.tbl_prestudent USING(prestudent_id) + WHERE + prestudent_id = ps.prestudent_id + AND gsstudientyp_kurzbz = 'Extern' + ) + ) + AND (ps.foerderrelevant <> FALSE OR ps.foerderrelevant IS NULL) + AND bismelden=TRUE + AND stg.melderelevant"; + + if (isset($studiensemester_kurzbz)) + { + $qry .= " AND status.studiensemester_kurzbz = ?"; + $params[] = $studiensemester_kurzbz; + } + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND ps.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } } diff --git a/application/libraries/issues/plausichecks/InskriptionVorLetzerBismeldung.php b/application/libraries/issues/plausichecks/InskriptionVorLetzerBismeldung.php index 672dfa585..871b3b3d4 100644 --- a/application/libraries/issues/plausichecks/InskriptionVorLetzerBismeldung.php +++ b/application/libraries/issues/plausichecks/InskriptionVorLetzerBismeldung.php @@ -13,12 +13,20 @@ class InskriptionVorLetzerBismeldung extends PlausiChecker { $results = array(); + // get parameters from config + $exkludierte_studiengang_kz = isset($this->_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null; + // pass parameters needed for plausicheck $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; // get all students failing the plausicheck - $prestudentRes = $this->_ci->plausichecklib->getInskriptionVorLetzerBismeldung($studiensemester_kurzbz, $studiengang_kz); + $prestudentRes = $this->getInskriptionVorLetzerBismeldung( + $studiensemester_kurzbz, + $studiengang_kz, + null, + $exkludierte_studiengang_kz + ); if (isError($prestudentRes)) return $prestudentRes; @@ -48,4 +56,93 @@ class InskriptionVorLetzerBismeldung extends PlausiChecker // return the results return success($results); } + + /** + * Students of a semester shouldn't start studies before the date of Bismeldung. + * e.g. If student studies in WS2022 datum of status shouldn't be before 15.4.2020 + * e.g. If student studies in SS2022 datum of status shouldn't be before 15.11.2022 + * @param studiensemester_kurzbz string check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param prestudent_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + public function getInskriptionVorLetzerBismeldung( + $studiensemester_kurzbz, + $studiengang_kz = null, + $prestudent_id = null, + $exkludierte_studiengang_kz = null + ) { + // get Bismeldedatum + $datumBis = $this->_getBisdateFromSemester($studiensemester_kurzbz); + + $params = array($datumBis, $studiensemester_kurzbz, $datumBis); + + // get active students + $qry = " + SELECT + DISTINCT ON (student.student_uid) ? AS datum_bismeldung, + prestudent.person_id, prestudent.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, status.studiensemester_kurzbz + FROM + public.tbl_benutzer benutzer + JOIN public.tbl_student student on(benutzer.uid = student.student_uid) + JOIN public.tbl_prestudent prestudent USING(prestudent_id) + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_studiengang stg ON prestudent.studiengang_kz = stg.studiengang_kz + WHERE + benutzer.aktiv=true + AND status.studiensemester_kurzbz = ? + /* inscription date before date of first student status */ + AND ( + SELECT datum + FROM public.tbl_prestudentstatus + WHERE prestudent_id = prestudent.prestudent_id + AND studiensemester_kurzbz = status.studiensemester_kurzbz + AND status_kurzbz = 'Student' + ORDER BY datum, insertamum, ext_id + LIMIT 1 + ) < ? + AND stg.melderelevant + AND prestudent.bismelden"; + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND prestudent.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } + + /** + * Gets Bismeldedate from Studiensemester. + * @param studiensemester_kurzbz string + */ + private function _getBisdateFromSemester($studiensemester_kurzbz) + { + $semesterYear = substr($studiensemester_kurzbz, 2, 6); + $semesterType = substr($studiensemester_kurzbz, 0, 2); + + if ($semesterType == 'SS') + { + return date_format(date_create(($semesterYear - 1)."-11-15"), 'Y-m-d'); + } + + if ($semesterType == 'WS') + { + return date_format(date_create($semesterYear."-04-15"), 'Y-m-d'); + } + } } diff --git a/application/libraries/issues/plausichecks/NationNichtOesterreichAberGemeinde.php b/application/libraries/issues/plausichecks/NationNichtOesterreichAberGemeinde.php index c61531e46..c04cd664c 100644 --- a/application/libraries/issues/plausichecks/NationNichtOesterreichAberGemeinde.php +++ b/application/libraries/issues/plausichecks/NationNichtOesterreichAberGemeinde.php @@ -13,11 +13,18 @@ class NationNichtOesterreichAberGemeinde extends PlausiChecker { $results = array(); + // get parameters from config + $exkludierte_studiengang_kz = isset($this->_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null; + // pass parameters needed for plausicheck $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; // get all students failing the plausicheck - $personRes = $this->_ci->plausichecklib->getNationNichtOesterreichAberGemeinde($studiengang_kz); + $personRes = $this->getNationNichtOesterreichAberGemeinde( + $studiengang_kz, + null, + $exkludierte_studiengang_kz + ); if (isError($personRes)) return $personRes; @@ -39,4 +46,49 @@ class NationNichtOesterreichAberGemeinde extends PlausiChecker // return the results return success($results); } + + /** + * Nation is not Austria, but address has austrian Gemeinde. + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param person_id int if check is to be executed only for one person + * @return success with prestudents or error + */ + public function getNationNichtOesterreichAberGemeinde($studiengang_kz = null, $person_id = null, $exkludierte_studiengang_kz = null) + { + $params = array(); + + $qry = "SELECT DISTINCT tbl_person.person_id, adr.gemeinde, adr.adresse_id + FROM + public.tbl_adresse adr + JOIN public.tbl_prestudent USING(person_id) + JOIN public.tbl_person USING(person_id) + JOIN public.tbl_student USING(prestudent_id) + JOIN public.tbl_benutzer ON(uid=student_uid) + JOIN public.tbl_studiengang stg ON tbl_prestudent.studiengang_kz = stg.studiengang_kz + WHERE + adr.nation!='A' + AND tbl_benutzer.aktiv + AND gemeinde NOT IN ('Münster') + AND EXISTS(SELECT 1 FROM bis.tbl_gemeinde WHERE name = adr.gemeinde)"; + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($person_id)) + { + $qry .= " AND tbl_person.person_id = ?"; + $params[] = $person_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } } diff --git a/application/libraries/issues/plausichecks/OrgformStgUngleichOrgformPrestudent.php b/application/libraries/issues/plausichecks/OrgformStgUngleichOrgformPrestudent.php index b7ef64c41..316e81072 100644 --- a/application/libraries/issues/plausichecks/OrgformStgUngleichOrgformPrestudent.php +++ b/application/libraries/issues/plausichecks/OrgformStgUngleichOrgformPrestudent.php @@ -13,12 +13,20 @@ class OrgformStgUngleichOrgformPrestudent extends PlausiChecker { $results = array(); + // get parameters from config + $exkludierte_studiengang_kz = isset($this->_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null; + // pass parameters needed for plausicheck $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; // get all students failing the plausicheck - $prestudentRes = $this->_ci->plausichecklib->getOrgformStgUngleichOrgformPrestudent($studiensemester_kurzbz, $studiengang_kz); + $prestudentRes = $this->getOrgformStgUngleichOrgformPrestudent( + $studiensemester_kurzbz, + $studiengang_kz, + null, + $exkludierte_studiengang_kz + ); if (isError($prestudentRes)) return $prestudentRes; @@ -49,4 +57,74 @@ class OrgformStgUngleichOrgformPrestudent extends PlausiChecker // return the results return success($results); } + + /** + * Orgform of a Studiengang in Studienplan should be the same as orgform of student. + * @param studiensemester_kurzbz string check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param prestudent_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + public function getOrgformStgUngleichOrgformPrestudent( + $studiensemester_kurzbz, + $studiengang_kz = null, + $prestudent_id = null, + $exkludierte_studiengang_kz = null + ) { + $params = array($studiensemester_kurzbz); + + $qry = " + SELECT + prestudent.person_id, prestudent.prestudent_id, status.studiensemester_kurzbz, + studiengang.orgform_kurzbz AS stg_orgform, status.orgform_kurzbz AS student_orgform, + prestudent.studiengang_kz AS student_studiengang, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz + FROM + public.tbl_studiengang studiengang + JOIN public.tbl_student student USING(studiengang_kz) + JOIN public.tbl_prestudent prestudent USING(prestudent_id) + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_benutzer benutzer on(benutzer.uid = student.student_uid) + JOIN public.tbl_studiengang stg ON prestudent.studiengang_kz = stg.studiengang_kz + LEFT JOIN lehre.tbl_studienplan stpl USING (studienplan_id) + WHERE + benutzer.aktiv = true + AND status.status_kurzbz IN ('Student', 'Unterbrecher', 'Abbrecher', 'Diplomand', 'Absolvent') + AND studiengang.studiengang_kz < 10000 + AND status.studiensemester_kurzbz = ? + AND NOT (status.orgform_kurzbz IS NULL AND studiengang.mischform = FALSE) + AND NOT EXISTS( + SELECT 1 + FROM + lehre.tbl_studienplan + JOIN + lehre.tbl_studienordnung USING(studienordnung_id) + WHERE + tbl_studienplan.studienplan_id = stpl.studienplan_id + AND tbl_studienordnung.studiengang_kz = prestudent.studiengang_kz + AND tbl_studienplan.orgform_kurzbz = status.orgform_kurzbz)"; + + if (isset($studiengang_kz)) + { + $qry .= " AND studiengang.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND prestudent.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + $qry .= " + ORDER BY student_uid"; + + return $this->_db->execReadOnlyQuery($qry, $params); + } } diff --git a/application/libraries/issues/plausichecks/PlausiChecker.php b/application/libraries/issues/plausichecks/PlausiChecker.php index bfa72b5e0..086a44cc4 100644 --- a/application/libraries/issues/plausichecks/PlausiChecker.php +++ b/application/libraries/issues/plausichecks/PlausiChecker.php @@ -6,13 +6,18 @@ abstract class PlausiChecker { protected $_ci; // code igniter instance + protected $_config; // configuration parameters for this plausicheck + protected $_db; // database for queries - public function __construct() + public function __construct($configurationParams = null) { $this->_ci =& get_instance(); // get code igniter instance - // load libraries - $this->_ci->load->library('issues/PlausicheckLib'); // load plausicheck library + // set configuration + $this->_config = $configurationParams; + + // get database for queries + $this->_db = new DB_Model(); } /** diff --git a/application/libraries/issues/plausichecks/PrestudentMischformOhneOrgform.php b/application/libraries/issues/plausichecks/PrestudentMischformOhneOrgform.php index 369085089..a4c3e2a4b 100644 --- a/application/libraries/issues/plausichecks/PrestudentMischformOhneOrgform.php +++ b/application/libraries/issues/plausichecks/PrestudentMischformOhneOrgform.php @@ -13,12 +13,20 @@ class PrestudentMischformOhneOrgform extends PlausiChecker { $results = array(); + // get parameters from config + $exkludierte_studiengang_kz = isset($this->_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null; + // pass parameters needed for plausicheck $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; // get all students failing the plausicheck - $prestudentRes = $this->_ci->plausichecklib->getPrestudentMischformOhneOrgform($studiensemester_kurzbz, $studiengang_kz); + $prestudentRes = $this->getPrestudentMischformOhneOrgform( + $studiensemester_kurzbz, + $studiengang_kz, + null, + $exkludierte_studiengang_kz + ); if (isError($prestudentRes)) return $prestudentRes; @@ -47,4 +55,55 @@ class PrestudentMischformOhneOrgform extends PlausiChecker // return the results return success($results); } + + /** + * Students in "mixed" Studiengang should have Orgform. + * @param studiensemester_kurzbz string check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param prestudent_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + public function getPrestudentMischformOhneOrgform( + $studiensemester_kurzbz, + $studiengang_kz = null, + $prestudent_id = null, + $exkludierte_studiengang_kz = null + ) { + $params = array($studiensemester_kurzbz); + + $qry = " + SELECT + pre.person_id, pre.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz, status.studiensemester_kurzbz + FROM + public.tbl_prestudent pre + JOIN public.tbl_person USING(person_id) + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_studiengang stg USING(studiengang_kz) + WHERE + status.status_kurzbz IN ('Bewerber', 'Student') + AND stg.mischform + AND (status.orgform_kurzbz='' OR status.orgform_kurzbz IS NULL) + AND status.studiensemester_kurzbz=?"; + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND pre.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } } diff --git a/application/libraries/issues/plausichecks/StgPrestudentUngleichStgStudent.php b/application/libraries/issues/plausichecks/StgPrestudentUngleichStgStudent.php index 4eb25ed11..94bea2f35 100644 --- a/application/libraries/issues/plausichecks/StgPrestudentUngleichStgStudent.php +++ b/application/libraries/issues/plausichecks/StgPrestudentUngleichStgStudent.php @@ -13,11 +13,14 @@ class StgPrestudentUngleichStgStudent extends PlausiChecker { $results = array(); + // get parameters from config + $exkludierte_studiengang_kz = isset($this->_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null; + // pass parameters needed for plausicheck $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; // get all students failing the plausicheck - $prestudentRes = $this->_ci->plausichecklib->getStgPrestudentUngleichStgStudent($studiengang_kz); + $prestudentRes = $this->getStgPrestudentUngleichStgStudent($studiengang_kz, null, $exkludierte_studiengang_kz); if (isError($prestudentRes)) return $prestudentRes; @@ -40,4 +43,48 @@ class StgPrestudentUngleichStgStudent extends PlausiChecker // return the results return success($results); } + + /** + * Studiengang should be the same for prestudent and student. + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param prestudent_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + public function getStgPrestudentUngleichStgStudent($studiengang_kz = null, $prestudent_id = null, $exkludierte_studiengang_kz = null) + { + $params = array(); + + $qry = " + SELECT + pre.person_id, pre.prestudent_id, stg.oe_kurzbz prestudent_stg_oe_kurzbz, student_stg.oe_kurzbz student_stg_oe_kurzbz + FROM + public.tbl_prestudent pre + JOIN public.tbl_student stud USING(prestudent_id) + JOIN public.tbl_person pers USING(person_id) + JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz + JOIN public.tbl_studiengang student_stg ON stud.studiengang_kz = student_stg.studiengang_kz + WHERE + stud.studiengang_kz != pre.studiengang_kz"; + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND pre.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } } diff --git a/application/libraries/issues/plausichecks/StgPrestudentUngleichStgStudienplan.php b/application/libraries/issues/plausichecks/StgPrestudentUngleichStgStudienplan.php index 7175725fd..fc0f52f23 100644 --- a/application/libraries/issues/plausichecks/StgPrestudentUngleichStgStudienplan.php +++ b/application/libraries/issues/plausichecks/StgPrestudentUngleichStgStudienplan.php @@ -13,11 +13,14 @@ class StgPrestudentUngleichStgStudienplan extends PlausiChecker { $results = array(); + // get parameters from config + $exkludierte_studiengang_kz = isset($this->_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null; + // pass parameters needed for plausicheck $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; // get all students failing the plausicheck - $prestudentRes = $this->_ci->plausichecklib->getStgPrestudentUngleichStgStudienplan($studiengang_kz); + $prestudentRes = $this->getStgPrestudentUngleichStgStudienplan($studiengang_kz, null, null, $exkludierte_studiengang_kz); if (isError($prestudentRes)) return $prestudentRes; @@ -40,4 +43,62 @@ class StgPrestudentUngleichStgStudienplan extends PlausiChecker // return the results return success($results); } + + /** + * Studiengang should be the same for prestudent and studienplan. + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param prestudent_id int if check is to be executed only for one prestudent + * @param studienordnung_id int if check is to be executed only for a certain studienordnung_id + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + public function getStgPrestudentUngleichStgStudienplan( + $studiengang_kz = null, + $prestudent_id = null, + $studienordnung_id = null, + $exkludierte_studiengang_kz = null + ) { + $params = array(); + + $qry = " + SELECT + DISTINCT ON (ps.prestudent_id) ps.person_id, ps.prestudent_id, stordnung.studienordnung_id, + stplan.bezeichnung AS studienplan, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz + FROM + public.tbl_prestudent ps + JOIN public.tbl_prestudentstatus USING(prestudent_id) + JOIN lehre.tbl_studienplan stplan USING(studienplan_id) + JOIN lehre.tbl_studienordnung stordnung USING(studienordnung_id) + JOIN public.tbl_person USING(person_id) + JOIN public.tbl_studiengang stg ON ps.studiengang_kz = stg.studiengang_kz + WHERE + ps.studiengang_kz<>stordnung.studiengang_kz + AND stg.melderelevant"; + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND ps.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($studienordnung_id)) + { + $qry .= " AND stordnung.studienordnung_id = ?"; + $params[] = $studienordnung_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } } diff --git a/application/libraries/issues/plausichecks/StudentstatusNachAbbrecher.php b/application/libraries/issues/plausichecks/StudentstatusNachAbbrecher.php index 12a7516ef..87bb51d7e 100644 --- a/application/libraries/issues/plausichecks/StudentstatusNachAbbrecher.php +++ b/application/libraries/issues/plausichecks/StudentstatusNachAbbrecher.php @@ -13,11 +13,14 @@ class StudentstatusNachAbbrecher extends PlausiChecker { $results = array(); + // get parameters from config + $exkludierte_studiengang_kz = isset($this->_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null; + // pass parameters needed for plausicheck $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; // get all students failing the plausicheck - $prestudentRes = $this->_ci->plausichecklib->getStudentstatusNachAbbrecher($studiengang_kz); + $prestudentRes = $this->getStudentstatusNachAbbrecher($studiengang_kz, null, $exkludierte_studiengang_kz); if (isError($prestudentRes)) return $prestudentRes; @@ -40,4 +43,48 @@ class StudentstatusNachAbbrecher extends PlausiChecker // return the results return success($results); } + + /** + * There shouldn't be any status after Abbrecher status. + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param prestudent_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + public function getStudentstatusNachAbbrecher($studiengang_kz = null, $prestudent_id = null, $exkludierte_studiengang_kz = null) + { + $params = array(); + + $qry = " + SELECT + prestudent.person_id, prestudent.prestudent_id, stg.oe_kurzbz AS prestudent_stg_oe_kurzbz + FROM + public.tbl_student student + JOIN public.tbl_prestudent prestudent USING(prestudent_id) + JOIN public.tbl_prestudentstatus prestatus USING(prestudent_id) + JOIN public.tbl_studiengang stg ON prestudent.studiengang_kz = stg.studiengang_kz + WHERE + prestatus.status_kurzbz = 'Abbrecher' + AND get_rolle_prestudent(prestudent.prestudent_id, prestatus.studiensemester_kurzbz) <> 'Abbrecher'"; + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND prestudent.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } } diff --git a/application/libraries/issues/plausichecks/StudienplanUngueltig.php b/application/libraries/issues/plausichecks/StudienplanUngueltig.php index 6b8fe49aa..9a306278e 100644 --- a/application/libraries/issues/plausichecks/StudienplanUngueltig.php +++ b/application/libraries/issues/plausichecks/StudienplanUngueltig.php @@ -13,12 +13,20 @@ class StudienplanUngueltig extends PlausiChecker { $results = array(); + // get parameters from config + $exkludierte_studiengang_kz = isset($this->_config['exkludierteStudiengaenge']) ? $this->_config['exkludierteStudiengaenge'] : null; + // pass parameters needed for plausicheck $studiensemester_kurzbz = isset($params['studiensemester_kurzbz']) ? $params['studiensemester_kurzbz'] : null; $studiengang_kz = isset($params['studiengang_kz']) ? $params['studiengang_kz'] : null; // get all students failing the plausicheck - $prestudentRes = $this->_ci->plausichecklib->getStudienplanUngueltig($studiensemester_kurzbz, $studiengang_kz); + $prestudentRes = $this->getStudienplanUngueltig( + $studiensemester_kurzbz, + $studiengang_kz, + null, + $exkludierte_studiengang_kz + ); if (isError($prestudentRes)) return $prestudentRes; @@ -48,4 +56,71 @@ class StudienplanUngueltig extends PlausiChecker // return the results return success($results); } + + /** + * Studienplan should be valid in current Ausbildungssemester of prestudent. + * @param studiensemester_kurzbz string check is to be executed for certain Studiensemester + * @param studiengang_kz int if check is to be executed for certain Studiengang + * @param prestudent_id int if check is to be executed only for one prestudent + * @param exkludierte_studiengang_kz array if certain Studiengänge have to be excluded from check + * @return success with prestudents or error + */ + public function getStudienplanUngueltig( + $studiensemester_kurzbz, + $studiengang_kz = null, + $prestudent_id = null, + $exkludierte_studiengang_kz = null + ) { + $params = array($studiensemester_kurzbz); + + $qry = " + SELECT + DISTINCT pre.person_id, pre.prestudent_id, + tbl_studienplan.bezeichnung AS studienplan, + status.status_kurzbz, + status.studiensemester_kurzbz, + status.ausbildungssemester, + stg.oe_kurzbz AS prestudent_stg_oe_kurzbz + FROM + public.tbl_prestudent pre + JOIN public.tbl_prestudentstatus status USING(prestudent_id) + JOIN public.tbl_person USING(person_id) + JOIN lehre.tbl_studienplan USING(studienplan_id) + JOIN public.tbl_studiengang stg ON pre.studiengang_kz = stg.studiengang_kz + WHERE + status_kurzbz in('Student', 'Interessent','Bewerber','Aufgenommener') + AND NOT EXISTS ( + SELECT + 1 + FROM + lehre.tbl_studienplan_semester + WHERE + studienplan_id=status.studienplan_id + AND tbl_studienplan_semester.semester = status.ausbildungssemester + AND tbl_studienplan_semester.studiensemester_kurzbz = status.studiensemester_kurzbz + ) + AND status.studiensemester_kurzbz=? + AND pre.bismelden + AND stg.melderelevant"; + + if (isset($studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz = ?"; + $params[] = $studiengang_kz; + } + + if (isset($prestudent_id)) + { + $qry .= " AND tbl_prestudent.prestudent_id = ?"; + $params[] = $prestudent_id; + } + + if (isset($exkludierte_studiengang_kz) && !isEmptyArray($exkludierte_studiengang_kz)) + { + $qry .= " AND stg.studiengang_kz NOT IN ?"; + $params[] = $exkludierte_studiengang_kz; + } + + return $this->_db->execReadOnlyQuery($qry, $params); + } } diff --git a/application/libraries/issues/resolvers/CORE_INOUT_0007.php b/application/libraries/issues/resolvers/CORE_INOUT_0007.php index 2d9c7a3f4..31ca79ffb 100644 --- a/application/libraries/issues/resolvers/CORE_INOUT_0007.php +++ b/application/libraries/issues/resolvers/CORE_INOUT_0007.php @@ -17,10 +17,10 @@ class CORE_INOUT_0007 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/IncomingHeimatNationOesterreich'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getIncomingHeimatNationOesterreich($params['studiensemester_kurzbz'], null, $params['issue_person_id']); + $checkRes = $this->_ci->incomingheimatnationoesterreich->getIncomingHeimatNationOesterreich($params['studiensemester_kurzbz'], null, $params['issue_person_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_INOUT_0008.php b/application/libraries/issues/resolvers/CORE_INOUT_0008.php index afa43893a..4fa090c6a 100644 --- a/application/libraries/issues/resolvers/CORE_INOUT_0008.php +++ b/application/libraries/issues/resolvers/CORE_INOUT_0008.php @@ -3,7 +3,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); /** - * Incoming shouldn't have austrian home address. + * Incoming should have IN/OUT data entry. */ class CORE_INOUT_0008 implements IIssueResolvedChecker { @@ -14,10 +14,10 @@ class CORE_INOUT_0008 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/IncomingOhneIoDatensatz'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getIncomingOhneIoDatensatz(null, $params['prestudent_id']); + $checkRes = $this->_ci->incomingohneiodatensatz->getIncomingOhneIoDatensatz(null, $params['prestudent_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_INOUT_0009.php b/application/libraries/issues/resolvers/CORE_INOUT_0009.php index b56344042..c739d71c3 100644 --- a/application/libraries/issues/resolvers/CORE_INOUT_0009.php +++ b/application/libraries/issues/resolvers/CORE_INOUT_0009.php @@ -14,10 +14,10 @@ class CORE_INOUT_0009 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/IncomingOrGsFoerderrelevant'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getIncomingOrGsFoerderrelevant(null, null, $params['prestudent_id']); + $checkRes = $this->_ci->incomingorgsfoerderrelevant->getIncomingOrGsFoerderrelevant(null, null, $params['prestudent_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_PERSON_0001.php b/application/libraries/issues/resolvers/CORE_PERSON_0001.php index bd94fea59..d0ac0d3ed 100644 --- a/application/libraries/issues/resolvers/CORE_PERSON_0001.php +++ b/application/libraries/issues/resolvers/CORE_PERSON_0001.php @@ -3,7 +3,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); /** - * Incoming shouldn't have austrian home address. + * Birth date of person shouldn't be too long ago. */ class CORE_PERSON_0001 implements IIssueResolvedChecker { @@ -14,10 +14,10 @@ class CORE_PERSON_0001 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/GbDatumWeitZurueck'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getGbDatumWeitZurueck(null, null, $params['issue_person_id']); + $checkRes = $this->_ci->gbdatumweitzurueck->getGbDatumWeitZurueck(null, null, $params['issue_person_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_PERSON_0002.php b/application/libraries/issues/resolvers/CORE_PERSON_0002.php index d1bb2fe94..608dcf0ce 100644 --- a/application/libraries/issues/resolvers/CORE_PERSON_0002.php +++ b/application/libraries/issues/resolvers/CORE_PERSON_0002.php @@ -3,7 +3,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); /** - * Incoming shouldn't have austrian home address. + * Nation of person should be austria if Gemeinde (city) is austrian. */ class CORE_PERSON_0002 implements IIssueResolvedChecker { @@ -14,10 +14,10 @@ class CORE_PERSON_0002 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/NationNichtOesterreichAberGemeinde'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getNationNichtOesterreichAberGemeinde(null, $params['issue_person_id']); + $checkRes = $this->_ci->nationnichtoesterreichabergemeinde->getNationNichtOesterreichAberGemeinde(null, $params['issue_person_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_PERSON_0003.php b/application/libraries/issues/resolvers/CORE_PERSON_0003.php index 08fea6c05..23a81b660 100644 --- a/application/libraries/issues/resolvers/CORE_PERSON_0003.php +++ b/application/libraries/issues/resolvers/CORE_PERSON_0003.php @@ -3,7 +3,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); /** - * Incoming shouldn't have austrian home address. + * Person should have only one home adress. */ class CORE_PERSON_0003 implements IIssueResolvedChecker { @@ -14,10 +14,10 @@ class CORE_PERSON_0003 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/FalscheAnzahlHeimatadressen'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getFalscheAnzahlHeimatadressen(null, null, $params['issue_person_id']); + $checkRes = $this->_ci->falscheanzahlheimatadressen->getFalscheAnzahlHeimatadressen(null, null, $params['issue_person_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_PERSON_0004.php b/application/libraries/issues/resolvers/CORE_PERSON_0004.php index bfe243fd1..ae3a855ec 100644 --- a/application/libraries/issues/resolvers/CORE_PERSON_0004.php +++ b/application/libraries/issues/resolvers/CORE_PERSON_0004.php @@ -3,7 +3,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); /** - * Incoming shouldn't have austrian home address. + * Person should have only one delivery adress. */ class CORE_PERSON_0004 implements IIssueResolvedChecker { @@ -14,10 +14,10 @@ class CORE_PERSON_0004 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/FalscheAnzahlZustelladressen'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getFalscheAnzahlZustelladressen(null, null, $params['issue_person_id']); + $checkRes = $this->_ci->falscheanzahlzustelladressen->getFalscheAnzahlZustelladressen(null, null, $params['issue_person_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_STG_0001.php b/application/libraries/issues/resolvers/CORE_STG_0001.php index 97cef6056..09c34be74 100644 --- a/application/libraries/issues/resolvers/CORE_STG_0001.php +++ b/application/libraries/issues/resolvers/CORE_STG_0001.php @@ -3,7 +3,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); /** - * Incoming shouldn't have austrian home address. + * Studiengang should be the same for prestudent and student. */ class CORE_STG_0001 implements IIssueResolvedChecker { @@ -14,10 +14,10 @@ class CORE_STG_0001 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/StgPrestudentUngleichStgStudent'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getStgPrestudentUngleichStgStudent(null, $params['prestudent_id']); + $checkRes = $this->_ci->stgprestudentungleichstgstudent->getStgPrestudentUngleichStgStudent(null, $params['prestudent_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_STG_0002.php b/application/libraries/issues/resolvers/CORE_STG_0002.php index fe414de38..999958042 100644 --- a/application/libraries/issues/resolvers/CORE_STG_0002.php +++ b/application/libraries/issues/resolvers/CORE_STG_0002.php @@ -3,7 +3,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); /** - * Incoming shouldn't have austrian home address. + * Orgform of a Studiengang in Studienplan should be the same as orgform of student. */ class CORE_STG_0002 implements IIssueResolvedChecker { @@ -17,10 +17,10 @@ class CORE_STG_0002 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/OrgformStgUngleichOrgformPrestudent'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getOrgformStgUngleichOrgformPrestudent($params['studiensemester_kurzbz'], null, $params['prestudent_id']); + $checkRes = $this->_ci->orgformstgungleichorgformprestudent->getOrgformStgUngleichOrgformPrestudent($params['studiensemester_kurzbz'], null, $params['prestudent_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_STG_0003.php b/application/libraries/issues/resolvers/CORE_STG_0003.php index 33cb0846b..22d6399be 100644 --- a/application/libraries/issues/resolvers/CORE_STG_0003.php +++ b/application/libraries/issues/resolvers/CORE_STG_0003.php @@ -3,7 +3,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); /** - * Incoming shouldn't have austrian home address. + * Students in "mixed" Studiengang should have Orgform. */ class CORE_STG_0003 implements IIssueResolvedChecker { @@ -17,10 +17,10 @@ class CORE_STG_0003 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/PrestudentMischformOhneOrgform'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getPrestudentMischformOhneOrgform($params['studiensemester_kurzbz'], null, $params['prestudent_id']); + $checkRes = $this->_ci->prestudentmischformohneorgform->getPrestudentMischformOhneOrgform($params['studiensemester_kurzbz'], null, $params['prestudent_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_STG_0004.php b/application/libraries/issues/resolvers/CORE_STG_0004.php index 02d45bbd3..2eedfc7fe 100644 --- a/application/libraries/issues/resolvers/CORE_STG_0004.php +++ b/application/libraries/issues/resolvers/CORE_STG_0004.php @@ -3,7 +3,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); /** - * Incoming shouldn't have austrian home address. + * Studiengang should be the same for prestudent and studienplan. */ class CORE_STG_0004 implements IIssueResolvedChecker { @@ -17,10 +17,10 @@ class CORE_STG_0004 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/StgPrestudentUngleichStgStudienplan'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getStgPrestudentUngleichStgStudienplan(null, $params['prestudent_id'], $params['studienordnung_id']); + $checkRes = $this->_ci->stgprestudentungleichstgstudienplan->getStgPrestudentUngleichStgStudienplan(null, $params['prestudent_id'], $params['studienordnung_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0001.php b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0001.php index 78c49810b..c74cd38fb 100644 --- a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0001.php +++ b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0001.php @@ -3,7 +3,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); /** - * Incoming shouldn't have austrian home address. + * Abbrecher cannot be active. */ class CORE_STUDENTSTATUS_0001 implements IIssueResolvedChecker { @@ -14,10 +14,10 @@ class CORE_STUDENTSTATUS_0001 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/AbbrecherAktiv'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getAbbrecherAktiv(null, $params['prestudent_id']); + $checkRes = $this->_ci->abbrecheraktiv->getAbbrecherAktiv(null, $params['prestudent_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0002.php b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0002.php index 23943397a..36827684c 100644 --- a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0002.php +++ b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0002.php @@ -3,7 +3,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); /** - * Incoming shouldn't have austrian home address. + * There shouldn't be any status after Abbrecher status. */ class CORE_STUDENTSTATUS_0002 implements IIssueResolvedChecker { @@ -14,10 +14,10 @@ class CORE_STUDENTSTATUS_0002 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/StudentstatusNachAbbrecher'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getStudentstatusNachAbbrecher(null, $params['prestudent_id']); + $checkRes = $this->_ci->studentstatusnachabbrecher->getStudentstatusNachAbbrecher(null, $params['prestudent_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0003.php b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0003.php index 6ac243b4f..f3b150d8d 100644 --- a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0003.php +++ b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0003.php @@ -3,7 +3,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); /** - * Incoming shouldn't have austrian home address. + * Ausbildungssemester of prestudent (lehrverband) must be the same as Ausbildungssemester of prestudentstatus. */ class CORE_STUDENTSTATUS_0003 implements IIssueResolvedChecker { @@ -17,10 +17,14 @@ class CORE_STUDENTSTATUS_0003 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/AusbildungssemPrestudentUngleichAusbildungssemStatus'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getAusbildungssemPrestudentUngleichAusbildungssemStatus($params['studiensemester_kurzbz'], null, $params['prestudent_id']); + $checkRes = $this->_ci->ausbildungssemprestudentungleichausbildungssemstatus->getAusbildungssemPrestudentUngleichAusbildungssemStatus( + $params['studiensemester_kurzbz'], + null, + $params['prestudent_id'] + ); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0004.php b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0004.php index d76215b6a..cbce2b01e 100644 --- a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0004.php +++ b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0004.php @@ -3,7 +3,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); /** - * Incoming shouldn't have austrian home address. + * Students with active status should have an active Benutzer. */ class CORE_STUDENTSTATUS_0004 implements IIssueResolvedChecker { @@ -17,10 +17,14 @@ class CORE_STUDENTSTATUS_0004 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/InaktiverStudentAktiverStatus'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getInaktiverStudentAktiverStatus($params['studiensemester_kurzbz'], null, $params['prestudent_id']); + $checkRes = $this->_ci->inaktiverstudentaktiverstatus->getInaktiverStudentAktiverStatus( + $params['studiensemester_kurzbz'], + null, + $params['prestudent_id'] + ); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0005.php b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0005.php index 7f7ca4723..f5e265194 100644 --- a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0005.php +++ b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0005.php @@ -3,7 +3,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); /** - * Incoming shouldn't have austrian home address. + * Students of a semester shouldn't start studies before the date of Bismeldung. */ class CORE_STUDENTSTATUS_0005 implements IIssueResolvedChecker { @@ -17,10 +17,10 @@ class CORE_STUDENTSTATUS_0005 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/InskriptionVorLetzerBismeldung'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getInskriptionVorLetzerBismeldung($params['studiensemester_kurzbz'], null, $params['prestudent_id']); + $checkRes = $this->_ci->inskriptionvorletzerbismeldung->getInskriptionVorLetzerBismeldung($params['studiensemester_kurzbz'], null, $params['prestudent_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0006.php b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0006.php index ba1e5b715..94658ec9c 100644 --- a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0006.php +++ b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0006.php @@ -3,7 +3,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); /** - * Incoming shouldn't have austrian home address. + * Status Dates and status studysemester dates should be in correct order. */ class CORE_STUDENTSTATUS_0006 implements IIssueResolvedChecker { @@ -14,10 +14,10 @@ class CORE_STUDENTSTATUS_0006 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/DatumStudiensemesterFalscheReihenfolge'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getDatumStudiensemesterFalscheReihenfolge(null, $params['prestudent_id']); + $checkRes = $this->_ci->datumstudiensemesterfalschereihenfolge->getDatumStudiensemesterFalscheReihenfolge(null, $params['prestudent_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0007.php b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0007.php index 1dd8fdcb2..3a2575e53 100644 --- a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0007.php +++ b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0007.php @@ -3,7 +3,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); /** - * Incoming shouldn't have austrian home address. + * Students with active Benutzer should have a status in the current semester. */ class CORE_STUDENTSTATUS_0007 implements IIssueResolvedChecker { @@ -14,10 +14,10 @@ class CORE_STUDENTSTATUS_0007 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/AktiverStudentOhneStatus'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getAktiverStudentOhneStatus(null, $params['prestudent_id']); + $checkRes = $this->_ci->aktiverstudentohnestatus->getAktiverStudentOhneStatus(null, $params['prestudent_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0008.php b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0008.php index 83357d9bf..53bfd72a6 100644 --- a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0008.php +++ b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0008.php @@ -3,7 +3,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); /** - * Incoming shouldn't have austrian home address. + * Studienplan should be valid in current Ausbildungssemester of prestudent. */ class CORE_STUDENTSTATUS_0008 implements IIssueResolvedChecker { @@ -17,10 +17,10 @@ class CORE_STUDENTSTATUS_0008 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/StudienplanUngueltig'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getStudienplanUngueltig($params['studiensemester_kurzbz'], null, $params['prestudent_id']); + $checkRes = $this->_ci->studienplanungueltig->getStudienplanUngueltig($params['studiensemester_kurzbz'], null, $params['prestudent_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0009.php b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0009.php index b1b5e9876..816b7e933 100644 --- a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0009.php +++ b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0009.php @@ -3,7 +3,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); /** - * Incoming shouldn't have austrian home address. + * Students with finished studies should have exactly one final exam. */ class CORE_STUDENTSTATUS_0009 implements IIssueResolvedChecker { @@ -14,10 +14,10 @@ class CORE_STUDENTSTATUS_0009 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/FalscheAnzahlAbschlusspruefungen'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getFalscheAnzahlAbschlusspruefungen(null, null, $params['prestudent_id']); + $checkRes = $this->_ci->falscheanzahlabschlusspruefungen->getFalscheAnzahlAbschlusspruefungen(null, null, $params['prestudent_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0010.php b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0010.php index 1e3a6849b..b31fb872a 100644 --- a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0010.php +++ b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0010.php @@ -3,7 +3,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); /** - * Incoming shouldn't have austrian home address. + * Date of final exam shouldn't be missing for Absolvent. */ class CORE_STUDENTSTATUS_0010 implements IIssueResolvedChecker { @@ -14,10 +14,10 @@ class CORE_STUDENTSTATUS_0010 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/DatumAbschlusspruefungFehlt'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getDatumAbschlusspruefungFehlt(null, null, $params['abschlusspruefung_id']); + $checkRes = $this->_ci->datumabschlusspruefungfehlt->getDatumAbschlusspruefungFehlt(null, null, $params['abschlusspruefung_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0011.php b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0011.php index 233240305..9dff0181e 100644 --- a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0011.php +++ b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0011.php @@ -3,7 +3,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); /** - * Incoming shouldn't have austrian home address. + * Date of sponsion shouldn't be missing for Absolvent. */ class CORE_STUDENTSTATUS_0011 implements IIssueResolvedChecker { @@ -14,10 +14,10 @@ class CORE_STUDENTSTATUS_0011 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/DatumSponsionFehlt'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getDatumSponsionFehlt(null, null, $params['abschlusspruefung_id']); + $checkRes = $this->_ci->datumsponsionfehlt->getDatumSponsionFehlt(null, null, $params['abschlusspruefung_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0012.php b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0012.php index 38832edc0..7fe5dbde4 100644 --- a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0012.php +++ b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0012.php @@ -3,7 +3,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); /** - * Incoming shouldn't have austrian home address. + * Bewerber should have participated in Reihungstest. */ class CORE_STUDENTSTATUS_0012 implements IIssueResolvedChecker { @@ -17,10 +17,14 @@ class CORE_STUDENTSTATUS_0012 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/BewerberNichtZumRtAngetreten'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getBewerberNichtZumRtAngetreten($params['studiensemester_kurzbz'], null, $params['prestudent_id']); + $checkRes = $this->_ci->bewerbernichtzumrtangetreten->getBewerberNichtZumRtAngetreten( + $params['studiensemester_kurzbz'], + null, + $params['prestudent_id'] + ); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0013.php b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0013.php index 78ad40a8e..86e8b75b1 100644 --- a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0013.php +++ b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0013.php @@ -3,7 +3,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); /** - * Incoming shouldn't have austrian home address. + * Current Ausbildungssemester shouldn't be 0. */ class CORE_STUDENTSTATUS_0013 implements IIssueResolvedChecker { @@ -17,10 +17,10 @@ class CORE_STUDENTSTATUS_0013 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/AktSemesterNull'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getAktSemesterNull($params['studiensemester_kurzbz'], null, $params['prestudent_id']); + $checkRes = $this->_ci->aktsemesternull->getAktSemesterNull($params['studiensemester_kurzbz'], null, $params['prestudent_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0014.php b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0014.php index 8d96b7c65..4b542cf0a 100644 --- a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0014.php +++ b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0014.php @@ -3,7 +3,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); /** - * Incoming shouldn't have austrian home address. + * Prestudent should have a final status. */ class CORE_STUDENTSTATUS_0014 implements IIssueResolvedChecker { @@ -14,10 +14,10 @@ class CORE_STUDENTSTATUS_0014 implements IIssueResolvedChecker $this->_ci =& get_instance(); // get code igniter instance - $this->_ci->load->library('issues/PlausicheckLib'); + $this->_ci->load->library('issues/plausichecks/AbschlussstatusFehlt'); // check if issue persists - $checkRes = $this->_ci->plausichecklib->getAbschlussstatusFehlt(null, null, $params['prestudent_id']); + $checkRes = $this->_ci->abschlussstatusfehlt->getAbschlussstatusFehlt(null, null, $params['prestudent_id']); if (isError($checkRes)) return $checkRes; diff --git a/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0015.php b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0015.php new file mode 100644 index 000000000..37e42ec0a --- /dev/null +++ b/application/libraries/issues/resolvers/CORE_STUDENTSTATUS_0015.php @@ -0,0 +1,36 @@ +_ci =& get_instance(); // get code igniter instance + + $this->_ci->load->library('issues/plausichecks/AktiverStudentstatusOhneKontobuchung'); + + // check if issue persists + $checkRes = $this->_ci->aktiverstudentstatusohnekontobuchung->getAktiverStudentstatusOhneKontobuchung( + $params['studiensemester_kurzbz'], + null, + $params['prestudent_id'] + ); + + if (isError($checkRes)) return $checkRes; + + if (hasData($checkRes)) + return success(false); // not resolved if issue is still present + else + return success(true); // resolved otherwise + } +} diff --git a/application/models/codex/Abschluss_model.php b/application/models/codex/Abschluss_model.php new file mode 100644 index 000000000..2907deff1 --- /dev/null +++ b/application/models/codex/Abschluss_model.php @@ -0,0 +1,30 @@ +dbTable = 'bis.tbl_abschluss'; + $this->pk = 'ausbildung_code'; + } + + public function getActiveAbschluesse($languageIndex) + { + return $this->execQuery( + ' + SELECT + ausbildung_code, bezeichnung[?], in_oesterreich + FROM + bis.tbl_abschluss + WHERE + aktiv + ORDER BY + CASE WHEN in_oesterreich THEN 0 ELSE 1 END, ausbildung_code', + array($languageIndex) + ); + } +} diff --git a/application/models/codex/Uhstat1daten_model.php b/application/models/codex/Uhstat1daten_model.php new file mode 100644 index 000000000..9bca44b58 --- /dev/null +++ b/application/models/codex/Uhstat1daten_model.php @@ -0,0 +1,14 @@ +dbTable = 'bis.tbl_uhstat1daten'; + $this->pk = 'uhstat1daten_id'; + } +} diff --git a/application/models/crm/Konto_model.php b/application/models/crm/Konto_model.php index 4b2a259c9..e76ed9e7a 100644 --- a/application/models/crm/Konto_model.php +++ b/application/models/crm/Konto_model.php @@ -100,8 +100,8 @@ class Konto_model extends DB_Model public function checkStudienbeitrag($uid, $stsem, $buchungstypen) { - $query = 'SELECT tbl_konto.buchungsnr, - tbl_konto.buchungsdatum + $query = 'SELECT tbl_konto.buchungsnr, + tbl_konto.buchungsdatum FROM public.tbl_konto, public.tbl_benutzer, public.tbl_student @@ -117,10 +117,47 @@ class Konto_model extends DB_Model FROM public.tbl_konto skonto WHERE skonto.buchungsnr = tbl_konto.buchungsnr_verweis OR skonto.buchungsnr_verweis = tbl_konto.buchungsnr_verweis - ) + ) ORDER BY buchungsnr DESC LIMIT 1 '; return $this->execQuery($query); } + + /** + * check if student has paid studienbeitrag for certain semester + * + * @param $person_id person_id + * @param $stsem stsem + * + * @return boolean + */ + public function checkStudienbeitragFromPerson($person_id, $stsem) + { + $this->addOrder('buchungsnr'); + $this->addLimit(1); + $result = $this->loadWhere([ + 'person_id'=>$person_id, + 'studiensemester_kurzbz' => $stsem, + 'buchungstyp_kurzbz' => 'Studiengebuehr' + ]); + + if (!getData($result)) + return false; + + $data = getData($result)[0]; + + $this->resetQuery(); + + $this->addSelect('sum(betrag) as differenz'); + $this->db->or_where('buchungsnr', $data->buchungsnr); + $this->db->or_where('buchungsnr_verweis', $data->buchungsnr); + + $result = $this->load(); + if (!getData($result)) + return false; + + $data = getData($result)[0]; + return $data->differenz >= 0; + } } diff --git a/application/models/crm/Prestudentstatus_model.php b/application/models/crm/Prestudentstatus_model.php index f39a41fda..08c081153 100644 --- a/application/models/crm/Prestudentstatus_model.php +++ b/application/models/crm/Prestudentstatus_model.php @@ -2,6 +2,10 @@ class Prestudentstatus_model extends DB_Model { + + const STATUS_ABBRECHER = 'Abbrecher'; + const STATUS_UNTERBRECHER = 'Unterbrecher'; + /** * Constructor */ @@ -226,4 +230,112 @@ class Prestudentstatus_model extends DB_Model return $this->execQuery($query, $parametersArray); } + + /** + * get Email of relevant Studiengang of prestudent + */ + public function getLastStatusWithStgEmail($prestudent_id, $studiensemester_kurzbz = '', $status_kurzbz = '') + { + $this->addSelect('tbl_prestudentstatus.*, + tbl_studienplan.bezeichnung AS studienplan_bezeichnung, + tbl_orgform.orgform_kurzbz AS orgform, + tbl_studienplan.sprache, + tbl_orgform.bezeichnung_mehrsprachig AS bezeichnung_orgform, + tbl_status.bezeichnung_mehrsprachig, + tbl_status_grund.bezeichnung_mehrsprachig AS bezeichnung_statusgrund, + tbl_studiengang.bezeichnung AS stg_bezeichnung, + tbl_studiengang.email'); + $this->addJoin('lehre.tbl_studienplan', 'studienplan_id', 'LEFT'); + $this->addJoin('lehre.tbl_studienordnung', 'studienordnung_id', 'LEFT'); + $this->addJoin('public.tbl_studiengang', 'studiengang_kz', 'LEFT'); + $this->addJoin('public.tbl_status', 'tbl_status.status_kurzbz = tbl_prestudentstatus.status_kurzbz'); + $this->addJoin('public.tbl_status_grund', 'statusgrund_id', 'LEFT'); + $this->addJoin('bis.tbl_orgform', 'COALESCE(tbl_studienplan.orgform_kurzbz, ' . $this->dbTable . '.orgform_kurzbz, tbl_studiengang.orgform_kurzbz) = tbl_orgform.orgform_kurzbz', 'LEFT'); + $this->db->where('tbl_status.status_kurzbz = tbl_prestudentstatus.status_kurzbz'); + + $where = array('prestudent_id' => $prestudent_id); + if ($studiensemester_kurzbz) + $where['studiensemester_kurzbz'] = $studiensemester_kurzbz; + if ($status_kurzbz) + $where['tbl_prestudentstatus.status_kurzbz'] = $status_kurzbz; + + $this->addOrder('datum', 'DESC'); + $this->addOrder('insertamum', 'DESC'); + $this->addOrder('ext_id', 'DESC'); + $this->addLimit(1); + + return $this->loadWhere($where); + } + + public function loadLastWithStgDetails($prestudent_id, $studiensemester_kurzbz = null) + { + $this->load->config('studierendenantrag'); + + $lang = getUserLanguage(); + + $this->addSelect($this->dbTable . '.prestudent_id'); + $this->addSelect($this->dbTable . '.ausbildungssemester AS semester'); + $this->addSelect($this->dbTable . '.studiensemester_kurzbz'); + $this->addSelect('s.matrikelnr'); + $this->addSelect('ss.studienjahr_kurzbz'); + $this->addSelect('pers.vorname'); + $this->addSelect('pers.nachname'); + $this->addSelect('TRIM(CONCAT(pers.vorname, \' \', pers.nachname)) AS name'); + $this->addSelect('pers.person_id'); + $this->addSelect('g.studiengang_kz'); + $this->addSelect('g.bezeichnung'); + $this->addSelect('o.orgform_kurzbz'); + $this->addSelect( + 'o.bezeichnung_mehrsprachig[(SELECT index FROM public.tbl_sprache WHERE sprache=\'' . $lang . '\')] AS orgform_bezeichnung', + false + ); + + $this->addJoin('public.tbl_student s', 'prestudent_id'); + $this->addJoin('public.tbl_prestudent p', 'prestudent_id'); + $this->addJoin('public.tbl_studiensemester ss', 'studiensemester_kurzbz'); + $this->addJoin('public.tbl_person pers', 'person_id'); + $this->addJoin('public.tbl_studiengang g', 'p.studiengang_kz=g.studiengang_kz'); + $this->addJoin('lehre.tbl_studienplan plan', 'studienplan_id', 'LEFT'); + $this->addJoin('bis.tbl_orgform o', 'COALESCE(plan.orgform_kurzbz, ' . $this->dbTable . '.orgform_kurzbz, g.orgform_kurzbz)=o.orgform_kurzbz'); + + $this->addOrder($this->dbTable . '.datum', 'DESC'); + $this->addOrder($this->dbTable . '.insertamum', 'DESC'); + $this->addOrder($this->dbTable . '.ext_id', 'DESC'); + + $this->addLimit(1); + + $this->db->where_in($this->dbTable . '.status_kurzbz', $this->config->item('antrag_prestudentstatus_whitelist')); + + $whereArr = [ + $this->dbTable . '.prestudent_id' => $prestudent_id, + 'g.aktiv' => true + ]; + + if ($studiensemester_kurzbz !== null) + { + $whereArr[$this->dbTable. '.studiensemester_kurzbz'] = $studiensemester_kurzbz; + } + + return $this->loadWhere($whereArr); + } + + /** + * call like this: + * $this->PrestudentstatusModel->withGrund('grund_kurzbz')->update($id, $otherData); + * or: + * $this->PrestudentstatusModel->withGrund('grund_kurzbz')->insert($otherData); + * @param string $statusgrund_kurzbz + * @return object $this + */ + public function withGrund($statusgrund_kurzbz) + { + if($statusgrund_kurzbz) + $this->db->set( + 'statusgrund_id', + '(SELECT statusgrund_id FROM public.tbl_status_grund WHERE statusgrund_kurzbz =' . $this->db->escape($statusgrund_kurzbz) .')', + false + ); + + return $this; + } } diff --git a/application/models/crm/Reihungstest_model.php b/application/models/crm/Reihungstest_model.php index ec1982ea6..86ebfd0af 100644 --- a/application/models/crm/Reihungstest_model.php +++ b/application/models/crm/Reihungstest_model.php @@ -322,7 +322,7 @@ class Reihungstest_model extends DB_Model JOIN lehre.tbl_studienplan ON (tbl_prestudentstatus.studienplan_id = tbl_studienplan.studienplan_id) LEFT JOIN bis.tbl_zgv ON (ps.zgv_code = tbl_zgv.zgv_code) WHERE rt_id = ? - AND get_rolle_prestudent(prestudent_id, rt.studiensemester_kurzbz) = \'Interessent\' + AND get_rolle_prestudent(prestudent_id, rt.studiensemester_kurzbz) IN (\'Interessent\', \'Bewerber\') AND tbl_prestudentstatus.studiensemester_kurzbz = rt.studiensemester_kurzbz AND bewerbung_abgeschicktamum IS NOT NULL AND bestaetigtam IS NOT NULL @@ -411,7 +411,7 @@ class Reihungstest_model extends DB_Model JOIN lehre.tbl_studienplan ON (tbl_prestudentstatus.studienplan_id = tbl_studienplan.studienplan_id) LEFT JOIN bis.tbl_zgv ON (ps.zgv_code = tbl_zgv.zgv_code) WHERE rt.studiengang_kz = ? - AND get_rolle_prestudent(prestudent_id, rt.studiensemester_kurzbz) = \'Interessent\' + AND get_rolle_prestudent(prestudent_id, rt.studiensemester_kurzbz) IN (\'Interessent\', \'Bewerber\') AND tbl_prestudentstatus.studiensemester_kurzbz = rt.studiensemester_kurzbz AND bewerbung_abgeschicktamum IS NOT NULL AND bestaetigtam IS NOT NULL @@ -462,7 +462,7 @@ class Reihungstest_model extends DB_Model LEFT JOIN bis.tbl_zgv ON (ps.zgv_code = tbl_zgv.zgv_code) LEFT JOIN PUBLIC.tbl_ort ON (tbl_rt_person.ort_kurzbz = tbl_ort.ort_kurzbz) WHERE rt_id = ? - AND get_rolle_prestudent(prestudent_id, rt.studiensemester_kurzbz) = \'Interessent\' + AND get_rolle_prestudent(prestudent_id, rt.studiensemester_kurzbz) IN (\'Interessent\', \'Bewerber\') AND tbl_prestudentstatus.studiensemester_kurzbz = rt.studiensemester_kurzbz AND bewerbung_abgeschicktamum IS NOT NULL AND bestaetigtam IS NOT NULL diff --git a/application/models/crm/RueckstellungStatus_model.php b/application/models/crm/RueckstellungStatus_model.php new file mode 100644 index 000000000..a4cb391f1 --- /dev/null +++ b/application/models/crm/RueckstellungStatus_model.php @@ -0,0 +1,14 @@ +dbTable = 'public.tbl_rueckstellung_status'; + $this->pk = 'status_kurzbz'; + } +} \ No newline at end of file diff --git a/application/models/crm/Rueckstellung_model.php b/application/models/crm/Rueckstellung_model.php new file mode 100644 index 000000000..c84c625eb --- /dev/null +++ b/application/models/crm/Rueckstellung_model.php @@ -0,0 +1,33 @@ +dbTable = 'public.tbl_rueckstellung'; + $this->pk = 'rueckstellung_id'; + $this->hasSequence = true; + } + + public function getByPersonId($person_id, $status = null) + { + $language_index = getUserLanguage() == 'German' ? 0 : 1; + + $this->addLimit(1); + $this->addJoin('tbl_rueckstellung_status', 'status_kurzbz'); + $this->addSelect('*, + array_to_json(bezeichnung_mehrsprachig::varchar[])->>'.$language_index . ' as bezeichnung'); + $this->addOrder('datum_bis', 'DESC'); + + $where['person_id'] = $person_id; + + if (!isEmptyString($status)) + $where['status_kurzbz'] = $status; + + return $this->loadWhere($where); + } +} \ No newline at end of file diff --git a/application/models/crm/Student_model.php b/application/models/crm/Student_model.php index 4404beb54..4b0a70b1a 100644 --- a/application/models/crm/Student_model.php +++ b/application/models/crm/Student_model.php @@ -82,4 +82,14 @@ class Student_model extends DB_Model return $result; } + + /** + * Get the FH-Email for a student (not the private kontakt email) + * @param $student_uid + * @return string + */ + public function getEmailFH($student_uid) + { + return $student_uid . '@' . DOMAIN; + } } diff --git a/application/models/education/Anrechnung_model.php b/application/models/education/Anrechnung_model.php index ebecf4118..cbfdb6607 100644 --- a/application/models/education/Anrechnung_model.php +++ b/application/models/education/Anrechnung_model.php @@ -30,7 +30,7 @@ class Anrechnung_model extends DB_Model */ public function createAnrechnungsantrag( $prestudent_id, $studiensemester_kurzbz, $lehrveranstaltung_id, - $begruendung_id, $dms_id, $anmerkung_student = null + $begruendung_id, $dms_id, $anmerkung_student = null, $begruendung_ects = null, $begruendung_lvinhalt = null ) { // Start DB transaction @@ -44,6 +44,8 @@ class Anrechnung_model extends DB_Model 'dms_id' => $dms_id, 'studiensemester_kurzbz' => $studiensemester_kurzbz, 'anmerkung_student' => $anmerkung_student, + 'begruendung_ects' => $begruendung_ects, + 'begruendung_lvinhalt' => $begruendung_lvinhalt, 'insertvon' => $this->_uid )); diff --git a/application/models/education/Anrechnungszeitraum_model.php b/application/models/education/Anrechnungszeitraum_model.php new file mode 100644 index 000000000..e6f0f13d3 --- /dev/null +++ b/application/models/education/Anrechnungszeitraum_model.php @@ -0,0 +1,87 @@ +dbTable = 'lehre.tbl_anrechnungszeitraum'; + $this->pk = 'anrechnungszeitraum_id'; + } + + /** + * Save new Anrechnungszeitraum. + * + * @param $studiensemester_kurzbz + * @param $anrechnungstart + * @param $anrechnungende + * @return array|stdClass + */ + public function insertAzr($studiensemester_kurzbz, $anrechnungstart, $anrechnungende) + { + $result = $this->insert(array( + 'studiensemester_kurzbz' => $studiensemester_kurzbz, + 'anrechnungstart' => $anrechnungstart, + 'anrechnungende' => $anrechnungende, + 'insertvon' => getAuthUID() + )); + + if (isError($result)) + { + return error('Fehler bei Anrechnungszeitraum speichern.'); + } + + // Return new anrechnungszeitraum_id + return success($result->retval); + } + + /** + * Delete Anrechnungszeitraum. + * + * @param $anrechnungszeitraum_id + * @return array|stdClass + */ + public function deleteAzr($anrechnungszeitraum_id) + { + $result = $this->delete(array('anrechnungszeitraum_id' => $anrechnungszeitraum_id)); + + if (isError($result)) + { + return error('Fehler bei Anrechnungszeitraum löschen.'); + } + + return success($result->retval); + } + + /** + * Update existing Anrechnungszeitraum. + * + * @param $anrechnungszeitraum_id + * @param $studiensemester_kurzbz + * @param $anrechnungstart + * @param $anrechnungende + * @return array|stdClass + */ + public function updateAzr($anrechnungszeitraum_id, $studiensemester_kurzbz, $anrechnungstart, $anrechnungende) + { + $result = $this->update( + $anrechnungszeitraum_id, + array( + 'studiensemester_kurzbz' => $studiensemester_kurzbz, + 'anrechnungstart' => $anrechnungstart, + 'anrechnungende' => $anrechnungende + ) + ); + + if (isError($result)) + { + return error('Fehler bei Anrechnungszeitraum update.'); + } + + return success($result->retval); + } + +} diff --git a/application/models/education/Lehrveranstaltung_model.php b/application/models/education/Lehrveranstaltung_model.php index f54443955..1f1b90131 100644 --- a/application/models/education/Lehrveranstaltung_model.php +++ b/application/models/education/Lehrveranstaltung_model.php @@ -200,6 +200,28 @@ class Lehrveranstaltung_model extends DB_Model return $this->execQuery($query, array($lehrveranstaltung_id, $studiensemester_kurzbz)); } + /** + * Gets all Leiter of Lehrveranstaltungsorganisationseinheit + * @param $lehrveranstaltung_id + * @return array|null + */ + public function getLeitungOfLvOe($lehrveranstaltung_id) + { + $query = "select distinct vorname, nachname, uid + FROM + lehre.tbl_lehrveranstaltung lv + JOIN public.tbl_organisationseinheit og using (oe_kurzbz) + JOIN public.tbl_benutzerfunktion bf using (oe_kurzbz) + join public.tbl_benutzer b using (uid) + join public.tbl_person p using (person_id) + where + bf.datum_von <= now()::date + and (bf.datum_bis >= now()::date or bf.datum_bis is null) + and bf.funktion_kurzbz = 'Leitung' -- Leitung of LV-OE + and lehrveranstaltung_id = ?"; + + return $this->execQuery($query, array($lehrveranstaltung_id)); + } /** * Gets Lehrveranstaltungen of a student diff --git a/application/models/education/Pruefung_model.php b/application/models/education/Pruefung_model.php index e3776c4ad..e1d668293 100644 --- a/application/models/education/Pruefung_model.php +++ b/application/models/education/Pruefung_model.php @@ -29,11 +29,223 @@ class Pruefung_model extends DB_Model JOIN lehre.tbl_pruefung prfg USING (student_uid) JOIN lehre.tbl_lehreinheit le USING (lehreinheit_id) JOIN lehre.tbl_lehrveranstaltung lv USING (lehrveranstaltung_id) - JOIN public.tbl_studiengang stg ON prst.studiengang_kz = stg.studiengang_kz + JOIN public.tbl_studiengang stg ON prst.studiengang_kz = stg.studiengang_kz WHERE pers.person_id = ? AND le.studiensemester_kurzbz = ? ORDER BY prfg.datum, pruefung_id'; return $this->execQuery($qry, array($person_id, $studiensemester_kurzbz)); } + + + /** + * NOTE(chris): not used + * @return string + */ + protected function loadWhereThreeExamsFailed() + { + $this->load->config('studierendenantrag'); + + $this->dbTable = 'lehre.tbl_pruefung p'; + + $sprache_index = "SELECT index FROM public.tbl_sprache WHERE sprache='" . getUserLanguage() . "' LIMIT 1"; + + $this->addSelect('max(p.datum) as datum'); + $this->addSelect('pers.vorname'); + $this->addSelect('pers.nachname'); + $this->addSelect('pers.person_id'); + $this->addSelect('s.matrikelnr'); + $this->addSelect('g.bezeichnung'); + $this->addSelect('g.studiengang_kz'); + $this->addSelect('o.bezeichnung_mehrsprachig[(' . $sprache_index . ')] AS orgform', false); + $this->addSelect('ps.prestudent_id'); + $this->addSelect('lv.bezeichnung as lvbezeichnung'); + $this->addSelect('le.studiensemester_kurzbz'); + $this->addSelect('a.typ'); + $this->addSelect('campus.get_status_studierendenantrag(a.studierendenantrag_id) status'); + $this->addSelect('count(1) as count'); + + $this->addGroupBy([ + 'pers.vorname', + 'pers.nachname', + 'pers.person_id', + 's.matrikelnr', + 'g.bezeichnung', + 'g.studiengang_kz', + 'o.bezeichnung_mehrsprachig', + 'ps.prestudent_id', + 'lv.bezeichnung', + 'le.studiensemester_kurzbz', + 'a.typ', + 'a.studierendenantrag_id' + ]); + $this->addJoin('lehre.tbl_note n', 'note'); + $this->addJoin('lehre.tbl_lehreinheit le', 'lehreinheit_id'); + $this->addJoin('lehre.tbl_lehrveranstaltung lv', 'lehrveranstaltung_id'); + $this->addJoin('public.tbl_student s', 'student_uid'); + $this->addJoin('public.tbl_prestudent ps', 'prestudent_id'); + $this->addJoin('public.tbl_person pers', 'person_id'); + $this->addJoin('public.tbl_benutzer b', 's.student_uid=b.uid'); + $this->addJoin('public.tbl_studiengang g', 'ps.studiengang_kz=g.studiengang_kz'); + $this->addJoin('public.tbl_prestudentstatus pss', 'pss.prestudent_id=ps.prestudent_id AND pss.studiensemester_kurzbz=le.studiensemester_kurzbz AND pss.status_kurzbz=get_rolle_prestudent(ps.prestudent_id, le.studiensemester_kurzbz)', 'LEFT'); + $this->addJoin('lehre.tbl_studienplan plan', 'studienplan_id', 'LEFT'); + $this->addJoin('bis.tbl_orgform o', 'COALESCE(plan.orgform_kurzbz, pss.orgform_kurzbz, g.orgform_kurzbz)=o.orgform_kurzbz'); + $this->db->join('campus.tbl_studierendenantrag a', 'ps.prestudent_id=a.prestudent_id and a.typ = ?', 'LEFT', false); + + $this->db->where("n.positiv", false); + /* $this->db->where_in("p.pruefungstyp_kurzbz1", ['kommPruef','zusKommPruef']);*/ + $this->db->where_in("get_rolle_prestudent(ps.prestudent_id, null)", $this->config->item('antrag_prestudentstatus_whitelist')); + + $this->db->where("g.aktiv", true); + + $this->db->where('lv.studiengang_kz not in( + SELECT ps.studiengang_kz + FROM + public.tbl_prestudent ps1 + JOIN public.tbl_prestudentstatus pss USING (prestudent_id) + WHERE pss.statusgrund_id in ? + AND ps.prestudent_id = ps1.prestudent_id)', null, false); + + // NOTE(chris): is Wiederholer without set statusgrund (legacy?) + $this->db->where( + '(SELECT COUNT(*) + FROM (SELECT DISTINCT studiensemester_kurzbz + FROM tbl_prestudentstatus _s + WHERE ausbildungssemester=get_absem_prestudent(ps.prestudent_id, le.studiensemester_kurzbz) + AND prestudent_id=ps.prestudent_id) a) = 1', + null, + false + ); + + return $this->db->get_compiled_select($this->dbTable); + } + + /** + * @return stdClass + */ + public function loadWhereCommitteeExamsFailed() + { + $this->load->config('studierendenantrag'); + + $this->dbTable = 'lehre.tbl_pruefung p'; + + $this->addSelect('p.datum'); + + $this->addJoin('lehre.tbl_note n', 'note'); + + $this->db->where("n.positiv", false); + $note_blacklist = $this->config->item('note_blacklist_wiederholung'); + if ($note_blacklist) + $this->db->where_not_in("n.note", $note_blacklist); + $this->db->where_in("p.pruefungstyp_kurzbz", ['kommPruef','zusKommPruef']); + + return $this->load(); + } + + + /** + * @return void + */ + protected function withDetailsForStudierendenAntrag() + { + $this->load->config('studierendenantrag'); + + $sprache_index = "SELECT index FROM public.tbl_sprache WHERE sprache='" . getUserLanguage() . "' LIMIT 1"; + + $this->addSelect('pers.vorname'); + $this->addSelect('pers.nachname'); + $this->addSelect('pers.person_id'); + $this->addSelect('s.matrikelnr'); + $this->addSelect('g.bezeichnung'); + $this->addSelect('g.studiengang_kz'); + $this->addSelect('o.bezeichnung_mehrsprachig[(' . $sprache_index . ')] AS orgform', false); + $this->addSelect('ps.prestudent_id'); + $this->addSelect('lv.bezeichnung as lvbezeichnung'); + $this->addSelect('le.studiensemester_kurzbz'); + $this->addSelect('a.typ'); + $this->addSelect('campus.get_status_studierendenantrag(a.studierendenantrag_id) status'); + + $this->addJoin('lehre.tbl_lehreinheit le', 'lehreinheit_id'); + $this->addJoin('lehre.tbl_lehrveranstaltung lv', 'lehrveranstaltung_id'); + $this->addJoin('public.tbl_student s', 'student_uid'); + $this->addJoin('public.tbl_prestudent ps', 'prestudent_id'); + $this->addJoin('public.tbl_person pers', 'person_id'); + $this->addJoin('public.tbl_benutzer b', 's.student_uid=b.uid'); + $this->addJoin('public.tbl_studiengang g', 'ps.studiengang_kz=g.studiengang_kz'); + $this->addJoin('public.tbl_prestudentstatus pss', 'pss.prestudent_id=ps.prestudent_id AND pss.studiensemester_kurzbz=le.studiensemester_kurzbz AND pss.status_kurzbz=get_rolle_prestudent(ps.prestudent_id, le.studiensemester_kurzbz)', 'LEFT'); + $this->addJoin('lehre.tbl_studienplan plan', 'studienplan_id', 'LEFT'); + $this->addJoin('bis.tbl_orgform o', 'COALESCE(plan.orgform_kurzbz, pss.orgform_kurzbz, g.orgform_kurzbz)=o.orgform_kurzbz'); + $this->addJoin('campus.tbl_studierendenantrag a', 'ps.prestudent_id=a.prestudent_id and a.typ=' . $this->escape(Studierendenantrag_model::TYP_WIEDERHOLUNG), 'LEFT'); + + $this->db->where_in("get_rolle_prestudent(ps.prestudent_id, null)", $this->config->item('antrag_prestudentstatus_whitelist')); + + $this->db->where("g.aktiv", true); + + $statusgruende = $this->config->item('status_gruende_wiederholer'); + if (is_array($statusgruende) && !isEmptyArray($statusgruende)) { + foreach ($statusgruende as $k => $v) { + $statusgruende[$k] = $this->db->escape($v); + } + $this->db->where('lv.studiengang_kz NOT IN( + SELECT ps1.studiengang_kz + FROM + public.tbl_prestudent ps1 + JOIN public.tbl_prestudentstatus pss USING (prestudent_id) + WHERE pss.statusgrund_id in (' . implode(',', $statusgruende) . ') + AND ps.prestudent_id = ps1.prestudent_id)', null, false); + } + } + + /** + * @param integer $prestudent_id student_uid + * + * @return stdClass + */ + public function loadWhereCommitteeExamFailedForPrestudent($prestudent_id) + { + $this->withDetailsForStudierendenAntrag(); + + $this->db->where('ps.prestudent_id', $prestudent_id); + + return $this->loadWhereCommitteeExamsFailed(); + } + + /** + * @param string $status + * @param \DateTime $maxDate + * @param \DateTime $minDate + * + * @return stdClass + */ + public function getAllPrestudentsWhereCommitteeExamFailed($status, $maxDate, $minDate) + { + $this->withDetailsForStudierendenAntrag(); + + if ($maxDate) + $this->db->where("p.datum <= ", $maxDate->format('Y-m-d')); + if ($minDate) + $this->db->where("p.datum > ", $minDate->format('Y-m-d')); + + $this->db->where("b.aktiv", true); + + if (is_array($status)) { + if (in_array(null, $status)) { + $status = array_filter($status); + if (count($status)) { + $this->db->group_start(); + $this->db->where_in('campus.get_status_studierendenantrag(a.studierendenantrag_id)', $status); + $this->db->or_where('campus.get_status_studierendenantrag(a.studierendenantrag_id)', null); + $this->db->group_end(); + } else { + $this->db->where('campus.get_status_studierendenantrag(a.studierendenantrag_id)', null); + } + } else { + $this->db->where_in('campus.get_status_studierendenantrag(a.studierendenantrag_id)', $status); + } + } else { + $this->db->where('campus.get_status_studierendenantrag(a.studierendenantrag_id)', $status); + } + + return $this->loadWhereCommitteeExamsFailed(); + } } diff --git a/application/models/education/Studierendenantrag_model.php b/application/models/education/Studierendenantrag_model.php new file mode 100644 index 000000000..60e53365c --- /dev/null +++ b/application/models/education/Studierendenantrag_model.php @@ -0,0 +1,251 @@ +dbTable = 'campus.tbl_studierendenantrag'; + $this->pk = 'studierendenantrag_id'; + + $this->load->config('studierendenantrag'); + + $this->load->model('education/Studierendenantragstatus_model', 'StudierendenantragstatusModel'); + } + + public function loadCreatedForStudiengaenge($studiengaenge, $typ) + { + return $this->loadForStudiengaenge($studiengaenge, $typ, $this->StudierendenantragstatusModel::STATUS_CREATED); + } + + public function loadForStudiengaenge($studiengaenge, $typ = null, $status = null) + { + $sql = "SELECT index FROM public.tbl_sprache WHERE sprache='" . getUserLanguage() . "' LIMIT 1"; + + $this->addSelect('UPPER(stg.typ) || UPPER(stg.kurzbz) || \' \' || stg.bezeichnung AS bezeichnung'); + $this->addSelect('bezeichnung_mehrsprachig[(' . $sql . ')] AS orgform', false); + $this->addSelect('s.studierendenantrag_id'); + $this->addSelect('matrikelnr'); + $this->addSelect('studienjahr_kurzbz'); + $this->addSelect('vorname'); + $this->addSelect('nachname'); + $this->addSelect('p.prestudent_id'); + $this->addSelect('p.studiengang_kz'); + $this->addSelect('semester'); + $this->addSelect($this->dbTable . '.grund'); + $this->addSelect($this->dbTable . '.datum'); + $this->addSelect('datum_wiedereinstieg'); + $this->addSelect($this->dbTable . '.typ'); + $this->addSelect('st.studierendenantrag_statustyp_kurzbz as status'); + $this->addSelect('dms_id'); + $this->addSelect('st.bezeichnung[(' . $sql . ')] as statustyp'); + + $this->addJoin('public.tbl_prestudent p', 'prestudent_id'); + $this->addJoin('public.tbl_student', 'prestudent_id'); + $this->addJoin('public.tbl_person', 'person_id'); + $this->addJoin('public.tbl_studiengang stg', 'p.studiengang_kz=stg.studiengang_kz'); + $this->addJoin('public.tbl_studiensemester ss', 'studiensemester_kurzbz'); + $this->addJoin('public.tbl_prestudentstatus ps', 'ps.prestudent_id=p.prestudent_id AND ps.studiensemester_kurzbz=ss.studiensemester_kurzbz AND ps.status_kurzbz=get_rolle_prestudent(p.prestudent_id, ss.studiensemester_kurzbz)'); + $this->addJoin('lehre.tbl_studienplan plan', 'studienplan_id', 'LEFT'); + $this->addJoin('bis.tbl_orgform of', 'of.orgform_kurzbz=COALESCE(plan.orgform_kurzbz, ps.orgform_kurzbz, stg.orgform_kurzbz)'); + $this->addJoin( + 'campus.tbl_studierendenantrag_status as s', + 'campus.get_status_id_studierendenantrag('. $this->dbTable .'.studierendenantrag_id) = studierendenantrag_status_id' + ); + $this->addJoin('campus.tbl_studierendenantrag_statustyp as st', 'studierendenantrag_statustyp_kurzbz'); + + $this->db->where_in('p.studiengang_kz', $studiengaenge); + + $where = []; + if ($status !== null) + $where['st.studierendenantrag_statustyp_kurzbz'] = $status; + if ($typ !== null) + $where[$this->dbTable . '.typ'] = $typ; + + return $this->loadWhere($where); + } + + public function isInStudiengang($studierendenantrag_id, $studiengaenge) + { + $this->addJoin('public.tbl_prestudent', 'prestudent_id'); + + $this->db->where_in('studiengang_kz', $studiengaenge); + + return $this->load($studierendenantrag_id); + } + + public function loadIdAndStatusWhere($where) + { + $this->addSelect('studierendenantrag_id'); + $this->addSelect('campus.get_status_studierendenantrag(studierendenantrag_id) status'); + return $this->loadWhere($where); + } + + public function loadWithStatusWhere($where, $types = null) + { + $lang = 'SELECT index FROM public.tbl_sprache WHERE sprache=' . $this->escape(getUserLanguage()); + + $this->addSelect('*'); + $this->addSelect('campus.get_status_studierendenantrag(studierendenantrag_id) status'); + $this->addSelect('t.bezeichnung[(' . $lang . ')] statustyp'); + + $this->addJoin( + 'campus.tbl_studierendenantrag_statustyp t', + 'campus.get_status_studierendenantrag(studierendenantrag_id)=t.studierendenantrag_statustyp_kurzbz' + ); + + if ($types && is_array($types)) { + $this->db->where_in('typ', $types); + } + + $this->addOrder('datum', 'DESC'); + + return $this->loadWhere($where); + } + + /** + * Get the studiengang and ausbildungssemester the student was in + * for the studiensemester the antrag was committed for + * + * @param integer $antrag_id + * + * @return stdClass + */ + public function getStgAndSem($antrag_id) + { + $this->addSelect('p.studiengang_kz'); + $this->addSelect('stg.bezeichnung'); + $this->addSelect('s.ausbildungssemester'); + $this->addSelect('plan.sprache'); + $this->addSelect('COALESCE(plan.orgform_kurzbz, s.orgform_kurzbz, stg.orgform_kurzbz) AS orgform_kurzbz'); + + $this->addJoin( + 'public.tbl_prestudentstatus s', + $this->dbTable . '.prestudent_id=s.prestudent_id AND ' . $this->dbTable . '.studiensemester_kurzbz=s.studiensemester_kurzbz' + ); + $this->addJoin('public.tbl_prestudent p', $this->dbTable . '.prestudent_id=p.prestudent_id'); + $this->addJoin('public.tbl_studiengang stg', 'studiengang_kz', 'LEFT'); + $this->addJoin('lehre.tbl_studienplan plan', 'studienplan_id', 'LEFT'); + + $this->addOrder('s.datum', 'DESC'); + $this->addOrder('s.insertamum', 'DESC'); + $this->addOrder('s.ext_id', 'DESC'); + + $this->addLimit(1); + + $this->db->where_in('s.status_kurzbz', $this->config->item('antrag_prestudentstatus_whitelist')); + + return $this->loadWhere([ + $this->pk => $antrag_id + ]); + } + + /** + * Get the studiengang the student is in + * + * @param integer $antrag_id + * + * @return stdClass + */ + public function getStg($antrag_id) + { + $this->addSelect('p.studiengang_kz'); + $this->addJoin('public.tbl_prestudent p', 'prestudent_id'); + + $this->addLimit(1); + + return $this->load( + $antrag_id + ); + } + + public function getStgEmail($antrag_id) + { + $this->addJoin('public.tbl_prestudent p', 'prestudent_id'); + $this->addJoin('public.tbl_studiengang sg', 'studiengang_kz'); + $this->addSelect('sg.email'); + + return $this->load($antrag_id); + } + + public function loadForPerson($person_id) + { + $lang = 'SELECT index FROM public.tbl_sprache WHERE sprache=' . $this->escape(getUserLanguage()); + $this->addSelect('stg.bezeichnung'); + $this->addSelect('bezeichnung_mehrsprachig[(' . $lang . ')] as orgform'); + $this->addSelect('p.studiengang_kz'); + $this->addSelect('st.studierendenantrag_statustyp_kurzbz as status'); + $this->addSelect('st.bezeichnung[(' . $lang . ')] as status_bezeichnung'); + $this->addSelect('p.prestudent_id'); + $this->addSelect($this->dbTable . '.studierendenantrag_id'); + $this->addSelect($this->dbTable . '.studiensemester_kurzbz'); + $this->addSelect($this->dbTable . '.datum'); + $this->addSelect($this->dbTable . '.typ'); + $this->addSelect($this->dbTable . '.insertamum'); + $this->addSelect($this->dbTable . '.insertvon'); + $this->addSelect($this->dbTable . '.datum_wiedereinstieg'); + $this->addSelect($this->dbTable . '.grund'); + $this->addSelect($this->dbTable . '.dms_id'); + $this->addSelect("(SELECT count(1) FROM campus.tbl_studierendenantrag_status WHERE studierendenantrag_id = " . $this->dbTable . ".studierendenantrag_id AND studierendenantrag_statustyp_kurzbz = 'Genehmigt') AS isapproved", false); + + $this->addJoin('public.tbl_prestudent p', 'prestudent_id', 'RIGHT'); + $this->addJoin('public.tbl_studiengang stg', 'p.studiengang_kz=stg.studiengang_kz'); + $this->addJoin('public.tbl_prestudentstatus ps', 'ps.prestudent_id=p.prestudent_id AND ps.studiensemester_kurzbz=' . $this->dbTable . '.studiensemester_kurzbz AND ps.status_kurzbz=get_rolle_prestudent(p.prestudent_id, ' . $this->dbTable . '.studiensemester_kurzbz)', 'LEFT'); + $this->addJoin('lehre.tbl_studienplan plan', 'studienplan_id', 'LEFT'); + $this->addJoin('bis.tbl_orgform of', 'of.orgform_kurzbz=COALESCE(plan.orgform_kurzbz, ps.orgform_kurzbz, stg.orgform_kurzbz)'); + $this->addJoin( + 'campus.tbl_studierendenantrag_statustyp st', + 'campus.get_status_studierendenantrag(studierendenantrag_id)=st.studierendenantrag_statustyp_kurzbz', + 'LEFT' + ); + + $this->db->where("(SELECT status_kurzbz FROM public.tbl_prestudentstatus WHERE prestudent_id=p.prestudent_id AND status_kurzbz='Student' LIMIT 1) IS NOT NULL", null, false); + + + return $this->loadWhere([ + 'p.person_id' => $person_id + ]); + } + + public function getAntraegeWhereWiedereinstiegBetween($start, $end) + { + $this->addSelect('sg.email'); + $this->addSelect('vorname'); + $this->addSelect('nachname'); + $this->addSelect($this->dbTable.'.*'); + + $this->addJoin( + 'campus.tbl_studierendenantrag_status s', + 'campus.get_status_id_studierendenantrag(' . $this->dbTable . '.studierendenantrag_id)=s.studierendenantrag_status_id' + ); + $this->addJoin('public.tbl_prestudent p', 'prestudent_id'); + $this->addJoin('public.tbl_person', 'person_id'); + $this->addJoin('public.tbl_studiengang sg', 'studiengang_kz'); + + $this->db->where('datum_wiedereinstieg >=', $start->format('Y-m-d')); + $this->db->where('datum_wiedereinstieg <=', $end->format('Y-m-d')); + + return $this->loadWhere([ + 's.studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_APPROVED, + $this->dbTable.'.typ' => self::TYP_UNTERBRECHUNG, + ]); + } + + public function getWithLastStatusWhere($where) + { + $this->addJoin( + 'campus.tbl_studierendenantrag_status s', + 'campus.get_status_id_studierendenantrag(' . $this->dbTable . '.studierendenantrag_id)=s.studierendenantrag_status_id' + ); + + return $this->loadWhere($where); + } +} diff --git a/application/models/education/Studierendenantraglehrveranstaltung_model.php b/application/models/education/Studierendenantraglehrveranstaltung_model.php new file mode 100644 index 000000000..47a07ecfe --- /dev/null +++ b/application/models/education/Studierendenantraglehrveranstaltung_model.php @@ -0,0 +1,84 @@ +dbTable = 'campus.tbl_studierendenantrag_lehrveranstaltung'; + $this->pk = 'studierendenantrag_lehrveranstaltung_id'; + } + + public function insertBatch($data) + { + // Check class properties + if (is_null($this->dbTable)) return error('The given database table name is not valid', EXIT_MODEL); + + // DB-INSERT + $insert = $this->db->insert_batch($this->dbTable, $data); + + if ($insert) + { + return success(); + } + else + { + return error($this->db->error(), EXIT_DATABASE); + } + } + + public function deleteWhere($where) + { + if (is_null($this->dbTable)) return error('The given database table name is not valid', EXIT_MODEL); + + $delete = $this->db->delete($this->dbTable, $where); + + if ($delete) + { + return success(); + } + else + { + return error($this->db->error(), EXIT_DATABASE); + } + } + + public function getLvsForPrestudent($prestudent_id, $studiensemester_kurzbz) + { + $this->addSelect($this->dbTable . '.*'); + $this->addSelect('a.prestudent_id'); + $this->addSelect('lv.bezeichnung as lv_bezeichnung'); + $this->addSelect('stat.insertamum as freigabedatum'); + $this->addSelect('n.bezeichnung as note_bezeichnung'); + $this->addSelect('stg.bezeichnung as stg_bezeichnung'); + + $this->addJoin('campus.tbl_studierendenantrag a', 'studierendenantrag_id'); + $this->addJoin('lehre.tbl_note n', 'note'); + $this->addJoin('lehre.tbl_lehrveranstaltung lv', 'lehrveranstaltung_id'); + $this->addJoin('public.tbl_prestudent ps', 'prestudent_id'); + $this->addJoin('public.tbl_studiengang stg', 'ps.studiengang_kz = stg.studiengang_kz'); + $this->addJoin( + 'campus.tbl_studierendenantrag_status stat', + 'stat.studierendenantrag_status_id = campus.get_status_id_studierendenantrag(a.studierendenantrag_id)' + ); + $this->addJoin('public.tbl_student s', 'prestudent_id'); + $this->addJoin( + 'lehre.tbl_zeugnisnote z', + 'z.lehrveranstaltung_id=lv.lehrveranstaltung_id AND z.student_uid=s.student_uid AND z.studiensemester_kurzbz=a.studiensemester_kurzbz', + 'LEFT' + ); + $this->addJoin('lehre.tbl_note zn', 'z.note = zn.note', 'LEFT'); + + return $this->loadWhere([ + 'ps.prestudent_id' => $prestudent_id, + 'a.typ' => Studierendenantrag_model::TYP_WIEDERHOLUNG, + 'stat.studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_APPROVED, + 'n.note <> ' => 0, + $this->dbTable . '.studiensemester_kurzbz' => $studiensemester_kurzbz, + '(n.note<>19 OR (z.note IS NOT NULL AND zn.positiv))' => null + ]); + } +} diff --git a/application/models/education/Studierendenantragstatus_model.php b/application/models/education/Studierendenantragstatus_model.php new file mode 100644 index 000000000..b4bf3938b --- /dev/null +++ b/application/models/education/Studierendenantragstatus_model.php @@ -0,0 +1,51 @@ +dbTable = 'campus.tbl_studierendenantrag_status'; + $this->pk = 'studierendenantrag_status_id'; + } + + public function loadWithTyp($studierendenantrag_status_id) + { + $lang = 'SELECT index FROM public.tbl_sprache WHERE sprache=' . $this->escape(getUserLanguage()); + + $this->addSelect($this->dbTable . '.*'); + $this->addSelect('bezeichnung[(' . $lang . ')] AS typ'); + + $this->addJoin('campus.tbl_studierendenantrag_statustyp', 'studierendenantrag_statustyp_kurzbz'); + + return $this->load($studierendenantrag_status_id); + } + + public function loadWithTypWhere($where) + { + $lang = 'SELECT index FROM public.tbl_sprache WHERE sprache=' . $this->escape(getUserLanguage()); + + $this->addSelect($this->dbTable . '.*'); + $this->addSelect('bezeichnung[(' . $lang . ')] AS typ'); + + $this->addJoin('campus.tbl_studierendenantrag_statustyp', 'studierendenantrag_statustyp_kurzbz'); + + return $this->loadWhere($where); + } +} diff --git a/application/models/education/Zeugnisnote_model.php b/application/models/education/Zeugnisnote_model.php index a4185a7f4..b4d909e37 100644 --- a/application/models/education/Zeugnisnote_model.php +++ b/application/models/education/Zeugnisnote_model.php @@ -102,7 +102,7 @@ class Zeugnisnote_model extends DB_Model JOIN lehre.tbl_zeugnisnote zgnisnote USING (student_uid) JOIN lehre.tbl_note note ON zgnisnote.note = note.note JOIN lehre.tbl_lehrveranstaltung lv USING (lehrveranstaltung_id) - JOIN public.tbl_studiengang stg ON prst.studiengang_kz = stg.studiengang_kz + JOIN public.tbl_studiengang stg ON prst.studiengang_kz = stg.studiengang_kz WHERE pers.person_id = ? AND zgnisnote.studiensemester_kurzbz = ?"; @@ -140,4 +140,83 @@ class Zeugnisnote_model extends DB_Model return $this->execQuery($qry, $params); } + + /** + * Gets courses (Zeugnisnoten) for a student. + * @param string $student_uid, + * @param string $studiensemester_kurzbz + * + * @return object + */ + public function getZeugnisnoten($student_uid, $studiensemester_kurzbz) + { + $params = array(); + $where=''; + + if ($student_uid != null) + { + $where .= " AND uid=?"; + $params[] = $student_uid; + } + if ($studiensemester_kurzbz !=null) + { + $where.=" AND vw_student_lehrveranstaltung.studiensemester_kurzbz= ?"; + $params[] = $studiensemester_kurzbz; + } + + $where2=''; + + if ($student_uid != null) + { + $where2 .= " AND student_uid=?"; + $params[] = $student_uid; + } + if ($studiensemester_kurzbz !=null) + { + $where2 .= " AND studiensemester_kurzbz= ?"; + $params[] = $studiensemester_kurzbz; + } + + $qry = "SELECT vw_student_lehrveranstaltung.lehrveranstaltung_id, uid, + vw_student_lehrveranstaltung.studiensemester_kurzbz, note, punkte, uebernahmedatum, benotungsdatum, + vw_student_lehrveranstaltung.ects, vw_student_lehrveranstaltung.semesterstunden, + tbl_zeugnisnote.updateamum, tbl_zeugnisnote.updatevon, tbl_zeugnisnote.insertamum, + tbl_zeugnisnote.insertvon, tbl_zeugnisnote.ext_id, + vw_student_lehrveranstaltung.bezeichnung as lehrveranstaltung_bezeichnung, + vw_student_lehrveranstaltung.bezeichnung_english as lehrveranstaltung_bezeichnung_english, + tbl_note.bezeichnung as note_bezeichnung, + tbl_note.positiv as note_positiv, + tbl_zeugnisnote.bemerkung as bemerkung, + vw_student_lehrveranstaltung.sort, + vw_student_lehrveranstaltung.zeugnis, + vw_student_lehrveranstaltung.studiengang_kz, + vw_student_lehrveranstaltung.lv_lehrform_kurzbz, + tbl_lehrveranstaltung.sws + FROM + ( + campus.vw_student_lehrveranstaltung LEFT JOIN lehre.tbl_zeugnisnote + ON(uid=student_uid + AND vw_student_lehrveranstaltung.studiensemester_kurzbz=tbl_zeugnisnote.studiensemester_kurzbz + AND vw_student_lehrveranstaltung.lehrveranstaltung_id=tbl_zeugnisnote.lehrveranstaltung_id + ) + ) LEFT JOIN lehre.tbl_note USING(note) + JOIN lehre.tbl_lehrveranstaltung ON(vw_student_lehrveranstaltung.lehrveranstaltung_id=tbl_lehrveranstaltung.lehrveranstaltung_id) + WHERE true $where + + UNION + SELECT lehre.tbl_lehrveranstaltung.lehrveranstaltung_id,student_uid AS uid,studiensemester_kurzbz, note, punkte, + uebernahmedatum, benotungsdatum,lehre.tbl_lehrveranstaltung.ects,lehre.tbl_lehrveranstaltung.semesterstunden, tbl_zeugnisnote.updateamum, tbl_zeugnisnote.updatevon, tbl_zeugnisnote.insertamum, + tbl_zeugnisnote.insertvon, tbl_zeugnisnote.ext_id, lehre.tbl_lehrveranstaltung.bezeichnung as lehrveranstaltung_bezeichnung, lehre.tbl_lehrveranstaltung.bezeichnung_english as lehrveranstaltung_bezeichnung_english, + tbl_note.bezeichnung as note_bezeichnung, tbl_note.positiv as note_positiv, tbl_zeugnisnote.bemerkung as bemerkung, tbl_lehrveranstaltung.sort, tbl_lehrveranstaltung.zeugnis, tbl_lehrveranstaltung.studiengang_kz, + tbl_lehrveranstaltung.lehrform_kurzbz as lv_lehrform_kurzbz, tbl_lehrveranstaltung.sws + FROM + lehre.tbl_zeugnisnote + JOIN lehre.tbl_lehrveranstaltung USING (lehrveranstaltung_id) + JOIN lehre.tbl_note USING(note) + WHERE true $where2 + + ORDER BY sort"; + + return $this->execQuery($qry, $params); + } } diff --git a/application/models/organisation/Studiengang_model.php b/application/models/organisation/Studiengang_model.php index f4f8b3c9e..d232e14d6 100644 --- a/application/models/organisation/Studiengang_model.php +++ b/application/models/organisation/Studiengang_model.php @@ -511,10 +511,10 @@ class Studiengang_model extends DB_Model public function getStudiengangTyp($studiengang_kz, $typ = null) { $query = "SELECT DISTINCT(sgt.*) - FROM tbl_studiengangstyp sgt JOIN tbl_studiengang sg on sgt.typ = sg.typ + FROM tbl_studiengangstyp sgt JOIN tbl_studiengang sg on sgt.typ = sg.typ WHERE studiengang_kz IN ?"; - $params[] = $studiengang_kz; + $params = [$studiengang_kz]; if (!is_null($typ)) { @@ -524,4 +524,80 @@ class Studiengang_model extends DB_Model return $this->execQuery($query, $params); } + + /** + * @param array $studiengang_kzs + * @param array $not_antrag_typ (optional) If the prestudent has an antrag with one of the specified types it will be excluded from the result + * @param array $prestudent_stati (optional) + * + * @return stdClass + */ + public function getAktivePrestudenten($studiengang_kzs, $not_antrag_typ = null, $query = null) + { + $this->load->config('studierendenantrag'); + + $sql = "SELECT index FROM public.tbl_sprache WHERE sprache='" . getUserLanguage() . "' LIMIT 1"; + + $this->addSelect($this->dbTable . '.studiengang_kz'); + $this->addSelect($this->dbTable . '.bezeichnung'); + $this->addSelect('o.orgform_kurzbz'); + $this->addSelect('o.bezeichnung_mehrsprachig[(' . $sql . ')] AS orgform', false); + $this->addSelect('ps.ausbildungssemester AS semester'); + $this->addSelect('ps.studiensemester_kurzbz'); + $this->addSelect('p.prestudent_id'); + $this->addSelect('pers.vorname'); + $this->addSelect('pers.nachname'); + $this->addSelect("CONCAT(UPPER(pers.nachname), ' ', pers.vorname, ' (', " . $this->dbTable . ".bezeichnung, ')') AS name"); + + $this->addJoin('public.tbl_prestudent p', 'studiengang_kz'); + $this->addJoin( + 'public.tbl_prestudentstatus ps', + 'ps.prestudent_id=p.prestudent_id + AND ps.studiensemester_kurzbz=get_stdsem_prestudent(p.prestudent_id, NULL) + AND ps.ausbildungssemester=get_absem_prestudent(p.prestudent_id, NULL) + AND ps.status_kurzbz=get_rolle_prestudent(p.prestudent_id, NULL)' + ); + $this->addJoin('lehre.tbl_studienplan plan', 'studienplan_id'); + $this->addJoin('bis.tbl_orgform o', 'COALESCE(plan.orgform_kurzbz, ps.orgform_kurzbz, ' . $this->dbTable . '.orgform_kurzbz)=o.orgform_kurzbz'); + $this->addJoin('public.tbl_person pers', 'person_id'); + $this->addJoin('public.tbl_student stud', 'p.prestudent_id=stud.prestudent_id', 'LEFT'); + + $this->db->where_in($this->dbTable . '.studiengang_kz', $studiengang_kzs); + $this->db->where_in('ps.status_kurzbz', $this->config->item('antrag_prestudentstatus_whitelist')); + $this->db->where($this->dbTable . ".aktiv", true); + + if ($not_antrag_typ !== null && is_array($not_antrag_typ)) { + foreach($not_antrag_typ as $k => $v) + $not_antrag_typ[$k] = $this->db->escape($v); + $this->addJoin( + 'campus.tbl_studierendenantrag a', + 'a.prestudent_id=p.prestudent_id and a.typ in ('. + implode(',', $not_antrag_typ). + ") AND campus.get_status_studierendenantrag (a.studierendenantrag_id)<>'" . + Studierendenantragstatus_model::STATUS_CANCELLED . "'", + 'LEFT' + ); + $this->db->where('a.typ IS NULL'); + } + + if ($query) { + $query = explode(' ', $query); + $this->db->group_start(); + foreach ($query as $q) { + $this->db->group_start(); + $this->db->where('pers.vorname ILIKE', "%" . $q . "%"); + $this->db->or_where('pers.nachname ILIKE', "%" . $q . "%"); + $this->db->or_where('stud.student_uid ILIKE', "%" . $q . "%"); + $this->db->or_where($this->dbTable . '.bezeichnung ILIKE', "%" . $q . "%"); + if (is_numeric($q)) + $this->db->or_where('p.prestudent_id', $q); + $this->db->group_end(); + } + $this->db->group_end(); + } + + $this->addOrder('name'); + + return $this->load(); + } } diff --git a/application/models/organisation/Studienplan_model.php b/application/models/organisation/Studienplan_model.php index 0cc23b85d..66ec06ba8 100644 --- a/application/models/organisation/Studienplan_model.php +++ b/application/models/organisation/Studienplan_model.php @@ -45,7 +45,7 @@ class Studienplan_model extends DB_Model $whereArray["tbl_studienplan.sprache"] = $sprache; } - return $this->StudienplanModel->loadWhere($whereArray); + return $this->loadWhere($whereArray); } public function getStudienplanLehrveranstaltung($studienplan_id, $semester) @@ -53,6 +53,38 @@ class Studienplan_model extends DB_Model $this->addJoin('lehre.tbl_studienplan_lehrveranstaltung', 'studienplan_id'); $this->addJoin('lehre.tbl_lehrveranstaltung', 'lehrveranstaltung_id'); $this->addOrder('tbl_lehrveranstaltung.sort'); + + return $this->loadWhere(array( + 'studienplan_id' => $studienplan_id, + 'tbl_studienplan_lehrveranstaltung.semester' => $semester + )); + } + + public function getStudienplanLehrveranstaltungForPrestudent($studienplan_id, $semester, $prestudent_id, $note_stsem) + { + $lang = 'SELECT index FROM public.tbl_sprache WHERE sprache=' . $this->escape(getUserLanguage()); + $sql = 'SELECT student_uid FROM public.tbl_student WHERE prestudent_id=' . $this->escape($prestudent_id); + + $this->addSelect($this->dbTable . '.*'); + $this->addSelect('lv.*'); + $this->addSelect('COALESCE(n.bezeichnung_mehrsprachig[(' . $lang . ')], NULL) AS note'); + $this->addSelect('n.positiv'); + $this->addSelect('lehre.tbl_studienplan_lehrveranstaltung.studienplan_lehrveranstaltung_id'); + $this->addSelect('lehre.tbl_studienplan_lehrveranstaltung.sort plan_sort'); + $this->addSelect('lehre.tbl_studienplan_lehrveranstaltung.studienplan_lehrveranstaltung_id_parent'); + + $this->addJoin('lehre.tbl_studienplan_lehrveranstaltung', 'studienplan_id'); + $this->addJoin('lehre.tbl_lehrveranstaltung lv', 'lehrveranstaltung_id'); + $this->addJoin( + 'lehre.tbl_zeugnisnote zn', + 'zn.lehrveranstaltung_id=lv.lehrveranstaltung_id AND zn.student_uid=(' . $sql . ') AND zn.studiensemester_kurzbz=' . $this->escape($note_stsem), + 'LEFT' + ); + $this->addJoin('lehre.tbl_note n', 'n.note=zn.note', 'LEFT'); + + $this->addOrder('lehre.tbl_studienplan_lehrveranstaltung.sort'); + $this->addOrder('lv.sort'); + return $this->loadWhere(array( 'studienplan_id' => $studienplan_id, 'tbl_studienplan_lehrveranstaltung.semester' => $semester diff --git a/application/models/organisation/Studiensemester_model.php b/application/models/organisation/Studiensemester_model.php index bb9b94c92..45a4eac7c 100644 --- a/application/models/organisation/Studiensemester_model.php +++ b/application/models/organisation/Studiensemester_model.php @@ -204,4 +204,14 @@ class Studiensemester_model extends DB_Model return $this->execQuery($query, array($studiensemester_kurzbz)); } + + public function getAktAndFutureSemester() + { + $query = 'SELECT studiensemester_kurzbz + FROM public.tbl_studiensemester + WHERE start >= NOW() OR (start <= NOW() AND ende >= NOW()) + ORDER BY start'; + + return $this->execQuery($query); + } } diff --git a/application/models/person/Person_model.php b/application/models/person/Person_model.php index 8875fd4c5..2063505bf 100644 --- a/application/models/person/Person_model.php +++ b/application/models/person/Person_model.php @@ -326,13 +326,28 @@ class Person_model extends DB_Model SELECT p2.person_id FROM tbl_person p1 + JOIN tbl_prestudent ps ON p1.person_id = ps.person_id INNER JOIN ( - SELECT vorname, nachname, gebdatum, person_id - FROM tbl_person - ) p2 + SELECT vorname, nachname, gebdatum, person.person_id + FROM tbl_person person + JOIN tbl_prestudent sps ON person.person_id = sps.person_id + ) p2 ON (lower(p1.vorname) = lower(p2.vorname) AND lower(p1.nachname) = lower(p2.nachname) AND p1.gebdatum = p2.gebdatum) WHERE p1.person_id != p2.person_id AND (p1.person_id = ?)"; return $this->execQuery($qry, array($person_id, $person_id, $person_id)); } + + public function loadPrestudent($prestudent_id) + { + $this->addSelect($this->dbTable . '.*'); + + $this->addJoin('public.tbl_prestudent p', 'person_id'); + + $this->addLimit(1); + + return $this->loadWhere([ + 'prestudent_id' => $prestudent_id + ]); + } } diff --git a/application/models/system/Fehlerkonfiguration_model.php b/application/models/system/Fehlerkonfiguration_model.php new file mode 100644 index 000000000..bf8de4cde --- /dev/null +++ b/application/models/system/Fehlerkonfiguration_model.php @@ -0,0 +1,48 @@ +dbTable = 'system.tbl_fehler_konfiguration'; + $this->pk = array('konfigurationstyp_kurzbz', 'fehlercode'); + $this->hasSequence = false; + } + + /** + * Retrieve all set configuration parameters, optionally filtered by app. + * @param string $app + * @return object success or error + */ + public function getKonfiguration($app = null) + { + $fehlerkonfiguration = array(); + + $this->addSelect('fehlercode, konfigurationstyp_kurzbz, konfiguration, fehler_kurzbz'); + $this->addJoin('system.tbl_fehler_konfigurationstyp konftyp', 'konfigurationstyp_kurzbz'); + $this->addJoin('system.tbl_fehler fehler', 'fehlercode'); + $fehlerkonfigurationRes = isset($app) ? $this->loadWhere(array('fehler.app' => $app)) : $this->load(); + + if (isError($fehlerkonfigurationRes)) return $fehlerkonfigurationRes; + + if (hasData($fehlerkonfigurationRes)) + { + $fehlerkonfigurationData = getData($fehlerkonfigurationRes); + foreach ($fehlerkonfigurationData as $fk) + { + $konf = json_decode($fk->konfiguration); + if (is_array($konf)) + { + $fk->konfiguration = $konf; + $fehlerkonfiguration[] = $fk; + } + } + } + + return success($fehlerkonfiguration); + } +} diff --git a/application/models/system/Fehlerkonfigurationstyp_model.php b/application/models/system/Fehlerkonfigurationstyp_model.php new file mode 100644 index 000000000..dc1c7957f --- /dev/null +++ b/application/models/system/Fehlerkonfigurationstyp_model.php @@ -0,0 +1,47 @@ +dbTable = 'system.tbl_fehler_konfigurationstyp'; + $this->pk = array('konfigurationstyp_kurzbz'); + } + + /** + * Retrieve all set configuration parameters, optionally filtered by app. + * @param string $app + * @return object success or error + */ + public function getKonfiguration($app = null) + { + $fehlerkonfiguration = array(); + + $this->addSelect('fehlercode, konfigurationstyp_kurzbz, konfiguration, fehler_kurzbz'); + $this->addJoin('system.tbl_fehler_konfigurationstyp konftyp', 'konfigurationstyp_kurzbz'); + $this->addJoin('system.tbl_fehler fehler', 'fehlercode'); + $fehlerkonfigurationRes = isset($app) ? $this->loadWhere(array('fehler.app' => $app)) : $this->load(); + + if (isError($fehlerkonfigurationRes)) return $fehlerkonfigurationRes; + + if (hasData($fehlerkonfigurationRes)) + { + $fehlerkonfigurationData = getData($fehlerkonfigurationRes); + foreach ($fehlerkonfigurationData as $fk) + { + $konf = json_decode($fk->konfiguration); + if (is_array($konf)) + { + $fk->konfiguration = $konf; + $fehlerkonfiguration[] = $fk; + } + } + } + + return success($fehlerkonfiguration); + } +} diff --git a/application/views/codex/uhstat1.php b/application/views/codex/uhstat1.php new file mode 100644 index 000000000..a09f9c70a --- /dev/null +++ b/application/views/codex/uhstat1.php @@ -0,0 +1,274 @@ +load->view( + 'templates/FHC-Header', + array( + 'title' => 'UHSTAT1Formular', + 'jquery3' => true, + 'bootstrap3' => true, + 'fontawesome4' => true, + 'phrases' => array( + 'ui' => array('speichern') + ), + 'customCSSs' => array('public/css/codex/uhstat1.css'), + 'customJSs' => array('public/js/codex/uhstat1.js') + ) +); +?> +mutter_geburtsjahr) ? $uhstatData->mutter_geburtsjahr : set_value('mutter_geburtsjahr'); +$mutter_geburtsstaat = isset($uhstatData->mutter_geburtsstaat) ? $uhstatData->mutter_geburtsstaat : set_value('mutter_geburtsstaat'); +$mutter_bildungsstaat = isset($uhstatData->mutter_bildungsstaat) ? $uhstatData->mutter_bildungsstaat : set_value('mutter_bildungsstaat'); +$mutter_bildungmax = isset($uhstatData->mutter_bildungmax) ? $uhstatData->mutter_bildungmax : set_value('mutter_bildungmax'); +$vater_geburtsjahr = isset($uhstatData->vater_geburtsjahr) ? $uhstatData->vater_geburtsjahr : set_value('vater_geburtsjahr'); +$vater_geburtsstaat = isset($uhstatData->vater_geburtsstaat) ? $uhstatData->vater_geburtsstaat : set_value('vater_geburtsstaat'); +$vater_bildungsstaat = isset($uhstatData->vater_bildungsstaat) ? $uhstatData->vater_bildungsstaat : set_value('vater_bildungsstaat'); +$vater_bildungmax = isset($uhstatData->vater_bildungmax) ? $uhstatData->vater_bildungmax : set_value('vater_bildungmax'); +$readOnly = isset($formMetaData['readOnly']); +$disabled = $readOnly ? ' disabled' : ''; +$editPermission = isset($formMetaData['editPermission']) && $formMetaData['editPermission'] === true; +$deletePermission = isset($formMetaData['deletePermission']) && $formMetaData['deletePermission'] === true; +$saved = isset($saved) && $saved === true; +?> + +
+

+ +

+
+ +

p->t('uhstat', 'uhstat1AnmeldungUeberschrift') ?>

+

+ p->t('uhstat', 'rechtsbelehrung') ?> +

+

+ p->t('uhstat', 'uhstat1AnmeldungEinleitungstext') ?> +

+
+ + +
+ + +
+ + +
+ + +
+ ' /> +
+ p->t('uhstat', 'angabenErziehungsberechtigte') ?> +

+ p->t('uhstat', 'angabenErziehungsberechtigteEinleitungstext') ?> +

+
+

p->t('uhstat', 'erziehungsberechtigtePersonEins') ?>

+
+ +
+ + +
+
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+

p->t('uhstat', 'erziehungsberechtigtePersonZwei') ?>

+
+ +
+ + +
+
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+ +
+
+
+
+ +
+
+
+ +
+ +
+ ' /> +
+
+ +
+
+
+ +
+
+ +load->view('templates/FHC-Footer'); ?> diff --git a/application/views/lehre/Antrag/Create.php b/application/views/lehre/Antrag/Create.php new file mode 100644 index 000000000..2c9d0d382 --- /dev/null +++ b/application/views/lehre/Antrag/Create.php @@ -0,0 +1,54 @@ + 'Antrag auf Änderung des Studierendenstatus', + 'cis' => true, + 'vue3' => true, + 'axios027' => true, + 'bootstrap5' => true, + 'fontawesome6' => true, + 'phrases' => array( + ), + 'customJSModules' => array('public/js/apps/lehre/Antrag.js'), + 'customCSSs' => array( + 'public/css/Fhc.css', + 'vendor/vuejs/vuedatepicker_css/main.css' + ), + 'customJSs' => array( + ) +); + +$this->load->view( + 'templates/FHC-Header', + $sitesettings +); +?> + +
+
+

p->t('studierendenantrag', 'antrag_header'); ?>

+
+ +
+
+ + +
+
+ + +
+
+
+ +load->view( + 'templates/FHC-Footer', + $sitesettings +); diff --git a/application/views/lehre/Antrag/Leitung/List.php b/application/views/lehre/Antrag/Leitung/List.php new file mode 100644 index 000000000..9c0749dae --- /dev/null +++ b/application/views/lehre/Antrag/Leitung/List.php @@ -0,0 +1,59 @@ + 'Anträge auf Änderung des Studierendenstatus', + 'cis' => true, + 'vue3' => true, + 'axios027' => true, + 'bootstrap5' => true, + 'tabulator5' => true, + 'fontawesome6' => true, + 'primevue3' => true, + 'phrases' => array( + 'global', + 'ui', + 'studierendenantrag', + 'lehre', + 'person', + ), + 'customJSModules' => array('public/js/apps/lehre/Antrag/Leitung.js'), + 'customCSSs' => array( + 'public/css/Fhc.css' + ), + 'customJSs' => array( + ) +); + +$this->load->view( + 'templates/FHC-Header', + $sitesettings +); +?> + +
+
+

p->t('studierendenantrag', 'antrag_header'); ?>

+
+ +
+
+ + + + +
+
+
+
+
+ +load->view( + 'templates/FHC-Footer', + $sitesettings +); diff --git a/application/views/lehre/Antrag/Student/List.php b/application/views/lehre/Antrag/Student/List.php new file mode 100644 index 000000000..4ca99f951 --- /dev/null +++ b/application/views/lehre/Antrag/Student/List.php @@ -0,0 +1,139 @@ + 'Antrag auf Änderung des Studierendenstatus', + 'cis' => true, + 'vue3' => true, + 'axios027' => true, + 'bootstrap5' => true, + 'fontawesome6' => true, + 'phrases' => array( + ), + 'customJSModules' => array('public/js/apps/lehre/Antrag/Student.js'), + 'customCSSs' => array( + 'public/css/Fhc.css' + ), + 'customJSs' => array( + ) +); + +$this->load->view( + 'templates/FHC-Header', + $sitesettings +); +?> + +
+ +
+

p->t('studierendenantrag', 'antrag_header'); ?>

+
+ +
+
+ + $array){ ?> +

()

+ + +
+

p->t('studierendenantrag', 'calltoaction_' . $type); ?>

+
+ + p->t('studierendenantrag', 'antrag_typ_' . $type); ?> + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#p->t('studierendenantrag', 'antrag_typ'); ?>p->t('studierendenantrag', 'antrag_status'); ?>p->t('studierendenantrag', 'antrag_studiensemester'); ?>p->t('studierendenantrag', 'antrag_erstelldatum'); ?>p->t('studierendenantrag', 'antrag_datum_wiedereinstieg'); ?>p->t('studierendenantrag', 'antrag_grund'); ?>p->t('studierendenantrag', 'antrag_dateianhaenge'); ?> 
studierendenantrag_id; ?>p->t('studierendenantrag', 'antrag_typ_' . $antrag->typ); ?>status_bezeichnung; ?>studiensemester_kurzbz; ?>datum))->format('d.m.Y'); ?>datum_wiedereinstieg ? (new DateTime($antrag->datum_wiedereinstieg))->format('d.m.Y') : ''; ?> + grund){ ?> + + p->t('studierendenantrag', 'antrag_grund'); ?> + + + + + + + dms_id) {?> + + p->t('studierendenantrag', 'antrag_anhang'); ?> + + + + + typ != Studierendenantrag_model::TYP_WIEDERHOLUNG && in_array($antrag->status, [ + Studierendenantragstatus_model::STATUS_APPROVED, + Studierendenantragstatus_model::STATUS_OBJECTED, + Studierendenantragstatus_model::STATUS_OBJECTION_DENIED, + Studierendenantragstatus_model::STATUS_REMINDERSENT + ])) { ?> + + + typ == Studierendenantrag_model::TYP_WIEDERHOLUNG && $antrag->status == Studierendenantragstatus_model::STATUS_APPROVED) { ?> + p->t('studierendenantrag', 'btn_show_lvs'); ?> + + p->t('studierendenantrag', 'my_lvs'); ?> + + +
+ + + + +
+
+
+
+
+ +load->view( + 'templates/FHC-Footer', + $sitesettings +); diff --git a/application/views/lehre/Antrag/Wiederholung/Student.php b/application/views/lehre/Antrag/Wiederholung/Student.php new file mode 100644 index 000000000..9c2db040e --- /dev/null +++ b/application/views/lehre/Antrag/Wiederholung/Student.php @@ -0,0 +1,41 @@ + 'Antrag Wiederholung vom Studium', + 'cis' => true, + 'vue3' => true, + 'axios027' => true, + 'bootstrap5' => true, + 'fontawesome6' => true, + 'tabulator5' => true, + 'phrases' => array( + 'ui', + 'lehre', + 'global' + ), + 'customJSModules' => array('public/js/apps/lehre/Antrag/Lvzuweisung.js'), + 'customCSSs' => array( + ), + 'customJSs' => array( + ) +); + +$this->load->view( + 'templates/FHC-Header', + $sitesettings +); +?> + +
+
+

p->t('studierendenantrag', 'title_lvzuweisen', ['name' => $antrag->name]);?>

+
+
+ status != Studierendenantragstatus_model::STATUS_CREATED && $antrag->status != Studierendenantragstatus_model::STATUS_LVSASSIGNED) ? ' disabled' : ''; ?>> +
+
+ +load->view( + 'templates/FHC-Footer', + $sitesettings +); diff --git a/application/views/lehre/Antrag/Wiederholung/getLvs.rdf.php b/application/views/lehre/Antrag/Wiederholung/getLvs.rdf.php new file mode 100644 index 000000000..24eb1e23f --- /dev/null +++ b/application/views/lehre/Antrag/Wiederholung/getLvs.rdf.php @@ -0,0 +1,31 @@ + + + + + + freigabedatum); ?> + insertamum); ?> + + + studierendenantrag_lehrveranstaltung_id; ?>]]> + lehrveranstaltung_id; ?>]]> + prestudent_id; ?>]]> + insertvon; ?>]]> + studiensemester_kurzbz; ?>]]> + note; ?>]]> + format('c'); ?>]]> + format('d.m.Y'); ?>]]> + format('c'); ?>]]> + format('d.m.Y'); ?>]]> + note_bezeichnung; ?>]]> + lv_bezeichnung; ?>]]> + stg_bezeichnung; ?>]]> + + + + + + diff --git a/application/views/lehre/Antrag/Wiederholung/moveLvs.rdf.php b/application/views/lehre/Antrag/Wiederholung/moveLvs.rdf.php new file mode 100644 index 000000000..4ed31218d --- /dev/null +++ b/application/views/lehre/Antrag/Wiederholung/moveLvs.rdf.php @@ -0,0 +1,17 @@ + + + + + + + ]]> + + + + + + diff --git a/application/views/lehre/anrechnung/adminAnrechnung.php b/application/views/lehre/anrechnung/adminAnrechnung.php new file mode 100644 index 000000000..cb9a55c18 --- /dev/null +++ b/application/views/lehre/anrechnung/adminAnrechnung.php @@ -0,0 +1,137 @@ + $this->p->t('anrechnung', 'anrechnungenVerwalten'), + 'jquery3' => true, + 'jqueryui1' => true, + 'bootstrap3' => true, + 'fontawesome6' => true, + 'ajaxlib' => true, + 'dialoglib' => true, + 'tabulator4' => true, + 'tablewidget' => true, + 'sbadmintemplate3' => true, + 'navigationwidget' => true, + 'phrases' => array( + 'anrechnung' => array( + 'anrechnungenVerwalten', + 'anrechnungszeitraumFestlegen', + 'anrechnungszeitraumHinzufuegen', + 'anrechnungszeitraumSpeichern', + 'anrechnungszeitraumStart', + 'anrechnungszeitraumEnde' + ), + 'ui' => array( + 'aktion', + 'geloescht', + 'gespeichert', + 'frageSicherLoeschen', + 'spaltenEinstellen' + ), + 'lehre' => array('studiensemester'), + 'table' => array( + 'spaltenEinAusblenden', + 'spaltenEinAusblendenMitKlickOeffnen', + 'spaltenEinAusblendenAufEinstellungenKlicken', + 'spaltenEinAusblendenMitKlickAktivieren', + 'spaltenEinAusblendenMitKlickSchliessen', + 'spaltenbreiteVeraendern', + 'spaltenbreiteVeraendernText', + 'spaltenbreiteVeraendernInfotext', + 'zeilenAuswaehlen', + 'zeilenAuswaehlenEinzeln', + 'zeilenAuswaehlenBereich', + 'zeilenAuswaehlenAlle' + ) + ), + 'customJSs' => array( + 'public/js/bootstrapper.js', + 'public/js/lehre/anrechnung/adminAnrechnung.js' + ), + 'customCSSs' => array( + 'public/css/sbadmin2/tablesort_bootstrap.css' + ) +); + +$this->load->view('templates/FHC-Header', $includesArray); +?> + +
+ + widgetlib->widget('NavigationWidget'); ?> + +
+
+ + +
+ + +

p->t('anrechnung', 'anrechnungszeitraumFestlegen'); ?>


+ +
+
+ +
+
+ + +
+
+ load->view('lehre/anrechnung/adminAnrechnungData.php'); ?> +
+
+ + + + +
+
+
+ +load->view('templates/FHC-Footer', $includesArray); ?> + diff --git a/application/views/lehre/anrechnung/adminAnrechnungData.php b/application/views/lehre/anrechnung/adminAnrechnungData.php new file mode 100644 index 000000000..652c349d8 --- /dev/null +++ b/application/views/lehre/anrechnung/adminAnrechnungData.php @@ -0,0 +1,45 @@ + $query, + 'tableUniqueId' => 'adminAnrechnung', + 'requiredPermissions' => 'lehre/anrechnungszeitfenster', + 'datasetRepresentation' => 'tabulator', + 'columnsAliases' => array( + 'AzrID', + ucfirst($this->p->t('lehre', 'studiensemester')), + ucfirst($this->p->t('anrechnung', 'anrechnungszeitraumStart')), + ucfirst($this->p->t('anrechnung', 'anrechnungszeitraumEnde')), + ucfirst($this->p->t('ui', 'bearbeitetAm')), + ucfirst($this->p->t('ui', 'bearbeitetVon')), + ), + 'datasetRepOptions' => '{ + height: func_height(this), + layout: "fitDataFill", + persistentLayout:true, + autoResize: false, // prevent auto resizing of table (false to allow adapting table size when cols are (de-)activated + headerFilterPlaceholder: " ", + index: "anrechnungszeitraum_id", // assign specific column as unique id (important for row indexing) + selectable: false, // allow row selection + tableWidgetHeader: true, + tableBuilt: function(){ + func_tableBuilt(this); + }, + }', + 'datasetRepFieldsDefs' => '{ + anrechnungszeitraum_id: {visible: false, headerFilter:"input"}, + studiensemester_kurzbz: {headerFilter:"input"}, + anrechnungstart: {headerFilter:"input", formatter: formatDate}, + anrechnungende: {headerFilter:"input", formatter: formatDate}, + insertamum: {visible: false, headerFilter:"input"}, + insertvon: {visible: false, headerFilter:"input"} + }' +); + +echo $this->widgetlib->widget('TableWidget', $filterWidgetArray); \ No newline at end of file diff --git a/application/views/lehre/anrechnung/approveAnrechnungDetail.php b/application/views/lehre/anrechnung/approveAnrechnungDetail.php index bc3b6215a..0970b6edd 100644 --- a/application/views/lehre/anrechnung/approveAnrechnungDetail.php +++ b/application/views/lehre/anrechnung/approveAnrechnungDetail.php @@ -23,6 +23,7 @@ $this->load->view( 'systemfehler', 'bitteMindEinenAntragWaehlen', 'bitteBegruendungAngeben', + 'bitteBegruendungVervollstaendigen', 'empfehlungWurdeAngefordert', 'anrechnungenWurdenGenehmigt', 'anrechnungenWurdenAbgelehnt', @@ -91,85 +92,93 @@ $this->load->view(
-
+
- + - + - + - + - + - - -
p->t('person', 'studentIn')); ?>p->t('person', 'studentIn')); ?> vorname . ' ' . $antragData->nachname; ?>
p->t('person', 'personenkennzeichen'); ?>p->t('person', 'personenkennzeichen'); ?> matrikelnr ?>
p->t('lehre', 'studiensemester')); ?>p->t('lehre', 'studiensemester')); ?> studiensemester_kurzbz ?>
p->t('lehre', 'studiengang')); ?>p->t('lehre', 'studiengang')); ?> stg_bezeichnung ?>
p->t('lehre', 'lehrveranstaltung'); ?>p->t('lehre', 'lehrveranstaltung'); ?> lv_bezeichnung ?>
-
-
- - - - - - - - + + + + + + + + - + + +
p->t('lehre', 'ects'); ?>ects ?>
- p->t('anrechnung', 'bisherAngerechneteEcts'); ?> + p->t('lehre', 'lektorInnen'); ?> + lektoren) - 1 ?> + lektoren as $key => $lektor): ?> + vorname . ' ' . $lektor->nachname; + echo $key === $len ? '' : ', ' ?> + +
p->t('lehre', 'ects'); ?>ects ?>
+ p->t('anrechnung', 'bisherAngerechneteEcts'); ?> + Total: sumEctsSchulisch + $antragData->sumEctsBeruflich, 1) ?> [Schulisch: sumEctsSchulisch ?> / Beruflich: sumEctsBeruflich ?> ] - +
+
+
+ + + - - - - - - + + - + - - + + + + + + + + +
p->t('lehre', 'lektorInnen'); ?> - lektoren) - 1 ?> - lektoren as $key => $lektor): ?> - vorname . ' ' . $lektor->nachname; - echo $key === $len ? '' : ', ' ?> - -
p->t('global', 'zgv')); ?>zgv ?>p->t('global', 'zgv')); ?>zgv ?>
p->t('anrechnung', 'herkunftDerKenntnisse'); ?>anmerkung ?>anmerkung ?>
p->t('anrechnung', 'nachweisdokumente'); ?> + dokumentname) ?>
p->t('global', 'begruendung'); ?>begruendung ?>begruendung ?>
p->t('anrechnung', 'begruendungEctsLabel'); ?>begruendung_ects ?>
p->t('anrechnung', 'begruendungLvinhaltLabel'); ?>begruendung_lvinhalt ?>
@@ -322,14 +331,6 @@ $this->load->view( -
  • - p->t('anrechnung', 'genehmigungNegativKenntnisseNichtGleichwertig'); ?> - - - -
  • p->t('anrechnung', 'genehmigungNegativEctsHoechstgrenzeUeberschritten'); ?> load->view(
  • +
  • + p->t('anrechnung', 'genehmigungNegativKenntnisseNichtGleichwertigWeil'); ?> + + + +
  • p->t('anrechnung', 'genehmigungNegativEmpfehlungstextUebernehmen'); ?> load->view(
  • +
  • + p->t('anrechnung', 'andereBegruendung'); ?> +
  • + p->t('ui', 'maxZeichen'); ?> : +
    +
    +
    +
    + +
    +
    +
    +
    + p->t('anrechnung', 'begruendungLvinhalt'); ?>  + + + +
    +
    + +  / p->t('ui', 'maxZeichen'); ?> : + p->t('ui', 'fehlendeMinZeichen'); ?> : +
    +
    +
    +
    @@ -242,8 +285,8 @@ $this->load->view(
    - p->t('ui', 'maxZeichen'); ?> : + maxlength="" required>anmerkung; ?> + p->t('ui', 'maxZeichen'); ?> :
    diff --git a/application/views/lehre/anrechnung/requestAnrechnungImportant.php b/application/views/lehre/anrechnung/requestAnrechnungImportant.php index d157b22c2..8cacb9c26 100644 --- a/application/views/lehre/anrechnung/requestAnrechnungImportant.php +++ b/application/views/lehre/anrechnung/requestAnrechnungImportant.php @@ -16,6 +16,23 @@ + +
    + +
    +
    + p->t('anrechnung', 'requestAnrechnungInfoEctsBerechnungBody'); ?> +
    +
    +
    -
    +
    - + - + - + - + - + - -
    p->t('person', 'studentIn')); ?>p->t('person', 'studentIn')); ?> vorname . ' ' . $antragData->nachname; ?>
    p->t('person', 'personenkennzeichen'); ?>p->t('person', 'personenkennzeichen'); ?> matrikelnr ?>
    p->t('lehre', 'studiensemester')); ?>p->t('lehre', 'studiensemester')); ?> studiensemester_kurzbz ?>
    p->t('lehre', 'studiengang')); ?>p->t('lehre', 'studiengang')); ?> stg_bezeichnung ?>
    p->t('lehre', 'lehrveranstaltung'); ?>p->t('lehre', 'lehrveranstaltung'); ?> lv_bezeichnung ?>
    -
    -
    - - - - - - - - - + + + + + + - + + + +
    p->t('lehre', 'ects'); ?>ects ?>
    p->t('lehre', 'lektorInnen'); ?> +
    p->t('lehre', 'ects'); ?>ects ?>
    p->t('lehre', 'lektorInnen'); ?> lektoren) - 1 ?> lektoren as $key => $lektor): ?> vorname . ' ' . $lektor->nachname; echo $key === $len ? '' : ', ' ?> -
    +
    +
    + + + @@ -141,6 +143,14 @@ $this->load->view( target="_blank">dokumentname) ?> + + + + + + + +
    p->t('global', 'zgv')); ?> zgv ?>
    p->t('anrechnung', 'begruendungEctsLabel'); ?>begruendung_ects ?>
    p->t('anrechnung', 'begruendungLvinhaltLabel'); ?>begruendung_lvinhalt ?>
    @@ -234,13 +244,16 @@ $this->load->view(
  • - p->t('anrechnung', 'empfehlungNegativKenntnisseNichtGleichwertig'); ?>  + p->t('anrechnung', 'empfehlungNegativKenntnisseNichtGleichwertigWeil'); ?>
  • +
  • + p->t('anrechnung', 'andereBegruendung'); ?> +
  • +
    +
    +
    + + + 19 ? 19 : count($variables); + echo $this->widgetlib->widget( + 'MultipleDropdown_widget', + array('elements' => success($variables)), + array( + 'name' => 'variables[]', + 'id' => 'variables', + 'size' => $size, + 'multiple' => true + ) + ); + ?> +
    +
    +
    + + + 5 ? 5 : count($user_fields); + echo $this->widgetlib->widget( + 'MultipleDropdown_widget', + array('elements' => success($user_fields)), + array( + 'name' => 'user_fields[]', + 'id' => 'user_fields', + 'size' => $size, + 'multiple' => true + ) + ); + ?> +
    +
    +
    +
    +
    +
    + + widgetlib->widget( + 'Vorlage_widget', + array('oe_kurzbz' => $organisationUnits, 'isAdmin' => $senderIsAdmin), + array('name' => 'vorlage', 'id' => 'vorlageDnD') + ); + ?> + +
    +
    + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    + widgetlib->widget( + 'Dropdown_widget', + array( + 'elements' => success($recipientsArray), + 'emptyElement' => ucfirst($this->p->t('global', 'empfaenger')).'...' + ), + array( + 'name' => 'recipients[]', + 'id' => 'recipients' + ) + ); + ?> + + + p->t('ui', 'refresh')); ?> + + +
    +
    +
    +
    +
    + +
    + + + + + + +
    +
    +
    + + +load->view("templates/FHC-Footer"); ?> + diff --git a/application/views/system/messages/ajaxRead.php b/application/views/system/messages/ajaxRead.php index 2cb88708e..4c1a77deb 100644 --- a/application/views/system/messages/ajaxRead.php +++ b/application/views/system/messages/ajaxRead.php @@ -12,7 +12,7 @@ 'tabulator4' => true, 'ajaxlib' => true, 'dialoglib' => true, - 'tinymce4' => true, + 'tinymce5' => true, 'phrases' => array('global', 'ui'), 'customCSSs' => array('public/css/sbadmin2/admintemplate_contentonly.css', 'public/css/messaging/message.css'), 'customJSs' => array('public/js/bootstrapper.js', 'public/js/messaging/read.js') diff --git a/application/views/system/messages/ajaxWrite.php b/application/views/system/messages/ajaxWrite.php index 3b1582f22..b3a598506 100644 --- a/application/views/system/messages/ajaxWrite.php +++ b/application/views/system/messages/ajaxWrite.php @@ -10,7 +10,7 @@ 'sbadmintemplate3' => true, 'ajaxlib' => true, 'dialoglib' => true, - 'tinymce4' => true, + 'tinymce5' => true, 'phrases' => array('global', 'ui'), 'customCSSs' => array('public/css/sbadmin2/admintemplate_contentonly.css', 'public/css/messaging/message.css'), 'customJSs' => array('public/js/bootstrapper.js', 'public/js/messaging/write.js') diff --git a/application/views/system/messages/ajaxWriteReply.php b/application/views/system/messages/ajaxWriteReply.php index 0a496c93e..08dc188fa 100644 --- a/application/views/system/messages/ajaxWriteReply.php +++ b/application/views/system/messages/ajaxWriteReply.php @@ -10,7 +10,7 @@ 'sbadmintemplate3' => true, 'ajaxlib' => true, 'dialoglib' => true, - 'tinymce4' => true, + 'tinymce5' => true, 'phrases' => array('global', 'ui'), 'customCSSs' => array('public/css/sbadmin2/admintemplate_contentonly.css', 'public/css/messaging/message.css'), 'customJSs' => array('public/js/bootstrapper.js', 'public/js/messaging/writeReply.js') diff --git a/application/views/system/messages/htmlWriteReply.php b/application/views/system/messages/htmlWriteReply.php index 9106d802b..d2150c1fb 100644 --- a/application/views/system/messages/htmlWriteReply.php +++ b/application/views/system/messages/htmlWriteReply.php @@ -6,7 +6,7 @@ 'jquery3' => true, 'bootstrap3' => true, 'fontawesome4' => true, - 'tinymce4' => true, + 'tinymce5' => true, 'sbadmintemplate3' => true, 'customCSSs' => array('public/css/sbadmin2/admintemplate_contentonly.css', 'public/css/messaging/message.css'), 'customJSs' => array('public/js/bootstrapper.js', 'public/js/messaging/messageWriteReply.js') diff --git a/application/views/system/messages/htmlWriteTemplate.php b/application/views/system/messages/htmlWriteTemplate.php index 761e05f96..42a31f374 100644 --- a/application/views/system/messages/htmlWriteTemplate.php +++ b/application/views/system/messages/htmlWriteTemplate.php @@ -8,7 +8,7 @@ 'bootstrap3' => true, 'ajaxlib' => true, 'fontawesome4' => true, - 'tinymce4' => true, + 'tinymce5' => true, 'sbadmintemplate3' => true, 'dialoglib' => true, 'widgets' => true, diff --git a/application/views/system/vorlage/templatetextEdit.php b/application/views/system/vorlage/templatetextEdit.php index 42efc1519..cc2487959 100644 --- a/application/views/system/vorlage/templatetextEdit.php +++ b/application/views/system/vorlage/templatetextEdit.php @@ -1,5 +1,5 @@ load->view('templates/header', array('title' => 'VorlageEdit', 'tinymce4' => true, 'jsonforms' => true)); + $this->load->view('templates/header', array('title' => 'VorlageEdit', 'tinymce5' => true, 'jsonforms' => true)); ?>
    diff --git a/application/views/templates/FHC-Common.php b/application/views/templates/FHC-Common.php index dd1d8ae1c..072ff1d7f 100644 --- a/application/views/templates/FHC-Common.php +++ b/application/views/templates/FHC-Common.php @@ -23,7 +23,7 @@ $tablesorter2 = isset($tablesorter2) ? $tablesorter2 : false; $tabulator4 = isset($tabulator4) ? $tabulator4 : false; $tabulator5 = isset($tabulator5) ? $tabulator5 : false; - $tinymce4 = isset($tinymce4) ? $tinymce4 : false; + $tinymce3 = isset($tinymce3) ? $tinymce3 : false; $tinymce5 = isset($tinymce5) ? $tinymce5 : false; $vue3 = isset($vue3) ? $vue3 : false; $primevue3 = isset($primevue3) ? $primevue3 : false; @@ -34,6 +34,7 @@ // Internal resources $ajaxlib = isset($ajaxlib) ? $ajaxlib : false; $bootstrapper = isset($bootstrapper) ? $bootstrapper : false; + $cis = isset($cis) ? $cis : false; $dialoglib = isset($dialoglib) ? $dialoglib : false; $filtercomponent = isset($filtercomponent) ? $filtercomponent : false; $filterwidget = isset($filterwidget) ? $filterwidget : false; @@ -43,4 +44,3 @@ $tablewidget = isset($tablewidget) ? $tablewidget : false; $udfs = isset($udfs) ? $udfs : false; $widgets = isset($widgets) ? $widgets : false; - diff --git a/application/views/templates/FHC-Footer.php b/application/views/templates/FHC-Footer.php index 0c3782fea..75b727f38 100644 --- a/application/views/templates/FHC-Footer.php +++ b/application/views/templates/FHC-Footer.php @@ -60,7 +60,7 @@ if ($bootstrap3 === true) generateJSsInclude('vendor/twbs/bootstrap3/dist/js/bootstrap.min.js'); // Bootstrap 5 JS - if ($bootstrap5 === true) generateJSsInclude('vendor/twbs/bootstrap5/dist/js/bootstrap.min.js'); + if ($bootstrap5 === true) generateJSsInclude('vendor/twbs/bootstrap5/dist/js/bootstrap.bundle.min.js'); // Moment JS if ($momentjs2 === true) @@ -100,14 +100,14 @@ // Tabulator 5 JS if ($tabulator5 === true) generateJSsInclude('vendor/olifolkerd/tabulator5/dist/js/tabulator.min.js'); - // Tinymce 4 JS - if ($tinymce4 === true) generateJSsInclude('vendor/tinymce/tinymce4/tinymce.min.js'); + // Tinymce 3 JS + if ($tinymce3 === true) generateJSsInclude('include/tiny_mce/tiny_mce.js'); // Tinymce 5 JS if ($tinymce5 === true) generateJSsInclude('vendor/tinymce/tinymce5/tinymce.min.js'); // Vue 3 JS - if ($vue3 === true) + if ($vue3 === true) { generateJSsInclude('vendor/vuejs/vuejs3/vue.global.prod.js'); generateJSsInclude('vendor/vuejs/vuerouter4/vue-router.global.js'); @@ -122,6 +122,7 @@ generateJSsInclude('vendor/npm-asset/primevue/column/column.min.js'); generateJSsInclude('vendor/npm-asset/primevue/calendar/calendar.min.js'); generateJSsInclude('vendor/npm-asset/primevue/skeleton/skeleton.min.js'); + generateJSsInclude('vendor/npm-asset/primevue/autocomplete/autocomplete.min.js'); } // -------------------------------------------------------------------------------------------------------- diff --git a/application/views/templates/FHC-Header.php b/application/views/templates/FHC-Header.php index aa63541c5..ed9fa97b9 100644 --- a/application/views/templates/FHC-Header.php +++ b/application/views/templates/FHC-Header.php @@ -77,10 +77,7 @@ } // Tabulator 5 CSS - if ($tabulator5 === true) generateCSSsInclude('vendor/olifolkerd/tabulator5/dist/css/tabulator_bootstrap5.min.css'); - - // Tinymce 4 CSS - if ($tinymce4 === true) generateCSSsInclude('public/css/TinyMCE4.css'); + if ($tabulator5 === true) generateCSSsInclude('public/css/Tabulator5.css'); // Tinymce 5 CSS if ($tinymce5 === true) generateCSSsInclude('public/css/TinyMCE5.css'); @@ -118,6 +115,9 @@ // HTML Widget CSS if ($widgets === true) generateCSSsInclude('public/css/Widgets.css'); + // CIS + if ($cis === true) generateCSSsInclude('public/css/cis_bs5.css'); + // Eventually required CSS generateCSSsInclude($customCSSs); // Eventually required CSS ?> diff --git a/application/views/templates/header.php b/application/views/templates/header.php index 637eb3c7a..e75acca4f 100644 --- a/application/views/templates/header.php +++ b/application/views/templates/header.php @@ -95,7 +95,7 @@ if($jqueryV1 && $jqueryV2) show_error("Two JQuery versions used: composer and in - + diff --git a/application/views/widgets/tinymce.php b/application/views/widgets/tinymce.php index 3e2093e55..618cb4836 100644 --- a/application/views/widgets/tinymce.php +++ b/application/views/widgets/tinymce.php @@ -5,5 +5,6 @@ plugins: [], toolbar: "" }); - - < name="" style="">> + +< name="" style="">> + diff --git a/cis/private/lehre/abgabe_lektor_details.php b/cis/private/lehre/abgabe_lektor_details.php index e3bf5c40d..a8705e7f9 100644 --- a/cis/private/lehre/abgabe_lektor_details.php +++ b/cis/private/lehre/abgabe_lektor_details.php @@ -37,6 +37,7 @@ require_once('../../../include/phrasen.class.php'); require_once('../../../include/projektarbeit.class.php'); require_once('../../../include/projektbetreuer.class.php'); require_once('../../../include/sancho.inc.php'); +require_once('../../../application/libraries/SignatureLib.php'); if (!$db = new basis_db()) $db=false; @@ -590,7 +591,9 @@ while ($row=@$db->db_fetch_object($result)) $htmlstr .= "\n"; $htmlstr .= "\n"; $htmlstr .= "\n"; - if(!$row->abgabedatum) + + $uploadedDocumentSigned = null; + if (!$row->abgabedatum) { if ($row->datumdb_fetch_object($result)) $fcol='#000000'; } } - //$htmlstr .= "fixtermin=='t'?'checked=\"checked\"':'')." >"; - //$htmlstr .= "fixtermin=='t'?'checked="checked" style="background-color:#FF0000;"':'')." disabled>"; + if($row->fixtermin=='t') { $htmlstr .= "J"; @@ -659,11 +661,12 @@ while ($row=@$db->db_fetch_object($result)) $htmlstr .= " \n"; $htmlstr .= " \n"; $htmlstr .= " ".($row->abgabedatum==''?' ':$datum_obj->formatDatum($row->abgabedatum,'d.m.Y'))."\n"; - if($user==$row->insertvon && $betreuerart!="Zweitbegutachter") + + if ($user==$row->insertvon && $betreuerart!="Zweitbegutachter") { $htmlstr .= " "; - if(!$row->abgabedatum) + if (!$row->abgabedatum) { $htmlstr .= " "; } @@ -692,6 +695,60 @@ while ($row=@$db->db_fetch_object($result)) { $htmlstr .= "     "; } + + if (file_exists(PAABGABE_PATH.$row->paabgabe_id.'_'.$uid.'.pdf')) + { + $signaturVorhanden = false; + if ($row->paabgabetyp_kurzbz == 'end') + { + if(defined('ABGABETOOL_CHECK_SIGNATURE') && ABGABETOOL_CHECK_SIGNATURE) + { + // Check if the document is signed + $signList = SignatureLib::list(PAABGABE_PATH.$row->paabgabe_id.'_'.$uid.'.pdf'); + if (is_array($signList) && count($signList) > 0) + { + $signaturVorhanden = true; + // The document is signed + } + elseif (isset($signList->code) && $signList->code == 1) + { + $uploadedDocumentSigned = $p->t('abgabetool/uploaddDocumentToBigForSignature'); + } + elseif ($signList === null) + { + $uploadedDocumentSigned = 'WARNING: signature server error'; + } + else + { + $uploadedDocumentSigned = $p->t('abgabetool/uploadedDocumentNotSigned'); + } + } + } + if ($uploadedDocumentSigned != null) + { + $htmlstr .= ' + +
    + '.$uploadedDocumentSigned.' +
    + '; + } + elseif($signaturVorhanden) + { + $htmlstr .= ' + +
    + '.$p->t('abgabetool/uploadedDocumentSigned').' +
    + '; + } + } + else + { + $htmlstr .= "     "; + } + + $htmlstr .= " \n"; @@ -710,7 +767,7 @@ $htmlstr .= ''."\n"; //$htmlstr .= ""; $htmlstr .= "  "; -$htmlstr .= " \n"; +$htmlstr .= " \n"; $htmlstr .= " - '.$p->t('abgabetool/kontrollierteSchlagwoerter').':* + '.$p->t('abgabetool/kontrollierteSchlagwoerter').': - '.$p->t('abgabetool/deutscheSchlagwoerter').': + '.$p->t('abgabetool/deutscheSchlagwoerter').':* - '.$p->t('abgabetool/englischeSchlagwoerter').': + '.$p->t('abgabetool/englischeSchlagwoerter').':* diff --git a/cis/private/lehre/abgabe_student.php b/cis/private/lehre/abgabe_student.php index e2da3f2cb..9b3cec6f6 100644 --- a/cis/private/lehre/abgabe_student.php +++ b/cis/private/lehre/abgabe_student.php @@ -108,7 +108,8 @@ $sql_query = "SELECT (SELECT nachname FROM public.tbl_person WHERE person_id=tb lehre.tbl_projektbetreuer.note as note, public.tbl_benutzer.aktiv as aktiv, (SELECT abgeschicktvon FROM extension.tbl_projektarbeitsbeurteilung WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id AND betreuer_person_id = tbl_projektbetreuer.person_id) AS babgeschickt, - (SELECT abgeschicktvon FROM extension.tbl_projektarbeitsbeurteilung WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter') LIMIT 1) AS zweitbetreuer_abgeschickt + (SELECT abgeschicktvon FROM extension.tbl_projektarbeitsbeurteilung WHERE projektarbeit_id = tbl_projektarbeit.projektarbeit_id AND betreuerart_kurzbz IN ('Zweitbetreuer', 'Zweitbegutachter') LIMIT 1) AS zweitbetreuer_abgeschickt, + (SELECT datum FROM campus.tbl_paabgabe WHERE paabgabetyp_kurzbz = 'end' AND abgabedatum IS NOT NULL AND projektarbeit_id = tbl_projektarbeit.projektarbeit_id LIMIT 1) AS abgegeben FROM lehre.tbl_projektarbeit LEFT JOIN lehre.tbl_projektbetreuer USING(projektarbeit_id) LEFT JOIN public.tbl_benutzer ON(uid=student_uid) @@ -204,11 +205,15 @@ else $htmlstr .= "".$p->t('abgabetool/projektbeurteilungZweitDownload').""; $htmlstr .= ""; - } else - { - $htmlstr .= "".$row->note.""; } - + elseif (!is_null($row->abgegeben)) + { + $htmlstr .= "".$p->t('abgabetool/abgegeben').""; + } + else + { + $htmlstr .= "-"; + } $htmlstr .= " ".$row->studiensemester_kurzbz."\n"; $htmlstr .= " ".strtoupper($row->typ.$row->kurzbz)."\n"; diff --git a/cis/private/lehre/abgabe_student_details.php b/cis/private/lehre/abgabe_student_details.php index 522e89dd3..9171a978c 100644 --- a/cis/private/lehre/abgabe_student_details.php +++ b/cis/private/lehre/abgabe_student_details.php @@ -36,6 +36,7 @@ require_once('../../../include/phrasen.class.php'); require_once('../../../include/projektarbeit.class.php'); require_once('../../../include/projektbetreuer.class.php'); require_once('../../../include/sancho.inc.php'); +require_once('../../../application/libraries/SignatureLib.php'); $anzeigesprache = getSprache(); $p = new phrasen($anzeigesprache); @@ -63,7 +64,6 @@ if(!isset($_POST['uid'])) $fixtermin = false; $datum = '01.01.1980'; $kurzbz = ''; - $kontrollschlagwoerter = ''; $schlagwoerter = ''; $schlagwoerter_en = ''; $abstract = ''; @@ -87,12 +87,12 @@ else $kurzbz = (isset($_POST['kurzbz'])?$_POST['kurzbz']:''); $betreuer = (isset($_POST['betreuer'])?$_POST['betreuer']:'-1'); $sprache = (isset($_POST['sprache'])?$_POST['sprache']:'German'); - $kontrollschlagwoerter = (isset($_POST['kontrollschlagwoerter'])?$_POST['kontrollschlagwoerter']:'-1'); $schlagwoerter = (isset($_POST['schlagwoerter'])?$_POST['schlagwoerter']:'-1'); $schlagwoerter_en = (isset($_POST['schlagwoerter_en'])?$_POST['schlagwoerter_en']:'-1'); $abstract = (isset($_POST['abstract'])?$_POST['abstract']:'-1'); $abstract_en = (isset($_POST['abstract_en'])?$_POST['abstract_en']:'-1'); $seitenanzahl = (isset($_POST['seitenanzahl'])?$_POST['seitenanzahl']:'-1'); + $signaturVorhanden = (isset($_POST['signaturVorhanden']) && $_POST['signaturVorhanden']=='true'?true:false); } $user = get_uid(); @@ -111,6 +111,7 @@ $titel = $projektarbeit_obj->titel; $person = new person(); $person->load($bid); $betreuer = $person->titelpre.' '.$person->vorname.' '.$person->nachname.' '.$person->titelpost; +$uploadedDocumentSigned = null; if($uid!=$user) { @@ -208,23 +209,7 @@ if($command=='add') { //zusätzliche Daten bearbeiten //Check der Eingabedaten - if(strlen($kontrollschlagwoerter)<1) - { - $error=true; - } - if(mb_strlen($kontrollschlagwoerter)>=150) - { - $kontrollschlagwoerter = mb_substr($kontrollschlagwoerter, 0, 146).'...'; - } - if(strlen($abstract)<1) - { - $error=true; - } - if(strlen($abstract_en)<1) - { - $error=true; - } - if($seitenanzahl<1) + if((strlen($schlagwoerter) < 1) || (strlen($schlagwoerter_en) < 1) || (strlen($abstract) < 1) || (strlen($abstract_en) < 1) || ($seitenanzahl < 1)) { $error=true; } @@ -234,7 +219,6 @@ if($command=='add') seitenanzahl = ".$db->db_add_param($seitenanzahl).", abgabedatum = now(), sprache = ".$db->db_add_param($sprache).", - kontrollschlagwoerter = ".$db->db_add_param($kontrollschlagwoerter).", schlagwoerter_en = ".$db->db_add_param($schlagwoerter_en).", schlagwoerter = ".$db->db_add_param($schlagwoerter).", abstract = ".$db->db_add_param($abstract).", @@ -258,6 +242,35 @@ if($command=='add') echo "".$p->t('global/fehleraufgetreten')."
     "; $command=''; } + + if ($signaturVorhanden === false) + { + // Mail an Studiengang wenn keine Signatur gefunden wurde + $student = new student(); + if(!$student->load($projektarbeit_obj->student_uid)) + die($p->t('global/userNichtGefunden')); + + $stg_obj = new studiengang(); + if(!$stg_obj->load($student->studiengang_kz)) + die($p->t('global/fehlerBeimLesenAusDatenbank')); + + $subject = 'Abgabe ohne Signatur'; + $tomail = $stg_obj->email; + $data = array( + 'vorname' => $student->vorname, + 'nachname' => $student->nachname, + 'studiengang' => $stg_obj->bezeichnung + ); + + $mailres = sendSanchoMail( + 'ParbeitsbeurteilungSiganturFehlt', + $data, + $tomail, + $subject, + 'sancho_header_min_bw.jpg', + 'sancho_footer_min_bw.jpg' + ); + } } else { @@ -280,11 +293,11 @@ if($command=="update" && $error!=true) $extensions = explode(".", $_FILES['datei']['name']); if(strtoupper(end($extensions))=='PDF') { - if($paabgabetyp_kurzbz!='end') + if ($paabgabetyp_kurzbz != 'end') { //"normaler" Upload move_uploaded_file($_FILES['datei']['tmp_name'], PAABGABE_PATH.$paabgabe_id.'_'.$uid.'.pdf'); - if(file_exists(PAABGABE_PATH.$paabgabe_id.'_'.$uid.'.pdf')) + if (file_exists(PAABGABE_PATH.$paabgabe_id.'_'.$uid.'.pdf')) { exec('chmod 640 "'.PAABGABE_PATH.$paabgabe_id.'_'.$uid.'.pdf'.'"'); @@ -299,18 +312,40 @@ if($command=="update" && $error!=true) else { echo $p->t('global/dateiNichtErfolgreichHochgeladen'); - } + }$htmlstr .= ''."\n"; } - else + else // endupload type { //Upload der Endabgabe - Eingabe der Zusatzdaten $command='add'; - if(!$error) + if (!$error) { move_uploaded_file($_FILES['datei']['tmp_name'], PAABGABE_PATH.$paabgabe_id.'_'.$uid.'.pdf'); } - if(file_exists(PAABGABE_PATH.$paabgabe_id.'_'.$uid.'.pdf')) + + $signaturVorhanden = true; + + if (file_exists(PAABGABE_PATH.$paabgabe_id.'_'.$uid.'.pdf')) { + if(defined('ABGABETOOL_CHECK_SIGNATURE') && ABGABETOOL_CHECK_SIGNATURE) + { + // Check if the document is signed + $signList = SignatureLib::list(PAABGABE_PATH.$paabgabe_id.'_'.$uid.'.pdf'); + if (is_array($signList) && count($signList) > 0) + { + // The document is signed + } + elseif ($signList === null) + { + $uploadedDocumentSigned = 'WARNING: signature server error'; + } + else + { + $signaturVorhanden = false; + $uploadedDocumentSigned = $p->t('abgabetool/uploadedDocumentNotSignedStudent'); + } + } + /*$qry="UPDATE campus.tbl_paabgabe SET abgabedatum = now(), updatevon = '".$user."', @@ -339,6 +374,7 @@ if($command=="update" && $error!=true) $htmlstr .= ''."\n"; $htmlstr .= ''."\n"; $htmlstr .= ''."\n"; + $htmlstr .= ''."\n"; $htmlstr .= "\n"; $htmlstr .= "".$p->t('abgabetool/spracheDerArbeit').":"; $sprache = @$db->db_query("SELECT sprache FROM public.tbl_sprache"); @@ -358,12 +394,9 @@ if($command=="update" && $error!=true) $htmlstr .= " \n"; } $htmlstr .= "\n"; - $htmlstr .= ''.$p->t('abgabetool/kontrollierteSchlagwoerter').':* - - '."\n"; - $htmlstr .= ''.$p->t('abgabetool/deutscheSchlagwoerter').': + $htmlstr .= ''.$p->t('abgabetool/deutscheSchlagwoerter').':* '."\n"; - $htmlstr .= ''.$p->t('abgabetool/englischeSchlagwoerter').': + $htmlstr .= ''.$p->t('abgabetool/englischeSchlagwoerter').':* '."\n"; $htmlstr .= ''.$p->t('abgabetool/abstract').' '.$p->t('abgabetool/maxZeichen').':* '."\n"; @@ -372,6 +405,21 @@ if($command=="update" && $error!=true) $htmlstr .= ''.$p->t('abgabetool/seitenanzahl').':* '."\n"; $htmlstr .=" \n"; + + // If there are info about the signed document + if ($uploadedDocumentSigned != null) + { + $htmlstr .= "\n"; + $htmlstr .= ""; + $htmlstr .= '
    + + '.$uploadedDocumentSigned.' +
    '; + $htmlstr .= ""; + $htmlstr .= "\n"; + } + + $htmlstr .=" \n"; $htmlstr .="

    ".$p->t('abgabetool/eidesstattlicheErklaerung')."

    \n"; $htmlstr .= "".$p->t('abgabetool/gelesenUndAkzeptiert').":* "; $htmlstr .=" * ".$p->t('abgabetool/pflichtfeld')." @@ -587,7 +635,6 @@ if($command!="add") $htmlstr .= ''."\n"; $htmlstr .= ''."\n"; $htmlstr .= ''."\n"; - $htmlstr .= ''."\n"; $htmlstr .= ''."\n"; $htmlstr .= ''."\n"; $htmlstr .= ''."\n"; diff --git a/cis/private/lehre/benotungstool/lvgesamtnoteeintragen.php b/cis/private/lehre/benotungstool/lvgesamtnoteeintragen.php index 73d0e6fca..8337b7c36 100644 --- a/cis/private/lehre/benotungstool/lvgesamtnoteeintragen.php +++ b/cis/private/lehre/benotungstool/lvgesamtnoteeintragen.php @@ -98,9 +98,9 @@ if($stsem=='') //$note = $_REQUEST["note"]; -if(!$rechte->isBerechtigt('admin',0) && - !$rechte->isBerechtigt('admin',$lv_obj->studiengang_kz) && - !$rechte->isBerechtigt('lehre',$lv_obj->studiengang_kz)) +if(!$rechte->isBerechtigt('admin', 0) && + !$rechte->isBerechtigt('admin', $lv_obj->studiengang_kz) && + !$rechte->isBerechtigt('lehre', $lv_obj->studiengang_kz)) { $qry = "SELECT lehreinheit_id FROM lehre.tbl_lehrveranstaltung JOIN lehre.tbl_lehreinheit USING(lehrveranstaltung_id) JOIN lehre.tbl_lehreinheitmitarbeiter USING(lehreinheit_id) @@ -117,11 +117,11 @@ if(!$rechte->isBerechtigt('admin',0) && } } -function savenote($db,$lvid, $student_uid, $note, $punkte=null) +function savenote($db, $lvid, $student_uid, $note, $punkte = null) { global $stsem, $user, $p, $noten_anmerkung; $jetzt = date("Y-m-d H:i:s"); - $punkte = str_replace(',','.',$punkte); + $punkte = str_replace(',', '.', $punkte); //Ermitteln ob der Student diesem Kurs zugeteilt ist $qry = "SELECT 1 FROM campus.vw_student_lehrveranstaltung WHERE uid=".$db->db_add_param($student_uid)." AND lehrveranstaltung_id=".$db->db_add_param($lvid, FHC_INTEGER); if($result = $db->db_query($qry)) @@ -207,13 +207,12 @@ if (isset($_REQUEST["submit"])) $note = $_REQUEST["note"]; $punkte = (isset($_REQUEST["punkte"])?$_REQUEST["punkte"]:''); - $response = savenote($db,$lvid, $student_uid, $note, $punkte); + $response = savenote($db, $lvid, $student_uid, $note, $punkte); echo $response; } else { - - foreach ($_POST as $row=>$val) + foreach ($_POST as $row => $val) { if(mb_strstr(mb_strtolower($row), 'matrikelnr_')) { @@ -232,7 +231,7 @@ if (isset($_REQUEST["submit"])) $response.="\nNote oder Punkte fehlen"; continue; } - $punkte=str_replace(',','.', $punkte); + $punkte=str_replace(',', '.', $punkte); //check ob statt Matrikelnummer nicht bereits student_uid (Moodle Grade Import) vorliegt.. $student = new student(); @@ -241,7 +240,7 @@ if (isset($_REQUEST["submit"])) //UID ermitteln if(!$student_uid = $student->getUidFromMatrikelnummer($matrikelnummer)) { - $response.="\n".$p->t('benotungstool/studentMitMatrikelnummerExistiertNicht',array($matrikelnummer)); + $response.="\n".$p->t('benotungstool/studentMitMatrikelnummerExistiertNicht', array($matrikelnummer)); continue; } } @@ -268,7 +267,7 @@ if (isset($_REQUEST["submit"])) } } - $val=savenote($db,$lvid, $student_uid, $note, $punkte); + $val=savenote($db, $lvid, $student_uid, $note, $punkte); if($val!='neu' && $val!='update' && $val!='update_f') $response.=$val; } diff --git a/cis/private/lehre/benotungstool/lvgesamtnoteverwalten.php b/cis/private/lehre/benotungstool/lvgesamtnoteverwalten.php index ddf3c54e4..6dce2b6ae 100644 --- a/cis/private/lehre/benotungstool/lvgesamtnoteverwalten.php +++ b/cis/private/lehre/benotungstool/lvgesamtnoteverwalten.php @@ -20,33 +20,33 @@ * Gerald Simane-Sequens < gerald.simane-sequens@technikum-wien.at > * Manuela Thamer */ -require_once ('../../../../config/cis.config.inc.php'); -require_once ('../../../../config/global.config.inc.php'); -require_once ('../../../../include/functions.inc.php'); -require_once ('../../../../include/lehrveranstaltung.class.php'); -require_once ('../../../../include/studiengang.class.php'); -require_once ('../../../../include/studiensemester.class.php'); -require_once ('../../../../include/lehreinheit.class.php'); -require_once ('../../../../include/benutzerberechtigung.class.php'); -require_once ('../../../../include/uebung.class.php'); -require_once ('../../../../include/beispiel.class.php'); -require_once ('../../../../include/studentnote.class.php'); -require_once ('../../../../include/datum.class.php'); -require_once ('../../../../include/legesamtnote.class.php'); -require_once ('../../../../include/lvgesamtnote.class.php'); -require_once ('../../../../include/zeugnisnote.class.php'); -require_once ('../../../../include/pruefung.class.php'); -require_once ('../../../../include/person.class.php'); -require_once ('../../../../include/benutzer.class.php'); -require_once ('../../../../include/mitarbeiter.class.php'); -require_once ('../../../../include/mail.class.php'); -require_once ('../../../../include/phrasen.class.php'); -require_once ('../../../../include/note.class.php'); -require_once ('../../../../include/notenschluessel.class.php'); -require_once ('../../../../include/studienplan.class.php'); -require_once ('../../../../include/addon.class.php'); -require_once ('../../../../include/mobilitaet.class.php'); -require_once ('../../../../include/student.class.php'); +require_once('../../../../config/cis.config.inc.php'); +require_once('../../../../config/global.config.inc.php'); +require_once('../../../../include/functions.inc.php'); +require_once('../../../../include/lehrveranstaltung.class.php'); +require_once('../../../../include/studiengang.class.php'); +require_once('../../../../include/studiensemester.class.php'); +require_once('../../../../include/lehreinheit.class.php'); +require_once('../../../../include/benutzerberechtigung.class.php'); +require_once('../../../../include/uebung.class.php'); +require_once('../../../../include/beispiel.class.php'); +require_once('../../../../include/studentnote.class.php'); +require_once('../../../../include/datum.class.php'); +require_once('../../../../include/legesamtnote.class.php'); +require_once('../../../../include/lvgesamtnote.class.php'); +require_once('../../../../include/zeugnisnote.class.php'); +require_once('../../../../include/pruefung.class.php'); +require_once('../../../../include/person.class.php'); +require_once('../../../../include/benutzer.class.php'); +require_once('../../../../include/mitarbeiter.class.php'); +require_once('../../../../include/mail.class.php'); +require_once('../../../../include/phrasen.class.php'); +require_once('../../../../include/note.class.php'); +require_once('../../../../include/notenschluessel.class.php'); +require_once('../../../../include/studienplan.class.php'); +require_once('../../../../include/addon.class.php'); +require_once('../../../../include/mobilitaet.class.php'); +require_once('../../../../include/student.class.php'); $summe_stud = 0; $summe_t2 = 0; @@ -104,6 +104,152 @@ $sprachen->getAll(true); $errormsg = ''; +// eingetragene lv-gesamtnoten freigeben +if (isset($_REQUEST["freigabe"]) && ($_REQUEST["freigabe"] == 1)) +{ + // Passwort pruefen + if (checkldapuser($user, $_REQUEST['passwort'])) + { + $jetzt = date("Y-m-d H:i:s"); + $neuenoten = 0; + + $studlist = " + "; + + // entweder personenbezogene Daten einbinden + if (defined('CIS_GESAMTNOTE_FREIGABEMAIL_NOTE') && CIS_GESAMTNOTE_FREIGABEMAIL_NOTE) + { + $studlist .= " + + + + + "; + + if (defined('CIS_GESAMTNOTE_PUNKTE') && CIS_GESAMTNOTE_PUNKTE) + { + $studlist .= "\n"; + } + $studlist .= "\n"; + + $studlist .= "\n"; + } + // oder anonymisiert nur die UIDs einbinden + else + { + $studlist .= " + \n + "; + } + + // studentenquery + $qry_stud = "SELECT + DISTINCT uid, vorname, nachname, matrikelnr, kurzbzlang + FROM + campus.vw_student_lehrveranstaltung + JOIN campus.vw_student USING(uid) + JOIN public.tbl_studiengang ON campus.vw_student.studiengang_kz = public.tbl_studiengang.studiengang_kz + WHERE + studiensemester_kurzbz = " . $db->db_add_param($stsem) . " + AND lehrveranstaltung_id = " . $db->db_add_param($lvid, FHC_INTEGER) . " + ORDER BY nachname, vorname "; + if ($result_stud = $db->db_query($qry_stud)) + { + $i = 1; + while ($row_stud = $db->db_fetch_object($result_stud)) + { + $lvgesamtnote = new lvgesamtnote(); + if ($lvgesamtnote->load($lvid, $row_stud->uid, $stsem)) + { + if ($lvgesamtnote->benotungsdatum > $lvgesamtnote->freigabedatum) + { + $lvgesamtnote->freigabedatum = $jetzt; + $lvgesamtnote->freigabevon_uid = $user; + $lvgesamtnote->save(); + + if (defined('CIS_GESAMTNOTE_FREIGABEMAIL_NOTE') && CIS_GESAMTNOTE_FREIGABEMAIL_NOTE) + { + $studlist .= ""; + $studlist .= ""; + $studlist .= ""; + $studlist .= ""; + + if (defined('CIS_GESAMTNOTE_PUNKTE') && CIS_GESAMTNOTE_PUNKTE) + { + $studlist .= "\n"; + } + $studlist .= ""; + + $studlist .= "\n"; + } + else + { + $studlist .= "\n"; + } + + $neuenoten ++; + } + } + } + } + + $studlist .= "
    " . $p->t('global/personenkz') . "" . $p->t('global/studiengang') . "" . $p->t('global/nachname') . "" . $p->t('global/vorname') . "" . $p->t('benotungstool/punkte') . "" . $p->t('benotungstool/note') . "" . $p->t('benotungstool/bearbeitetvon') . "
    " . $p->t('global/uid') . "
    " . trim($row_stud->matrikelnr) . "" . trim($row_stud->kurzbzlang) . "" . trim($row_stud->nachname) . "" . trim($row_stud->vorname) . ""; + if ($lvgesamtnote->punkte != '') + $studlist .= trim(number_format($lvgesamtnote->punkte, 2)); + $studlist .= "" . $noten_array[trim($lvgesamtnote->note)]['bezeichnung_mehrsprachig'][$sprache] . "" . $lvgesamtnote->mitarbeiter_uid; + if ($lvgesamtnote->updatevon != '') + $studlist .= " (" . $lvgesamtnote->updatevon . ")"; + $studlist .= "
    " . trim($row_stud->uid) . "
    "; + + // mail an assistentin und den user selber verschicken + if ($neuenoten > 0) + { + $lv = new lehrveranstaltung($lvid); + $sg = new studiengang($lv->studiengang_kz); + $lektor_adresse = $user . "@" . DOMAIN; + $adressen = $sg->email . ", " . $user . "@" . DOMAIN; + + $studienplan = new studienplan(); + $studienplan->getStudienplanLehrveranstaltung($lvid, $stsem); + $studienplan_bezeichnung = ''; + foreach ($studienplan->result as $row) + $studienplan_bezeichnung .= $row->bezeichnung . ' '; + + $mit = new mitarbeiter(); + $mit->load($user); + $name = $mit->anrede.' '.$mit->vorname.' '.$mit->nachname.' ('.$mit->kurzbz.')'; + + $betreff = 'Notenfreigabe ' . $lv->bezeichnung . ' ' . $lv->orgform_kurzbz . ' - ' . $studienplan_bezeichnung; + $mail = new mail($adressen, 'vilesci@' . DOMAIN, $betreff, ''); + $htmlcontent = " + + $name hat neue Noten für die Lehrveranstaltung\n\n
    + " . $sg->kuerzel . ' ' . $lv->semester . '.Semester + ' . $lv->bezeichnung . " " . $lv->orgform_kurzbz . " - " . $stsem . " +
    eingetragen.\n

    + Die Noten können jetzt ins Zeugnis übernommen werden.\n"; + + $htmlcontent .= $studlist; + + $htmlcontent.= " +
    Anzahl der Noten:" . $neuenoten . " +

    " . $p->t('abgabetool/mailVerschicktAn') . ": " . $adressen . " + "; + $mail->setHTMLContent($htmlcontent); + $mail->setReplyTo($lektor_adresse); + $mail->send(); + } + + http_response_code(303); + header('Location: ' . $_SERVER['REQUEST_URI']); + exit; + } + else + { + $errormsg = $p->t('gesamtnote/passwortFalsch'); + } +} + echo ' @@ -145,8 +291,8 @@ echo ' position:absolute; top:100px; left:300px; - width:400px; - height:200px; + min-width:450px; + min-height:200px; background-color:#cccccc; visibility:hidden; border-style:solid; @@ -190,11 +336,14 @@ foreach ($noten_obj->result as $row) $noten_array[$row->note]['lehre'] = $row->lehre; $noten_array[$row->note]['lkt_ueberschreibbar'] = $row->lkt_ueberschreibbar; $noten_array[$row->note]['anmerkung'] = $row->anmerkung; - foreach ($sprachen->result AS $s) + foreach ($sprachen->result as $s) $noten_array[$row->note]['bezeichnung_mehrsprachig'][$s->sprache] = $row->bezeichnung_mehrsprachig[$s->sprache]; } ?> + + const CIS_GESAMTNOTE_PUNKTE = ; + function getOffset(pos) { var x,y; @@ -376,7 +525,7 @@ foreach ($noten_obj->result as $row) var datum_test = datum.split("."); if (datum_test[0].length != 2 || datum_test[1].length != 2 || datum_test[2].length!=4 || isNaN(datum_test[2]) || datum_test[1]>12 || datum_test[1]<1 || datum_test[0]>31 || datum_test[0]<1) - alert("Invalid Date Format: DD.MM.YYYY"); + alert("Das Datum entspricht nicht dem Format TT.MM.JJJJ!"); else { var anlegendiv = document.getElementById("nachpruefung_div"); @@ -402,6 +551,7 @@ foreach ($noten_obj->result as $row) url += '&typ='+typ; url += '&'+ts; + $.ajax({ type:"GET", url: url, @@ -593,8 +743,8 @@ foreach ($noten_obj->result as $row) str += "X"; var anlegendiv = document.getElementById("nachpruefung_div"); var y = getOffset('y'); y = y+50; anlegendiv.style.top = y+"px"; - str += 't('benotungstool/importAnweisung');?>:'; - str += ''; + str += '
    t('benotungstool/importAnweisung');?>:
    '; + str += ''; str += "' onclick='saveGradeBulk();'>"; str += ""; anlegendiv.innerHTML = str; @@ -602,6 +752,25 @@ foreach ($noten_obj->result as $row) $('#noteimporttextarea').focus(); } + // **** + // * Oeffnet ein Fenster fuer den Import von Noten für die Nachprüfung aus dem Excel + // **** + function GradeImportNachp(termin) + { + var str = "
    "; + str += ""; + var anlegendiv = document.getElementById("nachpruefung_div"); + var y = getOffset('y'); y = y+50; anlegendiv.style.top = y+"px"; + str += ''; + str += ''; + + str += "
    X
    t('benotungstool/importAnweisungNachp');?>:
    ' onclick='saveGradeBulkNachp(\""+ termin +"\");'>"; + str += "
    "; + anlegendiv.innerHTML = str; + anlegendiv.style.visibility = "visible"; + $('#noteimporttextareaNachp').focus(); + } + // Speichert die Noten ueber den Import function saveGradeBulk() { @@ -633,33 +802,48 @@ foreach ($noten_obj->result as $row) } ?> + var linenumber = 0; for(row in rows) { - zeile = rows[row].split(" "); - - - - if (zeile[0]!='' && zeile[1]!='') + linenumber++; + if( rows[row] == '' ) { - gradedata['matrikelnr_'+i]=zeile[0]; - - - i++; + //skip empty lines + continue; } + zeile = rows[row].split(" "); + + if( zeile.length < 2 ) + { + alertMsg = alertMsg + "Zeile " + linenumber + ': ' + + 'Zu wenig Paramter - 2 erforderlich. ' + + 'Die Zeile wurde uebersprungen.' + "\n\n"; + continue; + } + + if (CIS_GESAMTNOTE_PUNKTE == false) + { + // check for valid grades + if (validGrades.indexOf(zeile[1]) === -1) + { + alertMsg = alertMsg + "Zeile " + linenumber + ': ' + + "Die Note "+zeile[1]+" ist nicht zulaessig. " + + "Die Zeile wurde uebersprungen. \n\n"; + continue; + } + } + + gradedata['matrikelnr_'+i]=zeile[0]; + if (CIS_GESAMTNOTE_PUNKTE) + { + gradedata['punkte_'+i]= zeile[1]; + } + else + { + gradedata['note_'+i]= zeile[1]; + } + + i++; } if (alertMsg != "") @@ -698,6 +882,142 @@ foreach ($noten_obj->result as $row) } } + // Speichert die Noten der Nachprüfung ueber den Import + function saveGradeBulkNachp(typ) + { + data = $('#noteimporttextareaNachp').val(); + closeDiv(); + + //Reihen ermitteln + var rows = data.split("\n"); + var i=0; + var params=''; + alertMsg = ''; + + var gradedata = {}; + var validGrades = ''; + + result as $row_note) + { + if ($row_note->lehre && $row_note->aktiv) + $gradesArray[] = '"' . $row_note->anmerkung . '"'; + } + // Output JS variable with valid grades + echo 'var validGrades = [' . implode(',', $gradesArray) . '];'; + } + ?> + + var linenumber = 0; + for(row in rows) + { + linenumber++; + if( rows[row] == '' ) + { + //skip empty lines + continue; + } + zeile = rows[row].split(" "); + + if( zeile.length < 3 ) + { + alertMsg = alertMsg + "Zeile " + linenumber + ': ' + + 'Zu wenig Paramter - 3 erforderlich. ' + + 'Die Zeile wurde uebersprungen.' + "\n\n"; + continue; + } + + if( zeile[1] == '' && zeile[2] == '' ) + { + // ignore lines just copied from excel + continue; + } + + if( zeile[2] == '' ) + { + alertMsg = alertMsg + "Zeile " + linenumber + ': ' + + "Die Note oder Punkte fehlen. " + + "Die Zeile wurde uebersprungen. \n\n"; + continue; + } + + if (CIS_GESAMTNOTE_PUNKTE == false) + { + // check for valid grades + if (validGrades.indexOf(zeile[2]) === -1) + { + alertMsg = alertMsg + "Zeile " + linenumber + ': ' + + "Die Note "+zeile[2]+" ist nicht zulaessig. " + + "Die Zeile wurde uebersprungen. \n\n"; + continue; + } + } + + if( !zeile[1].match(/[0-9]{2}\.[0-9]{2}\.[0-9]{4}/) ) + { + alertMsg = alertMsg + "Zeile " + linenumber + ': ' + + "Das Datum "+zeile[1]+" fehlt oder ist nicht zulaessig. " + + "Die Zeile wurde uebersprungen. \n\n"; + continue; + } + + gradedata['student_uid_'+i]=zeile[0]; + gradedata['datumNachp_'+i]=zeile[1]; + if (CIS_GESAMTNOTE_PUNKTE) + { + gradedata['punkte_'+i]= zeile[2]; + } + else + { + gradedata['note_'+i]= zeile[2]; + } + i++; + } + + + if (alertMsg != "") + alert(alertMsg); + + if (i>0) + { + + var jetzt = new Date(); + var ts = jetzt.getTime(); + var url= ''; + url += '&sammel=1'; + url += '&typ=' + typ; + url += '&submit=1&'+ts; + $.ajax({ + type:"POST", + url: url, + data: gradedata, + success:function(result) + { + var resp = result; + if (resp!='') + { + alert(resp); + } + window.location.reload(); + }, + error:function(result) + { + alert('Request Nachprüfung fehlgeschlagen'); + } + }); + + } + else + { + alert('t('benotungstool/hilfeImport');?>'); + } + } + //--> @@ -803,149 +1123,6 @@ if (defined('CIS_ANWESENHEITSLISTE_NOTENLISTE_ANZEIGEN') && CIS_ANWESENHEITSLIST { $hrefpath = "../notenliste.xls.php?stg=$stg_obj->studiengang_kz&lvid=$lvid&stsem=$stsem"; echo "
    " . $p->t('benotungstool/notenlisteImport') . ""; - -} - -// eingetragene lv-gesamtnoten freigeben -if (isset($_REQUEST["freigabe"]) && ($_REQUEST["freigabe"] == 1)) -{ - // Passwort pruefen - if (checkldapuser($user, $_REQUEST['passwort'])) - { - $jetzt = date("Y-m-d H:i:s"); - $neuenoten = 0; - - $studlist = " - "; - - // entweder personenbezogene Daten einbinden - if (defined('CIS_GESAMTNOTE_FREIGABEMAIL_NOTE') && CIS_GESAMTNOTE_FREIGABEMAIL_NOTE) - { - $studlist .= " - - - - - "; - - if (defined('CIS_GESAMTNOTE_PUNKTE') && CIS_GESAMTNOTE_PUNKTE) - { - $studlist .= "\n"; - } - $studlist .= "\n"; - - $studlist .= "\n"; - } - // oder anonymisiert nur die UIDs einbinden - else - { - $studlist .= " - \n - "; - } - - // studentenquery - $qry_stud = "SELECT - DISTINCT uid, vorname, nachname, matrikelnr, kurzbzlang - FROM - campus.vw_student_lehrveranstaltung - JOIN campus.vw_student USING(uid) - JOIN public.tbl_studiengang ON campus.vw_student.studiengang_kz = public.tbl_studiengang.studiengang_kz - WHERE - studiensemester_kurzbz = " . $db->db_add_param($stsem) . " - AND lehrveranstaltung_id = " . $db->db_add_param($lvid, FHC_INTEGER) . " - ORDER BY nachname, vorname "; - if ($result_stud = $db->db_query($qry_stud)) - { - $i = 1; - while ($row_stud = $db->db_fetch_object($result_stud)) - { - $lvgesamtnote = new lvgesamtnote(); - if ($lvgesamtnote->load($lvid, $row_stud->uid, $stsem)) - { - if ($lvgesamtnote->benotungsdatum > $lvgesamtnote->freigabedatum) - { - $lvgesamtnote->freigabedatum = $jetzt; - $lvgesamtnote->freigabevon_uid = $user; - $lvgesamtnote->save(); - - if (defined('CIS_GESAMTNOTE_FREIGABEMAIL_NOTE') && CIS_GESAMTNOTE_FREIGABEMAIL_NOTE) - { - $studlist .= ""; - $studlist .= ""; - $studlist .= ""; - $studlist .= ""; - - if (defined('CIS_GESAMTNOTE_PUNKTE') && CIS_GESAMTNOTE_PUNKTE) - { - $studlist .= "\n"; - } - $studlist .= ""; - - $studlist .= "\n"; - } - else - { - $studlist .= "\n"; - } - - $neuenoten ++; - } - } - } - } - - $studlist .= "
    " . $p->t('global/personenkz') . "" . $p->t('global/studiengang') . "" . $p->t('global/nachname') . "" . $p->t('global/vorname') . "" . $p->t('benotungstool/punkte') . "" . $p->t('benotungstool/note') . "" . $p->t('benotungstool/bearbeitetvon') . "
    " . $p->t('global/uid') . "
    " . trim($row_stud->matrikelnr) . "" . trim($row_stud->kurzbzlang) . "" . trim($row_stud->nachname) . "" . trim($row_stud->vorname) . ""; - if ($lvgesamtnote->punkte != '') - $studlist .= trim(number_format($lvgesamtnote->punkte, 2)); - $studlist .= "" . $noten_array[trim($lvgesamtnote->note)]['bezeichnung_mehrsprachig'][$sprache] . "" . $lvgesamtnote->mitarbeiter_uid; - if ($lvgesamtnote->updatevon != '') - $studlist .= " (" . $lvgesamtnote->updatevon . ")"; - $studlist .= "
    " . trim($row_stud->uid) . "
    "; - - // mail an assistentin und den user selber verschicken - if ($neuenoten > 0) - { - $lv = new lehrveranstaltung($lvid); - $sg = new studiengang($lv->studiengang_kz); - $lektor_adresse = $user . "@" . DOMAIN; - $adressen = $sg->email . ", " . $user . "@" . DOMAIN; - - $studienplan = new studienplan(); - $studienplan->getStudienplanLehrveranstaltung($lvid, $stsem); - $studienplan_bezeichnung = ''; - foreach ($studienplan->result as $row) - $studienplan_bezeichnung .= $row->bezeichnung . ' '; - - $mit = new mitarbeiter(); - $mit->load($user); - $name = $mit->anrede.' '.$mit->vorname.' '.$mit->nachname.' ('.$mit->kurzbz.')'; - - $betreff = 'Notenfreigabe ' . $lv->bezeichnung . ' ' . $lv->orgform_kurzbz . ' - ' . $studienplan_bezeichnung; - $mail = new mail($adressen, 'no-reply@' . DOMAIN, $betreff, ''); - $htmlcontent = " - - $name hat neue Noten für die Lehrveranstaltung\n\n
    - " . $sg->kuerzel . ' ' . $lv->semester . '.Semester - ' . $lv->bezeichnung . " " . $lv->orgform_kurzbz . " - " . $stsem . " -
    eingetragen.\n

    - Die Noten können jetzt ins Zeugnis übernommen werden.\n"; - - $htmlcontent .= $studlist; - - $htmlcontent.= " -
    Anzahl der Noten: " . $neuenoten . " -

    " . $p->t('abgabetool/mailVerschicktAn') . ": " . $adressen . " - "; - $mail->setHTMLContent($htmlcontent); - $mail->setReplyTo($lektor_adresse); - $mail->send(); - } - } - else - { - $errormsg = $p->t('gesamtnote/passwortFalsch'); - } } if (defined('CIS_GESAMTNOTE_PUNKTE') && CIS_GESAMTNOTE_PUNKTE) @@ -1052,11 +1229,15 @@ $htmlstring .= "" . $p->t('benotungstool/punkte') . ' / ' . $p->t('benotungs if (defined('CIS_GESAMTNOTE_PRUEFUNG_TERMIN2') && CIS_GESAMTNOTE_PRUEFUNG_TERMIN2) { - $htmlstring .= "" . $p->t('benotungstool/nachpruefung') . ""; + $htmlstring .= "
    " . $p->t('benotungstool/nachpruefung') . "
    + + "; } if (defined('CIS_GESAMTNOTE_PRUEFUNG_TERMIN3') && CIS_GESAMTNOTE_PRUEFUNG_TERMIN3) { - $htmlstring .= "" . $p->t('benotungstool/nachpruefung2') . ""; + $htmlstring .= "
    " . $p->t('benotungstool/nachpruefung2') . "
    + + "; } if (defined('CIS_GESAMTNOTE_PRUEFUNG_KOMMPRUEF') && CIS_GESAMTNOTE_PRUEFUNG_KOMMPRUEF) { @@ -1184,7 +1365,7 @@ if (defined("CIS_GESAMTNOTE_PRUEFUNG_MOODLE_LE_NOTE") && CIS_GESAMTNOTE_PRUEFUNG foreach ($addon_obj->result as $row) { if (file_exists('../../../../addons/' . $row->kurzbz . '/cis/grades.inc.php')) - include ('../../../../addons/' . $row->kurzbz . '/cis/grades.inc.php'); + include('../../../../addons/' . $row->kurzbz . '/cis/grades.inc.php'); } } } @@ -1193,7 +1374,6 @@ if (defined("CIS_GESAMTNOTE_PRUEFUNG_MOODLE_LE_NOTE") && CIS_GESAMTNOTE_PRUEFUNG foreach ($grades as $uid => $data) //Ausgabe Array { - $htmlstring .= ' ' . $db->convert_html_chars($uid) . ' @@ -1325,7 +1505,6 @@ if (defined("CIS_GESAMTNOTE_PRUEFUNG_MOODLE_LE_NOTE") && CIS_GESAMTNOTE_PRUEFUNG // Punkte if (CIS_GESAMTNOTE_PUNKTE) { - $htmlstring .= ' checkformatDatum($datum, 'Y-m-d', true) OR die('Invalid date format'); -} -else - die('Fehlerhafte Parameteruebergabe'); - -//Laden der Lehrveranstaltung -$lv_obj = new lehrveranstaltung(); -if(!$lv_obj->load($lvid)) - die($lv_obj->errormsg); - -//Studiengang laden -$stg_obj = new studiengang($lv_obj->studiengang_kz); + $lehreinheit_id_pr = $_GET['lehreinheit_id_pr']; if(isset($_GET['stsem'])) $stsem = $_GET['stsem']; else $stsem = ''; - -$uebung_id = (isset($_GET['uebung_id'])?$_GET['uebung_id']:''); -$uid = (isset($_GET['uid'])?$_GET['uid']:''); - //Studiensemester laden $stsem_obj = new studiensemester(); if($stsem=='') $stsem = $stsem_obj->getaktorNext(); -$student_uid = $_REQUEST["student_uid"]; - -$note = $_REQUEST["note"]; -if(isset($_REQUEST['punkte'])) - $punkte = $_REQUEST['punkte']; -else - $punkte = ''; - -$punkte = str_replace(',','.',$punkte); - -if($punkte!='') +//Notenanmerkung für Eintragung von nichtnumerischen Noten wie en (entschuldigt), ue(unentschuldigt) +$noten_anmerkung = array(); +$noten_arr = array(); +$note_obj = new note(); +$note_obj->getAll(); +foreach($note_obj->result as $row) { - // Bei Punkteeingabe wird die Note nochmals geprueft und ggf korrigiert - $notenschluessel = new notenschluessel(); - $note_pruef = $notenschluessel->getNote($punkte, $lvid, $stsem); - if($note_pruef!=$note) - { - $note = $note_pruef; - $note_dirty=true; - } + $noten_anmerkung[$row->anmerkung] = $row->note; + $noten_arr[$row->note] = $row; } if(!isset($_GET['typ'])) @@ -122,22 +97,177 @@ if(!isset($_GET['typ'])) } else { - if(in_array($_GET['typ'],array('Termin2','Termin3'))) + if(in_array($_GET['typ'], array('Termin2', 'Termin3'))) $typ=$_GET['typ']; else die('Typ ist ungueltig'); } -if($note=='') - $note = 9; - -$old_note = $note; - -// lvgesamtnote für studenten speichern -if (isset($_REQUEST["submit"]) && ($_REQUEST["student_uid"] != '') ) +if (isset($_REQUEST['sammel']) && $_REQUEST["sammel"] == 1) +{ + $errorMatrnr = ''; + $errorDatum = ''; + $errorNachp = ''; + + foreach ($_POST as $row => $val) + { + if(mb_strstr(mb_strtolower($row), 'student_uid_')) + { + $id=mb_substr($row, mb_strlen('student_uid_')); + + $student_uid = $_POST['student_uid_'.$id]; + $note = null; + $punkte = null; + $datum = null; + $response = ''; + if(isset($_POST['note_'.$id])) + $note = $_POST['note_'.$id]; + elseif(isset($_POST['punkte_'.$id])) + $punkte = $_POST['punkte_'.$id]; + else + { + $response.="\nNote oder Punkte fehlen"; + continue; + } + $punkte=str_replace(',', '.', $punkte); + if($punkte!='') + { + // Bei Punkteeingabe wird die Note nochmals geprueft und ggf korrigiert + $notenschluessel = new notenschluessel(); + $note_pruef = $notenschluessel->getNote($punkte, $lvid, $stsem); + if($note_pruef!=$note) + { + $note = $note_pruef; + $note_dirty=true; + } + } + + $datum = $_POST['datumNachp_'.$id]; + //check Datumsformat + $checkedDatum = $datum; + $datum_obj = new datum(); + if(!$datum = $datum_obj->checkformatDatum($datum, 'Y-m-d', true)) + { + $errorDatum .="\n".$p->t('benotungstool/datumsformatUnzulaessig', array($checkedDatum)); + continue; + } + + //check ob Matrikelnummer anstelle der student_uid übergeben wurde + $student = new student(); + if (!$student->checkIfValidStudentUID($student_uid)) + { + $checkedMatrnr = $student_uid; + //UID ermitteln + if(!$student_uid = $student->getUidFromMatrikelnummer($student_uid)) + { + $errorMatrnr.="\n".$p->t('benotungstool/studentMitMatrikelnummerExistiertNicht', array($checkedMatrnr)); + continue; + } + } + + //check ob eine Note vorhanden ist oder (intern) angerechnet wurde + $lvnote = new lvgesamtnote(); + if (!$lvnote->load($lvid, $student_uid, $stsem)) + { + $errorNachp.="\n".$p->t('benotungstool/NachpruefungNichtZulaessig', array($student_uid)); + continue; + } + + $lehreinheit_id = getLehreinheit($db, $lvid, $student_uid, $stsem); + + if(isset($_POST['student_uid_'.$id]) && (isset($_POST['note_'.$id]) || isset($_POST['punkte_'.$id])) && isset($_POST['datumNachp_'.$id])) + { + if(!is_numeric($note)) + { + if(isset($noten_anmerkung[$note])) + $note = $noten_anmerkung[$note]; + } + $response = savePruefung($lvid, $student_uid, $stsem, $lehreinheit_id, $datum, $typ, $note, $punkte); + if($response!='neu' && $response!='update' && $response!='update_f') + { + echo $response; + } + } + else + { + echo "\n fehlende oder fehlerhafte Inputparameter"; + } + } + } + echo $errorMatrnr . $errorDatum . $errorNachp; +} +else +{ + // Einzelupdate + + if(isset($_GET['datum'])) + { + $datum = $_GET['datum']; + $datum_obj = new datum(); + $datum = $datum_obj->checkformatDatum($datum, 'Y-m-d', true) or die($p->t('benotungstool/datumsformatUnzulaessig', array($checkedDatum))); + } + $student_uid = $_REQUEST["student_uid"]; + + $note = $_REQUEST["note"]; + if(isset($_REQUEST['punkte'])) + $punkte = $_REQUEST['punkte']; + else + $punkte = ''; + + $punkte = str_replace(',', '.', $punkte); + + if($punkte!='') + { + // Bei Punkteeingabe wird die Note nochmals geprueft und ggf korrigiert + $notenschluessel = new notenschluessel(); + $note_pruef = $notenschluessel->getNote($punkte, $lvid, $stsem); + if($note_pruef!=$note) + { + $note = $note_pruef; + $note_dirty=true; + } + } + + if($note=='') + $note = 9; + + $old_note = $note; + + //Laden der Lehrveranstaltung + $lv_obj = new lehrveranstaltung(); + if(!$lv_obj->load($lvid)) + die($lv_obj->errormsg); + + //Studiengang laden + $stg_obj = new studiengang($lv_obj->studiengang_kz); + + $uebung_id = (isset($_GET['uebung_id'])?$_GET['uebung_id']:''); + $uid = (isset($_GET['uid'])?$_GET['uid']:''); + + // lvgesamtnote für studenten speichern + if (isset($_REQUEST["submit"]) && ($_REQUEST["student_uid"] != '')) + { + // Die Pruefung muss einer Lehreinheit zugeordnet werden + // deshalb wird hier versucht eine passende Lehreinheit zu ermitteln. + $lehreinheit_id = getLehreinheit($db, $lvid, $student_uid, $stsem); + + $response = savePruefung($lvid, $student_uid, $stsem, $lehreinheit_id, $datum, $typ, $note); + echo $response; + } + else + echo "Fehler beim Eintragen der Prüfungen"; +} + +/** + * Berechnet Lehreinheit auf Basis LV-Daten + * @param string $db Datenbankvariable + * @param string $student_uid student_uid + * @param int $lvid Lehrveranstaltungsid + * @param string $stsem Studiensemester im Format 'WSYYYY' + * @return String LehreinheitId + */ +function getLehreinheit($db, $lvid, $student_uid, $stsem) { - // Die Pruefung muss einer Lehreinheit zugeordnet werden - // deshalb wird hier versucht eine passende Lehreinheit zu ermitteln. $le_arr = array(); $qry_stud = "SELECT lehreinheit_id, lehrform_kurzbz FROM @@ -158,104 +288,159 @@ if (isset($_REQUEST["submit"]) && ($_REQUEST["student_uid"] != '') ) } } - if (!in_array($lehreinheit_id,$le_arr)) + //if (!in_array($lehreinheit_id,$le_arr)) $lehreinheit_id = $le_arr[0]; + return $lehreinheit_id; +} + +/** + * Prüfung speichern + */ +function savePruefung($lvid, $student_uid, $stsem, $lehreinheit_id, $datum, $typ, $note, $punkte = null) +{ $jetzt = date("Y-m-d H:i:s"); + global $user; //, $note, $punkte, $datum; - $pr = new Pruefung(); - - // Wenn eine Pruefung angelegt wird, wird zuerst eine Pruefung mit 1. Termin angelegt - // und dort die Zeugnisnote gespeichert - if($pr->getPruefungen($student_uid, "Termin1", $lvid, $stsem)) + if ($typ == "Termin2") { - if ($pr->result) + $pr = new Pruefung(); + // Wenn eine Pruefung angelegt wird, wird zuerst eine Pruefung mit 1. Termin angelegt + // und dort die Zeugnisnote gespeichert + if($pr->getPruefungen($student_uid, "Termin1", $lvid, $stsem)) { - $termin1 = 1; - } - else - { - $lvnote = new lvgesamtnote(); - if ($lvnote->load($lvid, $student_uid, $stsem)) + if ($pr->result) { - $pr_note = $lvnote->note; - $pr_punkte = $lvnote->punkte; - $benotungsdatum = $lvnote->benotungsdatum; + $termin1 = 1; } else { - $pr_note = 9; - $pr_punkte = ''; - $benotungsdatum = $jetzt; + $lvnote = new lvgesamtnote(); + if ($lvnote->load($lvid, $student_uid, $stsem)) + { + $pr_note = $lvnote->note; + $pr_punkte = $lvnote->punkte; + $benotungsdatum = $lvnote->benotungsdatum; + } + else + { + $pr_note = 9; + $pr_punkte = ''; + $benotungsdatum = $jetzt; + } + + $pr_1 = new Pruefung(); + $pr_1->lehreinheit_id = $lehreinheit_id; + $pr_1->student_uid = $student_uid; + $pr_1->mitarbeiter_uid = $user; + $pr_1->note = $pr_note; + $pr_1->punkte = $pr_punkte; + $pr_1->pruefungstyp_kurzbz = "Termin1"; + $pr_1->datum = $benotungsdatum; + $pr_1->anmerkung = ""; + $pr_1->insertamum = $jetzt; + $pr_1->insertvon = $user; + $pr_1->updateamum = null; + $pr_1->updatevon = null; + $pr_1->ext_id = null; + $pr_1->new = true; + $pr_1->save(); + $response = "neu T1"; } - $pr_1 = new Pruefung(); - $pr_1->lehreinheit_id = $lehreinheit_id; - $pr_1->student_uid = $student_uid; - $pr_1->mitarbeiter_uid = $user; - $pr_1->note = $pr_note; - $pr_1->punkte = $pr_punkte; - $pr_1->pruefungstyp_kurzbz = "Termin1"; - $pr_1->datum = $benotungsdatum; - $pr_1->anmerkung = ""; - $pr_1->insertamum = $jetzt; - $pr_1->insertvon = $user; - $pr_1->updateamum = null; - $pr_1->updatevon = null; - $pr_1->ext_id = null; - $pr_1->new = true; - $pr_1->save(); + $prTermin2 = new Pruefung(); + $pr_2 = new Pruefung(); + + // Die Pruefung wird als Termin2 eingetragen + if ($prTermin2->getPruefungen($student_uid, 'Termin2', $lvid, $stsem)) + { + if ($prTermin2->result) + { + $pr_2->load($prTermin2->result[0]->pruefung_id); + $pr_2->new = null; + $pr_2->updateamum = $jetzt; + $pr_2->updatevon = $user; + $old_note = $pr_2->note; + $pr_2->note = $note; + $pr_2->punkte = $punkte; + $pr_2->datum = $datum; + $pr_2->anmerkung = ""; + $response = "update T2"; + } + else + { + $pr_2->lehreinheit_id = $lehreinheit_id; + $pr_2->student_uid = $student_uid; + $pr_2->mitarbeiter_uid = $user; + $pr_2->note = $note; + $pr_2->punkte = $punkte; + $pr_2->pruefungstyp_kurzbz = $typ; + $pr_2->datum = $datum; + $pr_2->anmerkung = ""; + $pr_2->insertamum = $jetzt; + $pr_2->insertvon = $user; + $pr_2->updateamum = null; + $pr_2->updatevon = null; + $pr_2->ext_id = null; + $pr_2->new = true; + $old_note = -1; + $response = "new T2"; + } + $pr_2->save(); + } } } - - - $prTermin2 = new Pruefung(); - $pr_2 = new Pruefung(); - - // Die Pruefung wird als Termin2 eingetragen - if ($prTermin2->getPruefungen($student_uid, $typ, $lvid, $stsem)) + elseif ($typ == "Termin3") { - if ($prTermin2->result) + $prTermin3 = new Pruefung(); + $pr_3 = new Pruefung(); + + if ($prTermin3->getPruefungen($student_uid, 'Termin3', $lvid, $stsem)) { - $pr_2->load($prTermin2->result[0]->pruefung_id); - $pr_2->new = null; - $pr_2->updateamum = $jetzt; - $pr_2->updatevon = $user; - $old_note = $pr_2->note; - $pr_2->note = $note; - $pr_2->punkte = $punkte; - $pr_2->datum = $datum; - $pr_2->anmerkung = ""; + if ($prTermin3->result) + { + $pr_3->load($prTermin3->result[0]->pruefung_id); + $pr_3->new = null; + $pr_3->updateamum = $jetzt; + $pr_3->updatevon = $user; + $old_note = $pr_3->note; + $pr_3->note = $note; + $pr_3->punkte = $punkte; + $pr_3->datum = $datum; + $pr_3->anmerkung = ""; + $response = "update T3"; + } + else + { + $pr_3->lehreinheit_id = $lehreinheit_id; + $pr_3->student_uid = $student_uid; + $pr_3->mitarbeiter_uid = $user; + $pr_3->note = $note; + $pr_3->punkte = $punkte; + $pr_3->pruefungstyp_kurzbz = $typ; + $pr_3->datum = $datum; + $pr_3->anmerkung = ""; + $pr_3->insertamum = $jetzt; + $pr_3->insertvon = $user; + $pr_3->updateamum = null; + $pr_3->updatevon = null; + $pr_3->ext_id = null; + $pr_3->new = true; + $old_note = -1; + $response = "new T3"; + } + $pr_3->save(); } - else - { - $pr_2->lehreinheit_id = $lehreinheit_id; - $pr_2->student_uid = $student_uid; - $pr_2->mitarbeiter_uid = $user; - $pr_2->note = $note; - $pr_2->punkte = $punkte; - $pr_2->pruefungstyp_kurzbz = $typ; - $pr_2->datum = $datum; - $pr_2->anmerkung = ""; - $pr_2->insertamum = $jetzt; - $pr_2->insertvon = $user; - $pr_2->updateamum = null; - $pr_2->updatevon = null; - $pr_2->ext_id = null; - $pr_2->new = true; - $old_note = -1; - } - $pr_2->save(); + } + else + { + $response = "fehlende oder fehlerhafte Inputparameter"; } - - // Wenn eine Pruefung eingetragen wird, wird danach die LV-Note korrigiert - $jetzt = date("Y-m-d H:i:s"); - - $lvid = $_REQUEST["lvid"]; + //Gesamtnote updaten $lvgesamtnote = new lvgesamtnote(); - if (!$lvgesamtnote->load($lvid, $student_uid, $stsem)) - { + if (!$lvgesamtnote->load($lvid, $student_uid, $stsem)) + { $lvgesamtnote->student_uid = $student_uid; $lvgesamtnote->lehrveranstaltung_id = $lvid; $lvgesamtnote->studiensemester_kurzbz = $stsem; @@ -272,9 +457,9 @@ if (isset($_REQUEST["submit"]) && ($_REQUEST["student_uid"] != '') ) $lvgesamtnote->insertvon = $user; $new = true; $response = "neu"; - } - else - { + } + else + { $lvgesamtnote->note = $note; $lvgesamtnote->punkte = $punkte; $lvgesamtnote->benotungsdatum = $jetzt; @@ -286,12 +471,11 @@ if (isset($_REQUEST["submit"]) && ($_REQUEST["student_uid"] != '') ) else $response = "update"; } + if (!$lvgesamtnote->save($new)) - echo "".$lvgesamtnote->errormsg.""; + return $lvgesamtnote->errormsg; else - echo $response; + return $response; } -else - echo "Fehler beim Eintragen der Prüfungen"; ?> diff --git a/cis/private/lehre/fotoliste.pdf.php b/cis/private/lehre/fotoliste.pdf.php index 475905e45..bfd2fb3e5 100644 --- a/cis/private/lehre/fotoliste.pdf.php +++ b/cis/private/lehre/fotoliste.pdf.php @@ -274,6 +274,8 @@ if ($result = $db->db_query($qry)) { //add foto to document $doc->addImage($foto_url, trim($row->person_id) . '.jpg', 'image/jpg'); + + $foto_url = 'Pictures/' . trim($row->person_id) . '.jpg'; } elseif ($row->foto_sperre == 't') { @@ -290,7 +292,7 @@ if ($result = $db->db_query($qry)) { 'personenkennzeichen' => trim($row->matrikelnr), 'geschlecht' => $row->geschlecht, 'foto_gesperrt' => $row->foto_sperre, // f/t - 'foto_url' => 'Pictures/' . trim($row->person_id) . '.jpg', + 'foto_url' => $foto_url, 'studiengruppe' => $student_studiengruppe, 'verband' => trim($row->verband), 'gruppe' => trim($row->gruppe), diff --git a/cis/private/lehre/lvincoming.php b/cis/private/lehre/lvincoming.php deleted file mode 100644 index f81292aab..000000000 --- a/cis/private/lehre/lvincoming.php +++ /dev/null @@ -1,146 +0,0 @@ - - * Andreas Oesterreicher < andreas.oesterreicher@technikum-wien.at > - * Rudolf Hangl < rudolf.hangl@technikum-wien.at > - */ -require_once('../../../config/cis.config.inc.php'); -require_once('../../../include/studiensemester.class.php'); -require_once('../../../include/studiengang.class.php'); - -$db = new basis_db(); - -$stsem = new studiensemester(); -$stsem->getNextStudiensemester(); - -$stg = new studiengang(); -$stg->getAll(); -?> - - - - - - - - Lehrveranstaltungen - Übersicht - - - - -   - - - - - - - - - - - -
    -  Lehrveranstaltungen - Übersicht ('.$stsem->studiensemester_kurzbz.') -
     
    - '; - - $qry = "SELECT - tbl_lehrveranstaltung.lehrveranstaltung_id, tbl_lehrveranstaltung.studiengang_kz, - tbl_lehrveranstaltung.bezeichnung, tbl_lehrveranstaltung.semester, - tbl_lehrveranstaltung.bezeichnung_english, tbl_lehrveranstaltung.incoming, - tbl_lehrveranstaltung.sprache, - ( - SELECT - count(*) - FROM - campus.vw_student_lehrveranstaltung - JOIN public.tbl_student ON(uid=student_uid) - JOIN public.tbl_prestudentstatus USING(prestudent_id) - WHERE - lehrveranstaltung_id=tbl_lehrveranstaltung.lehrveranstaltung_id AND - lehreinheit_id in (SELECT lehreinheit_id FROM lehre.tbl_lehreinheit - WHERE lehrveranstaltung_id=tbl_lehrveranstaltung.lehrveranstaltung_id - AND tbl_lehreinheit.studiensemester_kurzbz='$stsem->studiensemester_kurzbz') - AND tbl_prestudentstatus.status_kurzbz='Incoming' - AND tbl_prestudentstatus.status_kurzbz='$stsem->studiensemester_kurzbz' - GROUP BY uid - ) as anzahlincoming - FROM - lehre.tbl_lehrveranstaltung JOIN public.tbl_studiengang USING(studiengang_kz) - WHERE - tbl_lehrveranstaltung.incoming>0 AND - tbl_lehrveranstaltung.aktiv AND - tbl_lehrveranstaltung.lehre - AND tbl_lehrveranstaltung.studiengang_kz>0 AND tbl_lehrveranstaltung.studiengang_kz<10000 - AND tbl_studiengang.aktiv - "; - - echo ' - - - - - - - - - - - - - - '; - if($result = $db->db_query($qry)) - { - $i=0; - while($row = $db->db_fetch_object($result)) - { - $freieplaetze = $row->incoming - $row->anzahlincoming; - if($freieplaetze<0) - $freieplaetze=0; - - $i++; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - } - } - echo '
    IDStudiengangSemesterSpracheLehrveranstaltungLehrveranstaltung EnglischLV-InfoPlätze gesamtFreie Plätze
    ',$row->lehrveranstaltung_id,'',$stg->kuerzel_arr[$row->studiengang_kz],'',$row->semester,'',$row->sprache,'',$row->bezeichnung,'',$row->bezeichnung_english,' - Deutsch  - Englisch - ',$row->incoming,'',$freieplaetze,'
    '; -?> -
    - - - - - - diff --git a/cis/private/lehre/notenliste.xls.php b/cis/private/lehre/notenliste.xls.php index 74cb7e7c1..63cf45d29 100644 --- a/cis/private/lehre/notenliste.xls.php +++ b/cis/private/lehre/notenliste.xls.php @@ -35,6 +35,7 @@ require_once('../../../include/note.class.php'); require_once('../../../include/notenschluessel.class.php'); require_once('../../../include/Excel/excel.php'); require_once('../../../include/phrasen.class.php'); +require_once('../../../include/pruefung.class.php'); $uid = get_uid(); @@ -120,6 +121,13 @@ else $format_highlightright->setBorderColor('white'); $format_highlightright->setAlign('right'); + $format_highlightright_date=& $workbook->addFormat(); + $format_highlightright_date->setFgColor(15); + $format_highlightright_date->setBorder(1); + $format_highlightright_date->setBorderColor('white'); + $format_highlightright_date->setAlign('right'); + $format_highlightright_date->setNumFormat(49); + $format_border_bottom =& $workbook->addFormat(); $format_border_bottom ->setBottom(2); $format_border_bottom->setBold(); @@ -191,6 +199,19 @@ else } //Studenten holen + + //Spaltengruppe für Nachprüfung + if (defined('CIS_GESAMTNOTE_PRUEFUNG_TERMIN2') && CIS_GESAMTNOTE_PRUEFUNG_TERMIN2) + { + $worksheet->write($lines,8,$p->t('benotungstool/nachpruefung'),$format_bold); + } + + //Spaltengruppe für 2.Nebensprüfungstermin + if (defined('CIS_GESAMTNOTE_PRUEFUNG_TERMIN3') && CIS_GESAMTNOTE_PRUEFUNG_TERMIN3) + { + $worksheet->write($lines,12,$p->t('benotungstool/nachpruefung2'),$format_bold); + } + $lines++; $worksheet->write($lines,1,$p->t('global/uid'),$format_border_bottom); $worksheet->write($lines,2,$p->t('global/nachname'),$format_border_bottom); @@ -203,6 +224,26 @@ else else $worksheet->write($lines,6,$p->t('benotungstool/note'),$format_border_bottom); + if (defined('CIS_GESAMTNOTE_PRUEFUNG_TERMIN2') && CIS_GESAMTNOTE_PRUEFUNG_TERMIN2) + { + $worksheet->write($lines,8,$p->t('global/personenkennzeichen'),$format_border_bottom); + $worksheet->write($lines,9,$p->t('global/datum'),$format_border_bottom); + if(defined('CIS_GESAMTNOTE_PUNKTE') && CIS_GESAMTNOTE_PUNKTE) + $worksheet->write($lines,10,$p->t('benotungstool/punkte'),$format_border_bottom); + else + $worksheet->write($lines,10,$p->t('benotungstool/note'),$format_border_bottom); + } + + if (defined('CIS_GESAMTNOTE_PRUEFUNG_TERMIN3') && CIS_GESAMTNOTE_PRUEFUNG_TERMIN3) +{ + $worksheet->write($lines,12,$p->t('global/personenkennzeichen'),$format_border_bottom); + $worksheet->write($lines,13,$p->t('global/datum'),$format_border_bottom); + if(defined('CIS_GESAMTNOTE_PUNKTE') && CIS_GESAMTNOTE_PUNKTE) + $worksheet->write($lines,14,$p->t('benotungstool/punkte'),$format_border_bottom); + else + $worksheet->write($lines,14,$p->t('benotungstool/note'),$format_border_bottom); +} + $stsem_obj = new studiensemester(); $stsem_obj->load($stsem); $stsemdatumvon = $stsem_obj->start; @@ -229,17 +270,18 @@ else AND tbl_zeugnisnote.student_uid=tbl_student.student_uid AND tbl_zeugnisnote.studiensemester_kurzbz=tbl_studentlehrverband.studiensemester_kurzbz) LEFT JOIN bis.tbl_bisio ON(uid=tbl_bisio.student_uid) - LEFT JOIN bis.tbl_mobilitaet USING(prestudent_id) + LEFT JOIN bis.tbl_mobilitaet ON (bis.tbl_mobilitaet.prestudent_id = public.tbl_student.prestudent_id) LEFT JOIN lehre.tbl_note USING(note) WHERE vw_student_lehrveranstaltung.lehrveranstaltung_id=".$db->db_add_param($lvid, FHC_INTEGER)." - AND vw_student_lehrveranstaltung.studiensemester_kurzbz=".$db->db_add_param($stsem);";"; + AND vw_student_lehrveranstaltung.studiensemester_kurzbz=".$db->db_add_param($stsem);";"; if($lehreinheit_id!='') $qry.=" AND vw_student_lehrveranstaltung.lehreinheit_id=".$db->db_add_param($lehreinheit_id, FHC_INTEGER); $qry.=' ORDER BY nachname, vorname, person_id, tbl_bisio.bis, doubledegree DESC'; + if($result = $db->db_query($qry)) { $i=1; @@ -282,6 +324,49 @@ else $worksheet->write($lines,4,'="'.$elem->semester.$elem->verband.$elem->gruppe.'"'); $worksheet->write($lines,5,'="'.trim($elem->matrikelnr).'"',$format_highlight); $worksheet->write($lines,6, $note, $format_highlightright); + + // Nachprüfung + if (defined('CIS_GESAMTNOTE_PRUEFUNG_TERMIN2') && CIS_GESAMTNOTE_PRUEFUNG_TERMIN2) + { + $worksheet->write($lines,8, '="'.trim($elem->matrikelnr).'"', $format_highlight); + $pr = new Pruefung(); + $pr->getPruefungen($elem->uid, "Termin2", $lvid, $sem); + $output2 = $pr->result; + + if ($output2) + { + $resultPr = $output2[0]; + $worksheet->write($lines,9, date('d.m.Y', strtotime($resultPr->datum)), $format_highlightright_date); + $worksheet->write($lines,10, $resultPr->note, $format_highlightright); + } + else + { + $worksheet->write($lines,9, '', $format_highlightright_date); + $worksheet->write($lines,10, '', $format_highlightright); + } + } + + // Nachprüfung + if (defined('CIS_GESAMTNOTE_PRUEFUNG_TERMIN3') && CIS_GESAMTNOTE_PRUEFUNG_TERMIN3) + { + $worksheet->write($lines,12, '="'.trim($elem->matrikelnr).'"', $format_highlight); + $pr = new Pruefung(); + $pr->getPruefungen($elem->uid, "Termin3", $lvid, $sem); + $output3 = $pr->result; + + if ($output3) + { + $resultPr = $output3[0]; + $worksheet->write($lines,13, date('d.m.Y', strtotime($resultPr->datum)), $format_highlightright_date); + $worksheet->write($lines,14, $resultPr->note, $format_highlightright); + } + else + { + $worksheet->write($lines,13, '', $format_highlightright_date); + $worksheet->write($lines,14, '', $format_highlightright); + } + } + $i++; $lines++; } @@ -335,5 +420,17 @@ else $worksheet->setColumn(0, 3, 25); $worksheet->setColumn(0, 4, 7); $worksheet->setColumn(0, 5, 21); + + if (defined('CIS_GESAMTNOTE_PRUEFUNG_TERMIN2') && CIS_GESAMTNOTE_PRUEFUNG_TERMIN2) + { + $worksheet->setColumn(8, 8, 15); + $worksheet->setColumn(9, 9, 10); + } + if (defined('CIS_GESAMTNOTE_PRUEFUNG_TERMIN3') && CIS_GESAMTNOTE_PRUEFUNG_TERMIN3) + { + $worksheet->setColumn(12, 12, 15); + $worksheet->setColumn(13, 13, 10); + } + $workbook->close(); ?> diff --git a/cis/private/lehre/pruefung/pruefung.js.php b/cis/private/lehre/pruefung/pruefung.js.php index a9677e808..4142e413c 100644 --- a/cis/private/lehre/pruefung/pruefung.js.php +++ b/cis/private/lehre/pruefung/pruefung.js.php @@ -353,7 +353,8 @@ function writePruefungsTable(e, data, anmeldung) var time = termin[1].substring(0,5); termin = termin[0].split("-"); - // Studierende dürfen sich 2 Monate vor Prüfungen anmelden + // Studierende dürfen sich 2 Monate vor Prüfungen anmelden + var minimumFrist = new Date(termin[0], termin[1]-1,termin[2]); minimumFrist.setMonth(minimumFrist.getMonth() - 2); diff --git a/cis/private/lehre/pruefung/pruefungsanmeldung.json.php b/cis/private/lehre/pruefung/pruefungsanmeldung.json.php index e201fbe30..6757cf391 100644 --- a/cis/private/lehre/pruefung/pruefungsanmeldung.json.php +++ b/cis/private/lehre/pruefung/pruefungsanmeldung.json.php @@ -419,7 +419,7 @@ function saveAnmeldung($aktStudiensemester = null, $uid = null) $semCounter = $fakultaeten[1]["sem"]; break; default: - $semCounter = 2; + $semCounter = 3; break; } } diff --git a/cis/private/lehre/swd.php b/cis/private/lehre/swd.php deleted file mode 100644 index 248779aac..000000000 --- a/cis/private/lehre/swd.php +++ /dev/null @@ -1,11 +0,0 @@ - diff --git a/cis/private/lvplan/raumsuche.php b/cis/private/lvplan/raumsuche.php index 0cb9677d4..7be028be8 100644 --- a/cis/private/lvplan/raumsuche.php +++ b/cis/private/lvplan/raumsuche.php @@ -47,11 +47,11 @@ echo ' - - - - - + + + + + '; +echo << + $(document).ready(function() { + const scrollDiv = document.createElement('div'); + scrollDiv.style.cssText = 'width: 99px; height: 99px; overflow: scroll; position: absolute; top: -9999px;'; + document.body.appendChild(scrollDiv); + const scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth; + document.body.removeChild(scrollDiv); + var marginright = Math.max((20 - scrollbarWidth), 0); + document.body.style.setProperty('width', 'calc(100% - ' + marginright + 'px)'); + }); + + +EOSBJS; + echo ' "); if (!in_array($gebiet_id, $_SESSION['alleGebiete'])) diff --git a/cis/testtool/login.php b/cis/testtool/login.php index 0b114b8c5..475ee9f00 100644 --- a/cis/testtool/login.php +++ b/cis/testtool/login.php @@ -126,10 +126,6 @@ if (isset($_REQUEST['prestudent'])) $rt->getReihungstestPerson($ps->person_id); if (isset($rt->result[0])) $reihungstest_id = $rt->result[0]->reihungstest_id; - else - { - $alertmsg .= '
    '.$p->t('testtool/reihungstestKannNichtGeladenWerden').'
    '; - } } else { @@ -138,10 +134,6 @@ if (isset($_REQUEST['prestudent'])) // TODO Was ist wenn da mehrere Zurueckkommen?! if (isset($rt->result[0])) $reihungstest_id = $rt->result[0]->reihungstest_id; - else - { - $alertmsg .= '
    '.$p->t('testtool/reihungstestKannNichtGeladenWerden').'
    '; - } } else { @@ -362,6 +354,8 @@ if ((isset($_SESSION['prestudent_id']) && !isset($_SESSION['pruefling_id']) && $pruefling->idnachweis = ''; $pruefling->registriert = date('Y-m-d H:i:s'); $pruefling->prestudent_id = $_SESSION['prestudent_id']; + $pruefling->gesperrt = $pruefling->isGesperrt(null, $_SESSION['prestudent_id']); + if ($pruefling->save()) { $_SESSION['pruefling_id']=$pruefling->pruefling_id; @@ -385,6 +379,7 @@ if (isset($_POST['save']) && isset($_SESSION['prestudent_id'])) $pruefling->registriert = date('Y-m-d H:i:s'); $pruefling->prestudent_id = $_SESSION['prestudent_id']; $pruefling->semester = $_POST['semester']; + $pruefling->gesperrt = $pruefling->isGesperrt(null, $_SESSION['prestudent_id']); if ($pruefling->save()) { $_SESSION['pruefling_id']=$pruefling->pruefling_id; diff --git a/composer.json b/composer.json index 825ed5625..d2c03b42b 100644 --- a/composer.json +++ b/composer.json @@ -230,9 +230,9 @@ "type": "package", "package": { "name": "olifolkerd/tabulator5", - "version": "5.2.1", + "version": "5.5.2", "dist": { - "url": "https://github.com/olifolkerd/tabulator/archive/refs/tags/5.2.1.zip", + "url": "https://github.com/olifolkerd/tabulator/archive/refs/tags/5.5.2.zip", "type": "zip" } } @@ -270,17 +270,6 @@ } } }, - { - "type": "package", - "package": { - "name": "tinymce/tinymce4", - "version": "4.9.11", - "dist": { - "url": "https://github.com/tinymce/tinymce-dist/archive/refs/tags/4.9.11.zip", - "type": "zip" - } - } - }, { "type": "package", "package": { @@ -348,6 +337,28 @@ } } }, + { + "type": "package", + "package": { + "name": "vuejs/vuedatepicker_js", + "version": "5.4.0", + "dist": { + "url": "https://unpkg.com/@vuepic/vue-datepicker@5.4.0/dist/vue-datepicker.iife.js", + "type": "file" + } + } + }, + { + "type": "package", + "package": { + "name": "vuejs/vuedatepicker_css", + "version": "5.4.0", + "dist": { + "url": "https://unpkg.com/@vuepic/vue-datepicker@5.4.0/dist/main.css", + "type": "file" + } + } + }, { "type": "composer", "url": "https://asset-packagist.org" @@ -400,11 +411,11 @@ "nategood/httpful": "0.2.*", "netcarver/textile": "3.7.*", "nicolaskruchten/pivottable": "2.23.0", - "npm-asset/primevue": "3.15.*", + "npm-asset/primevue": "3.29.*", "npm-asset/primeicons": "5.0.0", "olifolkerd/tabulator4": "4.9.*", - "olifolkerd/tabulator5": "5.2.*", + "olifolkerd/tabulator5": "5.5.*", "phpseclib/phpseclib": "2.0.*", @@ -413,14 +424,15 @@ "scottjehl/respond": "1.4.2", "tapmodo/jcrop": "2.0.4", - "tinymce/tinymce4": "4.9.*", "tinymce/tinymce5": "5.10.*", "tomazdragar/simplecropper": "1.0", "twbs/bootstrap3": "3.4.*", "twbs/bootstrap5": "5.1.*", "vuejs/vuejs3": "3.2.33", - "vuejs/vuerouter4": "4.1.3" + "vuejs/vuerouter4": "4.1.3", + "vuejs/vuedatepicker_js": "5.4.0", + "vuejs/vuedatepicker_css": "5.4.0" }, "config": { "bin-dir": "vendor/bin" @@ -432,4 +444,3 @@ "sebastian/phpcpd": "3.*" } } - diff --git a/composer.lock b/composer.lock index 72f13c76f..d83e749b0 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "d530cc4d7bd81812535eb64e87ba04f4", + "content-hash": "728ac4542ac39ac1efbcea15134a81f9", "packages": [ { "name": "afarkas/html5shiv", @@ -35,6 +35,10 @@ ], "description": "Defacto way to enable use of HTML5 sectioning elements in legacy Internet Explorer.", "homepage": "http://paulirish.com/2011/the-history-of-the-html5-shiv/", + "support": { + "issues": "https://github.com/aFarkas/html5shiv/issues", + "source": "https://github.com/aFarkas/html5shiv/tree/3.7.3" + }, "time": "2015-07-20T20:04:00+00:00" }, { @@ -130,6 +134,16 @@ "keywords": [ "qr code" ], + "support": { + "issues": "https://github.com/chillerlan/php-qrcode/issues", + "source": "https://github.com/chillerlan/php-qrcode/tree/v2.0.x" + }, + "funding": [ + { + "url": "https://ko-fi.com/codemasher", + "type": "ko_fi" + } + ], "time": "2020-04-12T07:38:35+00:00" }, { @@ -178,6 +192,10 @@ "helper", "trait" ], + "support": { + "issues": "https://github.com/chillerlan/php-traits/issues", + "source": "https://github.com/chillerlan/php-traits" + }, "abandoned": true, "time": "2018-06-22T00:30:47+00:00" }, @@ -218,6 +236,10 @@ ], "description": "REST Server for the CodeIgniter framework", "homepage": "https://github.com/chriskacerguis/codeigniter-restserver", + "support": { + "issues": "https://github.com/chriskacerguis/codeigniter-restserver/issues", + "source": "https://github.com/chriskacerguis/codeigniter-restserver" + }, "time": "2017-09-23T16:44:55+00:00" }, { @@ -236,6 +258,10 @@ }, "type": "library", "notification-url": "https://packagist.org/downloads/", + "support": { + "issues": "https://github.com/akiyatkin/tablesorter/issues", + "source": "https://github.com/akiyatkin/tablesorter/tree/master" + }, "time": "2016-09-02T11:31:54+00:00" }, { @@ -269,6 +295,13 @@ ], "description": "The CodeIgniter framework", "homepage": "https://codeigniter.com", + "support": { + "forum": "http://forum.codeigniter.com/", + "issues": "https://github.com/bcit-ci/CodeIgniter/issues", + "slack": "https://codeigniterchat.slack.com", + "source": "https://github.com/bcit-ci/CodeIgniter", + "wiki": "https://github.com/bcit-ci/CodeIgniter/wiki" + }, "time": "2022-03-03T13:21:49+00:00" }, { @@ -573,20 +606,24 @@ ], "description": "Shim repository for Angular.js", "homepage": "http://angularjs.org", + "support": { + "issues": "https://github.com/components/angular.js/issues", + "source": "https://github.com/components/angular.js/tree/master" + }, "time": "2015-06-07T20:10:38+00:00" }, { "name": "components/jquery", - "version": "3.6.0", + "version": "v3.7.1", "source": { "type": "git", "url": "https://github.com/components/jquery.git", - "reference": "6cf38ee1fd04b6adf8e7dda161283aa35be818c3" + "reference": "8edc7785239bb8c2ad2b83302b856a1d61de60e7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/components/jquery/zipball/6cf38ee1fd04b6adf8e7dda161283aa35be818c3", - "reference": "6cf38ee1fd04b6adf8e7dda161283aa35be818c3", + "url": "https://api.github.com/repos/components/jquery/zipball/8edc7785239bb8c2ad2b83302b856a1d61de60e7", + "reference": "8edc7785239bb8c2ad2b83302b856a1d61de60e7", "shasum": "" }, "type": "component", @@ -615,7 +652,14 @@ ], "description": "jQuery JavaScript Library", "homepage": "http://jquery.com", - "time": "2021-03-20T19:13:42+00:00" + "support": { + "forum": "http://forum.jquery.com", + "irc": "irc://irc.freenode.org/jquery", + "issues": "https://github.com/jquery/jquery/issues", + "source": "https://github.com/jquery/jquery", + "wiki": "http://docs.jquery.com/" + }, + "time": "2023-09-22T01:43:46+00:00" }, { "name": "components/jqueryui", @@ -700,6 +744,10 @@ } ], "description": "jQuery UI is a curated set of user interface interactions, effects, widgets, and themes built on top of the jQuery JavaScript Library. Whether you're building highly interactive web applications or you just need to add a date picker to a form control, jQuery UI is the perfect choice.", + "support": { + "issues": "https://github.com/components/jqueryui/issues", + "source": "https://github.com/components/jqueryui/tree/master" + }, "time": "2016-09-16T05:47:55+00:00" }, { @@ -749,6 +797,10 @@ "captcha", "security" ], + "support": { + "issues": "https://github.com/dapphp/securimage/issues", + "source": "https://github.com/dapphp/securimage/tree/master" + }, "abandoned": true, "time": "2018-03-09T06:07:41+00:00" }, @@ -812,6 +864,12 @@ "rdfa", "sparql" ], + "support": { + "forum": "http://groups.google.com/group/easyrdf/", + "irc": "irc://chat.freenode.net/easyrdf", + "issues": "http://github.com/njh/easyrdf/issues", + "source": "https://github.com/easyrdf/easyrdf/tree/0.9.1" + }, "time": "2015-02-27T09:45:49+00:00" }, { @@ -890,6 +948,10 @@ "faker", "fixtures" ], + "support": { + "issues": "https://github.com/fzaninotto/Faker/issues", + "source": "https://github.com/fzaninotto/Faker/tree/v1.9.2" + }, "abandoned": true, "time": "2020-12-11T09:56:16+00:00" }, @@ -1012,6 +1074,10 @@ "json", "schema" ], + "support": { + "issues": "https://github.com/justinrainbow/json-schema/issues", + "source": "https://github.com/justinrainbow/json-schema/tree/master" + }, "time": "2014-08-25T02:48:14+00:00" }, { @@ -1046,6 +1112,10 @@ } ], "description": "A framework-agnostic PHP Implementation for generating simple forms based on json-schema", + "support": { + "issues": "https://github.com/kingsquare/json-schema-form/issues", + "source": "https://github.com/kingsquare/json-schema-form/tree/master" + }, "time": "2014-07-10T12:27:19+00:00" }, { @@ -1106,6 +1176,10 @@ "keywords": [ "markdown" ], + "support": { + "issues": "https://github.com/michelf/php-markdown/issues", + "source": "https://github.com/michelf/php-markdown/tree/lib" + }, "time": "2015-03-01T12:03:08+00:00" }, { @@ -1153,20 +1227,24 @@ "uri", "url" ], + "support": { + "issues": "https://github.com/lanthaler/IRI/issues", + "source": "https://github.com/lanthaler/IRI/tree/master" + }, "time": "2014-01-21T13:43:39+00:00" }, { "name": "ml/json-ld", - "version": "1.2.0", + "version": "1.2.1", "source": { "type": "git", "url": "https://github.com/lanthaler/JsonLD.git", - "reference": "c74a1aed5979ed1cfb1be35a55a305fd30e30b93" + "reference": "537e68e87a6bce23e57c575cd5dcac1f67ce25d8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/lanthaler/JsonLD/zipball/c74a1aed5979ed1cfb1be35a55a305fd30e30b93", - "reference": "c74a1aed5979ed1cfb1be35a55a305fd30e30b93", + "url": "https://api.github.com/repos/lanthaler/JsonLD/zipball/537e68e87a6bce23e57c575cd5dcac1f67ce25d8", + "reference": "537e68e87a6bce23e57c575cd5dcac1f67ce25d8", "shasum": "" }, "require": { @@ -1202,7 +1280,11 @@ "JSON-LD", "jsonld" ], - "time": "2020-06-16T17:45:06+00:00" + "support": { + "issues": "https://github.com/lanthaler/JsonLD/issues", + "source": "https://github.com/lanthaler/JsonLD/tree/1.2.1" + }, + "time": "2022-09-29T08:45:17+00:00" }, { "name": "moment/momentjs", @@ -1262,6 +1344,14 @@ "sorting", "table" ], + "support": { + "docs": "https://mottie.github.io/tablesorter/docs/index.html", + "email": "wowmotty@gmail.com", + "irc": "irc://irc.freenode.org/tablesorter", + "issues": "https://github.com/Mottie/tablesorter/issues", + "source": "https://github.com/Mottie/tablesorter", + "wiki": "https://github.com/Mottie/tablesorter/wiki" + }, "time": "2020-03-03T13:46:03+00:00" }, { @@ -1312,6 +1402,10 @@ "rest", "restful" ], + "support": { + "issues": "https://github.com/nategood/httpful/issues", + "source": "https://github.com/nategood/httpful/tree/v0.2.20" + }, "time": "2015-10-26T16:11:30+00:00" }, { @@ -1365,6 +1459,12 @@ "plaintext", "textile" ], + "support": { + "irc": "irc://irc.freenode.net/textile", + "issues": "https://github.com/textile/php-textile/issues", + "source": "https://github.com/textile/php-textile", + "wiki": "https://github.com/textile/php-textile/wiki" + }, "time": "2022-05-01T17:05:16+00:00" }, { @@ -1390,10 +1490,10 @@ }, { "name": "npm-asset/primevue", - "version": "3.15.0", + "version": "3.29.2", "dist": { "type": "tar", - "url": "https://registry.npmjs.org/primevue/-/primevue-3.15.0.tgz" + "url": "https://registry.npmjs.org/primevue/-/primevue-3.29.2.tgz" }, "type": "npm-asset", "license": [ @@ -1411,25 +1511,25 @@ }, { "name": "olifolkerd/tabulator5", - "version": "5.2.1", + "version": "5.5.2", "dist": { "type": "zip", - "url": "https://github.com/olifolkerd/tabulator/archive/refs/tags/5.2.1.zip" + "url": "https://github.com/olifolkerd/tabulator/archive/refs/tags/5.5.2.zip" }, "type": "library" }, { "name": "phpseclib/phpseclib", - "version": "2.0.37", + "version": "2.0.45", "source": { "type": "git", "url": "https://github.com/phpseclib/phpseclib.git", - "reference": "c812fbb4d6b4d7f30235ab7298a12f09ba13b37c" + "reference": "28d8f438a0064c9de80857e3270d071495544640" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/c812fbb4d6b4d7f30235ab7298a12f09ba13b37c", - "reference": "c812fbb4d6b4d7f30235ab7298a12f09ba13b37c", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/28d8f438a0064c9de80857e3270d071495544640", + "reference": "28d8f438a0064c9de80857e3270d071495544640", "shasum": "" }, "require": { @@ -1444,7 +1544,8 @@ "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.", "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.", "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.", - "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations." + "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations.", + "ext-xml": "Install the XML extension to load XML formatted public keys." }, "type": "library", "autoload": { @@ -1507,7 +1608,25 @@ "x.509", "x509" ], - "time": "2022-04-04T04:57:45+00:00" + "support": { + "issues": "https://github.com/phpseclib/phpseclib/issues", + "source": "https://github.com/phpseclib/phpseclib/tree/2.0.45" + }, + "funding": [ + { + "url": "https://github.com/terrafrost", + "type": "github" + }, + { + "url": "https://www.patreon.com/phpseclib", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpseclib/phpseclib", + "type": "tidelift" + } + ], + "time": "2023-09-15T20:55:47+00:00" }, { "name": "rmariuzzo/jquery-checkboxes", @@ -1587,6 +1706,23 @@ "polyfill", "portable" ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.19.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2020-10-23T09:01:57+00:00" }, { @@ -1598,15 +1734,6 @@ }, "type": "library" }, - { - "name": "tinymce/tinymce4", - "version": "4.9.11", - "dist": { - "type": "zip", - "url": "https://github.com/tinymce/tinymce-dist/archive/refs/tags/4.9.11.zip" - }, - "type": "library" - }, { "name": "tinymce/tinymce5", "version": "5.10.3", @@ -1706,8 +1833,30 @@ "keywords": [ "templating" ], + "support": { + "issues": "https://github.com/twigphp/Twig/issues", + "source": "https://github.com/twigphp/Twig/tree/1.x" + }, "time": "2020-02-11T05:59:23+00:00" }, + { + "name": "vuejs/vuedatepicker_css", + "version": "5.4.0", + "dist": { + "type": "file", + "url": "https://unpkg.com/@vuepic/vue-datepicker@5.4.0/dist/main.css" + }, + "type": "library" + }, + { + "name": "vuejs/vuedatepicker_js", + "version": "5.4.0", + "dist": { + "type": "file", + "url": "https://unpkg.com/@vuepic/vue-datepicker@5.4.0/dist/vue-datepicker.iife.js" + }, + "type": "library" + }, { "name": "vuejs/vuejs3", "version": "3.2.33", @@ -1779,6 +1928,24 @@ "regex", "regular expression" ], + "support": { + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/1.0.1" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], "time": "2022-01-21T20:24:37+00:00" }, { @@ -1826,20 +1993,39 @@ "Xdebug", "performance" ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/xdebug-handler/issues", + "source": "https://github.com/composer/xdebug-handler/tree/2.0.5" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], "time": "2022-02-24T20:20:32+00:00" }, { "name": "nikic/php-parser", - "version": "v4.14.0", + "version": "v4.18.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1" + "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/34bea19b6e03d8153165d8f30bba4c3be86184c1", - "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/1bcbb2179f97633e98bbbc87044ee2611c7d7999", + "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999", "shasum": "" }, "require": { @@ -1878,32 +2064,36 @@ "parser", "php" ], - "time": "2022-05-31T20:59:12+00:00" + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v4.18.0" + }, + "time": "2023-12-10T21:03:43+00:00" }, { "name": "pdepend/pdepend", - "version": "2.10.3", + "version": "2.16.1", "source": { "type": "git", "url": "https://github.com/pdepend/pdepend.git", - "reference": "da3166a06b4a89915920a42444f707122a1584c9" + "reference": "66ceb05eaa8bf358574143c974b04463911bc700" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pdepend/pdepend/zipball/da3166a06b4a89915920a42444f707122a1584c9", - "reference": "da3166a06b4a89915920a42444f707122a1584c9", + "url": "https://api.github.com/repos/pdepend/pdepend/zipball/66ceb05eaa8bf358574143c974b04463911bc700", + "reference": "66ceb05eaa8bf358574143c974b04463911bc700", "shasum": "" }, "require": { "php": ">=5.3.7", - "symfony/config": "^2.3.0|^3|^4|^5|^6.0", - "symfony/dependency-injection": "^2.3.0|^3|^4|^5|^6.0", - "symfony/filesystem": "^2.3.0|^3|^4|^5|^6.0" + "symfony/config": "^2.3.0|^3|^4|^5|^6.0|^7.0", + "symfony/dependency-injection": "^2.3.0|^3|^4|^5|^6.0|^7.0", + "symfony/filesystem": "^2.3.0|^3|^4|^5|^6.0|^7.0", + "symfony/polyfill-mbstring": "^1.19" }, "require-dev": { "easy-doc/easy-doc": "0.0.0|^1.2.3", "gregwar/rst": "^1.0", - "phpunit/phpunit": "^4.8.36|^5.7.27", "squizlabs/php_codesniffer": "^2.0.0" }, "bin": [ @@ -1925,26 +2115,42 @@ "BSD-3-Clause" ], "description": "Official version of pdepend to be handled with Composer", - "time": "2022-02-23T07:53:09+00:00" + "keywords": [ + "PHP Depend", + "PHP_Depend", + "dev", + "pdepend" + ], + "support": { + "issues": "https://github.com/pdepend/pdepend/issues", + "source": "https://github.com/pdepend/pdepend/tree/2.16.1" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/pdepend/pdepend", + "type": "tidelift" + } + ], + "time": "2023-12-10T18:38:19+00:00" }, { "name": "phpmd/phpmd", - "version": "2.12.0", + "version": "2.15.0", "source": { "type": "git", "url": "https://github.com/phpmd/phpmd.git", - "reference": "c0b678ba71902f539c27c14332aa0ddcf14388ec" + "reference": "74a1f56e33afad4128b886e334093e98e1b5e7c0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpmd/phpmd/zipball/c0b678ba71902f539c27c14332aa0ddcf14388ec", - "reference": "c0b678ba71902f539c27c14332aa0ddcf14388ec", + "url": "https://api.github.com/repos/phpmd/phpmd/zipball/74a1f56e33afad4128b886e334093e98e1b5e7c0", + "reference": "74a1f56e33afad4128b886e334093e98e1b5e7c0", "shasum": "" }, "require": { "composer/xdebug-handler": "^1.0 || ^2.0 || ^3.0", "ext-xml": "*", - "pdepend/pdepend": "^2.10.3", + "pdepend/pdepend": "^2.16.1", "php": ">=5.3.9" }, "require-dev": { @@ -1953,8 +2159,7 @@ "ext-simplexml": "*", "gregwar/rst": "^1.0", "mikey179/vfsstream": "^1.6.8", - "phpunit/phpunit": "^4.8.36 || ^5.7.27", - "squizlabs/php_codesniffer": "^2.0" + "squizlabs/php_codesniffer": "^2.9.2 || ^3.7.2" }, "bin": [ "src/bin/phpmd" @@ -1991,26 +2196,38 @@ "description": "PHPMD is a spin-off project of PHP Depend and aims to be a PHP equivalent of the well known Java tool PMD.", "homepage": "https://phpmd.org/", "keywords": [ + "dev", "mess detection", "mess detector", "pdepend", "phpmd", "pmd" ], - "time": "2022-03-24T13:33:01+00:00" + "support": { + "irc": "irc://irc.freenode.org/phpmd", + "issues": "https://github.com/phpmd/phpmd/issues", + "source": "https://github.com/phpmd/phpmd/tree/2.15.0" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/phpmd/phpmd", + "type": "tidelift" + } + ], + "time": "2023-12-11T08:22:20+00:00" }, { "name": "phpmetrics/phpmetrics", - "version": "v2.8.1", + "version": "v2.8.2", "source": { "type": "git", "url": "https://github.com/phpmetrics/PhpMetrics.git", - "reference": "e279f7317390f642339941b693359e9a181817a7" + "reference": "4b77140a11452e63c7a9b98e0648320bf6710090" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpmetrics/PhpMetrics/zipball/e279f7317390f642339941b693359e9a181817a7", - "reference": "e279f7317390f642339941b693359e9a181817a7", + "url": "https://api.github.com/repos/phpmetrics/PhpMetrics/zipball/4b77140a11452e63c7a9b98e0648320bf6710090", + "reference": "4b77140a11452e63c7a9b98e0648320bf6710090", "shasum": "" }, "require": { @@ -2061,7 +2278,11 @@ "quality", "testing" ], - "time": "2022-03-24T10:19:51+00:00" + "support": { + "issues": "https://github.com/PhpMetrics/PhpMetrics/issues", + "source": "https://github.com/phpmetrics/PhpMetrics/tree/v2.8.2" + }, + "time": "2023-03-08T15:03:36+00:00" }, { "name": "phpunit/php-timer", @@ -2110,6 +2331,10 @@ "keywords": [ "timer" ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/master" + }, "time": "2017-02-26T11:10:40+00:00" }, { @@ -2159,6 +2384,10 @@ "container-interop", "psr" ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/master" + }, "time": "2017-02-14T16:28:37+00:00" }, { @@ -2206,6 +2435,9 @@ "psr", "psr-3" ], + "support": { + "source": "https://github.com/php-fig/log/tree/1.1.4" + }, "time": "2021-05-03T11:20:27+00:00" }, { @@ -2245,6 +2477,10 @@ ], "description": "FinderFacade is a convenience wrapper for Symfony's Finder component.", "homepage": "https://github.com/sebastianbergmann/finder-facade", + "support": { + "issues": "https://github.com/sebastianbergmann/finder-facade/issues", + "source": "https://github.com/sebastianbergmann/finder-facade/tree/master" + }, "abandoned": true, "time": "2017-11-18T17:31:49+00:00" }, @@ -2296,6 +2532,11 @@ ], "description": "Copy/Paste Detector (CPD) for PHP code.", "homepage": "https://github.com/sebastianbergmann/phpcpd", + "support": { + "issues": "https://github.com/sebastianbergmann/phpcpd/issues", + "source": "https://github.com/sebastianbergmann/phpcpd/tree/master" + }, + "abandoned": true, "time": "2017-11-16T08:49:28+00:00" }, { @@ -2339,6 +2580,10 @@ ], "description": "Library that helps with managing the version number of Git-hosted PHP projects", "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "source": "https://github.com/sebastianbergmann/version/tree/master" + }, "time": "2016-10-03T07:35:21+00:00" }, { @@ -2346,12 +2591,12 @@ "version": "3.6.2", "source": { "type": "git", - "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", + "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", "reference": "5e4e71592f69da17871dba6e80dd51bce74a351a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/5e4e71592f69da17871dba6e80dd51bce74a351a", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/5e4e71592f69da17871dba6e80dd51bce74a351a", "reference": "5e4e71592f69da17871dba6e80dd51bce74a351a", "shasum": "" }, @@ -2390,6 +2635,25 @@ "phpcs", "standards" ], + "support": { + "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues", + "source": "https://github.com/squizlabs/PHP_CodeSniffer", + "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki" + }, + "funding": [ + { + "url": "https://github.com/PHPCSStandards", + "type": "github" + }, + { + "url": "https://github.com/jrfnl", + "type": "github" + }, + { + "url": "https://opencollective.com/php_codesniffer", + "type": "open_collective" + } + ], "time": "2021-12-12T21:44:58+00:00" }, { @@ -2449,6 +2713,23 @@ ], "description": "Symfony Config Component", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/config/tree/v3.4.47" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2020-10-24T10:57:07+00:00" }, { @@ -2516,6 +2797,23 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/console/tree/v3.4.47" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2020-10-24T10:57:07+00:00" }, { @@ -2567,6 +2865,23 @@ ], "description": "Symfony Debug Component", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/debug/tree/v3.4.47" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "abandoned": "symfony/error-handler", "time": "2020-10-24T10:57:07+00:00" }, @@ -2634,6 +2949,23 @@ ], "description": "Symfony DependencyInjection Component", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/dependency-injection/tree/v3.4.47" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2020-10-24T10:57:07+00:00" }, { @@ -2679,6 +3011,23 @@ ], "description": "Symfony Filesystem Component", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/filesystem/tree/v3.4.47" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2020-10-24T10:57:07+00:00" }, { @@ -2723,6 +3072,23 @@ ], "description": "Symfony Finder Component", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v3.4.47" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2020-11-16T17:02:08+00:00" }, { @@ -2786,6 +3152,23 @@ "portable", "shim" ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.19.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2020-10-23T09:01:57+00:00" }, { @@ -2829,6 +3212,10 @@ ], "description": "The classes contained within this repository extend the standard DOM to use exceptions at all occasions of errors instead of PHP warnings or notices. They also add various custom methods and shortcuts for convenience and to simplify the usage of DOM.", "homepage": "https://github.com/theseer/fDOMDocument", + "support": { + "issues": "https://github.com/theseer/fDOMDocument/issues", + "source": "https://github.com/theseer/fDOMDocument/tree/1.6.7" + }, "abandoned": true, "time": "2022-01-25T23:10:35+00:00" } @@ -2842,5 +3229,5 @@ "php": ">=5.6.40" }, "platform-dev": [], - "plugin-api-version": "2.3.0" + "plugin-api-version": "2.2.0" } diff --git a/config/cis.config-default.inc.php b/config/cis.config-default.inc.php index cb670b5dd..346af8801 100644 --- a/config/cis.config-default.inc.php +++ b/config/cis.config-default.inc.php @@ -86,6 +86,7 @@ define("AUTH_NAME","FH-Complete"); * LDAP_BIND_USER: DN des Users falls eine Authentifizierung am LDAP noetig ist oder null * LDAP_BIND_PASSWORD: Passwort des Users falls eine Authentifizierung am LDAP noetig ist oder null * LDAP_USER_SEARCH_FILTER: LDAP Attribut in dem der Username steht nach dem gesucht wird (uid | sAMAccountName) + * LDAP_SERVICEPING: LDAP Service Ping verwenden (true | false) - wirksam für alle LDAP Server */ define('LDAP_SERVER','ldap://ldap.example.com'); define('LDAP_PORT',389); @@ -94,6 +95,7 @@ define('LDAP_BASE_DN','ou=People,dc=example,dc=com'); define('LDAP_BIND_USER',null); define('LDAP_BIND_PASSWORD',null); define('LDAP_USER_SEARCH_FILTER','uid'); +define('LDAP_SERVICEPING',true); // 2. LDAP Server (zB wenn Mitarbeiter und Studierende auf 2 getrennten Servern liegen) /* @@ -207,6 +209,26 @@ define('TABLE_ID','_id'); define('TABLE_BEGIN','tbl_'); define('VIEW_BEGIN','vw_'); +/** + * Signatur + * DEFAULT: https://signatur.example.com/api/sign + */ +// Generic URL +define('SIGNATUR_URL', 'https://signatur.dev.technikum-wien.at/api'); +// Sign API +define('SIGNATUR_SIGN_API', 'sign'); +// List API +define('SIGNATUR_LIST_API', 'list'); +// User für Zugriff auf Signaturserver +define('SIGNATUR_USER', 'fhcomplete'); +// Passwort für Zugriff auf Signaturserver +define('SIGNATUR_PASSWORD', 'supersecretpassword'); +// Signaturprofil das verwendet werden soll +define('SIGNATUR_DEFAULT_PROFILE', 'FHC_AMT_GROSS_DE'); + +// Signaturpruefung im Abgabetool aktivieren +define('ABGABETOOL_CHECK_SIGNATURE',false); + //Gibt an, ob das Studienbuchblatt im CIS gedruckt werden kann define('CIS_DOKUMENTE_STUDIENBUCHLBATT_DRUCKEN',true); @@ -272,5 +294,4 @@ define ('DEFAULT_ALLIN_DIENSTVERTRAG',[111]); //Echter Dienstvertrag define ('DEFAULT_ECHTER_DIENSTVERTRAG',[103,111]); - ?> diff --git a/config/global.config-default.inc.php b/config/global.config-default.inc.php index 8990bbd81..c4da2f6e3 100644 --- a/config/global.config-default.inc.php +++ b/config/global.config-default.inc.php @@ -47,6 +47,9 @@ define('CIS_PROFIL_STUDIENINFORMATION_ANZEIGEN',true); // Zeitaufzeichnung gesperrt_bis Datum YYYY-MM-DD define('CIS_ZEITAUFZEICHNUNG_GESPERRT_BIS',''); +// maximale Dauer einer Zeitsperre in Tagen +define('CIS_ZEITSPERREN_MAX_DAUER', 730); + // Anzeige des Links zur Noteneingabe in der LVA Uebersicht define('CIS_LVALISTE_NOTENEINGABE_ANZEIGEN',true); diff --git a/config/system.config-default.inc.php b/config/system.config-default.inc.php index 45a83837e..a1f70086a 100644 --- a/config/system.config-default.inc.php +++ b/config/system.config-default.inc.php @@ -52,6 +52,7 @@ * LDAP_BIND_USER: DN des Users falls eine Authentifizierung am LDAP noetig ist oder null * LDAP_BIND_PASSWORD: Passwort des Users falls eine Authentifizierung am LDAP noetig ist oder null * LDAP_USER_SEARCH_FILTER: LDAP Attribut in dem der Username steht nach dem gesucht wird (uid | sAMAccountName) + * LDAP_SERVICEPING: LDAP Service Ping verwenden (true | false) - wirksam für alle LDAP Server */ define('LDAP_SERVER','ldap://ldap.example.com'); define('LDAP_PORT',389); @@ -60,6 +61,7 @@ define('LDAP_BIND_USER',null); define('LDAP_BIND_PASSWORD',null); define('LDAP_USER_SEARCH_FILTER','uid'); + define('LDAP_SERVICEPING',true); // 2. LDAP Server (zB wenn Mitarbeiter und Studierende auf 2 getrennten Servern liegen) /* diff --git a/config/vilesci.config-default.inc.php b/config/vilesci.config-default.inc.php index e98de9ce0..ddcf8d563 100644 --- a/config/vilesci.config-default.inc.php +++ b/config/vilesci.config-default.inc.php @@ -75,6 +75,7 @@ define('AUTH_NAME', 'FH Complete'); * LDAP_BIND_USER: DN des Users falls eine Authentifizierung am LDAP noetig ist oder null * LDAP_BIND_PASSWORD: Passwort des Users falls eine Authentifizierung am LDAP noetig ist oder null * LDAP_USER_SEARCH_FILTER: LDAP Attribut in dem der Username steht nach dem gesucht wird (uid | sAMAccountName) + * LDAP_SERVICEPING: LDAP Service Ping verwenden (true | false) - wirksam für alle LDAP Server */ define('LDAP_SERVER', 'ldap://ldap.example.com'); define('LDAP_PORT', 389); @@ -83,6 +84,7 @@ define('LDAP_BASE_DN', 'ou=People,dc=example,dc=com'); define('LDAP_BIND_USER', null); define('LDAP_BIND_PASSWORD', null); define('LDAP_USER_SEARCH_FILTER', 'uid'); +define('LDAP_SERVICEPING',true); // 2. LDAP Server (zB wenn Mitarbeiter und Studierende auf 2 getrennten Servern liegen) /* @@ -188,14 +190,22 @@ define('FHC_REST_PASSWORD', 'password'); * Signatur * DEFAULT: https://signatur.example.com/api/sign */ -define('SIGNATUR_URL', 'https://signatur.example.com/api/sign'); +// Generic URL +define('SIGNATUR_URL', 'https://signatur.dev.technikum-wien.at/api'); +// Sign API +define('SIGNATUR_SIGN_API', 'sign'); +// List API +define('SIGNATUR_LIST_API', 'list'); // User für Zugriff auf Signaturserver -define('SIGNATUR_USER', 'username'); +define('SIGNATUR_USER', 'fhcomplete'); // Passwort für Zugriff auf Signaturserver -define('SIGNATUR_PASSWORD', 'password'); +define('SIGNATUR_PASSWORD', 'supersecretpassword'); // Signaturprofil das verwendet werden soll define('SIGNATUR_DEFAULT_PROFILE', 'FHC_AMT_GROSS_DE'); +// Signaturpruefung im Abgabetool aktivieren +define('ABGABETOOL_CHECK_SIGNATURE',false); + /** * Datenverbund Anbindung */ @@ -266,7 +276,13 @@ define('DOCSBOX_WAITING_SLEEP_TIME', 1); // Bei folgenden Buchungstypen wird ein Anlegen geprüft ob bereits ein Eintrag für diesen Typ vorhanden ist im selben // Semester und ggf ein Hinweis ausgegeben define('FAS_DOPPELTE_BUCHUNGSTYPEN_CHECK', serialize( - array('StudiengebuehrAnzahlung', 'Studiengebuehr', 'StudiengebuehrRestzahlung', 'OEH') + array( + 'Studiengebuehr' => array('StudiengebuehrErhoeht', 'Studiengebuehr', 'StudiengebuehrAnzahlung', 'StudiengebuehrRestzahlung'), + 'StudiengebuehrErhoeht' => array('StudiengebuehrErhoeht', 'Studiengebuehr', 'StudiengebuehrAnzahlung', 'StudiengebuehrRestzahlung'), + 'StudiengebuehrAnzahlung' => array('StudiengebuehrErhoeht', 'Studiengebuehr', 'StudiengebuehrAnzahlung'), + 'StudiengebuehrRestzahlung' => array('StudiengebuehrErhoeht', 'Studiengebuehr', 'StudiengebuehrRestzahlung'), + 'OEH' => array('OEH') + )) )); // Spezialnoten die am Zeunigs und Diplomasupplement ignoriert werden diff --git a/config/wawi.config-default.inc.php b/config/wawi.config-default.inc.php index bed069e39..0081c2420 100644 --- a/config/wawi.config-default.inc.php +++ b/config/wawi.config-default.inc.php @@ -53,6 +53,7 @@ define("AUTH_NAME","FHComplete"); * LDAP_BIND_USER: DN des Users falls eine Authentifizierung am LDAP noetig ist oder null * LDAP_BIND_PASSWORD: Passwort des Users falls eine Authentifizierung am LDAP noetig ist oder null * LDAP_USER_SEARCH_FILTER: LDAP Attribut in dem der Username steht nach dem gesucht wird (uid | sAMAccountName) + * LDAP_SERVICEPING: LDAP Service Ping verwenden (true | false) - wirksam für alle LDAP Server */ define('LDAP_SERVER','ldap://ldap.example.com'); define('LDAP_PORT',389); @@ -61,6 +62,7 @@ define('LDAP_BASE_DN','ou=People,dc=example,dc=com'); define('LDAP_BIND_USER',null); define('LDAP_BIND_PASSWORD',null); define('LDAP_USER_SEARCH_FILTER','uid'); +define('LDAP_SERVICEPING',true); // 2. LDAP Server (zB wenn Mitarbeiter und Studierende auf 2 getrennten Servern liegen) /* diff --git a/content/fas.xul.php b/content/fas.xul.php index 449f917b7..abe7f613e 100644 --- a/content/fas.xul.php +++ b/content/fas.xul.php @@ -125,7 +125,8 @@ foreach($addon_obj->result as $addon) - + + @@ -139,6 +140,8 @@ foreach($addon_obj->result as $addon) + + @@ -506,13 +509,38 @@ foreach($addon_obj->result as $addon) label = "&menu-dokumente-zutrittskarte.label;" command = "menu-dokumente-zutrittskarte:command" accesskey = "&menu-dokumente-zutrittskarte.accesskey;"/> + + + + + + + id = "menu-dokumente-inskriptionsbestaetigung" + key = "menu-dokumente-inskriptionsbestaetigung:key" + label = "&menu-dokumente-inskriptionsbestaetigung.label;" + command = "menu-dokumente-inskriptionsbestaetigung:command" + accesskey = "&menu-dokumente-inskriptionsbestaetigung.accesskey;"/> + - +
    + ` +} diff --git a/public/js/components/Studierendenantrag/Leitung/Actions.js b/public/js/components/Studierendenantrag/Leitung/Actions.js new file mode 100644 index 000000000..2720a7df5 --- /dev/null +++ b/public/js/components/Studierendenantrag/Leitung/Actions.js @@ -0,0 +1,85 @@ +import ActionsNew from './Actions/New.js'; +import ActionsColumns from './Actions/Columns.js'; + +export default { + components: { + ActionsNew, + ActionsColumns + }, + props: { + selectedData: Array, + columns: Array, + stgL: Array, + stgA: Array + }, + emits: [ + 'reload', + 'download', + 'action:approve', + 'action:reject', + 'action:reopen' + ], + data() { + return { + currentStudent: '' + } + }, + computed: { + selectedCanBeApproved() { + if (!this.selectedData.length) + return false; + if (!this.selectedData.every(val => this.stgL.includes(val.studiengang_kz))) + return false; + return this.selectedData.filter(row => { + return (row.typ == 'Wiederholung' && row.status == 'Lvszugewiesen') || (row.typ != 'Wiederholung' && (row.status == 'Erstellt' || row.status == 'ErstelltStgl')); + }).length == this.selectedData.length; + }, + selectedCanBeRejected() { + if (!this.selectedData.length) + return false; + if (!this.selectedData.every(val => this.stgL.includes(val.studiengang_kz))) + return false; + return this.selectedData.filter(row => { + return (row.typ == 'Unterbrechung' && row.status == 'Erstellt'); + }).length == this.selectedData.length; + }, + selectedCanBeReopened() { + if (!this.selectedData.length) + return false; + if (!this.selectedData.every(val => this.stgA.includes(val.studiengang_kz))) + return false; + return this.selectedData.filter(row => { + return (row.typ == 'Wiederholung' && row.status == 'Verzichtet'); + }).length == this.selectedData.length; + }, + newUrl() { + return FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + this.currentStudent; + } + }, + methods: { + hideModal() { + bootstrap.Modal.getInstance(this.$refs.modal).hide(); + } + }, + template: ` +
    +
    + + + {{$p.t('table', 'with_selected', {count: selectedData.length})}} + + + +
    +
    + + +
    +
    + +
    +
    + ` +} diff --git a/public/js/components/Studierendenantrag/Leitung/Actions/Columns.js b/public/js/components/Studierendenantrag/Leitung/Actions/Columns.js new file mode 100644 index 000000000..55a7bd1cc --- /dev/null +++ b/public/js/components/Studierendenantrag/Leitung/Actions/Columns.js @@ -0,0 +1,22 @@ +export default { + props: { + columns: Array + }, + methods: { + toggleColumn(col) { + col.visible = !col.visible; + col.original.toggle() + } + }, + template: ` + + ` +} diff --git a/public/js/components/Studierendenantrag/Leitung/Actions/New.js b/public/js/components/Studierendenantrag/Leitung/Actions/New.js new file mode 100644 index 000000000..8952c4e78 --- /dev/null +++ b/public/js/components/Studierendenantrag/Leitung/Actions/New.js @@ -0,0 +1,109 @@ +import BsAlert from '../../../Bootstrap/Alert.js'; +import BsModal from '../../../Bootstrap/Modal.js'; + +export default { + components: { + BsModal, + AutoComplete: primevue.autocomplete + }, + emits: [ + 'reload' + ], + data() { + return { + data: [], + student: '', + abortController: null + } + }, + computed: { + newUrl() { + return FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + '/lehre/Studierendenantrag/abmeldungStgl/' + this.student.prestudent_id; + } + }, + methods: { + openForm() { + bootstrap.Modal.getInstance(this.$refs.modal).hide(); + BsModal.popup(Vue.h('iframe', { + src: this.newUrl, + class: 'position-absolute top-0 start-0 w-100 h-100' + }), { + dialogClass: 'modal-fullscreen' + }, this.$p.t('studierendenantrag', 'antrag_header')).then(() => { + this.$emit('reload'); + this.student = ''; + }); + }, + loadData(evt) { + if (this.abortController) + this.abortController.abort(); + this.abortController = new AbortController(); + + axios.post( + FHC_JS_DATA_STORAGE_OBJECT.app_root + + FHC_JS_DATA_STORAGE_OBJECT.ci_router + + '/components/Antrag/Abmeldung/getStudiengaengeAssistenz/', + evt, + { + signal: this.abortController.signal + } + ).then( + result => { + if (result.data.error) { + BsAlert.popup(result.data.retval, {dialogClass: 'alert alert-danger'}); + } else { + this.data = result.data.retval; + } + return result; + } + ).catch(() => {}); + } + }, + template: ` +
    + + +
    + ` +} diff --git a/public/js/components/Studierendenantrag/Leitung/GrundPopup.js b/public/js/components/Studierendenantrag/Leitung/GrundPopup.js new file mode 100644 index 000000000..bdea298ec --- /dev/null +++ b/public/js/components/Studierendenantrag/Leitung/GrundPopup.js @@ -0,0 +1,59 @@ +import BsAlert from '../../Bootstrap/Alert.js'; + +export default { + mixins: [ + BsAlert, + ], + props: { + placeholder: String, + default: String, + countRemaining: Number, + optional: Boolean + }, + data: () => ({ + value: '', + result: false, + check: false, + isInvalid: false + }), + methods: { + submit() { + if (!this.value && !this.optional) { + this.isInvalid = true; + } else { + this.result = [this.value, this.check]; + this.hide(); + } + } + }, + created() { + if (this.default) + this.value = this.default; + }, + popup(msg, options) { + if (typeof options === 'string') + options = { default: options }; + return BsAlert.popup.bind(this)(msg, options); + }, + template: ` + + + + ` +} diff --git a/public/js/components/Studierendenantrag/Leitung/Header.js b/public/js/components/Studierendenantrag/Leitung/Header.js new file mode 100644 index 000000000..3d6287afa --- /dev/null +++ b/public/js/components/Studierendenantrag/Leitung/Header.js @@ -0,0 +1,21 @@ +export default { + props: { + stgs: Array + }, + emits: [ + 'input' + ], + template: ` +
    +

    {{$p.t('studierendenantrag', 'studierendenantraege')}}

    +
    + +
    +
    + ` +} diff --git a/public/js/components/Studierendenantrag/Leitung/LvPopup.js b/public/js/components/Studierendenantrag/Leitung/LvPopup.js new file mode 100644 index 000000000..99455237e --- /dev/null +++ b/public/js/components/Studierendenantrag/Leitung/LvPopup.js @@ -0,0 +1,147 @@ +import BsAlert from '../../Bootstrap/Alert.js'; +import {CoreFetchCmpt} from "../../Fetch.js"; + +export default { + components: { + CoreFetchCmpt + }, + mixins: [ + BsAlert + ], + props: { + footer: Boolean, + antragId: Number, + countRemaining: Number + }, + data(){ + return { + lvs: null, + refresh: true, + result: false, + check: false + }; + }, + computed: { + lvzugelassen() { + let zwischen = {}; + for (let k in this.lvs){ + zwischen[k] = this.lvs[k] ? this.lvs[k].filter(lv=>lv.antrag_zugelassen) : null; + } + return zwischen; + }, + lvzugelassenLength() { + return Object.values(this.lvzugelassen).reduce((result, current) => result + (current ? current.length : 0), 0); + } + }, + methods: { + setlvs(param) { + if(param.error) + { + this.$refs.fetchCompt.error = true; + this.$refs.fetchCompt.errorMessage = param.retval; + } + else + this.lvs = param.retval; + }, + loadlvs() { + if (!this.antragId) + return new Promise(() => {}); + return axios.get(FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + '/components/Antrag/Wiederholung/getLvs/' + this.antragId); + }, + submit(result) { + this.result = [result, this.check]; + this.hide(); + } + }, + watch: { + antragId() { + Vue.nextTick(() => { + this.refresh = !this.refresh; + }); + } + }, + popup(msg, options) { + if (typeof options === 'string') + options = { default: options }; + return BsAlert.popup.bind(this)(msg, options); + }, + template: ` + + + + ` +} diff --git a/public/js/components/Studierendenantrag/Leitung/Table.js b/public/js/components/Studierendenantrag/Leitung/Table.js new file mode 100644 index 000000000..7bdf5d4a3 --- /dev/null +++ b/public/js/components/Studierendenantrag/Leitung/Table.js @@ -0,0 +1,393 @@ +import BsModal from '../../Bootstrap/Modal.js'; +import {CoreFetchCmpt} from '../../Fetch.js'; +import LvPopup from './LvPopup.js'; +import { dateFilter } from '../../../tabulator/filters/Dates.js'; + +export default { + components: { + BsModal, + CoreFetchCmpt, + LvPopup + }, + props: { + selectedData: Array, + columnData: Array, + stgL: Array, + stgA: Array + }, + emits: [ + 'update:columnData', + 'update:selectedData', + 'action:approve', + 'action:reject', + 'action:reopen', + 'action:object', + 'action:objectionDeny', + 'action:objectionApprove', + 'action:cancel' + ], + data() { + return { + ajaxUrl: FHC_JS_DATA_STORAGE_OBJECT.app_root + + FHC_JS_DATA_STORAGE_OBJECT.ci_router + + '/components/Antrag/Leitung/getAntraege/', + table: null, + lastHistoryClickedId: null, + historyData: [], + lvsData: null + } + }, + methods: { + reload(stg) { + this.table.replaceData(this.ajaxUrl + (stg || '')); + }, + download() { + this.table.download("csv", "data.csv", { + delimiter: ';', + bom: true + }); + }, + getHistory() { + if (this.lastHistoryClickedId === null) + return null; + return axios.get( + FHC_JS_DATA_STORAGE_OBJECT.app_root + + FHC_JS_DATA_STORAGE_OBJECT.ci_router + + '/components/Antrag/Leitung/getHistory/' + + this.lastHistoryClickedId + ).then(res => { + this.historyData = res.data.retval.sort((a, b) => a.insertamum > b.insertamum); + }); + }, + showHistoryGrund(grund) { + this.$refs.modalGrund.$el.addEventListener( + 'hidden.bs.modal', + this.$refs.history.show, + { + once: true + } + ); + this.$refs.modalGrundPre.innerHTML = grund; + }, + showLVs(data) { + this.lvsData = data; + this.$refs.lvList.show(); + } + }, + async mounted() { + await this.$p.loadCategory(['lehre', 'studierendenantrag', 'person', 'global', 'ui']); + function dateFormatter(cell) + { + let val = cell.getValue(); + if (!val) + return ''; + let date = new Date(val); + return date.toLocaleDateString(); + } + + this.table = new Tabulator(this.$refs.table, { + placeholder:"Keine zu bearbeitenden Datensätze", + movableColumns: true, + maxHeight: '50vh', + layout: "fitDataFill", + ajaxURL: this.ajaxUrl, + persistence: { // NOTE(chris): do not store column titles + sort: true, //persist column sorting + filter: true, //persist filters + headerFilter: true, //persist header filters + group: true, //persist row grouping + page: true, //persist page + columns: ["width", "visible"], //persist columns + }, + persistenceID: 'studierendenantrag_leitung_2023-11-14', + columns: [{ + formatter: 'rowSelection', + titleFormatter: 'rowSelection', + titleFormatterParams: { + rowRange: 'active' + }, + hozAlign: 'center', + headerSort: false + }, { + field: 'studierendenantrag_id', + title: '#' + }, { + field: 'bezeichnung', + title: this.$p.t('lehre', 'studiengang'), + headerFilter: 'list', + headerFilterParams: { + valuesLookup: true, + clearable: true, + autocomplete: true, + } + }, { + field: 'orgform', + title: this.$p.t('lehre', 'organisationsform'), + headerFilter: 'list', + headerFilterParams: { + valuesLookup: true, + clearable: true, + autocomplete: true, + } + }, { + field: 'typ', + title: this.$p.t('studierendenantrag', 'antrag_typ'), + headerFilter: 'list', + headerFilterParams: { + valuesLookup: true, + clearable: true, + autocomplete: true, + }, + formatter: (cell, formatterParams, onRendered) => { + return this.$p.t('studierendenantrag','antrag_typ_' + cell.getValue()); + } + }, { + field: 'statustyp', + title: this.$p.t('studierendenantrag', 'antrag_status'), + headerFilter: 'list', + headerFilterParams: { + valuesLookup: true, + clearable: true, + autocomplete: true, + }, + formatter: (cell, formatterParams, onRendered) => { + let link = document.createElement('a'); + link.href = "#"; + link.innerHTML = cell.getValue(); + link.addEventListener('click', e => { + e.preventDefault(); + this.lastHistoryClickedId = cell.getData().studierendenantrag_id; + this.$refs.historyLoader.fetchData(); + this.$refs.history.show(); + }); + + return link; + } + }, { + field: 'matrikelnr', + title: this.$p.t('person', 'personenkennzeichen'), + headerFilter: 'input' + }, { + field: 'prestudent_id', + title: this.$p.t('lehre', 'prestudent'), + headerFilter: 'input' + }, { + field: 'name', + title: this.$p.t('global', 'name'), + mutator: (value, data) => (data.vorname + ' ' + data.nachname).replace(/^\s*(.*)\s*$/, '$1'), + headerFilter: 'input' + }, { + field: 'datum', + title: this.$p.t('global', 'datum'), + formatter: dateFormatter, + headerFilterFunc: 'dates', + headerFilter: dateFilter + }, { + field: 'datum_wiedereinstieg', + title: this.$p.t('studierendenantrag', 'antrag_datum_wiedereinstieg'), + formatter: dateFormatter, + headerFilterFunc: 'dates', + headerFilter: dateFilter + }, { + field: 'grund', + title: this.$p.t('studierendenantrag', 'antrag_grund'), + formatter: (cell, formatterParams, onRendered) => { + let link = document.createElement('a'), + val = cell.getValue(); + link.href = "#modal-grund"; + link.setAttribute('data-bs-toggle', 'modal'); + link.innerHTML = this.$p.t('studierendenantrag', 'antrag_grund'); + link.addEventListener('click', () => { + this.$refs.modalGrundPre.innerHTML = val; + }); + + return val ? link : ''; + } + }, { + field: 'dms_id', + title: this.$p.t('studierendenantrag', 'antrag_dateianhaenge'), + formatter: (cell, formatterParams, onRendered) => { + let val = cell.getValue(); + if (!val) + return ''; + let link = document.createElement('a'); + link.href = FHC_JS_DATA_STORAGE_OBJECT.app_root + + FHC_JS_DATA_STORAGE_OBJECT.ci_router + + '/lehre/Antrag/Attachment/show/' + + val; + link.setAttribute('target', '_blank'); + link.innerHTML = ''; + link.append(this.$p.t('studierendenantrag/antrag_anhang')); + return link; + } + }, { + field: 'actions', + frozen: true, + title: this.$p.t('ui', 'aktion'), + headerFilter: false, + headerSort: false, + formatter: (cell, formatterParams, onRendered) => { + let container = document.createElement('div'), + data = cell.getData(); + + container.className = "d-flex gap-2"; + + if ((data.typ == 'Abmeldung' || data.typ == 'AbmeldungStgl' || data.typ == 'Unterbrechung') && (data.status == 'Genehmigt' || data.status == 'Beeinsprucht' || data.status == 'EinspruchAbgelehnt' || data.status == 'EmailVersandt')) { + // NOTE(chris): Download PDF + let button = document.createElement('a'); + // NOTE(chris): phrasen in attribues don't work if they are not preloaded + // it work in this case because the category has already been loaded before + button.innerHTML = ''; + button.className = "btn btn-outline-secondary"; + button.target = "_blank"; + button.href = FHC_JS_DATA_STORAGE_OBJECT.app_root + + 'content/pdfExport.php?xml=Antrag' + data.typ + '.xml.php&xsl=Antrag' + data.typ + '&id=' + data.studierendenantrag_id + '&output=pdf'; + container.append(button); + } + if (data.typ == 'AbmeldungStgl' && data.status == 'Genehmigt') { + // NOTE(chris): Object + let button = document.createElement('button'); + button.append(this.$p.t('studierendenantrag', 'btn_object')); + button.className = "btn btn-outline-secondary"; + button.addEventListener('click', () => this.$emit('action:object', [cell.getData()])); + container.append(button); + } + + if (data.typ == 'AbmeldungStgl' && data.status == 'Beeinsprucht') { + // NOTE(chris): Deny Objection + let button = document.createElement('button'); + button.append(this.$p.t('studierendenantrag', 'btn_objection_deny')); + button.className = "btn btn-outline-secondary"; + button.addEventListener('click', () => this.$emit('action:objectionDeny', [cell.getData()])); + container.append(button); + + // NOTE(chris): Approve Objection + button = document.createElement('button'); + button.append(this.$p.t('studierendenantrag', 'btn_objection_approve')); + button.className = "btn btn-outline-secondary"; + button.addEventListener('click', () => this.$emit('action:objectionApprove', [cell.getData()])); + container.append(button); + } + + if (this.stgA.includes(data.studiengang_kz)) { + // NOTE(chris): Reopen + if (data.typ == 'Wiederholung' && data.status == 'Verzichtet') { + let button = document.createElement('button'); + button.append(this.$p.t('studierendenantrag', 'btn_reopen')); + button.className = "btn btn-outline-secondary"; + button.addEventListener('click', () => this.$emit('action:reopen', [cell.getData()])); + container.append(button); + } + // NOTE(chris): Lv Zuweisen + if (data.typ == 'Wiederholung' && (data.status == 'Erstellt' || data.status == 'Lvszugewiesen')) { + let button = document.createElement('a'); + button.append(this.$p.t('studierendenantrag', 'btn_lvzuweisen')); + button.className = "btn btn-outline-secondary"; + button.href = FHC_JS_DATA_STORAGE_OBJECT.app_root + + FHC_JS_DATA_STORAGE_OBJECT.ci_router + + '/lehre/Antrag/Wiederholung/assistenz/' + + cell.getData().studierendenantrag_id + '/frame'; + button.onclick = e => { + e.preventDefault(); + BsModal.popup(Vue.h('iframe', { + src: button.href, + class: 'position-absolute top-0 start-0 w-100 h-100' + }), { + dialogClass: 'modal-fullscreen' + }, this.$p.t('studierendenantrag', 'title_lvzuweisen', cell.getData())).then(() => { + this.$emit('reload'); + }); + }; + container.append(button); + } + // NOTE(chris): Cancel + if (data.typ == 'AbmeldungStgl' && (data.status == 'Erstellt' || data.status == 'Genehmigt' )) { + let button = document.createElement('button'); + button.append(this.$p.t('studierendenantrag', 'btn_cancel')); + button.className = "btn btn-outline-secondary"; + button.addEventListener('click',() => this.$emit('action:cancel', [cell.getData()])); + container.append(button); + } + } + + if (this.stgL.includes(data.studiengang_kz)) { + // NOTE(chris): Approve + if ((data.typ == 'Wiederholung' && data.status == 'Lvszugewiesen') || (data.typ != 'Wiederholung' && data.status == 'Erstellt')) { + let button = document.createElement('button'); + button.append(this.$p.t('studierendenantrag', 'btn_approve')); + button.className = "btn btn-outline-secondary"; + button.addEventListener('click', () => this.$emit('action:approve', [cell.getData()])); + container.append(button); + } + // NOTE(chris): Reject (Unterbrechung braucht grund) + if (data.status == 'Erstellt' && data.typ == 'Unterbrechung') { + let button = document.createElement('button'); + button.append(this.$p.t('studierendenantrag', 'btn_reject')); + button.className = "btn btn-outline-secondary"; + button.addEventListener('click', () => this.$emit('action:reject', [cell.getData()])); + container.append(button); + } + } + + // NOTE(chris): Show LVs + if (data.typ == 'Wiederholung' && (data.status == 'Lvszugewiesen' || data.status == 'Genehmigt')) { + let button = document.createElement('button'); + button.append(this.$p.t('studierendenantrag', 'btn_show_lvs')); + button.className = "btn btn-outline-secondary"; + button.addEventListener('click', () => this.showLVs(cell.getData())); + container.append(button); + } + + return container; + } + }] + }); + this.table.on("tableBuilt", () => { + let columns = this.table.getColumns(); + let columnData = []; + for (let col of columns) { + let def = col.getDefinition(); + if (def.title && !def.frozen) { + columnData.push({ + title: def.title, + visible: col.isVisible(), + original: col + }); + } + } + this.$emit('update:columnData', columnData); + }); + this.table.on("rowSelectionChanged", data => { + this.$emit('update:selectedData', data); + }); + }, + template: ` +
    +
    + + + + + + + + + + + + + + +
    {{(new Date(status.insertamum)).toLocaleString()}}{{status.insertvon}}{{status.typ}} + + {{$p.t('studierendenantrag', 'antrag_grund')}} + +
    +
    +
    + + {{$p.t('studierendenantrag', 'title_show_lvs', lvsData ? lvsData : {name: ''}) }} + +
    + ` +} diff --git a/public/js/components/Studierendenantrag/Lvzuweisung.js b/public/js/components/Studierendenantrag/Lvzuweisung.js new file mode 100644 index 000000000..42f390ac3 --- /dev/null +++ b/public/js/components/Studierendenantrag/Lvzuweisung.js @@ -0,0 +1,255 @@ +import StudierendenantragStatus from './Status.js'; + +export default { + components: { + StudierendenantragStatus + }, + props: { + antragId: Number, + initialStatusCode: String, + initialStatusMsg: String, + disabled: Boolean + }, + data() { + return { + lvs: [], + isloading: false, + statusCode: '', + statusMsg: '' + }; + }, + computed: { + lvs1() { + return this.lvs[Object.keys(this.lvs).filter(key => key.substr(0, 1) == 1)] || []; + }, + lvs2() { + return this.lvs[Object.keys(this.lvs).filter(key => key.substr(0, 1) == 2)] || []; + }, + lvs1sem(){ + return (Object.keys(this.lvs).filter(key => key.substr(0, 1) == 1).pop() || "1").substr(1); + }, + lvs2sem(){ + return (Object.keys(this.lvs).filter(key => key.substr(0, 1) == 2).pop() || "2").substr(1); + }, + statusSeverity() { + switch (this.statusCode) { + case 0: return 'danger'; + default: return 'info'; + } + } + }, + methods: { + save() { + this.isloading = true; + const forbiddenLvs = this.lvs1.filter(lv => lv.antrag_zugelassen && !lv._children).map(lv => ({ + studierendenantrag_id: this.antragId, + lehrveranstaltung_id: lv.lehrveranstaltung_id, + zugelassen: 0, + anmerkung: lv.antrag_anmerkung || "", + studiensemester_kurzbz: this.lvs1sem + })); + const mandatoryLvs = this.lvs2.filter(lv => !lv._children).map(lv => ({ + studierendenantrag_id: this.antragId, + lehrveranstaltung_id: lv.lehrveranstaltung_id, + zugelassen:lv.antrag_zugelassen ? 1 : 2, + anmerkung: lv.antrag_anmerkung || "", + studiensemester_kurzbz: this.lvs2sem + })); + axios.post(FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + '/components/Antrag/Wiederholung/saveLvs/', {forbiddenLvs, mandatoryLvs}) + .then(response => { + if(!response.data.error) { + this.addAlert('Speichern erfolgreich', 'alert-success'); + this.statusCode = response.data.retval[0].studierendenantrag_statustyp_kurzbz; + this.statusMsg = response.data.retval[0].typ; + } else { + this.addAlert(response.data.retval.message || response.data.retval, 'alert-danger'); + this.statusCode = 0; + this.statusMsg = 'Error'; + } + this.isloading = false; + }).catch(error => { + this.addAlert(error.message, 'alert-danger'); + this.statusCode = 0; + this.statusMsg = 'Error'; + this.isloading = false; + }).finally(() => { + window.scrollTo(0, 0); + }); + }, + addAlert(text, type) { + const para = document.createElement("p"); + para.innerText = text; + para.className = "alert " + type + " alert-dismissible fade show"; + const btn = document.createElement("button"); + btn.className = "btn-close"; + btn.type = "button"; + btn.setAttribute("aria-label", "Close"); + btn.setAttribute("data-bs-dismiss", "alert"); + para.appendChild(btn); + + this.$refs.alertbox.appendChild(para); + } + }, + created() { + this.statusCode = this.initialStatusCode; + this.statusMsg = this.initialStatusMsg; + }, + mounted() { + axios.get(FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + '/components/Antrag/Wiederholung/getLvs/' + this.antragId).then( + result => { + if(result.data.error) + { + this.addAlert(result.data.retval, 'alert-danger'); + this.isloading = true; + } + else + { + let res = {}; + this.$p + .loadCategory(['ui', 'lehre', 'studierendenantrag', 'global']) + .then(() => { + for (var k in result.data.retval) { + if (result.data.retval[k] === null) { + const alert = document.createElement('div'); + alert.innerHTML = this.$p.t('studierendenantrag', 'error_stg_last_semester'); + alert.className = 'alert alert-warning'; + alert.role = 'alert'; + this.$refs["lvtable" + k.substr(0,1)].append(alert); + continue; + } + let lvs = result.data.retval[k].reduce((obj,lv) => { + obj[lv.studienplan_lehrveranstaltung_id] = lv; + return obj; + }, {}); + for (var lv of Object.values(lvs)) { + if (!lv.studienplan_lehrveranstaltung_id_parent) + continue; + if (!lvs[lv.studienplan_lehrveranstaltung_id_parent]) + console.error('parent not available'); + else { + if (!lvs[lv.studienplan_lehrveranstaltung_id_parent]._children) + lvs[lv.studienplan_lehrveranstaltung_id_parent]._children = []; + lvs[lv.studienplan_lehrveranstaltung_id_parent]._children.push(lv); + } + } + res[k] = Object.values(lvs).filter(lv => !lv.studienplan_lehrveranstaltung_id_parent); + let current = res[k]; + let index = k.substr(0,1); + + const options = { + data: current, + dataTree: true, + dataTreeStartExpanded: true, //start with an expanded tree + dataTreeChildIndent: 15, + layout: "fitDataStretch", + columns: [ + {title: this.$p.t('ui', 'bezeichnung'), field: "bezeichnung"}, + {title: this.$p.t('lehre','lehrform'), field: "lehrform_kurzbz"}, + {title: "ECTS", field: "ects"}, + {title: this.$p.t('lehre','note'), field: "note", formatter:(cell, formatterParams, onRendered)=>cell.getValue() || "---"}, + {title: (index==1) ? this.$p.t('studierendenantrag','lv_nicht_zulassen') : this.$p.t('studierendenantrag','lv_wiederholen'), field: "antrag_zugelassen", formatter: (cell, formatterParams, onRendered) => { + let data = cell.getData(); + if(data._children || !data.zeugnis) + return ""; + let input = document.createElement('input'); + input.className = "form-check-input"; + input.type = "checkbox"; + input.role = "switch"; + input.checked = cell.getValue(); + input.addEventListener('input', () => { + lvs[data.studienplan_lehrveranstaltung_id].antrag_zugelassen = input.checked; + cell.getRow().reformat(); + }); + if (this.disabled) { + input.disabled = true; + } + + let div = document.createElement('div'); + div.className = 'form-check form-switch'; + div.append(input); + + return div; + }}, + { + title: this.$p.t('global','anmerkung'), + field: "antrag_anmerkung", + headerSort:false, + titleFormatter:(cell, formatterParams, onRendered)=>{ + let link = document.createElement('a'); + link.addEventListener('click', (e) => { + e.preventDefault(); + }); + + link.href ="#"; + link.title = this.$p.t('studierendenantrag','anmerkung_tooltip'); + new bootstrap.Tooltip(link); + let tooltip = document.createElement('span'); + tooltip.innerHTML = this.$p.t('global','anmerkung') + " "; + tooltip.append(link); + + let icon = document.createElement('i'); + link.append(icon); + icon.className = "fa fa-info-circle"; + icon.setAttribute("aria-hidden", "true"); + icon.style.minWidth = '1em'; + + return tooltip; + + }, + formatter: (cell, formatterParams, onRendered) => { + if (this.disabled) { + return cell.getValue() || ""; + } + var data = cell.getData(); + if (lvs[data.studienplan_lehrveranstaltung_id].antrag_zugelassen) + { + let input = document.createElement('input'); + input.className = "form-control"; + input.type = "text"; + input.value = cell.getValue() || ""; + input.addEventListener('input', () => { + lvs[data.studienplan_lehrveranstaltung_id].antrag_anmerkung = input.value; + }); + return input; + } + else + { + return ""; + } + } + } + ] + }; + var table = new Tabulator(this.$refs["lvtable" + k.substr(0,1)], options); + } + this.lvs = result.data.retval; + }); + } + } + ); + }, + template: ` +
    +
    + + + {{$p.t('studierendenantrag', 'title_lv_nicht_zugelassen')}} + {{lvs1sem}} + +
    +
    + + + {{$p.t('studierendenantrag', 'title_lv_wiederholen')}} + {{lvs2sem}} + +
    +
    + + +
    +
    + +
    + ` +} diff --git a/public/js/components/Studierendenantrag/Status.js b/public/js/components/Studierendenantrag/Status.js new file mode 100644 index 000000000..7449fd376 --- /dev/null +++ b/public/js/components/Studierendenantrag/Status.js @@ -0,0 +1,15 @@ +export default { + props: { + msg: String, + severity: String + }, + computed: { + severityClass() { + return 'alert-' + this.severity; + } + }, + template: ` + + ` +} diff --git a/public/js/components/filter/Filter.js b/public/js/components/filter/Filter.js index e153042ad..77e3d7a60 100644 --- a/public/js/components/filter/Filter.js +++ b/public/js/components/filter/Filter.js @@ -18,20 +18,32 @@ import {CoreFilterAPIs} from './API.js'; import {CoreRESTClient} from '../../RESTClient.js'; import {CoreFetchCmpt} from '../../components/Fetch.js'; +import FilterConfig from './Filter/Config.js'; +import FilterColumns from './Filter/Columns.js'; +import TableDownload from './Table/Download.js'; // const FILTER_COMPONENT_NEW_FILTER = 'Filter Component New Filter'; const FILTER_COMPONENT_NEW_FILTER_TYPE = 'Filter Component New Filter Type'; +var _uuid = 0; + /** * */ export const CoreFilterCmpt = { - emits: ['nwNewEntry'], components: { - CoreFetchCmpt + CoreFetchCmpt, + FilterConfig, + FilterColumns, + TableDownload }, + emits: [ + 'nwNewEntry', + 'click:new' + ], props: { + onNwNewEntry: Function, // NOTE(chris): Hack to get the nwNewEntry listener into $props title: String, sideMenu: { type: Boolean, @@ -42,10 +54,21 @@ export const CoreFilterCmpt = { required: true }, tabulatorOptions: Object, - tabulatorEvents: Array + tabulatorEvents: Array, + tableOnly: Boolean, + reload: Boolean, + download: { + type: [Boolean, String, Function, Array, Object], + default: false + }, + newBtnShow: Boolean, + newBtnClass: [String, Array, Object], + newBtnDisabled: Boolean, + newBtnLabel: String }, data: function() { return { + uuid: 0, // FilterCmpt properties filterName: null, fields: null, @@ -54,9 +77,9 @@ export const CoreFilterCmpt = { selectedFields: null, notSelectedFields: null, filterFields: null, - columnsAlias: null, availableFilters: null, + selectedFilter: null, // FetchCmpt binded properties fetchCmptRefresh: false, @@ -64,110 +87,172 @@ export const CoreFilterCmpt = { fetchCmptApiFunctionParams: null, fetchCmptDataFetched: null, - tabulator: null + tabulator: null, + tableBuilt: false, + tabulatorHasSelector: false, + selectedData: [] }; }, - created: function() { - this.getFilter(); // get the filter data - }, - updated: function() { - // - let dataset = JSON.parse(JSON.stringify(this.dataset)); - let fields = JSON.parse(JSON.stringify(this.fields)); - let selectedFields = JSON.parse(JSON.stringify(this.selectedFields)); + computed: { + filteredData() { + if (!this.dataset) + return []; + return JSON.parse(JSON.stringify(this.dataset)); + }, + filteredColumns() { + let fields = JSON.parse(JSON.stringify(this.fields)) || []; + let selectedFields = JSON.parse(JSON.stringify(this.selectedFields)) || []; - // - let columns = null; + let columns = null; - // If the tabulator options has been provided and it contains the property columns - if (this.tabulatorOptions != null && this.tabulatorOptions.hasOwnProperty('columns')) - { - columns = this.tabulatorOptions.columns; - } + // If the tabulator options has been provided and it contains the property columns + if (this.tabulatorOptions && this.tabulatorOptions.hasOwnProperty('columns')) + columns = this.tabulatorOptions.columns; - // If columns is not an array or it is an array with less elements then the array fields - if (!Array.isArray(columns) || (Array.isArray(columns) && columns.length < fields.length)) - { - columns = []; // set it as an empty array - - // Loop throught all the retrieved columns from database - for (let i = 0; i < fields.length; i++) + // If columns is not an array or it is an array with less elements then the array fields + if (!Array.isArray(columns) || (Array.isArray(columns) && columns.length < fields.length)) { - // Create a new column having the title equal to the field name - let column = { - title: fields[i], - field: fields[i] - }; + columns = []; // set it as an empty array - // If the column has to be displayed or not - selectedFields.indexOf(fields[i]) >= 0 ? column.visible = true : column.visible = false; - - // Add the new column to the list of columns - columns.push(column); - } - } - else // the property columns has been provided in the tabulator options - { - // Loop throught the property columns of the tabulator options - for (let i = 0; i < columns.length; i++) - { - // If the column has to be displayed or not - selectedFields.indexOf(columns[i].field) >= 0 ? columns[i].visible = true : columns[i].visible = false; - - if (columns[i].hasOwnProperty('resizable')) + // Loop throught all the retrieved columns from database + for (let field of fields) { - columns[i].visible ? columns[i].resizable = true : columns[i].resizable = false; - } + // Create a new column having the title equal to the field name + let column = { + title: field, + field: field + }; + + // If the column has to be displayed or not + column.visible = selectedFields.indexOf(field) >= 0; + + // Add the new column to the list of columns + columns.push(column); + } } - } - - this.columnsAlias = columns; - - // Define a default tabulator options in case it was not provided - let tabulatorOptions = { - height: 500, - layout: "fitColumns", - movableColumns: true, - reactiveData: true, - columns: columns, - data: JSON.parse(JSON.stringify(this.dataset)) - }; - - // If it was provided - if (this.tabulatorOptions != null) - { - // Then copy it... - tabulatorOptions = this.tabulatorOptions; - // ...and overwrite the properties data, reactiveData, movableColumns and columns - tabulatorOptions.data = JSON.parse(JSON.stringify(this.dataset)); - tabulatorOptions.columns = columns; - tabulatorOptions.reactiveData = true; - tabulatorOptions.movableColumns = true; - } - - // Start the tabulator with the buid options - this.tabulator = new Tabulator( - "#filterTableDataset", - tabulatorOptions - ); - - // If event handlers have been provided - if (Array.isArray(this.tabulatorEvents) && this.tabulatorEvents.length > 0) - { - // Attach all the provided event handlers to the started tabulator - for (let i = 0; i < this.tabulatorEvents.length; i++) + else // the property columns has been provided in the tabulator options { - this.tabulator.on(this.tabulatorEvents[i].event, this.tabulatorEvents[i].handler); + // Loop throught the property columns of the tabulator options + for (let col of columns) + { + // If the column has to be displayed or not + col.visible = selectedFields.indexOf(col.field) >= 0; + if (col.formatter == 'rowSelection') + col.visible = true; + + if (col.hasOwnProperty('resizable')) + col.resizable = col.visible; + } } + + return columns; + }, + fieldIdsForVisibilty() { + if (!this.tableBuilt) + return []; + return this.tabulator.getColumns().filter(col => { + let def = col.getDefinition(); + return !def.frozen && def.title; + }).map(col => col.getField()); + }, + fieldNames() { + if (!this.tableBuilt) + return {}; + return this.tabulator.getColumns().reduce((res, col) => { + res[col.getField()] = col.getDefinition().title; + return res; + }, {}); + }, + idExtra() { + if (!this.uuid) + return ''; + return '-' + this.uuid; + }, + columnsForFilter() { + if (!this.filteredColumns || !this.datasetMetadata) + return []; + const filterTitles = this.filteredColumns.reduce((a,c) => { + a[c.field] = c.title; + return a; + }, {}); + return this.datasetMetadata.map(el => ({...el, ...{title: filterTitles[el.name]}})); } }, methods: { + reloadTable() { + if (this.tableOnly) + this.tabulator.setData(); + else + this.getFilter(); + }, + initTabulator() { + // Define a default tabulator options in case it was not provided + let tabulatorOptions = {...{ + height: 500, + layout: "fitColumns", + movableColumns: true, + reactiveData: true + }, ...(this.tabulatorOptions || {})}; + + if (!this.tableOnly) { + tabulatorOptions.data = this.filteredData; + tabulatorOptions.columns = this.filteredColumns; + } + + if (tabulatorOptions.columns && tabulatorOptions.columns.filter(el => el.formatter == 'rowSelection').length) + this.tabulatorHasSelector = true; + + // Start the tabulator with the build options + this.tabulator = new Tabulator( + this.$refs.table, + tabulatorOptions + ); + // If event handlers have been provided + if (Array.isArray(this.tabulatorEvents) && this.tabulatorEvents.length > 0) + { + // Attach all the provided event handlers to the started tabulator + for (let evt of this.tabulatorEvents) + this.tabulator.on(evt.event, evt.handler); + } + this.tabulator.on('tableBuilt', () => this.tableBuilt = true); + this.tabulator.on("rowSelectionChanged", data => { + this.selectedData = data; + }); + if (this.tableOnly) { + this.tabulator.on('tableBuilt', () => { + const cols = this.tabulator.getColumns(); + this.fields = cols.map(col => col.getField()); + this.selectedFields = cols.filter(col => col.isVisible()).map(col => col.getField()); + }); + } + }, + updateTabulator() { + if (this.tabulator) { + if (this.tableBuilt) + this._updateTabulator(); + else + this.tabulator.on('tableBuilt', this._updateTabulator); + } + }, + _updateTabulator() { + this.tabulatorHasSelector = this.filteredColumns.filter(el => el.formatter == 'rowSelection').length; + this.tabulator.setColumns(this.filteredColumns); + this.tabulator.setData(this.filteredData); + }, /** * */ getFilter: function() { - // - this.startFetchCmpt(CoreFilterAPIs.getFilter, null, this.render); + if (this.selectedFilter === null) + this.startFetchCmpt(CoreFilterAPIs.getFilter, null, this.render); + else + this.startFetchCmpt( + CoreFilterAPIs.getFilterById, + { + filterId: this.selectedFilter + }, + this.render + ); }, /** * @@ -195,7 +280,7 @@ export const CoreFilterCmpt = { filter.type = data.datasetMetadata[i].type; this.filterFields.push(filter); - break; + //break; } } } @@ -209,6 +294,7 @@ export const CoreFilterCmpt = { { this.setDropDownMenu(data); } + this.updateTabulator(); } else { @@ -230,6 +316,7 @@ export const CoreFilterCmpt = { if (link == null) link = '#'; filtersArray[filtersArray.length] = { + id: filters[filtersCount].filter_id, link: link + filters[filtersCount].filter_id, description: filters[filtersCount].desc, sort: filtersCount, @@ -244,6 +331,7 @@ export const CoreFilterCmpt = { if (link == null) link = '#'; filtersArray[filtersArray.length] = { + id: personalFilters[filtersCount].filter_id, link: link + personalFilters[filtersCount].filter_id, description: personalFilters[filtersCount].desc, subscriptDescription: personalFilters[filtersCount].subscriptDescription, @@ -282,6 +370,7 @@ export const CoreFilterCmpt = { if (link == null) link = '#'; filtersArray[filtersArray.length] = { + id: filters[filtersCount].filter_id, option: filters[filtersCount].filter_id, description: filters[filtersCount].desc }; @@ -294,6 +383,7 @@ export const CoreFilterCmpt = { if (link == null) link = '#'; filtersArray[filtersArray.length] = { + id: personalFilters[filtersCount].filter_id, option: personalFilters[filtersCount].filter_id, description: personalFilters[filtersCount].desc }; @@ -330,12 +420,13 @@ export const CoreFilterCmpt = { /** * */ - handlerSaveCustomFilter: function(event) { + handlerSaveCustomFilter: function(customFilterName) { + this.selectedFilter = null; // this.startFetchCmpt( CoreFilterAPIs.saveCustomFilter, { - customFilterName: document.getElementById('customFilterName').value + customFilterName }, this.getFilter ); @@ -344,159 +435,22 @@ export const CoreFilterCmpt = { * */ handlerRemoveCustomFilter: function(event) { + filterId = event.currentTarget.getAttribute("href").substring(1); + if (filterId === this.selectedFilter) + this.selectedFilter = null; // this.startFetchCmpt( CoreFilterAPIs.removeCustomFilter, { - filterId: event.currentTarget.getAttribute("href").substring(1) + filterId: filterId }, this.getFilter ); }, - /** - * - */ - handlerApplyFilterFields: function(event) { - let filterFields = []; - let filterFieldDivRows = document.getElementById('filterFields').getElementsByClassName('row'); - for (let i = 0; i< filterFieldDivRows.length; i++) - { - let filterField = {}; - - for (let j = 0; j< filterFieldDivRows[i].children.length; j++) - { - let filterColumn = filterFieldDivRows[i].children[j]; - let filterColumnElement = filterColumn.children[0]; - - // If the first column then search for the fields dropdown - if (j == 0) filterColumnElement = filterColumnElement.querySelector('select[name=fieldName]'); - - // If the filter name is _not_ null and it is _not_ a new filter - if (filterColumnElement.name != null && filterColumnElement.name != FILTER_COMPONENT_NEW_FILTER) - { - // Condition - if (filterColumnElement.name == 'condition' && filterColumnElement.value == "") - { - alert("Please fill all the filter options"); - return; - } - - // Name - if (filterColumnElement.name == 'fieldName') - { - filterField.name = filterColumnElement.value; - } - // Operation - if (filterColumnElement.name == 'operation') - { - filterField.operation = filterColumnElement.value; - } - // Condition - if (filterColumnElement.name == 'condition') - { - filterField.condition = filterColumnElement.value; - } - // Option - if (filterColumnElement.name == 'option') - { - filterField.option = filterColumnElement.value; - } - } - } - - if (Object.entries(filterField).length > 0) filterFields.push(filterField); - } - - // - this.startFetchCmpt( - CoreFilterAPIs.applyFilterFields, - { - filterFields: filterFields - }, - this.getFilter - ); - }, - /** - * - */ - handlerChangeFilterField: function(oldValue, newValue) { - - // If an old filter has been changed - if (oldValue != "") - { - for (let i = 0; i < this.filterFields.length; i++) - { - if (this.filterFields[i].name == oldValue) - { - this.filterFields.splice(i, 1); - break; - } - } - } - - // Then add the new filter - for (let i = 0; i < this.datasetMetadata.length; i++) - { - if (this.datasetMetadata[i].name == newValue) - { - let filter = { - name: this.datasetMetadata[i].name, - type: this.datasetMetadata[i].type - }; - - this.filterFields.push(filter); - break; - } - } - }, - /** - * - */ - handlerAddNewFilter: function(event) { - // Adds a new empty filter - this.filterFields.push({ - name: FILTER_COMPONENT_NEW_FILTER, - type: FILTER_COMPONENT_NEW_FILTER_TYPE - }); - }, /* * */ - handlerToggleSelectedField: function(event) { - - // If it is a selected field - if (this.selectedFields.indexOf(event.target.innerText) != -1) - { - // then hide it - this.tabulator.hideColumn(event.target.innerText); - // and remove it from the this.selectedFields property - this.selectedFields.splice(this.selectedFields.indexOf(event.target.innerText), 1); - } - else // otherwise - { - // show it - this.tabulator.showColumn(event.target.innerText); - // and add it to the this.selectedFields property - this.selectedFields.push(event.target.innerText); - } - }, - /** - * - */ - handlerRemoveFilterField: function(event) { - // - this.startFetchCmpt( - CoreFilterAPIs.removeFilterField, - { - filterField: event.currentTarget.getAttribute('field-to-remove') - }, - this.getFilter - ); - }, - /** - * - */ handlerGetFilterById: function(event) { let filterId = null; @@ -514,19 +468,41 @@ export const CoreFilterCmpt = { filterId = attr.substring(1); } - // Ajax call + this.switchFilter(filterId); + }, + switchFilter(filterId) { + this.selectedFilter = filterId; + this.getFilter(); + }, + applyFilterConfig(filterFields) { + this.selectedFilter = null; this.startFetchCmpt( - CoreFilterAPIs.getFilterById, + CoreFilterAPIs.applyFilterFields, { - filterId: filterId + filterFields }, - this.render + this.getFilter ); } }, + beforeCreate() { + if (!this.tableOnly == !this.filterType) + alert('You can not have a filter-type in table-only mode!'); + }, + created() { + if (this.sideMenu && (!this.$props.onNwNewEntry || !(this.$props.onNwNewEntry instanceof Function))) + alert('"nwNewEntry" listener is mandatory when sideMenu is true'); + this.uuid = _uuid++; + if (!this.tableOnly) + this.getFilter(); // get the filter data + }, + mounted() { + this.initTabulator(); + }, template: ` -
    +
    -
    - [ {{ filterName }} ] - - -
    - -
    -
    - -
    -
    - -
    -
    +
    +
    + + + Mit {{selectedData.length}} ausgewählten: + +
    +
    + [ {{ filterName }} ] + + + + + + +
    -
    -
    - -
    - -
    -
    -
    - - Neuer Filter - - - - -
    -
    - -
    - - -
    -
    -
    - - -
    -
    -
    - -
    -
    -
    -
    -
    +
    -
    +
    ` }; diff --git a/public/js/components/filter/Filter/Columns.js b/public/js/components/filter/Filter/Columns.js new file mode 100644 index 000000000..47d66d5f1 --- /dev/null +++ b/public/js/components/filter/Filter/Columns.js @@ -0,0 +1,78 @@ +/** + * Copyright (C) 2022 fhcomplete.org + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** + * + */ +export default { + props: { + fields: Array, + selected: { + type: Array, + default: [] + }, + names: { + type: Array, + default: [] + } + }, + emits: { + hide: ['fieldName'], + show: ['fieldName'] + }, + data: function() { + return { + selectedFields: [] + }; + }, + watch: { + selected(n) { + this.selectedFields = n; + } + }, + methods: { + toggle(field) { + if (this.selectedFields.indexOf(field) != -1) + { + this.selectedFields.splice(this.selectedFields.indexOf(field), 1); + this.$emit('hide', field); + } + else + { + this.selectedFields.push(field); + this.$emit('show', field); + } + } + }, + template: ` +
    +
    +
    +
    + {{ names[fieldToDisplay] || fieldToDisplay }} +
    +
    +
    +
    + ` +}; + diff --git a/public/js/components/filter/Filter/Config.js b/public/js/components/filter/Filter/Config.js new file mode 100644 index 000000000..3c75c5a3c --- /dev/null +++ b/public/js/components/filter/Filter/Config.js @@ -0,0 +1,215 @@ +/** + * Copyright (C) 2022 fhcomplete.org + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const FILTER_COMPONENT_NEW_FILTER = 'Filter Component New Filter'; + +/** + * + */ +export default { + props: { + filters: { + type: Array, + default: [] + }, + columns: { + type: Array, + default: [] + }, + fields: { + type: Array, + default: [] + } + }, + emits: { + switchFilter: ['filterId'], + applyFilterConfig: ['filterFields'], + saveCustomFilter: ['customFilterName'] + }, + data: function() { + return { + currentFields: [] + }; + }, + computed: { + types() { + return this.columns.reduce((a,c) => { + let type = c.type.toLowerCase(); + if (type.indexOf('int') >= 0) + a[c.name] = 'Numeric'; + else if ( + type.indexOf('varchar') >= 0 || + type.indexOf('text') >= 0 || + type.indexOf('bpchar') >= 0 + ) + a[c.name] = 'Text'; + else if ( + type.indexOf('timestamp') >= 0 || + type.indexOf('date') >= 0 + ) + a[c.name] = 'Date'; + else + a[c.name] = ''; + return a; + }, {}); + } + }, + watch: { + fields(n) { + this.currentFields = n; + } + }, + methods: { + switchFilter(evt) { + this.$emit('switchFilter', evt.currentTarget.value); + }, + applyFilterConfig() { + const filteredFields = this.currentFields.filter(el => el.name != FILTER_COMPONENT_NEW_FILTER); + if (filteredFields.filter(el => el.condition == "").length) + alert("Please fill all the filter options"); + else + this.$emit('applyFilterConfig', filteredFields); + }, + addField(evt) { + this.currentFields.push({ + name: FILTER_COMPONENT_NEW_FILTER + }); + }, + removeField(index) { + this.currentFields.splice(index, 1); + } + }, + template: ` +
    +
    +
    +
    + +
    +
    + +
    +
    +
    + +
    +
    + Filter {{ index + 1 }} + +
    +
    + + + + + + + + + + +
    + +
    +
    +
    + + +
    +
    +
    + + +
    +
    +
    + +
    +
    +
    +
    +
    + ` +}; + diff --git a/public/js/components/filter/Table/Download.js b/public/js/components/filter/Table/Download.js new file mode 100644 index 000000000..057fdad5e --- /dev/null +++ b/public/js/components/filter/Table/Download.js @@ -0,0 +1,247 @@ +/** + * Copyright (C) 2022 fhcomplete.org + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const DEFAULT_ICONS = { + jsonLines: 'fa-file-lines', + xlsx: 'fa-file-excel', + pdf: 'fa-file-pdf', + html: 'fa-file-code', + json: 'fa-file', + csv: 'fa-file-csv' +}; +const DEFAULT_LABELS = { + jsonLines: 'Download as JSONLINES', + xlsx: 'Download as XLSX', + pdf: 'Download as PDF', + html: 'Download as HTML', + json: 'Download as JSON', + csv: 'Download as CSV ' +}; + + +/** + * + */ +export default { + props: { + tabulator: Object, + config: { + type: [Boolean, String, Function, Array, Object], + default: false + }, + iconClass: [String, Array, Object] + }, + computed: { + currentConfig() { + if (!this.config) + return false; + + let config = this.config; + + if (config instanceof Function) + return [config]; + + if (config === null) + return []; + + if (this.config === true) + config = ['csv']; + + if (Object.prototype.toString.call(config) === "[object String]") + config = config.split(','); + + if (typeof config === 'object' && !Array.isArray(config)) { + let newConfig = []; + for (var k in config) { + var v = config[k], type; + + if (!v) + continue; + + if (Object.prototype.toString.call(v) === "[object String]") { + type = this.stringToFileFormatter(v); + if (type !== null) { + newConfig.push({ + icon: 'fa-solid ' + DEFAULT_ICONS[type], + label: v === k ? DEFAULT_LABELS[type] : k, + formatter: type + }); + } else { + type = this.stringToFileFormatter(k); + if(type !== null) { + newConfig.push({ + icon: 'fa-solid ' + DEFAULT_ICONS[type], + label: v, + formatter: type + }); + } else { + alert('neither ' + k + ' nor ' + v + ' are supported download file types'); + } + } + } else if (typeof v === 'object' && !Array.isArray(v)) { + type = this.stringToFileFormatter(k); + if (type !== null) { + if (v.formatter === undefined) + v.formatter = type; + if (v.label === undefined) + v.label = DEFAULT_LABELS[type]; + if (v.icon === undefined) + v.icon = DEFAULT_ICONS[type]; + newConfig.push(v); + } else { + if (v.label === undefined) + v.label = k; + newConfig.push(v); + } + } else { + type = this.stringToFileFormatter(k); + if (type !== null) { + newConfig.push({ + icon: 'fa-solid ' + DEFAULT_ICONS[type], + label: DEFAULT_LABELS[type], + formatter: type + }); + } else { + alert(k + ' is not a supported download file type'); + } + } + } + config = newConfig; + } + + if (Array.isArray(config)) + { + config = config.map(el => { + if (Object.prototype.toString.call(el) === "[object String]") { + let formatter = this.stringToFileFormatter(el); + if (formatter === null) + return null; + return { + icon: 'fa-solid ' + DEFAULT_ICONS[formatter], + label: DEFAULT_LABELS[formatter], + formatter + }; + } + + if (el instanceof Function) + return { + formatter: el + } + + if (typeof el === 'object' && !Array.isArray(el) && el !== null) { + if (el.formatter instanceof Function) + return el; + if (this.validateFileFormatter(el.formatter)) + return el; + } + + return null; + }).filter(el => el !== null); + + if (config.length < 2) + return config; + + if (config.filter(el => el.label || el.icon).length == config.length) + return config; + + alert('Config not valid'); + } + + return []; + } + }, + methods: { + stringToFileFormatter(input) { + let lcInput = input.toLowerCase(); + + if (lcInput == 'jsonlines') + return 'jsonLines'; + + if (['xlsx', 'pdf', 'html', 'json', 'csv'].includes(lcInput)) + return lcInput; + + return null; + }, + validateFileFormatter(input) { + let formatter = this.stringToFileFormatter(input); + if (!formatter) { + alert(input + ' is not a supported file formatter'); + return false; + } + if (formatter == 'xlsx') { + if (!window.XLSX) { + alert('XLSX Library not loaded'); + return false; + } + } + if (formatter == 'pdf') { + if (!window.jspdf) { + alert('jsPDF Library not loaded'); + return false; + } + var doc = new jspdf.jsPDF({}); + if (!doc.autoTable) { + alert('jsPDF-AutoTable Plugin not loaded'); + return false; + } + } + return true; + }, + download(config) { + this.tabulator.download(config.formatter, config.file, config.options) + } + }, + template: ` + + ` +}; + diff --git a/public/js/components/vueDatepicker.js.php b/public/js/components/vueDatepicker.js.php new file mode 100644 index 000000000..ad9053248 --- /dev/null +++ b/public/js/components/vueDatepicker.js.php @@ -0,0 +1,12 @@ + 20) $("#scrollToTop").show(); @@ -374,155 +370,6 @@ var InfocenterDetails = { } ); }, - getStudienjahrEnd: function() - { - FHC_AjaxClient.ajaxCallGet( - CALLED_PATH + "/getStudienjahrEnd", - null, - { - successCallback: function(data, textStatus, jqXHR) { - if (FHC_AjaxClient.hasData(data)) - { - var engdate = $.datepicker.parseDate("yy-mm-dd", FHC_AjaxClient.getData(data)[0]); - - if (engdate.getDate() === 31) - engdate.setDate(engdate.getDate() - 1); - engdate.setMonth(engdate.getMonth() + 3); - - var gerdate = $.datepicker.formatDate("dd.mm.yy", engdate); - $("#postponedate").val(gerdate); - } - }, - errorCallback: function() - { - FHC_DialogLib.alertError("error when getting Studienjahr end"); - }, - veilTimeout: 0 - } - ); - }, - getPostponeDate: function(personid) - { - FHC_AjaxClient.ajaxCallGet( - CALLED_PATH + "/getPostponeDate/"+encodeURIComponent(personid), - null, - { - successCallback: function(data, textStatus, jqXHR) { - if (FHC_AjaxClient.hasData(data)) - { - var postponeobj = FHC_AjaxClient.getData(data); - InfocenterDetails._refreshPostpone(postponeobj); - InfocenterDetails._refreshLog(); - if (postponeobj === null || postponeobj.type === null) - InfocenterDetails.getStudienjahrEnd(); - } - }, - errorCallback: function() - { - FHC_DialogLib.alertError("error when getting parked status"); - }, - veilTimeout: 0 - } - ); - }, - parkPerson: function(personid, date) - { - var parkError = function(){ - $("#postponemsg").text(" Fehler beim Parken!"); - }; - - FHC_AjaxClient.ajaxCallPost( - CALLED_PATH + '/park', - { - "person_id": personid, - "parkdate": date - }, - { - successCallback: function(data, textStatus, jqXHR) { - if (FHC_AjaxClient.hasData(data)) - InfocenterDetails.getPostponeDate(personid); - else - { - parkError(); - } - }, - errorCallback: parkError, - veilTimeout: 0 - } - ); - }, - unparkPerson: function(personid) - { - FHC_AjaxClient.ajaxCallPost( - CALLED_PATH + '/unpark', - { - "person_id": personid - }, - { - successCallback: function(data, textStatus, jqXHR) { - if (FHC_AjaxClient.hasData(data)) - { - InfocenterDetails.getPostponeDate(personid); - } - else - $("#unpostponemsg").removeClass().addClass("text-warning").text(FHC_PhrasesLib.t('infocenter', 'nichtsZumAusparken')); - }, - errorCallback: function(){ - $("#unpostponemsg").removeClass().addClass("text-danger").text(FHC_PhrasesLib.t('infocenter', 'fehlerBeimAusparken')); - }, - veilTimeout: 0 - } - ); - }, - setPersonOnHold: function(personid, date) - { - var onHoldError = function(){ - $("#postponemsg").text(" Fehler beim Setzen auf On Hold!"); - }; - - FHC_AjaxClient.ajaxCallPost( - CALLED_PATH + '/setOnHold', - { - "person_id": personid, - "onholddate": date - }, - { - successCallback: function(data, textStatus, jqXHR) { - if (FHC_AjaxClient.hasData(data)) - InfocenterDetails.getPostponeDate(personid); - else - { - onHoldError(); - } - }, - errorCallback: onHoldError, - veilTimeout: 0 - } - ); - }, - removePersonOnHold: function(personid) - { - FHC_AjaxClient.ajaxCallPost( - CALLED_PATH + '/removeOnHold', - { - "person_id": personid - }, - { - successCallback: function(data, textStatus, jqXHR) { - if (FHC_AjaxClient.hasData(data)) - { - InfocenterDetails.getPostponeDate(personid); - } - else - $("#unpostponemsg").removeClass().addClass("text-warning").text(FHC_PhrasesLib.t('infocenter', 'nichtsZumEntfernen')); - }, - errorCallback: function(){ - $("#unpostponemsg").removeClass().addClass("text-danger").text(FHC_PhrasesLib.t('infocenter', 'fehlerBeimEntfernen')); - }, - veilTimeout: 0 - } - ); - }, getPrestudentData: function(personid, callback) { FHC_AjaxClient.ajaxCallGet( @@ -943,97 +790,6 @@ var InfocenterDetails = { } ); }, - _refreshPostpone: function(postponeobj) - { - var personid = $("#hiddenpersonid").val(); - if (postponeobj === null || postponeobj.date === null || postponeobj.type === null) - { - //show both park and on hold buttons if not parked and not on hold - $("#postponing").html( - '
    '+ - '     '+ - '     '+ - ''+ - ''+ - '
    '); - - $("#postponedate").datepicker({ - "dateFormat": "dd.mm.yy", - "minDate": 1 - }); - - $("#parklink").click( - - function () - { - var date = $("#postponedate").val(); - InfocenterDetails.parkPerson(personid, date); - } - ); - - $("#onholdlink").click( - - function () - { - var date = $("#postponedate").val(); - InfocenterDetails.setPersonOnHold(personid, date); - } - ); - } - else - { - //info if parked/on hold and possibility to undo parking/on hold - var postponedate = $.datepicker.parseDate("yy-mm-dd", postponeobj.date); - var gerpostponedate = $.datepicker.formatDate("dd.mm.yy", postponedate); - - //var postponehtml = ""; - var callbackforundo = null; - var removePhrase = ""; - var postponedPhrase = ""; - var postponedtext = ""; - - if (postponeobj.type === PARKEDNAME) - { - removePhrase = 'bewerberAusparken'; - postponedtext = FHC_PhrasesLib.t('infocenter', 'bewerberGeparktBis')+'  '+gerpostponedate; - - callbackforundo = function () - { - InfocenterDetails.unparkPerson(personid); - } - } - else if (postponeobj.type === ONHOLDNAME) - { - removePhrase = 'bewerberOnHoldEntfernen'; - postponedtext = FHC_PhrasesLib.t('infocenter', 'bewerberOnHoldBis')+'  '+gerpostponedate; - - var currdate = new Date(); - - if (currdate > postponedate) - postponedtext = ""+postponedtext+""; - - callbackforundo = function () - { - InfocenterDetails.removePersonOnHold(personid); - } - } - - var postponehtml = postponedtext+'     '+ - ' '+ - ''; - - - $("#postponing").html( - postponehtml - ); - - $("#unpostponelink").click( - callbackforundo - ); - } - }, _formatMessageTable: function() { Tablesort.addTablesorter("msgtable", [[0, 1], [2, 0]], ["zebra", "filter"], 2); diff --git a/public/js/infocenter/messageList.js b/public/js/infocenter/messageList.js index 6146c7639..f6eb6218a 100644 --- a/public/js/infocenter/messageList.js +++ b/public/js/infocenter/messageList.js @@ -15,6 +15,7 @@ var MessageList = { statusbar: false, plugins: "autoresize", autoresize_bottom_margin: 10, + max_height:495, autoresize_min_height: 140, autoresize_max_height: 495, //callback to avoid conflict with ajax (for getting body of first message) diff --git a/public/js/infocenter/rueckstellung.js b/public/js/infocenter/rueckstellung.js new file mode 100644 index 000000000..adc99f439 --- /dev/null +++ b/public/js/infocenter/rueckstellung.js @@ -0,0 +1,185 @@ +const CONTROLLER_RUECKSTELLUNG_URL = "system/infocenter/Rueckstellung"; + +var Rueckstellung = { + get: function(personid) + { + FHC_AjaxClient.ajaxCallGet( + CONTROLLER_RUECKSTELLUNG_URL + "/get/"+encodeURIComponent(personid), + null, + { + successCallback: function(data, textStatus, jqXHR) { + if (FHC_AjaxClient.hasData(data)) + { + var rueckstellungobj = FHC_AjaxClient.getData(data); + Rueckstellung._refreshRueckstellung(rueckstellungobj); + } + else + { + Rueckstellung._addRueckstellungButtons(); + } + + }, + errorCallback: function() + { + FHC_DialogLib.alertError("error when getting rueckstellung status"); + }, + veilTimeout: 0 + } + ); + }, + getStatus: function() + { + FHC_AjaxClient.ajaxCallGet( + CONTROLLER_RUECKSTELLUNG_URL + "/getStatus", + null, + { + successCallback: function(data, textStatus, jqXHR) { + if (FHC_AjaxClient.hasData(data)) + { + let status = FHC_AjaxClient.getData(data); + $.each(status, function(key, value) + { + $('#rueckstellungtype').append($(""); + + // fill dropdown with values + for (let i = 0; i < data.length; i++) + { + let val = data[i]; + + // the value selected by default + let selected = val[valueName] === defaultValue ? " selected" : ""; + + // append option + $("#"+dropdownId).append(""); + } + } +}; + +/** + * When JQuery is up + */ +$(document).ready(function() { + + // initiate cascade of getting data, first apps + IssuesKonfiguration.getApps(); + + // get new fehlercodes each time app is changed + $("#"+FEHLERAPP_DROPDOWN_ID).change( + function() + { + IssuesKonfiguration.getFehlerKonfigurationByApp($(this).val()); + } + ); + + // set assign configuration event + $("#assignKonfiguration").click( + function() + { + IssuesKonfiguration.saveFehlerKonfiguration( + $("#"+FEHLERKONFIGURATIONSTYP_DROPDOWN_ID).val(), + $("#"+FEHLERCODE_DROPDOWN_ID).val(), + $("#konfigurationsWert").val() + ); + } + ); + + // set delete configuration event + $("#deleteKonfiguration").click( + function() + { + IssuesKonfiguration.deleteKonfigurationsWerte( + $("#"+FEHLERKONFIGURATIONSTYP_DROPDOWN_ID).val(), + $("#"+FEHLERCODE_DROPDOWN_ID).val(), + $("#konfigurationsWert").val() + ); + } + ); + + // set events for showing info modals + $("#fehlercodeInfoIcon").click( + function() + { + let fehlercode = $("#"+FEHLERCODE_DROPDOWN_ID).val(); + let fehlercodeData = {}; + + for (let i = 0; i < IssuesKonfiguration.fehlercodesArr.length; i++) + { + let fc = IssuesKonfiguration.fehlercodesArr[i]; + console.log(fc); + + if (fc.fehlercode === fehlercode) + { + fehlercodeData = fc; + break; + } + } + + if (!fehlercodeData) + return; + + $("#fehlerInfoLabel").text(fehlercodeData.fehlercode + " - " + fehlercodeData.fehler_kurzbz); + $("#fehlercodeInfo").text(fehlercodeData.fehlercode); + $("#fehlerkurzbzInfo").text(fehlercodeData.fehler_kurzbz); + $("#fehlertypInfo").text(fehlercodeData.fehlertyp_kurzbz); + $("#fehlertextInfo").text(fehlercodeData.fehlertext); + + $("#fehlerInfo").modal("show"); + } + ); + + $("#konfigurationstypInfoIcon").click( + function() + { + let konfigurationstyp_kurzbz = $("#"+FEHLERKONFIGURATIONSTYP_DROPDOWN_ID).val(); + let konfigurationstypData = {}; + + for (let i = 0; i < IssuesKonfiguration.fehlerkonfigArr.length; i++) + { + let konf = IssuesKonfiguration.fehlerkonfigArr[i]; + console.log(konf); + + if (konf.konfigurationstyp_kurzbz === konfigurationstyp_kurzbz) + { + konfigurationstypData = konf; + break; + } + } + + if (!konfigurationstypData) + return; + + $("#konfigurationstypInfo").text(konfigurationstypData.konfigurationstyp_kurzbz); + $("#konfigurationsbeschreibungInfo").text(konfigurationstypData.beschreibung); + $("#konfigurationsdatentypInfo").text(konfigurationstypData.konfigurationsdatentyp); + + $("#konfigurationsInfo").modal("show"); + } + ); + +}); diff --git a/public/js/issues/issuesZustaendigkeiten.js b/public/js/issues/issuesZustaendigkeiten.js index 605868295..2c56fd2da 100644 --- a/public/js/issues/issuesZustaendigkeiten.js +++ b/public/js/issues/issuesZustaendigkeiten.js @@ -289,7 +289,7 @@ var IssuesZustaendigkeiten = { let val = data[i]; // the value selected by default - let selected = val === defaultValue ? " selected" : ""; + let selected = val[valueName] === defaultValue ? " selected" : ""; // append option $("#"+dropdownId).append(""); diff --git a/public/js/issues/plausichecks.js b/public/js/issues/plausichecks.js index f679c9434..cf55cf463 100644 --- a/public/js/issues/plausichecks.js +++ b/public/js/issues/plausichecks.js @@ -20,21 +20,22 @@ var Plausichecks = { if (FHC_AjaxClient.hasData(data)) { - let issueTexts = FHC_AjaxClient.getData(data); + let issueData = FHC_AjaxClient.getData(data); - for (let fehler_kurzbz in issueTexts) + for (let fehler_kurzbz in issueData) { - messageStr += "

    Prüfe " + fehler_kurzbz + "..."; - let texts = issueTexts[fehler_kurzbz]; + let issues = issueData[fehler_kurzbz]['data']; + messageStr += "

    Prüfe " + fehler_kurzbz + " ("+issueData[fehler_kurzbz]['fehlercode']+")..."; - if (texts.length == 0) { + if (issues.length == 0) { messageStr += "
    Keine Issues für " + fehler_kurzbz + ""; continue; } - for (i = 0; i < texts.length; i++) + for (i = 0; i < issues.length; i++) { - messageStr += "
    " + texts[i] + ""; + let className = issues[i].type == 'warning' ? 'text-warning' : 'text-danger'; + messageStr += "
    " + issues[i].fehlertext + ""; } } } @@ -46,7 +47,7 @@ var Plausichecks = { } } ); - }, + } }; diff --git a/public/js/lehre/anrechnung/adminAnrechnung.js b/public/js/lehre/anrechnung/adminAnrechnung.js new file mode 100644 index 000000000..51412bff0 --- /dev/null +++ b/public/js/lehre/anrechnung/adminAnrechnung.js @@ -0,0 +1,242 @@ +// TABULATOR +// --------------------------------------------------------------------------------------------------------------------- + +// Add Edit and Update Buttons to table rows +function func_tableBuilt(table) { + table.addColumn( + { + title: "Aktion", + align: "center", + width: 150, + formatter: addActionButtons, + }, false // place column right + ); + +} + +// Returns relative height (depending on screen size) +function func_height(table){ + return $(window).height() * 0.50; +} + +// Converts string date postgre style to string DD.MM.YYYY. +// This will allow correct filtering. +var formatDate = function(cell, formatterParams){ + let postgreDate = cell.getValue(); + if (postgreDate != null) + { + var d = new Date(postgreDate); + return ("0" + (d.getDate())).slice(-2) + "." + ("0" + (d.getMonth() + 1)).slice(-2) + "." + d.getFullYear(); + } +} + +// Create Edit and Update Buttons for table rows +var addActionButtons = function(cell) { + + // Create edit button + var editBtn = document.createElement("button"); + editBtn.type = "button"; + editBtn.innerHTML = ""; + editBtn.classList.add("azrEditBtn"); + editBtn.classList.add("btn"); + editBtn.classList.add("btn-default"); + editBtn.addEventListener("click", function(){ + adminAnrechnung.editRow(cell); + }); + + + + // Create delete button + var delBtn= document.createElement("button"); + delBtn.type = "button"; + delBtn.innerHTML = ""; + delBtn.classList.add("azrDeleteBtn"); + delBtn.classList.add("btn"); + delBtn.classList.add("btn-default"); + delBtn.style.marginLeft = '5px'; + delBtn.addEventListener("click", function(){ + adminAnrechnung.deleteRow(cell); + }); + + // Add buttons to cell + var buttonHolder = document.createElement("span"); + buttonHolder.appendChild(editBtn); + buttonHolder.appendChild(delBtn); + + return buttonHolder; +} + +// --------------------------------------------------------------------------------------------------------------------- + +$(function () { + + // Empty Modal fields on 'Anrechnungszeitraum hinzufuegen' + $(document).on('click', '.azrOpenModal', function(){ + + let defaultStudiensemester_kurzbz = $('.modal-body #defaultStudiensemester_kurzbz').val(); + + $('.modal-header #azrModalLabel').text(FHC_PhrasesLib.t("anrechnung", "anrechnungszeitraumHinzufuegen")); + + $('.modal-body #anrechnungszeitraum_id').val(''); + $('.modal-body #studiensemester').val(defaultStudiensemester_kurzbz).change(); + $('.modal-body #azrStart').val(''); + $('.modal-body #azrEnde').val(''); + + }); + + // Insert Anrechnungszeitraum + $(document).on('click', '#azrInsertBtn', function(){ + var studiensemester_kurzbz = $('.modal-body #studiensemester').val(); + var anrechnungstart = $('.modal-body #azrStart').val(); + var anrechnungende = $('.modal-body #azrEnde').val(); + + // Insert Anrechnungszeitraum + adminAnrechnung.insertAzr(studiensemester_kurzbz, anrechnungstart, anrechnungende); + }); + +}) + +var adminAnrechnung = { + insertAzr: function(studiensemester_kurzbz, anrechnungstart, anrechnungende){ + FHC_AjaxClient.ajaxCallPost( + FHC_JS_DATA_STORAGE_OBJECT.called_path + "/save", + { + studiensemester_kurzbz: studiensemester_kurzbz, + anrechnungstart: anrechnungstart, + anrechnungende: anrechnungende + }, + { + successCallback: function (data, textStatus, jqXHR) + { + if (FHC_AjaxClient.isError(data)) + { + FHC_DialogLib.alertWarning(FHC_AjaxClient.getError(data)); + } + + if (FHC_AjaxClient.hasData(data)) + { + data = FHC_AjaxClient.getData(data); + + // Update row + $('#tableWidgetTabulator').tabulator('addData', [{ + anrechnungszeitraum_id: data.anrechnungszeitraum_id, + studiensemester_kurzbz: studiensemester_kurzbz, + anrechnungstart: anrechnungstart, + anrechnungende: anrechnungende + }], true); // true to add row on top + + // Close Modal + $('#azrModal').modal('hide'); + + // Success message + FHC_DialogLib.alertSuccess(FHC_PhrasesLib.t("ui", "gespeichert")); + } + }, + errorCallback: function (jqXHR, textStatus, errorThrown) + { + FHC_DialogLib.alertError(FHC_PhrasesLib.t("ui", "systemfehler")); + } + } + ); + }, + editRow: function (cell){ + // Open Modal + $('#azrModal').modal('show'); + + let row = cell.getRow(); + var anrechnungszeitraum_id = row.getData().anrechnungszeitraum_id; + var studiensemester_kurzbz = row.getData().studiensemester_kurzbz; + var anrechnungstart = row.getData().anrechnungstart; + var anrechnungende = row.getData().anrechnungende; + + $('.modal-header #azrModalLabel').text('Anrechnungszeitraum bearbeiten'); + + $('.modal-body #anrechnungszeitraum_id').val(anrechnungszeitraum_id); + $('.modal-body #studiensemester').val(studiensemester_kurzbz).change(); + $('.modal-body #azrStart').val(anrechnungstart); + $('.modal-body #azrEnde').val(anrechnungende); + + }, + updateAzr: function (anrechnungszeitraum_id, studiensemester_kurzbz, anrechnungstart, anrechnungende) { + FHC_AjaxClient.ajaxCallPost( + FHC_JS_DATA_STORAGE_OBJECT.called_path + "/edit", + { + anrechnungszeitraum_id: anrechnungszeitraum_id, + studiensemester_kurzbz: studiensemester_kurzbz, + anrechnungstart: anrechnungstart, + anrechnungende: anrechnungende + }, + { + successCallback: function (data, textStatus, jqXHR) + { + if (FHC_AjaxClient.isError(data)) + { + FHC_DialogLib.alertWarning(FHC_AjaxClient.getError(data)); + } + + if (FHC_AjaxClient.hasData(data)) + { + // Update row + $('#tableWidgetTabulator').tabulator('updateData', [{ + anrechnungszeitraum_id: anrechnungszeitraum_id, + studiensemester_kurzbz: studiensemester_kurzbz, + anrechnungstart: anrechnungstart, + anrechnungende: anrechnungende + }]); + + // Close Modal + $('#azrModal').modal('hide'); + + // Success message + FHC_DialogLib.alertSuccess(FHC_PhrasesLib.t("ui", "gespeichert")); + + } + }, + errorCallback: function (jqXHR, textStatus, errorThrown) + { + FHC_DialogLib.alertError(FHC_PhrasesLib.t("ui", "systemfehler")); + } + } + ); + }, + deleteAzr: function(anrechnungszeitraum_id){ + FHC_AjaxClient.ajaxCallPost( + FHC_JS_DATA_STORAGE_OBJECT.called_path + "/delete", + { + anrechnungszeitraum_id: anrechnungszeitraum_id + }, + { + successCallback: function (data, textStatus, jqXHR) + { + if (FHC_AjaxClient.isError(data)) + { + FHC_DialogLib.alertWarning(FHC_AjaxClient.getError(data)); + } + + if (FHC_AjaxClient.hasData(data)) + { + let row = $('#tableWidgetTabulator').tabulator('getRow', anrechnungszeitraum_id); + row.delete(anrechnungszeitraum_id); + + // Success message + FHC_DialogLib.alertSuccess(FHC_PhrasesLib.t("ui", "geloescht")); + + } + }, + errorCallback: function (jqXHR, textStatus, errorThrown) + { + FHC_DialogLib.alertError(FHC_PhrasesLib.t("ui", "systemfehler")); + } + } + ); + }, + deleteRow: function (cell){ + if(!confirm(FHC_PhrasesLib.t("ui", "frageSicherLoeschen"))) + { + return; + } + + // Delete Anrechnungszeitraum + adminAnrechnung.deleteAzr(cell.getRow().getData().anrechnungszeitraum_id); + } +} \ No newline at end of file diff --git a/public/js/lehre/anrechnung/approveAnrechnungDetail.js b/public/js/lehre/anrechnung/approveAnrechnungDetail.js index 3a91f4e3a..3a40503b5 100644 --- a/public/js/lehre/anrechnung/approveAnrechnungDetail.js +++ b/public/js/lehre/anrechnung/approveAnrechnungDetail.js @@ -141,6 +141,13 @@ $(function(){ return; } + // Check if forgot to fulfill begruendung + if (begruendung.trim().endsWith('weil') || begruendung.endsWith('because of')) + { + FHC_DialogLib.alertInfo(FHC_PhrasesLib.t("ui", "bitteBegruendungVervollstaendigen")); + return; + } + // Get form data let form_data = $('form').serializeArray(); @@ -194,17 +201,9 @@ $(function(){ // Get form data let form_data = $('#form-empfehlung').serializeArray(); - - // Prepare data object for ajax call - let data = { - 'data': [{ - 'anrechnung_id' : form_data[0].value - }] - }; - FHC_AjaxClient.ajaxCallPost( FHC_JS_DATA_STORAGE_OBJECT.called_path + "/requestRecommendation", - data, + {anrechnung_id: form_data[0].value}, { successCallback: function (data, textStatus, jqXHR) { @@ -471,11 +470,27 @@ var approveAnrechnungDetail = { textarea.val($.trim($('#approveAnrechnungDetail-empfehlungDetail-begruendung').text())); return; } - else + + // Find Begruendung span + let textspan = $(elem).parent().find('span:first'); + + // Get Begruendung + let begruendung = textspan.text(); + + // Check if Begruendung has helptext + let hasHelptext = textspan.children('span #helpTxtBegruendungErgaenzen').length > 0; + + if (hasHelptext) { - // Copy begruendung into textarea - textarea.val($.trim($(elem).parent().find('span:first').text())); + let helptext = textspan.children('span #helpTxtBegruendungErgaenzen').text(); + + // Remove helptext + begruendung = begruendung.replace(helptext, ''); + } + + // Copy begruendung into textarea and set focus + textarea.val($.trim(begruendung)).focus(); }, formatEmpfehlungIsRequested: function(statusBezeichnung, empfehlungsanfrageAm, empfehlungsanfrageAn) { $('#approveAnrechnungDetail-empfehlungDetail-empfehlungsanfrageAm').html(empfehlungsanfrageAm); diff --git a/public/js/lehre/anrechnung/approveAnrechnungUebersicht.js b/public/js/lehre/anrechnung/approveAnrechnungUebersicht.js index cdd0cfd07..a2bc5daff 100644 --- a/public/js/lehre/anrechnung/approveAnrechnungUebersicht.js +++ b/public/js/lehre/anrechnung/approveAnrechnungUebersicht.js @@ -57,6 +57,12 @@ function hf_filterTrueFalse(headerValue, rowValue){ } } +// Filters schreibberechtigt boolean values +function hf_schreibberechtigt(headerValue, rowValue){ + + return rowValue == headerValue.toString(); +} + // Adds column details // Sets focus on filterbutton, if table starts with stored filter. function func_tableBuilt(table) { @@ -173,19 +179,22 @@ function func_selectableCheck(row){ // data = selected data, rows = selected rows function func_rowSelectionChanged(data, rows){ - // Sum up over all anzurechnenden LV-ECTS by Prestudent - selectedPrestudentWithAccumulatedLvEcts = approveAnrechnung.getSumLvEctsByPreStudent(data); + if (tabulator != null) + { + // Sum up over all anzurechnenden LV-ECTS by Prestudent + selectedPrestudentWithAccumulatedLvEcts = approveAnrechnung.getSumLvEctsByPreStudent(data); - // Loop through all active rows - var rowManager = tabulator.rowManager; - for (var i = 0; i < rowManager.activeRows.length; i++) { + // Loop through all active rows + var rowManager = tabulator.rowManager; + for (var i = 0; i < rowManager.activeRows.length; i++) { - // Reinitialize row -> triggers formatters. - rowManager.activeRows[i].reinitialize(); + // Reinitialize row -> triggers formatters. + rowManager.activeRows[i].reinitialize(); + } + + // Show number of selected rows. + approveAnrechnung.showNumberSelectedRows(rows); } - - // Show number of selected rows. - approveAnrechnung.showNumberSelectedRows(rows); } // Returns tooltip @@ -570,12 +579,8 @@ $(function(){ } } - selected_data.map(function(data){ - // reduce to necessary fields - return { - 'anrechnung_id' : data.anrechnung_id, - } - }); + // Reduce to necessary fields + selected_data = selected_data.map(data => ({'anrechnung_id' : data.anrechnung_id})); // Alert and exit if no anrechnung is selected if (selected_data.length == 0) @@ -584,14 +589,9 @@ $(function(){ return; } - // Prepare data object for ajax call - let data = { - 'data': selected_data - }; - FHC_AjaxClient.ajaxCallPost( FHC_JS_DATA_STORAGE_OBJECT.called_path + "/requestRecommendation", - data, + {data: selected_data}, { successCallback: function (data, textStatus, jqXHR) { @@ -617,14 +617,14 @@ $(function(){ // Print success message FHC_DialogLib.alertSuccess(FHC_PhrasesLib.t("ui", "empfehlungWurdeAngefordert")); } + + //Update status 'genehmigt' + $('#tableWidgetTabulator').tabulator('updateData', data); + + // Deselect rows + var indexesToDeselect = data.map(x => x.anrechnung_id); + $("#tableWidgetTabulator").tabulator('deselectRow', indexesToDeselect); } - - //Update status 'genehmigt' - $('#tableWidgetTabulator').tabulator('updateData', data); - - // Deselect rows - var indexesToDeselect = data.map(x => x.anrechnung_id); - $("#tableWidgetTabulator").tabulator('deselectRow', indexesToDeselect); }, errorCallback: function (jqXHR, textStatus, errorThrown) { @@ -701,8 +701,8 @@ var approveAnrechnung = { // Find closest textarea let textarea = $(elem).closest('div').find('textarea'); - // Copy begruendung into textarea - textarea.val($.trim($(elem).parent().text())); + // Copy begruendung into textarea and set focus + textarea.val($.trim($(elem).parent().text())).focus(); }, focusFilterbuttonIfTableStartsWithStoredFilter(filters){ switch (filters[0].value) { diff --git a/public/js/lehre/anrechnung/requestAnrechnung.js b/public/js/lehre/anrechnung/requestAnrechnung.js index 5edb4e162..2947aebe9 100644 --- a/public/js/lehre/anrechnung/requestAnrechnung.js +++ b/public/js/lehre/anrechnung/requestAnrechnung.js @@ -1,6 +1,9 @@ const ANRECHNUNGSTATUS_APPROVED = 'approved'; const ANRECHNUNGSTATUS_REJECTED = 'rejected'; -const HERKUNFT_DER_KENNTNISSE_MAX_LENGTH = 125; +const CHAR_LENGTH125 = 125; +const CHAR_LENGTH150 = 150; +const CHAR_LENGTH500 = 500; +const CHAR_LENGTH1000 = 1000; const COLOR_DANGER = '#f2dede'; @@ -25,7 +28,7 @@ $(function(){ // Alert message inside Begruendungsbox, if maximum ECTS exceeded requestAnrechnung.alertIfMaxEctsExceededInsideBegruendungsbox(); - // Set chars counter for textarea 'Herkunft der Kenntnisse' + // Set chars counter for textareas requestAnrechnung.setCharsCounter(); // If Sperregrund exists: display Sperre panel, hide Status panel and disable all form elements @@ -98,6 +101,8 @@ $(function(){ begruendung: this.begruendung.value, lv_id: this.lv_id.value, studiensemester: this.studiensemester.value, + begruendung_ects: this.begruendung_ects.value, + begruendung_lvinhalt: this.begruendung_lvinhalt.value, bestaetigung: this.bestaetigung.value, uploadfile: this.uploadfile.files }, @@ -207,11 +212,22 @@ var requestAnrechnung = { }, setCharsCounter: function(){ $('#requestAnrechnung-herkunftDerKenntnisse').keyup(function() { - - let length = HERKUNFT_DER_KENNTNISSE_MAX_LENGTH - $(this).val().length; - + let length = CHAR_LENGTH125 - $(this).val().length; $('#requestAnrechnung-herkunftDerKenntnisse-charCounter').text(length); }); + + $('#requestAnrechnung-begruendungEcts').keyup(function() { + let length = CHAR_LENGTH150 - $(this).val().length; + $('#requestAnrechnung-begruendungEcts-charCounter').text(length); + }); + + $('#requestAnrechnung-begruendungLvinhalt').keyup(function() { + let maxlength = CHAR_LENGTH1000 - $(this).val().length; + $('#requestAnrechnung-begruendungLvinhalt-charCounterMax').text(maxlength); + + let minlength = CHAR_LENGTH500 - $(this).val().length; + $('#requestAnrechnung-begruendungLvinhalt-charCounterMin').text(minlength); + }); }, formatAnrechnungIsApplied: function (antragdatum, dms_id, filename){ $('#requestAnrechnung-antragdatum').text(antragdatum); diff --git a/public/js/lehre/anrechnung/reviewAnrechnungDetail.js b/public/js/lehre/anrechnung/reviewAnrechnungDetail.js index fc26f4577..e8142ea05 100644 --- a/public/js/lehre/anrechnung/reviewAnrechnungDetail.js +++ b/public/js/lehre/anrechnung/reviewAnrechnungDetail.js @@ -133,6 +133,13 @@ $(function(){ return; } + // Check if forgot to fulfill begruendung + if (begruendung.trim().endsWith('weil') || begruendung.endsWith('because of')) + { + FHC_DialogLib.alertInfo(FHC_PhrasesLib.t("ui", "bitteBegruendungVervollstaendigen")); + return; + } + // Get form data let form_data = $('form').serializeArray(); @@ -241,8 +248,26 @@ var reviewAnrechnung = { // Find closest textarea let textarea = $(elem).closest('div').find('textarea'); - // Copy begruendung into textarea - textarea.val($.trim($(elem).parent().find('span:first').text())); + // Find Begruendung span + let textspan = $(elem).parent().find('span:first'); + + // Get Begruendung + let begruendung = textspan.text(); + + // Check if Begruendung has helptext + let hasHelptext = textspan.children('span #helpTxtBegruendungErgaenzen').length > 0; + + if (hasHelptext) + { + let helptext = textspan.children('span #helpTxtBegruendungErgaenzen').text(); + + // Remove helptext + begruendung = begruendung.replace(helptext, ''); + } + + // Copy begruendung into textarea and set focus + textarea.val($.trim(begruendung)).focus(); + }, formatEmpfehlungIsTrue: function(empfehlungAm, emfehlungVon, statusBezeichnung){ $('#reviewAnrechnungDetail-status_kurzbz').text(statusBezeichnung); diff --git a/public/js/lehre/anrechnung/reviewAnrechnungUebersicht.js b/public/js/lehre/anrechnung/reviewAnrechnungUebersicht.js index b0134b5a3..c71b85274 100644 --- a/public/js/lehre/anrechnung/reviewAnrechnungUebersicht.js +++ b/public/js/lehre/anrechnung/reviewAnrechnungUebersicht.js @@ -51,6 +51,12 @@ function hf_filterTrueFalse(headerValue, rowValue){ } } +// Filters empfehlungsberechtigt boolean values +function hf_empfehlungsberechtigt(headerValue, rowValue){ + + return rowValue == headerValue.toString(); +} + // Adds column details function func_tableBuilt(table) { table.addColumn( @@ -74,9 +80,10 @@ function func_tableBuilt(table) { // Formats the rows function func_rowFormatter(row){ let status_kurzbz = row.getData().status_kurzbz; + let empfehlungsberechtigt = row.getData().empfehlungsberechtigt; row.getCells().forEach(function(cell){ - if (status_kurzbz != ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR) + if (status_kurzbz != ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR || empfehlungsberechtigt == "false") { row.getElement().style["background-color"] = COLOR_LIGHTGREY; // default } @@ -86,9 +93,10 @@ function func_rowFormatter(row){ // Formats row selectable/unselectable function func_selectableCheck(row){ let status_kurzbz = row.getData().status_kurzbz; + let empfehlungsberechtigt = row.getData().empfehlungsberechtigt; return ( - status_kurzbz == ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR + status_kurzbz == ANRECHNUNGSTATUS_PROGRESSED_BY_LEKTOR || empfehlungsberechtigt == "false" ); } @@ -441,7 +449,7 @@ var reviewAnrechnung = { // Find closest textarea let textarea = $(elem).closest('div').find('textarea'); - // Copy begruendung into textarea - textarea.val($.trim($(elem).parent().text())); + // Copy begruendung into textarea and set focus + textarea.val($.trim($(elem).parent().text())).focus(); } } diff --git a/public/js/messaging/fasMessageWrite.js b/public/js/messaging/fasMessageWrite.js new file mode 100644 index 000000000..ee480eb31 --- /dev/null +++ b/public/js/messaging/fasMessageWrite.js @@ -0,0 +1,154 @@ +// ******************************************************** +// JS used by view system/messages/htmlWriteTemplate +// ******************************************************** + +function tinymcePreviewSetContent() +{ + if ($("#tinymcePreview")) + { + if ($("#recipients").children(":selected").val() > -1) + { + parseMessageText($("#recipients").children(":selected").val(), tinyMCE.get("bodyTextArea").getContent()); + } + else + { + tinyMCE.get("tinymcePreview").setContent(""); + } + } +} + +function parseMessageText(receiver_id, text) +{ + FHC_AjaxClient.ajaxCallPost( + "system/messages/Messages/parseMessageText", + { + receiver_id: receiver_id, + text: text, + type: $("#type").val() + }, + { + successCallback: function(data, textStatus, jqXHR) { + + if (FHC_AjaxClient.hasData(data)) + { + tinyMCE.get("tinymcePreview").setContent(FHC_AjaxClient.getData(data)); + } + else if (FHC_AjaxClient.isError(data)) + { + FHC_DialogLib.alertError(data.retval); + } + } + } + ); +} + +$(document).ready(function () +{ + + tinymce.init({ + theme : "advanced", + mode : "specific_textareas", + editor_selector: "bodyTextArea", + theme_advanced_buttons2: "undo, redo, outdent, indent, bullist, numlist, link", + theme_advanced_buttons3: "", + theme_advanced_buttons4: "", + theme_advanced_toolbar_location: "top", + height: "400px", + }); + + tinymce.init({ + theme : "advanced", + mode : "specific_textareas", + editor_selector: "tinymcePreview", + height: 400, + readonly: 1, + }); + + if ($("#variables")) + { + $("#variables").dblclick(function () + { + if ($("#bodyTextArea")) + { + //if editor active add at cursor position, otherwise at end + if (tinymce.activeEditor.id === "bodyTextArea") + tinymce.activeEditor.execCommand('mceInsertContent', false, $(this).children(":selected").val()); + else + tinyMCE.get("bodyTextArea").setContent(tinyMCE.get("bodyTextArea").getContent() + $(this).children(":selected").val()); + } + }); + } + + if ($("#user_fields")) + { + $("#user_fields").dblclick(function () + { + if ($("#bodyTextArea")) + { + //if editor active add at cursor position, otherwise at end + if (tinymce.activeEditor.id === "bodyTextArea") + tinymce.activeEditor.execCommand('mceInsertContent', false, $(this).children(":selected").val()); + else + tinyMCE.get("bodyTextArea").setContent(tinyMCE.get("bodyTextArea").getContent() + $(this).children(":selected").val()); + } + }); + } + + if ($("#recipients")) + { + $("#recipients").change(tinymcePreviewSetContent); + } + + if ($("#refresh")) + { + $("#refresh").click(tinymcePreviewSetContent); + } + + if ($("#sendButton") && $("#sendForm")) + { + $("#sendButton").click(function () + { + if ($("#subject") && $("#subject").val() != '' && tinyMCE.get("bodyTextArea").getContent() != '') + { + $("#sendForm").submit(); + } + else + { + FHC_DialogLib.alertInfo("Subject and text are required fields!"); + } + }); + } + + if ($("#vorlageDnD")) + { + $("#vorlageDnD").change(function () + { + var vorlage_kurzbz = this.value; + + if (vorlage_kurzbz != '') + { + FHC_AjaxClient.ajaxCallGet( + "system/messages/Messages/getVorlage", + { + vorlage_kurzbz: vorlage_kurzbz + }, + { + successCallback: function(data, textStatus, jqXHR) { + + if (FHC_AjaxClient.hasData(data)) + { + var msg = FHC_AjaxClient.getData(data); + + tinyMCE.get("bodyTextArea").setContent(msg[0].text); + $("#subject").val(msg[0].subject); + } + } + } + ); + } + }); + } + + $("#subject").focus(); + +}); diff --git a/public/js/messaging/messageWrite.js b/public/js/messaging/messageWrite.js index 8b1d73bdf..5132c0b7f 100644 --- a/public/js/messaging/messageWrite.js +++ b/public/js/messaging/messageWrite.js @@ -42,11 +42,14 @@ function parseMessageText(receiver_id, text) ); } -$(document).ready(function () -{ +$(document).ready(function () { + tinymce.init({ selector: "#bodyTextArea", - plugins: "autoresize", + plugins: "link", + toolbar: "undo redo | presentation | bold italic | link | alignleft aligncenter alignright alignjustify | outdent indent", + min_height: 400, + max_height: 700, autoresize_on_init: false, autoresize_min_height: 400, autoresize_max_height: 400, @@ -60,7 +63,14 @@ $(document).ready(function () menubar: false, toolbar: false, statusbar: false, - readonly: 1 + readonly: 1, + min_height: 400, + max_height: 700, + autoresize_on_init: false, + autoresize_min_height: 400, + autoresize_max_height: 700, + autoresize_bottom_margin: 10, + auto_focus: "bodyTextArea" }); if ($("#variables")) diff --git a/public/js/messaging/messageWriteReply.js b/public/js/messaging/messageWriteReply.js index c6401ded2..318a83280 100644 --- a/public/js/messaging/messageWriteReply.js +++ b/public/js/messaging/messageWriteReply.js @@ -6,7 +6,9 @@ $(document).ready(function () { tinymce.init({ selector: "#bodyTextArea", - plugins: "autoresize", + plugins: "autoresize, link", + toolbar: "undo redo | presentation | bold italic | link | alignleft aligncenter alignright alignjustify | outdent indent", + max_height: 600, autoresize_min_height: 150, autoresize_max_height: 600, autoresize_bottom_margin: 10, diff --git a/public/js/messaging/read.js b/public/js/messaging/read.js index b4b1573a2..d38365467 100644 --- a/public/js/messaging/read.js +++ b/public/js/messaging/read.js @@ -220,6 +220,7 @@ $(document).ready(function () { statusbar: false, readonly: 1, autoresize_min_height: 300, + max_height: 600, autoresize_bottom_margin: 0 }); diff --git a/public/js/messaging/write.js b/public/js/messaging/write.js index 1370fb2e0..46336b8eb 100644 --- a/public/js/messaging/write.js +++ b/public/js/messaging/write.js @@ -62,8 +62,11 @@ $(document).ready(function () { // tinymce.init({ selector: "#body", - plugins: "autoresize", - autoresize_min_height: 150, + plugins: "autoresize, link", + toolbar: "undo redo | presentation | bold italic | link | alignleft aligncenter alignright alignjustify | outdent indent", + min_height: 300, + max_height: 600, + autoresize_min_height: 300, autoresize_max_height: 600, autoresize_bottom_margin: 10 }); diff --git a/public/js/messaging/writeReply.js b/public/js/messaging/writeReply.js index c78748889..df195d20f 100644 --- a/public/js/messaging/writeReply.js +++ b/public/js/messaging/writeReply.js @@ -37,7 +37,9 @@ $(document).ready(function () { // tinymce.init({ selector: "#body", - plugins: "autoresize", + plugins: "autoresize, link", + toolbar: "undo redo | presentation | bold italic | link | alignleft aligncenter alignright alignjustify | outdent indent", + max_height: 600, autoresize_min_height: 150, autoresize_max_height: 600, autoresize_bottom_margin: 10 diff --git a/public/js/mixins/Phrasen.js b/public/js/mixins/Phrasen.js new file mode 100644 index 000000000..6c27f87bb --- /dev/null +++ b/public/js/mixins/Phrasen.js @@ -0,0 +1,105 @@ +const categories = {}; +const loadingModules = {}; + +function extractCategory(obj, category) { + return obj.filter(e => e.category == category).reduce((res, elem) => { + if (!res[elem.phrase]) + res[elem.phrase] = elem.text; + return res; + }, {}); +} +function reloadRefs(category) { + while (loadingModules[category].length) { + var v = loadingModules[category].pop(); + v[0].value = getValueForLoadedPhrase(category, v[1], v[2]); + Vue.triggerRef(v[0]); + /*Vue.unref(v);*/ + } +} +function loadLazy(category, val, phrase, params) { + // NOTE(chris): load module if it's not loaded yet + if (loadingModules[category]) { + loadingModules[category].push([val, phrase, params]); + if (categories[category]) // NOTE(chris): this is for safety in case the loading finished the moment before the val was pushed into the array + reloadRefs(category); + return; + } + loadingModules[category] = [[val, phrase, params]]; + + axios.get(FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + '/components/Phrasen/loadModule/' + category).then(res => { + if (res.data.retval) + categories[category] = extractCategory(res.data.retval, category); + else + categories[category] = {}; + + reloadRefs(category); + }).catch(err => console.error(err)); +} +function getValueForLoadedPhrase(category, phrase, params) { + let result = categories[category][phrase]; + if (!result) + return '<< PHRASE ' + phrase + '>>'; + if (params) + result = result.replace(/\{([^}]*)\}/g, (match, p1) => params[p1] === undefined ? match : params[p1]); + return result; +} + + +const phrasen = { + t_ref(category, phrase, params) { + if (params === undefined && ( + (Array.isArray(category) && category.length == 2) || + (category.split && category.split('/').length == 2)) + ) { + params = phrase; + [category, phrase] = category.split ? category.split('/') : category; + } + if (phrase === undefined) { + console.error('invalid input'); + return ''; + } + if (!categories[category]) { + + var initialval = ''; + if (window.FHC_JS_PHRASES_STORAGE_OBJECT !== undefined) { + var tmp_category = extractCategory(FHC_JS_PHRASES_STORAGE_OBJECT, category); + if(tmp_category[phrase] !== undefined ) { + initialval = tmp_category[phrase]; + } + } + + if (!categories[category] || Object.keys(categories[category]).length === 0) { + categories[category] = undefined; + let val = Vue.ref(initialval); + loadLazy(category, val, phrase, params); + return val; + } + } + var result = getValueForLoadedPhrase(category, phrase, params); + return Vue.ref(result); + }, + t(category, phrase, params) { + return Vue.unref(this.t_ref(category, phrase, params)); + } +}; + +export default { + data: () => { + return { + p: phrasen + } + } +} + +// Composable (wrapper for mixin) +export function usePhrasen() { + + function t(category, phrase, params) { + return phrasen.t(category, phrase, params); + } + + return { + t, + } + +} diff --git a/public/js/plugin/Phrasen.js b/public/js/plugin/Phrasen.js new file mode 100644 index 000000000..162dc2179 --- /dev/null +++ b/public/js/plugin/Phrasen.js @@ -0,0 +1,67 @@ +const categories = Vue.reactive({}); +const loadingModules = {}; + +function extractCategory(obj, category) { + return obj.filter(e => e.category == category).reduce((res, elem) => { + if (!res[elem.phrase]) + res[elem.phrase] = elem.text; + return res; + }, {}); +} +function getValueForLoadedPhrase(category, phrase, params) { + let result = categories[category][phrase]; + if (!result) + return '<< PHRASE ' + phrase + '>>'; + if (params) + result = result.replace(/\{([^}]*)\}/g, (match, p1) => params[p1] === undefined ? match : params[p1]); + return result; +} + + +const phrasen = { + loadCategory(category) { + if (Array.isArray(category)) + return Promise.all(category.map(cat => this.loadCategory(cat))); + if (!loadingModules[category]) + loadingModules[category] = axios + .get(FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + '/components/Phrasen/loadModule/' + category) + .then(res => { + if (res.data.retval) + categories[category] = extractCategory(res.data.retval, category); + else + categories[category] = {}; + }); + return loadingModules[category]; + }, + t_ref(category, phrase, params) { + console.warn('depricated'); + return Vue.computed(() => this.t(category, phrase, params)); + }, + t(category, phrase, params) { + if (params === undefined && ( + (Array.isArray(category) && category.length == 2) || + (category.split && category.split('/').length == 2)) + ) { + params = phrase; + [category, phrase] = category.split ? category.split('/') : category; + } + if (phrase === undefined) { + console.error('invalid input', category, phrase, params); + return ''; + } + let val = Vue.computed(() => { + if (!categories[category]) + return ''; + return getValueForLoadedPhrase(category, phrase, params); + }); + if (!categories[category]) + this.loadCategory(category); + return val.value; + } +}; + +export default { + install(app, options) { + app.config.globalProperties.$p = phrasen; + } +} diff --git a/public/js/tabulator/filters/Dates.js b/public/js/tabulator/filters/Dates.js new file mode 100644 index 000000000..7c9f268f0 --- /dev/null +++ b/public/js/tabulator/filters/Dates.js @@ -0,0 +1,43 @@ +if (!primevue) { + console.error('PrimeVue not loaded!'); +} + +// NOTE(chris): Click on clear button gives an error. This is a bug in primevue => fixed in current version +Tabulator.extendModule('filter', 'filters', { + "dates": (headerValue, rowValue) => { + if (!headerValue) + return true; + let v = new Date(rowValue); + if (Array.isArray(headerValue)) { + if (headerValue[1]) { + return v >= headerValue[0] && v <= headerValue[1].setHours(23, 59, 59, 999); + } + return v.toDateString() == headerValue[0].toDateString(); + } + return v.toDateString() == headerValue.toDateString(); + } +}); +function dateFilter(cell, onRendered, success) { + let div = document.createElement('div'); + + Vue.createApp({ + components: { + PrimevueCalendar: primevue.calendar + }, + data() { + return { + val: null + } + }, + watch: { + val(n) { + success(n); + } + }, + template: `` + }).use(primevue.config.default).mount(div); + + return div; +} + +export { dateFilter as 'dateFilter' }; diff --git a/rdf/AntragAbmeldung.xml.php b/rdf/AntragAbmeldung.xml.php new file mode 100644 index 000000000..515b1809a --- /dev/null +++ b/rdf/AntragAbmeldung.xml.php @@ -0,0 +1,71 @@ +db_add_param($id) . " + AND a.typ = 'Abmeldung' AND campus.get_status_studierendenantrag(a.studierendenantrag_id) = 'Genehmigt';"; + $not_found_error = 'Studierendenantrag not found'. $id; + } elseif(isset($_GET['uid']) && isset($_GET['prestudent_id'])) { + $uid = $_GET['uid']; + $uid = explode(';', $uid); + $uid = (array_filter($uid, 'strlen')); + + $prestudent_id = $_GET['prestudent_id']; + $prestudent_id = explode(';', $prestudent_id); + $prestudent_id = (array_filter($prestudent_id, 'strlen')); + + $where = " WHERE a.prestudent_id in (" . $db->db_implode4SQL($prestudent_id) . ") + AND a.typ = 'Abmeldung' AND campus.get_status_studierendenantrag(a.studierendenantrag_id) = 'Genehmigt';"; + $not_found_error = 'Studierendenantrag not found for: ' . implode(',', $uid); + } else + die('wrong parameters'); +} +else + die('Format not supported'); + + +$query = " + SELECT stg.bezeichnung, bezeichnung_mehrsprachig[(SELECT index FROM public.tbl_sprache WHERE sprache=" . $db->db_add_param(getSprache(), FHC_STRING) . ")], studierendenantrag_id, matrikelnr, studienjahr_kurzbz, a.studiensemester_kurzbz, vorname, nachname, studiengang_kz, public.get_absem_prestudent(a.prestudent_id, NULL) AS semester, a.grund + FROM + campus.tbl_studierendenantrag a + JOIN public.tbl_student USING (prestudent_id) + JOIN public.tbl_benutzer ON tbl_student.student_uid=uid + JOIN public.tbl_person USING (person_id) + JOIN public.tbl_studiengang stg USING (studiengang_kz) + JOIN public.tbl_studiensemester USING (studiensemester_kurzbz) + LEFT JOIN public.tbl_prestudentstatus pss ON (pss.prestudent_id = a.prestudent_id AND pss.studiensemester_kurzbz=a.studiensemester_kurzbz AND pss.status_kurzbz=get_rolle_prestudent(a.prestudent_id, a.studiensemester_kurzbz)) + LEFT JOIN lehre.tbl_studienplan plan USING (studienplan_id) + JOIN bis.tbl_orgform ON (tbl_orgform.orgform_kurzbz = COALESCE(plan.orgform_kurzbz, pss.orgform_kurzbz, stg.orgform_kurzbz))" . $where; + + +if (!$db->db_query($query) || !$db->db_num_rows()) + die('' . $not_found_error . ''); + +?> + + + db_fetch_object()) { ?> + + vorname . ' ' . $row->nachname); ?>]]> + bezeichnung; ?>]]> + bezeichnung_mehrsprachig; ?>]]> + matrikelnr; ?>]]> + studienjahr_kurzbz; ?>]]> + studiensemester_kurzbz; ?>]]> + semester; ?>]]> + grund; ?>]]> + + + + diff --git a/rdf/AntragAbmeldungStgl.xml.php b/rdf/AntragAbmeldungStgl.xml.php new file mode 100644 index 000000000..4511be232 --- /dev/null +++ b/rdf/AntragAbmeldungStgl.xml.php @@ -0,0 +1,70 @@ +db_add_param($id) . " + AND a.typ = 'AbmeldungStgl' AND campus.get_status_studierendenantrag(a.studierendenantrag_id) IN ('Genehmigt', 'Beeinsprucht', 'EinspruchAbgelehnt');"; + $not_found_error = 'Studierendenantrag not found'. $id; + } elseif(isset($_GET['uid']) && isset($_GET['prestudent_id'])) { + $uid = $_GET['uid']; + $uid = explode(';', $uid); + $uid = (array_filter($uid, 'strlen')); + + $prestudent_id = $_GET['prestudent_id']; + $prestudent_id = explode(';', $prestudent_id); + $prestudent_id = (array_filter($prestudent_id, 'strlen')); + + $where = " WHERE a.prestudent_id in (" . $db->db_implode4SQL($prestudent_id) . ") + AND a.typ = 'AbmeldungStgl' AND campus.get_status_studierendenantrag(a.studierendenantrag_id) IN ('Genehmigt', 'Beeinsprucht', 'EinspruchAbgelehnt');"; + $not_found_error = 'Studierendenantrag not found for: ' . implode(',', $uid); + } else + die('wrong parameters'); +} +else + die('Format not supported'); + + +$query = " + SELECT stg.bezeichnung, bezeichnung_mehrsprachig[(SELECT index FROM public.tbl_sprache WHERE sprache=" . $db->db_add_param(getSprache(), FHC_STRING) . ")], studierendenantrag_id, matrikelnr, studienjahr_kurzbz, a.studiensemester_kurzbz, vorname, nachname, studiengang_kz, public.get_absem_prestudent(a.prestudent_id, NULL) AS semester, a.grund + FROM + campus.tbl_studierendenantrag a + JOIN public.tbl_student USING (prestudent_id) + JOIN public.tbl_benutzer ON tbl_student.student_uid=uid + JOIN public.tbl_person USING (person_id) + JOIN public.tbl_studiengang stg USING (studiengang_kz) + JOIN public.tbl_studiensemester USING (studiensemester_kurzbz) + LEFT JOIN public.tbl_prestudentstatus pss ON (pss.prestudent_id = a.prestudent_id AND pss.studiensemester_kurzbz=a.studiensemester_kurzbz AND pss.status_kurzbz=get_rolle_prestudent(a.prestudent_id, a.studiensemester_kurzbz)) + LEFT JOIN lehre.tbl_studienplan plan USING (studienplan_id) + JOIN bis.tbl_orgform ON (tbl_orgform.orgform_kurzbz = COALESCE(plan.orgform_kurzbz, pss.orgform_kurzbz, stg.orgform_kurzbz))" . $where; + + +if (!$db->db_query($query) || !$db->db_num_rows()) + die('' . $not_found_error . ''); + +?> + + + db_fetch_object()) { ?> + + vorname . ' ' . $row->nachname); ?>]]> + bezeichnung; ?>]]> + bezeichnung_mehrsprachig; ?>]]> + matrikelnr; ?>]]> + studienjahr_kurzbz; ?>]]> + studiensemester_kurzbz; ?>]]> + semester; ?>]]> + grund; ?>]]> + + + diff --git a/rdf/AntragUnterbrechung.xml.php b/rdf/AntragUnterbrechung.xml.php new file mode 100644 index 000000000..ff3e68afa --- /dev/null +++ b/rdf/AntragUnterbrechung.xml.php @@ -0,0 +1,75 @@ +db_add_param($id) . " + AND a.typ = 'Unterbrechung' AND campus.get_status_studierendenantrag(a.studierendenantrag_id) IN ('Genehmigt', 'EmailVersandt');"; + $not_found_error = 'Studierendenantrag not found'. $id; + } elseif(isset($_GET['uid']) && isset($_GET['prestudent_id'])) { + $uid = $_GET['uid']; + $uid = explode(';', $uid); + $uid = (array_filter($uid, 'strlen')); + + $prestudent_id = $_GET['prestudent_id']; + $prestudent_id = explode(';', $prestudent_id); + $prestudent_id = (array_filter($prestudent_id, 'strlen')); + + $where = " WHERE a.prestudent_id in (" . $db->db_implode4SQL($prestudent_id) . ") + AND a.typ = 'Unterbrechung' AND campus.get_status_studierendenantrag(a.studierendenantrag_id) IN ('Genehmigt', 'EmailVersandt');"; + $not_found_error = 'Studierendenantrag not found for: ' . implode(',', $uid); + } else + die('wrong parameters'); +} +else + die('Format not supported'); + + +$query = " + SELECT stg.bezeichnung, bezeichnung_mehrsprachig[(SELECT index FROM public.tbl_sprache WHERE sprache=" . $db->db_add_param(getSprache(), FHC_STRING) . ")], studierendenantrag_id, matrikelnr, studienjahr_kurzbz, a.studiensemester_kurzbz, vorname, nachname, studiengang_kz, public.get_absem_prestudent(a.prestudent_id, NULL) AS semester, a.grund, datum_wiedereinstieg, a.datum + FROM + campus.tbl_studierendenantrag a + JOIN public.tbl_student USING (prestudent_id) + JOIN public.tbl_benutzer ON tbl_student.student_uid=uid + JOIN public.tbl_person USING (person_id) + JOIN public.tbl_studiengang stg USING (studiengang_kz) + JOIN public.tbl_studiensemester USING (studiensemester_kurzbz) + LEFT JOIN public.tbl_prestudentstatus pss ON (pss.prestudent_id = a.prestudent_id AND pss.studiensemester_kurzbz=a.studiensemester_kurzbz AND pss.status_kurzbz=get_rolle_prestudent(a.prestudent_id, a.studiensemester_kurzbz)) + LEFT JOIN lehre.tbl_studienplan plan USING (studienplan_id) + JOIN bis.tbl_orgform ON (tbl_orgform.orgform_kurzbz = COALESCE(plan.orgform_kurzbz, pss.orgform_kurzbz, stg.orgform_kurzbz))" . $where; + + +if (!$db->db_query($query) || !$db->db_num_rows()) + die('' . $not_found_error . ''); + +?> + + + db_fetch_object()) { ?> + + vorname . ' ' . $row->nachname); ?>]]> + bezeichnung; ?>]]> + bezeichnung_mehrsprachig; ?>]]> + matrikelnr; ?>]]> + studienjahr_kurzbz; ?>]]> + studiensemester_kurzbz; ?>]]> + semester; ?>]]> + grund; ?>]]> + datum_wiedereinstieg))->format('d.m.Y');?>]]> + datum))->format('d.m.Y');?>]]> + + + + + diff --git a/rdf/adresse.rdf.php b/rdf/adresse.rdf.php index ac557fb98..fd6a76d19 100644 --- a/rdf/adresse.rdf.php +++ b/rdf/adresse.rdf.php @@ -100,7 +100,7 @@ function draw_rdf($row) gemeinde.']]> nation.']]> typ.']]> - bezeichnung_mehrsprachig[DEFAULT_LANGUAGE].']]> + bezeichnung_mehrsprachig[DEFAULT_LANGUAGE])?$row->bezeichnung_mehrsprachig[DEFAULT_LANGUAGE]:'').']]> heimatadresse?'Ja':'Nein').']]> zustelladresse?'Ja':'Nein').']]> co_name.']]> diff --git a/rdf/diplomasupplement.xml.php b/rdf/diplomasupplement.xml.php index 47da798b7..4f19566d2 100644 --- a/rdf/diplomasupplement.xml.php +++ b/rdf/diplomasupplement.xml.php @@ -257,7 +257,7 @@ if (isset($_REQUEST["xmlformat"]) && $_REQUEST["xmlformat"] == "xml") if($row->typ=='d') { echo ' UNESCO ISCED 7'; - echo ' '; + echo ' '; echo ' '; echo ' '; echo ' '; @@ -269,7 +269,7 @@ if (isset($_REQUEST["xmlformat"]) && $_REQUEST["xmlformat"] == "xml") elseif($row->typ=='m') { echo ' UNESCO ISCED 7'; - echo ' '; + echo ' '; echo ' '; echo ' '; echo ' '; @@ -281,7 +281,7 @@ if (isset($_REQUEST["xmlformat"]) && $_REQUEST["xmlformat"] == "xml") elseif($row->typ=='b') { echo ' UNESCO ISCED 6'; - echo ' '; + echo ' '; echo ' '; echo ' '; echo ' '; @@ -299,8 +299,8 @@ if (isset($_REQUEST["xmlformat"]) && $_REQUEST["xmlformat"] == "xml") elseif($row->typ=='l' || $row->typ=='k' || $row->typ=='e') { echo ' UNESCO ISCED 7'; - echo ' Lehrgang zur Weiterbildung nach §9 FHStG idgF.'; - echo ' Certificate Program for Further Education subjected to § 9 FHStG'; + echo ' Lehrgang zur Weiterbildung nach §9 FHG idgF.'; + echo ' Certificate Program for Further Education subjected to § 9 FHG'; echo ' '; echo ' '; echo ' '; diff --git a/rdf/lehrveranstaltungszeugnis_ktu.rdf.php b/rdf/lehrveranstaltungszeugnis_ktu.rdf.php index e065925e7..9696978b3 100644 --- a/rdf/lehrveranstaltungszeugnis_ktu.rdf.php +++ b/rdf/lehrveranstaltungszeugnis_ktu.rdf.php @@ -52,7 +52,7 @@ function breaktext($text, $zeichen) $arr = explode(' ',$text); $ret = ''; $teilstring=''; - + foreach($arr as $elem) { if(strlen($teilstring.$elem)>$zeichen) @@ -60,7 +60,7 @@ function breaktext($text, $zeichen) $ret.=' '.$teilstring.'\n'; $teilstring=$elem; } - else + else $teilstring .=' '.$elem; } $ret.=$teilstring; @@ -72,9 +72,9 @@ if (isset($_REQUEST["xmlformat"]) && $_REQUEST["xmlformat"] == "xml") if(isset($_GET['uid'])) $uid = $_GET['uid']; - else + else $uid = null; - + $uid_arr = explode(";",$uid); if ($uid_arr[0] == "") @@ -82,61 +82,61 @@ if (isset($_REQUEST["xmlformat"]) && $_REQUEST["xmlformat"] == "xml") unset($uid_arr[0]); $uid_arr = array_values($uid_arr); } - + $note_arr = array(); $note = new note(); $note->getAll($offiziell = true); foreach ($note->result as $n){ $note_arr[$n->note] = $n->anmerkung; - $note_bezeichnung_arr[$n->note] = $n->bezeichnung; - + $note_bezeichnung_arr[$n->note] = $n->bezeichnung; + } if(isset($_GET['ss'])) $studiensemester_kurzbz = $_GET['ss']; - else + else die('Studiensemester muss uebergeben werden'); if(isset($_GET['lvid'])) $lehrveranstaltung_id = $_GET['lvid']; - else + else $lehrveranstaltung_id = 0; - + //Daten holen - $lqry = "SELECT - tbl_person.titelpre, tbl_person.vorname, tbl_person.nachname, tbl_person.titelpost - FROM - public.tbl_benutzer JOIN public.tbl_person using (person_id) - WHERE - tbl_benutzer.uid = (SELECT - tbl_lehreinheitmitarbeiter.mitarbeiter_uid - FROM - lehre.tbl_lehreinheitmitarbeiter JOIN lehre.tbl_lehrfunktion USING(lehrfunktion_kurzbz), - lehre.tbl_lehreinheit JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id) - WHERE + $lqry = "SELECT + tbl_person.titelpre, tbl_person.vorname, tbl_person.nachname, tbl_person.titelpost + FROM + public.tbl_benutzer JOIN public.tbl_person using (person_id) + WHERE + tbl_benutzer.uid = (SELECT + tbl_lehreinheitmitarbeiter.mitarbeiter_uid + FROM + lehre.tbl_lehreinheitmitarbeiter JOIN lehre.tbl_lehrfunktion USING(lehrfunktion_kurzbz), + lehre.tbl_lehreinheit JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id) + WHERE tbl_lehreinheitmitarbeiter.lehreinheit_id = tbl_lehreinheit.lehreinheit_id AND tbl_lehrveranstaltung.lehrveranstaltung_id = ".$db->db_add_param($lehrveranstaltung_id)." AND tbl_lehreinheit.studiensemester_kurzbz=".$db->db_add_param($studiensemester_kurzbz)." ORDER BY tbl_lehrfunktion.standardfaktor desc limit 1)"; - + $leiter_titel = ''; $leiter_vorname = ''; $leiter_nachname = ''; $leiter_titelpost = ''; - + if($db->db_query($lqry)) { if ($lrow = $db->db_fetch_object()) { - $leiter_titel = $lrow->titelpre; + $leiter_titel = $lrow->titelpre; $leiter_vorname = $lrow->vorname; - $leiter_nachname = $lrow->nachname; - $leiter_titelpost = $lrow->titelpost; - } + $leiter_nachname = $lrow->nachname; + $leiter_titelpost = $lrow->titelpost; + } } - - $qry = "SELECT wochen FROM public.tbl_semesterwochen - WHERE (studiengang_kz, semester) in (SELECT studiengang_kz, semester + + $qry = "SELECT wochen FROM public.tbl_semesterwochen + WHERE (studiengang_kz, semester) in (SELECT studiengang_kz, semester FROM lehre.tbl_lehrveranstaltung WHERE lehrveranstaltung_id=".$db->db_add_param($lehrveranstaltung_id, FHC_INTEGER).")"; $wochen = 15; if($result_wochen = $db->db_query($qry)) @@ -146,7 +146,7 @@ if (isset($_REQUEST["xmlformat"]) && $_REQUEST["xmlformat"] == "xml") $wochen = $row_wochen->wochen; } } - + $lehrveranstaltung=new lehrveranstaltung(); $lehrveranstaltung->load($lehrveranstaltung_id); $sws=$lehrveranstaltung->semesterstunden/$wochen; @@ -157,7 +157,7 @@ if (isset($_REQUEST["xmlformat"]) && $_REQUEST["xmlformat"] == "xml") $lehrform = new lehrform($lehrform_kurzbz); $lehrform_bezeichnung = $lehrform->bezeichnung; $organisationseinheit = new organisationseinheit($lehrveranstaltung->oe_kurzbz); - + $lehreinheit=new lehreinheit(); $lehreinheit->load_lehreinheiten($lehrveranstaltung_id, $studiensemester_kurzbz); if(count($lehreinheit->lehreinheiten)>=1) @@ -169,11 +169,11 @@ if (isset($_REQUEST["xmlformat"]) && $_REQUEST["xmlformat"] == "xml") $lehrfach_id=''; die('keine Lehreinheiten gefunden!'); } - + $lv_lehrfach=new lehrveranstaltung(); $lv_lehrfach->load($lehrfach_id); $lehrfach_bezeichnung=$lv_lehrfach->bezeichnung; - + /* $lvqry = "SELECT * from lehre.tbl_lehrveranstaltung where lehrveranstaltung_id = ".$db->db_add_param($lehrveranstaltung_id, FHC_INTEGER); if($db->db_query($lvqry)) { @@ -182,43 +182,43 @@ if (isset($_REQUEST["xmlformat"]) && $_REQUEST["xmlformat"] == "xml") $sws = $lvrow->semesterstunden/$wochen; $ects = $lvrow->ects; $lvbezeichnung = $lvrow->bezeichnung; - $lvstg = $lvrow->studiengang_kz; - } + $lvstg = $lvrow->studiengang_kz; + } } */ - + $lehrinhalte = ''; $infoqry = "SELECT * FROM campus.tbl_lvinfo WHERE sprache='German' AND lehrveranstaltung_id = ".$db->db_add_param($lehrveranstaltung_id, FHC_INTEGER); if($db->db_query($infoqry)) { if ($inforow = $db->db_fetch_object()) { - $lehrinhalte_arr = explode("
    ",$inforow->lehrinhalte); + $lehrinhalte_arr = explode("
    ",$inforow->lehrinhalte); for ($i = 0; $i < sizeof($lehrinhalte_arr); $i++) { - $lehrinhalte .= $lehrinhalte_arr[$i].'\n'; + $lehrinhalte .= $lehrinhalte_arr[$i].'\n'; } - } - } - + } + } + $xml = ""; $xml .= ""; - + $studiensemester = new studiensemester(); $studiensemester->load($studiensemester_kurzbz); - + for ($i = 0; $i < sizeof($uid_arr); $i++) { $anzahl_fussnoten=0; $studiengang_typ=''; $xml_fussnote=''; - + $query = "SELECT mitarbeiter_uid FROM lehre.tbl_lehreinheit as le JOIN lehre.tbl_pruefung as p USING(lehreinheit_id) JOIN lehre.tbl_lehrveranstaltung as lv USING(lehrveranstaltung_id) WHERE p.student_uid = ".$db->db_add_param($uid_arr[$i])." AND le.studiensemester_kurzbz = ".$db->db_add_param($studiensemester_kurzbz)." AND lv.lehrveranstaltung_id = ".$db->db_add_param($lehrveranstaltung_id, FHC_INTEGER); - + $pruefer_uid=''; $pruefer_name=''; if($db->db_query($query)) @@ -231,7 +231,7 @@ if (isset($_REQUEST["xmlformat"]) && $_REQUEST["xmlformat"] == "xml") if($pruefer_uid!='') { $pruefer = new mitarbeiter($pruefer_uid); - $pruefer_name = trim($pruefer->titelpre.' '.$pruefer->vorname.' '.$pruefer->nachname.' '.$pruefer->titelpost); + $pruefer_name = trim($pruefer->titelpre.' '.$pruefer->vorname.' '.$pruefer->nachname.' '.$pruefer->titelpost); } $query = "SELECT tbl_student.matrikelnr, tbl_student.studiengang_kz, tbl_studiengang.typ, tbl_studiengang.bezeichnung, tbl_person.vorname, tbl_person.nachname,tbl_person.gebdatum,tbl_person.titelpre, tbl_person.titelpost, tbl_person.geschlecht, tbl_person.matr_nr FROM tbl_person, tbl_student, tbl_studiengang, tbl_benutzer WHERE tbl_student.studiengang_kz = tbl_studiengang.studiengang_kz and tbl_student.student_uid = tbl_benutzer.uid and tbl_benutzer.person_id = tbl_person.person_id and tbl_student.student_uid = '".$uid_arr[$i]."'"; @@ -251,7 +251,7 @@ if (isset($_REQUEST["xmlformat"]) && $_REQUEST["xmlformat"] == "xml") $stgl_ma = new mitarbeiter($stgleiter_uid); $stgl .= trim($stgl_ma->titelpre.' '.$stgl_ma->vorname.' '.$stgl_ma->nachname.' '.$stgl_ma->titelpost); } - + $student=new student(); $student->load($uid_arr[$i]); $prestudent=new prestudent(); @@ -261,11 +261,11 @@ if (isset($_REQUEST["xmlformat"]) && $_REQUEST["xmlformat"] == "xml") { if($status->studienplan_bezeichnung != '') $studienplan_bezeichnung=$status->studienplan_bezeichnung; - + if($status->studienplan_id != NULL) $studienplan_id = $status->studienplan_id; } - + $xml .= "\n "; $xml .= "\n ".$studiensemester_kurzbz.""; $xml .= "\n ".$row->vorname.""; @@ -279,8 +279,8 @@ if (isset($_REQUEST["xmlformat"]) && $_REQUEST["xmlformat"] == "xml") $xml .= "\n ".$stgl.""; $datum_aktuell = date('d.m.Y'); $xml .= "\n Wien, am ".$datum_aktuell.""; - - + + $obj = new zeugnisnote(); $obj->load($lehrveranstaltung_id, $uid_arr[$i], $studiensemester_kurzbz); @@ -298,10 +298,10 @@ if (isset($_REQUEST["xmlformat"]) && $_REQUEST["xmlformat"] == "xml") $uebernahmedatum = ""; $benotungsdatum = ""; } - + $stg = new studiengang(); $stg->load($lvstg); - + $xml .= " ".$stg_oe_obj->bezeichnung.""; $xml .= " ".$stg->bezeichnung.""; $xml .= " ".$stg->typ.""; @@ -318,20 +318,20 @@ if (isset($_REQUEST["xmlformat"]) && $_REQUEST["xmlformat"] == "xml") $xml .= " ".$lehrform_kurzbz.""; $xml .= " ".$lehrform_bezeichnung.""; $xml .= " ".($sws==0?'':number_format(sprintf('%.1F',$sws),1)).""; - + $xml .= " ".$leiter_titel." ".$leiter_vorname." ".$leiter_nachname.($leiter_titelpost!=''?', '.$leiter_titelpost:'').""; $xml .= " "; $xml .= " "; - + $lehrveranstaltung->getLVkompatibel($lehrveranstaltung_id); foreach($lehrveranstaltung->lehrveranstaltungen as $lv_kompatibel) { - $xml .= "".$lv_kompatibel->bezeichnung.""; + $xml .= "bezeichnung."]]>"; } $xml .= " "; - - + + $anrechnung = new anrechnung(); $anrechnung->getAnrechnungPrestudent($student->prestudent_id, null, $lehrveranstaltung_id); @@ -343,7 +343,7 @@ if (isset($_REQUEST["xmlformat"]) && $_REQUEST["xmlformat"] == "xml") $xml .= $anrechnung->result[0]->lehrveranstaltung_bez; } $xml .= ""; - + if($lehrveranstaltung_id_kompatibel != "") { $lv = new lehrveranstaltung($lehrveranstaltung_id_kompatibel); @@ -352,11 +352,11 @@ if (isset($_REQUEST["xmlformat"]) && $_REQUEST["xmlformat"] == "xml") $ects = $lv->ects; } } - + $xml .= " ".number_format($ects,1).""; $lehrveranstaltung->loadLehrveranstaltungStudienplan($studienplan_id); - + $studienplan_lehrveranstaltung_id = ""; foreach($lehrveranstaltung->lehrveranstaltungen as $lv) { @@ -366,7 +366,7 @@ if (isset($_REQUEST["xmlformat"]) && $_REQUEST["xmlformat"] == "xml") break; } } - + $studienplan = new studienplan(); if($studienplan_lehrveranstaltung_id != "") { @@ -384,11 +384,11 @@ if (isset($_REQUEST["xmlformat"]) && $_REQUEST["xmlformat"] == "xml") { $lehrveranstaltung->lehrveranstaltungen = array(); } - + // $return = $lehrveranstaltung->getLVFromStudienplanByLehrtyp($studienplan_id, "modul"); $xml .= " "; - + //Variable wird zur korrekten Darstellung im Dokument benötigt $count=0; foreach($lehrveranstaltung->lehrveranstaltungen as $modul) @@ -411,4 +411,4 @@ if (isset($_REQUEST["xmlformat"]) && $_REQUEST["xmlformat"] == "xml") $xml .= ""; echo $xml; } -?> \ No newline at end of file +?> diff --git a/rdf/lehrverbandsgruppe.rdf.php b/rdf/lehrverbandsgruppe.rdf.php index 79ac0c948..755444b6d 100644 --- a/rdf/lehrverbandsgruppe.rdf.php +++ b/rdf/lehrverbandsgruppe.rdf.php @@ -246,6 +246,24 @@ function draw_orgformsubmenu($stg_kz, $orgform) + + Nicht zum Reihungstest angemeldet + + + studiensemester_kurzbz.']]> + statusbestaetigtrtnichtangemeldet + + + + + Reihungstest angemeldet + + + studiensemester_kurzbz.']]> + statusbestaetigtrtangemeldet + + + Nicht zum Reihungstest angemeldet @@ -272,6 +290,42 @@ function draw_orgformsubmenu($stg_kz, $orgform) bewerber + + + Nicht zum Reihungstest angemeldet + + + studiensemester_kurzbz.']]> + bewerberrtnichtangemeldet + + + + + Reihungstest angemeldet + + + studiensemester_kurzbz.']]> + bewerberrtangemeldet + + + + + Teilgenommen + + + studiensemester_kurzbz.']]> + bewerberrtangemeldetteilgenommen + + + + + Nicht teilgenommen + + + studiensemester_kurzbz.']]> + bewerberrtangemeldetnichtteilgenommen + + Aufgenommen @@ -316,13 +370,31 @@ function draw_orgformsubmenu($stg_kz, $orgform) $orgform_sequence[$stg_kz].= "\t\t\t\tstudiensemester_kurzbz/interessenten/bewerbungnichtabgeschickt\" />\n"; $orgform_sequence[$stg_kz].= "\t\t\t\tstudiensemester_kurzbz/interessenten/bewerbungabgeschickt\" />\n"; $orgform_sequence[$stg_kz].= "\t\t\t\tstudiensemester_kurzbz/interessenten/zgv\" />\n"; - $orgform_sequence[$stg_kz].= "\t\t\t\tstudiensemester_kurzbz/interessenten/statusbestaetigt\" />\n"; + $orgform_sequence[$stg_kz].= "\t\t\t"; + $orgform_sequence[$stg_kz].= "\t\t\t\tstudiensemester_kurzbz/interessenten/statusbestaetigt\">\n"; + $orgform_sequence[$stg_kz].= "\t\t\t\tstudiensemester_kurzbz/interessenten/statusbestaetigt/reihungstestnichtangemeldet\" />\n"; + $orgform_sequence[$stg_kz].= "\t\t\t\tstudiensemester_kurzbz/interessenten/statusbestaetigt/reihungstestangemeldet\" />\n"; + $orgform_sequence[$stg_kz].= "\t\t\t\t"; + $orgform_sequence[$stg_kz].= "\n\t\t\t\n"; $orgform_sequence[$stg_kz].= "\t\t\t\tstudiensemester_kurzbz/interessenten/reihungstestnichtangemeldet\" />\n"; $orgform_sequence[$stg_kz].= "\t\t\t\tstudiensemester_kurzbz/interessenten/reihungstestangemeldet\" />\n"; $orgform_sequence[$stg_kz].= "\t\t\t\t"; $orgform_sequence[$stg_kz].= "\n\t\t\t\n"; - - $orgform_sequence[$stg_kz].= "\t\t\tstudiensemester_kurzbz/bewerber\" />\n"; + + $orgform_sequence[$stg_kz].= "\t\t\t"; + $orgform_sequence[$stg_kz].= "\n\t\t\t\tstudiensemester_kurzbz/bewerber\">\n"; + $orgform_sequence[$stg_kz].= "\t\t\tstudiensemester_kurzbz/bewerber/reihungstestnichtangemeldet\" />\n"; + + $orgform_sequence[$stg_kz].= "\t\t\t"; + $orgform_sequence[$stg_kz].= "\t\t\tstudiensemester_kurzbz/bewerber/reihungstestangemeldet\">\n"; + $orgform_sequence[$stg_kz].= "\t\t\t\tstudiensemester_kurzbz/bewerber/reihungstestangemeldet/reihungstestnichtangemeldet/teilgenommen\" />\n"; + $orgform_sequence[$stg_kz].= "\t\t\t\tstudiensemester_kurzbz/bewerber/reihungstestangemeldet/reihungstestnichtangemeldet/nichtteilgenommen\" />\n"; + $orgform_sequence[$stg_kz].= "\t\t\t\t"; + $orgform_sequence[$stg_kz].= "\n\t\t\t\n"; + + $orgform_sequence[$stg_kz].= "\t\t\t\t"; + $orgform_sequence[$stg_kz].= "\n\t\t\t\n"; + $orgform_sequence[$stg_kz].= "\t\t\tstudiensemester_kurzbz/aufgenommen\" />\n"; $orgform_sequence[$stg_kz].= "\t\t\tstudiensemester_kurzbz/warteliste\" />\n"; $orgform_sequence[$stg_kz].= "\t\t\tstudiensemester_kurzbz/absage\" />\n"; @@ -561,6 +633,22 @@ while ($row=$dbo->db_fetch_object()) + + + ]]> + studiengang_kz; ?>]]> + studiensemester_kurzbz; ?>]]> + + + + + + ]]> + studiengang_kz; ?>]]> + studiensemester_kurzbz; ?>]]> + + + ]]> @@ -585,6 +673,38 @@ while ($row=$dbo->db_fetch_object()) + + + ]]> + studiengang_kz; ?>]]> + studiensemester_kurzbz; ?>]]> + + + + + + ]]> + studiengang_kz; ?>]]> + studiensemester_kurzbz; ?>]]> + + + + + + ]]> + studiengang_kz; ?>]]> + studiensemester_kurzbz; ?>]]> + + + + + + ]]> + studiengang_kz; ?>]]> + studiensemester_kurzbz; ?>]]> + + + ]]> @@ -783,13 +903,30 @@ draw_orgformpart($stg_kz); echo "\t\t\t\tstudiensemester_kurzbz/interessenten/bewerbungnichtabgeschickt\" />\n"; echo "\t\t\t\tstudiensemester_kurzbz/interessenten/bewerbungabgeschickt\" />\n"; echo "\t\t\t\tstudiensemester_kurzbz/interessenten/zgv\" />\n"; - echo "\t\t\t\tstudiensemester_kurzbz/interessenten/statusbestaetigt\" />\n"; + echo "\t\t\t"; + echo "\t\t\t\tstudiensemester_kurzbz/interessenten/statusbestaetigt\">\n"; + echo "\t\t\t\tstudiensemester_kurzbz/interessenten/statusbestaetigt/reihungstestnichtangemeldet\" />\n"; + echo "\t\t\t\tstudiensemester_kurzbz/interessenten/statusbestaetigt/reihungstestangemeldet\" />\n"; + echo "\t\t\t\t"; + echo "\n\t\t\t\n"; echo "\t\t\t\tstudiensemester_kurzbz/interessenten/reihungstestnichtangemeldet\" />\n"; echo "\t\t\t\tstudiensemester_kurzbz/interessenten/reihungstestangemeldet\" />\n"; echo "\t\t\t\t"; echo "\n\t\t\t\n"; + + echo "\t\t\t"; + echo "\t\t\t\tstudiensemester_kurzbz/bewerber\">\n"; + echo "\t\t\t\tstudiensemester_kurzbz/bewerber/reihungstestnichtangemeldet\" />\n"; + echo "\t\t\t"; + echo "\t\t\t\tstudiensemester_kurzbz/bewerber/reihungstestangemeldet\">\n"; + echo "\t\t\t\tstudiensemester_kurzbz/bewerber/reihungstestangemeldet/teilgenommen\" />\n"; + echo "\t\t\t\tstudiensemester_kurzbz/bewerber/reihungstestangemeldet/nichtteilgenommen\" />\n"; + echo "\t\t\t\t"; + echo "\n\t\t\t\n"; + + echo "\t\t\t\t"; + echo "\n\t\t\t\n"; - echo "\t\t\t\tstudiensemester_kurzbz/bewerber\" />\n"; echo "\t\t\t\tstudiensemester_kurzbz/aufgenommen\" />\n"; echo "\t\t\t\tstudiensemester_kurzbz/warteliste\" />\n"; echo "\t\t\t\tstudiensemester_kurzbz/absage\" />\n"; diff --git a/rdf/ort.rdf.php b/rdf/ort.rdf.php index e9f575428..f4512851a 100644 --- a/rdf/ort.rdf.php +++ b/rdf/ort.rdf.php @@ -38,7 +38,7 @@ require_once('../include/basis_db.class.php'); // Orte holen $sql_query="SELECT * FROM (public.tbl_ort JOIN public.tbl_ortraumtyp USING (ort_kurzbz)) JOIN public.tbl_raumtyp USING (raumtyp_kurzbz) - WHERE aktiv AND raumtyp_kurzbz!='LM' ORDER BY raumtyp_kurzbz, hierarchie,ort_kurzbz"; + WHERE tbl_ort.aktiv AND tbl_raumtyp.aktiv AND raumtyp_kurzbz!='LM' ORDER BY raumtyp_kurzbz, hierarchie,ort_kurzbz"; $db = new basis_db(); if(!$result = $db->db_query($sql_query)) $error_msg.=$db->db_last_error(); @@ -67,7 +67,9 @@ for ($i=0;$i<$num_rows;$i++) $nextTYP=(($i<$num_rows-1)?$ortNEXT->raumtyp_kurzbz:null); //echo "current:$currentTYP last:$lastTYP next:$nextTYP"; $raumtypen=''; - $qry = "SELECT raumtyp_kurzbz FROM public.tbl_ortraumtyp WHERE ort_kurzbz='$ort->ort_kurzbz'"; + $qry = "SELECT tbl_ortraumtyp.raumtyp_kurzbz FROM public.tbl_ortraumtyp + JOIN tbl_raumtyp USING(raumtyp_kurzbz) + WHERE tbl_raumtyp.aktiv AND ort_kurzbz='$ort->ort_kurzbz'"; if($result_rt = $db->db_query($qry)) { while($row_rt = $db->db_fetch_object($result_rt)) diff --git a/rdf/prestudentrolle.rdf.php b/rdf/prestudentrolle.rdf.php index f60b93050..7a3dd636b 100644 --- a/rdf/prestudentrolle.rdf.php +++ b/rdf/prestudentrolle.rdf.php @@ -119,6 +119,10 @@ foreach($ps->result as $row) statusgrund_id.']]> statusgrund_id])?$statusgrund_arr[$row->statusgrund_id]:'').']]> + formatDatum($row->insertamum,'d.m.Y H:i:s').']]> + insertvon.']]> + formatDatum($row->updateamum,'d.m.Y H:i:s').']]> + updatevon.']]> '; diff --git a/rdf/raumtyp.rdf.php b/rdf/raumtyp.rdf.php index 06b429380..1f7289747 100644 --- a/rdf/raumtyp.rdf.php +++ b/rdf/raumtyp.rdf.php @@ -56,13 +56,14 @@ foreach ($raumtypDAO->result as $rt) { ?> - - raumtyp_kurzbz ?> - beschreibung ?> - + + raumtyp_kurzbz ?> + beschreibung ?> + aktiv ? "true" : "false") ?> + - \ No newline at end of file + diff --git a/rdf/student.rdf.php b/rdf/student.rdf.php index af0bbe82d..40cf28e01 100644 --- a/rdf/student.rdf.php +++ b/rdf/student.rdf.php @@ -107,6 +107,21 @@ function checkfilter($row, $filter2, $buchungstyp = null) if($row_filter->anzahl>0 || $prestudent->status_kurzbz=='Incoming') return false; } + elseif($filter2 == 'StudiengebuehrErhoeht') + { + // Alle Personen die eine erhöhte Studiengebuehrbelastung haben + $prestudent = new prestudent(); + $prestudent->getLastStatus($row->prestudent_id); + + $qry = "SELECT count(*) as anzahl FROM public.tbl_konto WHERE + studiensemester_kurzbz=".$db->db_add_param($studiensemester_kurzbz)." AND + person_id=".$db->db_add_param($row->person_id, FHC_INTEGER)." AND + buchungstyp_kurzbz='StudiengebuehrErhoeht'"; + if($db->db_query($qry)) + if($row_filter = $db->db_fetch_object()) + if($row_filter->anzahl == 0) + return false; + } elseif(strstr($filter2,'buchungstyp;')) { // Alle Personen die keine Belastung auf den uebergebenen Buchungstyp haben @@ -736,8 +751,8 @@ if($xmlformat=='rdf') } } elseif(in_array($typ, array('prestudent', 'interessenten', 'bewerber', 'aufgenommen', - 'warteliste', 'absage', 'zgv', 'reihungstestangemeldet', 'reihungstestnichtangemeldet', 'absolvent', - 'diplomand', 'bewerbungnichtabgeschickt', 'bewerbungabgeschickt', 'statusbestaetigt'))) + 'warteliste', 'absage', 'zgv', 'reihungstestangemeldet', 'reihungstestnichtangemeldet', 'bewerberrtangemeldetteilgenommen', 'bewerberrtangemeldetnichtteilgenommen','absolvent', + 'diplomand', 'bewerbungnichtabgeschickt', 'bewerbungabgeschickt', 'statusbestaetigt', 'statusbestaetigtrtnichtangemeldet', 'statusbestaetigtrtangemeldet', 'bewerberrtangemeldet', 'bewerberrtnichtangemeldet'))) { $prestd = new prestudent(); @@ -939,6 +954,8 @@ if($xmlformat=='rdf') UPPER(nachname || ' ' || vorname) ~* UPPER(".$db->db_add_param($searchItems_string).") OR UPPER(nachname || ' ' || wahlname) ~* UPPER(".$db->db_add_param($searchItems_string).") OR UPPER(wahlname || ' ' || nachname) ~* UPPER(".$db->db_add_param($searchItems_string).") OR + UPPER(vorname) ~* UPPER(".$db->db_add_param($searchItems_string).") OR + UPPER(nachname) ~* UPPER(".$db->db_add_param($searchItems_string).") OR student_uid ~* LOWER(".$db->db_add_param($searchItems_string).")"; } else @@ -1195,6 +1212,20 @@ else else $studienjahr = intval($semester/2)+1; + $abbrecher = ($prestudent->status_kurzbz === 'Abbrecher' ? 'true' : 'false'); + + $abbrecher_ende = ''; + $studiensemester_abbrecher_kurzbz=''; + $qry = "SELECT * FROM public.tbl_prestudentstatus + WHERE prestudent_id='$student->prestudent_id' AND status_kurzbz = 'Abbrecher' ORDER BY datum LIMIT 1"; + if($db->db_query($qry)) + { + if($row = $db->db_fetch_object()) + { + $abbrecher_ende = $row->datum; + $studiensemester_abbrecher_kurzbz = $row->studiensemester_kurzbz; + } + } echo ' uid.']]> @@ -1218,6 +1249,7 @@ else bezeichnung.']]> bezeichnung.']]> + english.']]> typ.']]> orgform_kurzbz.']]> @@ -1241,6 +1273,9 @@ else studienjahr_kurzbz.']]> bezeichnung.']]> convertISODate($stsem->start).']]> + + convertISODate($abbrecher_ende).']]> + max_semester.']]> anmerkung.']]> diff --git a/soap/datenverbund_client.php b/soap/datenverbund_client.php index 0f2a2ba19..3f6052e75 100644 --- a/soap/datenverbund_client.php +++ b/soap/datenverbund_client.php @@ -230,7 +230,7 @@ if ($getPersonData) printrow('matrikelnummer', 'Matrikelnummer', $matrikelnr); printrow('nachname', 'Nachname', $nachname, '', 255); printrow('vorname', 'Vorname', $vorname, '', 30); - printrow('geburtsdatum', 'Geburtsdatum', $geburtsdatum, 'Format: YYYYMMDD', 10); + printrow('geburtsdatum', 'Geburtsdatum', $geburtsdatum, 'Format: YYYY-MM-DD', 10); printrow('geschlecht', 'Geschlecht', $geschlecht, 'Format: M | W', 1); printrow('postleitzahl', 'Postleitzahl', $postleitzahl, '', 10); } diff --git a/system/dbupdate_3.3.php b/system/dbupdate_3.3.php index f57b9d172..edbe7585e 100644 --- a/system/dbupdate_3.3.php +++ b/system/dbupdate_3.3.php @@ -7026,7 +7026,7 @@ $tabellen=array( "public.tbl_preoutgoing_status" => array("preoutgoing_status_kurzbz","bezeichnung"), "public.tbl_prestudent" => array("prestudent_id","aufmerksamdurch_kurzbz","person_id","studiengang_kz","berufstaetigkeit_code","ausbildungcode","zgv_code","zgvort","zgvdatum","zgvmas_code","zgvmaort","zgvmadatum","aufnahmeschluessel","facheinschlberuf","reihungstest_id","anmeldungreihungstest","reihungstestangetreten","rt_gesamtpunkte","rt_punkte1","rt_punkte2","bismelden","anmerkung","dual","insertamum","insertvon","updateamum","updatevon","ext_id","ausstellungsstaat","rt_punkte3", "zgvdoktor_code", "zgvdoktorort", "zgvdoktordatum","mentor","zgvnation","zgvmanation","zgvdoktornation","gsstudientyp_kurzbz","aufnahmegruppe_kurzbz","udf_values","priorisierung","foerderrelevant","standort_code","zgv_erfuellt","zgvmas_erfuellt","zgvdoktor_erfuellt"), "public.tbl_prestudentstatus" => array("prestudent_id","status_kurzbz","studiensemester_kurzbz","ausbildungssemester","datum","orgform_kurzbz","insertamum","insertvon","updateamum","updatevon","ext_id","studienplan_id","bestaetigtam","bestaetigtvon","fgm","faktiv", "anmerkung","bewerbung_abgeschicktamum","rt_stufe","statusgrund_id"), - "public.tbl_raumtyp" => array("raumtyp_kurzbz","beschreibung","kosten"), + "public.tbl_raumtyp" => array("raumtyp_kurzbz","beschreibung","kosten", "aktiv"), "public.tbl_reihungstest" => array("reihungstest_id","studiengang_kz","ort_kurzbz","anmerkung","datum","uhrzeit","updateamum","updatevon","insertamum","insertvon","ext_id","freigeschaltet","max_teilnehmer","oeffentlich","studiensemester_kurzbz","aufnahmegruppe_kurzbz","stufe","anmeldefrist"), "public.tbl_rt_ort" => array("rt_id","ort_kurzbz","uid"), "public.tbl_rt_person" => array("rt_person_id","person_id","rt_id","studienplan_id","anmeldedatum","teilgenommen","ort_kurzbz","punkte","insertamum","insertvon","updateamum","updatevon"), diff --git a/system/dbupdate_3.4.php b/system/dbupdate_3.4.php index dcf882c43..850d48d8a 100644 --- a/system/dbupdate_3.4.php +++ b/system/dbupdate_3.4.php @@ -27,11 +27,25 @@ require_once('dbupdate_3.4/example.php'); require_once('dbupdate_3.4/example2.php'); ... */ +require_once('dbupdate_3.4/25003_notenimport_nachpruefung.php'); require_once('dbupdate_3.4/26173_index_webservicelog.php'); require_once('dbupdate_3.4/24682_reihungstest_zugangscode_fuer_login.php'); require_once('dbupdate_3.4/17512_fehlercode_constraints.php'); +require_once('dbupdate_3.4/27388_anrechnungen_zeitfenster_pflegen.php'); require_once('dbupdate_3.4/19154_beurteilungsformulare_pruefungssenat.php'); +require_once('dbupdate_3.4/10001_tempus_mitarbeiter_kurzbz_bei_reservierungen_anzeigen.php'); +require_once('dbupdate_3.4/27949_infocenter_zurueckstellen_mit_grund.php'); +require_once('dbupdate_3.4/27107_vilesci_erfassung_abwesenheiten_reinigung.php'); +require_once('dbupdate_3.4/24913_tabelle_raumtyp_neues_attribut_aktiv.php'); +require_once('dbupdate_3.4/28089_plausichecks_in_extension_hinzufuegen.php'); +require_once('dbupdate_3.4/29133_einzelne_studiengaenge_aus_issuechecks_ausnehmen.php'); +require_once('dbupdate_3.4/27351_digitalisierung_formulare.php'); +require_once('dbupdate_3.4/30537_anmerkung_in_tbl_rolleberechtigung.php'); +require_once('dbupdate_3.4/30181_tabelle_anrechnung_neue_attribute_fuer_begruendung.php'); +require_once('dbupdate_3.4/29529_infocenter_anpassungen.php'); +require_once('dbupdate_3.4/29835_uhstat1_erfassung_der_uhstat1_daten_ueber_das_bewerbungstool.php'); +require_once('dbupdate_3.4/33714_erhoehter_studienbeitrag_fuer_drittsaatenangehoerig.php'); require_once('dbupdate_3.4/21620_neues_feld_zum_erfassen_des_ESI.php'); // *** Pruefung und hinzufuegen der neuen Attribute und Tabellen @@ -143,10 +157,11 @@ $tabellen=array( "lehre.tbl_abschlusspruefung" => array("abschlusspruefung_id","student_uid","vorsitz","pruefer1","pruefer2","pruefer3","abschlussbeurteilung_kurzbz","akadgrad_id","pruefungstyp_kurzbz","datum","uhrzeit","sponsion","anmerkung","updateamum","updatevon","insertamum","insertvon","ext_id","note","protokoll","endezeit","pruefungsantritt_kurzbz","freigabedatum"), "lehre.tbl_abschlusspruefung_antritt" => array("pruefungsantritt_kurzbz","bezeichnung","bezeichnung_english","sort"), "lehre.tbl_akadgrad" => array("akadgrad_id","akadgrad_kurzbz","studiengang_kz","titel","geschlecht"), - "lehre.tbl_anrechnung" => array("anrechnung_id","prestudent_id","lehrveranstaltung_id","begruendung_id","lehrveranstaltung_id_kompatibel","genehmigt_von","insertamum","insertvon","updateamum","updatevon","ext_id", "dms_id", "studiensemester_kurzbz", "anmerkung_student", "empfehlung_anrechnung"), + "lehre.tbl_anrechnung" => array("anrechnung_id","prestudent_id","lehrveranstaltung_id","begruendung_id","lehrveranstaltung_id_kompatibel","genehmigt_von","insertamum","insertvon","updateamum","updatevon","ext_id", "dms_id", "studiensemester_kurzbz", "anmerkung_student", "empfehlung_anrechnung", "begruendung_ects", "begruendung_lvinhalt"), "lehre.tbl_anrechnungstatus" => array("status_kurzbz", "bezeichnung_mehrsprachig"), "lehre.tbl_anrechnung_anrechnungstatus" => array("anrechnungstatus_id", "anrechnung_id", "status_kurzbz", "datum", "insertamum", "insertvon"), "lehre.tbl_anrechnung_begruendung" => array("begruendung_id","bezeichnung"), + "lehre.tbl_anrechnungszeitraum" => array("anrechnungszeitraum_id","studiensemester_kurzbz","anrechnungstart","anrechnungende", "insertamum", "insertvon"), "lehre.tbl_betreuerart" => array("betreuerart_kurzbz","beschreibung","aktiv"), "lehre.tbl_ferien" => array("bezeichnung","studiengang_kz","vondatum","bisdatum"), "lehre.tbl_lehreinheit" => array("lehreinheit_id","lehrveranstaltung_id","studiensemester_kurzbz","lehrfach_id","lehrform_kurzbz","stundenblockung","wochenrythmus","start_kw","raumtyp","raumtypalternativ","sprache","lehre","anmerkung","unr","lvnr","updateamum","updatevon","insertamum","insertvon","ext_id","lehrfach_id_old","gewicht"), @@ -303,6 +318,9 @@ $tabellen=array( "system.tbl_extensions" => array("extension_id","name","version","description","license","url","core_version","dependencies","enabled"), "system.tbl_fehler" => array("fehlercode","fehler_kurzbz","fehlercode_extern","fehlertext","fehlertyp_kurzbz","app"), "system.tbl_fehlertyp" => array("fehlertyp_kurzbz","bezeichnung_mehrsprachig"), + "system.tbl_fehler_konfiguration" => array("konfigurationstyp_kurzbz","fehlercode","konfiguration","insertamum","insertvon","updateamum","updatevon"), + "system.tbl_fehler_konfigurationsdatentyp" => array("konfigurationsdatentyp"), + "system.tbl_fehler_konfigurationstyp" => array("konfigurationstyp_kurzbz","beschreibung","konfigurationsdatentyp","app"), "system.tbl_fehler_zustaendigkeiten" => array("fehlerzustaendigkeiten_id","fehlercode","person_id","oe_kurzbz","funktion_kurzbz", "insertamum", "insertvon"), "system.tbl_issue" => array("issue_id","fehlercode","fehlercode_extern","inhalt","inhalt_extern","person_id","oe_kurzbz","datum","verarbeitetvon","verarbeitetamum","status_kurzbz","behebung_parameter","insertvon","insertamum","updatevon","updateamum"), "system.tbl_issue_status" => array("status_kurzbz","bezeichnung_mehrsprachig"), @@ -316,7 +334,7 @@ $tabellen=array( "system.tbl_phrase" => array("phrase_id","app","phrase","insertamum","insertvon","category"), "system.tbl_phrasentext" => array("phrasentext_id","phrase_id","sprache","orgeinheit_kurzbz","orgform_kurzbz","text","description","insertamum","insertvon"), "system.tbl_rolle" => array("rolle_kurzbz","beschreibung"), - "system.tbl_rolleberechtigung" => array("berechtigung_kurzbz","rolle_kurzbz","art"), + "system.tbl_rolleberechtigung" => array("berechtigung_kurzbz","rolle_kurzbz","art","anmerkung","insertamum","insertvon"), "system.tbl_verarbeitungstaetigkeit" => array("taetigkeit_kurzbz", "bezeichnung", "bezeichnung_mehrsprachig","aktiv"), "system.tbl_webservicelog" => array("webservicelog_id","webservicetyp_kurzbz","request_id","beschreibung","request_data","execute_time","execute_user"), "system.tbl_webservicerecht" => array("webservicerecht_id","berechtigung_kurzbz","methode","attribut","insertamum","insertvon","updateamum","updatevon","klasse"), diff --git a/system/dbupdate_3.4/10001_tempus_mitarbeiter_kurzbz_bei_reservierungen_anzeigen.php b/system/dbupdate_3.4/10001_tempus_mitarbeiter_kurzbz_bei_reservierungen_anzeigen.php new file mode 100644 index 000000000..fed80b786 --- /dev/null +++ b/system/dbupdate_3.4/10001_tempus_mitarbeiter_kurzbz_bei_reservierungen_anzeigen.php @@ -0,0 +1,130 @@ +db_query("SELECT mitarbeiter_kurzbz FROM lehre.vw_stundenplandev LIMIT 1")) +{ + $qry = " + CREATE OR REPLACE VIEW lehre.vw_stundenplandev + (stundenplandev_id, unr, uid, lehreinheit_id, lehrfach_id, datum, stunde, ort_kurzbz, studiengang_kz, + semester, verband, gruppe, gruppe_kurzbz, titel, anmerkung, fix, lehrveranstaltung_id, stg_kurzbz, + stg_kurzbzlang, stg_bezeichnung, stg_typ, fachbereich_kurzbz, lehrfach, lehrfach_bez, farbe, lehrform, + lektor, updateamum, updatevon, insertamum, insertvon, anmerkung_lehreinheit, mitarbeiter_kurzbz) + AS + SELECT tbl_stundenplandev.stundenplandev_id, + tbl_stundenplandev.unr, + tbl_stundenplandev.mitarbeiter_uid AS uid, + tbl_stundenplandev.lehreinheit_id, + tbl_lehreinheit.lehrfach_id, + tbl_stundenplandev.datum, + tbl_stundenplandev.stunde, + tbl_stundenplandev.ort_kurzbz, + tbl_stundenplandev.studiengang_kz, + tbl_stundenplandev.semester, + tbl_stundenplandev.verband, + tbl_stundenplandev.gruppe, + tbl_stundenplandev.gruppe_kurzbz, + tbl_stundenplandev.titel, + tbl_stundenplandev.anmerkung, + tbl_stundenplandev.fix, + tbl_lehreinheit.lehrveranstaltung_id, + tbl_studiengang.kurzbz AS stg_kurzbz, + tbl_studiengang.kurzbzlang AS stg_kurzbzlang, + tbl_studiengang.bezeichnung AS stg_bezeichnung, + tbl_studiengang.typ AS stg_typ, + (SELECT tbl_fachbereich.fachbereich_kurzbz + FROM tbl_fachbereich + WHERE tbl_fachbereich.oe_kurzbz::text = lehrfach.oe_kurzbz::text) AS fachbereich_kurzbz, + lehrfach.kurzbz AS lehrfach, + lehrfach.bezeichnung AS lehrfach_bez, + lehrfach.farbe, + tbl_lehreinheit.lehrform_kurzbz AS lehrform, + tbl_mitarbeiter.kurzbz AS lektor, + tbl_stundenplandev.updateamum, + tbl_stundenplandev.updatevon, + tbl_stundenplandev.insertamum, + tbl_stundenplandev.insertvon, + tbl_lehreinheit.anmerkung AS anmerkung_lehreinheit, + tbl_mitarbeiter.kurzbz AS mitarbeiter_kurzbz + FROM lehre.tbl_stundenplandev + JOIN tbl_studiengang USING (studiengang_kz) + JOIN lehre.tbl_lehreinheit USING (lehreinheit_id) + JOIN lehre.tbl_lehrveranstaltung lehrfach ON tbl_lehreinheit.lehrfach_id = lehrfach.lehrveranstaltung_id + JOIN tbl_mitarbeiter USING (mitarbeiter_uid) + JOIN tbl_benutzer ON mitarbeiter_uid = uid + JOIN tbl_person USING(person_id); + "; + + if (!$db->db_query($qry)) + echo 'lehre.vw_stundenplandev: ' . $db->db_last_error() . '
    '; + else + echo 'lehre.vw_stundenplandev: Neue Spalte mitarbeiter_kurzbz hinzugefuegt
    '; +} + +// lehre.vw_stundenplan erweitern +if (!$result = @$db->db_query("SELECT mitarbeiter_kurzbz FROM lehre.vw_stundenplan LIMIT 1")) +{ + $qry = "CREATE OR REPLACE VIEW lehre.vw_stundenplan AS + SELECT + tbl_stundenplan.stundenplan_id, tbl_stundenplan.unr, tbl_stundenplan.mitarbeiter_uid AS uid, + tbl_stundenplan.lehreinheit_id, tbl_lehreinheit.lehrfach_id AS lehrfach_id, tbl_stundenplan.datum, + tbl_stundenplan.stunde, tbl_stundenplan.ort_kurzbz, tbl_stundenplan.studiengang_kz, + tbl_stundenplan.semester, tbl_stundenplan.verband, tbl_stundenplan.gruppe, tbl_stundenplan.gruppe_kurzbz, + tbl_stundenplan.titel, tbl_stundenplan.anmerkung, tbl_stundenplan.fix, tbl_lehreinheit.lehrveranstaltung_id, + tbl_studiengang.kurzbz AS stg_kurzbz, tbl_studiengang.kurzbzlang AS stg_kurzbzlang, + tbl_studiengang.bezeichnung AS stg_bezeichnung, tbl_studiengang.typ AS stg_typ, + (SELECT fachbereich_kurzbz FROM public.tbl_fachbereich WHERE oe_kurzbz=lehrfach.oe_kurzbz) as fachbereich_kurzbz, + lehrfach.kurzbz AS lehrfach, lehrfach.bezeichnung AS lehrfach_bez, lehrfach.farbe, + tbl_lehreinheit.lehrform_kurzbz AS lehrform, tbl_mitarbeiter.kurzbz AS lektor, + tbl_stundenplan.updateamum, tbl_stundenplan.updatevon, tbl_stundenplan.insertamum, + tbl_stundenplan.insertvon, tbl_lehreinheit.anmerkung AS anmerkung_lehreinheit, + tbl_mitarbeiter.kurzbz as mitarbeiter_kurzbz + FROM lehre.tbl_stundenplan + JOIN public.tbl_studiengang USING (studiengang_kz) + JOIN lehre.tbl_lehreinheit USING (lehreinheit_id) + JOIN lehre.tbl_lehrveranstaltung as lehrfach ON (tbl_lehreinheit.lehrfach_id=lehrfach.lehrveranstaltung_id) + JOIN public.tbl_mitarbeiter USING (mitarbeiter_uid) + JOIN tbl_benutzer ON mitarbeiter_uid = uid + JOIN tbl_person USING(person_id);"; + + if (!$db->db_query($qry)) + echo 'lehre.vw_stundenplan: ' . $db->db_last_error() . '
    '; + else + echo 'lehre.vw_stundenplan: Neue Spalte mitarbeiter_kurzbz hinzugefuegt
    '; +} + +// campus.vw_reservierung erweitern +if (!$result = @$db->db_query("SELECT mitarbeiter_kurzbz FROM campus.vw_reservierung LIMIT 1")) +{ + $qry = "CREATE OR REPLACE view campus.vw_reservierung + (reservierung_id, ort_kurzbz, studiengang_kz, uid, stunde, datum, titel, beschreibung, semester, verband, + gruppe, gruppe_kurzbz, stg_kurzbz, insertamum, insertvon, mitarbeiter_kurzbz) + AS + SELECT tbl_reservierung.reservierung_id, + tbl_reservierung.ort_kurzbz, + tbl_reservierung.studiengang_kz, + tbl_reservierung.uid, + tbl_reservierung.stunde, + tbl_reservierung.datum, + tbl_reservierung.titel, + tbl_reservierung.beschreibung, + tbl_reservierung.semester, + tbl_reservierung.verband, + tbl_reservierung.gruppe, + tbl_reservierung.gruppe_kurzbz, + tbl_studiengang.kurzbz AS stg_kurzbz, + tbl_reservierung.insertamum, + tbl_reservierung.insertvon, + tbl_mitarbeiter.kurzbz as mitarbeiter_kurzbz + FROM campus.tbl_reservierung + JOIN tbl_studiengang USING (studiengang_kz) + LEFT JOIN tbl_benutzer ON tbl_reservierung.uid = tbl_benutzer.uid + LEFT JOIN tbl_mitarbeiter ON tbl_benutzer.uid = tbl_mitarbeiter.mitarbeiter_uid + LEFT JOIN tbl_person USING (person_id);"; + + if (!$db->db_query($qry)) + echo 'campus.vw_reservierung: ' . $db->db_last_error() . '
    '; + else + echo 'campus.vw_reservierung: Neue Spalte mitarbeiter_kurzbz hinzugefuegt
    '; +} + diff --git a/system/dbupdate_3.4/24913_tabelle_raumtyp_neues_attribut_aktiv.php b/system/dbupdate_3.4/24913_tabelle_raumtyp_neues_attribut_aktiv.php new file mode 100644 index 000000000..98381776c --- /dev/null +++ b/system/dbupdate_3.4/24913_tabelle_raumtyp_neues_attribut_aktiv.php @@ -0,0 +1,15 @@ +db_query("SELECT aktiv FROM public.tbl_raumtyp LIMIT 1")) +{ + $qry = "ALTER TABLE public.tbl_raumtyp ADD COLUMN aktiv boolean NOT NULL DEFAULT true; + COMMENT ON COLUMN public.tbl_raumtyp.aktiv IS 'Zeigt an, ob Raumtyp aktuell ist.'; + "; + + if(!$db->db_query($qry)) + echo 'public.tbl_raumtyp '.$db->db_last_error().'
    '; + else + echo '
    Spalte aktiv zu Tabelle public.tbl_raumtyp hinzugefügt'; +} \ No newline at end of file diff --git a/system/dbupdate_3.4/25003_notenimport_nachpruefung.php b/system/dbupdate_3.4/25003_notenimport_nachpruefung.php new file mode 100644 index 000000000..7c2406d0e --- /dev/null +++ b/system/dbupdate_3.4/25003_notenimport_nachpruefung.php @@ -0,0 +1,15 @@ +db_query("SELECT 1 FROM lehre.tbl_pruefungstyp WHERE pruefungstyp_kurzbz='Termin3'")) +{ + if($db->db_num_rows($result)==0) + { + $qry = "INSERT INTO lehre.tbl_pruefungstyp(pruefungstyp_kurzbz, beschreibung, abschluss) VALUES('Termin3', '3.Termin', false);"; + + if(!$db->db_query($qry)) + echo 'Prüfungstyp: '.$db->db_last_error().'
    '; + else + echo '
    Prüfungstyp 3.Termin in lehre.tbl_pruefungstyp hinzugefügt'; + } +} diff --git a/system/dbupdate_3.4/27107_vilesci_erfassung_abwesenheiten_reinigung.php b/system/dbupdate_3.4/27107_vilesci_erfassung_abwesenheiten_reinigung.php new file mode 100644 index 000000000..a0d71b753 --- /dev/null +++ b/system/dbupdate_3.4/27107_vilesci_erfassung_abwesenheiten_reinigung.php @@ -0,0 +1,16 @@ +db_query("SELECT 1 FROM system.tbl_berechtigung WHERE berechtigung_kurzbz='mitarbeiter/zeitsperre:begrenzt'")) +{ + if($db->db_num_rows($result)==0) + { + $qry = "INSERT INTO system.tbl_berechtigung(berechtigung_kurzbz, beschreibung) VALUES('mitarbeiter/zeitsperre:begrenzt', 'Vilesci Verwaltung');"; + + if(!$db->db_query($qry)) + echo 'Berechtigung: '.$db->db_last_error().'
    '; + else + echo '
    Neue Berechtigung mitarbeiter/zeitsperre:begrenzt zu system.tbl_berechtigung hinzugefügt'; + } +} diff --git a/system/dbupdate_3.4/27351_digitalisierung_formulare.php b/system/dbupdate_3.4/27351_digitalisierung_formulare.php new file mode 100644 index 000000000..1f8dd4b4b --- /dev/null +++ b/system/dbupdate_3.4/27351_digitalisierung_formulare.php @@ -0,0 +1,327 @@ +db_query("SELECT 1 FROM campus.tbl_studierendenantrag_statustyp LIMIT 1")) +{ + $qry = "CREATE TABLE campus.tbl_studierendenantrag_statustyp ( + studierendenantrag_statustyp_kurzbz VARCHAR(32) NOT NULL, + bezeichnung VARCHAR(128)[] NOT NULL, + CONSTRAINT tbl_studierendenantrag_statustyp_pk PRIMARY KEY(studierendenantrag_statustyp_kurzbz) + ); + + GRANT SELECT, INSERT ON campus.tbl_studierendenantrag_statustyp TO vilesci; + GRANT SELECT ON campus.tbl_studierendenantrag_statustyp TO web;"; + + if(!$db->db_query($qry)) + echo 'campus.tbl_studierendenantrag_statustyp: '.$db->db_last_error().'
    '; + else + echo '
    campus.tbl_studierendenantrag_statustyp: table created'; +} + +if($result = @$db->db_query("SELECT 1 FROM campus.tbl_studierendenantrag_statustyp WHERE studierendenantrag_statustyp_kurzbz = 'Erstellt' ")) +{ + if($db->db_num_rows($result) == 0) + { + $qry = "INSERT INTO campus.tbl_studierendenantrag_statustyp + (studierendenantrag_statustyp_kurzbz, bezeichnung) + VALUES + ('Erstellt', '{\"Erstellt\",\"Created\"}'), + ('Genehmigt', '{\"Bestätigt\",\"Approved\"}'), + ('Abgelehnt', '{\"Abgelehnt\",\"Rejected\"}'), + ('Verzichtet', '{\"Verzichtet\",\"Pass\"}'), + ('Offen', '{\"Offen\",\"Reopened\"}'), + ('Zurueckgezogen', '{\"Zurückgezogen\",\"Cancelled\"}'), + ('Lvszugewiesen', '{\"Lvszugewiesen\",\"Lvsassigned\"}'), + ('EmailVersandt', '{\"Email Versandt\",\"Reminder Sent\"}'), + ('ErsteAufforderungVersandt', '{\"1.Aufforderung Versandt\",\"1st Request Sent\"}'), + ('ZweiteAufforderungVersandt', '{\"2.Aufforderung Versandt\",\"2nd Request Sent\"}'), + ('Beeinsprucht', '{\"Beeinsprucht\",\"Objected\"}'), + ('EinspruchAbgelehnt', '{\"Einspruch abgelehnt\",\"Objection denied\"}'); + "; + if (!$db->db_query($qry)) + echo 'campus.tbl_studierendenantrag_statustyp (insert): '.$db->db_last_error().'
    '; + else + echo '
    campus.tbl_studierendenantrag_statustyp: table prefilled'; + } +} + +if(!$result = @$db->db_query("SELECT 1 FROM campus.tbl_studierendenantrag LIMIT 1")) +{ + $qry = "CREATE TABLE campus.tbl_studierendenantrag ( + studierendenantrag_id INTEGER NOT NULL, + prestudent_id INTEGER NOT NULL, + studiensemester_kurzbz VARCHAR(32) NOT NULL, + datum TIMESTAMP NULL, + typ VARCHAR(32) NOT NULL, + insertamum TIMESTAMP DEFAULT NOW(), + insertvon VARCHAR(32) NOT NULL, + datum_wiedereinstieg TIMESTAMP NULL, + grund TEXT NULL, + dms_id INTEGER NULL, + CONSTRAINT tbl_studierendenantrag_pk PRIMARY KEY(studierendenantrag_id) + ); + CREATE SEQUENCE campus.tbl_studierendenantrag_studierendenantrag_id_seq + INCREMENT BY 1 + NO MAXVALUE + NO MINVALUE + CACHE 1; + ALTER TABLE campus.tbl_studierendenantrag ALTER COLUMN studierendenantrag_id SET DEFAULT nextval('campus.tbl_studierendenantrag_studierendenantrag_id_seq'); + + GRANT SELECT, INSERT ON campus.tbl_studierendenantrag TO vilesci; + GRANT SELECT, INSERT ON campus.tbl_studierendenantrag TO web; + GRANT SELECT, UPDATE ON campus.tbl_studierendenantrag_studierendenantrag_id_seq TO vilesci; + GRANT SELECT, UPDATE ON campus.tbl_studierendenantrag_studierendenantrag_id_seq TO web;"; + + if(!$db->db_query($qry)) + echo 'campus.tbl_studierendenantrag: '.$db->db_last_error().'
    '; + else + echo '
    campus.tbl_studierendenantrag: table created'; +} + +if(!$result = @$db->db_query("SELECT 1 FROM campus.tbl_studierendenantrag_status LIMIT 1")) +{ + $qry = "CREATE TABLE campus.tbl_studierendenantrag_status ( + studierendenantrag_status_id INTEGER NOT NULL, + studierendenantrag_id INTEGER NOT NULL, + studierendenantrag_statustyp_kurzbz VARCHAR(32) NOT NULL, + insertamum TIMESTAMP DEFAULT NOW(), + insertvon VARCHAR(32) NOT NULL, + grund TEXT NULL, + CONSTRAINT tbl_studierendenantrag_status_pk PRIMARY KEY(studierendenantrag_status_id), + CONSTRAINT tbl_studierendenantrag_fk FOREIGN KEY (studierendenantrag_id) REFERENCES campus.tbl_studierendenantrag(studierendenantrag_id) ON UPDATE CASCADE ON DELETE RESTRICT, + CONSTRAINT tbl_studierendenantrag_statustyp_fk FOREIGN KEY (studierendenantrag_statustyp_kurzbz) REFERENCES campus.tbl_studierendenantrag_statustyp(studierendenantrag_statustyp_kurzbz) ON UPDATE CASCADE ON DELETE RESTRICT + ); + CREATE SEQUENCE campus.tbl_studierendenantrag_status_studierendenantrag_status_id_seq + INCREMENT BY 1 + NO MAXVALUE + NO MINVALUE + CACHE 1; + ALTER TABLE campus.tbl_studierendenantrag_status ALTER COLUMN studierendenantrag_status_id SET DEFAULT nextval('campus.tbl_studierendenantrag_status_studierendenantrag_status_id_seq'); + + GRANT SELECT, INSERT, DELETE ON campus.tbl_studierendenantrag_status TO vilesci; + GRANT SELECT, INSERT, DELETE ON campus.tbl_studierendenantrag_status TO web; + GRANT SELECT, UPDATE ON campus.tbl_studierendenantrag_status_studierendenantrag_status_id_seq TO vilesci; + GRANT SELECT, UPDATE ON campus.tbl_studierendenantrag_status_studierendenantrag_status_id_seq TO web;"; + + if(!$db->db_query($qry)) + echo 'campus.tbl_studierendenantrag_status: '.$db->db_last_error().'
    '; + else + echo '
    campus.tbl_studierendenantrag_status: table created'; +} + +if(!$result = @$db->db_query("SELECT 1 FROM campus.tbl_studierendenantrag_lehrveranstaltung LIMIT 1")) +{ + $qry = "CREATE TABLE campus.tbl_studierendenantrag_lehrveranstaltung ( + studierendenantrag_lehrveranstaltung_id INTEGER NOT NULL, + studierendenantrag_id INTEGER NOT NULL, + lehrveranstaltung_id INTEGER NOT NULL, + studiensemester_kurzbz VARCHAR(16) NOT NULL, + note SMALLINT NOT NULL, + anmerkung TEXT NULL, + insertamum TIMESTAMP DEFAULT NOW(), + insertvon VARCHAR(32) NOT NULL, + CONSTRAINT tbl_studierendenantrag_lehrveranstaltung_pk PRIMARY KEY(studierendenantrag_lehrveranstaltung_id), + CONSTRAINT tbl_studiensemester_fk FOREIGN KEY (studiensemester_kurzbz) REFERENCES public.tbl_studiensemester(studiensemester_kurzbz) ON UPDATE CASCADE ON DELETE RESTRICT, + CONSTRAINT tbl_note_fk FOREIGN KEY (note) REFERENCES lehre.tbl_note(note) ON UPDATE CASCADE ON DELETE RESTRICT, + CONSTRAINT tbl_studierendenantrag_fk FOREIGN KEY (studierendenantrag_id) REFERENCES campus.tbl_studierendenantrag(studierendenantrag_id) ON UPDATE CASCADE ON DELETE RESTRICT + ); + CREATE SEQUENCE campus.tbl_studierendenantrag_lehrveranstaltung_studierendenantrag_lehrveranstaltung_id_seq + INCREMENT BY 1 + NO MAXVALUE + NO MINVALUE + CACHE 1; + ALTER TABLE campus.tbl_studierendenantrag_lehrveranstaltung ALTER COLUMN studierendenantrag_lehrveranstaltung_id SET DEFAULT nextval('campus.tbl_studierendenantrag_lehrveranstaltung_studierendenantrag_lehrveranstaltung_id_seq'); + + GRANT SELECT, INSERT, DELETE ON campus.tbl_studierendenantrag_lehrveranstaltung TO vilesci; + GRANT SELECT, INSERT ON campus.tbl_studierendenantrag_lehrveranstaltung TO web; + GRANT SELECT, UPDATE ON campus.tbl_studierendenantrag_lehrveranstaltung_studierendenantrag_lehrveranstaltung_id_seq TO vilesci; + GRANT SELECT, UPDATE ON campus.tbl_studierendenantrag_lehrveranstaltung_studierendenantrag_lehrveranstaltung_id_seq TO web;"; + + if(!$db->db_query($qry)) + echo 'campus.tbl_studierendenantrag_lehrveranstaltung: '.$db->db_last_error().'
    '; + else + echo '
    campus.tbl_studierendenantrag_lehrveranstaltung: table created'; +} + +if($result = @$db->db_query("SELECT 1 FROM system.tbl_berechtigung WHERE berechtigung_kurzbz = 'student/studierendenantrag';")) +{ + if($db->db_num_rows($result) == 0) + { + $qry = "INSERT INTO system.tbl_berechtigung(berechtigung_kurzbz, beschreibung) VALUES('student/studierendenantrag', 'Berechtigung für Bearbeiten Studierendenanträge');"; + + if(!$db->db_query($qry)) + echo 'system.tbl_berechtigung '.$db->db_last_error().'
    '; + else + echo ' system.tbl_berechtigung: Added permission for student/studierendenantrag
    '; + } +} + +if($result = @$db->db_query("SELECT 1 FROM system.tbl_berechtigung WHERE berechtigung_kurzbz = 'student/antragfreigabe';")) +{ + if($db->db_num_rows($result) == 0) + { + $qry = "INSERT INTO system.tbl_berechtigung(berechtigung_kurzbz, beschreibung) VALUES('student/antragfreigabe', 'Berechtigung für Freigabe der Studierendenanträge');"; + + if(!$db->db_query($qry)) + echo 'system.tbl_berechtigung '.$db->db_last_error().'
    '; + else + echo ' system.tbl_berechtigung: Added permission for student/antragfreigabe
    '; + } +} + +if (!$result = @$db->db_query("SELECT campus.get_status_studierendenantrag(0)")) { + $qry = 'CREATE FUNCTION campus.get_status_studierendenantrag(integer) RETURNS character varying + LANGUAGE plpgsql + AS $_$ + DECLARE i_studierendenantrag_id ALIAS FOR $1; + DECLARE rec RECORD; + BEGIN + SELECT INTO rec studierendenantrag_statustyp_kurzbz + FROM campus.tbl_studierendenantrag_status + WHERE studierendenantrag_id=i_studierendenantrag_id + ORDER BY insertamum desc + LIMIT 1; + + RETURN rec.studierendenantrag_statustyp_kurzbz; + END; + $_$; + + ALTER FUNCTION campus.get_status_studierendenantrag(integer) OWNER TO fhcomplete;'; + + if(!$db->db_query($qry)) + echo 'campus.get_status_studierendenantrag(integer): '.$db->db_last_error().'
    '; + else + echo '
    campus.get_status_studierendenantrag(integer): function created'; +} + +if (!$result = @$db->db_query("SELECT campus.get_status_id_studierendenantrag(0)")) { + $qry = 'CREATE FUNCTION campus.get_status_id_studierendenantrag(integer) RETURNS integer + LANGUAGE plpgsql + AS $_$ + DECLARE i_studierendenantrag_id ALIAS FOR $1; + DECLARE rec RECORD; + BEGIN + SELECT INTO rec studierendenantrag_status_id + FROM campus.tbl_studierendenantrag_status + WHERE studierendenantrag_id=i_studierendenantrag_id + ORDER BY insertamum desc + LIMIT 1; + + RETURN rec.studierendenantrag_status_id; + END; + $_$; + + ALTER FUNCTION campus.get_status_id_studierendenantrag(integer) OWNER TO fhcomplete;'; + + if(!$db->db_query($qry)) + echo 'campus.get_status_id_studierendenantrag(integer): '.$db->db_last_error().'
    '; + else + echo '
    campus.get_status_id_studierendenantrag(integer): function created'; +} + +if (!$result = @$db->db_query("SELECT public.get_absem_prestudent(0, null)")) { + $qry = 'CREATE FUNCTION public.get_absem_prestudent(integer, character varying) RETURNS integer + LANGUAGE plpgsql + AS $_$ + DECLARE i_prestudent_id ALIAS FOR $1; + DECLARE cv_studiensemester_kurzbz ALIAS FOR $2; + DECLARE rec RECORD; + BEGIN + IF (cv_studiensemester_kurzbz IS NULL) THEN + SELECT INTO rec ausbildungssemester + FROM public.tbl_prestudentstatus + WHERE prestudent_id=i_prestudent_id + ORDER BY datum desc,insertamum desc, ext_id desc + LIMIT 1; + ELSE + SELECT INTO rec ausbildungssemester + FROM tbl_prestudentstatus + WHERE prestudent_id=i_prestudent_id AND studiensemester_kurzbz=cv_studiensemester_kurzbz + ORDER BY datum desc,insertamum desc, ext_id desc + LIMIT 1; + END IF; + + RETURN rec.ausbildungssemester; + END; + $_$; + + ALTER FUNCTION public.get_absem_prestudent(integer, character varying) OWNER TO fhcomplete;'; + + if(!$db->db_query($qry)) + echo 'public.get_absem_prestudent(integer, character varying): '.$db->db_last_error().'
    '; + else + echo '
    public.get_absem_prestudent(integer, character varying): function created'; +} +if (!$result = @$db->db_query("SELECT public.get_stdsem_prestudent(0, null)")) { + $qry = 'CREATE FUNCTION public.get_stdsem_prestudent(integer, character varying) RETURNS character varying + LANGUAGE plpgsql + AS $_$ + DECLARE i_prestudent_id ALIAS FOR $1; + DECLARE cv_studiensemester_kurzbz ALIAS FOR $2; + DECLARE rec RECORD; + BEGIN + IF (cv_studiensemester_kurzbz IS NULL) THEN + SELECT INTO rec studiensemester_kurzbz + FROM public.tbl_prestudentstatus + WHERE prestudent_id=i_prestudent_id + ORDER BY datum desc,insertamum desc, ext_id desc + LIMIT 1; + ELSE + SELECT INTO rec studiensemester_kurzbz + FROM tbl_prestudentstatus + WHERE prestudent_id=i_prestudent_id AND studiensemester_kurzbz=cv_studiensemester_kurzbz + ORDER BY datum desc,insertamum desc, ext_id desc + LIMIT 1; + END IF; + + RETURN rec.studiensemester_kurzbz; + END; + $_$; + + ALTER FUNCTION public.get_stdsem_prestudent(integer, character varying) OWNER TO fhcomplete;'; + + if(!$db->db_query($qry)) + echo 'public.get_stdsem_prestudent(integer, character varying): '.$db->db_last_error().'
    '; + else + echo '
    public.get_stdsem_prestudent(integer, character varying): function created'; +} + +if($result = @$db->db_query("SELECT 1 FROM public.tbl_status_grund WHERE statusgrund_kurzbz = 'abbrecherStgl';")) +{ + if($db->db_num_rows($result) == 0) + { + $qry = "INSERT INTO public.tbl_status_grund(statusgrund_kurzbz, status_kurzbz, aktiv, beschreibung, bezeichnung_mehrsprachig) VALUES('abbrecherStgl', 'Abbrecher', TRUE, '{\"durch Stgl\", \"by Course Director\"}', '{\"durch Stgl\", \"by Course Director\"}');"; + + if(!$db->db_query($qry)) + echo 'public.tbl_status_grund '.$db->db_last_error().'
    '; + else + echo ' public.tbl_status_grund: Added Statusgrund abbrecherStgl for Abbrecher
    '; + } +} + +if($result = @$db->db_query("SELECT 1 FROM public.tbl_status_grund WHERE statusgrund_kurzbz = 'abbrecherStud';")) +{ + if($db->db_num_rows($result) == 0) + { + $qry = "INSERT INTO public.tbl_status_grund(statusgrund_kurzbz, status_kurzbz, aktiv, beschreibung, bezeichnung_mehrsprachig) VALUES('abbrecherStud', 'Abbrecher', TRUE, '{\"durch Stud\", \"by Student\"}', '{\"durch Stud\", \"by Student\"}');"; + + if(!$db->db_query($qry)) + echo 'public.tbl_status_grund '.$db->db_last_error().'
    '; + else + echo ' public.tbl_status_grund: Added Statusgrund abbrecherStud for Abbrecher
    '; + } +} + +if($result = @$db->db_query("SELECT 1 FROM public.tbl_status_grund WHERE statusgrund_kurzbz = 'preabbrecher';")) +{ + if($db->db_num_rows($result) == 0) + { + $qry = "INSERT INTO public.tbl_status_grund(statusgrund_kurzbz, status_kurzbz, aktiv, beschreibung, bezeichnung_mehrsprachig) VALUES('preabbrecher', 'Student', TRUE, '{\"Pre-Abbrecher\", \"Pre-Aborted\"}', '{\"Pre-Abbrecher\", \"Pre-Aborted\"}');"; + + if(!$db->db_query($qry)) + echo 'public.tbl_status_grund '.$db->db_last_error().'
    '; + else + echo ' public.tbl_status_grund: Added Statusgrund pre-abbrecher for Student
    '; + } +} diff --git a/system/dbupdate_3.4/27388_anrechnungen_zeitfenster_pflegen.php b/system/dbupdate_3.4/27388_anrechnungen_zeitfenster_pflegen.php new file mode 100644 index 000000000..3c84e2d17 --- /dev/null +++ b/system/dbupdate_3.4/27388_anrechnungen_zeitfenster_pflegen.php @@ -0,0 +1,57 @@ +db_query('SELECT 1 FROM lehre.tbl_anrechnungszeitraum LIMIT 1')) +{ + $qry = 'CREATE TABLE lehre.tbl_anrechnungszeitraum + ( + anrechnungszeitraum_id integer, + studiensemester_kurzbz varchar(16) NOT NULL, + anrechnungstart date, + anrechnungende date, + insertamum timestamp default NOW(), + insertvon varchar(32) + ); + + COMMENT ON TABLE lehre.tbl_anrechnungszeitraum IS \'Zeitfenster fuer Anrechnungen pro Studiensemester\'; + COMMENT ON COLUMN lehre.tbl_anrechnungszeitraum.anrechnungstart IS \'Zeitfenster Startdatum\'; + COMMENT ON COLUMN lehre.tbl_anrechnungszeitraum.anrechnungende IS \'Zeitfenster Enddatum\'; + + ALTER TABLE lehre.tbl_anrechnungszeitraum ADD CONSTRAINT pk_anrechnungszeitraum PRIMARY KEY (anrechnungszeitraum_id); + ALTER TABLE lehre.tbl_anrechnungszeitraum ADD CONSTRAINT fk_anrechnungszeitraum_studiensemester_kurzbz FOREIGN KEY (studiensemester_kurzbz) REFERENCES public.tbl_studiensemester(studiensemester_kurzbz) ON UPDATE CASCADE ON DELETE RESTRICT; + + CREATE SEQUENCE lehre.seq_anrechnungszeitraum_anrechnungszeitraum_id + START WITH 1 + INCREMENT BY 1 + NO MAXVALUE + NO MINVALUE + CACHE 1; + ALTER TABLE lehre.tbl_anrechnungszeitraum ALTER COLUMN anrechnungszeitraum_id SET DEFAULT nextval(\'lehre.seq_anrechnungszeitraum_anrechnungszeitraum_id\'); + + GRANT SELECT, UPDATE, INSERT, DELETE ON lehre.tbl_anrechnungszeitraum TO web; + GRANT SELECT, UPDATE, INSERT, DELETE ON lehre.tbl_anrechnungszeitraum TO vilesci; + GRANT SELECT, UPDATE ON lehre.seq_anrechnungszeitraum_anrechnungszeitraum_id TO vilesci; + GRANT SELECT, UPDATE ON lehre.seq_anrechnungszeitraum_anrechnungszeitraum_id TO web; + '; + + if(!$db->db_query($qry)) + echo 'lehre.tbl_anrechnungszeitraum: '.$db->db_last_error().'
    '; + else + echo ' lehre.tbl_anrechnungszeitraum: Tabelle hinzugefuegt
    '; +} + +// Add permission to admin Anrechnungen +if($result = @$db->db_query("SELECT 1 FROM system.tbl_berechtigung WHERE berechtigung_kurzbz = 'lehre/anrechnungszeitfenster';")) +{ + if($db->db_num_rows($result) == 0) + { + $qry = "INSERT INTO system.tbl_berechtigung(berechtigung_kurzbz, beschreibung) VALUES('lehre/anrechnungszeitfenster', 'Anrechnungszeitfenster anlegen');"; + + if(!$db->db_query($qry)) + echo 'system.tbl_berechtigung '.$db->db_last_error().'
    '; + else + echo ' system.tbl_berechtigung: Added permission for lehre/anrechnungszeitfenster
    '; + } +} \ No newline at end of file diff --git a/system/dbupdate_3.4/27949_infocenter_zurueckstellen_mit_grund.php b/system/dbupdate_3.4/27949_infocenter_zurueckstellen_mit_grund.php new file mode 100644 index 000000000..6bd0464db --- /dev/null +++ b/system/dbupdate_3.4/27949_infocenter_zurueckstellen_mit_grund.php @@ -0,0 +1,85 @@ +db_query("SELECT 1 FROM public.tbl_rueckstellung_status LIMIT 1;")) +{ + $qry = " + CREATE TABLE public.tbl_rueckstellung_status + ( + status_kurzbz character varying(32), + bezeichnung_mehrsprachig character varying(256)[], + sort integer, + aktiv boolean default true + ); + ALTER TABLE public.tbl_rueckstellung_status ADD CONSTRAINT pk_tbl_postpone_status_status_kurzbz PRIMARY KEY (status_kurzbz); + INSERT INTO public.tbl_rueckstellung_status(status_kurzbz, bezeichnung_mehrsprachig, sort) VALUES('parked', '{Parken, Park}', 1); + INSERT INTO public.tbl_rueckstellung_status(status_kurzbz, bezeichnung_mehrsprachig, sort) VALUES('onhold_bmi', '{Bundesministerium, Federal Ministry}', 2); + INSERT INTO public.tbl_rueckstellung_status(status_kurzbz, bezeichnung_mehrsprachig, sort) VALUES('onhold_zgv', '{ZGV Prüfung, ZGV examination}', 3); + INSERT INTO public.tbl_rueckstellung_status(status_kurzbz, bezeichnung_mehrsprachig, sort) VALUES('onhold_drittstaat', '{Drittstaat, Third country}', 4); + INSERT INTO public.tbl_rueckstellung_status(status_kurzbz, bezeichnung_mehrsprachig, sort) VALUES('onhold_remone', '{Reminder 1, Reminder 1}', 5); + INSERT INTO public.tbl_rueckstellung_status(status_kurzbz, bezeichnung_mehrsprachig, sort) VALUES('onhold_remtwo', '{Reminder 2, Reminder 2}', 6); + GRANT SELECT, INSERT, UPDATE, DELETE ON public.tbl_rueckstellung_status TO vilesci; + GRANT SELECT ON public.tbl_rueckstellung_status TO web; + "; + + if(!$db->db_query($qry)) + echo 'public.tbl_rueckstellung_status: '.$db->db_last_error().'
    '; + else + echo ' public.tbl_rueckstellung_status: Tabelle hinzugefuegt
    '; +} + +// Add table tbl_rueckstellung +if(!$result = @$db->db_query("SELECT 1 FROM public.tbl_rueckstellung LIMIT 1;")) +{ + $qry = " + CREATE TABLE public.tbl_rueckstellung + ( + rueckstellung_id integer NOT NULL, + person_id integer NOT NULL, + status_kurzbz character varying(32) NOT NULL, + datum_bis timestamp NOT NULL, + insertamum timestamp without time zone default now(), + insertvon character varying(32) + ); + + CREATE SEQUENCE public.tbl_rueckstellung_id_seq + INCREMENT BY 1 + NO MAXVALUE + NO MINVALUE + CACHE 1; + + ALTER TABLE public.tbl_rueckstellung ADD CONSTRAINT pk_tbl_rueckstellung PRIMARY KEY (rueckstellung_id); + ALTER TABLE public.tbl_rueckstellung ALTER COLUMN rueckstellung_id SET DEFAULT nextval('tbl_rueckstellung_id_seq'); + ALTER TABLE public.tbl_rueckstellung ADD CONSTRAINT fk_rueckstellung_person_id FOREIGN KEY (person_id) REFERENCES public.tbl_person(person_id) ON UPDATE CASCADE ON DELETE RESTRICT; + ALTER TABLE public.tbl_rueckstellung ADD CONSTRAINT fk_rueckstellung_status_kurzbz FOREIGN KEY (status_kurzbz) REFERENCES public.tbl_rueckstellung_status(status_kurzbz) ON UPDATE CASCADE ON DELETE RESTRICT; + GRANT SELECT, UPDATE ON public.tbl_rueckstellung_id_seq TO vilesci; + GRANT SELECT, UPDATE ON public.tbl_rueckstellung_id_seq TO web; + GRANT SELECT, INSERT, UPDATE, DELETE ON public.tbl_rueckstellung TO vilesci; + GRANT SELECT, UPDATE, DELETE ON public.tbl_rueckstellung TO web; + "; + + if(!$db->db_query($qry)) + echo 'public.tbl_rueckstellung: '.$db->db_last_error().'
    '; + else + echo ' public.tbl_rueckstellung: Tabelle hinzugefuegt
    '; + + //Übernahme von "zurückgestellten" und "geparkten" Personen + $qry = " + INSERT INTO public.tbl_rueckstellung (person_id, status_kurzbz, datum_bis, insertvon) + SELECT person_id, + CASE WHEN + (lower(l.logdata->>'name') = 'onhold') + THEN 'onhold_remone' + ELSE lower(l.logdata->>'name') + END, + zeitpunkt, insertvon + FROM system.tbl_log l + WHERE (l.logdata->>'name' = 'Onhold' OR l.logdata->>'name' = 'Parked') AND zeitpunkt >= NOW();"; + + if(!$db->db_query($qry)) + echo 'public.tbl_rueckstellung: '.$db->db_last_error().'
    '; + else + echo ' public.tbl_rueckstellung: Bestehene Eintraege uebernommen
    '; +} diff --git a/system/dbupdate_3.4/28089_plausichecks_in_extension_hinzufuegen.php b/system/dbupdate_3.4/28089_plausichecks_in_extension_hinzufuegen.php new file mode 100644 index 000000000..84a85629a --- /dev/null +++ b/system/dbupdate_3.4/28089_plausichecks_in_extension_hinzufuegen.php @@ -0,0 +1,16 @@ +db_query("SELECT 1 FROM system.tbl_fehler WHERE fehlertyp_kurzbz='error' AND fehler_kurzbz IN ('AbschlussstatusFehlt', 'AusbildungssemPrestudentUngleichAusbildungssemStatus', 'BewerberNichtZumRtAngetreten', 'GbDatumWeitZurueck', 'InaktiverStudentAktiverStatus')")) +{ + if($db->db_num_rows($result)>0) + { + $qry = "UPDATE system.tbl_fehler SET fehlertyp_kurzbz='warning' WHERE fehler_kurzbz IN ('AbschlussstatusFehlt', 'AusbildungssemPrestudentUngleichAusbildungssemStatus', 'BewerberNichtZumRtAngetreten', 'GbDatumWeitZurueck', 'InaktiverStudentAktiverStatus') AND fehlertyp_kurzbz = 'error';"; + + if(!$db->db_query($qry)) + echo 'System Tabelle Fehler: '.$db->db_last_error().'
    '; + else + echo '
    Bestimmte Fehler mit Typ error zu warnings umgewandelt'; + } +} diff --git a/system/dbupdate_3.4/29133_einzelne_studiengaenge_aus_issuechecks_ausnehmen.php b/system/dbupdate_3.4/29133_einzelne_studiengaenge_aus_issuechecks_ausnehmen.php new file mode 100644 index 000000000..7102806e3 --- /dev/null +++ b/system/dbupdate_3.4/29133_einzelne_studiengaenge_aus_issuechecks_ausnehmen.php @@ -0,0 +1,108 @@ +db_query("SELECT 1 FROM system.tbl_app WHERE app='personalverwaltung' LIMIT 1")) +{ + if ($db->db_num_rows($result) == 0) + { + $qry = "INSERT INTO system.tbl_app(app) VALUES('personalverwaltung');"; + + if(!$db->db_query($qry)) + echo 'system.tbl_app: '.$db->db_last_error().'
    '; + else + echo ' system.tbl_app: Personalverwaltung hinzugefügt
    '; + } +} + +if (!$result = @$db->db_query('SELECT 1 FROM system.tbl_fehler_konfigurationsdatentyp LIMIT 1')) +{ + $qry = 'CREATE TABLE system.tbl_fehler_konfigurationsdatentyp + ( + konfigurationsdatentyp varchar(32) + ); + + COMMENT ON TABLE system.tbl_fehler_konfigurationsdatentyp IS \'Konfigurationsparameter Datentypen\'; + COMMENT ON COLUMN system.tbl_fehler_konfigurationsdatentyp.konfigurationsdatentyp IS \'Datentyp der Konfigurationsparameter, z.B. integer oder string\'; + + ALTER TABLE system.tbl_fehler_konfigurationsdatentyp ADD CONSTRAINT pk_fehler_konfigurationsdatentyp PRIMARY KEY (konfigurationsdatentyp); + + GRANT SELECT ON system.tbl_fehler_konfigurationsdatentyp TO web; + GRANT SELECT, UPDATE, INSERT, DELETE ON system.tbl_fehler_konfigurationsdatentyp TO vilesci; + + -- prefill values + INSERT INTO system.tbl_fehler_konfigurationsdatentyp(konfigurationsdatentyp) VALUES(\'integer\'); + INSERT INTO system.tbl_fehler_konfigurationsdatentyp(konfigurationsdatentyp) VALUES(\'float\'); + INSERT INTO system.tbl_fehler_konfigurationsdatentyp(konfigurationsdatentyp) VALUES(\'string\'); + '; + + if(!$db->db_query($qry)) + echo 'system.tbl_fehler_konfigurationsdatentyp: '.$db->db_last_error().'
    '; + else + echo ' system.tbl_fehler_konfigurationsdatentyp: Tabelle hinzugefuegt
    '; +} + +if (!$result = @$db->db_query('SELECT 1 FROM system.tbl_fehler_konfigurationstyp LIMIT 1')) +{ + $qry = 'CREATE TABLE system.tbl_fehler_konfigurationstyp + ( + konfigurationstyp_kurzbz varchar(64), + beschreibung text, + konfigurationsdatentyp varchar(32), + app varchar(32) NOT NULL + ); + + COMMENT ON TABLE system.tbl_fehler_konfigurationstyp IS \'Konfigurationsparameter Typen\'; + COMMENT ON COLUMN system.tbl_fehler_konfigurationstyp.konfigurationstyp_kurzbz IS \'Art der Konfiguration\'; + COMMENT ON COLUMN system.tbl_fehler_konfigurationstyp.beschreibung IS \'Kurze Erklärung, was die Konfiguration bewirkt\'; + COMMENT ON COLUMN system.tbl_fehler_konfigurationstyp.app IS \'App, für welche die Konfiguration gilt\'; + + ALTER TABLE system.tbl_fehler_konfigurationstyp ADD CONSTRAINT pk_fehler_konfigurationstyp PRIMARY KEY (konfigurationstyp_kurzbz); + ALTER TABLE system.tbl_fehler_konfigurationstyp ADD CONSTRAINT fk_fehler_konfigurationstyp_app FOREIGN KEY (app) REFERENCES system.tbl_app(app) ON UPDATE CASCADE ON DELETE RESTRICT; + ALTER TABLE system.tbl_fehler_konfigurationstyp ADD CONSTRAINT fk_fehler_konfigurationstyp_konfigurationsdatentyp FOREIGN KEY (konfigurationsdatentyp) REFERENCES system.tbl_fehler_konfigurationsdatentyp(konfigurationsdatentyp) ON UPDATE CASCADE ON DELETE RESTRICT; + + GRANT SELECT, UPDATE, INSERT, DELETE ON system.tbl_fehler_konfigurationstyp TO web; + GRANT SELECT, UPDATE, INSERT, DELETE ON system.tbl_fehler_konfigurationstyp TO vilesci; + + -- prefill values + INSERT INTO system.tbl_fehler_konfigurationstyp(konfigurationstyp_kurzbz, beschreibung, konfigurationsdatentyp, app) + VALUES(\'exkludierteStudiengaenge\', \'Studiengangskennzahlen von Studiengängen, die nicht bei den Studierendenplausichecks berücksichtigt werden\', \'integer\', \'core\'); + '; + + if(!$db->db_query($qry)) + echo 'system.tbl_fehler_konfigurationstyp: '.$db->db_last_error().'
    '; + else + echo ' system.tbl_fehler_konfigurationstyp: Tabelle hinzugefuegt
    '; +} + +if (!$result = @$db->db_query('SELECT 1 FROM system.tbl_fehler_konfiguration LIMIT 1')) +{ + $qry = 'CREATE TABLE system.tbl_fehler_konfiguration + ( + konfigurationstyp_kurzbz varchar(64), + fehlercode varchar(64), + konfiguration jsonb NOT NULL, + insertamum timestamp default NOW(), + insertvon varchar(32), + updateamum timestamp, + updatevon varchar(32) + ); + + COMMENT ON TABLE system.tbl_fehler_konfiguration IS \'Konfigurationsparameter pro Fehler\'; + COMMENT ON COLUMN system.tbl_fehler_konfiguration.konfigurationstyp_kurzbz IS \'Art der Konfiguration\'; + COMMENT ON COLUMN system.tbl_fehler_konfiguration.konfiguration IS \'Konfigruationsparameter \'; + + ALTER TABLE system.tbl_fehler_konfiguration ADD CONSTRAINT pk_fehler_konfiguration PRIMARY KEY (konfigurationstyp_kurzbz, fehlercode); + ALTER TABLE system.tbl_fehler_konfiguration ADD CONSTRAINT fk_fehler_konfiguration_konfigurationstyp_kurzbz FOREIGN KEY (konfigurationstyp_kurzbz) REFERENCES system.tbl_fehler_konfigurationstyp(konfigurationstyp_kurzbz) ON UPDATE CASCADE ON DELETE RESTRICT; + ALTER TABLE system.tbl_fehler_konfiguration ADD CONSTRAINT fk_fehler_konfiguration_fehlercode FOREIGN KEY (fehlercode) REFERENCES system.tbl_fehler(fehlercode) ON UPDATE CASCADE ON DELETE RESTRICT; + + GRANT SELECT, UPDATE, INSERT, DELETE ON system.tbl_fehler_konfiguration TO web; + GRANT SELECT, UPDATE, INSERT, DELETE ON system.tbl_fehler_konfiguration TO vilesci; + '; + + if(!$db->db_query($qry)) + echo 'system.tbl_fehler_konfiguration: '.$db->db_last_error().'
    '; + else + echo ' system.tbl_fehler_konfiguration: Tabelle hinzugefuegt
    '; +} diff --git a/system/dbupdate_3.4/29529_infocenter_anpassungen.php b/system/dbupdate_3.4/29529_infocenter_anpassungen.php new file mode 100644 index 000000000..e11f3ed39 --- /dev/null +++ b/system/dbupdate_3.4/29529_infocenter_anpassungen.php @@ -0,0 +1,34 @@ +db_query("SELECT has_sequence_privilege('web', 'testtool.tbl_pruefling_pruefling_id_seq', 'UPDATE')")) +{ + + if($db->db_fetch_object($result)->has_sequence_privilege === "f") + { + $qry = "GRANT SELECT, UPDATE ON SEQUENCE testtool.tbl_pruefling_pruefling_id_seq to web;"; + + if(!$db->db_query($qry)) + echo 'testtool.tbl_pruefling Berechtigungen: '.$db->db_last_error().'
    '; + else + echo '
    Web User fuer testtool.tbl_pruefling berechtigt'; + } +} + +// Update Berechtigungen fuer vilesci User erteilen fuer tbl_pruefling_pruefling_id_seq +if($result = @$db->db_query("SELECT has_sequence_privilege('vilesci', 'testtool.tbl_pruefling_pruefling_id_seq', 'UPDATE')")) +{ + if($db->db_fetch_object($result)->has_sequence_privilege === "f") + { + $qry = "GRANT SELECT, UPDATE ON SEQUENCE testtool.tbl_pruefling_pruefling_id_seq to vilesci;"; + + if(!$db->db_query($qry)) + echo 'testtool.tbl_pruefling Berechtigungen: '.$db->db_last_error().'
    '; + else + echo '
    vilesci User fuer testtool.tbl_pruefling berechtigt'; + } +} + + diff --git a/system/dbupdate_3.4/29835_uhstat1_erfassung_der_uhstat1_daten_ueber_das_bewerbungstool.php b/system/dbupdate_3.4/29835_uhstat1_erfassung_der_uhstat1_daten_ueber_das_bewerbungstool.php new file mode 100644 index 000000000..aaa412d88 --- /dev/null +++ b/system/dbupdate_3.4/29835_uhstat1_erfassung_der_uhstat1_daten_ueber_das_bewerbungstool.php @@ -0,0 +1,141 @@ +db_query('SELECT 1 FROM bis.tbl_abschluss LIMIT 1')) +{ + $qry = "CREATE TABLE bis.tbl_abschluss + ( + ausbildung_code integer NOT NULL, + abschluss_bez varchar(128), + bezeichnung character varying(128)[], + aktiv boolean NOT NULL DEFAULT true, + in_oesterreich boolean, + CONSTRAINT pk_tbl_abschluss PRIMARY KEY (ausbildung_code) + ); + + COMMENT ON TABLE bis.tbl_abschluss IS 'Key-Table of graduation'; + COMMENT ON COLUMN bis.tbl_abschluss.aktiv IS 'Shows wether graduation is still valid.'; + COMMENT ON COLUMN bis.tbl_abschluss.in_oesterreich IS 'Shows if graduation was obtained in Austria.'; + + GRANT SELECT ON bis.tbl_abschluss TO web; + GRANT SELECT, UPDATE, INSERT, DELETE ON bis.tbl_abschluss TO vilesci; + + -- prefill values + INSERT INTO bis.tbl_abschluss(ausbildung_code, abschluss_bez, bezeichnung, in_oesterreich) VALUES(110, 'Pflichtschule', '{\"Pflichtschule (mit/ohne Abschluss)\", \"Compulsory school (Completed/not completed)\"}', true); + INSERT INTO bis.tbl_abschluss(ausbildung_code, abschluss_bez, bezeichnung, in_oesterreich) VALUES(121, 'Lehre', '{\"Lehre\", \"Apprenticeship\"}', true); + INSERT INTO bis.tbl_abschluss(ausbildung_code, abschluss_bez, bezeichnung, in_oesterreich) VALUES(122, 'Mittlere Schule ohne Matura', '{\"Mittlere Schule ohne Matura (z.B. Handelsschule, Fachschule)\", \"School for intermediate vocational education (without university entrance qualification)\"}', true); + INSERT INTO bis.tbl_abschluss(ausbildung_code, abschluss_bez, bezeichnung, in_oesterreich) VALUES(123, 'Meisterprüfung', '{\"Meisterprüfung\", \"Master craftsman''s diploma\"}', true); + INSERT INTO bis.tbl_abschluss(ausbildung_code, abschluss_bez, bezeichnung, in_oesterreich) VALUES(131, 'AHS', '{\"AHS (allgemein bildende höhere Schule)\", \"Academic secondary school\"}', true); + INSERT INTO bis.tbl_abschluss(ausbildung_code, abschluss_bez, bezeichnung, in_oesterreich) VALUES(132, 'BHS', '{\"BHS (berufsbildende höhere Schule, z.B. HAK, HTL)\", \"College for higher vocational education\"}', true); + INSERT INTO bis.tbl_abschluss(ausbildung_code, abschluss_bez, bezeichnung, in_oesterreich) VALUES(133, 'Sonstige Hochschulzugangsberechtigung', '{\"Sonstige Hochschulzugangsberechtigung (z.B. Berufsreifeprüfung)\", \"Other university entrance qualification (e.g. ''Berufsreifeprüfung'')\"}', true); + INSERT INTO bis.tbl_abschluss(ausbildung_code, abschluss_bez, bezeichnung, in_oesterreich) VALUES(141, 'Akademie', '{\"Akademie (z.B. PÄDAK, SOZAK)\", \"Academy (for example PÄDAK, SOZAK)\"}', true); + INSERT INTO bis.tbl_abschluss(ausbildung_code, abschluss_bez, bezeichnung, in_oesterreich) VALUES(142, 'Universität/Hochschule', '{\"Universität/Hochschule\", \"University/university of applied sciences/university college of teacher education\"}', true); + INSERT INTO bis.tbl_abschluss(ausbildung_code, abschluss_bez, bezeichnung, in_oesterreich) VALUES(210, 'Pflichtschule', '{\"Pflichtschule (mit/ohne Abschluss)\", \"Compulsory school (Completed/not completed)\"}', false); + INSERT INTO bis.tbl_abschluss(ausbildung_code, abschluss_bez, bezeichnung, in_oesterreich) VALUES(220, 'Ausbildung ohne Hochschulzugangsberechtigung', '{\"Lehre oder mittlere Schule ohne Matura/Ausbildung ohne Hochschulzugangsberechtigung\", \"Apprenticeship or school for intermediate vocational education (education without university entrance qualification)\"}', false); + INSERT INTO bis.tbl_abschluss(ausbildung_code, abschluss_bez, bezeichnung, in_oesterreich) VALUES(230, 'Ausbildung mit Hochschulzugangsberechtigung', '{\"Höhere Schule mit Matura / Ausbildung mit Hochschulzugangsberechtigung (z.B. Abitur)\", \"Higher secondary school with university entrance qualification\"}', false); + INSERT INTO bis.tbl_abschluss(ausbildung_code, abschluss_bez, bezeichnung, in_oesterreich) VALUES(240, 'Universität/Hochschule', '{\"Universität/Hochschule\", \"University/university of applied sciences/university college of teacher education\"}', false); + INSERT INTO bis.tbl_abschluss(ausbildung_code, abschluss_bez, bezeichnung) VALUES(999, 'unbekannt', '{\"Ich weiß nicht, welchen Abschluss meine erziehungsberechtigte Person erlangt hat.\", \"I do not know what degree my legal guardian got.\"}'); + "; + + if(!$db->db_query($qry)) + echo 'bis.tbl_abschluss: '.$db->db_last_error().'
    '; + else + echo ' bis.tbl_abschluss: Tabelle hinzugefuegt
    '; +} + +if (!$result = @$db->db_query('SELECT 1 FROM bis.tbl_uhstat1daten LIMIT 1')) +{ + $qry = "CREATE SEQUENCE bis.tbl_uhstat1daten_uhstat1daten_id_seq + INCREMENT BY 1 + NO MAXVALUE + NO MINVALUE + START WITH 1 + CACHE 1 + NO CYCLE; + + CREATE TABLE bis.tbl_uhstat1daten + ( + uhstat1daten_id integer DEFAULT nextval('bis.tbl_uhstat1daten_uhstat1daten_id_seq'::regclass), + mutter_geburtsstaat varchar(3), + mutter_bildungsstaat varchar(3), + mutter_geburtsjahr smallint, + mutter_bildungmax integer, + vater_geburtsstaat varchar(3), + vater_bildungsstaat varchar(3), + vater_geburtsjahr smallint, + vater_bildungmax integer, + person_id integer NOT NULL, + insertamum timestamp without time zone DEFAULT now(), + insertvon character varying(32), + updateamum timestamp without time zone, + updatevon character varying(32), + CONSTRAINT pk_tbl_uhstat1daten PRIMARY KEY (uhstat1daten_id) + ); + + ALTER TABLE bis.tbl_uhstat1daten ADD CONSTRAINT fk_tbl_uhstat1daten_mutter_geburtsstaat FOREIGN KEY (mutter_geburtsstaat) + REFERENCES bis.tbl_nation (nation_code) MATCH SIMPLE + ON DELETE RESTRICT ON UPDATE CASCADE; + + ALTER TABLE bis.tbl_uhstat1daten ADD CONSTRAINT fk_tbl_uhstat1daten_mutter_bildungsstaat FOREIGN KEY (mutter_bildungsstaat) + REFERENCES bis.tbl_nation (nation_code) MATCH SIMPLE + ON DELETE RESTRICT ON UPDATE CASCADE; + + ALTER TABLE bis.tbl_uhstat1daten ADD CONSTRAINT fk_tbl_uhstat1daten_mutter_bildungmax FOREIGN KEY (mutter_bildungmax) + REFERENCES bis.tbl_abschluss (ausbildung_code) MATCH SIMPLE + ON DELETE RESTRICT ON UPDATE CASCADE; + + ALTER TABLE bis.tbl_uhstat1daten ADD CONSTRAINT fk_tbl_uhstat1daten_vater_geburtsstaat FOREIGN KEY (vater_geburtsstaat) + REFERENCES bis.tbl_nation (nation_code) MATCH SIMPLE + ON DELETE RESTRICT ON UPDATE CASCADE; + + ALTER TABLE bis.tbl_uhstat1daten ADD CONSTRAINT fk_tbl_uhstat1daten_vater_bildungsstaat FOREIGN KEY (vater_bildungsstaat) + REFERENCES bis.tbl_nation (nation_code) MATCH SIMPLE + ON DELETE RESTRICT ON UPDATE CASCADE; + + ALTER TABLE bis.tbl_uhstat1daten ADD CONSTRAINT fk_tbl_uhstat1daten_vater_bildungmax FOREIGN KEY (vater_bildungmax) + REFERENCES bis.tbl_abschluss (ausbildung_code) MATCH SIMPLE + ON DELETE RESTRICT ON UPDATE CASCADE; + + ALTER TABLE bis.tbl_uhstat1daten ADD CONSTRAINT fk_tbl_uhstat1daten_person_id FOREIGN KEY (person_id) + REFERENCES public.tbl_person (person_id) MATCH SIMPLE + ON DELETE RESTRICT ON UPDATE CASCADE; + + ALTER TABLE bis.tbl_uhstat1daten ADD CONSTRAINT uk_uhstat1daten_person_id UNIQUE(person_id); + + COMMENT ON TABLE bis.tbl_uhstat1daten IS 'UHSTAT1 data for a person (statistical data)'; + COMMENT ON COLUMN bis.tbl_uhstat1daten.mutter_geburtsstaat IS 'Birth country of mother of person'; + COMMENT ON COLUMN bis.tbl_uhstat1daten.mutter_bildungsstaat IS 'Education country of mother of person'; + COMMENT ON COLUMN bis.tbl_uhstat1daten.mutter_geburtsjahr IS 'Birth year of mother of person'; + COMMENT ON COLUMN bis.tbl_uhstat1daten.mutter_bildungmax IS 'Highest completed level of education of mother (code)'; + COMMENT ON COLUMN bis.tbl_uhstat1daten.vater_geburtsstaat IS 'Birth country of father of person'; + COMMENT ON COLUMN bis.tbl_uhstat1daten.vater_bildungsstaat IS 'Education country of father of person'; + COMMENT ON COLUMN bis.tbl_uhstat1daten.vater_geburtsjahr IS 'Birth year of father of person'; + COMMENT ON COLUMN bis.tbl_uhstat1daten.vater_bildungmax IS 'Highest completed level of education of father (code)'; + + GRANT SELECT, UPDATE, INSERT, DELETE ON bis.tbl_uhstat1daten TO web; + GRANT SELECT, UPDATE, INSERT, DELETE ON bis.tbl_uhstat1daten TO vilesci; + GRANT SELECT, UPDATE ON bis.tbl_uhstat1daten_uhstat1daten_id_seq TO vilesci; + GRANT SELECT, UPDATE ON bis.tbl_uhstat1daten_uhstat1daten_id_seq TO web; + "; + + if(!$db->db_query($qry)) + echo 'bis.tbl_uhstat1daten: '.$db->db_last_error().'
    '; + else + echo ' bis.tbl_uhstat1daten: Tabelle hinzugefuegt
    '; +} + +// Add permission for managing UHSTAT1 data +if($result = @$db->db_query("SELECT 1 FROM system.tbl_berechtigung WHERE berechtigung_kurzbz = 'student/uhstat1daten_verwalten';")) +{ + if($db->db_num_rows($result) == 0) + { + $qry = "INSERT INTO system.tbl_berechtigung(berechtigung_kurzbz, beschreibung) VALUES('student/uhstat1daten_verwalten', 'UHSTAT1 Daten verwalten');"; + + if(!$db->db_query($qry)) + echo 'system.tbl_berechtigung '.$db->db_last_error().'
    '; + else + echo ' system.tbl_berechtigung: Added permission for student/uhstat1daten_verwalten
    '; + } +} diff --git a/system/dbupdate_3.4/30181_tabelle_anrechnung_neue_attribute_fuer_begruendung.php b/system/dbupdate_3.4/30181_tabelle_anrechnung_neue_attribute_fuer_begruendung.php new file mode 100644 index 000000000..922920071 --- /dev/null +++ b/system/dbupdate_3.4/30181_tabelle_anrechnung_neue_attribute_fuer_begruendung.php @@ -0,0 +1,28 @@ +db_query("SELECT begruendung_ects FROM lehre.tbl_anrechnung LIMIT 1")) +{ + $qry = "ALTER TABLE lehre.tbl_anrechnung ADD COLUMN begruendung_ects text; + COMMENT ON COLUMN lehre.tbl_anrechnung.begruendung_ects IS 'Begruendung gleichwertiger ECTS'; + "; + + if(!$db->db_query($qry)) + echo 'lehre.tbl_anrechnung '.$db->db_last_error().'
    '; + else + echo '
    Spalte begruendung_ects zu Tabelle lehre.tbl_anrechnung hinzugefügt'; +} + +//Add column begruendung_lvinhalt to lehre.tbl_anrechnung +if(!@$db->db_query("SELECT begruendung_lvinhalt FROM lehre.tbl_anrechnung LIMIT 1")) +{ + $qry = "ALTER TABLE lehre.tbl_anrechnung ADD COLUMN begruendung_lvinhalt text; + COMMENT ON COLUMN lehre.tbl_anrechnung.begruendung_lvinhalt IS 'Begruendung gleichwertiger LV-Inhalte'; + "; + + if(!$db->db_query($qry)) + echo 'lehre.tbl_anrechnung '.$db->db_last_error().'
    '; + else + echo '
    Spalte begruendung_lvinhalt zu Tabelle lehre.tbl_anrechnung hinzugefügt'; +} \ No newline at end of file diff --git a/system/dbupdate_3.4/30537_anmerkung_in_tbl_rolleberechtigung.php b/system/dbupdate_3.4/30537_anmerkung_in_tbl_rolleberechtigung.php new file mode 100644 index 000000000..0d7b43b8f --- /dev/null +++ b/system/dbupdate_3.4/30537_anmerkung_in_tbl_rolleberechtigung.php @@ -0,0 +1,15 @@ +db_query("SELECT anmerkung FROM system.tbl_rolleberechtigung LIMIT 1")) +{ + $qry = "ALTER TABLE system.tbl_rolleberechtigung ADD COLUMN anmerkung varchar(256); + ALTER TABLE system.tbl_rolleberechtigung ADD COLUMN insertamum timestamp DEFAULT now(); + ALTER TABLE system.tbl_rolleberechtigung ADD COLUMN insertvon varchar(32);"; + + if(!$db->db_query($qry)) + echo 'system.tbl_rolleberechtigung '.$db->db_last_error().'
    '; + else + echo '
    Spalten anmerkung, insertamum, insertvon in system.tbl_rolleberechtigung hinzugefügt'; +} diff --git a/system/dbupdate_3.4/33714_erhoehter_studienbeitrag_fuer_drittsaatenangehoerig.php b/system/dbupdate_3.4/33714_erhoehter_studienbeitrag_fuer_drittsaatenangehoerig.php new file mode 100644 index 000000000..d2c0c07b8 --- /dev/null +++ b/system/dbupdate_3.4/33714_erhoehter_studienbeitrag_fuer_drittsaatenangehoerig.php @@ -0,0 +1,13 @@ +db_query("SELECT 1 FROM public.tbl_buchungstyp WHERE buchungstyp_kurzbz = 'StudiengebuehrErhoeht';")) +{ + if ($db->db_num_rows($result) == 0) + { + $qry = "INSERT INTO public.tbl_buchungstyp (buchungstyp_kurzbz, beschreibung, standardtext, standardbetrag) VALUES ('StudiengebuehrErhoeht', 'Erhöhter Studienbeitrag', 'Erhöhter Studienbeitrag', '-3000');"; + if (!$db->db_query($qry)) + echo 'public.tbl_buchungstyp '.$db->db_last_error().'
    '; + else + echo ' public.tbl_buchungstyp: Added buchungstyp "StudiengebuehrErhoeht"
    '; + } +} \ No newline at end of file diff --git a/system/fehlerupdate.php b/system/fehlerupdate.php index 98204315a..f29323c7c 100644 --- a/system/fehlerupdate.php +++ b/system/fehlerupdate.php @@ -277,6 +277,14 @@ $fehlerArr = array( 'fehlertyp_kurzbz' => 'error', 'app' => 'core' ), + array( + 'fehlercode' => 'CORE_STUDENTSTATUS_0015', + 'fehler_kurzbz' => 'AktiverStudentstatusOhneKontobuchung', + 'fehlercode_extern' => null, + 'fehlertext' => 'Keine Kontobuchung bei aktivem Studentstatus (prestudent_id %s, Studiensemester %s)', + 'fehlertyp_kurzbz' => 'error', + 'app' => 'core' + ), array( 'fehlercode' => 'CORE_PERSON_0001', 'fehler_kurzbz' => 'GbDatumWeitZurueck', diff --git a/system/filtersupdate.php b/system/filtersupdate.php index a3bb99a43..cc9abfb98 100644 --- a/system/filtersupdate.php +++ b/system/filtersupdate.php @@ -40,7 +40,9 @@ $filters = array( {"name": "User/Operator"}, {"name": "InfoCenterMitarbeiter"}, {"name": "LockUser"}, - {"name": "OnholdDate"} + {"name": "HoldDate"}, + {"name": "Rueckstellgrund"}, + {"name": "Kaution"} ], "filters": [ { @@ -511,13 +513,36 @@ $filters = array( { "name": "Abgewiesen - Alle", "columns": [ - {"name": "PersonID"}, + {"name": "PersonId"}, {"name": "PreStudentID"}, {"name": "Vorname"}, {"name": "Nachname"}, {"name": "Studiengang"}, {"name": "AbgewiesenAm"}, - {"name": "Nachricht"} + {"name": "Nachricht"}, + {"name": "Kaution"}, + {"name": "LockUser"} + ], + "filters": [] + } + ', + 'oe_kurzbz' => null, + ), + array( + 'app' => 'infocenter', + 'dataset_name' => 'aufgenommen', + 'filter_kurzbz' => 'InfoCenterAufgenommenAlle', + 'description' => '{Alle}', + 'sort' => 1, + 'default_filter' => true, + 'filter' => ' + { + "name": "Aufgenommen - Lehrgänge", + "columns": [ + {"name": "PersonId"}, + {"name": "Vorname"}, + {"name": "Nachname"}, + {"name": "Studiengang"} ], "filters": [] } @@ -1035,6 +1060,7 @@ $filters = array( {"name": "Note"}, {"name": "ErstNachname"}, {"name": "ErstAbgeschickt"}, + {"name": "ZweitNachname"}, {"name": "ZweitAbgeschickt"} ], "filters": [] @@ -1121,6 +1147,72 @@ $filters = array( ', 'oe_kurzbz' => null, ), + array( + 'app' => 'personalverwaltung', + 'dataset_name' => 'personalIssueViewer', + 'filter_kurzbz' => 'offeneFehlerPersonal', + 'description' => '{Alle offenen Fehler}', + 'sort' => 1, + 'default_filter' => true, + 'filter' => ' + { + "name": "Alle offenen Fehler", + "columns": [ + {"name": "Datum"}, + {"name": "Inhalt"}, + {"name": "Vorname"}, + {"name": "Nachname"}, + {"name": "PersonId"}, + {"name": "Statuscode"} + ], + "filters": [ + { + "name": "Statuscode", + "operation": "ncontains", + "condition": "resolved" + } + ] + } + ', + 'oe_kurzbz' => null, + ), + array( + 'app' => 'personalverwaltung', + 'dataset_name' => 'personalIssueViewer', + 'filter_kurzbz' => 'FehlerLetzte7TageBearbeitetPersonal', + 'description' => '{Letzten 7 Tage bearbeitet}', + 'sort' => 2, + 'default_filter' => false, + 'filter' => ' + { + "name": "Alle in den letzten 7 Tagen bearbeiteten Fehler", + "columns": [ + {"name": "Datum"}, + {"name": "Inhalt"}, + {"name": "Vorname"}, + {"name": "Nachname"}, + {"name": "PersonId"}, + {"name": "Statuscode"}, + {"name": "Verarbeitet von"}, + {"name": "Verarbeitet am"} + ], + "filters": [ + { + "name": "Verarbeitet am", + "operation": "lt", + "condition": "7", + "option": "days" + }, + { + "name": "Statuscode", + "operation": "contains", + "condition": "resolved" + } + ] + } + ', + 'oe_kurzbz' => null, + ), array( 'app' => 'core', 'dataset_name' => 'fehlerZustaendigkeiten', @@ -1144,6 +1236,28 @@ $filters = array( ', 'oe_kurzbz' => null ), + array( + 'app' => 'core', + 'dataset_name' => 'fehlerKonfiguration', + 'filter_kurzbz' => 'fehlerKonfiguration', + 'description' => '{Fehler Konfiguration}', + 'sort' => 1, + 'default_filter' => true, + 'filter' => ' + { + "name": "Fehler Konfiguration", + "columns": [ + {"name": "konfigurationstyp_kurzbz"}, + {"name": "fehlercode"}, + {"name": "fehler_kurzbz"}, + {"name": "konfiguration"}, + {"name": "app"} + ], + "filters": [] + } + ', + 'oe_kurzbz' => null + ), array( 'app' => 'core', 'dataset_name' => 'gruppenmanagement', diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php index 561559363..b5fa7cc7b 100644 --- a/system/phrasesupdate.php +++ b/system/phrasesupdate.php @@ -3747,8 +3747,8 @@ $phrases = array( ) ), array( - 'app' => 'core', - 'category' => 'global', + 'app' => 'infocenter', + 'category' => 'infocenter', 'phrase' => 'rueckstelldatum', 'insertvon' => 'system', 'phrases' => array( @@ -3766,6 +3766,26 @@ $phrases = array( ) ) ), + array( + 'app' => 'infocenter', + 'category' => 'infocenter', + 'phrase' => 'rueckstellgrund', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Rückstellgrund', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'onHold reason', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), array( 'app' => 'infocenter', 'category' => 'infocenter', @@ -4114,6 +4134,691 @@ When on hold, the date is only a reminder.', ) ) ), + array( + 'app' => 'infocenter', + 'category' => 'infocenter', + 'phrase' => 'kaution', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Kaution', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Deposit', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'infocenter', + 'category' => 'infocenter', + 'phrase' => 'rechnungsnummer', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Rechnungsnummer', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Invoice Number', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'infocenter', + 'category' => 'infocenter', + 'phrase' => 'date', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Rechnungsnummer', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Invoice Number', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'infocenter', + 'category' => 'infocenter', + 'phrase' => 'faelligam', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Fällig am', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Due on', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'infocenter', + 'category' => 'infocenter', + 'phrase' => 'gesamtbetrag', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Gesamtbetrag', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Total amount', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'infocenter', + 'category' => 'infocenter', + 'phrase' => 'rechnungsempfaenger', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Rechnungsempfänger', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Invoice recipient', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'infocenter', + 'category' => 'infocenter', + 'phrase' => 'rechnung', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Rechnungsempfänger', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Invoice', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'infocenter', + 'category' => 'infocenter', + 'phrase' => 'studiensemester', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Semester', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Semester', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'infocenter', + 'category' => 'infocenter', + 'phrase' => 'bezeichnung', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Bezeichnung', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Title', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'infocenter', + 'category' => 'infocenter', + 'phrase' => 'datum', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Datum', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Date', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'infocenter', + 'category' => 'infocenter', + 'phrase' => 'zahlungsbestaetigung', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Zahlungsbestätigung', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Payment confirmation', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'infocenter', + 'category' => 'bewerbung', + 'phrase' => 'erklaerungInvoices', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Ablauf und Zahlungsbedingungen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => '', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'infocenter', + 'category' => 'infocenter', + 'phrase' => 'rechnungserklaerung', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Wir möchten Sie darauf aufmerksam machen, dass bei der Überweisung *immer* die Rechnungsnummer als Zahlungsreferenz anzuführen ist. + Andernfalls erfolgt keine automatische Zahlungszuordnung und es kann zu einer Verzögerung der Darstellung des aktuellen Zahlungsstatus + der Rechnung im CIS kommen. +
    +
    + Im Falle dass der Betrag an ein falsches Konto überwiesen wurde, bitten wir Sie höflichst sich an Ihre Bank zu wenden. +
    +
    + Jede Rechnung gilt als "Bezahlt", wenn der Gesamtbetrag vollständig auf unser Konto eingelangt ist. +
    +
    ', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => '', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'infocenter', + 'category' => 'infocenter', + 'phrase' => 'kontoinfotitle', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Kontoinformationen der FHTW', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => '', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'infocenter', + 'category' => 'infocenter', + 'phrase' => 'kontoinfobody', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Sämtliche Zahlungen sind an die nachstehende Kontonummer zu leisten und die Rechnungsnummer muss als Zahlungsreferenz eingegeben werden.', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => '', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'infocenter', + 'category' => 'infocenter', + 'phrase' => 'kontoinfoausland', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Auslandsüberweisungen: +
    + Bei Auslandsüberweisungen sind die Spesenkosten von den +
    + Zahlenden zusätzlich zu den Rechnungsbeträgen zu zahlen.', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => '', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'infocenter', + 'category' => 'infocenter', + 'phrase' => 'rechnungtitle', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Rechnungen & Zahlungsbestätigungen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => '', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + + array( + 'app' => 'infocenter', + 'category' => 'infocenter', + 'phrase' => 'faq0frage', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Warum ist die Einzahlung trotz Einzahlung noch offen?', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => '', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'infocenter', + 'category' => 'infocenter', + 'phrase' => 'faq0antwort', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Der häufigste Grund für diesen Fall ist, dass bei der Überweisung nicht die Rechnungsnummer als Zahlungsreferenz eingegeben wird. +Wir bitten Sie höflichst in diesem Fall eine Mail an billing@technikum-wien.at mit Zahlungsbestätigung zu senden. +Die Transaktion und die Bearbeitung der Zahlung, kann bis zu sechs Werktage dauern.', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => '', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'infocenter', + 'category' => 'infocenter', + 'phrase' => 'faq1frage', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Ich habe keine Rechnung erhalten, was tun?', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => '', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'infocenter', + 'category' => 'infocenter', + 'phrase' => 'faq1antwort', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'In diesem Fall ist der Spam-Ordner zu kontrollieren. Falls die Rechnung nicht übermittelt wurde ersuchen wir um Information an billing@technikum-wien.at. +Die Rechnung wird Ihnen erneut zugesendet. Erst nach Erhalt der Rechnung ist der Betrag zu überweisen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => '', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'infocenter', + 'category' => 'infocenter', + 'phrase' => 'faq2frage', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Refundierung des Studienbeitrags', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => '', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'infocenter', + 'category' => 'infocenter', + 'phrase' => 'faq2antwort', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Der Studienbeitrag wird nicht rückerstattet, wenn… +-Anfänger*innen, die ihren Studienplatz nach Semesterbeginn (1. September / 16. Februar) nicht in Anspruch nehmen +-Studierende, die ihr Studium nach Semesterbeginn (1. September / 16. Februar) abbrechen. + +-Unterbrechung vor dem 15.10. bzw. 15.3.: Studienbeitrag wird rückerstattet +-Unterbrechung nach dem 15.10. bzw. 15.3.: Studienbeitrag wird nicht rückerstattet +-in den Folgesemestern der Unterbrechung sind keine Studienbeiträge zu zahlen; der ÖHBeitrag ist jedoch in jedem Semester der Unterbrechung zu zahlen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => '', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'infocenter', + 'category' => 'infocenter', + 'phrase' => 'faq3frage', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Sie sind vom Studienbeitrag befreit und haben eine Rechnung für den Studienbeitrag bekommen?', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => '', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'infocenter', + 'category' => 'infocenter', + 'phrase' => 'faq3antwort', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Treten Sie bitte in Kontakt mit Ihrer Studiengangsassistenz. Die offene Rechnung wird storniert.', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => '', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'infocenter', + 'category' => 'infocenter', + 'phrase' => 'faq4frage', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Mir ist ein Fehler bei der Überweisung unterlaufen, was tun?', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => '', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'infocenter', + 'category' => 'infocenter', + 'phrase' => 'faq4antwort', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Bitte den Fehler an billing@technikum-wien.at melden.', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => '', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'infocenter', + 'category' => 'infocenter', + 'phrase' => 'faq5frage', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Eine Rechnung wurde zwei Mal überwiesen, was tun?', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => '', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'infocenter', + 'category' => 'infocenter', + 'phrase' => 'faq5antwort', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Falls eine Rechnung doppelt überwiesen wurde, bitten wir Sie dies an billing@technikum-wien.at zu melden. Wir werden Ihnen eine Zahlung refundieren.', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => '', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'infocenter', + 'category' => 'infocenter', + 'phrase' => 'faq6frage', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Es stehen mehrere Positionen auf der Rechnung – soll für jede Position eine Überweisung durchgeführt werden?', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => '', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'infocenter', + 'category' => 'infocenter', + 'phrase' => 'faq6antwort', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Nein, es ist immer der auf der Rechnung ausgewiesene Gesamtbetrag zu überweisen.', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => '', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'infocenter', + 'category' => 'infocenter', + 'phrase' => 'faq7frage', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Wann kann der Betrag überwiesen werden?', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => '', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'infocenter', + 'category' => 'infocenter', + 'phrase' => 'faq7antwort', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Wir möchten Sie darauf hinweisen, dass Überweisungen erst bei Erhalt der Rechnung durchzuführen sind. Bitte um Angabe der Rechnungsnummer als Zahlungsreferenz.', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => '', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( 'app' => 'core', 'category' => 'password', @@ -5734,6 +6439,26 @@ When on hold, the date is only a reminder.', ) ) ), + array( + 'app' => 'core', + 'category' => 'ui', + 'phrase' => 'error_invalid_date', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Das Datumsformat ist ungültig oder liegt außerhalb des gültigen Bereichs.', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'The date format is invalid or out of range.', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), array( 'app' => 'core', 'category' => 'ui', @@ -10869,6 +11594,178 @@ Any unusual occurrences ) ) ), + array( + 'app' => 'core', + 'category' => 'anrechnung', + 'phrase' => 'begruendungEcts', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Begründen Sie die Gleichwertigkeit der ECTS', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Give reasons for the equivalence of ECTS', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'anrechnung', + 'phrase' => 'begruendungLvinhalt', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Begründen Sie die Gleichwertigkeit der Lehrveranstaltungsinhalte', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Give reasons for the equivalence of the course contents', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'anrechnung', + 'phrase' => 'anrechnungBegruendungEctsTooltipText', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Hinsichtlich des Umfangs der LV, die Sie anrechnen lassen wollen: Bitte erläutern Sie, warum Ihr Zeugnis bzw. Ihre berufliche Praxis mit dem Umfang der LV gleichwertig ist.

    Referenzbeispiele für die ECTS-Berechnung finden Sie rechts in der Infobox.', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Regarding the scope of the course you want to have credited: Please explain why your certificate or your professional practice is equivalent to the scope of the course.

    Reference examples for the ECTS calculation can be found in the info box on the right.', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'anrechnung', + 'phrase' => 'anrechnungBegruendungLvinhaltTooltipText', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Hinsichtlich der Lernergebnisse der LV (vgl. CIS), die Sie anrechnen lassen wollen: Bitte erläutern Sie, warum die von Ihnen erworbenen Kompetenzen mit diesen Lernergebnissen gleichwertig sind.', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'With regard to the learning outcomes of the course (cf. CIS) for which you want to receive credit: Please explain why the competences you have acquired are equivalent to these learning outcomes.', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'anrechnung', + 'phrase' => 'requestAnrechnungInfoEctsBerechnungTitle', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Referenzbeispiele ECTS-Berechnung', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Reference examples of ECTS calculation', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'anrechnung', + 'phrase' => 'requestAnrechnungInfoEctsBerechnungBody', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => "1 ECTS an der FH Technikum Wien entspricht einem Arbeitsaufwand von 25 Stunden. +

    Schulisches Zeugnis: +
    Bitte die Unterrichtsstunden nachvollziehbar in ECTS umrechnen (ein Schuljahr besteht aus ca. 40 Wochen; d.h., eine Unterrichtsstunde pro Woche sind insgesamt ca. 40 Stunden Jahresaufwand.) +

    Hochschulzeugnis: +
    Bitte die ECTS angeben. +

    Berufliche Praxis: +
    Bitte die Dauer der einschlägigen beruflichen Praxis nachvollziehbar in ECTS umrechnen (1,5 ECTS sind ungefähr eine Arbeitswoche im Umfang von 37,5 Stunden).", + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => "
    1 ECTS at the FH Technikum Wien corresponds to a workload of 25 hours. +

    School certificate: +
    Please convert the teaching hours into ECTS in a comprehensible way (a school year consists of approx. 40 weeks; i.e. one teaching hour per week is a total of approx. 40 hours of annual work). +

    University certificate: +
    Please indicate the ECTS. +

    Professional practice: +
    Please convert the duration of the relevant professional practice into ECTS in a comprehensible way (1.5 ECTS are approximately one working week of 37.5 hours).", + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'anrechnung', + 'phrase' => 'begruendungEctsLabel', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Begründung Gleichwertigkeit ECTS', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Reason Equivalency of ECTS', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'anrechnung', + 'phrase' => 'begruendungLvinhaltLabel', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Begründung Gleichwertigkeit LV-Inhalt', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Reason Equivalency of Course content', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), array( 'app' => 'core', 'category' => 'anrechnung', @@ -11529,6 +12426,86 @@ Any unusual occurrences ) ) ), + array( + 'app' => 'core', + 'category' => 'anrechnung', + 'phrase' => 'empfehlungNegativKenntnisseNichtGleichwertigWeil', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Die anzurechnenden Kenntnisse sind umfangmäßig und/oder inhaltlich nicht gleichwertig, weil...[Erläuterung: Bitte Begründung ergänzen.]', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'The equivalence in terms of learning objectives and the length of the course can not be determined because of...[Explanation: Please add reason.]', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'anrechnung', + 'phrase' => 'empfehlungNegativKenntnisseNichtGleichwertigWeilHinweis', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Die anzurechnenden Kenntnisse sind umfangmäßig und/oder inhaltlich nicht gleichwertig, weil... Bei einer Ablehnung ist eine individuelle Begründung erforderlich. Dies kann nur über die Detailseite erfolgen.', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'The equivalence in terms of learning objectives and the length of the course can not be determined because of... If the application is rejected, an individual reason is required. This can only be done from the detail page.', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'anrechnung', + 'phrase' => 'genehmigungNegativKenntnisseNichtGleichwertigWeil', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Die anzurechnenden Kenntnisse sind umfangmäßig und/oder inhaltlich nicht gleichwertig, weil...[Erläuterung: Bitte ergänzen oder Empfehlungstext des Lektors übernehmen und ggf. redigieren.]', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'The equivalence in terms of learning objectives and the length of the course can not be determined because of...[Explanation: Please complete or adopt the text of the lectors recommendation and edit it if necessary]', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'anrechnung', + 'phrase' => 'genehmigungNegativKenntnisseNichtGleichwertigWeilHinweis', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Die anzurechnenden Kenntnisse sind umfangmäßig und/oder inhaltlich nicht gleichwertig, weil... Bei einer Ablehnung ist eine individuelle Begründung erforderlich. Dies kann nur über die Detailseite erfolgen.', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'The equivalence in terms of learning objectives and the length of the course can not be determined because of... If the application is rejected, an individual reason is required. This can only be done from the detail page.', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), array( 'app' => 'core', 'category' => 'anrechnung', @@ -11589,6 +12566,26 @@ Any unusual occurrences ) ) ), + array( + 'app' => 'core', + 'category' => 'ui', + 'phrase' => 'bitteBegruendungVervollstaendigen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Bitte vervollständigen Sie die Begründung.', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Please complete the reason.', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), array( 'app' => 'core', 'category' => 'anrechnung', @@ -11617,13 +12614,13 @@ Any unusual occurrences 'phrases' => array( array( 'sprache' => 'German', - 'text' => 'Andere Begründung. Bitte im Notizfeld kurz angeben.', + 'text' => 'Andere Begründung. Bitte im Notizfeld angeben.', 'description' => '', 'insertvon' => 'system' ), array( 'sprache' => 'English', - 'text' => 'Other reasons. Please briefly state the reasons in the field for comments.', + 'text' => 'Other reasons. Please state the reasons in the field for comments.', 'description' => '', 'insertvon' => 'system' ) @@ -12129,6 +13126,206 @@ Any unusual occurrences ) ) ), + array( + 'app' => 'core', + 'category' => 'anrechnung', + 'phrase' => 'anrechnungenVerwalten', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Anrechnungen verwalten', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Administration of applications.', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'anrechnung', + 'phrase' => 'anrechnungszeitraumFestlegen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Anrechnungszeitraum festlegen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Set appplication period', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'anrechnung', + 'phrase' => 'anrechnungszeitraumHinzufuegen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Anrechnungszeitraum hinzufügen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Add appplication period', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'anrechnung', + 'phrase' => 'anrechnungszeitraumSpeichern', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Anrechnungszeitraum speichern', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Save application period', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'anrechnung', + 'phrase' => 'anrechnungszeitraumStart', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Anrechnungszeitraum Start', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Startdate application', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'anrechnung', + 'phrase' => 'anrechnungszeitraumEnde', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Anrechnungszeitraum Ende', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Enddate application', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'ui', + 'phrase' => 'errorStartdatumNichtInStudiensemester', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Das Startdatum liegt außerhalb des gewählten Studiensemesters.', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'The startdate is not within the selected study semester.', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'ui', + 'phrase' => 'errorEndedatumNichtInStudiensemester', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Das Endedatum liegt außerhalb des gewählten Studiensemesters.', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'The enddate is not within the selected study semester.', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'ui', + 'phrase' => 'errorStartdatumNachEndedatum', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Das Startdatum muss VOR dem Endedatum liegen.', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'The startdate must be BEFORE the enddate.', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'ui', + 'phrase' => 'frageSicherLoeschen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => "Sicher löschen?", + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => "Definitely delete?", + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), array( 'app' => 'core', 'category' => 'ui', @@ -13105,6 +14302,26 @@ array( ) ) ), + array( + 'app' => 'core', + 'category' => 'anrechnung', + 'phrase' => 'antragNichtFuerVerganganeSS', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => "Der Antrag kann nicht für vergangene Semester gestellt werden", + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => "You can not apply for the past study semester", + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), array( 'app' => 'core', 'category' => 'ui', @@ -13145,6 +14362,46 @@ array( ) ) ), + array( + 'app' => 'core', + 'category' => 'ui', + 'phrase' => 'bearbeitetVon', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => "bearbeitet von", + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => "edited by", + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'ui', + 'phrase' => 'bearbeitetAm', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => "bearbeitet am", + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => "edited on", + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), array( 'app' => 'core', 'category' => 'global', @@ -13193,13 +14450,13 @@ array( 'phrases' => array( array( 'sprache' => 'German', - 'text' => "Empfehlungstext des Lektors als Begründung übernehmen.", + 'text' => "Empfehlungstext des Lektors als Begründung übernehmen und ggf. redigieren.", 'description' => '', 'insertvon' => 'system' ), array( 'sprache' => 'English', - 'text' => "Copy the lectors recommendation text as reason for the rejection.", + 'text' => "Copy the lectors recommendation text as reason for the rejection and edit if necessary", 'description' => '', 'insertvon' => 'system' ) @@ -13365,6 +14622,26 @@ array( ) ) ), + array( + 'app' => 'core', + 'category' => 'ui', + 'phrase' => 'fehlendeMinZeichen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => "Fehlende min. Zeichen", + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => "Missing min. Characters", + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), array( 'app' => 'core', 'category' => 'anrechnung', @@ -14066,6 +15343,26 @@ array( ) ) ), + array( + 'app' => 'core', + 'category' => 'ui', + 'phrase' => 'schliessen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => "Schließen", + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => "Close", + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), array( 'app' => 'core', 'category' => 'global', @@ -17363,6 +18660,3813 @@ array( ) ) ), + array( + 'app' => 'infocenter', + 'category' => 'infocenter', + 'phrase' => 'statusSetzen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Status setzen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Set state', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'infocenter', + 'category' => 'infocenter', + 'phrase' => 'abgewiesenam', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Abgewiesen am', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Rejected on', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'infocenter', + 'category' => 'infocenter', + 'phrase' => 'statusAuswahl', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Status auswählen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Select status', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'infocenter', + 'category' => 'infocenter', + 'phrase' => 'statusZuruecksetzen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Status zurücksetzen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Reset status', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'fehlermonitoring', + 'phrase' => 'fehlerFehlerKonfigurationLaden', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Fehler beim Laden der Fehlerkonfiguration', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Error when loading error configuration', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'fehlermonitoring', + 'phrase' => 'fehlerFehlerLaden', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Fehler beim Laden der Fehler', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Error when loading errors', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'fehlermonitoring', + 'phrase' => 'ungueltigerKonfigurationstyp', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Ungültiger Konfigurationstyp', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Invalid configuration type', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'fehlermonitoring', + 'phrase' => 'ungueltigerKonfigurationswert', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Ungültiger Konfigurationswert für Datentyp {0}, Sonderzeichen nicht erlaubt', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Invalid configuration value for data type {0}, special characters not allowed', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'fehlermonitoring', + 'phrase' => 'fehlerKonfiguration', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Fehler Konfiguration', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Error configuration', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'fehlermonitoring', + 'phrase' => 'konfigurationstyp', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Konfigurationstyp', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'configuration type', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'fehlermonitoring', + 'phrase' => 'konfigurationswert', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Konfigurationswert', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'configuration value', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'fehlermonitoring', + 'phrase' => 'konfigurationswertPlatzhalter', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'wert1;wert2;wert3', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'value1;value2;value3', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'fehlermonitoring', + 'phrase' => 'konfigurationswertZuweisen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Konfigurationswert(e) zuweisen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Assign configuration value(s)', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'fehlermonitoring', + 'phrase' => 'konfigurationsbeschreibung', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Konfigurationsbeschreibung', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Configuration description', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'fehlermonitoring', + 'phrase' => 'konfigurationsdatentyp', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Konfigurationsdatentyp', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Configuration data type', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'fehlermonitoring', + 'phrase' => 'konfigurationGespeichert', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Konfiguration gespeichert', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Configuration saved', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'fehlermonitoring', + 'phrase' => 'konfigurationGespeichertFehler', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Fehler beim Speichern der Konfiguration', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Error when saving configuration', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'fehlermonitoring', + 'phrase' => 'konfigurationGeloescht', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Konfiguration gelöscht', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Deleted configuration', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'fehlermonitoring', + 'phrase' => 'konfigurationGeloeschtFehler', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Fehler beim Löschen der Konfiguration', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Error when deleting configuration', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'fehlermonitoring', + 'phrase' => 'konfigurationswertLoeschen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Konfigurationswert(e) löschen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Delete configuration value(s)', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'uhstat', + 'phrase' => 'angabeFehlt', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Angabe fehlt', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Value is missing', + + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'uhstat', + 'phrase' => 'ausbildungBildungsstaatUebereinstimmung', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Höchster Abschluss (unterteilt in Österreich oder im Ausland/unbekannt) passt nicht zum Staat des höchsten Abschlusses.', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Highest completed level of education (divided into those acquired in Austria and those abroad/unknown) does not match country of the highest completed level of education', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'uhstat', + 'phrase' => 'erfolgreichGespeichert', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Erfolgreich gespeichert', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Saved successfully', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'uhstat', + 'phrase' => 'fehlerBeimSpeichern', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Fehler beim Speichern', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Error when saving', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'uhstat', + 'phrase' => 'uhstat1AnmeldungUeberschrift', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Erhebung bei der Anmeldung zu einem Studium oder bei Studienbeginn', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Survey when applying for a study or at the start of studies', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'uhstat', + 'phrase' => 'rechtsbelehrung', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'gemäß § 18 Absätzen 6 und 7 Bildungsdokumentationsgesetz 2020, BGBl. I  Nr. 20/2021, in der gültigen Fassung, sowie § 141 Absatz 3 Universitätsgesetz 2002, BGBl. I  Nr. 120/2002, in der gültigen Fassung.', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'according to section 18 subsections 6 and 7 of the Bildungsdokumentationsgesetz 2020, Federal Law Gazette I  No. 20/2021, in the current version, and section 141 subsection 3 of the Universitätsgesetz 2002, Federal Law Gazette I  No. 120/2002, in the current version.', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'uhstat', + 'phrase' => 'uhstat1AnmeldungEinleitungstext', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Das Senden der Daten ist nur möglich, wenn die Sozialversicherungsnummer (bzw. das Ersatzkennzeichen) gültig ist und alle Fragen beantwortet worden sind. Wenn Sie etwas nicht wissen, wählen Sie die Antwortmöglichkeit „unbekannt“, aber beantworten Sie bitte alle Fragen.', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Sending the data is only possible if the social security number (or the substitute code) is valid and all questions have been answered. If you don\'t know something, choose the answer option “unknown”, but please answer all questions.', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'uhstat', + 'phrase' => 'angabenErziehungsberechtigte', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Angaben zu Ihren Erziehungsberechtigten', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Information about your legal guardians', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'uhstat', + 'phrase' => 'angabenErziehungsberechtigteEinleitungstext', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Die folgenden Fragen beziehen sich auf Personen, welche für Sie erziehungsberechtigt waren oder sind (Eltern oder jene Personen, die für Sie eine entsprechende Rolle übernommen haben, wie z.B. Stief- oder Pflegeeltern).', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'The following issues refer to your legal guardians (parents or persons who were in the role of the parents, e.g. stepparents or foster parents).', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'uhstat', + 'phrase' => 'bitteAuswaehlen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Bitte auswählen...', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'please select...', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'uhstat', + 'phrase' => 'erziehungsberechtigtePersonEins', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Erziehungsberechtigte Person 1/Mutter', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Legal guardian 1/mother', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'uhstat', + 'phrase' => 'geburtsjahr', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Geburtsjahr', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'year of birth', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'uhstat', + 'phrase' => 'geburtsstaat', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Geburtsstaat', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'country of birth', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'uhstat', + 'phrase' => 'inDenHeutigenGrenzen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'in den heutigen Grenzen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'in today\'s borders', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'uhstat', + 'phrase' => 'hoechsterAbschlussStaat', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Staat des höchsten Abschlusses', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Country of the highest completed level of education', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'uhstat', + 'phrase' => 'hoechsterAbschluss', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Höchster Abschluss', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Highest completed level of education', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'uhstat', + 'phrase' => 'wennAbschlussInOesterreich', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Falls der höchste Bildungsabschluss in Österreich erworben wurde', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'If the highest level of education was completed in Austria:', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'uhstat', + 'phrase' => 'wennAbschlussNichtInOesterreich', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Falls das Land des höchsten erworbenen Bildungsabschlusses unbekannt oder nicht Österreich ist', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'If the country of the highest completed level of education is unknown or not Austria:', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'uhstat', + 'phrase' => 'erziehungsberechtigtePersonZwei', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Erziehungsberechtigte Person 2/Vater', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Legal guardian 2/father', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'uhstat', + 'phrase' => 'pruefenUndSpeichern', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Prüfen und Speichern', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Check and submit', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'uhstat', + 'phrase' => 'datenLoeschen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Daten löschen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Delete data', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'uhstat', + 'phrase' => 'erfolgreichGeloescht', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Erfolgreich gelöscht', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Deleted successfully', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'uhstat', + 'phrase' => 'datenLoeschen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Daten löschen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Delete data', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'infotext_Wiederholung_0', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Gemäß § 16 Abs. 1 FHG steht Studierenden einmalig das Recht auf Wiederholung eines Studienjahres in Folge einer negativ beurteilten kommissionellen Prüfung zu.', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'According to § 16 paragraph 1 FHG, students have the right to repeat an academic year as a result of a negative examination before a committee.', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'infotext_Wiederholung_1', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Die Wiederholung ist bei der Studiengangsleitung binnen eines Monats ab Mitteilung des negativen Prüfungsergebnisses bekannt zu geben.', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'The head of the degree program must be notified of the repetition within one month of notification of the negative examination result.', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'infotext_Wiederholung_2', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Infolge der Weiterentwicklung der Qualität des Studienganges kann es zu Änderungen der Studienbedingungen im Zuge der Wiederholung eines Studienjahres kommen (z.B. Studienplan, Prüfungsordnung etc.).', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'As a result of the further development of the quality of the course, there may be changes to the study conditions in the course of repeating an academic year (e.g. study plan, examination regulations, etc.).', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'infotext_Wiederholung_3', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Die Studiengangsleitung legt Prüfungen und Lehrveranstaltungen für die Wiederholung des Studienjahres fest.', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'The head of the degree program determines examinations and courses for the repetition of the academic year.', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'infotext_Wiederholung_4', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Nicht bestandene Prüfungen und Lehrveranstaltungen sind jedenfalls, bestandene Prüfungen und Lehrveranstaltungen nur, sofern es der Zweck des Studiums erforderlich macht, zu wiederholen oder erneut zu besuchen. Wird eine Lehrveranstaltung nach der letzten Wiederholungsmöglichkeit negativ beurteilt, darf dieder Studierende an keiner kommissionellen Wiederholungsprüfung im Semester der negativ beurteilen Lehrveranstaltung und im Folgesemester mehr teilnehmen (nicht-kommissionelle Wiederholungsprüfungen können wahrgenommen werden)', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'In any case, failed examinations and courses are to be repeated or attended again only if the purpose of the course makes it necessary. If a course is assessed negatively after the last opportunity to repeat it, the student may no longer take part in a board re-examination in the semester in which the course was assessed as negative and in the following semester (non-board re-examinations can be taken).', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), +/* + // es kann fuer jede Kombination Typ und Status eine Phrase der Form info__ 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'info_Wiederholung_Erstellt', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Info für Wiederholung Erstellt', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Info for Wiederholung Erstellt', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), +*/ + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'antrag_Wiederholung_pruefung', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Negativ beurteilte kommissionelle Prüfung', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Negative assessment by a committee', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'antrag_Wiederholung_pruefung_date', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Datum der Beurteilung', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'date of assessment', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'antrag_Wiederholung_button_yes', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Ich gebe hiermit die Wiederholung des Studienjahres bekannt', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'I hereby announce the repetition of the academic year', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'antrag_Wiederholung_button_no', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Ich werde das Studienjahr nicht wiederholen und Abbrechen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'I will not repeat the academic year and will drop out', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'antrag_header', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Verwaltung des Studierendenstatus', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Management of student status', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'btn_new', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Neu Anlegen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Create new', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'ui', + 'phrase' => 'cancel', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Abbrechen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Cancel', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'ui', + 'phrase' => 'ok', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Ok', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Ok', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'btn_create', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Anlegen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Create', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'btn_create_Abmeldung', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Vom Studium abmelden', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Deregister from your studies', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'btn_create_Unterbrechung', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Das Studium unterbrechen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Interrupt your studies', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'btn_cancel', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Bekanntgabe zurückziehen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Cancel announcement', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'warning_Abmeldung', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Ihr CIS-Account ist noch 21 Tage aktiv. Wir bitten Sie, alle benötigten Dateien (Zeugnisse, Studienerfolgsbestätigungen, Studienbestätigungen, etc.) innerhalb dieses Zeitraums herunterzuladen. Für die Ausstellung von Duplikaten fallen nach Inaktivsetzung des CIS-Accounts Kosten an.' . "
    \n" . + 'Bitte retournieren Sie baldmöglichst entlehnte Bücher an die Bibliothek.', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Your CIS account is still active for 21 days. We ask you to download all required files (certificates, confirmations of academic success, confirmation of studies, etc.) within this period. There is a charge for issuing duplicates after the CIS account has been deactivated.' . "
    \n" . + 'Please return borrowed books to the library as soon as possible.', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'warning_AbmeldungStgl', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Bitte beachten Sie die Einspruchsfrist von 2 Wochen nach Bestätigung durch die Studiengangsleitung!', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Please note the objection period of 2 weeks after confirmation by the head of the degree program!', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'title_Abmeldung', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Abmeldung', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'De-registration', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'title_AbmeldungStgl', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Abmeldung', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'De-registration', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'title_Unterbrechung', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Unterbrechung', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Interruption', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'title_Wiederholung', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Wiederholung', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Repetition', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'title_new_Abmeldung', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Neue Abmeldung', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'New de-registration', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'antrag_typ', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Typ', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Type', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'antrag_status', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Status', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Status', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'antrag_studiensemester', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Studiensemester', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Semester', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'antrag_erstelldatum', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Erstelldatum', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Createdate', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'studierendenantraege', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Studierendenanträge', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Applications', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'antrag_datum_wiedereinstieg', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Wiedereinstieg', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Re-Entry', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'antrag_grund', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Grund', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Reason', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'antrag_dateianhaenge', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Dateianhänge', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Attachments', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'antrag_anhang', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Anhang', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Attachment', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'antrag_typ_Abmeldung', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Abmeldung', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Deregistration', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'antrag_typ_AbmeldungStgl', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Abmeldung (durch Studiengangsleitung)', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Cancellation (by course director)', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'antrag_typ_Unterbrechung', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Unterbrechung', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Break', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'antrag_typ_Wiederholung', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Wiederholung', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Repetition', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'btn_show_lvs', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'LVs anzeigen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Show LVs', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'btn_edit', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Bearbeiten', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Edit', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'btn_reopen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Erneut Freischalten', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Reopen', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'btn_object', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Beeinspruchen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Object', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'btn_objection_deny', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Einspruch abgelehnt', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Objection rejected', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'btn_objection_approve', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Einspruch stattgegeben', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Objection granted', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'btn_lvzuweisen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'LVs zuweisen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Assign Lvs', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'btn_approve', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Bestätigen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Confirm', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'btn_reject', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Ablehnen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Reject', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'ui', + 'phrase' => 'skip', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Überspringen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Skip', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'ui', + 'phrase' => 'select_studiensemester', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Studiensemester auswählen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Select a semester', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'btn_save_lvs', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Zuweisungen speichern', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Save assignments', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'btn_download_antrag', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'PDF herunterladen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Download PDF', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'table', + 'phrase' => 'download', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Download', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Download', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'table', + 'phrase' => 'reload', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Tabelle neu laden', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Reload table', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'error_no_student', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Sie sind derzeit in keinem Studium', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'You are currently not enrolled', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'error_no_student_for_prestudent', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Kein Student gefunden für Prestudent #{prestudent_id}', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'No student found for prestudent #{prestudent_id}', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'error_no_student_no_failed_exam', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Sie sind derzeit in keinem Studium oder haben keine negativ beurteilte kommissionelle Prüfung', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'You are not currently studying or have not passed a board examination with negative reasons', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'no_attachments', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Keine Dateianhänge', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'No Attachments', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'lehre', + 'phrase' => 'prestudent', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Prestudent', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Prestudent', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'lehre', + 'phrase' => 'studienjahr', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Studienjahr', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Academic year', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'title_lvzuweisen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Lehrveranstaltungen zuweisen für {name}', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Assign Courses for {name}', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'title_lv_nicht_zugelassen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Angabe aller Lehrveranstaltungen, zu denen die Person nicht zugelassen ist', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Details of all courses to which the person is not admitted', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'title_lv_wiederholen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Angabe aller zu wiederholenden bzw. erneut zu besuchenden Lehrveranstaltungen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Specification of all courses to be repeated or attended again', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'title_show_lvs', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Lehrveranstaltungen für {name}', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Courses for {name}', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'my_lvs', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Meine Lehrveranstaltungen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'My Courses', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'table', + 'phrase' => 'with_selected', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Mit {count} ausgewählten: ', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'With {count} selected: ', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'lv_nicht_zulassen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Nicht zulassen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Don\'t allow ', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'lv_wiederholen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Wiederholen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Repeat', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'title_history', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Statusverlauf für #{id} ', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'History for #{id}', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'anmerkung_tooltip', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Die Spalte Anmerkung kann verwendet werden, um Besonderheiten z.B. bei einem Studienplanwechsel zu dokumentieren (Änderung von LV-Titel, ECTS…) ', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'The Comment column can be used to document special features, e.g. when changing the curriculum (change of course title, ECTS...)', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'fuer_alle_uebernehmen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'für alle übernehmen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'apply for all', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'fuer_x_uebernehmen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Auswahl für {count} weitere(n) Wiederholungsanträge übernehmen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Adopt selection for {count} further repeat applications', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'title_grund', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Grund für Ablehnung von #{id}', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Reason for rejection of #{id}', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'error_no_lvs', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Keine Lehrveranstaltungen zugewiesen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'No courses assigned', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'status_x', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Status: {status}', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Status: {status}', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'status_saving', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Daten werden gespeichert...', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Saving...', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'status_error', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Fehler', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Error', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'status_open', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Offen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Open', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'status_created', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Erstellt', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Created', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'status_cancelling', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Zurückziehen...', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Cancelling...', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'status_cancelled', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Zurückgezogen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Cancelled', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'error_stg_blacklist', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Für diesen Studiengang sind keine Bekanntgaben möglich', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'No announcements are accepted for this course', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'error_antrag_exists', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Es gibt bereits eine bestehende Bekanntgabe', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'There is already an existing announcement', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'error_antrag_pending', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Es gibt bereits eine bestehende Bekanntgabe vom Typ {typ}', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'There is already an existing announcement of type {typ}', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'error_no_antrag_found', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Keine Bekanntgabe mit Id {id} gefunden', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'No announcement found with Id {id}', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'error_no_antrag_found_prestudent', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Keine {typ} Bekanntgabe gefunden für Prestudent {prestudent_id}', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'No {typ} announcement found for prestudent {prestudent_id}', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'error_no_stg_and_sem', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Kein Studiengang und Ausbildungssemester gefunden für Bekanntgabe mit Id {id}', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'No studiengang and ausbildungssemester found for announcement with id: {id}', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'error_no_stg', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Kein Studiengang gefunden: {studiengang_kz}', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'No studiengang found: {studiengang_kz}', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'error_no_stg_antrag', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Kein Studiengang gefunden für Bekanntgabe #{id}', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'No studiengang found for announcement #{id}', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'error_no_stg_email', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Keine Studiengang-Email gefunden für Bekanntgabe #{id}', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'No studiengang-email found for announcement #{id}', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'error_no_studienplan', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Kein Studienplan gefunden für Studiengang: {studiengang_kz}, Studiensemester: {studiensemester_kurzbz}, Ausbildungssemester: {semester}', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'No studienplan found for stg: {studiengang_kz}, studiensemester: {studiensemester_kurzbz}, ausbildungssemester: {semester}', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'error_multiple_studienplan', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Mehrere Studienpläne gefunden für Studiengang: {studiengang_kz}, Studiensemester: {studiensemester_kurzbz}, Ausbildungssemester: {semester}', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Multiple studienplans found for stg: {studiengang_kz}, studiensemester: {studiensemester_kurzbz}, ausbildungssemester: {semester}', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'error_no_sem_after', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Kein Studiensemester nach {semester} gefunden', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'No studiensemester found after: {semester}', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'error_antrag_locked', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Diese Bekanntgabe ist gesperrt', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'This request is locked', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'error_no_lv', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Keine Lehrveranstaltung ausgewählt', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'No course selected', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'error_no_lv_in_application', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Keine Lehrveranstaltung in Bekanntgabe gefunden', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'No course found in announcement', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'error_no_right', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Keine Berechtigung, die Bekanntgabe zu bearbeiten', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'No authorization to edit the announcement', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'error_no_objection', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Keine Berechtigung, die Bekanntgabe zu beeinspruchen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'No authorization to object the announcement', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'error_not_objected', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Bekanntgabe ist nicht beeinsprucht', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Announcement is not objected', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'error_not_approved', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Bakanntgabe ist nicht bestätigt worden', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Announcement is not approved', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'error_stg_last_semester', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Der Studiengang hat nicht genügend Semester', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'The course does not have enough semesters', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'error_no_person', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Keine Person gefunden mit id {person_id}', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'No Person found with id {person_id}', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'error_no_person_prestudent', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Keine Person gefunden für Prestudent #{prestudent_id}', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'No Person found for prestudent #{prestudent_id}', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'error_no_email', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Kein Email kontakt gefunden für Person mit id {person_id}', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'No email contact found for Person with id {person_id}', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'error_no_prestudent', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Kein Prestudent gefunden: {prestudent_id}', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'No Prestudent found: {prestudent_id}', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'error_no_prestudent_in_sem', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Kein Status für Prestudent #{prestudent_id} in Semester {studiensemester_kurzbz} gefunden', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'No status found for prestudent #{prestudent_id} in semester {studiensemester_kurzbz}', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'error_no_stg_for_prestudent', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Kein Studiengang für Prestudent #{prestudent_id} gefunden', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'No course found for prestudent #{prestudent_id}', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'error_no_prestudentstatus', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Kein Status gefunden für Prestudent: {prestudent_id}', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'No status found for Prestudent: {prestudent_id}', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'error_mail_to', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Email an {email} konnte nicht versandt werden', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Failed to send email to {email}', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'error_mail', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Die Email wurde nicht an den Studenten versendet
    Details:
    {message}', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Mail to student not sent
    Details:
    {message}', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'error_name', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Name des Studenten nicht gefunden
    Details:
    {message}', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Name of student not found
    Details:
    {message}', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'error_mail_and_name', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Die Email wurde nicht an den Studenten versendet da kein Name gefunden wurde
    Details:
    {message}', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Mail to student not sent and student name not found
    Details:
    {message}', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'studentIn', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'StudentIn ({prestudent_id})', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Student ({prestudent_id})', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'error_U_Approve', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Unterbrechung mit id {studierendenantrag_id} konnte nicht genehmigt werden.
    Details:
    {message}', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Could not approve Unterbrechung for studierendenantrag_id: {studierendenantrag_id}
    Details:
    {message}', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'error_U_Reject', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Unterbrechung mit id {studierendenantrag_id} konnte nicht abgelehnt werden.
    Details:
    {message}', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Could not reject Unterbrechung for studierendenantrag_id: {studierendenantrag_id}
    Details:
    {message}', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'mail_subject_A_Approve', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Abmeldung freigegeben', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Unsubscribe released', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'mail_subject_A_Student', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Abmeldung freigegeben', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Unsubscribe released', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'mail_subject_A_Stgl', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Abmeldung durch Studiengangsleitung', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'De-registration by the course director', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'mail_subject_A_ObjectionDenied', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Ihr Einspruch wurde Abgelehnt', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Your objection was denied', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'mail_subject_U_Approve', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Unterbrechung freigegeben', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Interruption enabled', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'mail_subject_U_Reject', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Unterbrechung abgelehnt', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Interruption rejected', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'mail_subject_W_New', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Neue*r Wiederholer*in', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'New Repeater', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'mail_subject_W_Approve', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Wiederholung von Studiengangsleitung freigegeben', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Repetition approved by course director', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'mail_subject_W_Student', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Wiederholung von Studiengangsleitung freigegeben', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Repetition approved by course director', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'mail_part_table', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => '{rows}
    {stg_bezeichnung} ({stg_orgform_kurzbz})
    ', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => '{rows}
    {stg_bezeichnung} ({stg_orgform_kurzbz})
    ', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'mail_part_x_new_Abmeldung', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => '{count} neue Abmeldung(en)', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => '{count} new De-registration(s)', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'mail_part_x_new_Unterbrechung', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => '{count} neue(r) Antrag/Anträge auf Unterbrechung', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => '{count} new application(s) for Interruption', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'mail_part_x_new_Wiederholung', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => '{count} neue LV Zuweisung(en) für Wiederholer', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => '{count} new LV assignment(s) for repeaters', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'mail_part_grund', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => '

    Grund:

    {grund}

    ', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => '

    Reason:

    {grund}

    ', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'mail_part_error_no_lvs', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Keine Lehrveranstaltungen gefunden', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'No courses found', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'calltoaction_Abmeldung', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Die Abmeldung vom Studium kann hier durchgeführt werden.', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'You can deregister from your studies here.', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'calltoaction_Unterbrechung', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Eine Unterbrechung des Studiums ist hier zu beantragen. Die Gründe der Unterbrechung und die beabsichtigte Fortsetzung des Studiums sind nachzuweisen oder glaubhaft zu machen. In der Entscheidung über den Antrag sind zwingende persönliche, gesundheitliche oder berufliche Gründe zu berücksichtigen. Während der Unterbrechung können keine Prüfungen abgelegt werden.', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'You can apply for an interruption of your studies here. The reasons for the interruption and the intended continuation of the course must be proven or made credible. Compelling personal, health or professional reasons must be taken into account when deciding on the application. No exams can be taken during the interruption.', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'calltoaction_Wiederholung', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Studierenden steht einmalig das Recht auf Wiederholung eines Studienjahres in Folge einer negativ beurteilten kommissionellen Prüfung zu. Die Wiederholung ist bei der Studiengangsleitung binnen eines Monats ab Mitteilung des Prüfungsergebnisses bekannt zu geben. Die Studiengangsleitung hat Prüfungen und Lehrveranstaltungen für die Wiederholung des Studienjahres festzulegen, wobei nicht bestandene Prüfungen und Lehrveranstaltungen jedenfalls, bestandene Prüfungen und Lehrveranstaltungen nur, sofern es der Zweck des Studiums erforderlich macht, zu wiederholen oder erneut zu besuchen sind.', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Students have the one-time right to repeat an academic year as a result of a negative examination by a committee. The head of the degree program must be notified of the repetition within one month of notification of the examination result. The head of the degree program must determine examinations and courses for the repetition of the academic year, whereby failed examinations and courses are to be repeated or attended again, in any case, passed examinations and courses only if the purpose of the course makes it necessary.', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'textLong_studentNichtGezahlt', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Ausschlußgrund gemäß Ausbildungsvertrag (Punkt 7.4): Nichterfüllung finanzieller Verpflichtungen trotz Mahnung (Studienbeitrag)', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Reason for exclusion according to the training contract (point 7.4): Failure to meet financial obligations despite a reminder (tuition fees)', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'textLong_studentNichtAnwesend', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Ausschlußgrund gemäß Ausbildungsvertrag (Punkt 7.4): mehrmalig unentschuldigtes Verletzen der Anwesenheitspflicht', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Reason for exclusion according to the training contract (point 7.4): multiple unexcused breaches of attendance requirements', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'textLong_PruefunstermineNichtEingehalten', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Ausschlußgrund gemäß Ausbildungsvertrag (Punkt 7.4): wiederholtes Nichteinhalten von Prüfungsterminen bzw Abgabeterminen für Seminararbeiten bzw. Projektarbeiten', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Reason for exclusion according to the training contract (point 7.4): repeated non-compliance with examination dates or deadlines for seminar papers or project work', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'textLong_plageat', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Ausschlußgrund gemäß Ausbildungsvertrag (Punkt 7.4): Plagiieren im Rahmen wissenschaftlicher Arbeiten bzw. unerlaubte Verwendung KI generierter Hilfsmittel bzw. Quellen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Reason for exclusion according to the training contract (point 7.4): Plagiarism in the context of scientific work or unauthorized use of AI-generated tools or sources', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'textLong_ungenuegendeLeistung', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Ausschlußgrund gemäß Ausbildungsvertrag (Punkt 7.4): nicht genügende Leistung im Sinne der Prüfungsordnung', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Reason for exclusion according to the training contract (point 7.4): insufficient performance in terms of the examination regulations', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'textLong_NichtantrittStudium', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Ausschlußgrund gemäß Ausbildungsvertrag (Punkt 7.4): Nichtantritt des Studiums zu Beginn des Studienjahres (=Unbegründetes Nichterscheinen zur ersten Studienveranstaltung)', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Reason for exclusion according to the training contract (point 7.4): Failure to start the course at the beginning of the academic year (= unjustified non-attendance to the first course event)', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'textLong_MissingZgv', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Zugangsvoraussetzung BA (bzw. MA) nicht erfüllt', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Entry requirements BA (resp. MA) not fulfilled)', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'dropdown_nichtGezahlt', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Student*in hat nicht bezahlt', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Student has not paid', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'dropdown_nichtAnwesend', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Student*in war mehrmals unentschuldigt abwesend', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Student was absent without excuse several times', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'dropdown_PruefunstermineNichtEingehalten', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Student*in hat Prüfunstermine nicht eingehalten', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Student failed to meet exam dates', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'dropdown_plageat', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Student*in hat plagiiert', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Student failed to meet exam dates', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'dropdown_ungenuegendeLeistung', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Leistung ungenügend', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'performance insufficient', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'dropdown_NichtantrittStudium', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Nichtantritt des Studiums', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'non-commencement of the course', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'dropdown_MissingZgv', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Zugangsvoraussetzung BA (bzw. MA) nicht erfüllt', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Entry requirements BA (resp. MA) not fulfilled', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'dropdown_bitteWaehlen', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'bitte auswählen, sofern zutreffend', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'please select if applicable', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), ); diff --git a/system/templates/contentmittitel_filterwidget_xslt_xhtml.xslt b/system/templates/contentmittitel_filterwidget_xslt_xhtml.xslt new file mode 100644 index 000000000..e84939286 --- /dev/null +++ b/system/templates/contentmittitel_filterwidget_xslt_xhtml.xslt @@ -0,0 +1,69 @@ + + + + + + <xsl:value-of select="titel" /> + + + + + + + + + + + + + + + + + +

    + + + +
    +
    diff --git a/system/vorlage_zip/AntragAbmeldung.odt b/system/vorlage_zip/AntragAbmeldung.odt new file mode 100644 index 000000000..2e11ca60a Binary files /dev/null and b/system/vorlage_zip/AntragAbmeldung.odt differ diff --git a/system/vorlage_zip/AntragAbmeldungStgl.odt b/system/vorlage_zip/AntragAbmeldungStgl.odt new file mode 100644 index 000000000..2e11ca60a Binary files /dev/null and b/system/vorlage_zip/AntragAbmeldungStgl.odt differ diff --git a/system/vorlage_zip/AntragUnterbrechung.odt b/system/vorlage_zip/AntragUnterbrechung.odt new file mode 100644 index 000000000..aeaa82105 Binary files /dev/null and b/system/vorlage_zip/AntragUnterbrechung.odt differ diff --git a/system/vorlage_zip/Inskription.odt b/system/vorlage_zip/Inskription.odt index d1933cdcb..6471c5cc2 100644 Binary files a/system/vorlage_zip/Inskription.odt and b/system/vorlage_zip/Inskription.odt differ diff --git a/system/vorlage_zip/InskriptionEng.odt b/system/vorlage_zip/InskriptionEng.odt new file mode 100644 index 000000000..e26be218e Binary files /dev/null and b/system/vorlage_zip/InskriptionEng.odt differ diff --git a/system/xsl/AntragAbmeldung.xsl b/system/xsl/AntragAbmeldung.xsl new file mode 100644 index 000000000..ef67d6f15 --- /dev/null +++ b/system/xsl/AntragAbmeldung.xsl @@ -0,0 +1,378 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Studiengang: + + + + + + Organisationsform: + + + + + + + + Abmeldung vom Studium durch Studierende + + + + + + + Name der*des Studierenden + + + + + + + + + + + Personenkennzeichen + + + + + + + + + + Studienjahr + + + + + + + + + + Studiensemester + + + + + + + + + + Semester + + + + + + + + + + Grund der Abmeldung: + + + + + + + + + + + + + + + Wir weisen Sie darauf hin, dass Ihr FHTW Account noch 21 Tage aktiv ist. Wir bitten Sie, alle benötigte Dateien (Zeugnisse, Studienerfolgsbestätigungen, Studienbestätigungen, etc.) innerhalb dieses Zeitraums herunterzuladen. Für die Ausstellung von Duplikaten fallen nach Inaktivsetzung des CIS-Accounts Kosten an. + + + Sie sind gem. Ausbildungsvertrag verpflichtet, unverzüglich alle zur Verfügung gestellten Gerätschaften, Bücher, Schlüssel und sonstige Materialien zurückzugeben. + + Bei Abmeldung vor dem 01.09. bzw. 15.02. und bereits eingezahltem Studienbeitrag für das kommende Semester: Wir informieren Sie darüber, dass der Studienbeitrag für das kommende Semester von Ihnen zurückgefordert werden kann. Bitte geben Sie uns dafür innerhalb von 14 Tagen Ihre Bankdaten an folgende E-Mail-Adresse bekannt: billing@technikum-wien.at. + + + + + + + + \ No newline at end of file diff --git a/system/xsl/AntragAbmeldungStgl.xsl b/system/xsl/AntragAbmeldungStgl.xsl new file mode 100644 index 000000000..aa6a28073 --- /dev/null +++ b/system/xsl/AntragAbmeldungStgl.xsl @@ -0,0 +1,378 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Studiengang: + + + + + + Organisationsform: + + + + + + + + Abmeldung vom Studium durch Studiengang + + + + + + + Name der*des Studierenden + + + + + + + + + + + Personenkennzeichen + + + + + + + + + + Studienjahr + + + + + + + + + + Studiensemester + + + + + + + + + + Semester + + + + + + + + + + Grund der Abmeldung: + + + + + + + + + + + + + + + Wir weisen Sie darauf hin, dass Ihr FHTW Account noch 21 Tage aktiv ist. Wir bitten Sie, alle benötigte Dateien (Zeugnisse, Studienerfolgsbestätigungen, Studienbestätigungen, etc.) innerhalb dieses Zeitraums herunterzuladen. Für die Ausstellung von Duplikaten fallen nach Inaktivsetzung des CIS-Accounts Kosten an. + + + Sie sind gem. Ausbildungsvertrag verpflichtet, unverzüglich alle zur Verfügung gestellten Gerätschaften, Bücher, Schlüssel und sonstige Materialien zurückzugeben. + + Bei Abmeldung vor dem 01.09. bzw. 15.02. und bereits eingezahltem Studienbeitrag für das kommende Semester: Wir informieren Sie darüber, dass der Studienbeitrag für das kommende Semester von Ihnen zurückgefordert werden kann. Bitte geben Sie uns dafür innerhalb von 14 Tagen Ihre Bankdaten an folgende E-Mail-Adresse bekannt: billing@technikum-wien.at. + + + + + + + + \ No newline at end of file diff --git a/system/xsl/AntragUnterbrechung.xsl b/system/xsl/AntragUnterbrechung.xsl new file mode 100644 index 000000000..f1ab10d91 --- /dev/null +++ b/system/xsl/AntragUnterbrechung.xsl @@ -0,0 +1,459 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Studiengang: + + + + + + + + Organisationsform: + + + + + + + + + Antrag auf Unterbrechung des Studiums + + + + + + + + Name der*des Studierenden + + + + + + + + + + + + + + Personenkennzeichen + + + + + + + + + + + + + + Studienjahr + + + + + + + + + + + + + + Aktuelles Semester + + + + + + + + + + + + Grund der Unterbrechung: + + + + + + + + + + + + + Wiedereinstieg am + + + + + + + + + + + + + + + + + + + + Datum: + + + + + + + + + + + + + + + + Infolge der Weiterentwicklung der Qualität des Studienganges kann es zu Änderungen der Studienbedingungen beim Wiedereinstieg kommen (z. B. Studienplan, Prüfungsordnung etc.) + + + Falls Sie das Studium im Wintersemester vor dem 15.10. bzw. im Sommersemester vor dem 15.3. beenden, wird Ihnen der Studienbeitrag für das aktuelle Semester rückerstattet. Bitte geben Sie uns innerhalb von 14 Tagen Ihre Bankdaten an folgende E-Mail-Adresse bekannt: + + + billing@technikum-wien.at + + + . + + + + + + \ No newline at end of file diff --git a/system/xsl/inskription_eng_0.xsl b/system/xsl/inskription_eng_0.xsl new file mode 100644 index 000000000..c2080a5ec --- /dev/null +++ b/system/xsl/inskription_eng_0.xsl @@ -0,0 +1,347 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + + + + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + + + + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + + + + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + + + + + + + Certificate of Enrolment University of Applied Sciences Demo + + + + + + To be submitted to (place where the certificate is to be submitted and its reference number, e.g. social security number). + + + Student number + + + + + + + + + + + + + + + + + + born on , is enrolled as a regular student in + (beginning ) + in the + + + Bachelor Degree program + + + Master Degree program + + + Degree Program + + + + + + + + + + + + (), + + st + nd + rd + th + + semester (beginning , ). + + + + + + + + Date: + + + Rector: + + + + + \ No newline at end of file diff --git a/vilesci/bis/personalmeldung.php b/vilesci/bis/personalmeldung.php index 1591b6464..d5a998635 100644 --- a/vilesci/bis/personalmeldung.php +++ b/vilesci/bis/personalmeldung.php @@ -160,8 +160,10 @@ $tage_imJahr = $ende_imJahr->diff($beginn_imJahr)->days + 1; $wochen_imJahr = $tage_imJahr / 7; // Sommer- und Wintersemester im BIS Meldungsjahr -$ss_kurzbz = $studiensemester->getBeforePrevious(); +//$ss_kurzbz = $studiensemester->getBeforePrevious(); $ws_kurzbz = $studiensemester->getStudienjahrStudiensemester($stsem); +$ss_kurzbz = $studiensemester->getPreviousFrom($ws_kurzbz); + $ss = new studiensemester($ss_kurzbz); $ws = new studiensemester($ws_kurzbz); diff --git a/vilesci/lehre/abgabe_assistenz_zusatz.php b/vilesci/lehre/abgabe_assistenz_zusatz.php index 20dbe9d97..724658d24 100644 --- a/vilesci/lehre/abgabe_assistenz_zusatz.php +++ b/vilesci/lehre/abgabe_assistenz_zusatz.php @@ -120,15 +120,15 @@ echo '
    Student: '.$uid.'
    Titel: '. - Kontrollierte Schlagwörter:* + Kontrollierte Schlagwörter: - Dt. Schlagwörter: + Dt. Schlagwörter:* - Engl. Schlagwörter: + Engl. Schlagwörter:* diff --git a/vilesci/lehre/check/ueberbuchung.php b/vilesci/lehre/check/ueberbuchung.php index 3cb6b62e5..1e133384a 100644 --- a/vilesci/lehre/check/ueberbuchung.php +++ b/vilesci/lehre/check/ueberbuchung.php @@ -50,31 +50,47 @@ echo ' - - - + '; + + include('../../../include/meta/jquery.php'); + include('../../../include/meta/jquery-tablesorter.php'); + +echo ' - - + +

    LV-Plan Überbuchungen - '.$db_stpl_table.'

    '; @@ -93,8 +109,8 @@ if($beginn=='' || $ende=='') $dontloadcontent=true; } -echo " Beginn "; -echo " Ende "; +echo " Beginn "; +echo " Ende "; $stg = new studiengang(); $stg->getAll('typ, kurzbzlang', true); @@ -128,7 +144,7 @@ foreach ($ort_obj->result as $row) $ort[$row->ort_kurzbz] = new stdClass(); // Prevents the warning "Creating default object from empty value" $ort[$row->ort_kurzbz]->max_person = $row->max_person; } -$qry = "SELECT DISTINCT vw_".$db_stpl_table.".unr,datum, stunde, ort_kurzbz, studiensemester_kurzbz, vw_".$db_stpl_table.".studiengang_kz, vw_".$db_stpl_table.".semester, verband, gruppe, gruppe_kurzbz, UPPER(stg_typ || stg_kurzbz) as stg_kurzbz, lehrfach, lehrfach_bez +$qry = "SELECT DISTINCT vw_".$db_stpl_table.".unr,datum, stunde, ort_kurzbz, studiensemester_kurzbz, vw_".$db_stpl_table.".studiengang_kz, vw_".$db_stpl_table.".semester, verband, gruppe, gruppe_kurzbz, UPPER(stg_typ || stg_kurzbz) as stg_kurzbz, lehrfach, lehrfach_bez, lehrform FROM lehre.vw_".$db_stpl_table." JOIN lehre.tbl_lehreinheit USING(lehreinheit_id) JOIN lehre.tbl_lehrveranstaltung ON(tbl_lehreinheit.lehrveranstaltung_id=tbl_lehrveranstaltung.lehrveranstaltung_id) WHERE datum>='".addslashes($beginn)."' AND datum<='".addslashes($ende)."'"; if($stg_kz!='') @@ -144,7 +160,8 @@ echo ' - + + '; @@ -156,6 +173,7 @@ $lastort=0; $anzahl_studenten=0; $lehrfach=''; $lehrfach_bez=''; +$lehrform=''; $arr=array(); function getAnzahl($studiengang_kz, $semester, $verband, $gruppe, $gruppe_kurzbz, $studiensemester_kurzbz) @@ -192,7 +210,7 @@ if($result = $db->db_query($qry)) { while($row = $db->db_fetch_object($result)) { - if($lastdatum==$row->datum && $laststunde==$row->stunde && $lastort==$row->ort_kurzbz && $lehrfach==$row->lehrfach && $lehrfach_bez==$row->lehrfach_bez) + if($lastdatum==$row->datum && $laststunde==$row->stunde && $lastort==$row->ort_kurzbz && $lehrfach==$row->lehrfach && $lehrfach_bez==$row->lehrfach_bez && $lehrform==$row->lehrform) { //Solange alles gleich ist zusammenzaehlen $anzahl = getAnzahl($row->studiengang_kz, $row->semester, $row->verband, $row->gruppe, $row->gruppe_kurzbz, $row->studiensemester_kurzbz); @@ -222,7 +240,13 @@ if($result = $db->db_query($qry)) $style='style="background-color: a00404; color: d3d3d3"'; //echo ""; - $arr[]=""; + $arr[]=" + + + + + + "; } $anzahl_studenten=0; @@ -238,6 +262,7 @@ if($result = $db->db_query($qry)) $lastort = $row->ort_kurzbz; $lehrfach = $row->lehrfach; $lehrfach_bez = $row->lehrfach_bez; + $lehrform = $row->lehrform; } } else diff --git a/vilesci/lehre/check/verplanungsuebersicht.php b/vilesci/lehre/check/verplanungsuebersicht.php index 67b0d847e..90cdd3a37 100644 --- a/vilesci/lehre/check/verplanungsuebersicht.php +++ b/vilesci/lehre/check/verplanungsuebersicht.php @@ -30,6 +30,7 @@ require_once('../../../config/vilesci.config.inc.php'); require_once('../../../include/studiengang.class.php'); require_once('../../../include/studiensemester.class.php'); +require_once('../../../include/benutzerberechtigung.class.php'); require_once('../../../include/variable.class.php'); require_once('../../../include/functions.inc.php'); @@ -39,8 +40,38 @@ $user = get_uid(); $variable = new variable(); $variable->loadVariables($user); +//Studiengänge ermitteln, auf die die Person Rechte hat +$qryOE = " SELECT + studiengang_kz + FROM + public.tbl_organisationseinheit + JOIN + public.tbl_studiengang USING (oe_kurzbz) + WHERE + oe_kurzbz IN( + SELECT oe_kurzbz + FROM public.tbl_benutzerfunktion + WHERE + funktion_kurzbz='Leitung' + AND uid='$user' + AND (datum_von is null OR datum_von <= now()) + AND (datum_bis is null OR datum_bis >= now()) + ) + OR + tbl_organisationseinheit.oe_kurzbz IN(SELECT oe_kurzbz FROM system.vw_berechtigung WHERE uid='$user' AND berechtigung_kurzbz in('admin','assistenz'))"; + +if($result_rechte = $db->db_query($qryOE)) +{ + while($row_rechte = $db->db_fetch_object($result_rechte)) + { + $stgBerechtigt[] = $row_rechte->studiengang_kz; + } +} + +$stg_get = isset($_GET['stg'])?$_GET['stg'] : ''; + $stg = new studiengang(); -$stg->getAll('typ, kurzbz'); +$stg->loadArray($stgBerechtigt, 'typ, kurzbz'); if(isset($_GET['stsem'])) $stsem = $_GET['stsem']; @@ -65,12 +96,22 @@ echo 'Übersicht - Verplanung der Lehreinheiten ('.$variable->variable->db_stpl_table.')'; -echo 'Studiensemester '; foreach ($stsem_obj->studiensemester as $row) { echo ''; } -echo ''; +echo '
    '; +echo 'Studiengang '; +echo ''; +echo ''; $gesamt=0; $gesamt_verplant=0; @@ -98,24 +139,29 @@ function drawprogress($prozent, $ueberplanung=0) $content = '
     '.$prozent.'%
    '; if($ueberplanung>0) - $content.= '
     +'.$ueberplanung.'% Überbuchung
    '; + $content.= '
     +'.$ueberplanung.'% zusätzliche Planstunden
    '; $content.= '
    '; return $content; } //Alle Studiengaenge durchlaufen $content.= "\n
    Ort Studierende aktuell (Plätze maximal) Gruppen (Studierende aktuell)LehrfachLehrveranstaltungLehrform
    $lastdatum$laststunde$lastort$anzahl_studenten (".$ort[$lastort]->max_person.")$gruppen$lehrfach - $lehrfach_bez
    $lastdatum$lastort$anzahl_studenten (".$ort[$lastort]->max_person.")$gruppen$lehrfach - $lehrfach_bez
    $lastdatum$lastort$anzahl_studenten (".$ort[$lastort]->max_person.")$gruppen$lehrfach - $lehrfach_bez$lehrform
    "; -$content.= "\n"; +$content.= "\n"; foreach($stg->result as $row_stg) { + if (isset($stg_get) && $stg_get != '' && $stg_get != $row_stg->studiengang_kz) + continue; + $content.= "\n'; //Anzahl der Lehreinheiten holen $qry = "SELECT count(*) as anzahl, semester FROM lehre.tbl_lehrveranstaltung JOIN lehre.tbl_lehreinheit USING(lehrveranstaltung_id) + JOIN lehre.tbl_lehrform ON (tbl_lehreinheit.lehrform_kurzbz=tbl_lehrform.lehrform_kurzbz) WHERE studiengang_kz='$row_stg->studiengang_kz' AND studiensemester_kurzbz='$stsem' - AND lehreinheit_id IN(SELECT lehreinheit_id FROM lehre.tbl_lehreinheitmitarbeiter WHERE lehreinheit_id=tbl_lehreinheit.lehreinheit_id) + AND lehreinheit_id IN(SELECT lehreinheit_id FROM lehre.tbl_lehreinheitmitarbeiter WHERE lehreinheit_id=tbl_lehreinheit.lehreinheit_id AND tbl_lehreinheitmitarbeiter.planstunden > 0) AND tbl_lehreinheit.lehre + AND tbl_lehrform.verplanen GROUP BY semester ORDER BY semester ASC"; @@ -128,7 +174,9 @@ foreach($stg->result as $row_stg) //Anzahl der verplanten Lehreinheiten holen $qry = "SELECT count(*) as verplant FROM lehre.tbl_lehreinheit JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id) - WHERE studiengang_kz='$row_stg->studiengang_kz' AND studiensemester_kurzbz='$stsem' AND semester='$row_sem->semester' AND tbl_lehreinheit.lehre + JOIN lehre.tbl_lehrform ON (tbl_lehreinheit.lehrform_kurzbz=tbl_lehrform.lehrform_kurzbz) + WHERE studiengang_kz='$row_stg->studiengang_kz' AND studiensemester_kurzbz='$stsem' AND semester='$row_sem->semester' + AND tbl_lehreinheit.lehre AND tbl_lehrform.verplanen AND lehreinheit_id IN (SELECT lehreinheit_id FROM lehre.tbl_".$variable->variable->db_stpl_table." WHERE lehreinheit_id=tbl_lehreinheit.lehreinheit_id) AND lehreinheit_id IN(SELECT lehreinheit_id FROM lehre.tbl_lehreinheitmitarbeiter WHERE lehreinheit_id=tbl_lehreinheit.lehreinheit_id)"; @@ -152,11 +200,13 @@ foreach($stg->result as $row_stg) lehre.tbl_lehreinheit JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id) JOIN lehre.tbl_lehreinheitmitarbeiter USING(lehreinheit_id) + JOIN lehre.tbl_lehrform ON (tbl_lehreinheit.lehrform_kurzbz=tbl_lehrform.lehrform_kurzbz) WHERE tbl_lehrveranstaltung.studiengang_kz='$row_stg->studiengang_kz' AND tbl_lehrveranstaltung.semester='$row_sem->semester' AND tbl_lehreinheit.studiensemester_kurzbz='$stsem' AND - tbl_lehreinheit.lehre"; + tbl_lehreinheit.lehre AND + tbl_lehrform.verplanen"; $ps=0; if($result_ps = $db->db_query($qry)) { @@ -174,11 +224,13 @@ foreach($stg->result as $row_stg) JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id) JOIN lehre.tbl_lehreinheitmitarbeiter USING(lehreinheit_id) JOIN lehre.tbl_".$variable->variable->db_stpl_table." USING(lehreinheit_id) + JOIN lehre.tbl_lehrform ON (tbl_lehreinheit.lehrform_kurzbz=tbl_lehrform.lehrform_kurzbz) WHERE tbl_lehrveranstaltung.studiengang_kz='$row_stg->studiengang_kz' AND tbl_lehrveranstaltung.semester='$row_sem->semester' AND tbl_lehreinheit.studiensemester_kurzbz='$stsem' AND - tbl_lehreinheit.lehre + tbl_lehreinheit.lehre AND + tbl_lehrform.verplanen ) a"; $stdverplant=0; @@ -192,8 +244,16 @@ foreach($stg->result as $row_stg) //offene Stunden ermitteln $qry = " - SELECT distinct lehreinheit_id, planstunden, mitarbeiter_uid FROM lehre.tbl_lehreinheit JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id) JOIN lehre.tbl_lehreinheitmitarbeiter USING(lehreinheit_id) - WHERE studiengang_kz='$row_stg->studiengang_kz' AND semester='$row_sem->semester' AND studiensemester_kurzbz='$stsem' AND tbl_lehreinheit.lehre"; + SELECT distinct lehreinheit_id, planstunden, mitarbeiter_uid + FROM lehre.tbl_lehreinheit + JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id) + JOIN lehre.tbl_lehreinheitmitarbeiter USING(lehreinheit_id) + JOIN lehre.tbl_lehrform ON (tbl_lehreinheit.lehrform_kurzbz=tbl_lehrform.lehrform_kurzbz) + WHERE studiengang_kz='$row_stg->studiengang_kz' + AND semester='$row_sem->semester' + AND studiensemester_kurzbz='$stsem' + AND tbl_lehreinheit.lehre + AND tbl_lehrform.verplanen"; $offen=0; if($result_std = $db->db_query($qry)) @@ -234,7 +294,7 @@ foreach($stg->result as $row_stg) $content.= ''; } $content.=''; @@ -259,7 +319,7 @@ if($gesamt_ps==0) $prozent=0; else $prozent = round($gesamt_ps_verplant*100/$gesamt_ps,2); -echo "Stunden: (".$gesamt_ps_verplant.'/'.$gesamt_ps.')
    Studiengang/SemesterLehreinheitenStunden
    Studiengang/SemesterLehreinheitenPlanstunden

    ".$row_stg->kuerzel.'

    '; $content.=drawprogress($prozent, $prozentueber); - $content.= 'offene Stunden: '.$offen; + $content.= 'offene Planstunden: '.$offen; $content.='
      
    '; +echo "Planstunden: (".$gesamt_ps_verplant.'/'.$gesamt_ps.')'; echo drawprogress($prozent); echo "
    \n
    "; diff --git a/vilesci/lehre/lehrveranstaltung_details.php b/vilesci/lehre/lehrveranstaltung_details.php index b7a9d7b8a..bad2a7d93 100644 --- a/vilesci/lehre/lehrveranstaltung_details.php +++ b/vilesci/lehre/lehrveranstaltung_details.php @@ -402,7 +402,12 @@ $selected='selected'; else $selected=''; - $htmlstr .= ''; + + $inaktiv = ''; + if (!$db->db_parse_bool($row->aktiv)) + $inaktiv = 'disabled'; + + $htmlstr .= ''; } }//#'.$lv->farbe.' $htmlstr .= ' diff --git a/vilesci/personen/import/interessentenimport.php b/vilesci/personen/import/interessentenimport.php index 3cdfefb06..d1830eaeb 100644 --- a/vilesci/personen/import/interessentenimport.php +++ b/vilesci/personen/import/interessentenimport.php @@ -806,7 +806,12 @@ if (isset($_POST['save'])) $stg_obj = new studiengang(); $stg_obj->load(ltrim($stg,'0')); - $uid = generateUID($stg_obj->kurzbz,$jahr, $stg_obj->typ, $matrikelnr); + $nachname_clean = mb_strtolower(convertProblemChars($person->nachname)); + $vorname_clean = mb_strtolower(convertProblemChars($person->vorname)); + $nachname_clean = str_replace(' ','_', $nachname_clean); + $vorname_clean = str_replace(' ','_', $vorname_clean); + + $uid = generateUID($stg_obj->kurzbz,$jahr, $stg_obj->typ, $matrikelnr, $vorname_clean, $nachname_clean); //Benutzerdatensatz anlegen $benutzer = new benutzer(); @@ -815,10 +820,6 @@ if (isset($_POST['save'])) $benutzer->aktiv = true; $benutzer->aktivierungscode = generateActivationKey(); - $nachname_clean = mb_strtolower(convertProblemChars($person->nachname)); - $vorname_clean = mb_strtolower(convertProblemChars($person->vorname)); - $nachname_clean = str_replace(' ','_', $nachname_clean); - $vorname_clean = str_replace(' ','_', $vorname_clean); if (!defined('GENERATE_ALIAS_STUDENT') || GENERATE_ALIAS_STUDENT === true) { diff --git a/vilesci/personen/urlaubsverwaltung.php b/vilesci/personen/urlaubsverwaltung.php index f631aa081..20b2d293c 100644 --- a/vilesci/personen/urlaubsverwaltung.php +++ b/vilesci/personen/urlaubsverwaltung.php @@ -33,6 +33,8 @@ require_once('../../include/mitarbeiter.class.php'); require_once('../../include/datum.class.php'); require_once('../../include/benutzerberechtigung.class.php'); require_once('../../include/addon.class.php'); +require_once('../../include/benutzerfunktion.class.php'); +require_once('../../include/phrasen.class.php'); if (!$db = new basis_db()) die('Es konnte keine Verbindung zum Server aufgebaut werden.'); @@ -62,6 +64,16 @@ $message=''; $error=false; $mlAbgeschickt = ''; +//Phrasen +$sprache = getSprache(); +$p = new phrasen($sprache); + +//Default-Wert für Max-Intervall in Tagen für Zeitsperre, über Config veränderbar +$maxDauerZS = 730; + +if (defined('CIS_ZEITSPERREN_MAX_DAUER') && CIS_ZEITSPERREN_MAX_DAUER != '') { + $maxDauerZS = CIS_ZEITSPERREN_MAX_DAUER; +} //prüfen, ob addon casetime aktiviert ist $addon_obj = new addon(); $addoncasetime = $addon_obj->checkActiveAddon("casetime"); @@ -130,24 +142,37 @@ echo ' + + + + + +

    Detaillierte Berechtigungsliste von vorname.' '.$benutzer->nachname ?>

    + + getBerechtigungen($uid); + + $funktionsArray = array(); + $funktionen = new funktion(); + $funktionen->getAll(); + + foreach ($funktionen->result as $item) + { + $funktionsArray[$item->funktion_kurzbz] = $item->beschreibung; + } + + $kostenstelleArray = array(); + $kostenstellen = new wawi_kostenstelle(); + $kostenstellen->getAll(); + + foreach ($kostenstellen->result as $item) + { + $kostenstelleArray[$item->kostenstelle_id] = $item->bezeichnung.' ('.$item->kostenstelle_id.')'; + } + + $oeArray = array(); + $oes = new organisationseinheit(); + $oes->getAll(); + + foreach ($oes->result as $item) + { + $oeArray[$item->oe_kurzbz] = $item->organisationseinheittyp_kurzbz.' '.$item->bezeichnung; + } + $heute = strtotime(date('Y-m-d')); + + echo ' + + + + + + + + + + + '; + foreach ($rechte->berechtigungen AS $key) + { + + if ($key->ende!='' && strtotime($key->ende) < $heute) + { + $titel="Inaktiv"; + } + elseif ($key->start!='' && strtotime($key->start) > $heute) + { + $titel="Wartend"; + } + else + { + $titel="Aktiv"; + } + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + } + echo '
    FunktionRolleRechtArtOrganisationseinheitKostenstelleGültig abGültig bisStatus
    '.($key->funktion_kurzbz != '' ? $funktionsArray[$key->funktion_kurzbz] : '').''.($key->rolle_kurzbz != '' ? $key->rolle_kurzbz : '').''.($key->berechtigung_kurzbz != '' ? $key->berechtigung_kurzbz : '').''.($key->art != '' ? $key->art : '').''.($key->oe_kurzbz != '' ? $oeArray[$key->oe_kurzbz] : '').''.($key->kostenstelle_id != '' ? $kostenstelleArray[$key->kostenstelle_id] : '').''.($key->start != '' ? $key->start : '').''.($key->ende != '' ? $key->ende : '').''.$titel.'
    '; + + ?> + + + diff --git a/vilesci/stammdaten/benutzerberechtigung_details.php b/vilesci/stammdaten/benutzerberechtigung_details.php index 5db140a81..b230d702f 100644 --- a/vilesci/stammdaten/benutzerberechtigung_details.php +++ b/vilesci/stammdaten/benutzerberechtigung_details.php @@ -37,21 +37,43 @@ require_once('../../include/person.class.php'); require_once('../../include/benutzer.class.php'); require_once('../../include/funktion.class.php'); require_once('../../include/wawi_kostenstelle.class.php'); +require_once('../../include/log.class.php'); +/* + * TODOs + * + +Checkbox-Range +Mehrfach-Löschen + + +Wawi und kostenstelle ausblenden +Checkbox markieren bei (doppel)klick auf Zeile + +---------------------- + +Nach übertragen gleich zu Person springen +Bug in Kopieren - Verdoppelt alle Einträge +Sortierreihenfolge. OE wird anscheinend nicht sortiert +ART prüfen auf schreibweise +BEschreibungstexte bestehender Rechte + + */ $user = get_uid(); $rechte = new benutzerberechtigung(); $rechte->getBerechtigungen($user); if (!$db = new basis_db()) - die($p->t("global/fehlerBeimOeffnenDerDatenbankverbindung")); + die('Fehler beim öffnen der Datenbankverbindung'); if(!$rechte->isBerechtigt('basis/berechtigung')) die('Sie haben keine Berechtigung fuer diese Seite'); //$reloadstr = ''; // neuladen der liste im oberen frame $htmlstr = ''; -$errorstr = ''; //fehler beim insert +$errorstr = ''; +$successstr = ''; $sel = ''; $chk = ''; $oe_arr = array(); @@ -73,64 +95,161 @@ $neu = false; $negativ = false; $filter=(isset($_GET['filter'])?$_GET['filter']:'alle'); -if(isset($_POST['del'])) +if(isset($_POST['delete']) && $_POST['delete'] != '') { if(!$rechte->isBerechtigt('basis/berechtigung', null, 'suid')) - die('Sie haben keine Berechtigung fuer diese Aktion'); + die($rechte->errormsg); - $benutzerberechtigung_id = $_POST['benutzerberechtigung_id']; + $benutzerberechtigung_id = $_POST['delete']; $ber = new benutzerberechtigung(); if(!$ber->delete($benutzerberechtigung_id)) $errorstr .= 'Datensatz konnte nicht gelöscht werden!'; - //$reloadstr .= "\n"; + //$reloadstr .= ""; } -if(isset($_POST['kopieren'])) +if(isset($_POST['delete_multi']) && $_POST['delete_multi'] != '') { + if(!$rechte->isBerechtigt('basis/berechtigung', null, 'suid')) + die($rechte->errormsg); + + if (isset($_POST['dataset'])) + { + $i = 0; + foreach ($_POST['dataset'] AS $benutzerberechtigung_id => $value) + { + // Nur markierte Rechte kopieren + if (!isset($value['check'])) + { + continue; + } + + $ber = new benutzerberechtigung(); + if(!$ber->delete($benutzerberechtigung_id)) + { + $errorstr .= 'Datensatz konnte nicht gelöscht werden!'; + } + else + { + $i ++; + //Log schreiben + $log = new log(); + + $logdata = var_export((array) $ber, true); + $log->new = true; + $log->sql = $logdata; + $log->sqlundo = 'Kein Undo vorhanden'; + $log->executetime = date('Y-m-d H:i:s'); + $log->mitarbeiter_uid = $user; + $log->beschreibung = 'Berechtigung gelöscht'; + + if(!$log->save()) + { + $errorstr .= "Fehler beim schreiben des Log-Eintrags
    "; + } + } + } + if ($errorstr == '') + { + $successstr .= "".$i." Rechte erfolgreich gelöscht
    "; + } + } + + + + //$reloadstr .= ""; + +} + +if(isset($_POST['uebertragen']) && $_POST['uebertragen_nach'] != '') +{ + //echo '
    ', var_dump($_POST), '
    ';exit(); if($rechte->isBerechtigt('basis/berechtigung', null, 'suid')) { - $uid = $_POST['uid']; - $uid_von = $_POST['uid_von']; + $uidVon = $_POST['uid']; + $copyTo = $_POST['uebertragen_nach']; - $rechtevon = new benutzerberechtigung(); - if(!$rechtevon->loadBenutzerRollen($uid_von)) - die('Fehler beim Laden der Berechtigung von '.$uid_von); - - foreach($rechtevon->berechtigungen AS $row) + if (isset($_POST['dataset'])) { - //Nur aktive Berechtigungen kopieren - if(($row->start=='' || $row->start<=date('Y-m-d')) && ($row->ende=='' || $row->ende>=date('Y-m-d'))) + $i = 0; + foreach ($_POST['dataset'] AS $key => $value) { + // Nur markierte Rechte kopieren + if (!isset($value['check'])) + { + continue; + } + + $rolle_kurzbz = (isset($value['rolle_kurzbz']) ? $value['rolle_kurzbz'] : ''); + $berechtigung_kurzbz = (isset($value['berechtigung_kurzbz']) ? $value['berechtigung_kurzbz'] : ''); + $art = (isset($value['art']) ? $value['art'] : ''); + $oe_kurzbz = (isset($value['oe_kurzbz']) ? $value['oe_kurzbz'] : ''); + $kostenstelle_id = (isset($value['kostenstelle_id']) ? $value['kostenstelle_id'] : ''); + $start = (isset($value['start']) ? $value['start'] : ''); + $ende = (isset($value['ende']) ? $value['ende'] : ''); + $anmerkung = (isset($value['anmerkung']) ? $value['anmerkung'] : ''); + + $funktion_kurzbz = (isset($value['funktion_kurzbz']) ? $value['funktion_kurzbz'] : ''); + $studiensemester_kurzbz = null; + $ber = new benutzerberechtigung(); - $ber->new = true; - //$ber->benutzerberechtigung_id = $benutzerberechtigung_id; - $ber->art = $row->art; - $ber->oe_kurzbz = $row->oe_kurzbz; - $ber->berechtigung_kurzbz = $row->berechtigung_kurzbz; - $ber->rolle_kurzbz = $row->rolle_kurzbz; - $ber->uid = $uid; - $ber->funktion_kurzbz = $row->funktion_kurzbz; - $ber->studiensemester_kurzbz = $row->studiensemester_kurzbz; - $ber->start = $row->start; - $ber->ende = $row->ende; - $ber->negativ = $row->negativ; - $ber->insertamum=date('Y-m-d H:i:s'); + $ber->insertamum = date('Y-m-d H:i:s'); $ber->insertvon = $user; + $ber->new = true; + + if (isset($value['negativ'])) + $ber->negativ = true; + else + $ber->negativ = false; + + $ber->art = $art; + $ber->oe_kurzbz = $oe_kurzbz; + $ber->berechtigung_kurzbz = $berechtigung_kurzbz; + $ber->rolle_kurzbz = $rolle_kurzbz; + $ber->uid = $copyTo; + $ber->funktion_kurzbz = $funktion_kurzbz; + $ber->studiensemester_kurzbz = $studiensemester_kurzbz; + $ber->start = $start; + $ber->ende = $ende; $ber->updateamum = date('Y-m-d H:i:s'); $ber->updatevon = $user; - $ber->kostenstelle_id = $row->kostenstelle_id; - $ber->anmerkung = 'Kopiert von UID '.$uid_von.($row->anmerkung!=''?'. Anmerkung von UID '.$uid_von.': '.$row->anmerkung:''); + $ber->kostenstelle_id = $kostenstelle_id; + $ber->anmerkung = 'Kopiert von UID '.$uidVon.($anmerkung!=''?'. Anmerkung von UID '.$uidVon.': '.$anmerkung:''); if(!$ber->save()) { - if (!$ber->new) - $errorstr .= "Datensatz konnte nicht gespeichert werden!".$ber->errormsg; + $errorstr .= "Datensatz konnte nicht gespeichert werden!".$ber->errormsg; } + else + { + $i ++; + //Log schreiben + $log = new log(); + + $logdata = var_export((array) $ber, true); + $log->new = true; + $log->sql = $logdata; + $log->sqlundo = 'Kein Undo vorhanden'; + $log->executetime = date('Y-m-d H:i:s'); + $log->mitarbeiter_uid = $user; + $log->beschreibung = 'Berechtigung übertragen von '.$uidVon.' nach '.$copyTo; + + if(!$log->save()) + { + $errorstr .= "Fehler beim schreiben des Log-Eintrags
    "; + } + } + } + if ($errorstr == '') + { + $successstr .= "".$i." Rechte erfolgreich kopiert
    "; + echo ""; } } } @@ -140,90 +259,239 @@ if(isset($_POST['kopieren'])) } } -if(isset($_POST['schick']) || isset($_POST['copy'])) +if(isset($_POST['setDate_multi']) && $_POST['setDate_multi'] != '') +{ + if(!$rechte->isBerechtigt('basis/berechtigung', null, 'suid')) + die($rechte->errormsg); + + if (isset($_POST['dataset'])) + { + $i = 0; + foreach ($_POST['dataset'] AS $benutzerberechtigung_id => $value) + { + // Nur markierte Einträge bearbeiten + if (!isset($value['check'])) + { + continue; + } + + $ber = new benutzerberechtigung(); + if(!$ber->load($benutzerberechtigung_id)) + { + die('Fehler beim Laden der Berechtigung'); + } + + $ber->ende = date('Y-m-d',strtotime("-1 days")); + $ber->updateamum = date('Y-m-d H:i:s'); + $ber->updatevon = $user; + + if(!$ber->save()) + { + $errorstr .= "Das Ende-Datum des Datensatzes mit der ID ".$benutzerberechtigung_id." konnte nicht gespeichert werden!".$ber->errormsg; + } + else + { + $i ++; + //Log schreiben + $log = new log(); + + $logdata = var_export((array) $ber, true); + $log->new = true; + $log->sql = $logdata; + $log->sqlundo = 'Kein Undo vorhanden'; + $log->executetime = date('Y-m-d H:i:s'); + $log->mitarbeiter_uid = $user; + $log->beschreibung = 'Berechtigung für '.$uid.' beendet'; + + if(!$log->save()) + { + $errorstr .= "Fehler beim schreiben des Log-Eintrags
    "; + } + } + } + if ($errorstr == '') + { + $successstr .= "Ende-Datum bei ".$i." Rechten erfolgreich beendet
    "; + } + } + + + + //$reloadstr .= ""; + +} + +if(isset($_POST['schick'])) { if($rechte->isBerechtigt('basis/berechtigung', null, 'suid')) { - $benutzerberechtigung_id = $_POST['benutzerberechtigung_id']; - $art = $_POST['art']; - $oe_kurzbz = (isset($_POST['oe_kurzbz'])?$_POST['oe_kurzbz']:''); - $berechtigung_kurzbz = (isset($_POST['berechtigung_kurzbz'])?$_POST['berechtigung_kurzbz']:''); - $rolle_kurzbz = (isset($_POST['rolle_kurzbz'])?$_POST['rolle_kurzbz']:''); - $uid = $_POST['uid']; - $funktion_kurzbz = $_POST['funktion_kurzbz']; - $studiensemester_kurzbz = null;//$_POST['studiensemester_kurzbz']; - $start = $_POST['start']; - $ende = $_POST['ende']; - $kostenstelle_id = (isset($_POST['kostenstelle_id'])?$_POST['kostenstelle_id']:''); - $anmerkung = (isset($_POST['anmerkung'])?$_POST['anmerkung']:''); + if (isset($_POST['dataset'])) + { + foreach ($_POST['dataset'] AS $benutzerberechtigung_id => $value) + { + $rolle_kurzbz = (isset($value['rolle_kurzbz']) ? $value['rolle_kurzbz'] : ''); + $berechtigung_kurzbz = (isset($value['berechtigung_kurzbz']) ? $value['berechtigung_kurzbz'] : ''); + $art = (isset($value['art']) ? $value['art'] : ''); + $oe_kurzbz = (isset($value['oe_kurzbz']) ? $value['oe_kurzbz'] : ''); + //echo '
    ', var_dump($oe_kurzbz), '
    '; + $kostenstelle_id = (isset($value['kostenstelle_id']) ? $value['kostenstelle_id'] : ''); + $start = (isset($value['start']) ? $value['start'] : ''); + $ende = (isset($value['ende']) ? $value['ende'] : ''); + $uid = $_POST['uid']; + $anmerkung = (isset($value['anmerkung']) ? $value['anmerkung'] : ''); + $funktion_kurzbz = (isset($_POST['funktion_kurzbz']) ? $_POST['funktion_kurzbz'] : ''); + $studiensemester_kurzbz = null; + + $ber = new benutzerberechtigung(); + if (isset($_POST['neu'])) + { + $ber->insertamum = date('Y-m-d H:i:s'); + $ber->insertvon = $user; + $ber->new = true; + } + else + { + if(!$ber->load($benutzerberechtigung_id)) + { + die('Fehler beim Laden der Berechtigung'); + } + //Nur bei geänderten Datensätzen das Updatedatum setzen + if ($ber->berechtigung_kurzbz != $berechtigung_kurzbz + || $ber->art != $art + || $ber->oe_kurzbz != $oe_kurzbz + || $ber->rolle_kurzbz != $rolle_kurzbz + || $ber->uid != $uid + || $ber->funktion_kurzbz != $funktion_kurzbz + || $ber->studiensemester_kurzbz != $studiensemester_kurzbz + || $ber->start != $start + || $ber->ende != $ende + || $ber->kostenstelle_id != $kostenstelle_id + || $ber->anmerkung != $anmerkung + || $ber->negativ != isset($value['negativ']) + ) + { + $ber->updateamum = date('Y-m-d H:i:s'); + $ber->updatevon = $user; + } + } + if (isset($value['negativ'])) + $ber->negativ = true; + else + $ber->negativ = false; + + $ber->benutzerberechtigung_id = $benutzerberechtigung_id; + $ber->art = $art; + $ber->oe_kurzbz = $oe_kurzbz; + $ber->berechtigung_kurzbz = $berechtigung_kurzbz; + $ber->rolle_kurzbz = $rolle_kurzbz; + $ber->uid = $uid; + $ber->funktion_kurzbz = $funktion_kurzbz; + $ber->studiensemester_kurzbz = $studiensemester_kurzbz; + $ber->start = $start; + $ber->ende = $ende; + $ber->kostenstelle_id = $kostenstelle_id; + $ber->anmerkung = $anmerkung; + + if(!$ber->save()) + { + if (!$ber->new) + $errorstr .= "Datensatz konnte nicht upgedatet werden!".$ber->errormsg; + else + $errorstr .= "Datensatz konnte nicht gespeichert werden!".$ber->errormsg; + } + else + { + //Log schreiben + $log = new log(); + + $logdata = var_export((array) $ber, true); + $log->new = true; + $log->sql = $logdata; + $log->sqlundo = 'Kein Undo vorhanden'; + $log->executetime = date('Y-m-d H:i:s'); + $log->mitarbeiter_uid = $user; + if (isset($_POST['neu'])) + $log->beschreibung = 'Neue Berechtigung für '.$uid.' angelegt'; + else + $log->beschreibung = 'Berechtigung für '.$uid.' aktualisiert'; + + if(!$log->save()) + { + $errorstr .= "Fehler beim schreiben des Log-Eintrags
    "; + } + } + } + } + } + else + { + $errorstr.='Fehler beim Speichern: '.$rechte->errormsg; + } +} + +if(isset($_POST['copy']) && $_POST['copy'] != '') +{ + if($rechte->isBerechtigt('basis/berechtigung', null, 'suid')) + { $ber = new benutzerberechtigung(); - if (isset($_POST['neu']) || isset($_POST['copy'])) - { - $ber->insertamum=date('Y-m-d H:i:s'); - $ber->insertvon = $user; - $ber->new = true; - } - else - { - if(!$ber->load($benutzerberechtigung_id)) - die('Fehler beim Laden der Berechtigung'); - } - if (isset($_POST['negativ'])) - $ber->negativ = true; - else - $ber->negativ = false; + if(!$ber->load($_POST['copy'])) + die('Fehler beim Laden der Berechtigung'); - $ber->benutzerberechtigung_id = $benutzerberechtigung_id; - $ber->art = $art; - $ber->oe_kurzbz = $oe_kurzbz; - $ber->berechtigung_kurzbz = $berechtigung_kurzbz; - $ber->rolle_kurzbz = $rolle_kurzbz; - $ber->uid = $uid; - $ber->funktion_kurzbz = $funktion_kurzbz; - $ber->studiensemester_kurzbz = $studiensemester_kurzbz; - $ber->start = $start; - $ber->ende = $ende; - $ber->updateamum = date('Y-m-d H:i:s'); - $ber->updatevon = $user; - $ber->kostenstelle_id = $kostenstelle_id; - $ber->anmerkung = $anmerkung; + $ber->new = true; + $ber->insertamum = date('Y-m-d H:i:s'); + $ber->insertvon = $user; - if(!$ber->save()){ + if(!$ber->save()) + { if (!$ber->new) $errorstr .= "Datensatz konnte nicht upgedatet werden!".$ber->errormsg; else $errorstr .= "Datensatz konnte nicht gespeichert werden!".$ber->errormsg; } - /*if ($ber->new) + else { - $reloadstr .= "\n"; - }*/ + //Log schreiben + $log = new log(); + + $logdata = var_export((array) $ber, true); + $log->new = true; + $log->sql = $logdata; + $log->sqlundo = 'Kein Undo vorhanden'; + $log->executetime = date('Y-m-d H:i:s'); + $log->mitarbeiter_uid = $user; + $log->beschreibung = 'Berechtigung für '.$uid.' kopiert'; + + if(!$log->save()) + { + $errorstr .= "Fehler beim schreiben des Log-Eintrags
    "; + } + } } else { - $errorstr.='Fehler beim Speichern: Sie haben keine Berechtigung zum Speichern'; + $errorstr.='Fehler beim Speichern: '.$rechte->errormsg; } } if (!$b = new berechtigung()) die($b->errormsg); -$b->getRollen(); +$b->getRollen('rolle_kurzbz'); foreach($b->result as $berechtigung) { - $rolle_arr[] = $berechtigung->rolle_kurzbz; + $rolle_arr[$berechtigung->rolle_kurzbz] = $berechtigung->beschreibung; } -sort($rolle_arr); + $b->getBerechtigungen(); foreach($b->result as $berechtigung) { - $berechtigung_arr[] = $berechtigung->berechtigung_kurzbz; + $berechtigung_arr[$berechtigung->berechtigung_kurzbz] = $berechtigung->beschreibung; $berechtigung_beschreibung_arr[] = $berechtigung->beschreibung; } -//var_dump($berechtigung_arr); + $st = new studiensemester(); $st->getAll(); foreach($st->studiensemester as $studiensemester) @@ -233,9 +501,17 @@ foreach($st->studiensemester as $studiensemester) $oe = new organisationseinheit(); $oe->getAll(); +foreach ($oe->result AS $row) +{ + $oe_arr[$row->oe_kurzbz] = $row->organisationseinheittyp_kurzbz.' '.$row->bezeichnung; +} $kostenstelle = new wawi_kostenstelle(); $kostenstelle->getAll(); +foreach ($kostenstelle->result AS $row) +{ + $kst_arr[$row->kostenstelle_id] = $row->bezeichnung; +} if (isset($_REQUEST['uid']) || isset($_REQUEST['funktion_kurzbz'])) { @@ -259,13 +535,25 @@ if (isset($_REQUEST['uid']) || isset($_REQUEST['funktion_kurzbz'])) $rights->loadBenutzerRollen($uid); $name = new benutzer(); $name->load($uid); - $htmlstr .= "Berechtigungen von ".$name->nachname." ".$name->vorname." (".$uid.")\n"; - //Formular zum Kopieren von Berechtigungen - $htmlstr .= "
    \n"; - $htmlstr .= "Berechtigungen (aktive) kopieren von UID \n"; - $htmlstr .= "\n"; - $htmlstr .= "\n"; - $htmlstr .= "
    \n"; + + $htmlstr .= "Berechtigungen von ".$name->nachname." ".$name->vorname." (".$uid.")"; + $message = ''; + $class = ''; + if ($errorstr != '' || $successstr != '') + { + if ($successstr != '') + { + $class = 'class="alert alert-success"'; + $message = $successstr; + } + elseif ($errorstr != '') + { + $class = 'class="alert alert-danger"'; + $message = $errorstr; + } + } + $htmlstr .= '
    '.$message.'
    '; + $i = 0; // Zusätzlich jede Funktion mit einer gültigen Berechtigung anzeigen @@ -284,6 +572,7 @@ if (isset($_REQUEST['uid']) || isset($_REQUEST['funktion_kurzbz'])) $rechte_funktion = new benutzerberechtigung(); $rechte_funktion->loadBenutzerRollen(null, $recht); $funktionsrecht = $rechte_funktion->berechtigungen; // Hat die Funktion ein Recht? + $anzahlFunktionsrechte = count($funktionsrecht); $funktion_bezeichnung = new funktion(); $funktion_bezeichnung->load($recht); if(!empty($funktionsrecht)) @@ -291,11 +580,26 @@ if (isset($_REQUEST['uid']) || isset($_REQUEST['funktion_kurzbz'])) $i++; if ($i==1) { - $htmlstr .= "Geerbte Berechtigungen aus Funktion\n"; + $htmlstr .= "

    Geerbte Berechtigungen aus Funktion(en): "; } - $htmlstr .= ($i>1?", ":"").$funktion_bezeichnung->beschreibung.""; + if ($i > 1) + { + $htmlstr .= ", "; + } + + $htmlstr .= ""; + $htmlstr .= $funktion_bezeichnung->beschreibung; + $htmlstr .= " (".$anzahlFunktionsrechte.")"; } } + if(isset($funktionsrecht)) + { + $htmlstr .= '

    '; + } + } + if (count($bn) > 0) + { + $htmlstr .= "

    Rechte Detailaufschlüsselung

    "; } } elseif(isset($_REQUEST['funktion_kurzbz']) && $_REQUEST['funktion_kurzbz']!='') @@ -307,10 +611,10 @@ if (isset($_REQUEST['uid']) || isset($_REQUEST['funktion_kurzbz'])) die('Funktion existiert nicht'); $rights->loadBenutzerRollen(null, $funktion_kurzbz); - $htmlstr .= "Berechtigungen der Funktion ".$funktion->beschreibung."\n"; + $htmlstr .= "Berechtigungen der Funktion ".$funktion->beschreibung.""; } - //$htmlstr .= "Berechtigungen von ".$name->nachname." ".$name->vorname." (".$uid.")".$funktion_kurzbz."\n"; + //$htmlstr .= "Berechtigungen von ".$name->nachname." ".$name->vorname." (".$uid.")".$funktion_kurzbz.""; /*$htmlstr .= '      Filter: Alle | nur WaWi @@ -318,80 +622,76 @@ if (isset($_REQUEST['uid']) || isset($_REQUEST['funktion_kurzbz'])) ';*/ - $htmlstr .= "\n"; //Alternatives styling fuer Tablesorter um Platz zu sparen. - $htmlstr .= "\n"; + //////////////// + // Neue Berechtigung einfügen + //////////////// + + $htmlstr .= "
    "; + $htmlstr .= ""; $htmlstr .= " - - - + + - - - - \n"; + "; - $htmlstr .= "\n"; - $htmlstr .= "\n"; - $htmlstr .= "\n"; - $htmlstr .= "\n"; - $htmlstr .= "\n"; - $htmlstr .= "\n"; + $htmlstr .= ""; + $htmlstr .= ""; + $htmlstr .= ""; + $htmlstr .= ""; + $htmlstr .= ""; + $htmlstr .= ""; - //Status - $htmlstr .= " \n"; + $htmlstr .= ""; //Rolle - $htmlstr .= " \n"; + $htmlstr .= " "; //Berechtigung_kurzbz - $htmlstr .= " \n"; + $htmlstr .= " "; //Art - $htmlstr .= " \n"; + $htmlstr .= " "; //Organisationseinheit - if($funktion_kurzbz!='') - $htmlstr .= " \n"; + if($funktion_kurzbz != '') + { + $htmlstr .= " "; + } else { - $htmlstr .= " \n"; + $htmlstr .= " "; } //Kostenstelle - $htmlstr .= " "; + + /* + $htmlstr .= " \n"; + $htmlstr .= " ";*/ - $htmlstr .= " \n"; - $htmlstr .= " \n"; - $htmlstr .= " \n"; + //Negativ + $htmlstr .= " "; + + //Start + $htmlstr .= " "; + + //Ende + $htmlstr .= " "; //Anmerkung - $htmlstr .= " \n"; + $htmlstr .= " "; - $htmlstr .= " "; - $htmlstr .= "\n"; - $htmlstr .= " \n"; + $htmlstr .= " "; + $htmlstr .= ""; + $htmlstr .= "
    Rolle Berechtigung ArtOrganisationseinheitKostenstelleOrganisationseinheitKostenstelle Neg Gültig ab Gültig bis AnmerkungInfo
     Neu: "; + $htmlstr .= " "; + $htmlstr .= " "; + $htmlstr .= " "; + $htmlstr .= " OE aus MA-FunktionOE aus MA-Funktion"; + $htmlstr .= " "; + $htmlstr .= " "; + $htmlstr .= " "; + $htmlstr .= " "; + $htmlstr .= " "; + $htmlstr .= "
    "; + + $htmlstr .= "
    "; + + //////////////// + // Tabelle für bestehende Berechtigungen + //////////////// + + $htmlstr .= "

    "; + $htmlstr .= "
    "; + + $htmlstr .= ""; + $htmlstr .= ""; + /*$htmlstr .= " + + + +
    + +
    + ";*/ + $htmlstr .= ""; + $htmlstr .= ""; + $htmlstr .= " + + + + + + + + + + + + + + + "; foreach($rights->berechtigungen as $b) { @@ -430,199 +774,213 @@ if (isset($_REQUEST['uid']) || isset($_REQUEST['funktion_kurzbz'])) break; default: break; } - if(isset($_POST['edit']) && $_POST['benutzerberechtigung_id']==$b->benutzerberechtigung_id) + + $htmlstr .= " "; + $heute = strtotime(date('Y-m-d')); + if ($b->ende!='' && strtotime($b->ende) < $heute) { - $htmlstr .= " \n"; - $htmlstr .= "\n"; - $htmlstr .= "\n"; - $htmlstr .= "\n"; - $htmlstr .= "\n"; - - $heute = strtotime(date('Y-m-d')); - if ($b->ende!='' && strtotime($b->ende)<$heute) - { - $status="ampel_rot.png"; - $titel="ccc"; - } - elseif ($b->start!='' && strtotime($b->start)>$heute) - { - $status="ampel_gelb.png"; - $titel="bbb"; - } - else - { - $status="ampel_gruen.png"; - $titel="aaa"; - } - //Status - $htmlstr .= " \n"; - //Rolle - $htmlstr .= " \n"; - - //Berechtigung - $htmlstr .= " \n"; - - //Art - $htmlstr .= " \n"; - - //Organisationseinheit - if($funktion_kurzbz!='') - $htmlstr .= " \n"; - else - { - $htmlstr .= " \n"; - } - - //Kostenstelle - $htmlstr .= " \n"; - - $htmlstr .= " \n"; - $htmlstr .= " \n"; - $htmlstr .= " \n"; - $htmlstr .= " \n"; - $htmlstr .= " \n"; - - $htmlstr .= " "; - $htmlstr .= " "; - $htmlstr .= "\n"; - $htmlstr .= " \n"; + $titel="ccc"; + $style = 'style="border-left: 10px solid tomato; border-right: 10px solid transparent; text-align: center; vertical-align: middle; background-color: #d0d7e0;"'; + $inaktiv_class = 'inaktiv'; + $data = 'rot'; + } + elseif ($b->start!='' && strtotime($b->start) > $heute) + { + $titel="bbb"; + $style = 'style="border-left: 10px solid gold; border-right: 10px solid transparent; text-align: center; vertical-align: middle"'; + $inaktiv_class = ''; + $data = 'gelb'; } else { - $htmlstr .= " \n"; - $htmlstr .= "\n"; - $htmlstr .= "\n"; - $htmlstr .= "\n"; - $htmlstr .= "\n"; + $titel="aaa"; + $style = 'style="border-left: 10px solid LightGreen; border-right: 10px solid transparent; text-align: center; vertical-align: middle"'; + $inaktiv_class = ''; + $data = 'gruen'; + } + // Auswahlcheckbox + $htmlstr .= " "; - $heute = strtotime(date('Y-m-d')); - if ($b->ende!='' && strtotime($b->ende)<$heute) + //Rolle + $htmlstr .= " \n"; - //Rolle - $htmlstr .= " \n"; + $sel = ""; + $htmlstr .= ""; + } + $htmlstr .= " "; + if ($b->rolle_kurzbz != '') + { + $htmlstr .= " "; + } + $htmlstr.=""; - //Berechtigung - $htmlstr .= " \n"; + //Berechtigung + $htmlstr .= " "; - //Art - $htmlstr .= " \n"; + //Art + $htmlstr .= " "; - //Organisationseinheit - $oekey = $oe->result; - $org = new organisationseinheit(); - $org->load($b->oe_kurzbz); - $htmlstr .= " \n"; - - //Kostenstelle - $kst = new wawi_kostenstelle(); - $kst->load($b->kostenstelle_id); - if(!$kst->aktiv) - $style='style="text-decoration:line-through;"'; - else - $style=''; - $htmlstr .= " \n"; - - - $htmlstr .= " \n"; - $htmlstr .= " \n"; - $htmlstr .= " \n"; - $htmlstr .= " \n"; - $htmlstr .= " \n"; - - $htmlstr .= " "; - $htmlstr .= " "; - $htmlstr .= "\n"; - $htmlstr .= " \n"; + //Organisationseinheit + if($funktion_kurzbz != '') + { + $htmlstr .= " "; + } + else + { + $htmlstr .= " "; } + //Kostenstelle + $htmlstr .= " "; + + + /*$htmlstr .= " ";*/ + + //Negativ-Checkbox + $htmlstr .= " "; + + //Gültig ab + $htmlstr .= " "; + + // Gültig bis + $htmlstr .= " "; + + //Anmerkung + $htmlstr .= " "; + + //Info + $htmlstr .= " "; + + $htmlstr .= " "; + $htmlstr .= " "; } - - $htmlstr .= "
    + RolleBerechtigungArtOrganisationseinheitKostenstelleNegGültig abGültig bisAnmerkungInfo
    aktiv"; - - // Wenn editiert wird, zu der Zeile Springen - $htmlstr.=" - - "; - $htmlstr.="OE aus MA-Funktionnegativ?'checked="checked"':'')." onchange='markier(\"td_".$b->benutzerberechtigung_id."\")'>anmerkung))."' size='30' maxlength='256' markier(\"td_".$b->benutzerberechtigung_id."\")'>information  
    "; + $htmlstr .= " ".$titel.""; + $htmlstr .= " "; + $htmlstr .= " "; + $htmlstr .= " aktiv$b->rolle_kurzbz$b->berechtigung_kurzbz"; + $htmlstr .= " ".$b->berechtigung_kurzbz.""; + $htmlstr .= " berechtigung_kurzbz] : '')."' + data-toggle='tooltip' + data-html='true' + data-placement='auto'>"; + $htmlstr .= " ".$b->art.""; + $htmlstr .= " ".$b->art.""; + $htmlstr .= " "; + $htmlstr .= " ".$org->organisationseinheittyp_kurzbz." ".$org->bezeichnung."$kst->bezeichnungnegativ?'checked="checked"':'')." onchange='markier(\"td_".$b->benutzerberechtigung_id."\")' disabled>".$b->start."".$b->ende."".$b->anmerkung."information
    OE aus MA-Funktion"; + $htmlstr .= " ".($b->oe_kurzbz != '' ? $oe_arr[$b->oe_kurzbz] : '').""; + $htmlstr .= " "; + $htmlstr .= " oe_kurzbz] : '')."'>"; + $htmlstr .= " "; + $htmlstr .= " ".$b->kostenstelle_id.""; + $htmlstr .= " "; + $htmlstr .= " kostenstelle_id] : '')."'>"; + $htmlstr .= " "; + $htmlstr .= " negativ?'checked="checked"':'').">"; + $htmlstr .= " "; + $htmlstr .= " ".$b->start.""; + $htmlstr .= " "; + $htmlstr .= " "; + $htmlstr .= " ".$b->ende.""; + $htmlstr .= " "; + $htmlstr .= " "; + $htmlstr .= " anmerkung))."' + data-toggle='tooltip' + data-html='true' + data-placement='auto' + size='50' + maxlength='256'>"; + $htmlstr .= " + + "; + $htmlstr .= " "; + $htmlstr .= " "; + $htmlstr .= "
    \n"; - + $htmlstr .= ""; + $htmlstr .= '
    +
    + +
    +
    + +
    + +
    +
    + + +
    +
    +
    '; + $htmlstr .= ""; + $htmlstr .= "
















    "; } -$htmlstr .= "
    ".$errorstr."
    \n"; + ?> @@ -633,60 +991,218 @@ $htmlstr .= "
    ".$errorstr."
    \n"; + - - + + + + + - + + + + + + +

    Rechte Übersicht

    + + berechtigung_kurzbz = $kurzbzPost; + $berechtigung->beschreibung = $beschreibung; + $berechtigung->new = true; + + if($berechtigung->save()) + { + echo 'Recht '.$kurzbzPost.' wurde angelegt

    '; + } + else + { + echo 'Fehler beim Speichern:'.$berechtigung->errormsg.'

    '; + } + } + else + { + echo 'Zum Speichern der Daten muss die Kurzbz und die Beschreibung angegeben werden

    '; + } + } + + if(isset($delete) && isset($kurzbz)) + { + $berechtigung = new berechtigung(); + if($berechtigung->delete($kurzbz)) + echo 'Das Recht "'.$kurzbz.'" wurde erfolgreich gelöscht

    '; + else + echo 'Fehler beim Löschen des Rechts:'.$berechtigung->errormsg.'

    '; + } + + if(isset($save)) + { + $berechtigung = new berechtigung(); + $berechtigung->load($berechtigung_kurzbz); + $berechtigung->beschreibung = $beschreibung; + if (!$berechtigung->save(false)) + echo 'Fehler beim Speichern:'.$berechtigung->errormsg.'

    '; + } + + //Tabelle mit Rollen anzeigen + $berechtigung = new berechtigung(); + $berechtigung->getBerechtigungen(); + + echo ''; + echo ' + + + + + + + + + '; + + foreach($berechtigung->result as $recht) + { + if($edit && $recht->berechtigung_kurzbz == $kurzbz) + { + echo ' + + + + '; + } + else + { + echo ' + + + + + + '; + } + } + echo ' + +
    KurzbzBeschreibungAktion
    + '.$recht->berechtigung_kurzbz.' +
    + + '.(256 - strlen($recht->beschreibung)).' + + +
    +
    '.$recht->berechtigung_kurzbz.''.$recht->beschreibung.' + + Bearbeiten + + + + Recht löschen + +
    + +
    '; + + echo '
    +

    Neues Recht einfügen

    + Kurzbz: + Beschreibung: + 256 +   +
    +
    + +'; + ?> diff --git a/vilesci/stammdaten/berechtigungrolle.php b/vilesci/stammdaten/berechtigungrolle.php index 56bb6935b..7e87a4901 100644 --- a/vilesci/stammdaten/berechtigungrolle.php +++ b/vilesci/stammdaten/berechtigungrolle.php @@ -35,54 +35,142 @@ if(!$rechte->isBerechtigt('basis/berechtigung')) $rolle_kurzbz = filter_input(INPUT_GET, 'rolle_kurzbz'); $delete = filter_input(INPUT_GET, 'delete', FILTER_VALIDATE_BOOLEAN); +$copy = filter_input(INPUT_POST, 'copy'); +$vergleich = filter_input(INPUT_GET, 'vergleich'); ?> - Berechtigungen Uebersicht + Rollen Uebersicht - - - + + -

    Berechtigung - Rolle - Übersicht

    + Berechtigungen der Rolle "'.$rolle_kurzbz.'"'; $berechtigung_kurzbz = filter_input(INPUT_GET, 'berechtigung_kurzbz'); $art = filter_input(INPUT_GET, 'art'); $save = filter_input(INPUT_GET, 'save'); + $anmerkung = filter_input(INPUT_GET, 'anmerkung'); if(isset($save)) { @@ -92,10 +180,17 @@ $delete = filter_input(INPUT_GET, 'delete', FILTER_VALIDATE_BOOLEAN); $berechtigung->rolle_kurzbz = $rolle_kurzbz; $berechtigung->berechtigung_kurzbz = $berechtigung_kurzbz; $berechtigung->art = $art; + $berechtigung->anmerkung = $anmerkung; + $berechtigung->insertamum = date('Y-m-d H:i:s'); + $berechtigung->insertvon = $user; if($berechtigung->saveRolleBerechtigung()): ?> Zuteilung gespeichert - + Fehler beim Speichern der Zuteilung: errormsg ?> deleteRolleBerechtigung($rolle_kurzbz, $berechtigung_kurzbz)): ?> Fehler beim Löschen: errormsg ?> - Berechtigung gelöscht! + Berechtigung gelöscht! -
    - Zurück + Zurück zur Rollen Übersicht -

    RolleBerechtigung "":

    - +

    getBerechtigungen(); ?>
    +
    + - - - + + + +
    - + - + + getRolleBerechtigung($rolle_kurzbz); foreach($berechtigungen->result as $rolle): ?> + + @@ -171,8 +279,166 @@ $delete = filter_input(INPUT_GET, 'delete', FILTER_VALIDATE_BOOLEAN);
    Kurzbz Art BeschreibungAnmerkung
    berechtigung_kurzbz ?> art ?> beschreibung ?>anmerkung ?> - - entfernen + + Bearbeiten + + + + Recht entfernen
    Rollen vergleichen'; + $rolle1 = filter_input(INPUT_GET, 'rolle_kurzbz1'); + $rolle2 = filter_input(INPUT_GET, 'rolle_kurzbz2'); + ?> + + + Zurück zur Rollen Übersicht + +

    + + getRolleBerechtigung($rolle1); + foreach ($rollen->result AS $recht) + { + $rollen1Arr[$recht->berechtigung_kurzbz] = $recht->art; + } + $rollen = new berechtigung(); + $rollen->getRolleBerechtigung($rolle2); + foreach ($rollen->result AS $recht) + { + $rollen2Arr[$recht->berechtigung_kurzbz] = $recht->art; + } + $rollenGesamt = array_merge($rollen1Arr,$rollen2Arr); + ksort($rollenGesamt); + + echo '
    +
    +
    + Rolle 1: + '; + if (isset($rolle1)) + { + echo ' + + + + + + + '; + + foreach ($rollenGesamt AS $recht => $art) + { + if (array_key_exists($recht, $rollen1Arr)) + { + if ($art != $rollen1Arr[$recht]) + { + echo ' + + + '; + } + else + { + echo ' + + + '; + } + + } + else + { + echo ' + + + '; + } + } + echo ' + +
    KurzbzArt
    '.$recht.''.$rollen1Arr[$recht].'
    '.$recht.''.$art.'
      
    '; + } + echo ' +
    +
    + Rolle 2: + '; + echo ''; + if (isset($rolle2)) + { + echo ' + + + + + + + '; + foreach ($rollenGesamt AS $recht => $art) + { + if (array_key_exists($recht, $rollen2Arr)) + { + if ($art != $rollen2Arr[$recht]) + { + echo ' + + + '; + } + else + { + echo ' + + + '; + } + } + else + { + echo ' + + + '; + } + } + echo ' + +
    KurzbzArt
    '.$recht.''.$rollen2Arr[$recht].'
    '.$recht.''.$art.'
      
    '; + } + echo ' +
    +
    +
    '; + } else { + echo '

    Rollen Übersicht

    '; $save = filter_input(INPUT_POST, 'save'); $edit = filter_input(INPUT_POST, 'edit'); @@ -209,11 +475,56 @@ $delete = filter_input(INPUT_GET, 'delete', FILTER_VALIDATE_BOOLEAN); { $berechtigung = new berechtigung(); if($berechtigung->deleteRolle($kurzbz)) - echo 'Rolle wurde entfernt'; + echo 'Die Rolle '.$kurzbz.' wurde erfolgreich gelöscht'; else echo 'Fehler beim Löschen:'.$berechtigung->errormsg; } + if(isset($copy)) + { + $kurzbz = filter_input(INPUT_POST, 'kurzbz'); + $copyName = filter_input(INPUT_POST, 'copy_name'); + $beschreibung = filter_input(INPUT_POST, 'beschreibung'); + + if(isset($kurzbz)) + { + $berechtigung = new berechtigung(); + $berechtigung->rolle_kurzbz = $copyName; + $berechtigung->beschreibung = $beschreibung; + $berechtigung->new = true; + + if($berechtigung->saveRolle()) + { + $rollenrechte = new berechtigung(); + $rollenrechte->getRolleBerechtigung($kurzbz); + foreach($rollenrechte->result as $rollenrecht) + { + $newRolleRecht = new berechtigung(); + $newRolleRecht->rolle_kurzbz = $copyName; + $newRolleRecht->berechtigung_kurzbz = $rollenrecht->berechtigung_kurzbz; + $newRolleRecht->art = $rollenrecht->art; + $newRolleRecht->anmerkung = $rollenrecht->anmerkung; + $newRolleRecht->insertamum = date('Y-m-d H:i:s'); + $newRolleRecht->insertvon = $user; + if(!$newRolleRecht->saveRolleBerechtigung()) + { + echo 'Fehler beim Speichern des Rechts '.$rollenrecht->berechtigung_kurzbz.' zur Rolle '.$rollenrecht->rolle_kurzbz; + break; + } + } + echo 'Rolle erfolgreich kopiert'; + } + else + { + echo 'Fehler beim kopieren der Rolle '.$kurzbz.':'.$berechtigung->errormsg; + } + } + else + { + echo 'Zum Speichern der Daten muss die kurzbz und die Beschreibung angegeben werden'; + } + } + if(isset($edit)) { $beschreibung = filter_input(INPUT_POST, 'beschreibung'); @@ -228,13 +539,18 @@ $delete = filter_input(INPUT_GET, 'delete', FILTER_VALIDATE_BOOLEAN); $berechtigung = new berechtigung(); $berechtigung->getRollen(); ?> -

    Rollen:

    +

    + + Rollen vergleichen + +

    + - + @@ -261,7 +577,18 @@ $delete = filter_input(INPUT_GET, 'delete', FILTER_VALIDATE_BOOLEAN); + @@ -270,24 +597,26 @@ $delete = filter_input(INPUT_GET, 'delete', FILTER_VALIDATE_BOOLEAN);
    Kurzbz BeschreibungAktionAktion
    - +
    + + + + +
    +
    + Rolle kopieren + +
    + Rolle löschen
    -
    +
    - Kurzbz: - Beschreibung: + Kurzbz: + Beschreibung: + beschreibung)) ?>  
    Neue Rolle anlegen
    - Kurzbz: - Beschreibung: + Kurzbz: + Beschreibung: + 256  
    - +
    diff --git a/vilesci/stammdaten/dokumentvorlagen_verwaltung.php b/vilesci/stammdaten/dokumentvorlagen_verwaltung.php index 7559fa43d..bce7ace56 100644 --- a/vilesci/stammdaten/dokumentvorlagen_verwaltung.php +++ b/vilesci/stammdaten/dokumentvorlagen_verwaltung.php @@ -112,7 +112,7 @@ echo '