refactor prepareQuery, use and take into account config parameters, refactor autoSelectRows

This commit is contained in:
ma0068
2025-10-08 16:34:39 +02:00
parent 3a6c8dfd2d
commit 204ae1a469
5 changed files with 53 additions and 219 deletions
+10 -4
View File
@@ -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],
];
@@ -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');
@@ -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'));
}*/
}
}
-166
View File
@@ -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
)";
}
}
@@ -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());