From 204ae1a4692921a52b447abfe87e66511540ab4b Mon Sep 17 00:00:00 2001 From: ma0068 Date: Wed, 8 Oct 2025 16:34:39 +0200 Subject: [PATCH] refactor prepareQuery, use and take into account config parameters, refactor autoSelectRows --- application/config/stv.php | 14 +- .../api/frontend/v1/stv/Students.php | 59 +++++-- .../controllers/api/frontend/v1/stv/Tags.php | 31 +--- application/models/crm/Prestudent_model.php | 166 ------------------ .../Stv/Studentenverwaltung/List.js | 2 +- 5 files changed, 53 insertions(+), 219 deletions(-) diff --git a/application/config/stv.php b/application/config/stv.php index d9519bd6e..3798cc702 100644 --- a/application/config/stv.php +++ b/application/config/stv.php @@ -115,8 +115,14 @@ $config['students_tab_order'] = [ ]; $config['stv_prestudent_tags'] = [ - 'tag_1' => ['readonly' => false], - 'tag_2' => ['readonly' => true], - 'tag_3' => ['readonly' => false], - 'tag_4' => ['readonly' => true] + 'prioone' => ['readonly' => false], + 'priotwo' => ['readonly' => true], + 'hinweis' => ['readonly' => false], + 'hinweis_assistenz' => ['readonly' => true], + 'hinweis_kf' => ['readonly' => true], + 'hinweis_lehrende' => ['readonly' => false], + 'hinweis_stg_kf' => ['readonly' => true], + 'finished_stg' => ['readonly' => true], + 'finished_kf' => ['readonly' => true], + 'inwork_kf' => ['readonly' => true], ]; diff --git a/application/controllers/api/frontend/v1/stv/Students.php b/application/controllers/api/frontend/v1/stv/Students.php index b9f869ac3..06dc91083 100644 --- a/application/controllers/api/frontend/v1/stv/Students.php +++ b/application/controllers/api/frontend/v1/stv/Students.php @@ -430,7 +430,7 @@ class Students extends FHCAPI_Controller * * @return void */ - protected function fetchStudentsWithoutTagsPrestudent($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'); @@ -517,24 +517,7 @@ class Students extends FHCAPI_Controller $this->terminateWithSuccess($data); } - - 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'); - - if (!$this->StudiensemesterModel->isValidStudiensemester($studiensemester_kurzbz)) - { - $this->terminateWithError($studiensemester_kurzbz . ' - ' . $this->p->t('lehre', 'error_noStudiensemester')); - } - $allowedStg = $this->allowedStgs; - $result = $this->PrestudentModel->fetchStudents($studiensemester_kurzbz, $studiengang_kz, $allowedStg, $semester, $verband, $gruppe, $gruppe_kurzbz, $orgform_kurzbz); - - $data = $this->getDataOrTerminateWithError($result); - - $this->terminateWithSuccess($data); - } - - + /** * @param string $prestudent_id * @@ -748,6 +731,41 @@ class Students extends FHCAPI_Controller { $stdsemEsc = $studiensemester_kurzbz ? $this->PrestudentModel->escape($studiensemester_kurzbz) : 'NULL'; + $this->load->config('stv'); + $tags = $this->config->item('stv_prestudent_tags'); + + $whereTags = ''; + if (is_array($tags) && !isEmptyArray($tags)) { + $tags = array_keys($tags); + + foreach ($tags as $key => $tag) { + $tags[$key] = $this->db->escape($tag); + } + $whereTags = " AND nt.typ_kurzbz IN (" . implode(",", $tags) . ")"; + } + $subQueryTag = " + ( + SELECT + tag.prestudent_id, + COALESCE(json_agg(tag ORDER BY tag.done), '[]'::json) AS tags + FROM ( + SELECT DISTINCT ON (n.notiz_id) + n.notiz_id AS id, + nt.typ_kurzbz, + array_to_json(nt.bezeichnung_mehrsprachig)->>0 AS beschreibung, + n.text AS notiz, + nt.style, + n.erledigt AS done, + nz.prestudent_id + FROM public.tbl_notizzuordnung AS nz + JOIN public.tbl_notiz AS n ON nz.notiz_id = n.notiz_id + JOIN public.tbl_notiz_typ AS nt ON n.typ = nt.typ_kurzbz " + . $whereTags . + " + ) AS tag + GROUP BY tag.prestudent_id + ) AS tag_data_agg + "; $this->PrestudentModel->addJoin('public.tbl_studiengang stg', 'studiengang_kz', 'LEFT'); $this->PrestudentModel->addJoin('public.tbl_person p', 'person_id'); @@ -770,8 +788,11 @@ class Students extends FHCAPI_Controller 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->PrestudentModel->addJoin($subQueryTag, 'tag_data_agg.prestudent_id = tbl_prestudent.prestudent_id', 'LEFT'); + $this->PrestudentModel->addSelect("b.uid"); + $this->PrestudentModel->addSelect('tag_data_agg.tags'); $this->PrestudentModel->addSelect('titelpre'); $this->PrestudentModel->addSelect('nachname'); $this->PrestudentModel->addSelect('vorname'); diff --git a/application/controllers/api/frontend/v1/stv/Tags.php b/application/controllers/api/frontend/v1/stv/Tags.php index 397b2abbe..154e57ba7 100644 --- a/application/controllers/api/frontend/v1/stv/Tags.php +++ b/application/controllers/api/frontend/v1/stv/Tags.php @@ -21,34 +21,7 @@ class Tags extends Tag_Controller 'deleteLehre' => self::BERECHTIGUNG_KURZBZ,*/ ]); - $this->config->load('lvverwaltung'); - } - public function getTag($readonly_tags = null) - { - parent::getTag($this->config->item('lvverwaltung_tags')); - } - public function getTags($tags = null) - { - parent::getTags($this->config->item('lvverwaltung_tags')); - } - public function addTag($withZuordnung = true, $updatable_tags = null) - { - parent::addTag(true, $this->config->item('lvverwaltung_tags')); - } - public function updateTag($updatable_tags = null) - { - parent::updateTag($this->config->item('lvverwaltung_tags')); - } - public function deleteTag($withZuordnung = true, $updatable_tags = null) - { - parent::deleteTag(true, $this->config->item('lvverwaltung_tags')); - } - public function doneTag($updatable_tags = null) - { - parent::doneTag($this->config->item('lvverwaltung_tags')); - } - - /*$this->config->load('stv'); + $this->config->load('stv'); } public function getTag($readonly_tags = null) @@ -76,5 +49,5 @@ class Tags extends Tag_Controller public function doneTag($updatable_tags = null) { parent::doneTag($this->config->item('stv_prestudent_tags')); - }*/ + } } diff --git a/application/models/crm/Prestudent_model.php b/application/models/crm/Prestudent_model.php index bd552d0c3..ff56c3268 100644 --- a/application/models/crm/Prestudent_model.php +++ b/application/models/crm/Prestudent_model.php @@ -782,170 +782,4 @@ class Prestudent_model extends DB_Model return $this->execQuery($query, array($person_id)); } - - /** - * Version in raw sql to fetch Students for loading StudentList - * @param integer $studiengang_kz - * @param string $studiensemester_kurzbz - * @param Array $allowedStg - * @param integer $semester (optional) - * @param string $verband (optional) - * @param integer $gruppe (optional) - * @param string $gruppe_kurzbz (optional) - * @param string $orgform_kurzbz (optional) - * - * @return object - */ - public function fetchStudents($studiensemester_kurzbz, $studiengang_kz, $allowedStg, $semester, $verband, $gruppe, $gruppe_kurzbz, $orgform_kurzbz) - { - - $stdsemEsc = $studiensemester_kurzbz ? $this->db->escape($studiensemester_kurzbz) : 'NULL'; - $orgform_kurzbzEsc = $orgform_kurzbz ? $this->db->escape($orgform_kurzbz) : 'NULL'; - - $qry = "WITH prestudenten AS ( - SELECT * - FROM public.tbl_prestudent - ), - ". $this->getTagsCTE() . " - SELECT b.uid, - COALESCE(tag_data_agg.tags, '[]'::json) AS tags, - titelpre, nachname, vorname, wahlname, vornamen, titelpost, ersatzkennzeichen, gebdatum, geschlecht, foto, foto_sperre, - UPPER(stg.typ || stg.kurzbz) AS studiengang, tbl_prestudent.studiengang_kz, stg.bezeichnung AS stg_bezeichnung, s.matrikelnr, - p.person_id, pls.status_kurzbz AS status, pls.datum AS status_datum, pls.bestaetigtam AS status_bestaetigung, - (SELECT kontakt FROM public.tbl_kontakt WHERE kontakttyp='email' AND person_id=p.person_id AND zustellung LIMIT 1) AS mail_privat, - CASE - WHEN b.uid IS NOT NULL AND b.uid<>'' - THEN CONCAT(b.uid, '@', " . $this->db->escape(DOMAIN) .") - ELSE '' - END AS mail_intern, p.anmerkung AS anmerkungen, tbl_prestudent.anmerkung, pls.orgform_kurzbz, aufmerksamdurch_kurzbz, - (SELECT rt_gesamtpunkte AS punkte FROM public.tbl_prestudent WHERE prestudent_id=ps.prestudent_id) AS punkte, - tbl_prestudent.aufnahmegruppe_kurzbz, tbl_prestudent.dual, p.matr_nr, sp.bezeichnung AS studienplan_bezeichnung, - tbl_prestudent.prestudent_id, mentor, b.aktiv AS bnaktiv, v.semester, v.verband, v.gruppe, '' AS priorisierung_relativ, - ( - SELECT status_kurzbz - FROM public.tbl_prestudentstatus pss - WHERE pss.prestudent_id = public.tbl_prestudent.prestudent_id - AND pss.studiensemester_kurzbz = ? - ORDER BY GREATEST(pss.datum, '0001-01-01') DESC - LIMIT 1 - ) AS statusofsemester - FROM public.tbl_prestudent - LEFT JOIN public.tbl_studiengang stg USING (studiengang_kz) - JOIN public.tbl_person p USING (person_id) - JOIN public.tbl_student s USING (prestudent_id) - LEFT JOIN public.tbl_prestudentstatus pls ON 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 JOIN lehre.tbl_studienplan sp USING (studienplan_id) - LEFT JOIN public.tbl_benutzer b ON s.student_uid=b.uid - JOIN public.tbl_studentlehrverband v ON v.student_uid=s.student_uid "; - - $qry .= $studiensemester_kurzbz ? ' AND v.studiensemester_kurzbz = ' . $this->db->escape($studiensemester_kurzbz) : ' AND v.studiensemester_kurzbz = IS NULL'; - - if($gruppe_kurzbz !== null) - { - $qry .= " JOIN public.tbl_benutzergruppe g USING (uid)"; - } - - $qry .= " - LEFT JOIN public.tbl_prestudentstatus ps ON ps.status_kurzbz=public.get_rolle_prestudent(tbl_prestudent.prestudent_id, ?) - AND ps.prestudent_id = tbl_prestudent.prestudent_id - AND ps.studiensemester_kurzbz=public.get_stdsem_prestudent(tbl_prestudent.prestudent_id, ?) - AND ps.ausbildungssemester=public.get_absem_prestudent(tbl_prestudent.prestudent_id, ?) - LEFT JOIN tag_data_agg ON tag_data_agg.prestudent_id = tbl_prestudent.prestudent_id - WHERE tbl_prestudent.studiengang_kz IN ?"; - - $params = array($stdsemEsc, $stdsemEsc, $stdsemEsc, $stdsemEsc, $allowedStg); - - if (!$verband && !$gruppe && $orgform_kurzbz !== null) - { - $qry .= " - AND ( - SELECT orgform_kurzbz - FROM public.tbl_prestudentstatus - WHERE prestudent_id=tbl_prestudent.prestudent_id - AND studiensemester_kurzbz=" . $stdsemEsc . " - ORDER BY datum DESC, insertamum DESC, ext_id DESC LIMIT 1 - ) = " . $orgform_kurzbzEsc ; - } - - if($semester !== null) - { - $qry .= " AND v.semester = ?"; - $params[] = $semester; - } - if($verband !== null) - { - $qry .= " AND v.verband = ?"; - $params[] = $verband; - } - - if($gruppe !== null) - { - $qry .= " AND v.gruppe = ?"; - $params[] = $gruppe; - } - - if($gruppe_kurzbz !== null) - { - $qry .= " AND g.gruppe_kurzbz = ?"; - $qry .= " AND g.studiensemester_kurzbz = ?"; - $params[] = $gruppe_kurzbz; - $params[] = $stdsemEsc; - } - else - { - $qry .= " AND v.studiengang_kz = ?"; - $params[] = $studiengang_kz; - } - - $qry .= " - ORDER BY nachname ASC, vorname ASC - "; - return $this->execReadOnlyQuery($qry, $params); - } - - public function getTagsCTE() - { - $this->load->config('stv'); - $tags = $this->config->item('tags'); - - $whereTags = ''; - if (is_array($tags) && !isEmptyArray($tags)) - { - $tags = array_keys($tags); - - foreach ($tags as $key => $tag) - { - $tags[$key] = $this->db->escape($tag); - } - - $whereTags = " AND tbl_notiz_typ.typ_kurzbz IN (" . implode(",", $tags) . ")"; - } - - return "tag_data_agg AS - ( - SELECT - prestudent_id, - COALESCE(json_agg(tag ORDER BY done), '[]'::json) AS tags - FROM ( - SELECT DISTINCT ON (public.tbl_notiz.notiz_id) - tbl_notiz.notiz_id AS id, - typ_kurzbz, - array_to_json(tbl_notiz_typ.bezeichnung_mehrsprachig)->>0 AS beschreibung, - text AS notiz, - style, - erledigt AS done, - prestudent_id - FROM public.tbl_notizzuordnung - JOIN public.tbl_notiz ON tbl_notizzuordnung.notiz_id = tbl_notiz.notiz_id - JOIN public.tbl_notiz_typ ON tbl_notiz.typ = tbl_notiz_typ.typ_kurzbz - WHERE prestudent_id IN (SELECT prestudent_id FROM prestudenten)" - . $whereTags. - ") AS tag - GROUP BY prestudent_id - )"; - } - } diff --git a/public/js/components/Stv/Studentenverwaltung/List.js b/public/js/components/Stv/Studentenverwaltung/List.js index 3f7dc5057..071bf4206 100644 --- a/public/js/components/Stv/Studentenverwaltung/List.js +++ b/public/js/components/Stv/Studentenverwaltung/List.js @@ -295,7 +295,7 @@ export default { if (selected.length) this.$refs.table.tabulator.selectRow(selected); - } else if(this.lastSelected === undefined) { + } else if(data && this.lastSelected === undefined) { // NOTE(chris): select row if it's the only one (preferably only on startup) if (data.length == 1) { this.$refs.table.tabulator.selectRow(this.$refs.table.tabulator.getRows());