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',
- {{ $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)}}