Pause feature

This commit is contained in:
cgfhtw
2024-02-29 08:34:58 +01:00
parent 4bbac35540
commit 2d2098984a
17 changed files with 876 additions and 45 deletions
@@ -116,6 +116,96 @@ class Leitung extends FHC_Controller
$this->outputJsonSuccess($studierendenantrag_id);
}
public function pauseAntrag()
{
$this->load->library('form_validation');
$_POST = json_decode($this->input->raw_input_stream, true);
$this->form_validation->set_rules(
'studierendenantrag_id',
'Studierenden Antrag',
[
'required',
[
'isEntitledToPauseAntrag',
[$this->antraglib, 'isEntitledToPauseAntrag']
],
[
'antragCanBeManualPaused',
[$this->antraglib, 'antragCanBeManualPaused']
]
],
[
'isEntitledToPauseAntrag' => $this->p->t('studierendenantrag', 'error_no_right'),
'antragCanBeManualPaused' => $this->p->t(
'studierendenantrag',
'error_not_pauseable',
['id' => $this->input->post('studierendenantrag_id')]
)
]
);
if ($this->form_validation->run() == false)
{
return $this->outputJsonError($this->form_validation->error_array());
}
$studierendenantrag_id = $this->input->post('studierendenantrag_id');
$result = $this->antraglib->pauseAntrag($studierendenantrag_id, getAuthUID());
if (isError($result))
return $this->outputJsonError(['studierendenantrag_id' => getError($result)]);
$this->outputJsonSuccess($studierendenantrag_id);
}
public function unpauseAntrag()
{
$this->load->library('form_validation');
$_POST = json_decode($this->input->raw_input_stream, true);
$this->form_validation->set_rules(
'studierendenantrag_id',
'Studierenden Antrag',
[
'required',
[
'isEntitledToUnpauseAntrag',
[$this->antraglib, 'isEntitledToUnpauseAntrag']
],
[
'antragCanBeManualUnpaused',
[$this->antraglib, 'antragCanBeManualUnpaused']
]
],
[
'isEntitledToUnpauseAntrag' => $this->p->t('studierendenantrag', 'error_no_right'),
'antragCanBeManualUnpaused' => $this->p->t(
'studierendenantrag',
'error_not_paused',
['id' => $this->input->post('studierendenantrag_id')]
)
]
);
if ($this->form_validation->run() == false)
{
return $this->outputJsonError($this->form_validation->error_array());
}
$studierendenantrag_id = $this->input->post('studierendenantrag_id');
$result = $this->antraglib->unpauseAntrag($studierendenantrag_id, getAuthUID());
if (isError($result))
return $this->outputJsonError(['studierendenantrag_id' => getError($result)]);
$this->outputJsonSuccess($studierendenantrag_id);
}
public function objectAntrag()
{
$this->load->library('form_validation');
@@ -161,6 +161,18 @@ class Wiederholung extends FHC_Controller
{
return $this->outputJsonError(['db' => $this->p->t('studierendenantrag', 'error_no_student')]);
}
elseif ($result == -1)
{
$result = $this->PrestudentstatusModel->getLastStatus($prestudent_id);
if (isError($result))
return $this->outputJsonError(['db' => getError($result)]);
if (!hasData($result))
return $this->outputJsonError(['db' => $this->p->t('studierendenantrag', 'error_no_prestudentstatus', [
'prestudent_id' => $prestudent_id
])]);
if (!in_array(current(getData($result))->status_kurzbz, $this->_ci->config->item('antrag_prestudentstatus_whitelist')))
return $this->outputJsonError(['db' => $this->p->t('studierendenantrag', 'error_no_student')]);
}
elseif ($result == -2)
{
return $this->outputJsonError(['db' => $this->p->t('studierendenantrag', 'error_antrag_exists')]);
@@ -316,6 +316,10 @@ class AntragJob extends JOB_Controller
} else {
$deregisterStatus = getData($result);
$result = $this->antraglib->pauseAntrag($prestudent->studierendenantrag_id, Studierendenantragstatus_model::INSERTVON_DEREGISTERED);
if (isError($result))
$this->logError(getError($result));
$result = $this->prestudentlib->setAbbrecher($prestudent->prestudent_id, '', $insertvon);
if (isError($result)) {
$this->StudierendenantragstatusModel->delete($deregisterStatus);
@@ -426,6 +430,10 @@ class AntragJob extends JOB_Controller
else {
$deregisterStatus = getData($result);
$result = $this->antraglib->pauseAntrag($antrag->studierendenantrag_id, Studierendenantragstatus_model::INSERTVON_DEREGISTERED);
if (isError($result))
$this->logError(getError($result));
$result = $this->prestudentlib->setAbbrecher(
$antrag->prestudent_id,
$antrag->studiensemester_kurzbz,
+163 -15
View File
@@ -62,9 +62,11 @@ class AntragLib
'insertvon' => $insertvon
]);
// NOTE(chris): remove "preabbrecher" statusgrund for Stgl-Abmeldungen if set
// NOTE(chris): remove "preabbrecher" statusgrund and paused stati for sibling Anträge 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->unpauseAntrag($antrag_id, Studierendenantragstatus_model::INSERTVON_ABMELDUNGSTGL);
$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') {
@@ -83,6 +85,67 @@ class AntragLib
return $result;
}
/**
* @param integer $antrag_id
* @param string $insertvon
*
* @return stdClass
*/
public function pauseAntrag($antrag_id, $insertvon)
{
switch ($insertvon) {
case Studierendenantragstatus_model::INSERTVON_ABMELDUNGSTGL:
$result = $this->_ci->StudierendenantragstatusModel->stopAntraegeForAbmeldungStgl($antrag_id);
break;
case Studierendenantragstatus_model::INSERTVON_DEREGISTERED:
$result = $this->_ci->StudierendenantragstatusModel->stopAntraegeForAbbruchBy($antrag_id);
break;
default:
$result = $this->_ci->StudierendenantragstatusModel->insert([
'studierendenantrag_id' => $antrag_id,
'studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_PAUSE,
'insertvon' => $insertvon
]);
break;
}
return $result;
}
/**
* @param integer $antrag_id
* @param string $insertvon
*
* @return stdClass
*/
public function unpauseAntrag($antrag_id, $insertvon)
{
if ($insertvon == Studierendenantragstatus_model::INSERTVON_DEREGISTERED)
return error($this->p->t('studierendenantrag', 'error_no_right'));
if ($insertvon == Studierendenantragstatus_model::INSERTVON_ABMELDUNGSTGL) {
return $this->_ci->StudierendenantragstatusModel->resumeAntraegeForAbmeldungStgl($antrag_id);
}
// NOTE(chris): get last status that is not pause
$this->_ci->StudierendenantragstatusModel->addOrder('insertamum');
$this->_ci->StudierendenantragstatusModel->addLimit(1);
$result = $this->_ci->StudierendenantragstatusModel->loadWhere([
'studierendenantrag_id' => $antrag_id,
'studierendenantrag_statustyp_kurzbz !=' => Studierendenantragstatus_model::STATUS_PAUSE
]);
if (isError($result))
return $result;
if (!hasData($result))
return error($this->_ci->p->t('studierendenantrag', 'error_no_antragstatus', ['id' => $antrag_id]));
$status = current(getData($result));
$result = $this->_ci->StudierendenantragstatusModel->insert([
'studierendenantrag_id' => $antrag_id,
'studierendenantrag_statustyp_kurzbz' => $status->studierendenantrag_statustyp_kurzbz,
'insertvon' => $insertvon
]);
return $result;
}
/**
* NOTE(chris): permissions & verification must be handled outside
*
@@ -190,6 +253,10 @@ class AntragLib
$vorlage ='Sancho_Mail_Antrag_A_Approve';
$subject = $this->_ci->p->t('studierendenantrag', 'mail_subject_A_Approve');
$result = $this->pauseAntrag($studierendenantrag_id, Studierendenantragstatus_model::INSERTVON_DEREGISTERED);
if (isError($result))
$errors[] = getError($result);
$result = $this->_ci->prestudentlib->setAbbrecher(
$antrag->prestudent_id,
$antrag->studiensemester_kurzbz,
@@ -229,6 +296,10 @@ class AntragLib
sendSanchoMail($vorlage, $data, $prestudent_status->email, $subject);
}
} else { // ($antrag->typ == Studierendenantrag_model::TYP_ABMELDUNG_STGL)
$result = $this->pauseAntrag($studierendenantrag_id, Studierendenantragstatus_model::INSERTVON_ABMELDUNGSTGL);
if (isError($result))
$errors[] = getError($result);
$result = $this->_ci->PrestudentstatusModel->getLastStatusWithStgEmail($antrag->prestudent_id, '', 'Student');
if (isError($result))
{
@@ -340,6 +411,10 @@ class AntragLib
if (isError($result))
return $result;
else {
$result = $this->pauseAntrag($studierendenantrag_id, Studierendenantragstatus_model::INSERTVON_DEREGISTERED);
// NOTE(chris): here we should have error handling but at the
// moment there is no way to notify the user for "soft" errors
$result = $this->_ci->prestudentlib->setAbbrecher(
$antrag->prestudent_id,
$antrag->studiensemester_kurzbz,
@@ -1224,10 +1299,10 @@ class AntragLib
* @param integer $prestudent_id
*
* @return \stdClass on success retval 0 means not a student;
* retval 1 means Berechtigt;
* retval -1 means has already an Antrag pending;
* retval -2 means other Antrag pending;
* retval -3 means in blacklist stg
* retval 1 means Berechtigt;
* retval -1 means has already an Antrag pending;
* retval -2 means other Antrag pending;
* retval -3 means in blacklist stg
*/
public function getPrestudentAbmeldeBerechtigt($prestudent_id)
{
@@ -1251,12 +1326,24 @@ class AntragLib
if (!in_array($result->status_kurzbz, $this->_ci->config->item('antrag_prestudentstatus_whitelist_abmeldung'))) {
$result = $this->_ci->StudierendenantragModel->loadWithStatusWhere([
'prestudent_id' => $prestudent_id,
'campus.get_status_studierendenantrag(studierendenantrag_id)' => Studierendenantragstatus_model::STATUS_APPROVED
], [
Studierendenantrag_model::TYP_ABMELDUNG,
Studierendenantrag_model::TYP_ABMELDUNG_STGL
]);
'prestudent_id' => $prestudent_id,
's.studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_APPROVED
], [
Studierendenantrag_model::TYP_ABMELDUNG,
Studierendenantrag_model::TYP_ABMELDUNG_STGL
]);
if (isError($result))
return $result;
if (hasData($result))
return success(-1);
$result = $this->_ci->StudierendenantragModel->loadWithStatusWhere([
'prestudent_id' => $prestudent_id,
's.studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_PAUSE
], [
Studierendenantrag_model::TYP_ABMELDUNG,
Studierendenantrag_model::TYP_ABMELDUNG_STGL
]);
if (isError($result))
return $result;
if (hasData($result))
@@ -1297,7 +1384,7 @@ class AntragLib
* @param string $studiensemester_kurzbz (optional)
*
* @return \stdClass on success retval 0 means not a student;
* retval 1 means Berechtigt;
* retval 1 means Berechtigt;
* retval -1 means has already an Antrag pending;
* retval -2 means other Antrag pending;
* retval -3 means in blacklist stg
@@ -1410,7 +1497,7 @@ class AntragLib
$result = $this->_ci->StudierendenantragModel->loadWithStatusWhere([
'prestudent_id' => $prestudent_id,
'typ' => Studierendenantrag_model::TYP_WIEDERHOLUNG,
'campus.get_status_studierendenantrag(studierendenantrag_id)' => Studierendenantragstatus_model::STATUS_APPROVED
's.studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_APPROVED
]);
if (isError($result))
return $result;
@@ -1420,7 +1507,17 @@ class AntragLib
$result = $this->_ci->StudierendenantragModel->loadWithStatusWhere([
'prestudent_id' => $prestudent_id,
'typ' => Studierendenantrag_model::TYP_WIEDERHOLUNG,
'campus.get_status_studierendenantrag(studierendenantrag_id)' => Studierendenantragstatus_model::STATUS_DEREGISTERED
's.studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_DEREGISTERED
]);
if (isError($result))
return $result;
if (hasData($result))
return success(-1);
$result = $this->_ci->StudierendenantragModel->loadWithStatusWhere([
'prestudent_id' => $prestudent_id,
'typ' => Studierendenantrag_model::TYP_WIEDERHOLUNG,
's.studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_PAUSE
]);
if (isError($result))
return $result;
@@ -1510,6 +1607,7 @@ class AntragLib
$resultDetails->status = $resultAntrag->status;
$resultDetails->statustyp = $resultAntrag->statustyp;
$resultDetails->status_insertvon = $resultAntrag->status_insertvon;
$resultDetails->grund = $resultAntrag->grund;
$resultDetails->studierendenantrag_id = $resultAntrag->studierendenantrag_id;
$resultDetails->typ = $resultAntrag->typ;
@@ -1522,7 +1620,7 @@ class AntragLib
public function getDetailsForAntrag($studierendenantrag_id)
{
$where = [
'studierendenantrag_id' => $studierendenantrag_id
's.studierendenantrag_id' => $studierendenantrag_id
];
$result = $this->_ci->StudierendenantragModel->loadWithStatusWhere($where);
@@ -1899,6 +1997,26 @@ class AntragLib
return $this->hasAccessToAntrag($antrag_id, 'student/studierendenantrag');
}
/**
* @param integer $antrag_id
*
* @return boolean
*/
public function isEntitledToPauseAntrag($antrag_id)
{
return ($this->hasAccessToAntrag($antrag_id, 'student/antragfreigabe') || $this->hasAccessToAntrag($antrag_id, 'student/studierendenantrag'));
}
/**
* @param integer $antrag_id
*
* @return boolean
*/
public function isEntitledToUnpauseAntrag($antrag_id)
{
return $this->hasAccessToAntrag($antrag_id, 'student/studierendenantrag');
}
/**
* @param integer $antrag_id
*
@@ -1939,6 +2057,36 @@ class AntragLib
return $this->hasAccessToAntrag($antrag_id, 'student/antragfreigabe');
}
/**
* @param integer $antrag_id
*
* @return boolean
*/
public function antragCanBeManualPaused($antrag_id)
{
$this->_ci->StudierendenantragModel->db->where_not_in('campus.get_status_studierendenantrag(studierendenantrag_id)', [
Studierendenantragstatus_model::STATUS_DEREGISTERED,
Studierendenantragstatus_model::STATUS_APPROVED,
Studierendenantragstatus_model::STATUS_PAUSE
]);
$result = $this->_ci->StudierendenantragModel->loadWhere([
'studierendenantrag_id' => $antrag_id,
'typ' => Studierendenantrag_model::TYP_WIEDERHOLUNG
]);
return hasData($result);
}
/**
* @param integer $antrag_id
*
* @return boolean
*/
public function antragCanBeManualUnpaused($antrag_id)
{
return $this->_ci->StudierendenantragModel->isManuallyPaused($antrag_id);
}
/**
* @param integer $antrag_id
* @param string|array $status
@@ -180,12 +180,6 @@ class Pruefung_model extends DB_Model
$this->addJoin('bis.tbl_orgform o', 'COALESCE(plan.orgform_kurzbz, pss.orgform_kurzbz, g.orgform_kurzbz)=o.orgform_kurzbz');
$this->addJoin('campus.tbl_studierendenantrag a', 'ps.prestudent_id=a.prestudent_id and a.typ=' . $this->escape(Studierendenantrag_model::TYP_WIEDERHOLUNG), 'LEFT');
$this->db->group_start();
$this->db->where_in("get_rolle_prestudent(ps.prestudent_id, null)", $this->config->item('antrag_prestudentstatus_whitelist'));
// NOTE(chris): If the status of the Antrag is DEREGISTERED the prestudentstatus must be Abbrecher which is not in the whitelist
$this->db->or_where("campus.get_status_studierendenantrag(a.studierendenantrag_id)", Studierendenantragstatus_model::STATUS_DEREGISTERED);
$this->db->group_end();
$this->db->where("g.aktiv", true);
$statusgruende = $this->config->item('status_gruende_wiederholer');
@@ -242,6 +236,8 @@ class Pruefung_model extends DB_Model
$this->db->where("b.aktiv", true);
$this->db->where_in("get_rolle_prestudent(ps.prestudent_id, null)", $this->config->item('antrag_prestudentstatus_whitelist'));
if (is_array($status)) {
if (in_array(null, $status)) {
$status = array_filter($status);
@@ -46,6 +46,8 @@ class Studierendenantrag_model extends DB_Model
$this->addSelect('datum_wiedereinstieg');
$this->addSelect($this->dbTable . '.typ');
$this->addSelect('st.studierendenantrag_statustyp_kurzbz as status');
$this->addSelect('s.insertvon as status_insertvon');
$this->addSelect('s.insertamum as status_insertamum');
$this->addSelect('dms_id');
$this->addSelect('st.bezeichnung[(' . $sql . ')] as statustyp');
@@ -85,7 +87,8 @@ class Studierendenantrag_model extends DB_Model
Studierendenantragstatus_model::STATUS_APPROVED,
Studierendenantragstatus_model::STATUS_REJECTED,
Studierendenantragstatus_model::STATUS_OBJECTION_DENIED,
Studierendenantragstatus_model::STATUS_DEREGISTERED
Studierendenantragstatus_model::STATUS_DEREGISTERED,
Studierendenantragstatus_model::STATUS_PAUSE
]);
$this->db->or_group_start();
$this->db->where('s.studierendenantrag_statustyp_kurzbz', Studierendenantragstatus_model::STATUS_APPROVED);
@@ -133,12 +136,17 @@ class Studierendenantrag_model extends DB_Model
$lang = 'SELECT index FROM public.tbl_sprache WHERE sprache=' . $this->escape(getUserLanguage());
$this->addSelect('*');
$this->addSelect('campus.get_status_studierendenantrag(studierendenantrag_id) status');
$this->addSelect('s.studierendenantrag_statustyp_kurzbz status');
$this->addSelect('s.insertvon status_insertvon');
$this->addSelect('t.bezeichnung[(' . $lang . ')] statustyp');
$this->addJoin(
'campus.tbl_studierendenantrag_status s',
'campus.get_status_id_studierendenantrag(' . $this->dbTable . '.studierendenantrag_id)=s.studierendenantrag_status_id'
);
$this->addJoin(
'campus.tbl_studierendenantrag_statustyp t',
'campus.get_status_studierendenantrag(studierendenantrag_id)=t.studierendenantrag_statustyp_kurzbz'
's.studierendenantrag_statustyp_kurzbz=t.studierendenantrag_statustyp_kurzbz'
);
if ($types && is_array($types)) {
@@ -233,6 +241,7 @@ class Studierendenantrag_model extends DB_Model
$this->addSelect($this->dbTable . '.datum_wiedereinstieg');
$this->addSelect($this->dbTable . '.grund');
$this->addSelect($this->dbTable . '.dms_id');
$this->addSelect('s.insertvon AS status_insertvon');
$this->addSelect("(SELECT count(1) FROM campus.tbl_studierendenantrag_status WHERE studierendenantrag_id = " . $this->dbTable . ".studierendenantrag_id AND studierendenantrag_statustyp_kurzbz = 'Genehmigt') AS isapproved", false);
$this->addJoin('public.tbl_prestudent p', 'prestudent_id', 'RIGHT');
@@ -240,9 +249,14 @@ class Studierendenantrag_model extends DB_Model
$this->addJoin('public.tbl_prestudentstatus ps', 'ps.prestudent_id=p.prestudent_id AND ps.studiensemester_kurzbz=' . $this->dbTable . '.studiensemester_kurzbz AND ps.status_kurzbz=get_rolle_prestudent(p.prestudent_id, ' . $this->dbTable . '.studiensemester_kurzbz)', 'LEFT');
$this->addJoin('lehre.tbl_studienplan plan', 'studienplan_id', 'LEFT');
$this->addJoin('bis.tbl_orgform of', 'of.orgform_kurzbz=COALESCE(plan.orgform_kurzbz, ps.orgform_kurzbz, stg.orgform_kurzbz)');
$this->addJoin(
'campus.tbl_studierendenantrag_status s',
'campus.get_status_id_studierendenantrag(' . $this->dbTable . '.studierendenantrag_id)=s.studierendenantrag_status_id',
'LEFT'
);
$this->addJoin(
'campus.tbl_studierendenantrag_statustyp st',
'campus.get_status_studierendenantrag(studierendenantrag_id)=st.studierendenantrag_statustyp_kurzbz',
's.studierendenantrag_statustyp_kurzbz=st.studierendenantrag_statustyp_kurzbz',
'LEFT'
);
@@ -381,4 +395,49 @@ class Studierendenantrag_model extends DB_Model
$max_length * $max_starters
]);
}
/**
* Returns if an Antrag is manually paused
*
* @param integer $antrag_id
*
* @return boolean
*/
public function isManuallyPaused($antrag_id)
{
$this->addJoin(
'campus.tbl_studierendenantrag_status s',
'campus.get_status_id_studierendenantrag(' . $this->dbTable . '.studierendenantrag_id)=s.studierendenantrag_status_id'
);
$this->db->where([
's.studierendenantrag_id' => $antrag_id,
's.studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_PAUSE
]);
$this->db->group_start();
$this->db->where_not_in('s.insertvon', [
Studierendenantragstatus_model::INSERTVON_DEREGISTERED,
Studierendenantragstatus_model::INSERTVON_ABMELDUNGSTGL
]);
$this->db->or_group_start();
$this->db->where('s.insertvon', Studierendenantragstatus_model::INSERTVON_ABMELDUNGSTGL);
$this->db->where('1 !=', '(
SELECT COUNT(*)%2
FROM campus.tbl_studierendenantrag_status i
WHERE i.studierendenantrag_id = s.studierendenantrag_id
AND i.insertamum > (
SELECT ii.insertamum
FROM campus.tbl_studierendenantrag_status ii
WHERE ii.studierendenantrag_id = s.studierendenantrag_id
AND ii.insertvon <> ' . $this->escape(Studierendenantragstatus_model::INSERTVON_ABMELDUNGSTGL) . '
ORDER BY ii.insertamum DESC
LIMIT 1
)
)', false);
$this->db->group_end();
$this->db->group_end();
return hasData($this->load());
}
}
@@ -15,6 +15,10 @@ class Studierendenantragstatus_model extends DB_Model
const STATUS_OBJECTED = 'Beeinsprucht';
const STATUS_OBJECTION_DENIED = 'EinspruchAbgelehnt';
const STATUS_DEREGISTERED = 'Abgemeldet';
const STATUS_PAUSE = 'Pause';
const INSERTVON_ABMELDUNGSTGL = "AbmeldungStgl";
const INSERTVON_DEREGISTERED = "Studienabbruch";
/**
* Constructor
@@ -49,4 +53,157 @@ class Studierendenantragstatus_model extends DB_Model
return $this->loadWhere($where);
}
public function stopAntraegeForAbmeldungStgl($antrag_id)
{
$sql = 'INSERT INTO campus.tbl_studierendenantrag_status
(studierendenantrag_id, studierendenantrag_statustyp_kurzbz, insertvon, insertamum)
SELECT studierendenantrag_id, ?, ?, (
SELECT insertamum
FROM campus.tbl_studierendenantrag_status
WHERE studierendenantrag_status_id = campus.get_status_id_studierendenantrag(?)
)
FROM campus.tbl_studierendenantrag
WHERE prestudent_id = (
SELECT prestudent_id
FROM campus.tbl_studierendenantrag
WHERE studierendenantrag_id = ?
)
AND studierendenantrag_id <> ?
AND (
(
typ = ?
AND campus.get_status_studierendenantrag(studierendenantrag_id) IN ?
) OR (
typ = ?
AND campus.get_status_studierendenantrag(studierendenantrag_id) IN ?
) OR (
typ = ?
AND campus.get_status_studierendenantrag(studierendenantrag_id) IN ?
)
)';
return $this->execQuery($sql, [
self::STATUS_PAUSE,
self::INSERTVON_ABMELDUNGSTGL,
$antrag_id,
$antrag_id,
$antrag_id,
Studierendenantrag_model::TYP_ABMELDUNG,
[
Studierendenantragstatus_model::STATUS_CREATED
],
Studierendenantrag_model::TYP_UNTERBRECHUNG,
[
Studierendenantragstatus_model::STATUS_CREATED
],
Studierendenantrag_model::TYP_WIEDERHOLUNG,
[
Studierendenantragstatus_model::STATUS_REQUESTSENT_1,
Studierendenantragstatus_model::STATUS_REQUESTSENT_2,
Studierendenantragstatus_model::STATUS_CREATED,
Studierendenantragstatus_model::STATUS_LVSASSIGNED,
Studierendenantragstatus_model::STATUS_PAUSE
],
]);
}
public function resumeAntraegeForAbmeldungStgl($antrag_id)
{
$sql = 'INSERT INTO campus.tbl_studierendenantrag_status
(studierendenantrag_id, studierendenantrag_statustyp_kurzbz, insertvon, insertamum)
SELECT studierendenantrag_id, (
SELECT studierendenantrag_statustyp_kurzbz
FROM campus.tbl_studierendenantrag_status s
WHERE s.studierendenantrag_id=a.studierendenantrag_id
AND campus.get_status_id_studierendenantrag(a.studierendenantrag_id) <> studierendenantrag_status_id
ORDER BY insertamum DESC
LIMIT 1
), ?, (
SELECT insertamum
FROM campus.tbl_studierendenantrag_status
WHERE studierendenantrag_status_id = campus.get_status_id_studierendenantrag(?)
)
FROM campus.tbl_studierendenantrag a
WHERE prestudent_id = (
SELECT prestudent_id
FROM campus.tbl_studierendenantrag
WHERE studierendenantrag_id = ?
)
AND typ <> ?
AND campus.get_status_studierendenantrag(studierendenantrag_id) = ?
';
return $this->execQuery($sql, [
self::INSERTVON_ABMELDUNGSTGL,
$antrag_id,
$antrag_id,
Studierendenantrag_model::TYP_ABMELDUNG_STGL,
Studierendenantragstatus_model::STATUS_PAUSE
]);
}
public function stopAntraegeForAbbruchBy($antrag_id)
{
$sql = 'INSERT INTO campus.tbl_studierendenantrag_status
(studierendenantrag_id, studierendenantrag_statustyp_kurzbz, insertvon, insertamum)
SELECT studierendenantrag_id, ?, ?, (
SELECT insertamum
FROM campus.tbl_studierendenantrag_status
WHERE studierendenantrag_status_id = campus.get_status_id_studierendenantrag(?)
)
FROM campus.tbl_studierendenantrag
WHERE prestudent_id = (
SELECT prestudent_id
FROM campus.tbl_studierendenantrag
WHERE studierendenantrag_id = ?
)
AND studierendenantrag_id <> ?
AND (
(
typ = ?
AND campus.get_status_studierendenantrag(studierendenantrag_id) NOT IN ?
) OR (
typ = ?
AND campus.get_status_studierendenantrag(studierendenantrag_id) NOT IN ?
) OR (
typ = ?
AND campus.get_status_studierendenantrag(studierendenantrag_id) NOT IN ?
) OR (
typ = ?
AND campus.get_status_studierendenantrag(studierendenantrag_id) NOT IN ?
)
)';
return $this->execQuery($sql, [
self::STATUS_PAUSE,
self::INSERTVON_DEREGISTERED,
$antrag_id,
$antrag_id,
$antrag_id,
Studierendenantrag_model::TYP_ABMELDUNG,
[
Studierendenantragstatus_model::STATUS_APPROVED,
Studierendenantragstatus_model::STATUS_CANCELLED
],
Studierendenantrag_model::TYP_UNTERBRECHUNG,
[
Studierendenantragstatus_model::STATUS_APPROVED,
Studierendenantragstatus_model::STATUS_CANCELLED,
Studierendenantragstatus_model::STATUS_REMINDERSENT,
Studierendenantragstatus_model::STATUS_REJECTED
],
Studierendenantrag_model::TYP_ABMELDUNG_STGL,
[
Studierendenantragstatus_model::STATUS_CANCELLED,
Studierendenantragstatus_model::STATUS_DEREGISTERED,
Studierendenantragstatus_model::STATUS_OBJECTION_DENIED
],
Studierendenantrag_model::TYP_WIEDERHOLUNG,
[
Studierendenantragstatus_model::STATUS_DEREGISTERED,
Studierendenantragstatus_model::STATUS_APPROVED
],
]);
}
}
+2 -2
View File
@@ -31,9 +31,9 @@ $this->load->view(
<div class="fhc-container row">
<div class="col-sm-8 mb-3">
<studierendenantrag-antrag
prestudent-id="<?= $prestudent_id; ?>"
:prestudent-id="<?= $prestudent_id; ?>"
antrag-type="<?= $antrag_type; ?>"
studierendenantrag-id="<?= $studierendenantrag_id; ?>"
:studierendenantrag-id="<?= $studierendenantrag_id; ?>"
v-model:info-array="infoArray"
v-model:status-msg="status.msg"
v-model:status-severity="status.severity"
+76 -10
View File
@@ -38,7 +38,10 @@ $this->load->view(
<div class="alert alert-secondary">
<p><?= $this->p->t('studierendenantrag', 'calltoaction_' . $type); ?></p>
<hr>
<a href="<?= site_url('lehre/Studierendenantrag/' . strtolower($type) . '/' . $prestudent_id); ?>" class="btn btn-outline-secondary">
<a
href="<?= site_url('lehre/Studierendenantrag/' . strtolower($type) . '/' . $prestudent_id); ?>"
class="btn btn-outline-secondary"
>
<i class="fa fa-plus"></i> <?= $this->p->t('studierendenantrag', 'antrag_typ_' . $type); ?>
</a>
</div>
@@ -63,7 +66,16 @@ $this->load->view(
<tr>
<td><?= $antrag->studierendenantrag_id; ?></td>
<td><?= $this->p->t('studierendenantrag', 'antrag_typ_' . $antrag->typ); ?></td>
<td><?= $antrag->status_bezeichnung; ?></td>
<td>
<?=
(
$antrag->status == Studierendenantragstatus_model::STATUS_PAUSE
&& $antrag->status_insertvon == Studierendenantragstatus_model::INSERTVON_DEREGISTERED
)
? $this->p->t('studierendenantrag', 'status_stop')
: $antrag->status_bezeichnung;
?>
</td>
<td><?= $antrag->studiensemester_kurzbz; ?></td>
<td><?= (new DateTime($antrag->datum))->format('d.m.Y'); ?></td>
<td><?= $antrag->datum_wiedereinstieg ? (new DateTime($antrag->datum_wiedereinstieg))->format('d.m.Y') : ''; ?></td>
@@ -74,15 +86,32 @@ $this->load->view(
</a>
<!-- Modal -->
<div class="modal fade" id="modalgrund<?= $antrag->studierendenantrag_id; ?>" tabindex="-1" aria-labelledby="modalgrundLabel<?= $antrag->studierendenantrag_id; ?>" aria-hidden="true">
<div
class="modal fade"
id="modalgrund<?= $antrag->studierendenantrag_id; ?>"
tabindex="-1"
aria-labelledby="modalgrundLabel<?= $antrag->studierendenantrag_id; ?>"
aria-hidden="true"
>
<div class="modal-dialog modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="modalgrundLabel<?= $antrag->studierendenantrag_id; ?>"><?= $this->p->t('studierendenantrag', 'antrag_grund'); ?></h5>
<h5
class="modal-title"
id="modalgrundLabel<?= $antrag->studierendenantrag_id; ?>"
>
<?= $this->p->t('studierendenantrag', 'antrag_grund'); ?>
</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<textarea class="form-control" style="width: 100%; height: 250px;" readonly><?= $antrag->grund; ?></textarea>
<textarea
class="form-control"
style="width: 100%; height: 250px;"
readonly
>
<?= $antrag->grund; ?>
</textarea>
</div>
</div>
</div>
@@ -100,7 +129,16 @@ $this->load->view(
<?php } ?>
</td>
<td>
<a href="<?= site_url('lehre/Studierendenantrag/' . strtolower($antrag->typ) . '/' . $antrag->prestudent_id . '/' . $antrag->studierendenantrag_id); ?>"><i class="fa-solid fa-pen" title="<?= $this->p->t('studierendenantrag', 'btn_edit'); ?>"></i></a>
<a
href="<?= site_url('lehre/Studierendenantrag/' .
strtolower($antrag->typ) .
'/' .
$antrag->prestudent_id .
'/' .
$antrag->studierendenantrag_id); ?>"
>
<i class="fa-solid fa-pen" title="<?= $this->p->t('studierendenantrag', 'btn_edit'); ?>"></i>
</a>
<?php
$allowed = [];
switch ($antrag->typ) {
@@ -130,11 +168,39 @@ $this->load->view(
break;
}
if (in_array($antrag->status, $allowed)) { ?>
<a class="ms-2" target="_blank" href="<?= base_url('cis/private/pdfExport.php?xml=Antrag' . $antrag->typ . '.xml.php&xsl=Antrag' . $antrag->typ . '&id=' . $antrag->studierendenantrag_id . '&uid=' . getAuthUID()); ?>"><i class="fa-solid fa-download" title="<?= $this->p->t('studierendenantrag', 'btn_download_antrag'); ?>"></i></a>
<a
class="ms-2"
target="_blank"
href="<?= base_url('cis/private/pdfExport.php?xml=Antrag' .
$antrag->typ .
'.xml.php&xsl=Antrag' .
$antrag->typ .
'&id=' .
$antrag->studierendenantrag_id .
'&uid=' .
getAuthUID()); ?>"
>
<i
class="fa-solid fa-download"
title="<?= $this->p->t('studierendenantrag', 'btn_download_antrag'); ?>"
>
</i>
</a>
<?php } ?>
<?php if ($antrag->typ == Studierendenantrag_model::TYP_WIEDERHOLUNG && $antrag->status == Studierendenantragstatus_model::STATUS_APPROVED) { ?>
<a class="ms-2" href="#modallv<?= $antrag->studierendenantrag_id; ?>" data-bs-toggle="modal"><?= $this->p->t('studierendenantrag', 'btn_show_lvs'); ?></a>
<lv-popup id="modallv<?= $antrag->studierendenantrag_id; ?>" antrag-id = "<?= $antrag->studierendenantrag_id; ?>">
<?php if ($antrag->typ == Studierendenantrag_model::TYP_WIEDERHOLUNG
&& $antrag->status == Studierendenantragstatus_model::STATUS_APPROVED
) { ?>
<a
class="ms-2"
href="#modallv<?= $antrag->studierendenantrag_id; ?>"
data-bs-toggle="modal"
>
<?= $this->p->t('studierendenantrag', 'btn_show_lvs'); ?>
</a>
<lv-popup
id="modallv<?= $antrag->studierendenantrag_id; ?>"
antrag-id = "<?= $antrag->studierendenantrag_id; ?>"
>
<?= $this->p->t('studierendenantrag', 'my_lvs'); ?>
</lv-popup>
<?php } ?>
@@ -29,6 +29,7 @@ export default {
switch (this.data.status)
{
case 'Erstellt': return 'info';
case 'Pause':
case 'Zurueckgezogen': return 'danger';
case 'Genehmigt': return 'success';
default: return 'warning';
@@ -52,8 +53,12 @@ export default {
result => {
this.data = result.data.retval;
if (this.data.status) {
const msg = (this.data.status == 'Pause' && this.data.status_insertvon == "Studienabbruch") ? Vue.computed(() => {
let status = this.$p.t('studierendenantrag/status_stop');
return this.$p.t('studierendenantrag', 'status_x', {status});
}) : Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.data.statustyp}));
this.$emit("setStatus", {
msg: Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.data.statustyp})),
msg,
severity: this.statusSeverity
});
}
@@ -29,6 +29,7 @@ export default {
switch (this.data?.status)
{
case 'Erstellt': return 'info';
case 'Pause':
case 'Zurueckgezogen': return 'danger';
case 'EinspruchAbgelehnt':
case 'Abgemeldet': return 'success';
@@ -53,8 +54,12 @@ export default {
result => {
this.data = result.data.retval;
if (this.data.status) {
const msg = (this.data.status == 'Pause' && this.data.status_insertvon == "Studienabbruch") ? Vue.computed(() => {
let status = this.$p.t('studierendenantrag/status_stop');
return this.$p.t('studierendenantrag', 'status_x', {status});
}) : Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.data.statustyp}));
this.$emit("setStatus", {
msg: Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.data.statustyp})),
msg,
severity: this.statusSeverity
});
}
@@ -37,6 +37,7 @@ export default {
switch (this.data.status)
{
case 'Erstellt': return 'info';
case 'Pause':
case 'Zurueckgezogen':
case 'Abgelehnt': return 'danger';
case 'Genehmigt':
@@ -76,8 +77,12 @@ export default {
result => {
this.data = result.data.retval;
if (this.data.status) {
const msg = (this.data.status == 'Pause' && this.data.status_insertvon == "Studienabbruch") ? Vue.computed(() => {
let status = this.$p.t('studierendenantrag/status_stop');
return this.$p.t('studierendenantrag', 'status_x', {status});
}) : Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.data.statustyp}));
this.$emit("setStatus", {
msg: Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.data.statustyp})),
msg,
severity: this.statusSeverity
});
}
@@ -39,6 +39,7 @@ export default {
case 'Erstellt':
case 'ErsteAufforderungVersandt': return 'info';
case 'Genehmigt': return 'success';
case 'Pause':
case 'Verzichtet':
case 'Abgemeldet': return 'danger';
default: return 'warning';
@@ -69,8 +70,12 @@ export default {
this.data.statustyp = this.$p.t('studierendenantrag', 'status_open');
}
this.$emit('update:status', this.data.status);
const msg = (this.data.status == 'Pause' && this.data.status_insertvon == "Studienabbruch") ? Vue.computed(() => {
let status = this.$p.t('studierendenantrag/status_stop');
return this.$p.t('studierendenantrag', 'status_x', {status});
}) : Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.data.statustyp}));
this.$emit("setStatus", {
msg: Vue.computed(() => this.$p.t('studierendenantrag', 'status_x', {status: this.data.statustyp})),
msg,
severity: this.statusSeverity
});
return result;
@@ -184,6 +184,44 @@ export default {
.then(this.showValidation)
.catch(this.showError);
},
actionPause(evt) {
var antraege = evt || this.selectedData;
this.$refs.loader.show();
axios
.all(
antraege.map(
antrag => axios.post(
FHC_JS_DATA_STORAGE_OBJECT.app_root +
FHC_JS_DATA_STORAGE_OBJECT.ci_router +
'/components/Antrag/Leitung/pauseAntrag/',
{
studierendenantrag_id: antrag.studierendenantrag_id
}
)
)
)
.then(this.showValidation)
.catch(this.showError);
},
actionUnpause(evt) {
var antraege = evt || this.selectedData;
this.$refs.loader.show();
axios
.all(
antraege.map(
antrag => axios.post(
FHC_JS_DATA_STORAGE_OBJECT.app_root +
FHC_JS_DATA_STORAGE_OBJECT.ci_router +
'/components/Antrag/Leitung/unpauseAntrag/',
{
studierendenantrag_id: antrag.studierendenantrag_id
}
)
)
)
.then(this.showValidation)
.catch(this.showError);
},
actionObject(evt) {
var antraege = evt || this.selectedData;
this.$refs.loader.show();
@@ -347,6 +385,8 @@ export default {
@action:objectionDeny="actionoObjectionDeny"
@action:objectionApprove="actionObjectionApprove"
@action:cancel="actionCancel"
@action:pause="actionPause"
@action:unpause="actionUnpause"
@reload="reload"
>
</leitung-table>
@@ -25,7 +25,9 @@ export default {
'action:object',
'action:objectionDeny',
'action:objectionApprove',
'action:cancel'
'action:cancel',
'action:pause',
'action:unpause'
],
data() {
return {
@@ -60,6 +62,29 @@ export default {
this.historyData = res.data.retval.sort((a, b) => a.insertamum > b.insertamum);
});
},
getHistoryStatus(data, index) {
if (data.insertvon == 'Studienabbruch')
return this.$p.t('studierendenantrag/status_stop');
if (index > 0 && this.historyData[index-1].studierendenantrag_statustyp_kurzbz == 'Pause') {
if (index > 1 && this.historyData[index-2].studierendenantrag_statustyp_kurzbz != 'Pause') {
// NOTE(chris): this is a AbmeldungStgl Pause right after a manual Pause
if (data.studierendenantrag_statustyp_kurzbz == 'Pause')
return data.typ;
// NOTE(chris): this is a manual Pause resumed
else
return data.typ + ' (' + this.$p.t('studierendenantrag/status_unpaused') + ')';
}
// NOTE(chris): a series of pause stati always starts with a manual and alternate afterwards
let i = 2;
while (index-i > 0 && this.historyData[index-i].studierendenantrag_statustyp_kurzbz == 'Pause') i++;
if (data.studierendenantrag_statustyp_kurzbz == 'Pause')
i++;
return i%2
? data.typ
: data.typ + ' (' + this.$p.t('studierendenantrag/status_unpaused') + ')';
}
return data.typ;
},
showHistoryGrund(grund) {
this.$refs.modalGrund.$el.addEventListener(
'hidden.bs.modal',
@@ -153,9 +178,13 @@ export default {
autocomplete: true,
},
formatter: (cell, formatterParams, onRendered) => {
let data = cell.getData();
let status = cell.getValue();
if (data.status_insertvon == 'Studienabbruch' && data.status == 'Pause')
status = this.$p.t('studierendenantrag/status_stop');
let link = document.createElement('a');
link.href = "#";
link.innerHTML = cell.getValue();
link.innerHTML = status;
link.addEventListener('click', e => {
e.preventDefault();
this.lastHistoryClickedId = cell.getData().studierendenantrag_id;
@@ -261,6 +290,56 @@ export default {
'content/pdfExport.php?xml=Antrag' + data.typ + '.xml.php&xsl=Antrag' + data.typ + '&id=' + data.studierendenantrag_id + '&output=pdf';
container.append(button);
}
if (data.typ == 'Wiederholung' && (data.status == 'ErsteAufforderungVersandt' || data.status == 'ZweiteAufforderungVersandt')) {
// NOTE(chris): Pause
let button = document.createElement('button');
let icon = document.createElement('i');
let span = document.createElement('span');
icon.className = "fa-solid fa-pause";
icon.setAttribute('aria-hidden', true);
icon.setAttribute('title', this.$p.t('studierendenantrag', 'btn_pause'));
span.className = "fa-sr-only";
span.append(this.$p.t('studierendenantrag', 'btn_pause'));
button.append(icon);
button.append(span);
button.className = "btn btn-outline-secondary";
button.addEventListener('click', () => this.$emit('action:pause', [cell.getData()]));
container.append(button);
}
let canUnpause = data.status == 'Pause' && !['AbmeldungStgl', 'Studienabbruch'].includes(data.status_insertvon);
if (!canUnpause && data.status == 'Pause' && data.status_insertvon == 'AbmeldungStgl') {
canUnpause = cell.getTable().getData().filter(row =>
row.prestudent_id == data.prestudent_id
&& row.typ == 'AbmeldungStgl'
&& row.status == 'Zurueckgezogen'
&& row.status_insertamum == data.status_insertamum
).length;
}
if (canUnpause) {
// NOTE(chris): Unpause
let button = document.createElement('button');
let icon = document.createElement('i');
let span = document.createElement('span');
icon.className = "fa-solid fa-play";
icon.setAttribute('aria-hidden', true);
icon.setAttribute('title', this.$p.t('studierendenantrag', 'btn_unpause'));
span.className = "fa-sr-only";
span.append(this.$p.t('studierendenantrag', 'btn_unpause'));
button.append(icon);
button.append(span);
button.className = "btn btn-outline-secondary";
button.addEventListener('click', () => this.$emit('action:unpause', [cell.getData()]));
container.append(button);
}
if (data.typ == 'AbmeldungStgl' && data.status == 'Genehmigt') {
// NOTE(chris): Object
let button = document.createElement('button');
@@ -392,10 +471,10 @@ export default {
<template #title>{{$p.t('studierendenantrag', 'title_history', {id: lastHistoryClickedId})}}</template>
<core-fetch-cmpt ref="historyLoader" :api-function="getHistory">
<table v-if="historyData.length" class="table">
<tr v-for="status in historyData" :key="status.studierendenantrag_status_id">
<tr v-for="(status, index) in historyData" :key="status.studierendenantrag_status_id">
<td>{{(new Date(status.insertamum)).toLocaleString()}}</td>
<td>{{status.insertvon}}</td>
<td>{{status.typ}}</td>
<td>{{getHistoryStatus(status, index)}}</td>
<td>
<a v-if="status.grund" href="#modal-grund" data-bs-toggle="modal" @click="showHistoryGrund(status.grund)">
{{$p.t('studierendenantrag', 'antrag_grund')}}
@@ -62,6 +62,22 @@ if($result = @$db->db_query("SELECT 1 FROM campus.tbl_studierendenantrag_statust
}
}
if($result = @$db->db_query("SELECT 1 FROM campus.tbl_studierendenantrag_statustyp WHERE studierendenantrag_statustyp_kurzbz = 'Pause' "))
{
if($db->db_num_rows($result) == 0)
{
$qry = "INSERT INTO campus.tbl_studierendenantrag_statustyp
(studierendenantrag_statustyp_kurzbz, bezeichnung)
VALUES
('Pause', '{\"Pausiert\",\"Paused\"}');
";
if (!$db->db_query($qry))
echo '<strong>campus.tbl_studierendenantrag_statustyp (insert): '.$db->db_last_error().'</strong><br>';
else
echo '<br>campus.tbl_studierendenantrag_statustyp: "Pause" added';
}
}
if(!$result = @$db->db_query("SELECT 1 FROM campus.tbl_studierendenantrag LIMIT 1"))
{
$qry = "CREATE TABLE campus.tbl_studierendenantrag (
+140
View File
@@ -20508,6 +20508,46 @@ array(
)
)
),
array(
'app' => 'core',
'category' => 'studierendenantrag',
'phrase' => 'btn_pause',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Pausieren',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Pause',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'studierendenantrag',
'phrase' => 'btn_unpause',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Fortsetzen',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Resume',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'studierendenantrag',
@@ -21309,6 +21349,46 @@ array(
)
)
),
array(
'app' => 'core',
'category' => 'studierendenantrag',
'phrase' => 'status_unpaused',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Fortgesetzt',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Resumed',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'studierendenantrag',
'phrase' => 'status_stop',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Gestoppt',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Stopped',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'studierendenantrag',
@@ -21509,6 +21589,26 @@ array(
)
)
),
array(
'app' => 'core',
'category' => 'studierendenantrag',
'phrase' => 'error_no_antragstatus',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Kein Status für Bekanntgabe #{id} gefunden',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'No status found announcement #{id}',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'studierendenantrag',
@@ -21729,6 +21829,46 @@ array(
)
)
),
array(
'app' => 'core',
'category' => 'studierendenantrag',
'phrase' => 'error_not_pausable',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Bekanntgabe mit Id {id} kann nicht pausiert werden',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Announcement with Id {id} cannot be not paused',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'studierendenantrag',
'phrase' => 'error_not_paused',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Bekanntgabe mit Id {id} ist nicht pausiert',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Announcement with Id {id} is not paused',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'studierendenantrag',