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 {