From b6b21d54fc2261b4b6d51d4b22e97a2f00209ad8 Mon Sep 17 00:00:00 2001 From: cgfhtw Date: Wed, 6 Dec 2023 14:26:59 +0100 Subject: [PATCH 1/9] =?UTF-8?q?Pre-Abbrecher=20Statusgrund=20nach=20zur?= =?UTF-8?q?=C3=BCckgezogen=20wieder=20r=C3=BCckg=C3=A4ngig=20machen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- application/libraries/AntragLib.php | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/application/libraries/AntragLib.php b/application/libraries/AntragLib.php index ff4d5dc63..6b5462b31 100644 --- a/application/libraries/AntragLib.php +++ b/application/libraries/AntragLib.php @@ -62,6 +62,24 @@ class AntragLib 'insertvon' => $insertvon ]); + // NOTE(chris): remove "preabbrecher" statusgrund for Stgl-Abmeldungen if set + $res = $this->_ci->StudierendenantragModel->load($antrag_id); + if (hasData($res) && current(getData($res))->typ == Studierendenantrag_model::TYP_ABMELDUNG_STGL) { + $this->_ci->PrestudentstatusModel->addSelect('tbl_status_grund.statusgrund_kurzbz'); + $res = $this->_ci->PrestudentstatusModel->getLastStatusWithStgEmail(current(getData($res))->prestudent_id, '', 'Student'); + if (hasData($res) && current(getData($res))->statusgrund_kurzbz == 'preabbrecher') { + $prestudentstatus = current(getData($res)); + $this->_ci->PrestudentstatusModel->update([ + 'prestudent_id' => $prestudentstatus->prestudent_id, + 'status_kurzbz'=>$prestudentstatus->status_kurzbz, + 'studiensemester_kurzbz'=>$prestudentstatus->studiensemester_kurzbz, + 'ausbildungssemester'=>$prestudentstatus->ausbildungssemester + ], [ + 'statusgrund_id' => null + ]); + } + } + return $result; } From 14c24005fe5760d34b419c9bf9dcc73624324dff Mon Sep 17 00:00:00 2001 From: cgfhtw Date: Tue, 12 Dec 2023 11:02:12 +0100 Subject: [PATCH 2/9] Wiederholung wenn Studierende das letze Semester wiederholen --- application/libraries/AntragLib.php | 103 ++++++++++++++++-- ...dierendenantraglehrveranstaltung_model.php | 32 +++++- .../models/organisation/Studienplan_model.php | 28 ++++- .../Studierendenantrag/Leitung/LvPopup.js | 14 ++- .../Studierendenantrag/Lvzuweisung.js | 57 +++++----- system/phrasesupdate.php | 40 +++++++ 6 files changed, 221 insertions(+), 53 deletions(-) diff --git a/application/libraries/AntragLib.php b/application/libraries/AntragLib.php index 6b5462b31..f4659dc91 100644 --- a/application/libraries/AntragLib.php +++ b/application/libraries/AntragLib.php @@ -1029,12 +1029,12 @@ class AntragLib $orgform_kurzbz, $semA, $ausbildungssemester + 1, - $antrag->prestudent_id, - $antrag->studiensemester_kurzbz + $antrag->prestudent_id ); if (isError($result)) return $result; $lvsA = $result->retval; // NOTE(chris): don't use getData() because we want to differenciate [] and null + $repeat_last = false; if ($lvsA) { foreach($lvsA as $lv) { @@ -1045,6 +1045,79 @@ class AntragLib $lv->antrag_anmerkung = $lvszugewiesen[$lv->lehrveranstaltung_id]->anmerkung; } } + } elseif ($lvsA === null) { + // NOTE(chris): We are repeating the last semester + $repeat_last = true; + + $result = $this->_ci->PrestudentstatusModel->getStatusByFilter($antrag->prestudent_id, 'Student', $ausbildungssemester - 1); + if (isError($result)) + return $result; + + $stdsems = getData($result) ?: []; + $stdsem = null; + + $result = $this->_ci->StudiensemesterModel->load($antrag->studiensemester_kurzbz); + if (isError($result)) + return $result; + if (!hasData($result)) + return error($this->_ci->p->t('studierendenantrag', 'error_no_stdsem', ['studiensemester_kurzbz' => $antrag->studiensemester_kurzbz])); + $asem = current(getData($result)); + + foreach ($stdsems as $sem) { + $result = $this->_ci->StudiensemesterModel->load($sem->studiensemester_kurzbz); + if (isError($result)) + return $result; + if (hasData($result)) { + if (current(getData($result))->start < $asem->start) { + $stdsem = $sem->studiensemester_kurzbz; + break; + } + } + } + + // NOTE(chris): if we don't find a status in the previous semester there is something wrong + if (!$stdsem) + return error($this->_ci->p->t('studierendenantrag', 'error_no_status_in_prev_sem')); + + $result = $this->getLvsByStgStsemAndSem( + $studiengang_kz, + $orgform_kurzbz, + $semA, + $ausbildungssemester - 1, + $antrag->prestudent_id + ); + if (isError($result)) + return $result; + + $lvsA = getData($result) ?: []; + + $result = $this->getLvsByStgStsemAndSem( + $studiengang_kz, + $orgform_kurzbz, + $stdsem, + $ausbildungssemester - 1, + $antrag->prestudent_id + ); + if (isError($result)) + return $result; + + $lvsAtest = getData($result) ?: []; + + if (count(array_intersect(array_map(function ($a) { + return $a->lehrveranstaltung_id; + }, $lvsA), array_map(function ($a) { + return $a->lehrveranstaltung_id; + }, $lvsAtest)))) { + foreach ($lvsA as $lv) { + if (isset($lvszugewiesen[$lv->lehrveranstaltung_id]) && ($lvszugewiesen[$lv->lehrveranstaltung_id]->note == 0)) { + $lv->antrag_anmerkung = $lvszugewiesen[$lv->lehrveranstaltung_id]->anmerkung; + $lv->antrag_zugelassen = true; + } + + } + } else { + $lvsA = null; + } } $result = $this->getLvsByStgStsemAndSem( @@ -1052,8 +1125,7 @@ class AntragLib $orgform_kurzbz, $semB, $ausbildungssemester, - $antrag->prestudent_id, - $antrag->studiensemester_kurzbz + $antrag->prestudent_id ); if (isError($result)) return $result; @@ -1068,10 +1140,14 @@ class AntragLib // TODO(manu): eventuelle Änderungen taggen } - return success([ + $result = [ '1' . $semA => $lvsA, '2' . $semB => $lvsB ?: [] - ]); + ]; + if ($repeat_last) + $result['repeat_last'] = true; + + return success($result); } public function getLvsByStgStsemAndSem( @@ -1079,8 +1155,7 @@ class AntragLib $orgform_kurzbz, $studiensemester_kurzbz, $ausbildungssemester, - $prestudent_id, - $note_stsem + $prestudent_id ) { $this->_ci->load->model('organisation/Studienplan_model', 'StudienplanModel'); @@ -1120,8 +1195,7 @@ class AntragLib return $this->_ci->StudienplanModel->getStudienplanLehrveranstaltungForPrestudent( $studienplan->studienplan_id, $ausbildungssemester, - $prestudent_id, - $note_stsem + $prestudent_id ); } @@ -1623,6 +1697,7 @@ class AntragLib if ($student_uid) { $email = $this->_ci->StudentModel->getEmailFH($student_uid); + $vorlage = 'Sancho_Mail_Antrag_W_Student'; $sem_not_allowed = $sem_to_repeat = ''; $list_not_allowed = $list_to_repeat = $this->_ci->p->t('studierendenantrag', 'mail_part_error_no_lvs'); @@ -1630,6 +1705,12 @@ class AntragLib $result = $this->getLvsForAntrag($antrag_id); if (hasData($result)) { $lvs = getData($result); + $repeat_last = false; + if (isset($lvs['repeat_last'])) { + $repeat_last = true; + unset($lvs['repeat_last']); + $vorlage .= '_Last'; + } foreach ($lvs as $sem => $lv_list) { $lvs_filtered = array_filter($lv_list, function ($el) { return property_exists($el, 'antrag_zugelassen') && $el->antrag_zugelassen; @@ -1652,7 +1733,7 @@ class AntragLib // NOTE(chris): Sancho mail sendSanchoMail( - 'Sancho_Mail_Antrag_W_Student', + $vorlage, [ 'antrag_id' => $antrag_id, 'stg' => $stg->bezeichnung, diff --git a/application/models/education/Studierendenantraglehrveranstaltung_model.php b/application/models/education/Studierendenantraglehrveranstaltung_model.php index 47a07ecfe..4318c773e 100644 --- a/application/models/education/Studierendenantraglehrveranstaltung_model.php +++ b/application/models/education/Studierendenantraglehrveranstaltung_model.php @@ -65,20 +65,40 @@ class Studierendenantraglehrveranstaltung_model extends DB_Model 'stat.studierendenantrag_status_id = campus.get_status_id_studierendenantrag(a.studierendenantrag_id)' ); $this->addJoin('public.tbl_student s', 'prestudent_id'); - $this->addJoin( - 'lehre.tbl_zeugnisnote z', - 'z.lehrveranstaltung_id=lv.lehrveranstaltung_id AND z.student_uid=s.student_uid AND z.studiensemester_kurzbz=a.studiensemester_kurzbz', - 'LEFT' - ); + + // NOTE(chris): last offizell note + $this->addJoin('( + SELECT z.* + FROM lehre.tbl_zeugnisnote z + LEFT JOIN public.tbl_studiensemester zs + USING(studiensemester_kurzbz) + JOIN ( + SELECT zi.lehrveranstaltung_id, zi.student_uid, MAX(zis.start) AS start + FROM lehre.tbl_zeugnisnote zi + LEFT JOIN lehre.tbl_note zin + USING(note) + LEFT JOIN public.tbl_studiensemester zis + USING(studiensemester_kurzbz) + WHERE zin.aktiv AND zin.offiziell + GROUP BY zi.lehrveranstaltung_id, zi.student_uid + ) zx + ON ( + z.lehrveranstaltung_id=zx.lehrveranstaltung_id + AND z.student_uid=zx.student_uid + AND zs.start = zx.start + )) z', 'z.lehrveranstaltung_id=lv.lehrveranstaltung_id AND z.student_uid=s.student_uid', 'LEFT'); $this->addJoin('lehre.tbl_note zn', 'z.note = zn.note', 'LEFT'); + $this->load->config('studierendenantrag'); + $note_intern_angerechntet = $this->config->item('wiederholung_note_angerechnet'); + return $this->loadWhere([ 'ps.prestudent_id' => $prestudent_id, 'a.typ' => Studierendenantrag_model::TYP_WIEDERHOLUNG, 'stat.studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_APPROVED, 'n.note <> ' => 0, $this->dbTable . '.studiensemester_kurzbz' => $studiensemester_kurzbz, - '(n.note<>19 OR (z.note IS NOT NULL AND zn.positiv))' => null + '(n.note<>' . $this->db->escape($note_intern_angerechntet) . ' OR (z.note IS NOT NULL AND zn.positiv))' => null ]); } } diff --git a/application/models/organisation/Studienplan_model.php b/application/models/organisation/Studienplan_model.php index 66ec06ba8..8422f4607 100644 --- a/application/models/organisation/Studienplan_model.php +++ b/application/models/organisation/Studienplan_model.php @@ -60,7 +60,7 @@ class Studienplan_model extends DB_Model )); } - public function getStudienplanLehrveranstaltungForPrestudent($studienplan_id, $semester, $prestudent_id, $note_stsem) + public function getStudienplanLehrveranstaltungForPrestudent($studienplan_id, $semester, $prestudent_id) { $lang = 'SELECT index FROM public.tbl_sprache WHERE sprache=' . $this->escape(getUserLanguage()); $sql = 'SELECT student_uid FROM public.tbl_student WHERE prestudent_id=' . $this->escape($prestudent_id); @@ -75,11 +75,27 @@ class Studienplan_model extends DB_Model $this->addJoin('lehre.tbl_studienplan_lehrveranstaltung', 'studienplan_id'); $this->addJoin('lehre.tbl_lehrveranstaltung lv', 'lehrveranstaltung_id'); - $this->addJoin( - 'lehre.tbl_zeugnisnote zn', - 'zn.lehrveranstaltung_id=lv.lehrveranstaltung_id AND zn.student_uid=(' . $sql . ') AND zn.studiensemester_kurzbz=' . $this->escape($note_stsem), - 'LEFT' - ); + // NOTE(chris): last offizell note + $this->addJoin('( + SELECT z.* + FROM lehre.tbl_zeugnisnote z + LEFT JOIN public.tbl_studiensemester zs + USING(studiensemester_kurzbz) + JOIN ( + SELECT zi.lehrveranstaltung_id, zi.student_uid, MAX(zis.start) AS start + FROM lehre.tbl_zeugnisnote zi + LEFT JOIN lehre.tbl_note zin + USING(note) + LEFT JOIN public.tbl_studiensemester zis + USING(studiensemester_kurzbz) + WHERE zin.aktiv AND zin.offiziell + GROUP BY zi.lehrveranstaltung_id, zi.student_uid + ) zx + ON ( + z.lehrveranstaltung_id=zx.lehrveranstaltung_id + AND z.student_uid=zx.student_uid + AND zs.start = zx.start + )) zn', 'zn.lehrveranstaltung_id=lv.lehrveranstaltung_id AND zn.student_uid=( ' . $sql . ')', 'LEFT'); $this->addJoin('lehre.tbl_note n', 'n.note=zn.note', 'LEFT'); $this->addOrder('lehre.tbl_studienplan_lehrveranstaltung.sort'); diff --git a/public/js/components/Studierendenantrag/Leitung/LvPopup.js b/public/js/components/Studierendenantrag/Leitung/LvPopup.js index 99455237e..700a2330b 100644 --- a/public/js/components/Studierendenantrag/Leitung/LvPopup.js +++ b/public/js/components/Studierendenantrag/Leitung/LvPopup.js @@ -16,6 +16,7 @@ export default { data(){ return { lvs: null, + repeat_last: false, refresh: true, result: false, check: false @@ -35,13 +36,16 @@ export default { }, methods: { setlvs(param) { - if(param.error) - { + if(param.error) { this.$refs.fetchCompt.error = true; this.$refs.fetchCompt.errorMessage = param.retval; - } - else + } else { + this.repeat_last = !!param.retval.repeat_last; + if (this.repeat_last) { + delete param.retval.repeat_last; + } this.lvs = param.retval; + } }, loadlvs() { if (!this.antragId) @@ -82,7 +86,7 @@ export default { diff --git a/public/js/components/Studierendenantrag/Lvzuweisung.js b/public/js/components/Studierendenantrag/Lvzuweisung.js index 42f390ac3..5ef1e9030 100644 --- a/public/js/components/Studierendenantrag/Lvzuweisung.js +++ b/public/js/components/Studierendenantrag/Lvzuweisung.js @@ -41,10 +41,11 @@ export default { methods: { save() { this.isloading = true; - const forbiddenLvs = this.lvs1.filter(lv => lv.antrag_zugelassen && !lv._children).map(lv => ({ + const forbiddenLvs = this.lvs1.filter(lv => (lv.antrag_zugelassen || this.lvs.repeat_last) + && !lv._children).map(lv => ({ studierendenantrag_id: this.antragId, lehrveranstaltung_id: lv.lehrveranstaltung_id, - zugelassen: 0, + zugelassen: this.lvs.repeat_last ? (lv.antrag_zugelassen ? 1 : 2) : 0, anmerkung: lv.antrag_anmerkung || "", studiensemester_kurzbz: this.lvs1sem })); @@ -109,6 +110,8 @@ export default { .loadCategory(['ui', 'lehre', 'studierendenantrag', 'global']) .then(() => { for (var k in result.data.retval) { + if (k === 'repeat_last') + continue; if (result.data.retval[k] === null) { const alert = document.createElement('div'); alert.innerHTML = this.$p.t('studierendenantrag', 'error_stg_last_semester'); @@ -147,29 +150,33 @@ export default { {title: this.$p.t('lehre','lehrform'), field: "lehrform_kurzbz"}, {title: "ECTS", field: "ects"}, {title: this.$p.t('lehre','note'), field: "note", formatter:(cell, formatterParams, onRendered)=>cell.getValue() || "---"}, - {title: (index==1) ? this.$p.t('studierendenantrag','lv_nicht_zulassen') : this.$p.t('studierendenantrag','lv_wiederholen'), field: "antrag_zugelassen", formatter: (cell, formatterParams, onRendered) => { - let data = cell.getData(); - if(data._children || !data.zeugnis) - return ""; - let input = document.createElement('input'); - input.className = "form-check-input"; - input.type = "checkbox"; - input.role = "switch"; - input.checked = cell.getValue(); - input.addEventListener('input', () => { - lvs[data.studienplan_lehrveranstaltung_id].antrag_zugelassen = input.checked; - cell.getRow().reformat(); - }); - if (this.disabled) { - input.disabled = true; + { + title: index == 1 && !result.data.retval.repeat_last ? this.$p.t('studierendenantrag','lv_nicht_zulassen') : this.$p.t('studierendenantrag','lv_wiederholen'), + field: "antrag_zugelassen", + formatter: (cell, formatterParams, onRendered) => { + let data = cell.getData(); + if(data._children || !data.zeugnis) + return ""; + let input = document.createElement('input'); + input.className = "form-check-input"; + input.type = "checkbox"; + input.role = "switch"; + input.checked = cell.getValue(); + input.addEventListener('input', () => { + lvs[data.studienplan_lehrveranstaltung_id].antrag_zugelassen = input.checked; + cell.getRow().reformat(); + }); + if (this.disabled) { + input.disabled = true; + } + + let div = document.createElement('div'); + div.className = 'form-check form-switch'; + div.append(input); + + return div; } - - let div = document.createElement('div'); - div.className = 'form-check form-switch'; - div.append(input); - - return div; - }}, + }, { title: this.$p.t('global','anmerkung'), field: "antrag_anmerkung", @@ -233,7 +240,7 @@ export default {
- {{$p.t('studierendenantrag', 'title_lv_nicht_zugelassen')}} + {{lvs.repeat_last ? $p.t('studierendenantrag', 'title_lv_wiederholen') : $p.t('studierendenantrag', 'title_lv_nicht_zugelassen')}} {{lvs1sem}}
diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php index 971b9dab1..1627c991f 100644 --- a/system/phrasesupdate.php +++ b/system/phrasesupdate.php @@ -20683,6 +20683,46 @@ array( ) ) ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'error_no_stdsem', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Das Studiensemester {studiensemester_kurzbz} existiert nicht', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Semester {studiensemester_kurzbz} does not exist', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'error_no_status_in_prev_sem', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Kein Status im letzten Semester gefunden', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'No status found in previous semester', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), array( 'app' => 'core', 'category' => 'studierendenantrag', From e6985642023b0a2a39c993fec0abbd93a34ace96 Mon Sep 17 00:00:00 2001 From: cgfhtw Date: Thu, 14 Dec 2023 11:28:19 +0100 Subject: [PATCH 3/9] StudStatus: Toggle "nur aktive anzeigen" --- .../controllers/components/Antrag/Leitung.php | 28 +++++++-- .../components/Studierendenantrag/Leitung.js | 4 +- .../Studierendenantrag/Leitung/Header.js | 60 ++++++++++++++++--- .../Studierendenantrag/Leitung/Table.js | 9 ++- 4 files changed, 85 insertions(+), 16 deletions(-) diff --git a/application/controllers/components/Antrag/Leitung.php b/application/controllers/components/Antrag/Leitung.php index f6b184351..e46c0bc50 100644 --- a/application/controllers/components/Antrag/Leitung.php +++ b/application/controllers/components/Antrag/Leitung.php @@ -75,12 +75,18 @@ class Leitung extends FHC_Controller $this->outputJsonSuccess($stgs); } - public function getAntraege($studiengang = null) + public function getAntraege($studiengang = null, $extra = null) { + if ($studiengang && $studiengang == 'todo') { + $studiengang = $extra; + $extra = true; + } else { + $extra = false; + } - if($studiengang) + if ($studiengang) { $studiengaenge = [$studiengang]; - else { + } else { $studiengaenge =$this->permissionlib->getSTG_isEntitledFor('student/antragfreigabe'); if(!is_array($studiengaenge)) $studiengaenge = []; @@ -96,7 +102,21 @@ class Leitung extends FHC_Controller $antraege = []; if ($studiengaenge) { - $result = $this->StudierendenantragModel->loadForStudiengaenge($studiengaenge); + if ($extra) { + $this->StudierendenantragModel->db->group_start(); + $this->StudierendenantragModel->db->where_not_in('s.studierendenantrag_statustyp_kurzbz', [ + Studierendenantragstatus_model::STATUS_CANCELLED, + Studierendenantragstatus_model::STATUS_APPROVED, + Studierendenantragstatus_model::STATUS_REJECTED, + Studierendenantragstatus_model::STATUS_OBJECTION_DENIED + ]); + $this->StudierendenantragModel->db->or_group_start(); + $this->StudierendenantragModel->db->where('s.studierendenantrag_statustyp_kurzbz', Studierendenantragstatus_model::STATUS_APPROVED); + $this->StudierendenantragModel->db->where('tbl_studierendenantrag.typ', Studierendenantrag_model::TYP_ABMELDUNG_STGL); + $this->StudierendenantragModel->db->group_end(); + $this->StudierendenantragModel->db->group_end(); + } + $result = $this->StudierendenantragModel->loadForStudiengaenge($studiengaenge, null, null, true); if (isError($result)) { $this->output->set_status_header(500); return $this->outputJson('Internal Server Error'); diff --git a/public/js/components/Studierendenantrag/Leitung.js b/public/js/components/Studierendenantrag/Leitung.js index 95828e6cb..ab29ea770 100644 --- a/public/js/components/Studierendenantrag/Leitung.js +++ b/public/js/components/Studierendenantrag/Leitung.js @@ -49,8 +49,8 @@ export default { console.error(error); }); }, - changeFilter(evt) { - this.filter = evt.target.value || undefined; + changeFilter(filter) { + this.filter = filter || undefined; this.reload(); }, reload() { diff --git a/public/js/components/Studierendenantrag/Leitung/Header.js b/public/js/components/Studierendenantrag/Leitung/Header.js index 12bfcbe82..54950856b 100644 --- a/public/js/components/Studierendenantrag/Leitung/Header.js +++ b/public/js/components/Studierendenantrag/Leitung/Header.js @@ -1,3 +1,5 @@ +const LOCAL_STORAGE_ID = 'studierendenantrag_leitung_2023-11-14_header_filter'; + export default { props: { stgs: Array @@ -5,16 +7,60 @@ export default { emits: [ 'input' ], + data() { + return { + todo_value: '', + stg_value: '' + } + }, + computed: { + value() { + const a = []; + if (this.todo_value) + a.push(this.todo_value); + if (this.stg_value) + a.push(this.stg_value); + + return a.join('/'); + } + }, + watch: { + value(n) { + window.localStorage.setItem(LOCAL_STORAGE_ID, n); + this.$emit('input', n); + } + }, + created() { + const values = window.localStorage.getItem(LOCAL_STORAGE_ID).split('/'); + if (values.length) { + if (values.length == 1) { + if (values[0] == 'todo') + values.push(''); + else + values.unshift(''); + } + this.stg_value = values.pop(); + this.todo_value = values.pop(); + } + }, template: `

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

-
- +
+
+ +
+
+ +
` diff --git a/public/js/components/Studierendenantrag/Leitung/Table.js b/public/js/components/Studierendenantrag/Leitung/Table.js index 7bdf5d4a3..7676115c9 100644 --- a/public/js/components/Studierendenantrag/Leitung/Table.js +++ b/public/js/components/Studierendenantrag/Leitung/Table.js @@ -80,7 +80,7 @@ export default { { let val = cell.getValue(); if (!val) - return ''; + return ' '; let date = new Date(val); return date.toLocaleDateString(); } @@ -201,7 +201,7 @@ export default { this.$refs.modalGrundPre.innerHTML = val; }); - return val ? link : ''; + return val ? link : ' '; } }, { field: 'dms_id', @@ -209,7 +209,7 @@ export default { formatter: (cell, formatterParams, onRendered) => { let val = cell.getValue(); if (!val) - return ''; + return ' '; let link = document.createElement('a'); link.href = FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + @@ -338,6 +338,9 @@ export default { container.append(button); } + if (container.innerHTML == '') + container.innerHTML = ' '; + return container; } }] From f4194c251a476db0e88bdeac851e2989b7b0b04b Mon Sep 17 00:00:00 2001 From: cgfhtw Date: Mon, 18 Dec 2023 14:27:32 +0100 Subject: [PATCH 4/9] loadActiveForStudiengaenge eigene Funktion --- .../controllers/components/Antrag/Leitung.php | 18 +++--------------- .../education/Studierendenantrag_model.php | 17 +++++++++++++++++ 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/application/controllers/components/Antrag/Leitung.php b/application/controllers/components/Antrag/Leitung.php index e46c0bc50..4c99fcca1 100644 --- a/application/controllers/components/Antrag/Leitung.php +++ b/application/controllers/components/Antrag/Leitung.php @@ -102,21 +102,9 @@ class Leitung extends FHC_Controller $antraege = []; if ($studiengaenge) { - if ($extra) { - $this->StudierendenantragModel->db->group_start(); - $this->StudierendenantragModel->db->where_not_in('s.studierendenantrag_statustyp_kurzbz', [ - Studierendenantragstatus_model::STATUS_CANCELLED, - Studierendenantragstatus_model::STATUS_APPROVED, - Studierendenantragstatus_model::STATUS_REJECTED, - Studierendenantragstatus_model::STATUS_OBJECTION_DENIED - ]); - $this->StudierendenantragModel->db->or_group_start(); - $this->StudierendenantragModel->db->where('s.studierendenantrag_statustyp_kurzbz', Studierendenantragstatus_model::STATUS_APPROVED); - $this->StudierendenantragModel->db->where('tbl_studierendenantrag.typ', Studierendenantrag_model::TYP_ABMELDUNG_STGL); - $this->StudierendenantragModel->db->group_end(); - $this->StudierendenantragModel->db->group_end(); - } - $result = $this->StudierendenantragModel->loadForStudiengaenge($studiengaenge, null, null, true); + $result = $extra + ? $this->StudierendenantragModel->loadActiveForStudiengaenge($studiengaenge) + : $this->StudierendenantragModel->loadForStudiengaenge($studiengaenge); if (isError($result)) { $this->output->set_status_header(500); return $this->outputJson('Internal Server Error'); diff --git a/application/models/education/Studierendenantrag_model.php b/application/models/education/Studierendenantrag_model.php index 60e53365c..da9d53aba 100644 --- a/application/models/education/Studierendenantrag_model.php +++ b/application/models/education/Studierendenantrag_model.php @@ -73,6 +73,23 @@ class Studierendenantrag_model extends DB_Model return $this->loadWhere($where); } + public function loadActiveForStudiengaenge($studiengaenge) { + $this->db->group_start(); + $this->db->where_not_in('s.studierendenantrag_statustyp_kurzbz', [ + Studierendenantragstatus_model::STATUS_CANCELLED, + Studierendenantragstatus_model::STATUS_APPROVED, + Studierendenantragstatus_model::STATUS_REJECTED, + Studierendenantragstatus_model::STATUS_OBJECTION_DENIED + ]); + $this->db->or_group_start(); + $this->db->where('s.studierendenantrag_statustyp_kurzbz', Studierendenantragstatus_model::STATUS_APPROVED); + $this->db->where('tbl_studierendenantrag.typ', Studierendenantrag_model::TYP_ABMELDUNG_STGL); + $this->db->group_end(); + $this->db->group_end(); + + return $this->loadForStudiengaenge($studiengaenge); + } + public function isInStudiengang($studierendenantrag_id, $studiengaenge) { $this->addJoin('public.tbl_prestudent', 'prestudent_id'); From a02e79a33a98736f7c0e0ef86c0b48c4e8a3f9e3 Mon Sep 17 00:00:00 2001 From: Harald Bamberger Date: Tue, 19 Dec 2023 18:14:08 +0100 Subject: [PATCH 5/9] fix sancho mail template kurzbz too long --- application/libraries/AntragLib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/libraries/AntragLib.php b/application/libraries/AntragLib.php index 46d21df05..96c1a90d8 100644 --- a/application/libraries/AntragLib.php +++ b/application/libraries/AntragLib.php @@ -1728,7 +1728,7 @@ class AntragLib if (isset($lvs['repeat_last'])) { $repeat_last = true; unset($lvs['repeat_last']); - $vorlage .= '_Last'; + $vorlage .= '_Lst'; } foreach ($lvs as $sem => $lv_list) { $lvs_filtered = array_filter($lv_list, function ($el) { From 6c0fa3fed35d5822140d6c5c2bb3587da741b8dd Mon Sep 17 00:00:00 2001 From: cgfhtw Date: Wed, 20 Dec 2023 09:14:58 +0100 Subject: [PATCH 6/9] Leitungsansicht: Aktiv Default & korrekter Filter beim Neuladen der Seite --- public/js/components/Studierendenantrag/Leitung.js | 4 +++- .../components/Studierendenantrag/Leitung/Header.js | 11 +++++++++-- .../js/components/Studierendenantrag/Leitung/Table.js | 5 +++-- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/public/js/components/Studierendenantrag/Leitung.js b/public/js/components/Studierendenantrag/Leitung.js index ab29ea770..0db2cc2c0 100644 --- a/public/js/components/Studierendenantrag/Leitung.js +++ b/public/js/components/Studierendenantrag/Leitung.js @@ -54,7 +54,8 @@ export default { this.reload(); }, reload() { - this.$refs.table.reload(this.filter); + if (this.$refs.table) + this.$refs.table.reload(this.filter); this.loadFilter(); }, download() { @@ -336,6 +337,7 @@ export default { ref="table" :stg-a="stgkzA" :stg-l="stgkzL" + :filter="filter" v-model:columnData="columns" v-model:selectedData="selectedData" @action:approve="actionApprove" diff --git a/public/js/components/Studierendenantrag/Leitung/Header.js b/public/js/components/Studierendenantrag/Leitung/Header.js index 017148689..eae130de5 100644 --- a/public/js/components/Studierendenantrag/Leitung/Header.js +++ b/public/js/components/Studierendenantrag/Leitung/Header.js @@ -31,7 +31,14 @@ export default { } }, created() { - const values = window.localStorage.getItem(LOCAL_STORAGE_ID).split('/'); + var values = 'todo'; + const savedPath = window.localStorage.getItem(LOCAL_STORAGE_ID); + if (savedPath !== null) { + values = savedPath; + } + + values = values.split('/'); + if (values.length) { if (values.length == 1) { if (values[0] == 'todo') @@ -49,8 +56,8 @@ export default {
diff --git a/public/js/components/Studierendenantrag/Leitung/Table.js b/public/js/components/Studierendenantrag/Leitung/Table.js index 7676115c9..c4d794326 100644 --- a/public/js/components/Studierendenantrag/Leitung/Table.js +++ b/public/js/components/Studierendenantrag/Leitung/Table.js @@ -13,7 +13,8 @@ export default { selectedData: Array, columnData: Array, stgL: Array, - stgA: Array + stgA: Array, + filter: String }, emits: [ 'update:columnData', @@ -90,7 +91,7 @@ export default { movableColumns: true, maxHeight: '50vh', layout: "fitDataFill", - ajaxURL: this.ajaxUrl, + ajaxURL: this.ajaxUrl + (this.filter || ''), persistence: { // NOTE(chris): do not store column titles sort: true, //persist column sorting filter: true, //persist filters From ba7f60b16eec2918fbfbeb8059a5f7fbba2781c4 Mon Sep 17 00:00:00 2001 From: cgfhtw Date: Wed, 20 Dec 2023 09:18:44 +0100 Subject: [PATCH 7/9] Filter Beschriftung --- .../Studierendenantrag/Leitung/Header.js | 4 +- system/phrasesupdate.php | 40 +++++++++++++++++++ 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/public/js/components/Studierendenantrag/Leitung/Header.js b/public/js/components/Studierendenantrag/Leitung/Header.js index eae130de5..addb3ff72 100644 --- a/public/js/components/Studierendenantrag/Leitung/Header.js +++ b/public/js/components/Studierendenantrag/Leitung/Header.js @@ -56,8 +56,8 @@ export default {
diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php index 84279888d..14882b38d 100644 --- a/system/phrasesupdate.php +++ b/system/phrasesupdate.php @@ -19885,6 +19885,46 @@ array( ) ) ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'filter_all', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'alle anzeigen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'show all', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'studierendenantrag', + 'phrase' => 'filter_todo', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'nur offene anzeigen', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'only show open', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), array( 'app' => 'core', 'category' => 'studierendenantrag', From ca55b63e01758d0f7a407c5e859b1429c3ddd97f Mon Sep 17 00:00:00 2001 From: cgfhtw Date: Wed, 20 Dec 2023 09:30:44 +0100 Subject: [PATCH 8/9] =?UTF-8?q?Load=20Language=20before=20Antr=C3=A4ge?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../models/education/Studierendenantrag_model.php | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/application/models/education/Studierendenantrag_model.php b/application/models/education/Studierendenantrag_model.php index da9d53aba..3d688eb82 100644 --- a/application/models/education/Studierendenantrag_model.php +++ b/application/models/education/Studierendenantrag_model.php @@ -26,9 +26,10 @@ class Studierendenantrag_model extends DB_Model return $this->loadForStudiengaenge($studiengaenge, $typ, $this->StudierendenantragstatusModel::STATUS_CREATED); } - public function loadForStudiengaenge($studiengaenge, $typ = null, $status = null) + public function loadForStudiengaenge($studiengaenge, $typ = null, $status = null, $sql = null) { - $sql = "SELECT index FROM public.tbl_sprache WHERE sprache='" . getUserLanguage() . "' LIMIT 1"; + if ($sql == null) + $sql = "SELECT index FROM public.tbl_sprache WHERE sprache='" . getUserLanguage() . "' LIMIT 1"; $this->addSelect('UPPER(stg.typ) || UPPER(stg.kurzbz) || \' \' || stg.bezeichnung AS bezeichnung'); $this->addSelect('bezeichnung_mehrsprachig[(' . $sql . ')] AS orgform', false); @@ -74,6 +75,9 @@ class Studierendenantrag_model extends DB_Model } public function loadActiveForStudiengaenge($studiengaenge) { + // NOTE(chris): get language before changing things in the global db object because getUserLanguage() might use it and it should not have been tampered with + $sql = "SELECT index FROM public.tbl_sprache WHERE sprache='" . getUserLanguage() . "' LIMIT 1"; + $this->db->group_start(); $this->db->where_not_in('s.studierendenantrag_statustyp_kurzbz', [ Studierendenantragstatus_model::STATUS_CANCELLED, @@ -87,7 +91,7 @@ class Studierendenantrag_model extends DB_Model $this->db->group_end(); $this->db->group_end(); - return $this->loadForStudiengaenge($studiengaenge); + return $this->loadForStudiengaenge($studiengaenge, null, null, $sql); } public function isInStudiengang($studierendenantrag_id, $studiengaenge) From 3f88bba9bb9a812a1503b37f1a31e84ab4915e82 Mon Sep 17 00:00:00 2001 From: cgfhtw Date: Wed, 20 Dec 2023 12:06:45 +0100 Subject: [PATCH 9/9] =?UTF-8?q?Negative=20Pr=C3=BCfungen=20sortiert=20und?= =?UTF-8?q?=20bei=20bestehenden=20Antr=C3=A4gen=20nach=20Antragsdatum=20un?= =?UTF-8?q?d=20Stdsem=20gefiltert?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controllers/components/Antrag/Wiederholung.php | 3 +-- application/libraries/AntragLib.php | 6 ++++-- application/models/education/Pruefung_model.php | 11 ++++++++++- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/application/controllers/components/Antrag/Wiederholung.php b/application/controllers/components/Antrag/Wiederholung.php index 515771224..418d05f45 100644 --- a/application/controllers/components/Antrag/Wiederholung.php +++ b/application/controllers/components/Antrag/Wiederholung.php @@ -76,10 +76,9 @@ class Wiederholung extends FHC_Controller if (isError($result)) { return $this->outputJsonError(getError($result)); } - $data = getData($result); - $result = $this->antraglib->getFailedExamForPrestudent($prestudent_id); + $result = $this->antraglib->getFailedExamForPrestudent($prestudent_id, $data->datum, $data->studiensemester_kurzbz); // NOTE(chris): error handling for this function should already happenden in antraglib->getPrestudentWiederholungsBerechtigt() $pruefungsdata = current(getData($result)); diff --git a/application/libraries/AntragLib.php b/application/libraries/AntragLib.php index 96c1a90d8..335bfab27 100644 --- a/application/libraries/AntragLib.php +++ b/application/libraries/AntragLib.php @@ -1499,6 +1499,8 @@ class AntragLib $resultDetails->grund = $resultAntrag->grund; $resultDetails->studierendenantrag_id = $resultAntrag->studierendenantrag_id; $resultDetails->typ = $resultAntrag->typ; + $resultDetails->datum = $resultAntrag->datum; + $resultDetails->studiensemester_kurzbz = $resultAntrag->studiensemester_kurzbz; return success($resultDetails); } @@ -1600,9 +1602,9 @@ class AntragLib ); } - public function getFailedExamForPrestudent($prestudent_id) + public function getFailedExamForPrestudent($prestudent_id, $max_date = null, $studiensemester_kurzbz = null) { - return $this->_ci->PruefungModel->loadWhereCommitteeExamFailedForPrestudent($prestudent_id); + return $this->_ci->PruefungModel->loadWhereCommitteeExamFailedForPrestudent($prestudent_id, $max_date, $studiensemester_kurzbz); } public function saveLvs($lvArray) diff --git a/application/models/education/Pruefung_model.php b/application/models/education/Pruefung_model.php index e1d668293..50109d2f1 100644 --- a/application/models/education/Pruefung_model.php +++ b/application/models/education/Pruefung_model.php @@ -139,6 +139,8 @@ class Pruefung_model extends DB_Model $this->db->where_not_in("n.note", $note_blacklist); $this->db->where_in("p.pruefungstyp_kurzbz", ['kommPruef','zusKommPruef']); + $this->addOrder('p.datum', 'DESC'); + return $this->load(); } @@ -201,12 +203,19 @@ class Pruefung_model extends DB_Model * * @return stdClass */ - public function loadWhereCommitteeExamFailedForPrestudent($prestudent_id) + public function loadWhereCommitteeExamFailedForPrestudent($prestudent_id, $max_date = null, $studiensemester_kurzbz = null) { $this->withDetailsForStudierendenAntrag(); $this->db->where('ps.prestudent_id', $prestudent_id); + if ($max_date !== null) { + $this->db->where('p.datum <', $max_date); + } + if ($studiensemester_kurzbz !== null) { + $this->db->where('le.studiensemester_kurzbz', $studiensemester_kurzbz); + } + return $this->loadWhereCommitteeExamsFailed(); }
- {{ $p.t('studierendenantrag',['title_lv_nicht_zugelassen', 'title_lv_wiederholen'][sem.substr(0,1)-1]) }} + {{ $p.t('studierendenantrag',['title_lv_nicht_zugelassen', 'title_lv_wiederholen'][repeat_last ? 1 : sem.substr(0,1)-1]) }} {{sem.substr(1)}}