Merge branch 'feature-35066/Studstatus_divers'

This commit is contained in:
Harald Bamberger
2023-12-20 19:57:33 +01:00
13 changed files with 402 additions and 76 deletions
@@ -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,9 @@ class Leitung extends FHC_Controller
$antraege = [];
if ($studiengaenge) {
$result = $this->StudierendenantragModel->loadForStudiengaenge($studiengaenge);
$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');
@@ -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));
+113 -10
View File
@@ -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;
}
@@ -1013,12 +1031,12 @@ class AntragLib
$semA,
$ausbildungssemester + 1,
$antrag->prestudent_id,
$antrag->studiensemester_kurzbz,
$sprache
);
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)
{
@@ -1029,6 +1047,81 @@ 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,
$sprache
);
if (isError($result))
return $result;
$lvsA = getData($result) ?: [];
$result = $this->getLvsByStgStsemAndSem(
$studiengang_kz,
$orgform_kurzbz,
$stdsem,
$ausbildungssemester - 1,
$antrag->prestudent_id,
$sprache
);
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(
@@ -1037,7 +1130,6 @@ class AntragLib
$semB,
$ausbildungssemester,
$antrag->prestudent_id,
$antrag->studiensemester_kurzbz,
$sprache
);
if (isError($result))
@@ -1053,10 +1145,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(
@@ -1065,7 +1161,6 @@ class AntragLib
$studiensemester_kurzbz,
$ausbildungssemester,
$prestudent_id,
$note_stsem,
$sprache
) {
$this->_ci->load->model('organisation/Studienplan_model', 'StudienplanModel');
@@ -1119,8 +1214,7 @@ class AntragLib
return $this->_ci->StudienplanModel->getStudienplanLehrveranstaltungForPrestudent(
$studienplan->studienplan_id,
$ausbildungssemester,
$prestudent_id,
$note_stsem
$prestudent_id
);
}
@@ -1405,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);
}
@@ -1506,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)
@@ -1622,6 +1718,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');
@@ -1629,6 +1726,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 .= '_Lst';
}
foreach ($lvs as $sem => $lv_list) {
$lvs_filtered = array_filter($lv_list, function ($el) {
return property_exists($el, 'antrag_zugelassen') && $el->antrag_zugelassen;
@@ -1651,7 +1754,7 @@ class AntragLib
// NOTE(chris): Sancho mail
sendSanchoMail(
'Sancho_Mail_Antrag_W_Student',
$vorlage,
[
'antrag_id' => $antrag_id,
'stg' => $stg->bezeichnung,
@@ -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();
}
@@ -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);
@@ -73,6 +74,26 @@ class Studierendenantrag_model extends DB_Model
return $this->loadWhere($where);
}
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,
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, null, null, $sql);
}
public function isInStudiengang($studierendenantrag_id, $studiengaenge)
{
$this->addJoin('public.tbl_prestudent', 'prestudent_id');
@@ -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');