mirror of
https://github.com/FH-Complete/FHC-Core.git
synced 2026-06-23 23:19:28 +00:00
Wiederholung wenn Studierende das letze Semester wiederholen
This commit is contained in:
@@ -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">
|
||||
|
||||
@@ -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',
|
||||
|
||||
Reference in New Issue
Block a user