Wiederholung wenn Studierende das letze Semester wiederholen

This commit is contained in:
cgfhtw
2023-12-12 11:02:12 +01:00
parent b6b21d54fc
commit 14c24005fe
6 changed files with 221 additions and 53 deletions
+92 -11
View File
@@ -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,
@@ -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
]);
}
}
@@ -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');
@@ -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 {
<table v-else class="table caption-top" v-for="(lv_arr, sem) in lvzugelassen" :key="sem">
<caption>
<span class="d-flex justify-content-between">
<span>{{ $p.t('studierendenantrag',['title_lv_nicht_zugelassen', 'title_lv_wiederholen'][sem.substr(0,1)-1]) }}</span>
<span>{{ $p.t('studierendenantrag',['title_lv_nicht_zugelassen', 'title_lv_wiederholen'][repeat_last ? 1 : sem.substr(0,1)-1]) }}</span>
<span>{{sem.substr(1)}}</span>
</span>
</caption>
@@ -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 {
<div ref="alertbox"></div>
<span class="d-flex justify-content-between h4">
<span>{{$p.t('studierendenantrag', 'title_lv_nicht_zugelassen')}}</span>
<span>{{lvs.repeat_last ? $p.t('studierendenantrag', 'title_lv_wiederholen') : $p.t('studierendenantrag', 'title_lv_nicht_zugelassen')}}</span>
<span>{{lvs1sem}}</span>
</span>
<div ref="lvtable1" class="mb-3">
+40
View File
@@ -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',