diff --git a/application/config/studierendenantrag.php b/application/config/studierendenantrag.php
index ef2098aca..9d1e7a1c8 100644
--- a/application/config/studierendenantrag.php
+++ b/application/config/studierendenantrag.php
@@ -197,3 +197,11 @@ $config['unterbrechung_enabled'] = true;
*/
$config['wiederholung_enabled'] = true;
+/**
+ * Modal with Infotext of TLC
+ * if true, there will be shown an info modal in the studentsView after the first button ABMELDUNG
+ *
+ * @var boolean
+ */
+$config['showInfoModalAbmeldung'] = true;
+
diff --git a/application/config/stv.php b/application/config/stv.php
index e6266c4e8..b12153eda 100644
--- a/application/config/stv.php
+++ b/application/config/stv.php
@@ -177,6 +177,8 @@ $config['stv_prestudent_tags'] = [
'unterbrecher_auto' => ['readonly' => true],
'stbtr_erh_auto' => ['readonly' => true],
'jgv_auto' => ['readonly' => true],
+ 'in_auto' => ['readonly' => true],
+ 'preabbr_auto' => ['readonly' => true],
];
$config['userAutomatedTags'] = 'sftest';
diff --git a/application/config/treemenu/custom/lvvw.php b/application/config/treemenu/custom/lvvw.php
index a1f270e05..977c0459e 100644
--- a/application/config/treemenu/custom/lvvw.php
+++ b/application/config/treemenu/custom/lvvw.php
@@ -22,10 +22,10 @@ if (!defined('BASEPATH')) exit('No direct script access allowed');
$config['root'] = [
'stg' => [
'semester' => [
- /*'group',
+ 'group',
'verband' => [
'group'
- ]*/
+ ]
],
'orgform'
]
diff --git a/application/controllers/api/frontend/v1/TabulatorPresets.php b/application/controllers/api/frontend/v1/TabulatorPresets.php
new file mode 100644
index 000000000..cb8e23ade
--- /dev/null
+++ b/application/controllers/api/frontend/v1/TabulatorPresets.php
@@ -0,0 +1,162 @@
+.
+ */
+
+if (! defined('BASEPATH')) exit('No direct script access allowed');
+
+/**
+ * This controller operates between (interface) the JS (GUI) and the PhrasesLib (back-end)
+ * Provides data to the ajax get calls about the Phrasen plugin
+ * This controller works with JSON calls on the HTTP GET and the output is always JSON
+ */
+class TabulatorPresets extends FHCAPI_Controller
+{
+ public function __construct()
+ {
+ parent::__construct([
+ 'getTabulatorPresets' => self::PERM_LOGGED,
+ 'createTabulatorPreset' => self::PERM_LOGGED,
+ 'updateTabulatorPreset' => self::PERM_LOGGED,
+ 'deleteTabulatorPreset' => self::PERM_LOGGED,
+ ]);
+
+ $this->load->model('tabulator/Tabulator_preset_model', 'TabulatorPresetModel');
+
+ $this->loadPhrases([
+ 'global',
+ 'tabulator_presets'
+ ]);
+ }
+
+ //------------------------------------------------------------------------------------------------------------------
+ // Public methods
+
+ public function getTabulatorPresets()
+ {
+ $tableName = $this->input->get("tableName");
+ if (!$tableName) {
+ $this->terminateWithError(error($this->p->t("tabulator_presets", "invalid_params_err_msg")));
+ }
+
+ $uid = getAuthUID();
+ $presets = $this->TabulatorPresetModel->getTabulatorPresetsByUserAndTable($uid, $tableName);
+ $presetsData = $this->getDataOrTerminateWithError($presets) ?? [];
+
+ $this->terminateWithSuccess($presetsData);
+ }
+
+ public function createTabulatorPreset()
+ {
+ $tableName = $this->input->post("tableName");
+ $presetName = $this->input->post("presetName");
+ $preset = $this->input->post("preset");
+
+ if (!$tableName || !$presetName || !$preset) {
+ $this->terminateWithError($this->p->t("tabulator_presets", "invalid_params_err_msg"), "general", 400);
+ }
+
+ $uid = getAuthUID();
+
+ $existingPresetsResult = $this->TabulatorPresetModel->getTabulatorPresetsByUserAndTable($uid, $tableName);
+ $existingPresets = $this->getDataOrTerminateWithError($existingPresetsResult) ?? [];
+
+ if (count($existingPresets) > 19) {
+ $this->terminateWithError($this->p->t("tabulator_presets", "max_presets_count_err_msg"), "general", 409);
+ }
+
+ $existingPresetNames = array_map(function($presetInfo) {
+ return $presetInfo->preset_name;
+ }, $existingPresets);
+
+ if (in_array($presetName, $existingPresetNames)) {
+ $this->terminateWithError($this->p->t("tabulator_presets", "preset_name_duplicate_err_msg"), "general", 409);
+ }
+
+ $presetCreationResult = $this->TabulatorPresetModel->createTabulatorPreset($uid, $tableName, $presetName, $preset);
+
+ if (isError($presetCreationResult)) {
+ $this->terminateWithError($presetCreationResult->retval);
+ }
+
+ $newPresetData = $this->TabulatorPresetModel->getTabulatorPreset($presetCreationResult->retval);
+ $newPresetArray = $this->getDataOrTerminateWithError($newPresetData) ?? [null];
+ $newPreset = $newPresetArray[0];
+
+ $this->terminateWithSuccess($newPreset);
+ }
+
+ public function updateTabulatorPreset()
+ {
+ $presetId = $this->input->post("presetId");
+ $preset = $this->input->post("preset");
+
+ if (!$presetId || !$preset) {
+ $this->terminateWithError($this->p->t("tabulator_presets", "invalid_params_err_msg"), "general", 400);
+ }
+
+ $existingPresetData = $this->TabulatorPresetModel->getTabulatorPreset($presetId);
+ $existingPresetArray = $this->getDataOrTerminateWithError($existingPresetData) ?? [null];
+ $existingPreset = $existingPresetArray[0];
+ if (!$existingPreset) {
+ $this->terminateWithError($this->p->t("tabulator_presets", "preset_not_found_err_msg"), "general", 404);
+ }
+
+ $uid = getAuthUID();
+ if ($existingPreset->benutzer_uid !== $uid) {
+ $this->terminateWithError($this->p->t("tabulator_presets", "preset_not_own_update_err_msg"), "general", 403);
+ }
+
+ $presetUpdateResult = $this->TabulatorPresetModel->updateTabulatorPreset($presetId, $preset);
+ if (isError($presetUpdateResult)) {
+ $this->terminateWithError($presetUpdateResult->retval);
+ }
+
+ $updatedPresetData = $this->TabulatorPresetModel->getTabulatorPreset($presetId);
+ $updatedPresetArray = $this->getDataOrTerminateWithError($updatedPresetData) ?? [null];
+ $updatedPreset = $updatedPresetArray[0];
+
+ $this->terminateWithSuccess($updatedPreset);
+ }
+
+ public function deleteTabulatorPreset()
+ {
+ $presetId = $this->input->post("presetId");
+ if (!$presetId) {
+ $this->terminateWithError($this->p->t("tabulator_presets", "invalid_params_err_msg"), "general", 400);
+ }
+
+ $presetData = $this->TabulatorPresetModel->getTabulatorPreset($presetId);
+ $presetArray = $this->getDataOrTerminateWithError($presetData) ?? [null];
+ $preset = $presetArray[0];
+ if (!$preset) {
+ $this->terminateWithError($this->p->t("tabulator_presets", "preset_not_found_err_msg"), "general", 404);
+ }
+
+ $uid = getAuthUID();
+ if ($preset->benutzer_uid !== $uid) {
+ $this->terminateWithError($this->p->t("tabulator_presets", "preset_not_own_delete_err_msg"), "general", 403);
+ }
+
+ $presetDeletionResult = $this->TabulatorPresetModel->deleteTabulatorPreset($presetId);
+ if (isError($presetDeletionResult)) {
+ $this->terminateWithError($presetDeletionResult->retval);
+ }
+
+ $this->terminateWithSuccess();
+ }
+
+}
\ No newline at end of file
diff --git a/application/controllers/api/frontend/v1/stv/Students.php b/application/controllers/api/frontend/v1/stv/Students.php
index 2994f6ac4..39ed72072 100644
--- a/application/controllers/api/frontend/v1/stv/Students.php
+++ b/application/controllers/api/frontend/v1/stv/Students.php
@@ -756,6 +756,8 @@ class Students extends FHCAPI_Controller
'studiensemester_kurzbz' => $studiensemester_kurzbz
));
+ $studiensemester_kurzbz = $this->getStudiensemesterKurzbz($studiensemester_kurzbz);
+
$this->load->library('SearchLib', [ 'config' => 'searchstv' ]);
$this->load->library('form_validation');
diff --git a/application/controllers/components/Cis/Mylv.php b/application/controllers/components/Cis/Mylv.php
index 1fdb7e2a1..30544b647 100644
--- a/application/controllers/components/Cis/Mylv.php
+++ b/application/controllers/components/Cis/Mylv.php
@@ -14,11 +14,11 @@ class Mylv extends Auth_Controller
public function __construct()
{
parent::__construct([
- 'Student' => ['student/anrechnung_beantragen:r','user:r'], // TODO(chris): permissions?
- 'Studiensemester' => ['student/anrechnung_beantragen:r','user:r'], // TODO(chris): permissions?
- 'Lvs' => ['student/anrechnung_beantragen:r','user:r'], // TODO(chris): permissions?
- 'Info' => ['student/anrechnung_beantragen:r','user:r'], // TODO(chris): permissions?
- 'Pruefungen' => ['student/anrechnung_beantragen:r','user:r'] // TODO(chris): permissions?
+ 'Student' => self::PERM_LOGGED,
+ 'Studiensemester' => self::PERM_LOGGED,
+ 'Lvs' => self::PERM_LOGGED,
+ 'Info' => self::PERM_LOGGED,
+ 'Pruefungen' => self::PERM_LOGGED
]);
}
diff --git a/application/controllers/jobs/AntragJob.php b/application/controllers/jobs/AntragJob.php
index 5b72518d2..8bcb898a9 100644
--- a/application/controllers/jobs/AntragJob.php
+++ b/application/controllers/jobs/AntragJob.php
@@ -125,7 +125,7 @@ class AntragJob extends JOB_Controller
$stgLeitungen[$leitung->uid]['stgs'][] = $antrag->studiengang_kz;
}
- $result = $this->StudierendenantragModel->getStgAndSem($antrag->studierendenantrag_id);
+ $result = $this->StudierendenantragModel->getStgAndDetails($antrag->studierendenantrag_id);
if (isError($result))
{
$this->logError(getError($result));
diff --git a/application/controllers/lehre/Studierendenantrag.php b/application/controllers/lehre/Studierendenantrag.php
index ebc1d2eaa..ad333679d 100644
--- a/application/controllers/lehre/Studierendenantrag.php
+++ b/application/controllers/lehre/Studierendenantrag.php
@@ -25,7 +25,8 @@ class Studierendenantrag extends FHC_Controller
// Load language phrases
$this->loadPhrases([
- 'studierendenantrag'
+ 'studierendenantrag',
+ 'ui'
]);
$this->load->config('studierendenantrag');
diff --git a/application/core/Tag_Controller.php b/application/core/Tag_Controller.php
index 9d2f4cf6a..c4b6edb81 100644
--- a/application/core/Tag_Controller.php
+++ b/application/core/Tag_Controller.php
@@ -349,16 +349,27 @@ class Tag_Controller extends FHCAPI_Controller
public function rebuildTagsForTypeId()
{
- $id = $this->input->post('id');
+ $ids = $this->input->post('ids');
$typeId = $this->input->post('typeId');
$semester = $this->input->post('sem');
- $result = $this->taglib->rebuildTagsForTypeId($typeId, $id, $semester);
+ $idsSuccess = [];
+ $idsError = [];
+ $outputResult = [];
- if (isError($result))
- return error ('Error occurred during updateAutomatedTags');
+ foreach ($ids as $id)
+ {
+ $result = $this->taglib->rebuildTagsForTypeId($typeId, $id, $semester);
- $this->terminateWithSuccess($result);
+ if (isError($result))
+ $idsError[] = $id;
+ else
+ $idsSuccess[] = $id;
+
+ $outputResult[] = $result;
+ }
+
+ $this->terminateWithSuccess([$outputResult, $idsSuccess, $idsError]);
}
private function _setAuthUID()
@@ -401,4 +412,4 @@ class Tag_Controller extends FHCAPI_Controller
));
}
-}
\ No newline at end of file
+}
diff --git a/application/helpers/hlp_header_helper.php b/application/helpers/hlp_header_helper.php
index 53a5f5ba3..eb2cd9f85 100644
--- a/application/helpers/hlp_header_helper.php
+++ b/application/helpers/hlp_header_helper.php
@@ -111,7 +111,8 @@ function generateJSDataStorageObject($indexPage, $calledPath, $calledMethod)
'theme' => [
'name'=>$ci->config->item('theme_name'),
'modes'=>$ci->config->item('theme_modes'),
- ]
+ ],
+ 'domain' => DOMAIN
);
$toPrint = "\n";
diff --git a/application/libraries/TagLib.php b/application/libraries/TagLib.php
index c4107f416..637431360 100644
--- a/application/libraries/TagLib.php
+++ b/application/libraries/TagLib.php
@@ -37,7 +37,7 @@ class TagLib
$this->_ci->load->library('PermissionLib');
$this->_ci->load->library('PrestudentLib');
- $batchUser = $this->_ci->config->item('userAutomatedTags');
+ $this->batchUser = $this->_ci->config->item('userAutomatedTags');
}
public function updateAutomatedTags($paramsTag)
diff --git a/application/libraries/tags/CoreIncomingTagLib.php b/application/libraries/tags/CoreIncomingTagLib.php
new file mode 100644
index 000000000..26d7dad0b
--- /dev/null
+++ b/application/libraries/tags/CoreIncomingTagLib.php
@@ -0,0 +1,63 @@
+ci = get_instance();
+ $this->ci->load->model('codex/Bisio_model', 'BisioModel');
+ }
+
+ public function getZuordnungIds(array $params)
+ {
+ if(!isset($params['studiensemester_kurzbz']))
+ {
+ return (object) array(
+ 'idArray' => []
+ );
+ }
+
+ $semester = $params['studiensemester_kurzbz'];
+
+ $result = $this->ci->BisioModel->getIncomingsOfSemester($semester);
+
+ $data = $result->retval;
+
+ $outgoing_data = array_map(function($item) {
+ return [
+ 'id' => $item->prestudent_id,
+ 'von' => $item->von,
+ 'bis' => $item->bis
+ ];
+ }, $data);
+
+ return (object) array(
+ 'data' => $outgoing_data,
+ 'typeId' => 'prestudent_id',
+ );
+ }
+
+ public function isCriteriaSetFor(array $params)
+ {
+ if ( !isset($params['id'], $params['studiensemester_kurzbz'], $params['typeId']) || $params['typeId'] !== 'prestudent_id')
+ return false;
+
+ $semester = $params['studiensemester_kurzbz'];
+ $prestudent_id = $params['id'];
+
+ $result = $this->ci->BisioModel->isPrestudentIncoming($semester, $prestudent_id);
+
+ if (hasData($result)) {
+ return $result;
+ }
+ else
+ return null;
+ }
+
+}
diff --git a/application/libraries/tags/CorePreabbrecherTagLib.php b/application/libraries/tags/CorePreabbrecherTagLib.php
new file mode 100644
index 000000000..41712ac3b
--- /dev/null
+++ b/application/libraries/tags/CorePreabbrecherTagLib.php
@@ -0,0 +1,80 @@
+ci = get_instance();
+ $this->ci->load->model('education/Studierendenantrag_model', 'StudierendenantragModel');
+ }
+
+ public function getZuordnungIds(array $params)
+ {
+ if(!isset($params['studiensemester_kurzbz']))
+ {
+ return (object) array(
+ 'idArray' => []
+ );
+ }
+
+ $semester = $params['studiensemester_kurzbz'];
+
+ $this->ci->StudierendenantragModel->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz');
+ $this->ci->StudierendenantragModel->db->where_in('typ', self::TYP_ABMELDUNG);
+ $this->ci->StudierendenantragModel->db->where('studiensemester_kurzbz', $semester);
+ $result = $this->ci->StudierendenantragModel->getWithLastStatusWhere([
+ 'studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_CREATED
+ ]);
+
+ $data = $result->retval;
+
+ $prewiederholer_data = array_map(function($item) {
+ return [
+ 'id' => $item->prestudent_id,
+ 'von' => $item->start,
+ 'bis' => $item->ende
+ ];
+ }, $data);
+
+ return (object) array(
+ 'data' => $prewiederholer_data,
+ 'typeId' => 'prestudent_id',
+ );
+ }
+
+ public function isCriteriaSetFor(array $params)
+ {
+ if ( !isset($params['id'], $params['studiensemester_kurzbz'], $params['typeId']) || $params['typeId'] !== 'prestudent_id')
+ return false;
+
+ $semester = $params['studiensemester_kurzbz'];
+ $prestudent_id = $params['id'];
+
+ $this->ci->StudierendenantragModel->addSelect('prestudent_id');
+ $this->ci->StudierendenantragModel->addSelect('start as von');
+ $this->ci->StudierendenantragModel->addSelect('ende as bis');
+
+ $this->ci->StudierendenantragModel->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz');
+ $this->ci->StudierendenantragModel->db->where_in('typ', self::TYP_ABMELDUNG);
+ $this->ci->StudierendenantragModel->db->where('studiensemester_kurzbz', $semester);
+ $this->ci->StudierendenantragModel->db->where('prestudent_id', $prestudent_id);
+ $result = $this->ci->StudierendenantragModel->getWithLastStatusWhere([
+ 'studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_CREATED
+ ]);
+
+ if(hasData($result))
+ {
+ return $result;
+ }
+ else
+ return null;
+ }
+
+}
diff --git a/application/models/codex/Bisio_model.php b/application/models/codex/Bisio_model.php
index 9a9fd37fb..972661c8b 100644
--- a/application/models/codex/Bisio_model.php
+++ b/application/models/codex/Bisio_model.php
@@ -73,6 +73,34 @@ class Bisio_model extends DB_Model
return $this->execQuery($query, array($studiensemester_kurzbz));
}
+ /**
+ * Gets incoming students of certain Semester
+ * @param String studiensemester_kurzbz
+ * @return array of prestudent_ids
+ */
+ public function getIncomingsOfSemester($studiensemester_kurzbz)
+ {
+ $query = "
+ SELECT DISTINCT ps.prestudent_id, tbl_bisio.von, tbl_bisio.bis
+ FROM bis.tbl_bisio
+ JOIN public.tbl_student USING (student_uid)
+ JOIN public.tbl_prestudent ps USING (prestudent_id)
+ JOIN public.tbl_prestudentstatus pss ON (ps.prestudent_id = pss.prestudent_id)
+ JOIN public.tbl_studiensemester ss ON (pss.studiensemester_kurzbz = ss.studiensemester_kurzbz)
+ WHERE ss.studiensemester_kurzbz = ?
+ AND nation_code = 'A'
+ AND (
+ tbl_bisio.von <= ss.ende
+ AND (
+ tbl_bisio.bis >= ss.start
+ OR tbl_bisio.bis IS NULL
+ )
+ )
+ ";
+
+ return $this->execQuery($query, array($studiensemester_kurzbz));
+ }
+
public function isPrestudentOutgoing($studiensemester_kurzbz, $prestudent_id)
{
$query = "
@@ -97,4 +125,29 @@ class Bisio_model extends DB_Model
return $this->execQuery($query, array($studiensemester_kurzbz, $prestudent_id));
}
+
+ public function isPrestudentIncoming($studiensemester_kurzbz, $prestudent_id)
+ {
+ $query = "
+ SELECT
+ ps.prestudent_id, tbl_bisio.von, tbl_bisio.bis
+ FROM bis.tbl_bisio
+ JOIN public.tbl_student USING (student_uid)
+ JOIN public.tbl_prestudent ps USING (prestudent_id)
+ JOIN public.tbl_prestudentstatus pss ON (ps.prestudent_id = pss.prestudent_id)
+ JOIN public.tbl_studiensemester ss ON (pss.studiensemester_kurzbz = ss.studiensemester_kurzbz)
+ WHERE ss.studiensemester_kurzbz = ?
+ AND nation_code = 'A'
+ AND (
+ tbl_bisio.von <= ss.ende
+ AND (
+ tbl_bisio.bis >= ss.start
+ OR tbl_bisio.bis IS NULL
+ )
+ )
+ AND ps.prestudent_id = ?
+ ";
+
+ return $this->execQuery($query, array($studiensemester_kurzbz, $prestudent_id));
+ }
}
diff --git a/application/models/education/Studierendenantrag_model.php b/application/models/education/Studierendenantrag_model.php
index 40224ffc9..c18d18053 100644
--- a/application/models/education/Studierendenantrag_model.php
+++ b/application/models/education/Studierendenantrag_model.php
@@ -188,6 +188,7 @@ class Studierendenantrag_model extends DB_Model
* Get the studiengang and ausbildungssemester the student was in
* for the studiensemester the antrag was committed for
*
+ *
* @param integer $antrag_id
*
* @return stdClass
@@ -242,6 +243,28 @@ class Studierendenantrag_model extends DB_Model
);
}
+ /**
+ * Get the studiengang and the studienplan the student is in
+ *
+ * @param integer $antrag_id
+ *
+ * @return stdClass
+ */
+ public function getStgAndDetails($antrag_id)
+ {
+ $this->addSelect('p.studiengang_kz');
+ $this->addSelect('stg.orgform_kurzbz');
+ $this->addSelect('stg.bezeichnung');
+ $this->addJoin('public.tbl_prestudent p', 'prestudent_id');
+ $this->addJoin('public.tbl_studiengang stg', 'studiengang_kz');
+
+ $this->addLimit(1);
+
+ return $this->load(
+ $antrag_id
+ );
+ }
+
public function getStgEmail($antrag_id)
{
$this->addJoin('public.tbl_prestudent p', 'prestudent_id');
diff --git a/application/models/tabulator/Tabulator_preset_model.php b/application/models/tabulator/Tabulator_preset_model.php
new file mode 100644
index 000000000..a3c45739d
--- /dev/null
+++ b/application/models/tabulator/Tabulator_preset_model.php
@@ -0,0 +1,83 @@
+dbTable = 'public.tbl_tabulator_presets';
+ $this->pk = ['preset_id'];
+ $this->hasSequence = true;
+
+
+ $this->load->model('person/Benutzer_model', 'BenutzerModel');
+ }
+
+ public function getTabulatorPreset($presetId)
+ {
+ $query = "
+ SELECT *
+ FROM public.tbl_tabulator_presets
+ WHERE preset_id = ?
+ LIMIT 1
+ ";
+ return $this->execQuery($query, array($presetId));
+ }
+
+ public function getTabulatorPresetsByUserAndTable($uid, $tableName)
+ {
+ $query = '
+ SELECT *
+ FROM public.tbl_tabulator_presets
+ WHERE benutzer_uid = ?
+ AND table_name = ?
+ ORDER BY preset_id ASC
+ ';
+ return $this->execQuery($query, array($uid, $tableName));
+ }
+
+ public function createTabulatorPreset($uid, $tableName, $presetName, $preset)
+ {
+ $presetCreationResult = $this->insert([
+ "benutzer_uid" => $uid,
+ "table_name" => $tableName,
+ "preset_name" => $presetName,
+ "preset_json" => json_encode($preset),
+ ]);
+
+ if (isError($presetCreationResult))
+ {
+ return error('Something went wrong during preset creation!');
+ }
+
+ return success($presetCreationResult->retval);
+ }
+
+ public function updateTabulatorPreset($presetId, $preset)
+ {
+ $presetUpdateResult = $this->update(["preset_id" => $presetId], ["preset_json" => json_encode($preset)]);
+
+ if (isError($presetUpdateResult))
+ {
+ return error('Something went wrong during preset update!');
+ }
+
+ return success($presetUpdateResult->retval);
+ }
+
+ public function deleteTabulatorPreset($presetId)
+ {
+ $presetDeletionReseult = $this->delete(["preset_id" => $presetId]);
+
+ if (isError($presetDeletionReseult))
+ {
+ return error('Something went wrong during preset deletion!');
+ }
+
+ return success($presetDeletionReseult->retval);
+ }
+
+}
diff --git a/application/views/Studentenverwaltung.php b/application/views/Studentenverwaltung.php
index 8dd2dd93d..5b6138ff8 100644
--- a/application/views/Studentenverwaltung.php
+++ b/application/views/Studentenverwaltung.php
@@ -56,12 +56,13 @@ $configArray = [
= $this->p->t('studierendenantrag', 'calltoaction_' . $type); ?>
-= $this->p->t('studierendenantrag', 'calltoaction_' . $type); ?>
+