diff --git a/application/config/navigation.php b/application/config/navigation.php index 11fd1a3a6..f7ba8dca3 100644 --- a/application/config/navigation.php +++ b/application/config/navigation.php @@ -336,3 +336,24 @@ $config['navigation_menu']['system/issues/Issues/*'] = array( 'requiredPermissions' => array('admin:rw') ), ); + +$config['navigation_menu']['apps'] = [ + 'stv' => [ + 'link' => site_url('studentenverwaltung'), + 'description' => 'Studierendenverwaltung', + #'icon' => 'users', + 'requiredPermissions' => array('admin:r', 'assistenz:r') + ], + 'lvv' => [ + 'link' => site_url('lVVerwaltung'), + 'description' => 'LV Verwaltung', + #'icon' => 'person-chalkboard', + 'requiredPermissions' => array('admin:r', 'assistenz:r') + ], + 'lav' => [ + 'link' => site_url('lehre/lehrauftrag/Lehrauftrag/Dashboard'), + 'description' => 'Lehraufträge', + #'icon' => 'person-chalkboard', + 'requiredPermissions' => array('lehre/lehrauftrag_bestellen:r', 'lehre/lehrauftrag_erteilen:r') + ] +]; diff --git a/application/config/routes.php b/application/config/routes.php index de8e6e098..eba6688ff 100644 --- a/application/config/routes.php +++ b/application/config/routes.php @@ -1,6 +1,6 @@ my_controller/my_method */ $route['default_controller'] = defined('CIS4') && CIS4 ? 'Cis4' : 'Vilesci'; -$route['translate_uri_dashes'] = FALSE; +$route['translate_uri_dashes'] = false; // Class name conflicts $route['api/v1/organisation/[S|s]tudiengang/(:any)'] = 'api/v1/organisation/studiengang2/$1'; @@ -71,9 +71,9 @@ $route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})'] = 'api/frontend/v1/stv // (studiensemester_kurzbz)/inout[/(incoming|outgoing|gemeinsamestudien)] $route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/inout'] = 'api/frontend/v1/stv/Students/index'; -$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/inout/incoming'] = 'api/frontend/v1/stv/Students/getIncoming'; -$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/inout/outgoing'] = 'api/frontend/v1/stv/Students/getOutgoing'; -$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/inout/gemeinsamestudien'] = 'api/frontend/v1/stv/Students/getGemeinsamestudien'; +$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/inout/incoming'] = 'api/frontend/v1/stv/Students/getIncoming/$1'; +$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/inout/outgoing'] = 'api/frontend/v1/stv/Students/getOutgoing/$1'; +$route['api/frontend/v1/stv/[sS]tudents/([WS]S[0-9]{4})/inout/gemeinsamestudien'] = 'api/frontend/v1/stv/Students/getGemeinsamestudien/$1'; // (studiengang_kz)/prestudent[/(studiensemester_kurzbz)[/(filter)[/(otherfilter)]]] $route['api/frontend/v1/stv/[sS]tudents/(-?[0-9]+)/prestudent'] = 'api/frontend/v1/stv/Students/getPrestudents/$1'; diff --git a/application/config/searchfunctions.php b/application/config/searchfunctions.php index 276652997..ddf7692d5 100644 --- a/application/config/searchfunctions.php +++ b/application/config/searchfunctions.php @@ -29,7 +29,7 @@ $config['similar'] = [ $config['vector'] = [ 'priority' => 1, - 'rank' => "ts_rank({field}, to_tsquery('simple', {word}))", - 'compare' => "to_tsquery('simple', {word}) @@ {field}" + 'rank' => "ts_rank({field}, plainto_tsquery('simple', {word}))", + 'compare' => "plainto_tsquery('simple', {word}) @@ {field}" ]; diff --git a/application/config/searchstv.php b/application/config/searchstv.php index 96c118ac8..d507f7250 100644 --- a/application/config/searchstv.php +++ b/application/config/searchstv.php @@ -7,5 +7,43 @@ $CI =& get_instance(); $config['student'] = $CI->config->item('student', 'search'); +$config['student']['searchfields']['pkz'] = [ + 'alias' => ['personenkennzeichen', 'personalid'], + 'comparison' => 'equals', + 'field' => 'matrikelnr' +]; +$config['student']['searchfields']['matrnr'] = [ + 'alias' => ['matrikelnr', 'matrikelnummer', 'matrno', 'matriculationno', 'matriculationnumber', 'studno', 'studentno', 'studentnumber'], + 'comparison' => 'equals', + 'field' => 'matr_nr', + 'join' => [ + [ + 'table' => "public.tbl_prestudent", + 'using' => "prestudent_id" + ], + [ + 'table' => "public.tbl_person", + 'using' => "person_id" + ] + ] +]; $config['prestudent'] = $CI->config->item('prestudent', 'search'); +$config['prestudent']['searchfields']['pkz'] = [ + 'alias' => ['personenkennzeichen', 'personalid'], + 'comparison' => 'equals', + 'field' => 'matrikelnr', + 'join' => [ + 'table' => "public.tbl_student", + 'using' => "prestudent_id" + ] +]; +$config['prestudent']['searchfields']['matrnr'] = [ + 'alias' => ['matrikelnr', 'matrikelnummer', 'matrno', 'matriculationno', 'matriculationnumber', 'studno', 'studentno', 'studentnumber'], + 'comparison' => 'equals', + 'field' => 'matr_nr', + 'join' => [ + 'table' => "public.tbl_person", + 'using' => "person_id" + ] +]; diff --git a/application/config/stv.php b/application/config/stv.php index 7e74c109f..84b148362 100644 --- a/application/config/stv.php +++ b/application/config/stv.php @@ -61,7 +61,11 @@ $config['tabs'] = 'notes' => [ //if true, the count of Messages will be shown in the header of the Tab Messages 'showCountNotes' => true - ] + ], + 'combinePeople' => [ + //multitab should only be shown with this length of selection + 'validCountMulti' => 2, + ], ]; // List of fields to show when ZGV_DOKTOR_ANZEIGEN is defined @@ -102,6 +106,7 @@ $config['student_tab_order'] = [ 'grades', 'exam', 'exemptions', + 'projektarbeit', 'finalexam', 'mobility', 'jointstudies', @@ -116,5 +121,6 @@ $config['students_tab_order'] = [ 'status', 'groups', 'finalexam', + 'combinePeople', 'archive', ]; diff --git a/application/controllers/Cis/Documents.php b/application/controllers/Cis/Documents.php index c5a6684d3..0b8d08a56 100644 --- a/application/controllers/Cis/Documents.php +++ b/application/controllers/Cis/Documents.php @@ -72,7 +72,7 @@ class Documents extends Auth_Controller $stgs = []; $stsemArray = []; - $buchungstypen = implode('\',\'', defined("CIS_DOKUMENTE_STUDIENBEITRAG_TYPEN") ? unserialize(CIS_DOKUMENTE_STUDIENBEITRAG_TYPEN) : []); + $buchungstypen = defined("CIS_DOKUMENTE_STUDIENBEITRAG_TYPEN") ? unserialize(CIS_DOKUMENTE_STUDIENBEITRAG_TYPEN) : []; $person_ids = []; foreach ($stati as $status) { $person_ids[] = $status->person_id; diff --git a/application/controllers/Cis/ProfilUpdate.php b/application/controllers/Cis/ProfilUpdate.php index 74641d748..698b091d1 100644 --- a/application/controllers/Cis/ProfilUpdate.php +++ b/application/controllers/Cis/ProfilUpdate.php @@ -13,7 +13,7 @@ class ProfilUpdate extends Auth_Controller { parent::__construct([ 'index' => ['student/stammdaten:r', 'mitarbeiter/stammdaten:r'], - 'show' => ['basis/cis:r'], + 'show' => ['student/stammdaten:r', 'mitarbeiter/stammdaten:r', 'basis/cis:r'], 'id' => ['student/stammdaten:r', 'mitarbeiter/stammdaten:r'] ]); diff --git a/application/controllers/Cis/Pub.php b/application/controllers/Cis/Pub.php index bebc844ab..de456145b 100644 --- a/application/controllers/Cis/Pub.php +++ b/application/controllers/Cis/Pub.php @@ -14,7 +14,7 @@ class Pub extends Auth_Controller { parent::__construct( array( - 'bild' => ['basis/cis:r'] + 'bild' => ['basis/cis:r', 'assistenz:r'] ) ); } diff --git a/application/controllers/api/frontend/v1/Lehrveranstaltung.php b/application/controllers/api/frontend/v1/Lehrveranstaltung.php index 2e254bfc8..935602391 100644 --- a/application/controllers/api/frontend/v1/Lehrveranstaltung.php +++ b/application/controllers/api/frontend/v1/Lehrveranstaltung.php @@ -119,7 +119,19 @@ class Lehrveranstaltung extends FHCAPI_Controller if (hasData($lehreinheiten_data)) { $lehreinheiten = getData($lehreinheiten_data); - $rowData->_children = $lehreinheiten; + + if (!isset($row->_children)) + { + $row->_children = $lehreinheiten; + } + else + { + if (!is_array($row->_children)) + { + $row->_children = [$row->_children]; + } + $row->_children = array_merge($row->_children, $lehreinheiten); + } } if (!isEmptyString($row->studienplan_lehrveranstaltung_id_parent)) diff --git a/application/controllers/api/frontend/v1/ProfilUpdate.php b/application/controllers/api/frontend/v1/ProfilUpdate.php index bbfed651c..f97546288 100644 --- a/application/controllers/api/frontend/v1/ProfilUpdate.php +++ b/application/controllers/api/frontend/v1/ProfilUpdate.php @@ -637,7 +637,7 @@ class ProfilUpdate extends FHCAPI_Controller //? Send email to the Studiengangsassistentinnen $this->StudentModel->addSelect(["public.tbl_studiengang.email"]); $this->StudentModel->addJoin("public.tbl_benutzer", "public.tbl_benutzer.uid = public.tbl_student.student_uid"); - $this->StudentModel->addJoin("public.tbl_prestudent", "public.tbl_benutzer.person_id = public.tbl_prestudent.person_id"); + $this->StudentModel->addJoin("public.tbl_prestudent", "public.tbl_benutzer.person_id = public.tbl_prestudent.person_id and public.tbl_student.studiengang_kz = public.tbl_prestudent.studiengang_kz"); $this->StudentModel->addJoin("public.tbl_prestudentstatus", "public.tbl_prestudentstatus.prestudent_id = public.tbl_prestudent.prestudent_id"); $this->StudentModel->addJoin("public.tbl_studiengang", "public.tbl_studiengang.studiengang_kz = public.tbl_prestudent.studiengang_kz"); $this->StudentModel->addGroupBy(["public.tbl_studiengang.email"]); @@ -706,7 +706,13 @@ class ProfilUpdate extends FHCAPI_Controller private function setStatusOnUpdateRequest($id, $status, $status_message) { - return $this->ProfilUpdateModel->update([$id], ["status" => $status, "status_timestamp" => "NOW()", "status_message" => $status_message]); + return $this->ProfilUpdateModel->update([$id], [ + "status" => $status, + "status_timestamp" => "NOW()", + "status_message" => $status_message, + "updateamum" => "NOW()", + "updatevon" => getAuthUID() + ]); } private function updateRequestedChange($id, $requested_change) @@ -716,13 +722,12 @@ class ProfilUpdate extends FHCAPI_Controller private function deleteOldVersionFile($dms_id) { + if (!isset($dms_id)) { + return true; + } + // starting the transaction $this->db->trans_start(); - - - if (!isset($dms_id)) { - return; - } //? delete the file from the profilUpdate first $profilUpdateFileDelete = $this->ProfilUpdateModel->removeFileFromProfilUpdate($dms_id); @@ -777,13 +782,8 @@ class ProfilUpdate extends FHCAPI_Controller $res = $this->StudentModel->execReadOnlyQuery($query, [$student_uid]); $res = $this->getDataOrTerminateWithError($res, $this->p->t('profilUpdate', 'profilUpdate_loadingOE_error')); - $res = array_map( - function ($item) { - return $item->oe_kurzbz; - }, - $res - ); - return $res; + $oe = ($res[0])->oe_kurzbz; + return $oe; } private function handleAdresse($requested_change, $personID) @@ -813,7 +813,7 @@ class ProfilUpdate extends FHCAPI_Controller $insert_adresse_id = $insertID; $insert_adresse_id = $this->getDataOrTerminateWithError($insert_adresse_id, $this->p->t('profilUpdate', 'profilUpdate_insertAdresse_error')); if ($insert_adresse_id) { - $this->handleDupplicateZustellAdressen($requested_change['zustelladresse'], $insert_adresse_id); + $this->handleDupplicateZustellAdressen($requested_change['zustelladresse'], $insert_adresse_id, $personID); } } //! DELETE @@ -825,12 +825,33 @@ class ProfilUpdate extends FHCAPI_Controller } //! UPDATE else { - $requested_change['updateamum'] = "NOW()"; - $requested_change['updatevon'] = getAuthUID(); - $update_adresse_id = $this->AdresseModel->update($adresse_id, $requested_change); - $update_adresse_id = $this->getDataOrTerminateWithError($update_adresse_id, $this->p->t('profilUpdate', 'profilUpdate_updateAdresse_error')); - $this->handleDupplicateZustellAdressen($requested_change['zustelladresse'], $update_adresse_id); + $curadresse_res = $this->AdresseModel->load($adresse_id); + $curadresse = ($this->getDataOrTerminateWithError($curadresse_res))[0]; + if($curadresse->heimatadresse) + { + $tmpadresse = array_merge((array) $curadresse, $requested_change); + unset($tmpadresse["adresse_id"]); + $tmpadresse['insertamum'] = "NOW()"; + $tmpadresse['insertvon'] = getAuthUID(); + $tmpadresse['person_id'] = $personID; + unset($tmpadresse["heimatadresse"]); + unset($tmpadresse["updateamum"]); + unset($tmpadresse["updatevon"]); + + $tmpadresse_res = $this->AdresseModel->insert($tmpadresse); + $tmpadresse_id = $this->getDataOrTerminateWithError($tmpadresse_res, $this->p->t('profilUpdate', 'profilUpdate_insertAdresse_error')); + $this->handleDupplicateZustellAdressen($requested_change['zustelladresse'], $tmpadresse_id, $personID); + } + else + { + $requested_change['updateamum'] = "NOW()"; + $requested_change['updatevon'] = getAuthUID(); + + $update_adresse_id = $this->AdresseModel->update($adresse_id, $requested_change); + $update_adresse_id = $this->getDataOrTerminateWithError($update_adresse_id, $this->p->t('profilUpdate', 'profilUpdate_updateAdresse_error')); + $this->handleDupplicateZustellAdressen($requested_change['zustelladresse'], $update_adresse_id, $personID); + } } return $insertID ?? null; } @@ -852,7 +873,7 @@ class ProfilUpdate extends FHCAPI_Controller $insert_kontakt_id = $insertID; $insert_kontakt_id = $this->getDataOrTerminateWithError($insert_kontakt_id, $this->p->t('profilUpdate', 'profilUpdate_insertKontakt_error')); if ($insert_kontakt_id) { - $this->handleDupplicateZustellKontakte($requested_change['zustellung'], $insert_kontakt_id); + $this->handleDupplicateZustellKontakte($requested_change['zustellung'], $insert_kontakt_id, $requested_change['kontakttyp'], $personID); } } //! DELETE @@ -869,18 +890,18 @@ class ProfilUpdate extends FHCAPI_Controller $update_kontakt_id = $this->KontaktModel->update($kontakt_id, $requested_change); $update_kontakt_id = $this->getDataOrTerminateWithError($update_kontakt_id, $this->p->t('profilUpdate', 'profilUpdate_updateKontakt_error')); if ($update_kontakt_id) { - $this->handleDupplicateZustellKontakte($requested_change['zustellung'], $update_kontakt_id); + $this->handleDupplicateZustellKontakte($requested_change['zustellung'], $update_kontakt_id, $requested_change['kontakttyp'], $personID); } } return isset($insertID) ? $insertID : null; } - private function handleDupplicateZustellAdressen($zustellung, $adresse_id) + private function handleDupplicateZustellAdressen($zustellung, $adresse_id, $person_id) { if ($zustellung) { $this->PersonModel->addSelect("public.tbl_adresse.adresse_id"); $this->PersonModel->addJoin("public.tbl_adresse", "public.tbl_adresse.person_id = public.tbl_person.person_id"); - $zustellAdressenArray = $this->PersonModel->loadWhere(["public.tbl_person.person_id" => $this->pid, "zustelladresse" => TRUE]); + $zustellAdressenArray = $this->PersonModel->loadWhere(["public.tbl_person.person_id" => $person_id, "zustelladresse" => TRUE]); if (isError($zustellAdressenArray)) { $this->terminateWithError($this->p->t('profilUpdate', 'profilUpdate_loadingZustellAdressen_error')); } @@ -893,6 +914,8 @@ class ProfilUpdate extends FHCAPI_Controller return $adresse->adresse_id != $adresse_id; }); + $this->addMeta('bhzustelladressen', $zustellAdressenArray); + // remove the zustelladresse from all other zustelladressen foreach ($zustellAdressenArray as $adresse) { $this->AdresseModel->update($adresse->adresse_id, ["zustelladresse" => FALSE]); @@ -902,12 +925,16 @@ class ProfilUpdate extends FHCAPI_Controller } } - private function handleDupplicateZustellKontakte($zustellung, $kontakt_id) + private function handleDupplicateZustellKontakte($zustellung, $kontakt_id, $kontakttyp, $person_id) { if ($zustellung) { $this->PersonModel->addSelect("public.tbl_kontakt.kontakt_id"); $this->PersonModel->addJoin("public.tbl_kontakt", "public.tbl_kontakt.person_id = public.tbl_person.person_id"); - $zustellKontakteArray = $this->PersonModel->loadWhere(["public.tbl_person.person_id" => $this->pid, "zustellung" => TRUE]); + $zustellKontakteArray = $this->PersonModel->loadWhere([ + "public.tbl_person.person_id" => $person_id, + "zustellung" => TRUE, + "kontakttyp" => $kontakttyp + ]); if (!isSuccess($zustellKontakteArray)) { return error($this->p->t('profilUpdate', 'profilUpdate_loadingZustellkontakte_error')); } diff --git a/application/controllers/api/frontend/v1/lv/Gruppe.php b/application/controllers/api/frontend/v1/lv/Gruppe.php index 83a4fb696..daebe8a61 100644 --- a/application/controllers/api/frontend/v1/lv/Gruppe.php +++ b/application/controllers/api/frontend/v1/lv/Gruppe.php @@ -12,8 +12,8 @@ class Gruppe extends FHCAPI_Controller 'add' => ['admin:rw', 'assistenz:rw'], 'delete' => ['admin:rw', 'assistenz:rw'], 'deleteFromLVPlan' => ['admin:rw', 'assistenz:rw'], - 'getBenutzer' => ['admin:r', 'assistenz:r'], - 'getAll' => ['admin:r', 'assistenz:r'], + 'getBenutzerSearch' => ['admin:r', 'assistenz:r'], + 'getAllSearch' => ['admin:r', 'assistenz:r'], 'getByLehreinheit' => ['admin:r', 'assistenz:r'], ]); @@ -22,7 +22,8 @@ class Gruppe extends FHCAPI_Controller $this->_ci->load->library('PhrasesLib'); $this->loadPhrases( array( - 'ui' + 'ui', + 'lehre' ) ); @@ -91,11 +92,11 @@ class Gruppe extends FHCAPI_Controller $lehreinheitgruppe_id = $this->input->post('lehreinheitgruppe_id'); if (is_null($lehreinheit_id) || !ctype_digit((string)$lehreinheit_id) || is_null($lehreinheitgruppe_id) || !ctype_digit((string)$lehreinheitgruppe_id)) - $this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); + $this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); $lehreinheitgruppe_result = $this->_ci->LehreinheitgruppeModel->loadWhere(array('lehreinheitgruppe_id' => $lehreinheitgruppe_id)); if (!hasData($lehreinheitgruppe_result) || isError($lehreinheitgruppe_result)) - $this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); + $this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); $this->checkPermission($lehreinheit_id); @@ -108,15 +109,33 @@ class Gruppe extends FHCAPI_Controller } - public function getAll() + public function getAllSearch() { + $query = $this->input->get('query'); + + if (is_null($query)) + $this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); + + $query_words = explode(' ', $query); + $this->_ci->GruppeModel->addSelect('gruppe_kurzbz, studiengang_kz, semester, bezeichnung, gid, \'false\' as lehrverband'); - $gruppen_result = $this->_ci->GruppeModel->loadWhere(array('sichtbar' => true, 'aktiv' => true, 'lehre' => true, 'direktinskription' => false, 'semester IS NOT NULL' => null)); + $this->_ci->GruppeModel->db->where(array('sichtbar' => true, 'aktiv' => true, 'lehre' => true, 'direktinskription' => false, 'semester IS NOT NULL' => null)); + $this->_ci->GruppeModel->db->group_start(); + foreach ($query_words as $word) + { + $this->_ci->GruppeModel->db->group_start(); + $this->_ci->GruppeModel->db->where('gruppe_kurzbz ILIKE', "%" . $word . "%"); + $this->_ci->GruppeModel->db->or_where('bezeichnung ILIKE', "%" . $word . "%"); + $this->_ci->GruppeModel->db->group_end(); + } + $this->_ci->GruppeModel->db->group_end(); + + $gruppen_result = $this->_ci->GruppeModel->load(); $gruppen_array = array(); @@ -135,7 +154,18 @@ class Gruppe extends FHCAPI_Controller $this->_ci->LehrverbandModel->addJoin('public.tbl_studiengang', 'studiengang_kz'); $this->_ci->LehrverbandModel->addOrder('verband'); $this->_ci->LehrverbandModel->addOrder('gruppe'); - $lehrverband_result = $this->_ci->LehrverbandModel->loadWhere(array('tbl_lehrverband.aktiv' => true)); + $this->_ci->LehrverbandModel->db->where(array('tbl_lehrverband.aktiv' => true)); + + $this->_ci->LehrverbandModel->db->group_start(); + foreach ($query_words as $word) + { + $this->_ci->LehrverbandModel->db->group_start(); + $this->_ci->LehrverbandModel->db->where('CONCAT(CONCAT(typ, kurzbz), \'\', semester, verband, COALESCE(gruppe,\'\')) ILIKE', "%" . $word . "%"); + $this->_ci->LehrverbandModel->db->or_where('tbl_lehrverband.bezeichnung ILIKE', "%" . $word . "%"); + $this->_ci->LehrverbandModel->db->group_end(); + } + $this->_ci->LehrverbandModel->db->group_end(); + $lehrverband_result = $this->_ci->LehrverbandModel->load(); $lehrverband_array = array(); @@ -150,15 +180,40 @@ class Gruppe extends FHCAPI_Controller $this->terminateWithSuccess($all_gruppen); } - public function getBenutzer() + public function getBenutzerSearch() { + $query = $this->input->get('query'); + + if (is_null($query)) + $this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); + + $query_words = explode(' ', $query); + $this->_ci->PersonModel->addSelect('vorname, nachname, uid, semester, UPPER(CONCAT(tbl_studiengang.typ, tbl_studiengang.kurzbz)) as studiengang'); $this->_ci->PersonModel->addJoin('public.tbl_benutzer', 'person_id'); $this->_ci->PersonModel->addJoin('public.tbl_mitarbeiter', 'uid = mitarbeiter_uid', 'LEFT'); $this->_ci->PersonModel->addJoin('public.tbl_student', 'uid = student_uid', 'LEFT'); $this->_ci->PersonModel->addJoin('public.tbl_studiengang', 'studiengang_kz', 'LEFT'); - $personen = $this->_ci->PersonModel->loadWhere(array('tbl_benutzer.aktiv' => true)); + $this->_ci->PersonModel->db->where(array('tbl_benutzer.aktiv' => true)); + + $this->_ci->PersonModel->db->group_start(); + foreach ($query_words as $word) + { + $this->_ci->PersonModel->db->group_start(); + $this->_ci->PersonModel->db->where('tbl_person.vorname ILIKE', "%" . $word . "%"); + $this->_ci->PersonModel->db->or_where('tbl_person.nachname ILIKE', "%" . $word . "%"); + $this->_ci->PersonModel->db->or_where('uid ILIKE', "%" . $word . "%"); + $this->_ci->PersonModel->db->or_where('CONCAT(tbl_studiengang.typ, tbl_studiengang.kurzbz) ILIKE', "%" . $word . "%"); + + if (is_numeric($word)) + { + $this->_ci->PersonModel->db->or_where('semester', $word); + } + $this->_ci->PersonModel->db->group_end(); + } + $this->_ci->PersonModel->db->group_end(); + $personen = $this->_ci->PersonModel->load(); $this->terminateWithSuccess(hasData($personen) ? getData($personen) : array()); } diff --git a/application/controllers/api/frontend/v1/lv/Lehreinheit.php b/application/controllers/api/frontend/v1/lv/Lehreinheit.php index 958007901..6329d30ac 100644 --- a/application/controllers/api/frontend/v1/lv/Lehreinheit.php +++ b/application/controllers/api/frontend/v1/lv/Lehreinheit.php @@ -169,6 +169,10 @@ class Lehreinheit extends FHCAPI_Controller { $value = $this->input->post($field); + if ($field === 'lehre') + { + $value = (bool)$value; + } if ($value !== null) { $updateData[$field] = $value; @@ -281,15 +285,43 @@ class Lehreinheit extends FHCAPI_Controller public function delete() { $lehreinheit_id = $this->input->post('lehreinheit_id'); - $lehreinheit = $this->checkLehreinheit($lehreinheit_id); - $this->checkPermission($lehreinheit->lehreinheit_id); - $result = $this->_ci->LehreinheitModel->deleteLehreinheit($lehreinheit->lehreinheit_id); + $errors = array(); + if (is_array($lehreinheit_id)) + { + foreach ($lehreinheit_id as $le_id) + { + $lehreinheit = $this->checkLehreinheit($le_id); + $this->checkPermission($lehreinheit->lehreinheit_id); - if (isError($result)) - $this->terminateWithValidationErrors(getError($result)); + $result = $this->_ci->LehreinheitModel->deleteLehreinheit($lehreinheit->lehreinheit_id); - $this->terminateWithSuccess('Erfolgreich geloescht'); + if (isError($result)) + { + $errors[] = getError($result); + } + } + } + else + { + $lehreinheit = $this->checkLehreinheit($lehreinheit_id); + $this->checkPermission($lehreinheit->lehreinheit_id); + + $result = $this->_ci->LehreinheitModel->deleteLehreinheit($lehreinheit->lehreinheit_id); + + if (isError($result)) + $this->terminateWithError(getError($result)); + } + + if (!isEmptyArray($errors)) + { + if (count($errors) !== count($lehreinheit_id)) + $this->terminateWithSuccess(array('errors' => $errors)); + else + $this->terminateWithError($errors); + } + else + $this->terminateWithSuccess('Erfolgreich geloescht'); } public function update() diff --git a/application/controllers/api/frontend/v1/lv/Lektor.php b/application/controllers/api/frontend/v1/lv/Lektor.php index 68bec1bc4..cce7f6e8b 100644 --- a/application/controllers/api/frontend/v1/lv/Lektor.php +++ b/application/controllers/api/frontend/v1/lv/Lektor.php @@ -15,7 +15,7 @@ class Lektor extends FHCAPI_Controller 'deleteLVPlan' => ['admin:rw', 'assistenz:rw'], 'deletePerson' => ['admin:rw', 'assistenz:rw'], 'getLehrfunktionen' => ['admin:r', 'assistenz:r'], - 'getLektoren' => ['admin:r', 'assistenz:r'], + 'getLektorenSearch' => ['admin:r', 'assistenz:r'], 'getLektorenByLE' => ['admin:r', 'assistenz:r'], 'getLektorDaten' => ['admin:r', 'assistenz:r'], 'getLektorVertrag' => ['admin:r', 'assistenz:r'], @@ -208,12 +208,35 @@ class Lektor extends FHCAPI_Controller $this->terminateWithSuccess(getData($this->_ci->LehrfunktionModel->load())); } - public function getLektoren() + public function getLektorenSearch() { + $query = $this->input->get('query'); + + if (is_null($query)) + $this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL); + + $query_words = explode(' ', $query); + $this->_ci->MitarbeiterModel->addSelect('uid, person_id, vorname, nachname'); $this->_ci->MitarbeiterModel->addJoin('public.tbl_benutzer', 'uid = mitarbeiter_uid'); $this->_ci->MitarbeiterModel->addJoin('public.tbl_person', 'person_id'); - $this->terminateWithSuccess(getData($this->_ci->MitarbeiterModel->loadWhere(array('public.tbl_benutzer.aktiv' => true)))); + + $this->_ci->MitarbeiterModel->db->where('public.tbl_benutzer.aktiv', true); + + $this->_ci->MitarbeiterModel->db->group_start(); + foreach ($query_words as $word) + { + $this->_ci->MitarbeiterModel->db->group_start(); + $this->_ci->MitarbeiterModel->db->where('tbl_person.vorname ILIKE', "%" . $word . "%"); + $this->_ci->MitarbeiterModel->db->or_where('tbl_person.nachname ILIKE', "%" . $word . "%"); + $this->_ci->MitarbeiterModel->db->or_where('uid ILIKE', "%" . $word . "%"); + $this->_ci->MitarbeiterModel->db->group_end(); + } + $this->_ci->MitarbeiterModel->db->group_end(); + $this->_ci->MitarbeiterModel->addOrder('nachname'); + $this->_ci->MitarbeiterModel->addOrder('vorname'); + $result = $this->_ci->MitarbeiterModel->load(); + $this->terminateWithSuccess(hasData($result) ? getData($result) : array()); } private function checkLehreinheit($lehreinheit_id) diff --git a/application/controllers/api/frontend/v1/lv/Tags.php b/application/controllers/api/frontend/v1/lv/Tags.php index a22a4c82e..34c42bc32 100644 --- a/application/controllers/api/frontend/v1/lv/Tags.php +++ b/application/controllers/api/frontend/v1/lv/Tags.php @@ -5,7 +5,7 @@ if (!defined('BASEPATH')) class Tags extends Tag_Controller { - const BERECHTIGUNG_KURZBZ = ['admin:rw', 'assistenz:rw']; + const BERECHTIGUNG_KURZBZ = ['admin:rw', 'assistenz:r']; public function __construct() { diff --git a/application/controllers/api/frontend/v1/messages/Messages.php b/application/controllers/api/frontend/v1/messages/Messages.php index fa6748f6a..355fe79a4 100644 --- a/application/controllers/api/frontend/v1/messages/Messages.php +++ b/application/controllers/api/frontend/v1/messages/Messages.php @@ -16,7 +16,7 @@ class Messages extends FHCAPI_Controller 'getNameOfDefaultRecipient' => ['admin:r', 'assistenz:r'], 'sendMessage' => ['admin:r', 'assistenz:r'], 'deleteMessage' => ['admin:r', 'assistenz:r'], - 'getVorlagentext' => ['admin:r', 'assistenz:r'], + 'getDataVorlage' => ['admin:r', 'assistenz:r'], 'getPreviewText' => ['admin:r', 'assistenz:r'], 'getReplyData' => ['admin:r', 'assistenz:r'], 'getPersonId' => ['admin:r', 'assistenz:r'], @@ -52,11 +52,14 @@ class Messages extends FHCAPI_Controller $result = $this->MessageModel->getMessagesForTable($id, $offset, $limit); - $data = $this->getDataOrTerminateWithError($result); + if (hasData($result)) + { + $data = getData($result); + $this->addMeta('count', $data['count']); + $this->terminateWithSuccess($data['data']); + } - $this->addMeta('count', $data['count']); - - $this->terminateWithSuccess($data['data']); + $this->terminateWithSuccess(array()); } public function getVorlagen() @@ -66,33 +69,23 @@ class Messages extends FHCAPI_Controller $this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel'); $result = $this->BenutzerfunktionModel->getBenutzerfunktionByUid($uid, 'oezuordnung'); - $data = $this->getDataOrTerminateWithError($result); - $oe_kurzbz = current($data); + if (hasData($result)) + { + $this->load->model('system/Vorlage_model', 'VorlageModel'); - $this->load->model('system/Vorlage_model', 'VorlageModel'); + $data = getData($result); - $result = $this->VorlageModel->getAllVorlagenByOe($oe_kurzbz->oe_kurzbz); - $data = $this->getDataOrTerminateWithError($result); + $oe_kurzbz = array_column($data, 'oe_kurzbz'); + $result = $this->VorlageModel->getAllVorlagenByOe($oe_kurzbz); - $this->terminateWithSuccess($data); + $this->terminateWithSuccess(hasData($result) ? getData($result) : array()); + } - //If admin - $this->VorlageModel->addOrder('vorlage_kurzbz', 'ASC'); - $result = $this->VorlageModel->loadWhere( - array( - 'mimetype' => 'text/html' - )); - - - $data = $this->getDataOrTerminateWithError($result); - - $this->terminateWithSuccess($data); + $this->terminateWithSuccess(array()); } - public function getVorlagentext($vorlage_kurzbz) + public function getDataVorlage($vorlage_kurzbz) { - //$this->terminateWithError("vor " . $vorlage_kurzbz, self::ERROR_TYPE_GENERAL); - //$studiengang_kz = 227; //TODO(Manu) dynamisieren NULL $studiengang_kz = 0; $this->load->model('system/Vorlagestudiengang_model', 'VorlagestudiengangModel'); $this->VorlagestudiengangModel->addOrder('version', 'DESC'); @@ -104,12 +97,8 @@ class Messages extends FHCAPI_Controller ]); $data = $this->getDataOrTerminateWithError($result); - - //not correct with Vorlage $vorlage = current($data); - - //$this->terminateWithSuccess($data); - $this->terminateWithSuccess($vorlage->text); + $this->terminateWithSuccess($vorlage); } public function getMessageVarsPerson($id, $typeId) @@ -154,7 +143,7 @@ class Messages extends FHCAPI_Controller public function sendMessage($recipient_id) { //has to be uid - // $this->terminateWithError("uid", $recipient_id, self::ERROR_TYPE_GENERAL); + // $this->terminateWithError("uid", $recipient_id, self::ERROR_TYPE_GENERAL); //default setting $receiversPersonId = $this->_getPersonId($recipient_id, 'uid'); @@ -223,8 +212,6 @@ class Messages extends FHCAPI_Controller } elseif($typeId == 'prestudent_id') { - // $this->terminateWithError("prestudent_id ", self::ERROR_TYPE_GENERAL); - $result = $this->MessagesModel->parseMessageTextPrestudent($id, $body); $bodyParsed = $this->getDataOrTerminateWithError($result); } @@ -429,7 +416,7 @@ class Messages extends FHCAPI_Controller private function _getPrestudentIdFromUid($uid) { - // $this->terminateWithError($uid, self::ERROR_TYPE_GENERAL); + // $this->terminateWithError($uid, self::ERROR_TYPE_GENERAL); $this->load->model('crm/Student_model', 'StudentModel'); $result = $this->StudentModel->loadWhere( ['student_uid' => $uid] @@ -463,4 +450,4 @@ class Messages extends FHCAPI_Controller date_format(date_create($sentDate), 'd.m.Y H:i'), $receiverName, $receiverSurname, $body ); } -} \ No newline at end of file +} diff --git a/application/controllers/api/frontend/v1/stv/Abschlusspruefung.php b/application/controllers/api/frontend/v1/stv/Abschlusspruefung.php index d8bc067f9..def4f6502 100644 --- a/application/controllers/api/frontend/v1/stv/Abschlusspruefung.php +++ b/application/controllers/api/frontend/v1/stv/Abschlusspruefung.php @@ -20,8 +20,6 @@ class Abschlusspruefung extends FHCAPI_Controller 'getBeurteilungen' => ['admin:rw', 'assistenz:rw'], 'getAkadGrade' => ['admin:rw', 'assistenz:rw'], 'getMitarbeiter' => ['admin:rw', 'assistenz:rw'], - 'getAllMitarbeiter' => ['admin:rw', 'assistenz:rw'], - 'getAllPersons' => ['admin:rw', 'assistenz:rw'], 'getPruefer' => ['admin:rw', 'assistenz:rw'], 'getTypStudiengang' => ['admin:rw', 'assistenz:rw'], 'checkForExistingExams' => ['admin:rw', 'assistenz:rw'], @@ -102,35 +100,45 @@ class Abschlusspruefung extends FHCAPI_Controller { $abschlusspruefung_id = $this->input->post('id'); - $this->AbschlusspruefungModel->addSelect('lehre.tbl_abschlusspruefung.*'); - $this->AbschlusspruefungModel->addSelect(" - CASE - WHEN pruefer1 IS NOT NULL - THEN CONCAT(p1.nachname, ' ', p1.vorname, COALESCE(' ' || p1.titelpre, '')) - ELSE NULL - END AS p1 - "); - $this->AbschlusspruefungModel->addSelect(" - CASE - WHEN pruefer2 IS NOT NULL - THEN CONCAT(p2.nachname, ' ', p2.vorname, COALESCE(' ' || p2.titelpre, '')) - ELSE NULL - END AS p2 - "); - $this->AbschlusspruefungModel->addSelect(" - CASE - WHEN pruefer3 IS NOT NULL - THEN CONCAT(p3.nachname, ' ', p3.vorname, COALESCE(' ' || p3.titelpre, '')) - ELSE NULL - END AS p3 - "); - $this->AbschlusspruefungModel->addSelect(" - CASE - WHEN vorsitz IS NOT NULL - THEN CONCAT(pv.nachname, ' ', pv.vorname, COALESCE(' ' || pv.titelpre, ''), ' (', ben.uid , ')' ) - ELSE NULL - END AS pv - "); + $this->AbschlusspruefungModel->addSelect( + 'lehre.tbl_abschlusspruefung.*, + p1.person_id AS p1_person_id, p1.vorname AS p1_vorname, p1.nachname AS p1_nachname, + p1.titelpre AS p1_titelpre, p1.titelpost AS p1_titelpost, + p2.person_id AS p2_person_id, p2.vorname AS p2_vorname, p2.nachname AS p2_nachname, + p2.titelpre AS p2_titelpre, p2.titelpost AS p2_titelpost, + p3.person_id AS p3_person_id, p3.vorname AS p3_vorname, p3.nachname AS p3_nachname, + p3.titelpre AS p3_titelpre, p3.titelpost AS p3_titelpost, + pv.person_id AS pv_person_id, pv.vorname AS pv_vorname, pv.nachname AS pv_nachname, + pv.titelpre AS pv_titelpre, pv.titelpost AS pv_titelpost, ben.uid AS pv_uid' + ); + //~ $this->AbschlusspruefungModel->addSelect(" + //~ CASE + //~ WHEN pruefer1 IS NOT NULL + //~ THEN CONCAT(p1.nachname, ' ', p1.vorname, COALESCE(' ' || p1.titelpre, '')) + //~ ELSE NULL + //~ END AS p1 + //~ "); + //~ $this->AbschlusspruefungModel->addSelect(" + //~ CASE + //~ WHEN pruefer2 IS NOT NULL + //~ THEN CONCAT(p2.nachname, ' ', p2.vorname, COALESCE(' ' || p2.titelpre, '')) + //~ ELSE NULL + //~ END AS p2 + //~ "); + //~ $this->AbschlusspruefungModel->addSelect(" + //~ CASE + //~ WHEN pruefer3 IS NOT NULL + //~ THEN CONCAT(p3.nachname, ' ', p3.vorname, COALESCE(' ' || p3.titelpre, '')) + //~ ELSE NULL + //~ END AS p3 + //~ "); + //~ $this->AbschlusspruefungModel->addSelect(" + //~ CASE + //~ WHEN vorsitz IS NOT NULL + //~ THEN CONCAT(pv.nachname, ' ', pv.vorname, COALESCE(' ' || pv.titelpre, ''), ' (', ben.uid , ')' ) + //~ ELSE NULL + //~ END AS pv + //~ "); $this->AbschlusspruefungModel->addJoin('public.tbl_benutzer ben', 'ON (ben.uid = lehre.tbl_abschlusspruefung.vorsitz)', 'LEFT'); $this->AbschlusspruefungModel->addJoin('public.tbl_person pv', 'ON (pv.person_id = ben.person_id)', 'LEFT'); $this->AbschlusspruefungModel->addJoin('public.tbl_person p1', 'ON (p1.person_id = lehre.tbl_abschlusspruefung.pruefer1)', 'LEFT'); @@ -220,8 +228,10 @@ class Abschlusspruefung extends FHCAPI_Controller $this->terminateWithSuccess($typStudiengang); } - public function getMitarbeiter($searchString) + public function getMitarbeiter() { + $searchString = $this->input->get('searchString') ?? ''; + $this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel'); $result = $this->MitarbeiterModel->searchMitarbeiter($searchString, 'mitAkadGrad'); @@ -232,8 +242,10 @@ class Abschlusspruefung extends FHCAPI_Controller $this->terminateWithSuccess($result ?: []); } - public function getPruefer($searchString) + public function getPruefer() { + $searchString = $this->input->get('searchString') ?? ''; + $this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel'); $result = $this->MitarbeiterModel->searchMitarbeiter($searchString, 'ohneMaUid'); @@ -444,58 +456,4 @@ class Abschlusspruefung extends FHCAPI_Controller } $this->terminateWithSuccess('step3'); } - - /* - * returns list of all Mitarbeiter - * as key value list to be used in select or autocomplete - */ - public function getAllMitarbeiter() - { - $this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel'); - - $sql = " - SELECT - ma.mitarbeiter_uid as mitarbeiter_uid, - CONCAT(p.nachname, ' ', p.vorname, ' (', ma.mitarbeiter_uid, ')') as label - FROM - public.tbl_mitarbeiter ma - JOIN public.tbl_benutzer bn ON (bn.uid = ma.mitarbeiter_uid) - JOIN public.tbl_person p ON (p.person_id = bn.person_id) - ORDER BY - p.nachname ASC - "; - - $result = $this->MitarbeiterModel->execReadOnlyQuery($sql); - $data = $this->getDataOrTerminateWithError($result); - - $this->terminateWithSuccess($data); - } - - /* - * returns list of all Persons - * as key value list to be used in select or autocomplete - */ - public function getAllPersons() - { - $this->load->model('person/Person_model', 'PersonModel'); - - $sql = " - SELECT - p.vorname, p.nachname, p.person_id, - CONCAT(p.nachname, ' ', p.vorname) as label - FROM - public.tbl_person p - -- JOIN public.tbl_benutzer bn ON (p.person_id = bn.person_id) - -- and bn.aktiv = 'true' - ORDER BY - p.nachname ASC - "; - - //TODO(manu) check if filter active benutzer - - $result = $this->PersonModel->execReadOnlyQuery($sql); - $data = $this->getDataOrTerminateWithError($result); - - $this->terminateWithSuccess($data); - } } diff --git a/application/controllers/api/frontend/v1/stv/Archiv.php b/application/controllers/api/frontend/v1/stv/Archiv.php index 55f4270d6..6b8388fbb 100644 --- a/application/controllers/api/frontend/v1/stv/Archiv.php +++ b/application/controllers/api/frontend/v1/stv/Archiv.php @@ -39,7 +39,7 @@ class Archiv extends FHCAPI_Controller 'archive' => ['admin:w', 'assistenz:w'], 'download' => ['admin:w', 'assistenz:w'], 'update' => ['admin:w'], - 'delete' => ['admin:w', 'assistenz:w'] + 'delete' => ['admin:w', 'assistenz:w'], ]); // Load models diff --git a/application/controllers/api/frontend/v1/stv/Aufnahmetermine.php b/application/controllers/api/frontend/v1/stv/Aufnahmetermine.php index 86b739c90..26033908d 100644 --- a/application/controllers/api/frontend/v1/stv/Aufnahmetermine.php +++ b/application/controllers/api/frontend/v1/stv/Aufnahmetermine.php @@ -298,7 +298,7 @@ class Aufnahmetermine extends FHCAPI_Controller $reihungstestangetreten = (isset($formData['reihungstestangetreten']) && !empty($formData['reihungstestangetreten'])) ? $formData['reihungstestangetreten'] - : null; + : false; $aufnahmegruppe_kurzbz = (isset($formData['aufnahmegruppe_kurzbz']) && !empty($formData['aufnahmegruppe_kurzbz'])) ? $formData['aufnahmegruppe_kurzbz'] diff --git a/application/controllers/api/frontend/v1/stv/Config.php b/application/controllers/api/frontend/v1/stv/Config.php index 9a2e49fe4..3bf48bf5b 100644 --- a/application/controllers/api/frontend/v1/stv/Config.php +++ b/application/controllers/api/frontend/v1/stv/Config.php @@ -33,6 +33,9 @@ class Config extends FHCAPI_Controller { // TODO(chris): permissions parent::__construct([ + 'get' => ['admin:r', 'assistenz:r'], + 'set' => ['admin:r', 'assistenz:r'], + 'filter' => ['admin:r', 'assistenz:r'], 'student' => ['admin:r', 'assistenz:r'], 'students' => ['admin:r', 'assistenz:r'] ]); @@ -53,6 +56,247 @@ class Config extends FHCAPI_Controller $this->load->config('stv'); } + /** + * get App config + */ + public function get() + { + $this->load->model('system/Variable_model', 'VariableModel'); + $this->load->config('stv'); + + $config = []; + + #number_displayed_past_studiensemester + $result = $this->VariableModel->getVariables(getAuthUID(), ['number_displayed_past_studiensemester']); + $data = $this->getDataOrTerminateWithError($result); + + $number_displayed_past_studiensemester_default = $this->config->item('number_displayed_past_studiensemester_default'); + + $config['number_displayed_past_studiensemester'] = [ + "type" => "number", + "label" => $this->p->t('stv', 'settings_no_displayed_past_sem'), + "value" => $data['number_displayed_past_studiensemester'] + ?? $number_displayed_past_studiensemester_default + ]; + + #font_size + $result = $this->VariableModel->getVariables(getAuthUID(), ['stv_font_size']); + $data = $this->getDataOrTerminateWithError($result); + $config['font_size'] = [ + "type" => "select", + "label" => $this->p->t('stv', 'settings_fontsize'), + "value" => $data['stv_font_size'] ?? "fs_normal", + "options" => [ + "fs_xx-small" => $this->p->t('stv', 'settings_fontsize_xx-small'), + "fs_x-small" => $this->p->t('stv', 'settings_fontsize_x-small'), + "fs_small" => $this->p->t('stv', 'settings_fontsize_small'), + "fs_normal" => $this->p->t('stv', 'settings_fontsize_normal'), + "fs_big" => $this->p->t('stv', 'settings_fontsize_big'), + "fs_huge" => $this->p->t('stv', 'settings_fontsize_huge') + ] + ]; + + #others + Events::trigger('stv_config_get', function & () use (&$config) { + return $config; + }); + + $this->terminateWithSuccess($config); + } + + /** + * set App config + */ + public function set() + { + $this->load->model('system/Variable_model', 'VariableModel'); + $this->load->library('form_validation'); + + $this->form_validation->set_rules( + 'number_displayed_past_studiensemester', + $this->p->t('stv', 'settings_no_displayed_past_sem'), + 'required|integer' + ); + $this->form_validation->set_rules( + 'font_size', + $this->p->t('stv', 'settings_fontsize'), + 'required|in_list[fs_xx-small,fs_x-small,fs_small,fs_normal,fs_big,fs_huge]' + ); + + Events::trigger('stv_config_validation', $this->form_validation); + + if (!$this->form_validation->run()) + $this->terminateWithValidationErrors($this->form_validation->error_array()); + + + $this->VariableModel->setVariable( + getAuthUID(), + 'number_displayed_past_studiensemester', + $this->input->post('number_displayed_past_studiensemester') + ); + $this->VariableModel->setVariable( + getAuthUID(), + 'stv_font_size', + $this->input->post('font_size') + ); + + Events::trigger('stv_config_set', $this->input); + + $this->terminateWithSuccess(); + } + + /* + * Get the config for the student filters + * + * @return void + */ + public function filter() + { + $this->load->library('VariableLib', ['uid' => getAuthUID()]); + + $this->load->model('crm/Buchungstyp_model', 'BuchungstypModel'); + + $this->BuchungstypModel->addOrder('beschreibung'); + + $result = $this->BuchungstypModel->load(); + + $buchungstyp_kurzbz = $this->getDataOrTerminateWithError($result); + $buchungstyp_kurzbz_plus_all = array_merge([[ + 'buchungstyp_kurzbz' => 'all', + 'beschreibung' => $this->p->t('stv', 'konto_all_types') + ]], $buchungstyp_kurzbz); + + $this->load->model('crm/Statusgrund_model', 'StatusgrundModel'); + + $result = $this->StatusgrundModel->getAktiveGruende(); + + $statusgruende = $this->getDataOrTerminateWithError($result); + + $result = []; + + $result[] = [ + 'id' => 'filter_konto_count_0', + 'label' => $this->p->t('stv', 'filter_konto_count_0'), + 'type' => 'konto', + 'fixed' => [ + 'missing' => true, + 'usestdsem' => true + ], + 'dynamic' => [ + 'buchungstyp_kurzbz' => [ + 'type' => 'select', + 'values' => $buchungstyp_kurzbz, + 'value_key' => 'buchungstyp_kurzbz', + 'label_key' => 'beschreibung' + ] + ] + ]; + $result[] = [ + 'id' => 'filter_konto_missing_counter', + 'label' => $this->p->t('stv', 'filter_konto_missing_counter'), + 'type' => 'konto_counter', + 'dynamic' => [ + 'buchungstyp_kurzbz' => [ + 'type' => 'select', + 'values' => $buchungstyp_kurzbz_plus_all, + 'value_key' => 'buchungstyp_kurzbz', + 'label_key' => 'beschreibung' + ], + 'samestg' => [ + 'type' => 'bool', + 'label' => $this->p->t('stv', 'filter_konto_samestg'), + 'default' => $this->variablelib->getVar('kontofilterstg') == 'true' + ] + ] + ]; + $result[] = [ + 'id' => 'filter_documents', + 'label' => $this->p->t('stv', 'filter_documents'), + 'type' => 'documents' + ]; + $result[] = [ + 'id' => 'filter_konto_missing_counter_past', + 'label' => $this->p->t('stv', 'filter_konto_missing_counter_past'), + 'type' => 'konto_counter', + 'fixed' => [ + 'past' => true + ], + 'dynamic' => [ + 'buchungstyp_kurzbz' => [ + 'type' => 'select', + 'values' => $buchungstyp_kurzbz_plus_all, + 'value_key' => 'buchungstyp_kurzbz', + 'label_key' => 'beschreibung' + ], + 'samestg' => [ + 'type' => 'bool', + 'label' => $this->p->t('stv', 'filter_konto_samestg'), + 'default' => $this->variablelib->getVar('kontofilterstg') == 'true' + ] + ] + ]; + $result[] = [ + 'id' => 'filter_konto_missing_studiengebuehr', + 'label' => $this->p->t('stv', 'filter_konto_missing_studiengebuehr'), + 'type' => 'konto', + 'fixed' => [ + 'missing' => true, + 'usestdsem' => true + ], + 'dynamic' => [ + 'buchungstyp_kurzbz' => [ + 'type' => 'select', + 'values' => $buchungstyp_kurzbz, + 'value_key' => 'buchungstyp_kurzbz', + 'label_key' => 'beschreibung' + ] + ] + ]; + $result[] = [ + 'id' => 'filter_konto_studiengebuehrerhoeht', + 'label' => $this->p->t('stv', 'filter_konto_studiengebuehrerhoeht'), + 'type' => 'konto', + 'fixed' => [ + 'usestdsem' => true + ], + 'dynamic' => [ + 'buchungstyp_kurzbz' => [ + 'type' => 'select', + 'values' => $buchungstyp_kurzbz, + 'value_key' => 'buchungstyp_kurzbz', + 'label_key' => 'beschreibung' + ] + ] + ]; + $result[] = [ + 'id' => 'filter_zgv_without_date', + 'label' => $this->p->t('stv', 'filter_zgv_without_date'), + 'type' => 'zgv' + ]; + $result[] = [ + 'id' => 'filter_statusgrund', + 'label' => $this->p->t('stv', 'filter_statusgrund'), + 'type' => 'statusgrund', + 'fixed' => [ + 'usestdsem' => true + ], + 'dynamic' => [ + 'statusgrund_id' => [ + 'type' => 'select', + 'values' => $statusgruende, + 'value_key' => 'statusgrund_id', + 'label_key' => 'bezeichnung' + ] + ] + ]; + + Events::trigger('stv_conf_filter', function & () use (&$result) { + return $result; + }); + + $this->terminateWithSuccess($result); + } + public function student() { $result = []; @@ -60,21 +304,21 @@ class Config extends FHCAPI_Controller $result['details'] = [ 'title' => $this->p->t('stv', 'tab_details'), - 'component' => './Stv/Studentenverwaltung/Details/Details.js', + 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Details.js'), 'config' => $config['details'] ]; $result['notes'] = [ 'title' => $this->p->t('stv', 'tab_notes'), - 'component' => './Stv/Studentenverwaltung/Details/Notizen.js', + 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Notizen.js'), 'config' => $config['notes'], 'showSuffix' => ($config['notes']['showCountNotes'] ?? false), - 'suffixhelper' => APP_ROOT . 'public/js/helpers/Stv/Studentenverwaltung/Details/Notizen/NotizenSuffixHelper.js' + 'suffixhelper' => absoluteJsImportUrl('public/js/helpers/Stv/Studentenverwaltung/Details/Notizen/NotizenSuffixHelper.js') ]; $result['contact'] = [ 'title' => $this->p->t('stv', 'tab_contact'), - 'component' => './Stv/Studentenverwaltung/Details/Kontakt.js', + 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Kontakt.js'), 'config' => [ 'showBankaccount' => $this->permissionlib->isBerechtigt('mitarbeiter/bankdaten') || $this->permissionlib->isBerechtigt('student/bankdaten') @@ -82,20 +326,20 @@ class Config extends FHCAPI_Controller ]; $result['prestudent'] = [ 'title' => $this->p->t('stv', 'tab_prestudent'), - 'component' => './Stv/Studentenverwaltung/Details/Prestudent.js', + 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Prestudent.js'), 'config' => $config['prestudent'] ]; $result['status'] = [ 'title' => 'Status', - 'component' => './Stv/Studentenverwaltung/Details/MultiStatus.js' + 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/MultiStatus.js') ]; $result['documents'] = [ 'title' => $this->p->t('stv', 'tab_documents'), - 'component' => './Stv/Studentenverwaltung/Details/Dokumente.js' + 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Dokumente.js') ]; $result['banking'] = [ 'title' => $this->p->t('stv', 'tab_banking'), - 'component' => './Stv/Studentenverwaltung/Details/Konto.js', + 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Konto.js'), 'config' => [ 'showZahlungsbestaetigung' => (defined('ZAHLUNGSBESTAETIGUNG_ANZEIGEN') && ZAHLUNGSBESTAETIGUNG_ANZEIGEN), 'showBuchungsnr' => $this->permissionlib->isBerechtigt('admin'), @@ -107,20 +351,23 @@ class Config extends FHCAPI_Controller ]; $result['resources'] = [ 'title' => $this->p->t('stv', 'tab_resources'), - 'component' => './Stv/Studentenverwaltung/Details/Betriebsmittel.js' + 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Betriebsmittel.js'), + 'showOnlyWithUid' => true ]; $result['groups'] = [ 'title' => $this->p->t('stv', 'tab_groups'), - 'component' => './Stv/Studentenverwaltung/Details/Gruppen.js' + 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Groups.js'), + 'showOnlyWithUid' => true ]; $result['messages'] = [ 'title' => $this->p->t('stv', 'tab_messages'), - 'component' => './Stv/Studentenverwaltung/Details/Messages.js' + 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Messages.js'), + 'showOnlyWithUid' => true ]; $result['grades'] = [ 'title' => $this->p->t('stv', 'tab_grades'), - 'component' => './Stv/Studentenverwaltung/Details/Noten.js', + 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Noten.js'), 'showOnlyWithUid' => true, 'config' => [ 'usePoints' => defined('CIS_GESAMTNOTE_PUNKTE') && CIS_GESAMTNOTE_PUNKTE, @@ -133,24 +380,26 @@ class Config extends FHCAPI_Controller $result['exam'] = [ 'title' => $this->p->t('stv', 'tab_exam'), - 'component' => './Stv/Studentenverwaltung/Details/Pruefung.js' + 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Pruefung.js'), + 'showOnlyWithUid' => true ]; $result['exemptions'] = [ 'title' => $this->p->t('lehre', 'anrechnungen'), - 'component' => './Stv/Studentenverwaltung/Details/Anrechnungen.js', + 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Anrechnungen.js'), 'config' => $config['exemptions'] ]; $result['finalexam'] = [ 'title' => $this->p->t('stv', 'tab_finalexam'), - 'component' => './Stv/Studentenverwaltung/Details/Abschlusspruefung.js', + 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Abschlusspruefung.js'), + 'showOnlyWithUid' => true, 'config' => $config['finalexam'] ]; $result['projektarbeit'] = [ 'title' => $this->p->t('stv', 'tab_projektarbeit'), - 'component' => './Stv/Studentenverwaltung/Details/Projektarbeit.js', + 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Projektarbeit.js'), 'config' => array_merge( $config['projektarbeit'], ['showVertragsdetails' => @@ -160,12 +409,13 @@ class Config extends FHCAPI_Controller $result['mobility'] = [ 'title' => $this->p->t('stv', 'tab_mobility'), - 'component' => './Stv/Studentenverwaltung/Details/Mobility.js' + 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Mobility.js'), + 'showOnlyWithUid' => true ]; $result['archive'] = [ 'title' => $this->p->t('stv', 'tab_archive'), - 'component' => './Stv/Studentenverwaltung/Details/Archiv.js', + 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Archiv.js'), 'config' => [ 'showEdit' => $this->permissionlib->isBerechtigt('admin') ] @@ -173,22 +423,24 @@ class Config extends FHCAPI_Controller $result['jointstudies'] = [ 'title' => $this->p->t('stv', 'tab_jointstudies'), - 'component' => './Stv/Studentenverwaltung/Details/JointStudies.js' + 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/JointStudies.js'), + 'showOnlyWithUid' => true ]; $result['coursedates'] = [ 'title' => $this->p->t('stv', 'tab_courseDates'), - 'component' => './Stv/Studentenverwaltung/Details/Lehrveranstaltungstermine.js' + 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Lehrveranstaltungstermine.js') ]; $result['admissionDates'] = [ 'title' => $this->p->t('stv', 'tab_admissionDates'), - 'component' => './Stv/Studentenverwaltung/Details/Aufnahmetermine.js' + 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Aufnahmetermine.js') ]; $result['functions'] = [ 'title' => $this->p->t('stv', 'tab_functions'), - 'component' => './Stv/Studentenverwaltung/Details/Funktionen.js' + 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Funktionen.js'), + 'showOnlyWithUid' => true ]; Events::trigger('stv_conf_student', function & () use (&$result) { @@ -206,7 +458,7 @@ class Config extends FHCAPI_Controller $config = $this->config->item('tabs'); $result['banking'] = [ 'title' => $this->p->t('stv', 'tab_banking'), - 'component' => './Stv/Studentenverwaltung/Details/Konto.js', + 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Konto.js'), 'config' => [ 'showZahlungsbestaetigung' => (defined('ZAHLUNGSBESTAETIGUNG_ANZEIGEN') && ZAHLUNGSBESTAETIGUNG_ANZEIGEN), 'showBuchungsnr' => $this->permissionlib->isBerechtigt('admin'), @@ -216,9 +468,14 @@ class Config extends FHCAPI_Controller 'additionalCols' => [] ] ]; + $result['groups'] = [ + 'title' => $this->p->t('stv', 'tab_groups'), + 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Groups.js'), + 'showOnlyWithUid' => true + ]; $result['status'] = [ 'title' => 'Status', - 'component' => './Stv/Studentenverwaltung/Details/MultiStatus.js', + 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/MultiStatus.js'), 'config' => [ 'changeStatusToAbbrecherStgl' => $this->permissionlib->isBerechtigt('admin'), 'changeStatusToAbbrecherStud' => $this->permissionlib->isBerechtigt('admin'), @@ -229,17 +486,32 @@ class Config extends FHCAPI_Controller ]; $result['finalexam'] = [ 'title' => $this->p->t('stv', 'tab_finalexam'), - 'component' => './Stv/Studentenverwaltung/Details/Abschlusspruefung.js', + 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Abschlusspruefung.js'), + 'showOnlyWithUid' => true, 'config' => $config['finalexam'] ]; $result['archive'] = [ 'title' => $this->p->t('stv', 'tab_archive'), - 'component' => './Stv/Studentenverwaltung/Details/Archiv.js', + 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Archiv.js'), 'config' => [ 'showEdit' => $this->permissionlib->isBerechtigt('admin') ] ]; + if($this->permissionlib->isBerechtigt('basis/person')) + { + $result['combinePeople'] = [ + 'title' => $this->p->t('stv', 'tab_combine_people'), + 'component' => './Stv/Studentenverwaltung/Details/CombinePeople.js', + 'config' => $config['combinePeople'] + ]; + } + + $result['kontaktieren'] = [ + 'title' => $this->p->t('stv', 'tab_kontaktieren'), + 'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Kontaktieren.js'), + ]; + Events::trigger('stv_conf_students', function & () use (&$result) { return $result; }); diff --git a/application/controllers/api/frontend/v1/stv/Dokumente.php b/application/controllers/api/frontend/v1/stv/Dokumente.php index 18c976eb6..4f33405ae 100644 --- a/application/controllers/api/frontend/v1/stv/Dokumente.php +++ b/application/controllers/api/frontend/v1/stv/Dokumente.php @@ -2,6 +2,7 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); +use \CI3_Events as Events; use \DateTime as DateTime; class Dokumente extends FHCAPI_Controller @@ -19,6 +20,8 @@ class Dokumente extends FHCAPI_Controller 'getDoktypen' => ['admin:r', 'assistenz:r'], 'uploadDokument' => ['admin:rw', 'assistenz:rw'], 'download' => ['admin:rw', 'assistenz:rw'], + 'getDocumentDropDown' => ['admin:rw', 'assistenz:rw'], + 'getDocumentDropDownMulti' => ['admin:rw', 'assistenz:rw'], ]); // Load Libraries @@ -566,4 +569,422 @@ class Dokumente extends FHCAPI_Controller return false; } } + + public function getDocumentDropDown($prestudent_id, $studiensemester_kurzbz, $studiengang_kz) + { + $this->load->helper('hlp_common'); + //permission to create also odt, and doc outputs of certain documents(menu abschlusspruefung) + $hasPermissionOutputformat = $this->permissionlib->isBerechtigt('system/change_outputformat', 's'); + + if (!$prestudent_id) + $this->terminateWithError($this->p->t('ui', 'errorMissingValue', ['value' => 'Prestudent_id']), self::ERROR_TYPE_GENERAL); + if (!$studiensemester_kurzbz) + $this->terminateWithError($this->p->t('ui', 'errorMissingValue', ['value' => 'Studiensemester']), self::ERROR_TYPE_GENERAL); + if(!$studiengang_kz) + $this->terminateWithError($this->p->t('ui', 'errorMissingValue', ['value' => 'Studiengang_kz']), self::ERROR_TYPE_GENERAL); + + + $uid = $this->_loadUIDFromPrestudent($prestudent_id); + $semArray = $this->_getEntriesStudiensemester(); + $stgTyp = $this->_getStudiengangstyp($studiengang_kz); + + $documents = [ + buildDropdownEntryPrintArray("accountinfo", "Accountinfoblatt", "xml=accountinfoblatt.xml.php&xsl=AccountInfo&output=pdf", $uid, 10, null), + buildDropdownEntryPrintArray("ausbildungsvertrag", "Ausbildungsvertrag", "xml=ausbildungsvertrag.xml.php&xsl=Ausbildungsver&output=pdf", $uid, 20, null), + buildDropdownEntryPrintArray("ausbildungsvertrag_en", "Ausbildungsvertrag Zweisprachig", "xml=ausbildungsvertrag.xml.php&xsl=AusbVerEng&output=pdf", $uid, 21, null), + + buildDropdownEntryPrintArray("bescheid", "Bescheid (nur Voransicht)", "xml=abschlusspruefung.rdf.php&xsl_stg_kz=$studiengang_kz&xsl=Bescheid&output=pdf", $uid, 25, null), + buildDropdownEntryPrintArray("diplomasupp", "Diploma Supplement (nur Voransicht)", "xml=diplomasupplement.xml.php&xsl_stg_kz=$studiengang_kz&xsl=DiplSupplement&output=pdf", $uid, 26, null), + + buildDropdownEntryPrintArray("studienbestaetigung", "Studienbestätigung", "xml=student.rdf.php&xsl=Inskription&output=pdf", $uid, 50, null), + buildDropdownEntryPrintArray("studienbestaetigung_en", "Studienbestätigung Englisch", "xml=student.rdf.php&xsl=InskriptionEng&output=pdf", $uid, 51, null), + buildDropdownEntryPrintArray("zutrittskarte", "Zutrittskarte", "xsl=ZutrittskarteStud&output=pdf&data=$uid", $uid,200, "zutrittskarte.php"), + buildDropdownEntryPrintArray("studienblatt", "Studienblatt", "xml=studienblatt.xml.php&xsl=Studienblatt&output=pdf&ss=$studiensemester_kurzbz", $uid, 60, null), + buildDropdownEntryPrintArray("studienblatt_eng", "Studienblatt Englisch", "xml=studienblatt.xml.php&xsl=StudienblattEng&output=pdf&ss=$studiensemester_kurzbz", $uid, 61, null), + + $this->buildStudienerfolgSubmenu("de", $uid, $semArray, $studiensemester_kurzbz), + $this->buildStudienerfolgSubmenu("en", $uid, $semArray, $studiensemester_kurzbz), + $this->buildStudienerfolgSubmenu("de", $uid, $semArray, $studiensemester_kurzbz, true), + $this->buildStudienerfolgSubmenu("en", $uid, $semArray, $studiensemester_kurzbz, true), + + [ + "id" => "submenu_studstatus", + "type" => "submenu", + "name" => "Verwaltung des StudierendenStatus", + "order" => 110, + "data" => [ + buildDropdownEntryPrintArray("Abmeldung", "Abmeldung", "xml=AntragAbmeldung.xml.php&xsl=AntragAbmeldung&prestudent_id=$prestudent_id&output=pdf", $uid, null, null), + buildDropdownEntryPrintArray("Abmeldung durch Stgl", "AntragAbmeldungStgl", "xml=AntragAbmeldungStgl.xml.php&xsl=AntragAbmeldungStgl&prestudent_id=$prestudent_id&output=pdf", $uid, null, null), + buildDropdownEntryPrintArray("Unterbrechung", "Unterbrechung", "xml=AntragUnterbrechung.xml.php&xsl=AntragUnterbrechung&prestudent_id=$prestudent_id&output=pdf", $uid, null, null), + buildDropdownEntryPrintArray("Wiederholung", "Abmeldung durch Ablauf der Wiederholungsfrist", "xml=AntragWiederholung.xml.php&xsl=AntragWiederholung&prestudent_id=$prestudent_id&output=pdf", $uid, null, null), + ] + ], + + //Bakkzeugnis bzw. Diplomzeugnis is just shown in tab final_exam + buildDropdownEntryPrintArray("zeugnis", "Zeugnis", "xml=zeugnis.rdf.php&xsl=Zeugnis&output=pdf&xsl_stg_kz=$studiengang_kz&ss=$studiensemester_kurzbz", $uid, 121, null), + buildDropdownEntryPrintArray("zeugnis_en", "Zeugnis Englisch", "xml=zeugnis.rdf.php&xsl=ZeugnisEng&output=pdf&xsl_stg_kz=$studiengang_kz&ss=$studiensemester_kurzbz", $uid, 122, null), + + + ]; + + Events::trigger('DocumentGenerationDropDown', + // passing $menu per reference + function & () use (&$documents) { + return $documents; + }, + $prestudent_id, + $studiensemester_kurzbz, + $studiengang_kz + ); + + $extraEntries = $this->loadDropDownEntriesBakkOrDipl($stgTyp, $uid); + + $documents = array_merge($documents, $extraEntries); + + usort($documents, function ($a, $b) { + $orderA = isset($a['order']) ? (int)$a['order'] : PHP_INT_MAX; + $orderB = isset($b['order']) ? (int)$b['order'] : PHP_INT_MAX; + return $orderA <=> $orderB; + }); + + $this->terminateWithSuccess($documents); + //return $documents || null; + } + + public function getDocumentDropDownMulti($studiensemester_kurzbz,$studiengang_kz) + { + //permission to create also odt, and doc outputs of certain documents (menu abschlusspruefung) + $hasPermissionOutputformat = $this->permissionlib->isBerechtigt('system/change_outputformat', 's'); + + $studentUids = $this->input->get('studentUids'); + $prestudentIds = []; + + if (is_array($studentUids) && !empty($studentUids)) { + foreach ($studentUids as $uid) { + $prestudent_id = $this-> _loadPrestudentFromUid($uid); + $prestudentIds[] = $prestudent_id; + } + } + else + { + $this->terminateWithError($this->p->t('ui', 'errorMissingValue', ['value' => 'Array StudentUIDs']), self::ERROR_TYPE_GENERAL); + } + + if (!$studiensemester_kurzbz) + $this->terminateWithError($this->p->t('ui', 'errorMissingValue', ['value' => 'Studiensemester']), self::ERROR_TYPE_GENERAL); + if(!$studiengang_kz) + $this->terminateWithError($this->p->t('ui', 'errorMissingValue', ['value' => 'Studiengang_kz']), self::ERROR_TYPE_GENERAL); + + + $uidString = implode(";", $studentUids); + $prestudentIdsString = implode(";", $prestudentIds); + + $semArray = $this->_getEntriesStudiensemester(); + $stgTyp = $this->_getStudiengangstyp($studiengang_kz); + + $documents = [ + buildDropdownEntryPrintArray("accountinfo", "Accountinfoblatt", "xml=accountinfoblatt.xml.php&xsl=AccountInfo&output=pdf", $uidString, 10, null), + buildDropdownEntryPrintArray("ausbildungsvertrag", "Ausbildungsvertrag", "xml=ausbildungsvertrag.xml.php&xsl=Ausbildungsver&output=pdf", $uidString, 20, null), + buildDropdownEntryPrintArray("ausbildungsvertrag_en", "Ausbildungsvertrag Englisch", "xml=ausbildungsvertrag.xml.php&xsl=AusbVerEng&output=pdf", $uidString, 21, null), + buildDropdownEntryPrintArray("studienbestaetigung", "Studienbestätigung", "xml=student.rdf.php&xsl=Inskription&output=pdf", $uidString, 50, null), + buildDropdownEntryPrintArray("studienbestaetigung_en", "Studienbestätigung Englisch", "xml=student.rdf.php&xsl=InskriptionEng&output=pdf", $uidString, 51, null), + buildDropdownEntryPrintArray("zutrittskarte", "Zutrittskarte", "xsl=ZutrittskarteStud&output=pdf&data=$uidString", $uidString,200, "zutrittskarte.php"), + buildDropdownEntryPrintArray("studienblatt", "Studienblatt", "xml=studienblatt.xml.php&xsl=Studienblatt&output=pdf&ss=$studiensemester_kurzbz", $uidString, 60, null), + buildDropdownEntryPrintArray("studienblatt_eng", "Studienblatt Englisch", "xml=studienblatt.xml.php&xsl=StudienblattEng&output=pdf&ss=$studiensemester_kurzbz", $uidString, 61, null), + + // Studienerfolg Menüs automatisch + $this->buildStudienerfolgSubmenu("de", $uidString, $semArray, $studiensemester_kurzbz), + $this->buildStudienerfolgSubmenu("en", $uidString, $semArray, $studiensemester_kurzbz), + $this->buildStudienerfolgSubmenu("de", $uidString, $semArray, $studiensemester_kurzbz, true), + $this->buildStudienerfolgSubmenu("en", $uidString, $semArray, $studiensemester_kurzbz, true), + + [ + "id" => "submenu_studstatus", + "type" => "submenu", + "name" => "Verwaltung des StudierendenStatus", + "order" => 110, + "data" => [ + buildDropdownEntryPrintArray("Abmeldung", "Abmeldung", "xml=AntragAbmeldung.xml.php&xsl=AntragAbmeldung&prestudent_id=$prestudentIdsString&output=pdf", $uidString, null, null), + buildDropdownEntryPrintArray("Abmeldung durch Stgl", "AntragAbmeldungStgl", "xml=AntragAbmeldungStgl.xml.php&xsl=AntragAbmeldungStgl&prestudent_id=$prestudentIdsString&output=pdf", $uidString, null, null), + buildDropdownEntryPrintArray("Unterbrechung", "Unterbrechung", "xml=AntragUnterbrechung.xml.php&xsl=AntragUnterbrechung&prestudent_id=$prestudentIdsString&output=pdf", $uidString, null, null), + buildDropdownEntryPrintArray("Wiederholung", "Abmeldung durch Ablauf der Wiederholungsfrist", "xml=AntragWiederholung.xml.php&xsl=AntragWiederholung&prestudent_id=$prestudentIdsString&output=pdf", $uidString, null, null), + ] + ], + + buildDropdownEntryPrintArray("diplomasupp", "Diploma Supplement (nur Voransicht)", "xml=diplomasupplement.xml.php&xsl_stg_kz=$studiengang_kz&xsl=DiplSupplement&output=pdf", $uidString, 35, null), + buildDropdownEntryPrintArray("zeugnis", "Zeugnis", "xml=zeugnis.rdf.php&xsl=Zeugnis&output=pdf&xsl_stg_kz=$studiengang_kz&ss=$studiensemester_kurzbz", $uidString, 121, null), + buildDropdownEntryPrintArray("zeugnis_en", "Zeugnis Englisch", "xml=zeugnis.rdf.php&xsl=ZeugnisEng&output=pdf&xsl_stg_kz=$studiengang_kz&ss=$studiensemester_kurzbz", $uidString, 122, null), + ]; + + Events::trigger('DocumentGenerationDropDownMulti', + // passing $menu per reference + function & () use (&$documents) { + return $documents; + }, + $studentUids, + $studiensemester_kurzbz, + $studiengang_kz + ); + + $extraEntries = $this->loadDropDownEntriesBakkOrDipl($stgTyp, $uidString); + + $documents = array_merge($documents, $extraEntries); + + usort($documents, function ($a, $b) { + $orderA = isset($a['order']) ? (int)$a['order'] : PHP_INT_MAX; + $orderB = isset($b['order']) ? (int)$b['order'] : PHP_INT_MAX; + return $orderA <=> $orderB; + }); + + + $this->terminateWithSuccess($documents); + + return $documents || null; + } + + private function _loadUIDFromPrestudent($prestudent_id) + { + if(!$prestudent_id){ + return $this->terminateWithError("no prestudent ID received."); + } + $this->load->model('crm/Student_model', 'StudentModel'); + $result = $this->StudentModel->loadWhere( + ['prestudent_id' => $prestudent_id] + ); + + $data = $this->getDataOrTerminateWithError($result); + $student = current($data); + + return $student->student_uid; + } + + private function _loadPrestudentFromUid($studentUid) + { + + $this->load->model('crm/Student_model', 'StudentModel'); + $result = $this->StudentModel->loadWhere( + ['student_uid' => $studentUid] + ); + + $data = $this->getDataOrTerminateWithError($result); + $student = current($data); + + + return $student->prestudent_id; + } + + /** + * is building an array with studiensemesterkurzb + * actual studiensemester plus the 5 studiensemester in the past + + * @return Array Studiensemester_kurzbz + */ + private function _getEntriesStudiensemester(){ + $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); + + $this->StudiensemesterModel->addPlusMinus(1, 5); + $this->StudiensemesterModel->addOrder('ende', 'DESC'); + $result = $this->StudiensemesterModel->load(); + $data = $this->getDataOrTerminateWithError($result); + + foreach($data as $sem) + { + $semArray[] = $sem->studiensemester_kurzbz; + } + + array_shift($semArray); + + return $semArray; + } + /** + * is returning the typ of Studiengang (Bakk oder Master) + + * @return character eg. 'b' or 'm' + */ + private function _getStudiengangstyp($studiengang_kz) + { + $this->load->model('organisation/Studiengang_model', 'StudiengangModel'); + + $result = $this->StudiengangModel->loadWhere( + array('studiengang_kz' => $studiengang_kz) + ); + $data = $this->getDataOrTerminateWithError($result); + + $typStudiengang = current($data)->typ; + + return $typStudiengang; + } + + /** + * helper function to create ArrayStructure + * actual studiensemester plus the 5 studiensemester in the past + + * @return Array Studiensemester_kurzbz + */ + private function buildStudienerfolgSubmenu($lang, $uid, $semArray, $studiensemester_kurzbz, $fa = false) + { + $entries = []; + + $xsl = $lang === "de" ? "Studienerfolg" : "StudienerfolgEng"; + $idPrefix = "submenu_studienerfolg_" . $lang . ($fa ? "_fa" : ""); + + $entries[] = buildDropdownEntryPrintArray( + $idPrefix . "_aktuell", + "ausgewähltes Semester", + "xml=studienerfolg.rdf.php&xsl=$xsl&ss=$studiensemester_kurzbz" . ($fa ? "&typ=finanzamt" : ""), + $uid + ); + + //all semester + $entries[] = buildDropdownEntryPrintArray( + $idPrefix . "_all", + "alle Semester", + "xml=studienerfolg.rdf.php&xsl=$xsl&ss=$studiensemester_kurzbz&all=true" . ($fa ? "&typ=finanzamt" : ""), + $uid + ); + + //sem from array + foreach ($semArray as $i => $sem) { + $entries[] = buildDropdownEntryPrintArray( + $idPrefix . ($i === 0 ? "_akt" : "_minus" . $i), + $sem, + "xml=studienerfolg.rdf.php&xsl=$xsl&ss=$sem" . ($fa ? "&typ=finanzamt" : ""), + $uid + ); + + } + $order = 0; + if ($lang === "de" && !$fa) $order = 75; // Studienerfolg + if ($lang === "en" && !$fa) $order = 76; // Studienerfolg Englisch + if ($lang === "de" && $fa) $order = 77; // Studienerfolg Finanzamt + if ($lang === "en" && $fa) $order = 78; // Studienerfolg Finanzamt Englisch + + return [ + "id" => $idPrefix, + "type" => "submenu", + "name" => "Studienerfolg " . ($fa ? " Finanzamt" : "") . ($lang === "de" ? "" : "Englisch") , + "order" => $order, + "data" => $entries, + ]; + } + + private function loadDropDownEntriesFinalExam($hasPermissionOutputformat, $stgTyp, $uid) + { + if ($stgTyp == 'b') + $postfix = 'Bakk'; + else if ($stgTyp == 'm' || $stgTyp == 'd') + $postfix = 'Master'; + else + return []; + + $arrayFinalExam = [ + 'pruefungsprotokoll' => [ + 'de' => [ + 'Bakk' => 'PrProtBA', + 'Master' => 'PrProtMA', + ], + 'en' => [ + 'Bakk' => 'PrProtBAEng', + 'Master' => 'PrProtMAEng', + ], + ], + 'pruefungszeugnis' => [ + 'de' => [ + 'Bakk' => 'Bakkzeugnis', + 'Master' => 'Diplomzeugnis', + ], + 'en' => [ + 'Bakk' => 'BakkzeugnisEng', + 'Master' => 'DiplomzeugnisEng', + ], + ], + 'urkunde' => [ + 'de' => [ + 'Bakk' => 'Bakkurkunde', + 'Master' => 'Diplomurkunde', + ], + 'en' => [ + 'Bakk' => 'BakkurkundeEng', + 'Master' => 'DiplomurkundeEng', + ], + ], + ]; + + $langLabels = [ + "de" => "Deutsch", + "en" => "Englisch" + ]; + + $docLabels = [ + "pruefungsprotokoll" => "Prüfungsprotokoll", + "pruefungszeugnis" => "Zeugnis", + "urkunde" => "Urkunde" + ]; + + $submenuData = []; + if ($hasPermissionOutputformat) { + foreach ($arrayFinalExam as $docType => $langs) { + foreach ($langs as $lang => $types) { + $xsl = $types[$postfix]; + $idPrefix = $docType . "_" . $lang; + + $baseName = $docLabels[$docType] . " " . $langLabels[$lang]; + $baseUrl = "xml=abschlusspruefung.rdf.php&xsl={$xsl}"; + + //3 outputformates + foreach (["pdf", "odt", "docx"] as $format) { + $submenuData[] = buildDropdownEntryPrintArray( + $idPrefix . "_" . $format, + $baseName . " (" . strtoupper($format) . ")", + $baseUrl . "&output=" . $format, + $uid + ); + } + } + } + } + else + { + foreach ($arrayFinalExam as $docType => $langs) { + foreach ($langs as $lang => $types) { + $xsl = $types[$postfix]; // Auswahl Bakk/Master für jeweilige Sprache + $id = $docType . "_" . $lang; + + $name = $docLabels[$docType] . " " . $langLabels[$lang]; + + $url = "xml=abschlusspruefung.rdf.php&xsl=" . $xsl . "&output=pdf"; + + $submenuData[] = buildDropdownEntryPrintArray($id, $name, $url, $uid); + } + } + } + return [ + "id" => "submenu_finalexam", + "type" => "submenu", + "name" => "Abschlussprüfung", + "data" => $submenuData, + "order" => null, + "order" => 80, + ]; + } + + private function loadDropDownEntriesBakkOrDipl($stgTyp, $uid) + { + $entries = []; + + if ($stgTyp == 'b') + { + $entries[] = buildDropdownEntryPrintArray("bakkurkunde", "Bakkurkunde", "xml=abschlusspruefung.rdf.php&xsl=Bakkurkunde&output=pdf", $uid, 22, null); + $entries[] = buildDropdownEntryPrintArray("bakkurkundeEng", "Bakkurkunde Englisch", "xml=abschlusspruefung.rdf.php&xsl=BakkurkundeEng&output=pdf", $uid, 23, null); + } + + if ($stgTyp == 'm' || $stgTyp == 'd') + { + $entries[] = buildDropdownEntryPrintArray("diplomurkunde", "Diplomurkunde", "xml=abschlusspruefung.rdf.php&xsl=Diplomurkunde&output=pdf", $uid, 27, null); + $entries[] = buildDropdownEntryPrintArray("diplomurkundeEng", "Diplomurkunde Englisch", "xml=abschlusspruefung.rdf.php&xsl=DiplomurkundeEng&output=pdf", $uid, 28, null); + } + + return $entries; + } + } diff --git a/application/controllers/api/frontend/v1/stv/GemeinsameStudien.php b/application/controllers/api/frontend/v1/stv/GemeinsameStudien.php index 97dad48fd..8f3d6419a 100644 --- a/application/controllers/api/frontend/v1/stv/GemeinsameStudien.php +++ b/application/controllers/api/frontend/v1/stv/GemeinsameStudien.php @@ -83,7 +83,7 @@ class GemeinsameStudien extends FHCAPI_Controller { $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); - $this->StudiensemesterModel->addOrder('studienjahr_kurzbz', 'DESC'); + $this->StudiensemesterModel->addOrder('start', 'DESC'); $result = $this->StudiensemesterModel->load(); $data = $this->getDataOrTerminateWithError($result); $this->terminateWithSuccess($data); diff --git a/application/controllers/api/frontend/v1/stv/Gruppen.php b/application/controllers/api/frontend/v1/stv/Gruppen.php index c30816f2a..b10cfb328 100644 --- a/application/controllers/api/frontend/v1/stv/Gruppen.php +++ b/application/controllers/api/frontend/v1/stv/Gruppen.php @@ -9,6 +9,8 @@ class Gruppen extends FHCAPI_Controller public function __construct() { parent::__construct([ + 'add' => ['admin:rw', 'assistenz:rw'], + 'search' => ['admin:r', 'assistenz:r'], 'getGruppen' => ['admin:r', 'assistenz:r'], 'deleteGruppe' => ['admin:rw', 'assistenz:rw'], ]); @@ -18,7 +20,9 @@ class Gruppen extends FHCAPI_Controller // Load language phrases $this->loadPhrases([ - 'ui', 'gruppenmanagement' + 'ui', + 'gruppenmanagement', + 'lehre' ]); // Load models @@ -26,15 +30,141 @@ class Gruppen extends FHCAPI_Controller $this->load->model('organisation/Gruppe_model', 'GruppeModel'); } + public function add() + { + $this->load->library("form_validation"); + + $this->form_validation->set_rules( + 'gruppe_kurzbz', + $this->p->t('gruppenmanagement', 'gruppe'), + 'required|is_in_db[organisation/Gruppe_model]', + [ + 'required' => $this->p->t('ui', 'error_fieldRequired'), + 'is_in_db' => $this->p->t('ui', 'error_fieldNotFound') + ] + ); + $this->form_validation->set_rules( + 'uid', + $this->p->t('ui', 'student_uid'), + 'required|is_in_db[crm/Student_model:student_uid]', + [ + 'required' => $this->p->t('ui', 'error_fieldRequired'), + 'is_in_db' => $this->p->t('ui', 'error_fieldNotFound') + ] + ); + $this->form_validation->set_rules( + 'studiensemester_kurzbz', + $this->p->t('lehre', 'studiensemester'), + 'required|is_in_db[organisation/Studiensemester_model]', + [ + 'required' => $this->p->t('ui', 'error_fieldRequired'), + 'is_in_db' => $this->p->t('ui', 'error_fieldNotFound') + ] + ); + + if (!$this->form_validation->run()) + $this->terminateWithValidationErrors($this->form_validation->error_array()); + + $gruppe_kurzbz = $this->input->post('gruppe_kurzbz'); + $uid = $this->input->post('uid'); + $studiensemester_kurzbz = $this->input->post('studiensemester_kurzbz'); + + $result = $this->BenutzergruppeModel->load([ + $gruppe_kurzbz, + $uid + ]); + $benutzergruppe = $this->getDataOrTerminateWithError($result); + + if ($benutzergruppe) { + $this->terminateWithError( + $this->p->t('gruppenmanagement', 'error_alreadyInGroup', [ + 'uid' => $uid, + 'studiensemester_kurzbz' => current($benutzergruppe)->studiensemester_kurzbz + ]), + self::ERROR_TYPE_GENERAL + ); + } + + $result = $this->BenutzergruppeModel->insert([ + 'uid' => $uid, + 'gruppe_kurzbz' => $gruppe_kurzbz, + 'studiensemester_kurzbz' => $studiensemester_kurzbz, + 'insertamum' => date('c'), + 'insertvon' => getAuthUID() + ]); + + $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess(); + } + + public function search() + { + $query = $this->input->post('query'); + if (!$query) + $this->terminateWithSuccess([]); + + // add query to where clause + $query = strtoupper($query); + $query = $this->GruppeModel->db->escape_like_str($query); + $query = '%' . str_replace(' ', '%', $query) . '%'; + + $this->GruppeModel->db->group_start(); + $this->GruppeModel->db->or_like('UPPER(gruppe_kurzbz)', $query, 'none', false); + $this->GruppeModel->db->or_like('UPPER(bezeichnung)', $query, 'none', false); + $this->GruppeModel->db->or_like('UPPER(beschreibung)', $query, 'none', false); + $this->GruppeModel->db->group_end(); + + // add stg sorting 1 + $studiengang_kz = $this->input->post('studiengang_kz'); + $sort_stg = $studiengang_kz ? "WHEN studiengang_kz = " . $this->GruppeModel->escape($studiengang_kz) . " THEN 0" : ""; + + // add stg sorting 2 + $studiengang_kzs = []; + $result = $this->permissionlib->getSTG_isEntitledFor('admin'); + if ($result) + $studiengang_kzs = array_merge($studiengang_kzs, $result); + $result = $this->permissionlib->getSTG_isEntitledFor('assistenz'); + if ($result) + $studiengang_kzs = array_merge($studiengang_kzs, $result); + + // selects + $this->GruppeModel->addSelect("*"); + $this->GruppeModel->addSelect("CASE + " . $sort_stg . " + WHEN studiengang_kz IN (" . implode(",", $this->GruppeModel->db->escape($studiengang_kzs)) . ") + THEN 1 + ELSE 2 + END AS sort_stg"); + + // ordering + $this->GruppeModel->addOrder("sort_stg"); + $this->GruppeModel->addOrder("sort"); + $this->GruppeModel->addOrder("gruppe_kurzbz"); + + // default where clause & execute + $result = $this->GruppeModel->loadWhere([ + 'lehre' => true, + 'sichtbar' => true, + 'aktiv' => true, + 'direktinskription' => false, + 'generiert' => false + ]); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + public function getGruppen($student_uid) { - $this->BenutzergruppeModel ->addSelect('gruppe_kurzbz'); - $this->BenutzergruppeModel ->addSelect('bezeichnung'); - $this->BenutzergruppeModel ->addSelect('generiert'); - $this->BenutzergruppeModel ->addSelect('uid'); - $this->BenutzergruppeModel ->addSelect('studiensemester_kurzbz'); - $this->BenutzergruppeModel ->addJoin('public.tbl_gruppe', 'gruppe_kurzbz'); - $this->BenutzergruppeModel-> addOrder('bezeichnung', 'ASC'); + $this->BenutzergruppeModel->addSelect('gruppe_kurzbz'); + $this->BenutzergruppeModel->addSelect('bezeichnung'); + $this->BenutzergruppeModel->addSelect('generiert'); + $this->BenutzergruppeModel->addSelect('uid'); + $this->BenutzergruppeModel->addSelect('studiensemester_kurzbz'); + $this->BenutzergruppeModel->addJoin('public.tbl_gruppe', 'gruppe_kurzbz'); + $this->BenutzergruppeModel->addOrder('bezeichnung', 'ASC'); $result = $this->BenutzergruppeModel->loadWhere( array( @@ -49,29 +179,48 @@ class Gruppen extends FHCAPI_Controller public function deleteGruppe() { - $student_uid = $this->input->post('id'); + $this->load->library("form_validation"); + + $this->form_validation->set_rules( + 'uid', + $this->p->t('person', 'UID'), + 'required', + [ + 'required' => $this->p->t('ui', 'error_fieldRequired') + ] + ); + + $this->form_validation->set_rules( + 'gruppe_kurzbz', + $this->p->t('gruppenmanagement', 'gruppe'), + 'required', + [ + 'required' => $this->p->t('ui', 'error_fieldRequired') + ] + ); + + if (!$this->form_validation->run()) + $this->terminateWithValidationErrors($this->form_validation->error_array()); + + $uid = $this->input->post('uid'); $gruppe_kurzbz = $this->input->post('gruppe_kurzbz'); - //Validate if automatic group generation - $result = $this->GruppeModel-> loadWhere( - array( - 'gruppe_kurzbz' => $gruppe_kurzbz - ) - ); + // Validate if automatic group generation + $result = $this->GruppeModel->loadWhere([ + 'gruppe_kurzbz' => $gruppe_kurzbz + ]); $data = $this->getDataOrTerminateWithError($result); $generation = current($data); - if($generation->generiert) + if ($generation->generiert) { $this->terminateWithError($this->p->t('gruppenmanagement', 'error_deleteGeneratedGroups'), self::ERROR_TYPE_GENERAL); } - $result = $this->BenutzergruppeModel->delete( - array( - 'gruppe_kurzbz' => $gruppe_kurzbz, - 'uid' => $student_uid - ) - ); + $result = $this->BenutzergruppeModel->delete([ + 'gruppe_kurzbz' => $gruppe_kurzbz, + 'uid' => $uid + ]); $data = $this->getDataOrTerminateWithError($result); diff --git a/application/controllers/api/frontend/v1/stv/Konto.php b/application/controllers/api/frontend/v1/stv/Konto.php index a33680ea0..384452f3e 100644 --- a/application/controllers/api/frontend/v1/stv/Konto.php +++ b/application/controllers/api/frontend/v1/stv/Konto.php @@ -352,7 +352,7 @@ class Konto extends FHCAPI_Controller continue; } - + $result = $this->KontoModel->insert([ 'person_id' => $buchung['person_id'], 'studiengang_kz' => $buchung['studiengang_kz'], @@ -361,7 +361,7 @@ class Konto extends FHCAPI_Controller 'buchungstyp_kurzbz' => $buchung['buchungstyp_kurzbz'], 'credit_points' => $buchung['credit_points'], 'zahlungsreferenz' => $buchung['zahlungsreferenz'], - 'betrag' => $betrag, + 'betrag' => number_format($betrag, 2, '.', ''), 'buchungsdatum' => $buchungsdatum, 'mahnspanne' => '0', 'buchungsnr_verweis' => $buchung['buchungsnr'], diff --git a/application/controllers/api/frontend/v1/stv/Lehrverband.php b/application/controllers/api/frontend/v1/stv/Lehrverband.php new file mode 100644 index 000000000..72610dd63 --- /dev/null +++ b/application/controllers/api/frontend/v1/stv/Lehrverband.php @@ -0,0 +1,63 @@ + ['admin:r', 'assistenz:r'], + 'getTree' => ['admin:r', 'assistenz:r'], + 'getSpecialgroups' => ['admin:r', 'assistenz:r'] + ]); + } + + public function hasOrgforms($studiengang_kz) + { + $this->load->model('organisation/Studiengang_model', 'StudiengangModel'); + + $result = $this->StudiengangModel->load($studiengang_kz); + + $data = $this->getDataOrTerminateWithError($result); + if ($data) { + $data = current($data)->mischform; + } + + $this->terminateWithSuccess($data); + } + + public function getTree($studiengang_kz) + { + $this->load->model('organisation/Lehrverband_model', 'LehrverbandModel'); + + $result = $this->LehrverbandModel->loadWhere([ + 'studiengang_kz' => $studiengang_kz, + 'aktiv' => true + ]); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + + public function getSpecialgroups($studiengang_kz) + { + $this->load->model('organisation/Gruppe_model', 'GruppeModel'); + + $where = [ + 'studiengang_kz' => $studiengang_kz, + 'lehre' => true, + 'sichtbar' => true, + 'aktiv' => true, + 'direktinskription' => false + ]; + + $result = $this->GruppeModel->loadWhere($where); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } +} diff --git a/application/controllers/api/frontend/v1/stv/Projektarbeit.php b/application/controllers/api/frontend/v1/stv/Projektarbeit.php index 75478332f..9cc604184 100644 --- a/application/controllers/api/frontend/v1/stv/Projektarbeit.php +++ b/application/controllers/api/frontend/v1/stv/Projektarbeit.php @@ -268,10 +268,6 @@ class Projektarbeit extends FHCAPI_Controller { $this->form_validation->set_data($formData); - $this->form_validation->set_rules('titel', 'Titel', 'required', [ - 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Titel']) - ]); - $this->form_validation->set_rules('projekttyp_kurzbz', 'Projekttyp', 'required', [ 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Projekttyp']) ]); diff --git a/application/controllers/api/frontend/v1/stv/Pruefung.php b/application/controllers/api/frontend/v1/stv/Pruefung.php index e205c85b8..4521c2033 100644 --- a/application/controllers/api/frontend/v1/stv/Pruefung.php +++ b/application/controllers/api/frontend/v1/stv/Pruefung.php @@ -18,6 +18,8 @@ if (! defined('BASEPATH')) exit('No direct script access allowed'); +use \DateTime as DateTime; + /** * This controller operates between (interface) the JS (GUI) and the back-end * Provides data to the ajax get calls about addresses @@ -111,7 +113,7 @@ class Pruefung extends FHCAPI_Controller // Load language phrases $this->loadPhrases([ - 'global', 'ui','lehre' + 'global', 'ui', 'lehre', 'exam' ]); } @@ -172,174 +174,11 @@ class Pruefung extends FHCAPI_Controller * * @param lehrveranstaltung_id, student_uid, lehreinheit_id * - * @return values on success - * retval 0: pruefung inserted - * reval 1: pruefung and zeugnisnote inserted - * retval 2: pruefung inserted, no insert Zeugnisnote - * (change after date of examination) - * retval 3: pruefung of type Termin2 inserted - * and pruefung of type Termin1 as well - * retval 5: prueufungen Termin 2 and 1 inserted - * and no insert Zeugnisnote (change after date of examination) + * @return void */ public function insertPruefung() { - $authUID = getAuthUID(); - - $this->load->library('form_validation'); - - $this->form_validation->set_rules('lehrveranstaltung_id', $this->p->t('lehre', 'lehrveranstaltung'), 'required', [ - 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('lehre', 'lehrveranstaltung')]), - ]); - $this->form_validation->set_rules('lehreinheit_id', $this->p->t('lehre', 'lehreinheit'), 'required', [ - 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('lehre', 'lehreinheit')]), - ]); - $this->form_validation->set_rules('pruefungstyp_kurzbz', $this->p->t('lehre', 'pruefung'), 'required', [ - 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('global', 'typ')]), - ]); - $this->form_validation->set_rules( - 'datum', - $this->p->t('global', 'datum'), - ['is_valid_date'] - ); - - if ($this->form_validation->run() == false) - { - $this->terminateWithValidationErrors($this->form_validation->error_array()); - } - - //calculate studiensemester_kurzbz this from lehreinheit (case newPruefung) - $studiensemester_kurzbz = $this->input->post('studiensemester_kurzbz'); - if (!$studiensemester_kurzbz) - { - $this->load->model('education/Lehreinheit_model', 'LehreinheitModel'); - - $result = $this->LehreinheitModel->load($this->input->post('lehreinheit_id')); - - $lehreinheit = $this->getDataOrTerminateWithError($result); - $studiensemester_kurzbz = current($lehreinheit)->studiensemester_kurzbz; - - if (isError($result)) - { - $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); - } - } - - $result = $this->PruefungModel->insert([ - 'lehreinheit_id' => $this->input->post('lehreinheit_id'), - 'student_uid' => $this->input->post('student_uid'), - 'mitarbeiter_uid' => $this->input->post('mitarbeiter_uid'), - 'datum' => $this->input->post('datum'), - 'pruefungstyp_kurzbz' => $this->input->post('pruefungstyp_kurzbz'), - 'note' => $this->input->post('note'), - 'anmerkung' => $this->input->post('anmerkung'), - 'insertamum' => date('c'), - 'insertvon' => $authUID, - ]); - - $this->getDataOrTerminateWithError($result); - - //check if existing zeugnisnote - $this->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel'); - - $result = $this->ZeugnisnoteModel->loadWhere(array( - 'lehrveranstaltung_id' => $this->input->post('lehrveranstaltung_id'), - 'student_uid' => $this->input->post('student_uid'), - 'studiensemester_kurzbz' => $studiensemester_kurzbz)); - - if (isError($result)) - { - $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); - } - - if (!hasData($result)) - { - //insert zeugnisnote, if not existing - $result = $this->ZeugnisnoteModel->insert(array( - 'lehrveranstaltung_id' => $this->input->post('lehrveranstaltung_id'), - 'student_uid' => $this->input->post('student_uid'), - 'studiensemester_kurzbz' => $studiensemester_kurzbz, - 'note' => $this->input->post('note'), - 'uebernahmedatum' => date('c'), - 'benotungsdatum' => $this->input->post('datum'), - 'insertamum' => date('c'), - 'insertvon' => $authUID - )); - - if (isError($result)) - { - $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL); - } - $this->terminateWithSuccess(1); - } - - $return_code = 0; - - //handling Termin1 if not existing - if($this->input->post('pruefungstyp_kurzbz') == "Termin2") - { - $resultP = $this->PruefungModel->loadWhere(array( - 'lehreinheit_id' => $this->input->post('lehreinheit_id'), - 'student_uid' => $this->input->post('student_uid'), - 'pruefungstyp_kurzbz' => 'Termin1')); - - if (isError($resultP)) - { - $this->terminateWithError(getError($resultP), self::ERROR_TYPE_GENERAL); - } - if(!hasData($resultP)) - { - //check if existing Zeugnisnote - $this->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel'); - $this->ZeugnisnoteModel->addJoin('lehre.tbl_lehreinheit', 'lehrveranstaltung_id'); - - $resultP = $this->ZeugnisnoteModel->loadWhere(array( - 'lehrveranstaltung_id' => $this->input->post('lehrveranstaltung_id'), - 'student_uid' => $this->input->input->post('student_uid'), - 'lehre.tbl_zeugnisnote.studiensemester_kurzbz' => $studiensemester_kurzbz)); - if (isError($resultP)) - { - $this->terminateWithError(getError($resultP), self::ERROR_TYPE_GENERAL); - } - if (!hasData($resultP)) - { - $this->terminateWithError("Zeugnisnote existiert nicht", self::ERROR_TYPE_GENERAL); - } - $dataNote = current(getData($resultP)); - - $resultN = $this->PruefungModel->insert([ - 'lehreinheit_id' => $this->input->post('lehreinheit_id'), - 'student_uid' => $this->input->post('student_uid'), - 'mitarbeiter_uid' => $this->input->post('mitarbeiter_uid'), - 'datum' => $dataNote->benotungsdatum, - 'pruefungstyp_kurzbz' => 'Termin1', - 'note' => $dataNote->note, - 'punkte' => $dataNote->punkte, - 'anmerkung' => 'automatisiert aus Zeugnisnote erstellt', - 'insertamum' => date('c'), - 'insertvon' => $authUID, - ]); - - if (isError($resultN)) { - $this->terminateWithError(getError($resultN), self::ERROR_TYPE_GENERAL); - } - $return_code = 3; - } - } - - $note = current(getData($result)); - $uebernahmedatum = new DateTime($note->uebernahmedatum); - $benotungsdatum = new DateTime($note->benotungsdatum); - - $checkDate = $uebernahmedatum === '' || $benotungsdatum > $uebernahmedatum - ? $benotungsdatum - : $uebernahmedatum; - - if ($checkDate >= $this->input->post('datum') && $note !== $note->note) - { - $this->terminateWithSuccess($return_code + 2); - } - $this->terminateWithSuccess($return_code + 2); + $this->insertOrUpdatePruefung(); } /** @@ -348,8 +187,6 @@ class Pruefung extends FHCAPI_Controller * @param pruefung_id * * @return success or error - * - * no impact on lehre.tbl_zeugnisnote */ public function updatePruefung($pruefung_id) { @@ -359,48 +196,7 @@ class Pruefung extends FHCAPI_Controller if (!$oldpruefung) show_404(); // Pruefung that should be updated does not exist - $authUID = getAuthUID(); - - $this->load->library('form_validation'); - - $this->form_validation->set_rules('lehrveranstaltung_id', $this->p->t('lehre', 'lehrveranstaltung'), 'required', [ - 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('lehre', 'lehrveranstaltung')]), - ]); - $this->form_validation->set_rules('lehreinheit_id', $this->p->t('lehre', 'lehreinheit'), 'required', [ - 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('lehre', 'lehreinheit')]), - ]); - $this->form_validation->set_rules('pruefungstyp_kurzbz', $this->p->t('lehre', 'pruefung'), 'required', [ - 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('global', 'typ')]), - ]); - $this->form_validation->set_rules( - 'datum', - $this->p->t('global', 'datum'), - ['is_valid_date'] - ); - - if ($this->form_validation->run() == false) - { - $this->terminateWithValidationErrors($this->form_validation->error_array()); - } - - $result = $this->PruefungModel->update( - [ - 'pruefung_id' => $pruefung_id - ], - [ 'lehreinheit_id' => $this->input->post('lehreinheit_id'), - 'student_uid' => $this->input->post('student_uid'), - 'mitarbeiter_uid' => $this->input->post('mitarbeiter_uid'), - 'note' => $this->input->post('note'), - 'pruefungstyp_kurzbz' => $this->input->post('pruefungstyp_kurzbz'), - 'datum' => $this->input->post('datum'), - 'anmerkung' => $this->input->post('anmerkung'), - 'updatevon' => $authUID, - 'updateamum' => date('c'), - ] - ); - $this->getDataOrTerminateWithError($result); - - return $this->outputJsonSuccess(true); + $this->insertOrUpdatePruefung($pruefung_id); } /** @@ -574,4 +370,198 @@ class Pruefung extends FHCAPI_Controller return $this->terminateWithSuccess($data); } + + protected function insertOrUpdatePruefung($pruefung_id=null) + { + $authUID = getAuthUID(); + + $this->load->library('form_validation'); + + $this->form_validation->set_rules('lehreinheit_id', $this->p->t('lehre', 'lehreinheit'), 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('lehre', 'lehreinheit')]), + ]); + $this->form_validation->set_rules('pruefungstyp_kurzbz', $this->p->t('lehre', 'pruefung'), 'required', [ + 'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('global', 'typ')]), + ]); + $this->form_validation->set_rules( + 'datum', + $this->p->t('global', 'datum'), + ['is_valid_date'] + ); + + if ($this->form_validation->run() == false) + { + $this->terminateWithValidationErrors($this->form_validation->error_array()); + } + + $this->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel'); + + $this->PruefungModel->db->trans_start(); + + if ($this->input->post('pruefungstyp_kurzbz') == "Termin2") + { + //Wenn ein 2. Termin angelegt wird, und kein 1. Termin vorhanden ist, + //dann wird auch ein 1. Termin angelegt mit der derzeitigen Zeugnisnote + $resultP = $this->PruefungModel->loadWhere(array( + 'lehreinheit_id' => $this->input->post('lehreinheit_id'), + 'student_uid' => $this->input->post('student_uid'), + 'pruefungstyp_kurzbz' => 'Termin1')); + + $termin1 = $this->getDataOrTerminateWithError($resultP); + if (!$termin1) + { + //check if existing Zeugnisnote + $this->ZeugnisnoteModel->addJoin('lehre.tbl_lehreinheit', 'lehrveranstaltung_id'); + + $this->ZeugnisnoteModel->db->where( + 'lehre.tbl_zeugnisnote.studiensemester_kurzbz', + 'lehre.tbl_lehreinheit.studiensemester_kurzbz', + false + ); + $resultP = $this->ZeugnisnoteModel->loadWhere(array( + 'lehrveranstaltung_id' => $this->input->post('lehrveranstaltung_id'), + 'student_uid' => $this->input->post('student_uid') + )); + + $zeugnisnoten = $this->getDataOrTerminateWithError($resultP); + if ($zeugnisnoten) + { + $zeugnisnote = current($zeugnisnoten); + + $resultN = $this->PruefungModel->insert([ + 'lehreinheit_id' => $this->input->post('lehreinheit_id'), + 'student_uid' => $this->input->post('student_uid'), + 'mitarbeiter_uid' => $this->input->post('mitarbeiter_uid'), + 'datum' => $zeugnisnote->benotungsdatum, + 'pruefungstyp_kurzbz' => 'Termin1', + 'note' => $zeugnisnote->note, + 'punkte' => $zeugnisnote->punkte, + 'anmerkung' => 'automatisiert aus Zeugnisnote erstellt', + 'insertamum' => date('c'), + 'insertvon' => $authUID, + ]); + + $this->getDataOrTerminateWithError($resultN); + } + //Wenn keine Zeugnisnote vorhanden ist, dann wird kein + //1.Termin angelegt + } + } + + if(intval($pruefung_id) > 0) + { + $result = $this->PruefungModel->update( + [ + 'pruefung_id' => $pruefung_id + ], + [ 'lehreinheit_id' => $this->input->post('lehreinheit_id'), + 'student_uid' => $this->input->post('student_uid'), + 'mitarbeiter_uid' => $this->input->post('mitarbeiter_uid'), + 'note' => $this->input->post('note'), + 'pruefungstyp_kurzbz' => $this->input->post('pruefungstyp_kurzbz'), + 'datum' => $this->input->post('datum'), + 'anmerkung' => $this->input->post('anmerkung'), + 'updatevon' => $authUID, + 'updateamum' => date('c'), + ] + ); + } + else + { + $result = $this->PruefungModel->insert([ + 'lehreinheit_id' => $this->input->post('lehreinheit_id'), + 'student_uid' => $this->input->post('student_uid'), + 'mitarbeiter_uid' => $this->input->post('mitarbeiter_uid'), + 'datum' => $this->input->post('datum'), + 'pruefungstyp_kurzbz' => $this->input->post('pruefungstyp_kurzbz'), + 'note' => $this->input->post('note'), + 'anmerkung' => $this->input->post('anmerkung'), + 'insertamum' => date('c'), + 'insertvon' => $authUID, + 'punkte' => $this->input->post('punkte') ? str_replace(',', '.', $this->input->post('punkte')) : null + ]); + } + + $this->getDataOrTerminateWithError($result); + + //get studiensemester_kurzbz and lehreveranstaltung_id from lehreinheit + $this->load->model('education/Lehreinheit_model', 'LehreinheitModel'); + + $result = $this->LehreinheitModel->load($this->input->post('lehreinheit_id')); + + $lehreinheiten = $this->getDataOrTerminateWithError($result); + + if (!$lehreinheiten) { + $this->terminateWithValidationErrors([ + 'lehreinheit_id' => $this->p->t('ui', 'error_fieldNotFound', [ + 'field' => $this->p->t('lehre', 'lehreinheit') + ]) + ]); + } + $lehreinheit = current($lehreinheiten); + $studiensemester_kurzbz = $lehreinheit->studiensemester_kurzbz; + $lehrveranstaltung_id = $lehreinheit->lehrveranstaltung_id; + + //check if existing zeugnisnote + $result = $this->ZeugnisnoteModel->loadWhere(array( + 'lehrveranstaltung_id' => $lehrveranstaltung_id, + 'student_uid' => $this->input->post('student_uid'), + 'studiensemester_kurzbz' => $studiensemester_kurzbz + )); + + $zeugnisnoten = $this->getDataOrTerminateWithError($result); + + if (!$zeugnisnoten) + { + //insert zeugnisnote, if not existing + $result = $this->ZeugnisnoteModel->insert(array( + 'lehrveranstaltung_id' => $lehrveranstaltung_id, + 'student_uid' => $this->input->post('student_uid'), + 'studiensemester_kurzbz' => $studiensemester_kurzbz, + 'note' => $this->input->post('note'), + 'uebernahmedatum' => date('c'), + 'benotungsdatum' => $this->input->post('datum'), + 'insertamum' => date('c'), + 'insertvon' => $authUID, + 'punkte' => $this->input->post('punkte') ? str_replace(',', '.', $this->input->post('punkte')) : null + )); + + $this->getDataOrTerminateWithError($result); + + $this->PruefungModel->db->trans_complete(); + $this->terminateWithSuccess(); + } + + $note = current($zeugnisnoten); + $uebernahmedatum = new DateTime($note->uebernahmedatum); + $benotungsdatum = new DateTime($note->benotungsdatum); + $pruefungsdatum = new DateTime($this->input->post('datum')); + + $checkDate = $note->uebernahmedatum === '' || $benotungsdatum > $uebernahmedatum + ? $benotungsdatum + : $uebernahmedatum; + + if ($checkDate > $pruefungsdatum && $this->input->post('note') !== $note->note) + { + $this->PruefungModel->db->trans_complete(); + $this->terminateWithSuccess($this->p->t('exam', 'hinweis_changeAfterExamDate')); + } + + //update zeugnisnote, if existing and valid datum + $result = $this->ZeugnisnoteModel->update([ + 'lehrveranstaltung_id' => $lehrveranstaltung_id, + 'student_uid' => $this->input->post('student_uid'), + 'studiensemester_kurzbz' => $studiensemester_kurzbz + ], [ + 'note' => $this->input->post('note'), + 'uebernahmedatum' => date('c'), + 'benotungsdatum' => $this->input->post('datum'), + 'updateamum' => date('c'), + 'updatevon' => $authUID, + 'punkte' => $this->input->post('punkte') ? str_replace(',', '.', $this->input->post('punkte')) : null + ]); + + $this->PruefungModel->db->trans_complete(); + $this->terminateWithSuccess(); + } } diff --git a/application/controllers/api/frontend/v1/stv/Status.php b/application/controllers/api/frontend/v1/stv/Status.php index dc48a47ff..e490772db 100644 --- a/application/controllers/api/frontend/v1/stv/Status.php +++ b/application/controllers/api/frontend/v1/stv/Status.php @@ -114,9 +114,8 @@ class Status extends FHCAPI_Controller $this->load->model('codex/Bismeldestichtag_model', 'BismeldestichtagModel'); $result = $this->BismeldestichtagModel->getLastReachedMeldestichtag(); - $data = $this->getDataOrTerminateWithError($result); - $this->terminateWithSuccess($data); + $this->terminateWithSuccess(hasData($result) ? getData($result) : array()); } public function isLastStatus($prestudent_id) @@ -296,7 +295,7 @@ class Status extends FHCAPI_Controller }], //Check if Rolle already exists ['rolle_doesnt_exist', function () use ($prestudent_id, $status_kurzbz, $studiensemester_kurzbz, $ausbildungssemester) { - if (!$status_kurzbz || !$studiensemester_kurzbz || !$ausbildungssemester) + if (!$status_kurzbz || !$studiensemester_kurzbz || !isset($ausbildungssemester) || $ausbildungssemester === '') return true; // Error will be handled by the required statements above $result = $this->PrestudentstatusModel->load([$ausbildungssemester, $studiensemester_kurzbz, $status_kurzbz, $prestudent_id]); @@ -903,7 +902,7 @@ class Status extends FHCAPI_Controller $this->form_validation->set_rules('_default', '', [ ['rolle_doesnt_exist', function () use ($prestudent_id, $status_kurzbz, $studiensemester_kurzbz, $ausbildungssemester) { - if (!$status_kurzbz || !$studiensemester_kurzbz || !$ausbildungssemester) + if (!$status_kurzbz || !$studiensemester_kurzbz || !isset($ausbildungssemester) || $ausbildungssemester === '') return true; // Error will be handled by the required statements above $result = $this->PrestudentstatusModel->load([$ausbildungssemester, $studiensemester_kurzbz, $status_kurzbz, $prestudent_id]); @@ -920,7 +919,7 @@ class Status extends FHCAPI_Controller ) { if ($isBerechtigtNoStudstatusCheck) return true; // Skip if access right says so - if (!$status_kurzbz || !$datum || !$studiensemester_kurzbz || !$ausbildungssemester) + if (!$status_kurzbz || !$datum || !$studiensemester_kurzbz || !isset($ausbildungssemester) || $ausbildungssemester === '') return true; // Error will be handled by the required statements above $result = $this->prestudentstatuschecklib->checkStatusHistoryTimesequence( @@ -945,7 +944,7 @@ class Status extends FHCAPI_Controller ) { if ($isBerechtigtNoStudstatusCheck) return true; // Skip if access right says so - if (!$status_kurzbz || !$datum || !$studiensemester_kurzbz || !$ausbildungssemester) + if (!$status_kurzbz || !$datum || !$studiensemester_kurzbz || !isset($ausbildungssemester) || $ausbildungssemester === '') return true; // Error will be handled by the required statements above $result = $this->prestudentstatuschecklib->checkStatusHistoryLaststatus( @@ -970,7 +969,7 @@ class Status extends FHCAPI_Controller ) { if ($isBerechtigtNoStudstatusCheck) return true; // Skip if access right says so - if (!$status_kurzbz || !$datum || !$studiensemester_kurzbz || !$ausbildungssemester) + if (!$status_kurzbz || !$datum || !$studiensemester_kurzbz || !isset($ausbildungssemester) || $ausbildungssemester === '') return true; // Error will be handled by the required statements above $result = $this->prestudentstatuschecklib->checkStatusHistoryUnterbrechersemester( @@ -995,7 +994,7 @@ class Status extends FHCAPI_Controller ) { if ($isBerechtigtNoStudstatusCheck) return true; // Skip if access right says so - if (!$status_kurzbz || !$datum || !$studiensemester_kurzbz || !$ausbildungssemester) + if (!$status_kurzbz || !$datum || !$studiensemester_kurzbz || !isset($ausbildungssemester) || $ausbildungssemester === '') return true; // Error will be handled by the required statements above $result = $this->prestudentstatuschecklib->checkStatusHistoryAbbrechersemester( @@ -1020,7 +1019,7 @@ class Status extends FHCAPI_Controller ) { if ($isBerechtigtNoStudstatusCheck) return true; // Skip if access right says so - if (!$status_kurzbz || !$datum || !$studiensemester_kurzbz || !$ausbildungssemester) + if (!$status_kurzbz || !$datum || !$studiensemester_kurzbz || !isset($ausbildungssemester) || $ausbildungssemester === '') return true; // Error will be handled by the required statements above $result = $this->prestudentstatuschecklib->checkStatusHistoryDiplomant( diff --git a/application/controllers/api/frontend/v1/stv/Student.php b/application/controllers/api/frontend/v1/stv/Student.php index 031b24670..ad6883f94 100644 --- a/application/controllers/api/frontend/v1/stv/Student.php +++ b/application/controllers/api/frontend/v1/stv/Student.php @@ -36,6 +36,7 @@ class Student extends FHCAPI_Controller parent::__construct([ 'get' => ['admin:r', 'assistenz:r'], 'save' => ['admin:rw', 'assistenz:rw'], + 'saveStudent' => ['admin:rw', 'assistenz:rw'], 'getPerson' => ['admin:rw', 'assistenz:rw'], 'add' => ['admin:rw', 'assistenz:rw'] // TODO(chris): extra permissions ]); @@ -116,11 +117,23 @@ class Student extends FHCAPI_Controller WHERE kontakttyp='email' AND person_id=p.person_id AND zustellung - ORDER BY kontakt_id + ORDER BY kontakt_id DESC LIMIT 1 ) AS email_privat", false ); + $this->PrestudentModel->addSelect( + "( + SELECT kontakt + FROM public.tbl_kontakt + WHERE kontakttyp='email_unverifiziert' + AND person_id=p.person_id + AND zustellung + ORDER BY kontakt_id DESC + LIMIT 1 + ) AS email_privat_unverified", + false + ); } $this->PrestudentModel->addSelect( "( @@ -423,6 +436,31 @@ class Student extends FHCAPI_Controller ), '')); } + /** + * Saves data to a prestudent using their student_uid + * + * @param string $student_uid + * @param string $studiensemester_kurzbz + * @return void + */ + public function saveStudent($student_uid, $studiensemester_kurzbz) + { + $this->load->model('crm/Student_model', 'StudentModel'); + + $result = $this->StudentModel->load([$student_uid]); + + $data = $this->getDataOrTerminateWithError($result); + + if (!$data) + show_404(); // No Student with that ID + + $student = current($data); + + $this->checkPermissionsForPrestudent($student->prestudent_id, ['admin:rw', 'assistenz:rw']); + + return $this->save($student->prestudent_id, $studiensemester_kurzbz); + } + public function getPerson() { $this->load->library('form_validation'); diff --git a/application/controllers/api/frontend/v1/stv/Students.php b/application/controllers/api/frontend/v1/stv/Students.php index 9de0c29b1..9dbea65f2 100644 --- a/application/controllers/api/frontend/v1/stv/Students.php +++ b/application/controllers/api/frontend/v1/stv/Students.php @@ -44,14 +44,12 @@ class Students extends FHCAPI_Controller } // Load Libraries - $this->load->library('VariableLib', ['uid' => getAuthUID()]); $this->load->library('PhrasesLib'); $this->loadPhrases( array( 'lehre' ) ); - } /** @@ -75,7 +73,7 @@ class Students extends FHCAPI_Controller * /(studiengang_kz)/(orgform)/prestudent/(studiensemester_kurzbz)/(filter) => getPrestudentsOrgform * /(studiengang_kz)/(orgform)/prestudent/(studiensemester_kurzbz)/(filter)/(otherfilter) => getPrestudentsOrgform * - * /(studiensemester_kurzbz)/(studiengang_kz)/(semester)/grp/(gruppe) => getStudentsSpezialguppe + * /(studiensemester_kurzbz)/(studiengang_kz)/(semester)/grp/(gruppe) => getStudentsSpezialgruppe * * /(studiensemester_kurzbz)/(studiengang_kz) => getStudents * /(studiensemester_kurzbz)/(studiengang_kz)/(semester) => getStudents @@ -101,39 +99,183 @@ class Students extends FHCAPI_Controller } /** + * @param string $studiensemester_kurzbz + * * @return void */ - public function getIncoming() + public function getIncoming($studiensemester_kurzbz) { $this->addMeta('ci_method', __FUNCTION__); - // TODO(chris): IMPLEMENT! - $this->terminateWithSuccess([]); + $this->addMeta('ci_params', [ + 'studiensemester_kurzbz' => $studiensemester_kurzbz + ]); + + + $this->load->model('crm/Prestudent_model', 'PrestudentModel'); + + + $this->PrestudentModel->addJoin( + "( + SELECT prestudent_id + FROM public.tbl_prestudentstatus + WHERE status_kurzbz = 'Incoming' + AND studiensemester_kurzbz = " . $this->PrestudentModel->escape($studiensemester_kurzbz) . " + ) test", + "prestudent_id" + ); + + + $this->prepareQuery($studiensemester_kurzbz); + + $this->PrestudentModel->addSelect("COALESCE( + v.semester::text, + CASE + WHEN pls.status_kurzbz IN ('Aufgenommener', 'Bewerber', 'Wartender', 'interessent') + THEN pls.ausbildungssemester::text + ELSE ''::text + END + ) AS semester", false); + $this->PrestudentModel->addSelect("COALESCE(v.verband::text, ''::text)"); + $this->PrestudentModel->addSelect("COALESCE(v.gruppe::text, ''::text)"); + + $this->addSelectPrioRel(); + + $this->addFilter($studiensemester_kurzbz); + + + $result = $this->PrestudentModel->load(); + + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); } /** + * @param string $studiensemester_kurzbz + * * @return void */ - public function getOutgoing() + public function getOutgoing($studiensemester_kurzbz) { $this->addMeta('ci_method', __FUNCTION__); - // TODO(chris): IMPLEMENT! - $this->terminateWithSuccess([]); + $this->addMeta('ci_params', [ + 'studiensemester_kurzbz' => $studiensemester_kurzbz + ]); + + + $this->load->model('crm/Prestudent_model', 'PrestudentModel'); + + + $this->PrestudentModel->addJoin( + "( + SELECT prestudent_id + FROM bis.tbl_bisio bis + JOIN public.tbl_student USING (student_uid) + JOIN public.tbl_studiensemester stdsem ON ( + (bis.von >= stdsem.start AND bis.von <= stdsem.ende) + OR + (bis.bis >= stdsem.start AND bis.bis <= stdsem.ende) + OR + (bis.von <= stdsem.start AND bis.bis >= stdsem.ende) + ) + WHERE NOT EXISTS ( + SELECT 1 + FROM public.tbl_prestudentstatus + WHERE status_kurzbz = 'Incoming' + AND prestudent_id = tbl_student.prestudent_id + ) AND stdsem.studiensemester_kurzbz = " . $this->PrestudentModel->escape($studiensemester_kurzbz) . " + GROUP BY prestudent_id + ) test", + "prestudent_id" + ); + + + $this->prepareQuery($studiensemester_kurzbz); + + + $this->PrestudentModel->addSelect("COALESCE( + v.semester::text, + CASE + WHEN pls.status_kurzbz IN ('Aufgenommener', 'Bewerber', 'Wartender', 'interessent') + THEN pls.ausbildungssemester::text + ELSE ''::text + END + ) AS semester", false); + $this->PrestudentModel->addSelect("COALESCE(v.verband::text, ''::text)"); + $this->PrestudentModel->addSelect("COALESCE(v.gruppe::text, ''::text)"); + + $this->addSelectPrioRel(); + + $this->addFilter($studiensemester_kurzbz); + + + $result = $this->PrestudentModel->load(); + + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); } /** + * @param string $studiensemester_kurzbz + * * @return void */ - public function getGemeinsamestudien() + public function getGemeinsamestudien($studiensemester_kurzbz) { $this->addMeta('ci_method', __FUNCTION__); - // TODO(chris): IMPLEMENT! - $this->terminateWithSuccess([]); + $this->addMeta('ci_params', [ + 'studiensemester_kurzbz' => $studiensemester_kurzbz + ]); + + + $this->load->model('crm/Prestudent_model', 'PrestudentModel'); + + + $this->PrestudentModel->addJoin( + "( + SELECT prestudent_id + FROM bis.tbl_mobilitaet + WHERE studiensemester_kurzbz = " . $this->PrestudentModel->escape($studiensemester_kurzbz) . " + ) bis", + "prestudent_id" + ); + + + $this->prepareQuery($studiensemester_kurzbz); + + + $this->PrestudentModel->addSelect("COALESCE( + v.semester::text, + CASE + WHEN pls.status_kurzbz IN ('Aufgenommener', 'Bewerber', 'Wartender', 'interessent') + THEN pls.ausbildungssemester::text + ELSE ''::text + END + ) AS semester", false); + $this->PrestudentModel->addSelect("COALESCE(v.verband::text, ''::text)"); + $this->PrestudentModel->addSelect("COALESCE(v.gruppe::text, ''::text)"); + + $this->addSelectPrioRel(); + + $this->addFilter($studiensemester_kurzbz); + + + $result = $this->PrestudentModel->load(); + + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); } - public function getPrestudents($studiengang_kz, - $studiensemester_kurzbz = null, $filter = null - ) - { + public function getPrestudents( + $studiengang_kz, + $studiensemester_kurzbz = null, + $filter = null + ) { $this->addMeta('ci_method', __FUNCTION__); $this->addMeta('ci_params', array( 'studiengang_kz' => $studiengang_kz, @@ -144,10 +286,12 @@ class Students extends FHCAPI_Controller $this->fetchPrestudents($studiengang_kz, $studiensemester_kurzbz, $filter); } - public function getPrestudentsOrgform($studiengang_kz, $orgform_kurzbz, - $studiensemester_kurzbz = null, $filter = null - ) - { + public function getPrestudentsOrgform( + $studiengang_kz, + $orgform_kurzbz, + $studiensemester_kurzbz = null, + $filter = null + ) { $this->addMeta('ci_method', __FUNCTION__); $this->addMeta('ci_params', array( 'studiengang_kz' => $studiengang_kz, @@ -227,7 +371,7 @@ class Students extends FHCAPI_Controller $stg = $this->getDataOrTerminateWithError($result); if (!$stg) - $this->terminateWithValidationErrors(['' => 'Studiengang does not exist']); // TODO(chris): phrase + $this->terminateWithSuccess([]); $stg = current($stg); $where['ps.status_kurzbz'] = 'Interessent'; @@ -296,7 +440,10 @@ class Students extends FHCAPI_Controller break; default: if (!$studiensemester_kurzbz) { - // TODO(chris): this does not work with $orgform_kurzbz != null + /** NOTE(chris): + * show all prestudents in this stg who don't have a status + * $orgform_kurzbz does not change the results since orgform is stored in the status table + */ $where['ps.status_kurzbz'] = null; } else { $this->PrestudentModel->db->where_in('ps.status_kurzbz', [ @@ -310,42 +457,18 @@ class Students extends FHCAPI_Controller break; } - /* - $this->PrestudentModel->addJoin('public.tbl_studiengang stg', 'studiengang_kz', 'LEFT'); - $this->PrestudentModel->addJoin('public.tbl_person p', 'person_id'); - $this->PrestudentModel->addJoin('public.tbl_prestudentstatus pls', ' - pls.status_kurzbz=public.get_rolle_prestudent(tbl_prestudent.prestudent_id, NULL) - AND pls.prestudent_id=tbl_prestudent.prestudent_id - AND pls.studiensemester_kurzbz=public.get_stdsem_prestudent(tbl_prestudent.prestudent_id, NULL) - AND pls.ausbildungssemester=public.get_absem_prestudent(tbl_prestudent.prestudent_id, NULL)', 'LEFT'); - $this->PrestudentModel->addJoin('lehre.tbl_studienplan sp', 'studienplan_id', 'LEFT'); - $this->PrestudentModel->addJoin('public.tbl_prestudentstatus ps', ' - ps.status_kurzbz=public.get_rolle_prestudent(tbl_prestudent.prestudent_id, ' . $stdsemEsc . ') - AND ps.prestudent_id=tbl_prestudent.prestudent_id - AND ps.studiensemester_kurzbz=public.get_stdsem_prestudent(tbl_prestudent.prestudent_id, ' . $stdsemEsc . ') - AND ps.ausbildungssemester=public.get_absem_prestudent(tbl_prestudent.prestudent_id, ' . $stdsemEsc . ')', 'LEFT');*/ $this->prepareQuery($studiensemester_kurzbz); $this->PrestudentModel->addSelect(" - CASE WHEN ps.status_kurzbz IN ('Aufgenommener', 'Bewerber', 'Wartender', 'interessent') - THEN ps.ausbildungssemester::text - ELSE ''::text END AS semester", false); + CASE + WHEN pls.status_kurzbz IN ('Aufgenommener', 'Bewerber', 'Wartender', 'interessent') + THEN ps.ausbildungssemester::text + ELSE ''::text + END AS semester", false); $this->PrestudentModel->addSelect("'' AS verband"); $this->PrestudentModel->addSelect("'' AS gruppe"); $this->addSelectPrioRel(); - //add status per semester - $this->PrestudentModel->addSelect( - "( - SELECT status_kurzbz - FROM public.tbl_prestudentstatus pss - WHERE pss.prestudent_id = public.tbl_prestudent.prestudent_id - AND pss.studiensemester_kurzbz = " . $this->PrestudentModel->escape($studiensemester_kurzbz) . " - ORDER BY GREATEST(pss.datum, '0001-01-01') DESC - LIMIT 1 - ) AS statusofsemester" - ); - $this->addFilter($studiensemester_kurzbz); $result = $this->PrestudentModel->loadWhere($where); @@ -355,10 +478,13 @@ class Students extends FHCAPI_Controller $this->terminateWithSuccess($data); } - public function getStudents($studiensemester_kurzbz, - $studiengang_kz, $semester = null, $verband = null, $gruppe = null - ) - { + public function getStudents( + $studiensemester_kurzbz, + $studiengang_kz, + $semester = null, + $verband = null, + $gruppe = null + ) { $this->addMeta('ci_method', __FUNCTION__); $this->addMeta('ci_params', array( 'studiensemester_kurzbz' => $studiensemester_kurzbz, @@ -371,10 +497,14 @@ class Students extends FHCAPI_Controller $this->fetchStudents($studiensemester_kurzbz, $studiengang_kz, $semester, $verband, $gruppe, null, null); } - public function getStudentsOrgform($studiensemester_kurzbz, - $studiengang_kz, $orgform_kurzbz, $semester = null, $verband = null, $gruppe = null - ) - { + public function getStudentsOrgform( + $studiensemester_kurzbz, + $studiengang_kz, + $orgform_kurzbz, + $semester = null, + $verband = null, + $gruppe = null + ) { $this->addMeta('ci_method', __FUNCTION__); $this->addMeta('ci_params', array( 'studiensemester_kurzbz' => $studiensemester_kurzbz, @@ -388,10 +518,12 @@ class Students extends FHCAPI_Controller $this->fetchStudents($studiensemester_kurzbz, $studiengang_kz, $semester, $verband, $gruppe, null, $orgform_kurzbz); } - public function getStudentsSpezialgruppe($studiensemester_kurzbz, - $studiengang_kz, $semester, $gruppe_kurzbz, - $orgform_kurzbz = null) - { + public function getStudentsSpezialgruppe( + $studiensemester_kurzbz, + $studiengang_kz, + $semester, + $gruppe_kurzbz + ) { $this->addMeta('ci_method', __FUNCTION__); $this->addMeta('ci_params', array( 'studiensemester_kurzbz' => $studiensemester_kurzbz, @@ -403,10 +535,13 @@ class Students extends FHCAPI_Controller $this->fetchStudents($studiensemester_kurzbz, $studiengang_kz, $semester, null, null, $gruppe_kurzbz, null); } - public function getStudentsOrgformSpezialgruppe($studiensemester_kurzbz, - $orgform_kurzbz, $studiengang_kz, $semester, $gruppe_kurzbz - ) - { + public function getStudentsOrgformSpezialgruppe( + $studiensemester_kurzbz, + $orgform_kurzbz, + $studiengang_kz, + $semester, + $gruppe_kurzbz + ) { $this->addMeta('ci_method', __FUNCTION__); $this->addMeta('ci_params', array( 'studiensemester_kurzbz' => $studiensemester_kurzbz, @@ -430,8 +565,15 @@ class Students extends FHCAPI_Controller * * @return void */ - protected function fetchStudents($studiensemester_kurzbz, $studiengang_kz, $semester = null, $verband = null, $gruppe = null, $gruppe_kurzbz = null, $orgform_kurzbz = null) - { + protected function fetchStudents( + $studiensemester_kurzbz, + $studiengang_kz, + $semester = null, + $verband = null, + $gruppe = null, + $gruppe_kurzbz = null, + $orgform_kurzbz = null + ) { $this->load->model('crm/Prestudent_model', 'PrestudentModel'); $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel'); @@ -440,21 +582,6 @@ class Students extends FHCAPI_Controller $this->terminateWithError($studiensemester_kurzbz . ' - ' . $this->p->t('lehre', 'error_noStudiensemester')); } - /* - $this->PrestudentModel->addJoin('public.tbl_studiengang stg', 'studiengang_kz', 'LEFT'); - $this->PrestudentModel->addJoin('public.tbl_person p', 'person_id'); - $this->PrestudentModel->addJoin('public.tbl_student s', 'prestudent_id'); - $this->PrestudentModel->addJoin('public.tbl_prestudentstatus pls', ' - pls.status_kurzbz=public.get_rolle_prestudent(tbl_prestudent.prestudent_id, NULL) - AND pls.prestudent_id=tbl_prestudent.prestudent_id - AND pls.studiensemester_kurzbz=public.get_stdsem_prestudent(tbl_prestudent.prestudent_id, NULL) - AND pls.ausbildungssemester=public.get_absem_prestudent(tbl_prestudent.prestudent_id, NULL)', 'LEFT'); - $this->PrestudentModel->addJoin('lehre.tbl_studienplan sp', 'studienplan_id', 'LEFT'); - $this->PrestudentModel->addJoin('public.tbl_benutzer b', 's.student_uid=b.uid'); - $this->PrestudentModel->addJoin( - 'public.tbl_studentlehrverband v', - 'v.student_uid=s.student_uid AND v.studiensemester_kurzbz=' . $this->PrestudentModel->escape($studiensemester_kurzbz) - );*/ $this->prepareQuery($studiensemester_kurzbz, ''); $this->PrestudentModel->addSelect('v.semester'); @@ -462,18 +589,6 @@ class Students extends FHCAPI_Controller $this->PrestudentModel->addSelect('v.gruppe'); $this->PrestudentModel->addSelect("'' AS priorisierung_relativ"); - //add status per semester - $this->PrestudentModel->addSelect( - "( - SELECT status_kurzbz - FROM public.tbl_prestudentstatus pss - WHERE pss.prestudent_id = public.tbl_prestudent.prestudent_id - AND pss.studiensemester_kurzbz = " . $this->PrestudentModel->escape($studiensemester_kurzbz) . " - ORDER BY GREATEST(pss.datum, '0001-01-01') DESC - LIMIT 1 - ) AS statusofsemester" - ); - $where = []; @@ -506,7 +621,6 @@ class Students extends FHCAPI_Controller false ); } - } $this->addFilter($studiensemester_kurzbz); @@ -540,39 +654,18 @@ class Students extends FHCAPI_Controller $this->load->model('crm/Prestudent_model', 'PrestudentModel'); - /* - $this->PrestudentModel->addJoin('public.tbl_studiengang stg', 'studiengang_kz', 'LEFT'); - $this->PrestudentModel->addJoin('public.tbl_person p', 'person_id'); - $this->PrestudentModel->addJoin('public.tbl_student s', 'prestudent_id', 'LEFT'); - $this->PrestudentModel->addJoin('public.tbl_prestudentstatus pls', ' - pls.status_kurzbz=public.get_rolle_prestudent(tbl_prestudent.prestudent_id, NULL) - AND pls.prestudent_id=tbl_prestudent.prestudent_id - AND pls.studiensemester_kurzbz=public.get_stdsem_prestudent(tbl_prestudent.prestudent_id, NULL) - AND pls.ausbildungssemester=public.get_absem_prestudent(tbl_prestudent.prestudent_id, NULL)', 'LEFT'); - $this->PrestudentModel->addJoin('lehre.tbl_studienplan sp', 'studienplan_id', 'LEFT'); - $this->PrestudentModel->addJoin('public.tbl_benutzer b', 's.student_uid=b.uid', 'LEFT'); - $this->PrestudentModel->addJoin( - 'public.tbl_studentlehrverband v', - 'v.student_uid=s.student_uid AND v.studiensemester_kurzbz=' . $this->PrestudentModel->escape($studiensemester_kurzbz), - 'LEFT' - );*/ $this->prepareQuery($studiensemester_kurzbz); - $this->PrestudentModel->addSelect("COALESCE(v.semester::text, CASE WHEN public.get_rolle_prestudent(tbl_prestudent.prestudent_id, NULL) IN ('Aufgenommener', 'Bewerber', 'Wartender', 'interessent') THEN public.get_absem_prestudent(tbl_prestudent.prestudent_id, NULL)::text ELSE ''::text END) AS semester", false); - $this->PrestudentModel->addSelect('v.verband'); - $this->PrestudentModel->addSelect('v.gruppe'); - - //add status per semester - $this->PrestudentModel->addSelect( - "( - SELECT status_kurzbz - FROM public.tbl_prestudentstatus pss - WHERE pss.prestudent_id = public.tbl_prestudent.prestudent_id - AND pss.studiensemester_kurzbz = " . $this->PrestudentModel->escape($studiensemester_kurzbz) . " - ORDER BY GREATEST(pss.datum, '0001-01-01') DESC - LIMIT 1 - ) AS statusofsemester" - ); + $this->PrestudentModel->addSelect("COALESCE( + v.semester::text, + CASE + WHEN pls.status_kurzbz IN ('Aufgenommener', 'Bewerber', 'Wartender', 'interessent') + THEN pls.ausbildungssemester::text + ELSE ''::text + END + ) AS semester", false); + $this->PrestudentModel->addSelect("COALESCE(v.verband::text, ''::text)"); + $this->PrestudentModel->addSelect("COALESCE(v.gruppe::text, ''::text)"); $this->addSelectPrioRel(); @@ -609,40 +702,12 @@ class Students extends FHCAPI_Controller $this->load->model('crm/Prestudent_model', 'PrestudentModel'); - /* - $this->PrestudentModel->addJoin('public.tbl_studiengang stg', 'studiengang_kz', 'LEFT'); - $this->PrestudentModel->addJoin('public.tbl_person p', 'person_id'); - $this->PrestudentModel->addJoin('public.tbl_student s', 'prestudent_id'); - $this->PrestudentModel->addJoin('public.tbl_prestudentstatus pls', ' - pls.status_kurzbz=public.get_rolle_prestudent(tbl_prestudent.prestudent_id, NULL) - AND pls.prestudent_id=tbl_prestudent.prestudent_id - AND pls.studiensemester_kurzbz=public.get_stdsem_prestudent(tbl_prestudent.prestudent_id, NULL) - AND pls.ausbildungssemester=public.get_absem_prestudent(tbl_prestudent.prestudent_id, NULL)', 'LEFT'); - $this->PrestudentModel->addJoin('lehre.tbl_studienplan sp', 'studienplan_id', 'LEFT'); - $this->PrestudentModel->addJoin('public.tbl_benutzer b', 's.student_uid=b.uid'); - $this->PrestudentModel->addJoin( - 'public.tbl_studentlehrverband v', - 'v.student_uid=s.student_uid AND v.studiensemester_kurzbz=' . $this->PrestudentModel->escape($studiensemester_kurzbz), - 'LEFT' - );*/ $this->prepareQuery($studiensemester_kurzbz); $this->PrestudentModel->addSelect('v.semester'); $this->PrestudentModel->addSelect('v.verband'); $this->PrestudentModel->addSelect('v.gruppe'); - //add status per semester - $this->PrestudentModel->addSelect( - "( - SELECT status_kurzbz - FROM public.tbl_prestudentstatus pss - WHERE pss.prestudent_id = public.tbl_prestudent.prestudent_id - AND pss.studiensemester_kurzbz = " . $this->PrestudentModel->escape($studiensemester_kurzbz) . " - ORDER BY GREATEST(pss.datum, '0001-01-01') DESC - LIMIT 1 - ) AS statusofsemester" - ); - $this->addSelectPrioRel(); @@ -681,21 +746,59 @@ class Students extends FHCAPI_Controller $this->load->model('crm/Prestudent_model', 'PrestudentModel'); - /* - $this->PrestudentModel->addJoin('public.tbl_person p', 'person_id'); - $this->PrestudentModel->addJoin('public.tbl_student s', 'prestudent_id'); - $this->PrestudentModel->addJoin('public.tbl_benutzer b', 's.student_uid=b.uid'); - $this->PrestudentModel->addJoin( - 'public.tbl_studentlehrverband v', - 'v.student_uid=s.student_uid AND v.studiensemester_kurzbz=' . $this->PrestudentModel->escape($studiensemester_kurzbz), - 'LEFT' - );*/ $this->prepareQuery($studiensemester_kurzbz); $this->PrestudentModel->addSelect('v.semester'); $this->PrestudentModel->addSelect('v.verband'); $this->PrestudentModel->addSelect('v.gruppe'); + $this->addSelectPrioRel(); + + $this->addFilter($studiensemester_kurzbz); + + $result = $this->PrestudentModel->loadWhere([ + 'p.person_id' => $person_id + ]); + + $data = $this->getDataOrTerminateWithError($result); + + $this->terminateWithSuccess($data); + } + + /** + * @param string $studiensemester_kurzbz + * + * @return void + */ + public function search($studiensemester_kurzbz) + { + $this->addMeta('ci_method', __FUNCTION__); + $this->addMeta('ci_params', array( + 'studiensemester_kurzbz' => $studiensemester_kurzbz + )); + + $this->load->library('SearchLib', [ 'config' => 'searchstv' ]); + $this->load->library('form_validation'); + + $this->form_validation->set_rules('searchstr', 'searchstr', 'required'); + $this->form_validation->set_rules('types[]', 'types', 'required'); + + if (!$this->form_validation->run()) + $this->terminateWithValidationErrors($this->form_validation->error_array()); + + $result = $this->searchlib->search($this->input->post('searchstr'), $this->input->post('types')); + + $data = $this->getDataOrTerminateWithError($result); + + + $this->load->model('crm/Prestudent_model', 'PrestudentModel'); + + $this->prepareQuery($studiensemester_kurzbz); + + $this->PrestudentModel->addSelect("COALESCE(v.semester::text, CASE WHEN public.get_rolle_prestudent(tbl_prestudent.prestudent_id, NULL) IN ('Aufgenommener', 'Bewerber', 'Wartender', 'interessent') THEN public.get_absem_prestudent(tbl_prestudent.prestudent_id, NULL)::text ELSE ''::text END) AS semester", false); + $this->PrestudentModel->addSelect('v.verband'); + $this->PrestudentModel->addSelect('v.gruppe'); + //add status per semester $this->PrestudentModel->addSelect( "( @@ -712,10 +815,31 @@ class Students extends FHCAPI_Controller $this->addFilter($studiensemester_kurzbz); - $result = $this->PrestudentModel->loadWhere([ - 'p.person_id' => $person_id - ]); - + $prestudent_ids = []; + $student_uids = []; + $this->addMeta('data', $data); + foreach ($data as $row) { + $dataset = json_decode($row->data); + if ($row->type == 'prestudent') { + $prestudent_ids[] = $dataset->prestudent_id; + } elseif ($row->type == 'student') { + $student_uids[] = $dataset->uid; + } + } + + if ($prestudent_ids && $student_uids) { + $this->PrestudentModel->db->where_in('tbl_prestudent.prestudent_id', $prestudent_ids); + $this->PrestudentModel->db->or_where_in('s.student_uid', $student_uids); + } elseif ($prestudent_ids) { + $this->PrestudentModel->db->where_in('tbl_prestudent.prestudent_id', $prestudent_ids); + } elseif ($student_uids) { + $this->PrestudentModel->db->where_in('s.student_uid', $student_uids); + } else { + $this->terminateWithSuccess([]); + } + + $result = $this->PrestudentModel->load(); + $data = $this->getDataOrTerminateWithError($result); $this->terminateWithSuccess($data); @@ -771,6 +895,18 @@ class Students extends FHCAPI_Controller // verband // gruppe + //add status per semester + $this->PrestudentModel->addSelect( + "( + SELECT status_kurzbz + FROM public.tbl_prestudentstatus pss + WHERE pss.prestudent_id = public.tbl_prestudent.prestudent_id + AND pss.studiensemester_kurzbz = " . $this->PrestudentModel->escape($studiensemester_kurzbz) . " + ORDER BY GREATEST(pss.datum, '0001-01-01') DESC + LIMIT 1 + ) AS statusofsemester" + ); + $this->PrestudentModel->addSelect('UPPER(stg.typ || stg.kurzbz) AS studiengang'); $this->PrestudentModel->addSelect('tbl_prestudent.studiengang_kz'); $this->PrestudentModel->addSelect('stg.bezeichnung AS stg_bezeichnung'); @@ -806,13 +942,6 @@ class Students extends FHCAPI_Controller $this->PrestudentModel->addSelect('mentor'); $this->PrestudentModel->addSelect('b.aktiv AS bnaktiv'); - /*$this->PrestudentModel->addSelect('tbl_prestudent.reihungstest_id'); - $this->PrestudentModel->addSelect('tbl_prestudent.anmeldungreihungstest'); - $this->PrestudentModel->addSelect('tbl_prestudent.gsstudientyp_kurzbz'); - $this->PrestudentModel->addSelect('tbl_prestudent.priorisierung'); - $this->PrestudentModel->addSelect('p.zugangscode'); - $this->PrestudentModel->addSelect('p.bpk');*/ - $this->PrestudentModel->db->where_in('tbl_prestudent.studiengang_kz', $this->allowedStgs); $this->PrestudentModel->addOrder('nachname'); @@ -827,13 +956,13 @@ class Students extends FHCAPI_Controller $this->PrestudentModel->addSelect("( SELECT count(*) FROM ( - SELECT *, public.get_rolle_prestudent(tbl_prestudent.prestudent_id, NULL) AS laststatus - FROM PUBLIC.tbl_prestudent pss - JOIN PUBLIC.tbl_prestudentstatus USING (prestudent_id) + SELECT *, public.get_rolle_prestudent(pss.prestudent_id, NULL) AS laststatus + FROM public.tbl_prestudent pss + JOIN public.tbl_prestudentstatus USING (prestudent_id) WHERE person_id = p.person_id AND studiensemester_kurzbz = ( SELECT studiensemester_kurzbz - FROM PUBLIC.tbl_prestudentstatus + FROM public.tbl_prestudentstatus WHERE prestudent_id = tbl_prestudent.prestudent_id AND status_kurzbz = 'Interessent' LIMIT 1 @@ -842,7 +971,7 @@ class Students extends FHCAPI_Controller ) prest WHERE laststatus NOT IN ('Abbrecher', 'Abgewiesener', 'Absolvent') AND priorisierung <= tbl_prestudent.priorisierung - ) || ' (' || tbl_prestudent.priorisierung || ')' AS priorisierung_relativ", false); + ) || ' (' || COALESCE(tbl_prestudent.priorisierung::text, ' '::text) || ')' AS priorisierung_relativ", false); } /** @@ -854,40 +983,20 @@ class Students extends FHCAPI_Controller */ protected function addFilter($studiensemester_kurzbz) { - $filter = json_decode($this->input->get('filter'), true); + $filter = $this->input->post('filter'); + if (!is_array($filter)) { - $this->addMeta('addfilter', 'invalid filter: ' . $this->input->get('filter')); + $this->addMeta('addfilter', 'invalid filter: ' . json_encode($this->input->post('filter'))); return; } - if (isset($filter['konto_count_0'])) { - $bt = $this->PrestudentModel->escape($filter['konto_count_0']); - $stdsem = $this->PrestudentModel->escape($studiensemester_kurzbz); - - $this->PrestudentModel->db->where('( - SELECT count(*) - FROM public.tbl_konto - WHERE person_id=tbl_prestudent.person_id - AND buchungstyp_kurzbz=' . $bt . ' - AND studiensemester_kurzbz=' . $stdsem . ' - ) =', 0); - $this->PrestudentModel->db->where('get_rolle_prestudent(tbl_prestudent.prestudent_id, NULL) !=', 'Incoming'); - } - if (isset($filter['konto_missing_counter'])) { - $bt = $this->PrestudentModel->escape($filter['konto_missing_counter']); - $stg = ''; - if ($this->variablelib->getVar('kontofilterstg') == 'true') - $stg = ' AND studiengang_kz=tbl_prestudent.studiengang_kz'; - - $bt = $bt == 'alle' ? '' : ' AND buchungstyp_kurzbz=' . $bt; - - $this->PrestudentModel->db->where('( - SELECT sum(betrag) - FROM public.tbl_konto - WHERE person_id=tbl_prestudent.person_id' . - $bt . - $stg . ' - ) !=', 0); + foreach ($filter as $item) { + if (isset($item['usestdsem']) && $item['usestdsem']) + $item['studiensemester_kurzbz'] = $studiensemester_kurzbz; + if (!$this->PrestudentModel->addFilter($item)) { + $this->addMeta('addfilter', 'invalid filter: ' . json_encode($item)); + return; + } } } } diff --git a/application/controllers/api/frontend/v1/stv/Verband.php b/application/controllers/api/frontend/v1/stv/Verband.php index 6487b6263..eb25a548b 100644 --- a/application/controllers/api/frontend/v1/stv/Verband.php +++ b/application/controllers/api/frontend/v1/stv/Verband.php @@ -165,7 +165,17 @@ class Verband extends FHCAPI_Controller $this->StudiengangModel->addDistinct(); $this->StudiengangModel->addSelect("CONCAT(" . $this->StudiengangModel->escape($link) . ", semester) AS link", false); - $this->StudiengangModel->addSelect("CONCAT(UPPER(CONCAT(typ, kurzbz)), '-', semester, (SELECT CASE WHEN bezeichnung IS NULL OR bezeichnung='' THEN ''::TEXT ELSE CONCAT(' (', bezeichnung, ')') END FROM public.tbl_lehrverband WHERE studiengang_kz=v.studiengang_kz AND semester=v.semester ORDER BY verband, gruppe LIMIT 1)) AS name", false); + $this->StudiengangModel->addSelect("CONCAT( + UPPER(CONCAT(typ, kurzbz)), + '-', + semester, + ( + SELECT CASE WHEN bezeichnung IS NULL OR bezeichnung='' THEN ''::TEXT ELSE CONCAT(' (', bezeichnung, ')') END + FROM public.tbl_lehrverband + WHERE studiengang_kz=v.studiengang_kz AND semester=v.semester + ORDER BY verband, gruppe LIMIT 1 + ) + ) AS name", false); $this->StudiengangModel->addSelect('semester'); $this->StudiengangModel->addSelect($this->StudiengangModel->escape($studiengang_kz) . '::integer AS stg_kz', false); @@ -173,6 +183,7 @@ class Verband extends FHCAPI_Controller $this->StudiengangModel->addOrder('semester'); if ($org_form !== null) { + $this->StudiengangModel->addSelect("v.orgform_kurzbz"); $this->StudiengangModel->db->group_start(); $this->StudiengangModel->db->where('v.semester', 0); $this->StudiengangModel->db->or_where('v.orgform_kurzbz', $org_form); @@ -188,6 +199,7 @@ class Verband extends FHCAPI_Controller array_unshift($list, [ 'name' => 'PreStudent', 'link' => $link . 'prestudent', + 'no_sem_reload' => true, 'stg_kz' => (int)$studiengang_kz, 'children' => $this->getStdSem($link . 'prestudent/', $studiengang_kz) ]); @@ -216,7 +228,6 @@ class Verband extends FHCAPI_Controller $list = array_merge($list, $result); } } - } $this->terminateWithSuccess($list); } @@ -272,6 +283,7 @@ class Verband extends FHCAPI_Controller $this->StudiengangModel->addSelect("CONCAT(UPPER(CONCAT(typ, kurzbz)), '-', semester, verband, (SELECT CASE WHEN bezeichnung IS NULL OR bezeichnung='' THEN ''::TEXT ELSE CONCAT(' (', bezeichnung, ')') END FROM public.tbl_lehrverband WHERE studiengang_kz=v.studiengang_kz AND semester=v.semester AND verband=v.verband ORDER BY gruppe LIMIT 1)) AS name", false); $this->StudiengangModel->addSelect("CASE WHEN MAX(gruppe)='' OR MAX(gruppe)=' ' THEN TRUE ELSE FALSE END AS leaf"); + $this->StudiengangModel->addSelect($this->StudiengangModel->escape($semester) . ' AS semester'); $this->StudiengangModel->addSelect('verband'); $this->StudiengangModel->addSelect($this->StudiengangModel->escape($studiengang_kz) . '::integer AS stg_kz', false); @@ -320,6 +332,8 @@ class Verband extends FHCAPI_Controller $this->StudiengangModel->addSelect("CONCAT(UPPER(CONCAT(typ, kurzbz)), '-', semester, verband, gruppe, (SELECT CASE WHEN bezeichnung IS NULL OR bezeichnung='' THEN ''::TEXT ELSE CONCAT(' (', bezeichnung, ')') END FROM public.tbl_lehrverband WHERE studiengang_kz=v.studiengang_kz AND semester=v.semester AND verband=v.verband AND gruppe=v.gruppe ORDER BY gruppe LIMIT 1)) AS name", false); $this->StudiengangModel->addSelect("TRUE AS leaf", false); + $this->StudiengangModel->addSelect('v.semester'); + $this->StudiengangModel->addSelect('v.verband'); $this->StudiengangModel->addSelect('gruppe'); $this->StudiengangModel->addSelect($this->StudiengangModel->escape($studiengang_kz) . '::integer AS stg_kz', false); diff --git a/application/controllers/api/frontend/v1/vorlagen/Vorlagen.php b/application/controllers/api/frontend/v1/vorlagen/Vorlagen.php index 01edb33d1..cf76746ef 100644 --- a/application/controllers/api/frontend/v1/vorlagen/Vorlagen.php +++ b/application/controllers/api/frontend/v1/vorlagen/Vorlagen.php @@ -51,13 +51,17 @@ class Vorlagen extends FHCAPI_Controller $this->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel'); $result = $this->BenutzerfunktionModel->getBenutzerfunktionByUid($uid, 'oezuordnung'); - $data = $this->getDataOrTerminateWithError($result); - $oe_kurzbz = current($data); + if (hasData($result)) + { + $data = getData($result); - $result = $this->VorlageModel->getAllVorlagenByOe($oe_kurzbz->oe_kurzbz); - $data = $this->getDataOrTerminateWithError($result); + $oe_kurzbz = array_column($data, 'oe_kurzbz'); + $result = $this->VorlageModel->getAllVorlagenByOe($oe_kurzbz); + + $this->terminateWithSuccess(hasData($result) ? getData($result) : array()); + } + $this->terminateWithSuccess(array()); - $this->terminateWithSuccess($data); } } \ No newline at end of file diff --git a/application/controllers/api/v1/person/Person.php b/application/controllers/api/v1/person/Person.php index 6a373137f..935fbae62 100644 --- a/application/controllers/api/v1/person/Person.php +++ b/application/controllers/api/v1/person/Person.php @@ -233,10 +233,10 @@ class Person extends API_Controller //Quersumme bilden for ($i = 0; $i < 10; $i++) { - $erg += $gewichtung[$i] * $tmpSvnr{$i}; + $erg += $gewichtung[$i] * $tmpSvnr[$i]; } - if ($tmpSvnr{3} != ($erg % 11)) //Vergleichen der Pruefziffer mit Quersumme Modulo 11 + if ($tmpSvnr[3] != ($erg % 11)) //Vergleichen der Pruefziffer mit Quersumme Modulo 11 { return error('SVNR ist ungueltig'); } @@ -244,7 +244,7 @@ class Person extends API_Controller if (mb_strlen($person['svnr']) == 12) { $last = substr($person['svnr'], 10, 12); - if ($last{0} != 'v' || !is_numeric($last{1})) + if ($last[0] != 'v' || !is_numeric($last[1])) { return error('SVNR ist ungueltig'); } diff --git a/application/controllers/system/infocenter/InfoCenter.php b/application/controllers/system/infocenter/InfoCenter.php index 1a4f566e6..eaa207ff1 100644 --- a/application/controllers/system/infocenter/InfoCenter.php +++ b/application/controllers/system/infocenter/InfoCenter.php @@ -22,6 +22,7 @@ class InfoCenter extends Auth_Controller const REIHUNGSTESTABSOLVIERT_PAGE = 'reihungstestAbsolviert'; const ABGEWIESEN_PAGE = 'abgewiesen'; const AUFGENOMMEN_PAGE = 'aufgenommen'; + const ONBOARDING_PAGE = 'onboarding'; const SHOW_DETAILS_PAGE = 'showDetails'; const SHOW_ZGV_DETAILS_PAGE = 'showZGVDetails'; const ZGV_UBERPRUEFUNG_PAGE = 'ZGVUeberpruefung'; @@ -116,6 +117,7 @@ class InfoCenter extends Auth_Controller 'index' => 'infocenter:r', 'freigegeben' => 'infocenter:r', 'abgewiesen' => 'infocenter:r', + 'onboarding' => 'infocenter:r', 'aufgenommen' => 'infocenter:r', 'reihungstestAbsolviert' => 'infocenter:r', 'showDetails' => 'infocenter:r', @@ -230,6 +232,13 @@ class InfoCenter extends Auth_Controller $this->load->view('system/infocenter/infocenterAbgewiesen.php'); } + + public function onboarding() + { + $this->_setNavigationMenu(self::ONBOARDING_PAGE); // define the navigation menu for this page + + $this->load->view('system/infocenter/onboarding.php'); + } /** * Aufgenommene page of the InfoCenter tool @@ -1553,6 +1562,7 @@ class InfoCenter extends Auth_Controller $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); + $onboardingLink = site_url(self::INFOCENTER_URI.'/'.self::ONBOARDING_PAGE); $currentFilterId = $this->input->get(self::FILTER_ID); if (isset($currentFilterId)) @@ -1561,6 +1571,7 @@ class InfoCenter extends Auth_Controller $reihungstestAbsolviertLink .= '?'.self::PREV_FILTER_ID.'='.$currentFilterId; $abgewiesenLink .= '?'.self::PREV_FILTER_ID.'='.$currentFilterId; $aufgenommenLink .= '?'.self::PREV_FILTER_ID.'='.$currentFilterId; + $onboardingLink .= '?'.self::PREV_FILTER_ID.'='.$currentFilterId; } $this->navigationlib->setSessionMenu( @@ -1624,6 +1635,18 @@ class InfoCenter extends Auth_Controller '', // target 40 // sort ), + 'ohnePrestudent' => $this->navigationlib->oneLevel( + 'Electronic Onboarding', // description + $onboardingLink, // link + null, // children + 'users', // icon + null, // subscriptDescription + false, // expand + null, // subscriptLinkClass + null, // subscriptLinkValue + '', // target + 50 // sort + ), ) ); } @@ -1650,6 +1673,8 @@ class InfoCenter extends Auth_Controller $link = site_url(self::ZGV_UEBERPRUEFUNG_URI); if ($origin_page === self::ABGEWIESEN_PAGE) $link = site_url(self::INFOCENTER_URI.'/'.self::ABGEWIESEN_PAGE); + if ($origin_page === self::ONBOARDING_PAGE) + $link = site_url(self::INFOCENTER_URI.'/'.self::ONBOARDING_PAGE); if ($origin_page === self::AUFGENOMMEN_PAGE) $link = site_url(self::INFOCENTER_URI.'/'.self::AUFGENOMMEN_PAGE); @@ -1691,6 +1716,7 @@ class InfoCenter extends Auth_Controller $freigegebenLink = site_url(self::INFOCENTER_URI.'/'.self::FREIGEGEBEN_PAGE); $absolviertLink = site_url(self::INFOCENTER_URI.'/'.self::REIHUNGSTESTABSOLVIERT_PAGE); $abgewiesenLink = site_url(self::INFOCENTER_URI.'/'.self::ABGEWIESEN_PAGE); + $onboardingLink = site_url(self::INFOCENTER_URI.'/'.self::ONBOARDING_PAGE); $prevFilterId = $this->input->get(self::PREV_FILTER_ID); if (isset($prevFilterId)) { @@ -1767,6 +1793,24 @@ class InfoCenter extends Auth_Controller ) ); } + if($page == self::ONBOARDING_PAGE) + { + $this->navigationlib->setSessionElementMenu( + 'onboarding', + $this->navigationlib->oneLevel( + 'Electronic Onboarding', // description + $onboardingLink, // link + null, // children + 'users', // icon + null, // subscriptDescription + false, // expand + null, // subscriptLinkClass + null, // subscriptLinkValue + '', // target + 50 // sort + ) + ); + } } /** diff --git a/application/helpers/hlp_common_helper.php b/application/helpers/hlp_common_helper.php index 00c0a1b93..b13d9d44d 100644 --- a/application/helpers/hlp_common_helper.php +++ b/application/helpers/hlp_common_helper.php @@ -515,3 +515,73 @@ function has_permissions_for_stg($studiengang_kz, $permissions = '') return false; } + +/** + * check if an entry exists in the database + */ +function is_in_db($key, $model = '') +{ + if (!$model) + return false; + + $field = strstr($model, ":"); + if ($field) { + $model = strstr($model, ":", true); + $field = substr($field, 1); + } + + $CI =& get_instance(); + $CI->load->model($model, $model); + + if ($field) { + $result = $CI->$model->loadWhere([ + $field => $key + ]); + } else { + $result = $CI->$model->load($key); + } + + return (isSuccess($result) && hasData($result)); +} + +/** + * is building an array for Dropdown Entry in Print Dropdown + * @param $id id for the Document to add to the Document Array + * @param $name title of the dropdownEntry + * @param $parameterUrl url of parameters xml, xsl, format etc as needed + * WITHOUT BASEURL eg. "xml=abschlusspruefung.rdf.php&xsl_stg_kz=$studiengang_kz&xsl=Bescheid&output=pdf" + * @param $uid default parameter, if null only parameterurl will be added + * additional needed parameter: put in the parameterUrl + * @param $alternativeBaseUrl: if baseUrl not pdfExport.php, put here alternative without ? char, eg. "zutrittskarte.php" + * + * @return Array + */ +function buildDropdownEntryPrintArray($id, $name, $parameterurl, $uid=null, $order=null, $alternativeBaseUrl=null) +{ + //DEFAULT BASEURL + $baseurl = "pdfExport.php?"; + + $uidString = $uid ? "&uid=" . $uid : ""; + + + + if($alternativeBaseUrl) + { + return [ + "id" => $id, + "type" => "documenturl", + "name" => $name, + "url" => $alternativeBaseUrl . "?" . $parameterurl . $uidString, + "order" => $order + ]; + } + else + return [ + "id" => $id, + "type" => "documenturl", + "name" => $name, + "url" => $baseurl . $parameterurl . "&uid=" . $uid, + "order" => $order + ]; + +} diff --git a/application/helpers/hlp_header_helper.php b/application/helpers/hlp_header_helper.php index 24c02eac5..309bdedbd 100644 --- a/application/helpers/hlp_header_helper.php +++ b/application/helpers/hlp_header_helper.php @@ -246,3 +246,10 @@ function generateSkipLink($skipID) $toPrint.='" class="fhcSkipLink" aria-label="Skip to main content">'; echo $toPrint; } + +function absoluteJsImportUrl($relurl) +{ + $ci =& get_instance(); + $url = base_url($relurl) . '?'. $ci->config->item('fhcomplete_build_version'); + return $url; +} \ No newline at end of file diff --git a/application/language/english/form_validation_lang.php b/application/language/english/form_validation_lang.php index b8918a721..2777cd05e 100644 --- a/application/language/english/form_validation_lang.php +++ b/application/language/english/form_validation_lang.php @@ -41,3 +41,4 @@ if (!defined('BASEPATH')) exit('No direct script access allowed'); $lang['form_validation_has_write_permissions'] = 'You have no rights to edit {field} field.'; $lang['form_validation_is_valid_date'] = 'The date format is invalid or out of range.'; $lang['form_validation_has_permissions_for_stg'] = 'You have no rights for stg {field}.'; +$lang['form_validation_is_in_db'] = '{field} does not exist.'; diff --git a/application/libraries/FilterCmptLib.php b/application/libraries/FilterCmptLib.php index 272899de6..b1de89245 100644 --- a/application/libraries/FilterCmptLib.php +++ b/application/libraries/FilterCmptLib.php @@ -1,7 +1,7 @@ getSession(); // If session is NOT empty -> a filter was already loaded - if ($session != null) + if (!isError($session) && $session != null) { // Retrieve the filterId stored in the session $sessionFilterId = $this->_getSessionElement(FilterCmptLib::FILTER_ID); @@ -219,9 +219,7 @@ class FilterCmptLib } } } - - // If the session is empty -> first time that this filter is loaded - if ($session == null) + else { // Load filter definition data from DB $definition = $this->_loadDefinition( @@ -602,7 +600,7 @@ class FilterCmptLib { $session = getSessionElement(self::SESSION_NAME, $this->_filterUniqueId); - if (isset($session[$name])) + if (!isError($session) && isset($session[$name])) { return $session[$name]; } @@ -623,7 +621,7 @@ class FilterCmptLib if (!$this->_ci->permissionlib->hasAtLeastOne($this->_requiredPermissions, self::PERMISSION_FILTER_METHOD, self::PERMISSION_TYPE)) { - $this->_setSession(error('The required permission is not help by the logged user')); + $this->_setSession(error('The required permission is not held by the logged user')); return false; } @@ -904,7 +902,7 @@ class FilterCmptLib $filterCmptsSession = getSession(self::SESSION_NAME); // If something is present in session - if ($filterCmptsSession != null) + if (!isError($filterCmptsSession) && $filterCmptsSession != null) { // Loops in the session for all the filter components foreach ($filterCmptsSession as $filterCmpt => $filterCmptData) @@ -951,9 +949,11 @@ class FilterCmptLib { $session = getSessionElement(self::SESSION_NAME, $this->_filterUniqueId); - $session[$name] = $value; - - setSessionElement(self::SESSION_NAME, $this->_filterUniqueId, $session); // stores the single value + if (!isError($session) && $session != null) + { + $session[$name] = $value; + setSessionElement(self::SESSION_NAME, $this->_filterUniqueId, $session); // stores the single value + } } /** @@ -965,7 +965,7 @@ class FilterCmptLib $filterCmptsSession = getSession(self::SESSION_NAME); // If something is present in session - if ($filterCmptsSession != null) + if (!isError($filterCmptsSession) && $filterCmptsSession != null) { // Loops in the session for all the filter components foreach ($filterCmptsSession as $filterCmpt => $filterCmptData) @@ -1174,3 +1174,4 @@ class FilterCmptLib return $filterName; } } + diff --git a/application/libraries/LektorLib.php b/application/libraries/LektorLib.php index e06e2b728..bbe630eaf 100644 --- a/application/libraries/LektorLib.php +++ b/application/libraries/LektorLib.php @@ -17,6 +17,7 @@ class LektorLib $this->_ci->load->model('organisation/Organisationseinheit_model', 'OrganisationseinheitModel'); $this->_ci->load->model('ressource/mitarbeiter_model', 'MitarbeiterModel'); $this->_ci->load->model('person/Benutzer_model', 'BenutzerModel'); + $this->_ci->load->library('PhrasesLib', array('lehre')); } public function addLektorToLehreinheit($lehreinheit_id, $mitarbeiter_uid) @@ -35,7 +36,7 @@ class LektorLib if (isError($already_assigned)) return $already_assigned; - if (hasData($already_assigned)) return error('Lektor already assigned'); + if (hasData($already_assigned)) return error($this->_ci->phraseslib->t("lehre", "bereitzugeteilt")); $studiensemester_result = $this->_ci->StudiensemesterModel->loadWhere(array('studiensemester_kurzbz' => $lehreinheit->studiensemester_kurzbz)); if (isError($studiensemester_result)) return $studiensemester_result; @@ -88,6 +89,7 @@ class LektorLib $lehreinheit = getData($lehreinheit_result)[0]; + //TODO kollision check, wird vorerst nicht implementiert -> nur über das FAS möglich if (isset($new_data['mitarbeiter_uid']) && $new_data['mitarbeiter_uid'] !== $mitarbeiter_uid) { @@ -98,7 +100,13 @@ class LektorLib $verplant = $this->_ci->StundenplandevModel->loadWhere(array('lehreinheit_id' => $lehreinheit_id, 'mitarbeiter_uid' => $mitarbeiter_uid)); if (hasData($verplant)) - return error('Wechsel vom Mitarbeiter nicht möglich da er bereits verplant ist!'); + return error($this->_ci->phraseslib->t("lehre", "lektorbereitsverplant")); + + $lehreinheit_data = $this->_ci->LehreinheitmitarbeiterModel->loadWhere(array('mitarbeiter_uid' => $new_data['mitarbeiter_uid'], 'lehreinheit_id' => $lehreinheit_id)); + + if (hasData($lehreinheit_data)) + return error($this->_ci->phraseslib->t("lehre", "bereitzugeteilt")); + } $warning = ''; if (isset($new_data['semesterstunden'])) diff --git a/application/libraries/ProfilLib.php b/application/libraries/ProfilLib.php index 6e93a0943..97cb8ce5d 100644 --- a/application/libraries/ProfilLib.php +++ b/application/libraries/ProfilLib.php @@ -183,7 +183,10 @@ class ProfilLib{ $zutrittskarte_ausgegebenam = $zutrittskarte_ausgegebenam ? current($zutrittskarte_ausgegebenam)->ausgegebenam : null; //? formats date from 01-01-2000 to 01.01.2000 - $zutrittskarte_ausgegebenam = str_replace("-", ".", $zutrittskarte_ausgegebenam); + if ($zutrittskarte_ausgegebenam !== NULL) + { + $zutrittskarte_ausgegebenam = (new DateTime($zutrittskarte_ausgegebenam))->format('d.m.Y'); + } return $zutrittskarte_ausgegebenam; } @@ -196,7 +199,7 @@ class ProfilLib{ private function getAdressenInfo($pid) { $this->ci->load->model("person/Adresse_model","AdresseModel"); - $adresse_res = $this->ci->AdresseModel->addSelect(["adresse_id", "strasse", "tbl_adressentyp.bezeichnung as typ", "plz", "ort", "zustelladresse", "gemeinde", "nation"]); + $adresse_res = $this->ci->AdresseModel->addSelect(["adresse_id", "strasse", "tbl_adressentyp.bezeichnung as typ", "plz", "ort", "heimatadresse", "zustelladresse", "gemeinde", "nation"]); $adresse_res = $this->ci->AdresseModel->addOrder("zustelladresse", "DESC"); $adresse_res = $this->ci->AdresseModel->addJoin("tbl_adressentyp", "typ=adressentyp_kurzbz"); diff --git a/application/models/crm/Prestudent_model.php b/application/models/crm/Prestudent_model.php index ff56c3268..ad5c3e141 100644 --- a/application/models/crm/Prestudent_model.php +++ b/application/models/crm/Prestudent_model.php @@ -1,5 +1,7 @@ execQuery($query, array($person_id)); } + + /** + * Adds a filter to the query builder + * + * @param array $filter + * @return boolean + */ + public function addFilter($filter) + { + if (!isset($filter['type'])) + return false; + + switch ($filter['type']) { + case 'konto': + $bt = ''; + $stdsem = ''; + $comp = '!='; + + if (isset($filter['buchungstyp_kurzbz']) && $filter['buchungstyp_kurzbz'] != 'all') + $bt = ' AND buchungstyp_kurzbz=' . $this->escape($filter['buchungstyp_kurzbz']); + + if (isset($filter['studiensemester_kurzbz'])) + $stdsem = ' AND studiensemester_kurzbz=' . $this->escape($filter['studiensemester_kurzbz']); + + if (isset($filter['missing']) && $filter['missing']) { + $comp = '='; + $this->db->where('get_rolle_prestudent(tbl_prestudent.prestudent_id, NULL) !=', 'Incoming'); + } + + $this->db->where('( + SELECT count(*) + FROM public.tbl_konto + WHERE person_id=tbl_prestudent.person_id + ' . $bt . ' + ' . $stdsem . ' + ) ' . $comp, 0); + break; + + case 'konto_counter': + $bt = ''; + $samestg = ''; + $past = ''; + + if (isset($filter['buchungstyp_kurzbz']) && $filter['buchungstyp_kurzbz'] != 'all') + $bt = ' AND buchungstyp_kurzbz = ' . $this->escape($filter['buchungstyp_kurzbz']); + + if (isset($filter['samestg']) && $filter['samestg']) + $samestg = ' AND studiengang_kz = tbl_prestudent.studiengang_kz'; + + if (isset($filter['past']) && $filter['past']) + $past = ' AND buchungsdatum < NOW()'; + + $this->db->where('( + SELECT sum(betrag) + FROM public.tbl_konto + WHERE person_id = tbl_prestudent.person_id + ' . $bt . ' + ' . $samestg . ' + ' . $past . ' + ) !=', 0); + break; + + case 'zgv': + $this->db + ->group_start() + ->group_start() + ->where('zgv_code IS NOT NULL') + ->where('zgvdatum IS NULL') + ->group_end() + ->or_group_start() + ->where('zgvmas_code IS NOT NULL') + ->where('zgvmadatum IS NULL') + ->group_end() + ->or_group_start() + ->where('zgvdoktor_code IS NOT NULL') + ->where('zgvdoktordatum IS NULL') + ->group_end() + ->group_end(); + break; + + case 'documents': + $this->db->where('( + SELECT count(*) + FROM public.tbl_dokumentstudiengang + WHERE dokument_kurzbz NOT IN ( + SELECT dokument_kurzbz + FROM tbl_dokumentprestudent + WHERE prestudent_id=tbl_prestudent.prestudent_id + ) + AND studiengang_kz=tbl_prestudent.studiengang_kz + ) !=', 0); + break; + + case 'statusgrund': + if (!isset($filter['statusgrund_id'])) + return false; + + if (isset($filter['studiensemester_kurzbz'])) + $stdsem = ' AND studiensemester_kurzbz=' . $this->escape($filter['studiensemester_kurzbz']); + + $this->db->where('( + SELECT count(*) + FROM public.tbl_prestudentstatus + WHERE prestudent_id = tbl_prestudent.prestudent_id + AND statusgrund_id = ' . $this->escape($filter['statusgrund_id']) . ' + ' . $stdsem . ' + ) !=', 0); + break; + } + + Events::trigger('prestudent_add_filter', $filter); + + return true; + } } diff --git a/application/models/education/Lehreinheit_model.php b/application/models/education/Lehreinheit_model.php index e52af4cba..2f955c295 100644 --- a/application/models/education/Lehreinheit_model.php +++ b/application/models/education/Lehreinheit_model.php @@ -651,7 +651,13 @@ EOSQL; ELSE NULL END END, - ' ' + ' ' + ORDER BY + UPPER(tbl_studiengang.typ::varchar(1) || tbl_studiengang.kurzbz), + COALESCE(TRIM(tbl_lehreinheitgruppe.semester::text), ''), + COALESCE(TRIM(tbl_lehreinheitgruppe.verband), ''), + COALESCE(TRIM(tbl_lehreinheitgruppe.gruppe), ''), + COALESCE(tbl_lehreinheitgruppe.gruppe_kurzbz, '') ) AS gruppen FROM lehre.tbl_lehreinheitgruppe LEFT JOIN public.tbl_studiengang USING (studiengang_kz) diff --git a/application/models/education/Lehreinheitgruppe_model.php b/application/models/education/Lehreinheitgruppe_model.php index bca395f31..dee8bbfe1 100644 --- a/application/models/education/Lehreinheitgruppe_model.php +++ b/application/models/education/Lehreinheitgruppe_model.php @@ -374,7 +374,7 @@ class Lehreinheitgruppe_model extends DB_Model return success('Group assigned successfully to Lehreinheit'); } else - return error('Group already assigned'); + return error($this->p->t('lehre', 'grpbereitszugeteilt')); } public function deleteGroup($lehreinheit_id, $lehreinheitgruppe_id) @@ -401,7 +401,7 @@ class Lehreinheitgruppe_model extends DB_Model $stundenplan_result = $this->loadWhere(array('tbl_lehreinheitgruppe.lehreinheitgruppe_id' => $lehreinheitgruppe_id)); if (hasData($stundenplan_result)) - return error('Gruppe already verplant'); + return error($this->p->t('lehre', 'grpbereitsverplant')); $delete_result = $this->delete($lehreinheitgruppe_id); diff --git a/application/models/person/Profil_update_model.php b/application/models/person/Profil_update_model.php index ffb04b7e7..31005c4b7 100644 --- a/application/models/person/Profil_update_model.php +++ b/application/models/person/Profil_update_model.php @@ -63,6 +63,7 @@ class Profil_update_model extends DB_Model $this->addSelect(["public.tbl_profil_update.*", "public.tbl_person.vorname"]); $this->addJoin("public.tbl_benutzer", "public.tbl_benutzer.uid = public.tbl_profil_update.uid"); $this->addJoin("public.tbl_person", "public.tbl_person.person_id = public.tbl_benutzer.person_id"); + $this->db->order_by('COALESCE(public.tbl_profil_update.updateamum, public.tbl_profil_update.insertamum)', 'DESC', false); $res = $this->loadWhere($whereClause); if (isError($res)) { return $res; @@ -118,13 +119,47 @@ class Profil_update_model extends DB_Model $parameters = []; $query = " SELECT - profil_update_id, tbl_profil_update.uid, (tbl_person.vorname || ' ' || tbl_person.nachname) AS name , topic, requested_change, tbl_profil_update.updateamum, tbl_profil_update.updatevon, tbl_profil_update.insertamum, tbl_profil_update.insertvon, status, public.tbl_profil_update_status.bezeichnung_mehrsprachig[(" . $lang . ")] as status_translated, status_timestamp, status_message, attachment_id + profil_update_id, + tbl_profil_update.uid, + (tbl_person.vorname || ' ' || tbl_person.nachname) AS name , + topic, + requested_change, + tbl_profil_update.updateamum, + tbl_profil_update.updatevon, + tbl_profil_update.insertamum, + tbl_profil_update.insertvon, + status, + public.tbl_profil_update_status.bezeichnung_mehrsprachig[(" . $lang . ")] as status_translated, + status_timestamp, + status_message, + attachment_id, + UPPER(public.tbl_studiengang.typ || public.tbl_studiengang.kurzbz) AS studiengang, + COALESCE(of.orgform_kurzbz, public.tbl_studiengang.orgform_kurzbz) AS orgform, + NULL as oezuordnung FROM public.tbl_profil_update JOIN public.tbl_profil_update_status ON public.tbl_profil_update_status.status_kurzbz = public.tbl_profil_update.status JOIN public.tbl_student ON public.tbl_student.student_uid=public.tbl_profil_update.uid JOIN public.tbl_benutzer ON public.tbl_benutzer.uid = public.tbl_student.student_uid JOIN public.tbl_person ON public.tbl_benutzer.person_id=public.tbl_person.person_id JOIN public.tbl_studiengang ON public.tbl_studiengang.studiengang_kz=public.tbl_student.studiengang_kz + LEFT JOIN ( + select + pss.prestudent_id, COALESCE(sp.orgform_kurzbz, pss.orgform_kurzbz) as orgform_kurzbz + from ( + select + prestudent_id, max(insertamum) as insertamum + from + public.tbl_prestudentstatus + where + datum <= NOW() + group by + prestudent_id + ) mpss + join + public.tbl_prestudentstatus pss on pss.prestudent_id = mpss.prestudent_id and pss.insertamum = mpss.insertamum + left join + lehre.tbl_studienplan sp on pss.studienplan_id = sp.studienplan_id + ) of ON of.prestudent_id = public.tbl_student.prestudent_id Where public.tbl_studiengang.oe_kurzbz IN ? "; $parameters[] = $oe_berechtigung; if ($whereClause) { @@ -144,12 +179,33 @@ class Profil_update_model extends DB_Model } } if ($mitarbeiterBerechtigung) { - $this->addSelect(["profil_update_id", "tbl_profil_update.uid", "(tbl_person.vorname || ' ' || tbl_person.nachname) AS name", "topic", "requested_change", "tbl_profil_update.updateamum", "tbl_profil_update.updatevon", "tbl_profil_update.insertamum", "tbl_profil_update.insertvon", "status", "public.tbl_profil_update_status.bezeichnung_mehrsprachig[(" . $lang . ")] AS status_translated", "status_timestamp", "status_message", "attachment_id"]); + $this->addSelect([ + "profil_update_id", + "tbl_profil_update.uid", + "(tbl_person.vorname || ' ' || tbl_person.nachname) AS name", + "topic", + "requested_change", + "tbl_profil_update.updateamum", + "tbl_profil_update.updatevon", + "tbl_profil_update.insertamum", + "tbl_profil_update.insertvon", + "status", + "public.tbl_profil_update_status.bezeichnung_mehrsprachig[(" . $lang . ")] AS status_translated", + "status_timestamp", + "status_message", + "attachment_id", + "COALESCE(NULL) as studiengang", + "COALESCE(NULL) as orgform", + "oe.bezeichnung as oezuordnung" + ]); $this->addJoin('tbl_profil_update_status', 'tbl_profil_update_status.status_kurzbz=tbl_profil_update.status'); $this->addJoin('tbl_mitarbeiter', 'tbl_mitarbeiter.mitarbeiter_uid=tbl_profil_update.uid'); $this->addJoin('tbl_benutzer', 'tbl_benutzer.uid=tbl_profil_update.uid'); $this->addJoin('tbl_person', 'tbl_benutzer.person_id=tbl_person.person_id'); + $this->addJoin('tbl_benutzerfunktion bf', 'bf.uid = tbl_benutzer.uid AND bf.funktion_kurzbz = \'oezuordnung\' AND NOW() >= COALESCE(bf.datum_von, \'1970-01-01\'::date) AND NOW() <= COALESCE(bf.datum_bis, \'2170-12-31\'::date)', 'LEFT'); + $this->addJoin('tbl_organisationseinheit oe', 'oe.oe_kurzbz = bf.oe_kurzbz', 'LEFT'); $mitarbeiterRequests = $this->loadWhere($whereClause); + if (isError($mitarbeiterRequests)) return error("db error: " . getData($mitarbeiterRequests)); $mitarbeiterRequests = getData($mitarbeiterRequests) ?: []; @@ -179,8 +235,11 @@ class Profil_update_model extends DB_Model private function formatProfilRequest($request) { $request->requested_change = json_decode($request->requested_change); + $request->insertamum_iso = !is_null($request->insertamum) ? date_create($request->insertamum)->format('Y-m-d') : null; $request->insertamum = !is_null($request->insertamum) ? date_create($request->insertamum)->format('d.m.Y') : null; + $request->updateamum_iso = !is_null($request->updateamum) ? date_create($request->updateamum)->format('Y-m-d') : null; $request->updateamum = !is_null($request->updateamum) ? date_create($request->updateamum)->format('d.m.Y') : null; + $request->status_timestamp_iso = !is_null($request->status_timestamp) ? date_create($request->status_timestamp)->format('Y-m-d') : null; $request->status_timestamp = !is_null($request->status_timestamp) ? date_create($request->status_timestamp)->format('d.m.Y') : null; } diff --git a/application/models/ressource/Mitarbeiter_model.php b/application/models/ressource/Mitarbeiter_model.php index f6cdc74b8..a650643f1 100644 --- a/application/models/ressource/Mitarbeiter_model.php +++ b/application/models/ressource/Mitarbeiter_model.php @@ -353,12 +353,14 @@ class Mitarbeiter_model extends DB_Model { $filter = strtoLower($filter); + $returnwert = "p.person_id, p.nachname, p.vorname, p.titelpost, p.titelpre"; + if ($mode == "mitAkadGrad") - $returnwert = "ma.mitarbeiter_uid, CONCAT(p.nachname, ' ', p.vorname, ' ', p.titelpost, ' ', p.titelpre, ' (', ma.mitarbeiter_uid , ')') as mitarbeiter"; + $returnwert .= ", ma.mitarbeiter_uid, CONCAT(p.nachname, ' ', p.vorname, ' ', p.titelpost, ' ', p.titelpre, ' (', ma.mitarbeiter_uid , ')') as mitarbeiter"; elseif ($mode == "ohneMaUid") - $returnwert = "p.person_id, CONCAT(p.nachname, ' ', p.vorname, ' ', p.titelpost, ' ', p.titelpre) as mitarbeiter"; + $returnwert .= ", CONCAT(p.nachname, ' ', p.vorname, ' ', p.titelpost, ' ', p.titelpre) as mitarbeiter"; else - $returnwert = "ma.mitarbeiter_uid, CONCAT(p.nachname, ' ', p.vorname, ' (', ma.mitarbeiter_uid , ')') as mitarbeiter"; + $returnwert .= ", ma.mitarbeiter_uid, CONCAT(p.nachname, ' ', p.vorname, ' (', ma.mitarbeiter_uid , ')') as mitarbeiter"; $qry = " SELECT " . $returnwert . " @@ -373,7 +375,11 @@ class Mitarbeiter_model extends DB_Model OR lower (p.vorname) LIKE '%". $this->db->escape_like_str($filter)."%' OR - (ma.mitarbeiter_uid) LIKE '%". $this->db->escape_like_str($filter)."%'"; + (ma.mitarbeiter_uid) LIKE '%". $this->db->escape_like_str($filter)."%' + OR + lower(vorname || ' ' || nachname || ' ' || vorname) like ".$this->db->escape('%'.mb_strtolower($filter).'%')." + ORDER BY + p.nachname, p.vorname, b.uid, p.person_id"; return $this->execQuery($qry); } diff --git a/application/models/vertragsbestandteil/Dienstverhaeltnis_model.php b/application/models/vertragsbestandteil/Dienstverhaeltnis_model.php index b055ee954..1143398ca 100644 --- a/application/models/vertragsbestandteil/Dienstverhaeltnis_model.php +++ b/application/models/vertragsbestandteil/Dienstverhaeltnis_model.php @@ -254,22 +254,16 @@ EOSQL; return $dvs; } - public function existsDienstverhaeltnis($mitarbeiter_uid, $start, $ende = null, $vertragsart_kurzbz = null) + public function existsDienstverhaeltnis($mitarbeiter_uid, $start, $ende, $vertragsart_kurzbz) { $this->addOrder('von', 'DESC'); $this->db->where('mitarbeiter_uid', $mitarbeiter_uid); - if (!is_null($vertragsart_kurzbz)) - $this->db->where('vertragsart_kurzbz', $this->escape($vertragsart_kurzbz)); - + $this->db->where('vertragsart_kurzbz', $vertragsart_kurzbz); $this->db->where('von <=', $ende); - - if (!is_null($ende)) - { - $this->db->group_start(); - $this->db->where('bis >=', $start); - $this->db->or_where('bis IS NULL', null, false); - $this->db->group_end(); - } + $this->db->group_start(); + $this->db->where('bis >=', $start); + $this->db->or_where('bis IS NULL', null, false); + $this->db->group_end(); $this->addLimit(1); return $this->load(); diff --git a/application/views/Cis/ProfilUpdate.php b/application/views/Cis/ProfilUpdate.php index e797d436f..2e69208c7 100644 --- a/application/views/Cis/ProfilUpdate.php +++ b/application/views/Cis/ProfilUpdate.php @@ -2,10 +2,14 @@ $includesArray = array( 'title' => 'Profil Änderungen', 'vue3' => true, + 'primevue3' => true, 'bootstrap5' => true, 'fontawesome6'=> true, 'axios027' => true, 'tabulator5' => true, + 'customJSs' => array( + 'vendor/moment/luxonjs/luxon.min.js' + ), 'customJSModules' => array( 'public/js/apps/Cis/ProfilUpdateRequests.js' ), diff --git a/application/views/Studentenverwaltung.php b/application/views/Studentenverwaltung.php index 01e611657..1cd28d735 100644 --- a/application/views/Studentenverwaltung.php +++ b/application/views/Studentenverwaltung.php @@ -22,7 +22,8 @@ 'public/css/components/function.css' ], 'customJSs' => [ - 'vendor/vuejs/vuedatepicker_js/vue-datepicker.iife.js' + 'vendor/vuejs/vuedatepicker_js/vue-datepicker.iife.js', + 'vendor/moment/luxonjs/luxon.min.js' #'vendor/npm-asset/primevue/tree/tree.min.js', #'vendor/npm-asset/primevue/toast/toast.min.js' ], @@ -53,6 +54,8 @@ $configArray = [ active-addons="= defined('ACTIVE_ADDONS') ? ACTIVE_ADDONS : ''; ?>" stv-root="= site_url('Studentenverwaltung'); ?>" cis-root="= CIS_ROOT; ?>" + avatar-url="= site_url('Cis/Pub/bild/person/' . getAuthPersonId()); ?>" + logout-url="= site_url('Cis/Auth/logout'); ?>" :permissions="= htmlspecialchars(json_encode($permissions)); ?>" :config="= htmlspecialchars(json_encode($configArray)); ?>" > diff --git a/application/views/system/infocenter/onboarding.php b/application/views/system/infocenter/onboarding.php new file mode 100644 index 000000000..1f5bae847 --- /dev/null +++ b/application/views/system/infocenter/onboarding.php @@ -0,0 +1,47 @@ +load->view( + 'templates/FHC-Header', + array( + 'title' => 'Info Center', + 'jquery3' => true, + 'jqueryui1' => true, + 'jquerycheckboxes1' => true, + 'bootstrap3' => true, + 'fontawesome4' => true, + 'sbadmintemplate3' => true, + 'tablesorter2' => true, + 'ajaxlib' => true, + 'filterwidget' => true, + 'navigationwidget' => true, + 'dialoglib' => true, + 'phrases' => array( + 'person' => array('vorname', 'nachname'), + 'ui' => array('bitteEintragWaehlen') + ), + 'customCSSs' => array('public/css/sbadmin2/tablesort_bootstrap.css', 'public/css/infocenter/infocenterPersonDataset.css'), + 'customJSs' => array('public/js/bootstrapper.js', 'public/js/infocenter/rueckstellung.js', 'public/js/infocenter/infocenterPersonDataset.js') + ) + ); +?> + +