From d1377b3f4e5ece90ce5f57d026f676f438a3a50e Mon Sep 17 00:00:00 2001 From: ma0068 Date: Tue, 3 Oct 2023 16:19:40 +0200 Subject: [PATCH] Searchbar Student Prestudent --- application/config/routes.php | 2 +- .../controllers/components/stv/Student.php | 33 +++---- .../controllers/components/stv/Students.php | 80 +++++++++++++++++ application/libraries/SearchBarLib.php | 64 ++++++++++++++ public/js/apps/Studentenverwaltung.js | 3 +- .../js/components/Stv/Studentenverwaltung.js | 33 ++++--- .../Studentenverwaltung/Details/Details.js | 40 ++++----- public/js/components/searchbar/prestudent.js | 88 +++++++++++++++++++ public/js/components/searchbar/searchbar.js | 8 +- public/js/components/searchbar/student.js | 80 +++++++++++++++++ 10 files changed, 374 insertions(+), 57 deletions(-) create mode 100644 public/js/components/searchbar/prestudent.js create mode 100644 public/js/components/searchbar/student.js diff --git a/application/config/routes.php b/application/config/routes.php index a5bd3a7c8..9fad59d88 100644 --- a/application/config/routes.php +++ b/application/config/routes.php @@ -61,7 +61,7 @@ $route['api/v1/organisation/[O|o]rganisationseinheit/(:any)'] = 'api/v1/organisa $route['api/v1/ressource/[B|b]etriebsmittelperson/(:any)'] = 'api/v1/ressource/betriebsmittelperson2/$1'; $route['api/v1/system/[S|s]prache/(:any)'] = 'api/v1/system/sprache2/$1'; -$route['studentenverwaltung/(:any)'] = 'Studentenverwaltung/index'; +$route['studentenverwaltung/(:any)/(:any)'] = 'Studentenverwaltung/index'; // load routes from extensions $subdir = 'application/config/extensions'; diff --git a/application/controllers/components/stv/Student.php b/application/controllers/components/stv/Student.php index a407d20c1..20cf8572c 100644 --- a/application/controllers/components/stv/Student.php +++ b/application/controllers/components/stv/Student.php @@ -22,26 +22,27 @@ class Student extends FHC_Controller // TODO(chris): stdSem from Variable $studiensemester_kurzbz='SS2023'; - $this->load->model('crm/Student_model', 'StudentModel'); + $this->load->model('crm/Prestudent_model', 'PrestudentModel'); - $this->StudentModel->addSelect('p.*'); - $this->StudentModel->addSelect('tbl_student.student_uid'); - $this->StudentModel->addSelect('matrikelnr'); - $this->StudentModel->addSelect('b.aktiv'); - $this->StudentModel->addSelect('v.semester'); - $this->StudentModel->addSelect('v.verband'); - $this->StudentModel->addSelect('v.gruppe'); - $this->StudentModel->addSelect('b.alias'); + $this->PrestudentModel->addSelect('p.*'); + $this->PrestudentModel->addSelect('s.student_uid'); + $this->PrestudentModel->addSelect('matrikelnr'); + $this->PrestudentModel->addSelect('b.aktiv'); + $this->PrestudentModel->addSelect('v.semester'); + $this->PrestudentModel->addSelect('v.verband'); + $this->PrestudentModel->addSelect('v.gruppe'); + $this->PrestudentModel->addSelect('b.alias'); if (defined('ACTIVE_ADDONS') && strpos(ACTIVE_ADDONS, 'bewerbung') !== false) { - $this->StudentModel->addSelect("(SELECT kontakt FROM public.tbl_kontakt WHERE kontakttyp='email' AND person_id=p.person_id AND zustellung ORDER BY kontakt_id LIMIT 1) AS email_privat", false); + $this->PrestudentModel->addSelect("(SELECT kontakt FROM public.tbl_kontakt WHERE kontakttyp='email' AND person_id=p.person_id AND zustellung ORDER BY kontakt_id LIMIT 1) AS email_privat", false); } - $this->StudentModel->addJoin('public.tbl_benutzer b', 'student_uid = uid'); - $this->StudentModel->addJoin('public.tbl_studentlehrverband v', 'b.uid = v.student_uid AND v.studiensemester_kurzbz = ' . $this->StudentModel->escape($studiensemester_kurzbz), 'LEFT'); - $this->StudentModel->addJoin('public.tbl_person p', 'person_id'); + $this->PrestudentModel->addJoin('public.tbl_student s', 'prestudent_id', 'LEFT'); + $this->PrestudentModel->addJoin('public.tbl_benutzer b', 'student_uid = uid', 'LEFT'); + $this->PrestudentModel->addJoin('public.tbl_studentlehrverband v', 'b.uid = v.student_uid AND v.studiensemester_kurzbz = ' . $this->PrestudentModel->escape($studiensemester_kurzbz), 'LEFT'); + $this->PrestudentModel->addJoin('public.tbl_person p', 'p.person_id = tbl_prestudent.person_id'); - $result = $this->StudentModel->loadWhere(['prestudent_id' => $prestudent_id]); + $result = $this->PrestudentModel->loadWhere(['prestudent_id' => $prestudent_id]); if (isError($result)) { $this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR); $this->outputJson(getError($result)); @@ -119,7 +120,8 @@ class Student extends FHC_Controller $this->form_validation->set_rules('gebdatum', 'Geburtsdatum', 'callback_isValidDate', [ 'isValidDate' => $this->p->t('ui', 'error_invalid_date') ]); - // TODO(chris): other validations? + + $this->form_validation->set_rules('semester', 'Semester', 'integer'); if ($this->form_validation->run() == false) { return $this->outputJsonError($this->form_validation->error_array()); @@ -259,4 +261,5 @@ class Student extends FHC_Controller } return true; } + } diff --git a/application/controllers/components/stv/Students.php b/application/controllers/components/stv/Students.php index a0394d12e..941441466 100644 --- a/application/controllers/components/stv/Students.php +++ b/application/controllers/components/stv/Students.php @@ -34,6 +34,7 @@ class Students extends FHC_Controller * /(studiengang_kz)/(org_form)/(semester)/(verband)/(gruppe) * => getStudents * /uid/(student_uid) => getStudent + * /prestudent/(prestudent_id) => getPrestudent * * @param string $method * @param array $params (optional) @@ -67,6 +68,9 @@ class Students extends FHC_Controller if ($method == 'uid' && $count == 1) return $this->getStudent($params[0]); + if ($method == 'prestudent' && $count == 1) + return $this->getPrestudent($params[0]); + if (is_numeric($params[0])) { $sem = $params[0]; if ($count == 3 && $params[1] == 'grp') { @@ -341,4 +345,80 @@ class Students extends FHC_Controller $this->outputJson(getData($result) ?: []); } } + + /** + * @param string $prestudent_id + * + * @return void + */ + protected function getPrestudent($prestudent_id) + { + // TODO(chris): stdSem from Variable + $studiensemester_kurzbz='SS2023'; + + $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', '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->PrestudentModel->addSelect('p.person_id'); + $this->PrestudentModel->addSelect('tbl_prestudent.prestudent_id'); + $this->PrestudentModel->addSelect('b.uid'); + $this->PrestudentModel->addSelect('titelpre'); + $this->PrestudentModel->addSelect('titelpost'); + $this->PrestudentModel->addSelect('vorname'); + $this->PrestudentModel->addSelect('wahlname'); + $this->PrestudentModel->addSelect('vornamen'); + $this->PrestudentModel->addSelect('geschlecht'); + $this->PrestudentModel->addSelect('nachname'); + $this->PrestudentModel->addSelect('gebdatum'); + $this->PrestudentModel->addSelect('tbl_prestudent.anmerkung'); + $this->PrestudentModel->addSelect('ersatzkennzeichen'); + $this->PrestudentModel->addSelect('svnr'); + $this->PrestudentModel->addSelect('s.matrikelnr'); + $this->PrestudentModel->addSelect('p.anmerkung AS anmerkungen'); + $this->PrestudentModel->addSelect('v.semester'); + $this->PrestudentModel->addSelect('v.verband'); + $this->PrestudentModel->addSelect('v.gruppe'); + $this->PrestudentModel->addSelect('tbl_prestudent.studiengang_kz'); + $this->PrestudentModel->addSelect('aufmerksamdurch_kurzbz'); + $this->PrestudentModel->addSelect('mentor'); + $this->PrestudentModel->addSelect('b.aktiv AS bnaktiv'); + $this->PrestudentModel->addSelect( + "(SELECT kontakt FROM public.tbl_kontakt WHERE kontakttyp='email' AND person_id=p.person_id AND zustellung LIMIT 1) AS email_privat", + false + ); + $this->PrestudentModel->addSelect( + "(SELECT rt_gesamtpunkte AS punkte FROM public.tbl_prestudent WHERE prestudent_id=s.prestudent_id) AS punkte", + false + ); + $this->PrestudentModel->addSelect('tbl_prestudent.dual'); + $this->PrestudentModel->addSelect('tbl_prestudent.reihungstest_id'); + $this->PrestudentModel->addSelect('tbl_prestudent.anmeldungreihungstest'); + $this->PrestudentModel->addSelect('p.matr_nr'); + $this->PrestudentModel->addSelect('tbl_prestudent.gsstudientyp_kurzbz'); + $this->PrestudentModel->addSelect('tbl_prestudent.aufnahmegruppe_kurzbz'); + $this->PrestudentModel->addSelect('tbl_prestudent.priorisierung'); + $this->PrestudentModel->addSelect('p.zugangscode'); + $this->PrestudentModel->addSelect('p.bpk'); + + $where = []; + + $result = $this->PrestudentModel->loadWhere([ + 'tbl_prestudent.prestudent_id' => $prestudent_id + ]); + + if (isError($result)) { + $this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR); + $this->outputJson(getError($result)); + } else { + $this->outputJson(getData($result) ?: []); + } + } } diff --git a/application/libraries/SearchBarLib.php b/application/libraries/SearchBarLib.php index 3a9d06d13..e49910e5a 100644 --- a/application/libraries/SearchBarLib.php +++ b/application/libraries/SearchBarLib.php @@ -260,6 +260,35 @@ class SearchBarLib */ private function _student($searchstr, $type) { + $dbModel = new DB_Model(); + + $students = $dbModel->execReadOnlyQuery(' + SELECT + \''.$type.'\' AS type, + s.student_uid AS uid, + s.matrikelnr, + p.person_id AS person_id, + p.vorname || \' \' || p.nachname AS name, + k.kontakt as email , + p.foto + FROM public.tbl_student s + JOIN public.tbl_benutzer b ON(b.uid = s.student_uid) + JOIN public.tbl_person p USING(person_id) + LEFT JOIN ( + SELECT kontakt, person_id + FROM public.tbl_kontakt + WHERE kontakttyp = \'email\' + ) as k USING(person_id) + WHERE b.uid ILIKE \'%'.$dbModel->escapeLike($searchstr).'%\' + OR p.vorname ILIKE \'%'.$dbModel->escapeLike($searchstr).'%\' + OR p.nachname ILIKE \'%'.$dbModel->escapeLike($searchstr).'%\' + GROUP BY type, s.student_uid, s.matrikelnr, p.person_id, name, email, p.foto + '); + + // If something has been found then return it + if (hasData($students)) return getData($students); + + // Otherwise return an empty array return array(); } @@ -268,6 +297,41 @@ class SearchBarLib */ private function _prestudent($searchstr, $type) { + $dbModel = new DB_Model(); + + $prestudent = $dbModel->execReadOnlyQuery(' + SELECT + \''.$type.'\' AS type, + ps.prestudent_id, + ps.studiengang_kz, + p.person_id AS person_id, + b.uid, + p.vorname || \' \' || p.nachname AS name, + ( + SELECT kontakt + FROM public.tbl_kontakt + WHERE kontakttyp = \'email\' + AND person_id = p.person_id + LIMIT 1 + ) as email, + p.foto, + sg.bezeichnung + FROM public.tbl_prestudent ps + LEFT JOIN public.tbl_student s USING (prestudent_id) + LEFT JOIN public.tbl_benutzer b ON (b.uid = s.student_uid) + JOIN public.tbl_person p ON (p.person_id = ps.person_id) + LEFT JOIN public.tbl_studiengang sg ON (sg.studiengang_kz = ps.studiengang_kz) + WHERE b.uid ILIKE \'%'.$dbModel->escapeLike($searchstr).'%\' + OR p.vorname ILIKE \'%'.$dbModel->escapeLike($searchstr).'%\' + OR p.nachname ILIKE \'%'.$dbModel->escapeLike($searchstr).'%\' + or cast(ps.prestudent_id as text) ILIKE \'%'.$dbModel->escapeLIKE($searchstr).'%\' + GROUP BY type, b.uid, ps.prestudent_id, ps.studiengang_kz, sg.bezeichnung, s.student_uid, s.matrikelnr, p.person_id, name, email, p.foto + '); + + // If something has been found then return it + if (hasData($prestudent)) return getData($prestudent); + + // Otherwise return an empty array return array(); } diff --git a/public/js/apps/Studentenverwaltung.js b/public/js/apps/Studentenverwaltung.js index 2fc79fbdb..2b6cc4c46 100644 --- a/public/js/apps/Studentenverwaltung.js +++ b/public/js/apps/Studentenverwaltung.js @@ -26,7 +26,8 @@ const router = VueRouter.createRouter({ history: VueRouter.createWebHistory(), routes: [ { path: `/${ciPath}/studentenverwaltung`, component: FhcStudentenverwaltung }, - { path: `/${ciPath}/studentenverwaltung/:id`, component: FhcStudentenverwaltung } + { path: `/${ciPath}/studentenverwaltung/prestudent/:prestudent_id`, component: FhcStudentenverwaltung }, + { path: `/${ciPath}/studentenverwaltung/student/:id`, component: FhcStudentenverwaltung } ] }); diff --git a/public/js/components/Stv/Studentenverwaltung.js b/public/js/components/Stv/Studentenverwaltung.js index bc30ed02a..e171b665f 100644 --- a/public/js/components/Stv/Studentenverwaltung.js +++ b/public/js/components/Stv/Studentenverwaltung.js @@ -50,35 +50,28 @@ export default { selected: [], searchbaroptions: { types: [ - "person", "student", "prestudent" ], actions: { - person: { + student: { defaultaction: { type: "link", action: function(data) { - return data.profil; + return FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + '/studentenverwaltung/student/' + data.uid; } }, childactions: [ - { - "label": "testchildaction1", - "icon": "fas fa-check-circle", - "type": "function", - "action": function(data) { - alert('person testchildaction 01 ' + JSON.stringify(data)); - } - }, - { - "label": "testchildaction2", - "icon": "fas fa-file-csv", - "type": "function", - "action": function(data) { - alert('person testchildaction 02 ' + JSON.stringify(data)); - } + ] + }, + prestudent: { + defaultaction: { + type: "link", + action: function(data) { + return FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + '/studentenverwaltung/prestudent/' + data.prestudent_id; } + }, + childactions: [ ] } } @@ -102,6 +95,10 @@ export default { if (this.$route.params.id) { this.$refs.stvList.updateUrl('components/stv/students/uid/' + this.$route.params.id); } + if (this.$route.params.prestudent_id) { + this.$refs.stvList.updateUrl('components/stv/students/prestudent/' + this.$route.params.prestudent_id); + } + }, template: `