diff --git a/application/config/navigation.php b/application/config/navigation.php
index 56d142d08..3680930d0 100644
--- a/application/config/navigation.php
+++ b/application/config/navigation.php
@@ -31,6 +31,14 @@ $config['navigation_header'] = array(
'expand' => true,
'sort' => 20,
'requiredPermissions' => 'admin:w'
+ ),
+ 'bismeldestichtagsverwaltung' => array(
+ 'link' => site_url('codex/Bismeldestichtag'),
+ 'icon' => '',
+ 'description' => 'BIS-Meldestichtagsverwaltung',
+ 'expand' => true,
+ 'sort' => 30,
+ 'requiredPermissions' => 'admin:w'
)
)
),
diff --git a/application/controllers/codex/Bismeldestichtag.php b/application/controllers/codex/Bismeldestichtag.php
new file mode 100644
index 000000000..2723b2f7c
--- /dev/null
+++ b/application/controllers/codex/Bismeldestichtag.php
@@ -0,0 +1,140 @@
+ 'admin:r',
+ 'getStudiensemester' => 'admin:r',
+ 'getBismeldestichtage' => 'admin:r',
+ 'addBismeldestichtag' => 'admin:rw',
+ 'deleteBismeldestichtag' => 'admin:rw'
+ )
+ );
+
+ // Load models
+ $this->load->model('codex/Bismeldestichtag_model', 'BismeldestichtagModel');
+ $this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
+
+ // Loads phrases system
+ $this->loadPhrases(
+ array(
+ 'bismeldestichtag'
+ )
+ );
+ }
+
+ // -----------------------------------------------------------------------------------------------------------------
+ // Public methods
+
+ /**
+ * Everything has a beginning
+ */
+ public function index()
+ {
+ $this->load->view('codex/bismeldestichtag.php');
+ }
+
+ public function getStudiensemester()
+ {
+ // load semester list
+ $semList = array();
+ $this->StudiensemesterModel->addSelect('studiensemester_kurzbz');
+ $this->StudiensemesterModel->addOrder('start', 'DESC');
+ $semRes = $this->StudiensemesterModel->load();
+
+ if (hasData($semRes))
+ {
+ $semList = getData($semRes);
+ }
+
+ // load current semester
+ $currSem = null;
+ $semRes = $this->StudiensemesterModel->getAkt();
+
+ if (hasData($semRes))
+ {
+ $currSem = getData($semRes)[0]->studiensemester_kurzbz;
+ }
+
+ // output data
+ $this->outputJsonSuccess(
+ array('semList' => $semList, 'currSem' => $currSem)
+ );
+ }
+
+ public function getBismeldestichtage()
+ {
+ $this->BismeldestichtagModel->addSelect(
+ 'meldestichtag_id, meldestichtag,
+ tbl_bismeldestichtag.studiensemester_kurzbz, sem.start AS semester_start,
+ tbl_bismeldestichtag.insertamum, tbl_bismeldestichtag.insertvon, tbl_bismeldestichtag.updateamum, tbl_bismeldestichtag.updatevon'
+ );
+ $this->BismeldestichtagModel->addJoin('public.tbl_studiensemester sem', 'studiensemester_kurzbz', 'LEFT');
+ $this->BismeldestichtagModel->addOrder('semester_start');
+ $this->BismeldestichtagModel->addOrder('meldestichtag', 'DESC');
+ $this->BismeldestichtagModel->addOrder('meldestichtag_id', 'DESC');
+ $this->outputJson($this->BismeldestichtagModel->load());
+ }
+
+ public function addBismeldestichtag()
+ {
+ // get request data
+ $request = $this->getPostJSON();
+
+ // check request data
+ if (!property_exists($request, 'meldestichtag') || isEmptyString($request->meldestichtag))
+ $this->terminateWithJsonError('Error occured: Meldestichtag missing');
+ if (!property_exists($request, 'studiensemester_kurzbz') || isEmptyString($request->studiensemester_kurzbz))
+ $this->terminateWithJsonError('Error occured: Studiensemester missing');
+
+ $meldestichtag = $request->meldestichtag;
+ $studiensemester_kurzbz = $request->studiensemester_kurzbz;
+
+ // check if Bismeldestichtag already exists
+ $this->BismeldestichtagModel->addSelect('1');
+ $bismeldestichtagRes = $this->BismeldestichtagModel->loadWhere(
+ array('meldestichtag' => $meldestichtag, 'studiensemester_kurzbz' => $studiensemester_kurzbz)
+ );
+
+ // return success if already exists
+ if (hasData($bismeldestichtagRes))
+ $this->outputJsonSuccess('Bismeldestichtag already exists');
+ else
+ {
+ // insert new if Stichtag does not exist
+ $this->outputJson($this->BismeldestichtagModel->insert(
+ array(
+ 'meldestichtag' => $request->meldestichtag,
+ 'studiensemester_kurzbz' => $request->studiensemester_kurzbz,
+ 'insertvon' => getAuthUID()
+ )
+ ));
+ }
+ }
+
+ public function deleteBismeldestichtag()
+ {
+ // get request data
+ $request = $this->getPostJSON();
+
+ // check request data
+ if (!property_exists($request, 'meldestichtag_id'))
+ $this->terminateWithJsonError('Error occured: Meldestichtag Id missing');
+
+ $meldestichtag_id = $request->meldestichtag_id;
+
+ // deletetion
+ $this->outputJson($this->BismeldestichtagModel->delete($meldestichtag_id));
+ }
+}
diff --git a/application/models/codex/Bismeldestichtag_model.php b/application/models/codex/Bismeldestichtag_model.php
new file mode 100644
index 000000000..1a45f0fbd
--- /dev/null
+++ b/application/models/codex/Bismeldestichtag_model.php
@@ -0,0 +1,14 @@
+dbTable = 'bis.tbl_bismeldestichtag';
+ $this->pk = 'meldestichtag_id';
+ }
+}
diff --git a/application/views/codex/bismeldestichtag.php b/application/views/codex/bismeldestichtag.php
new file mode 100644
index 000000000..37af16cc6
--- /dev/null
+++ b/application/views/codex/bismeldestichtag.php
@@ -0,0 +1,75 @@
+ 'Bismeldestichtage',
+ 'axios027' => true,
+ 'bootstrap5' => true,
+ 'fontawesome6' => true,
+ 'vue3' => true,
+ 'filtercomponent' => true,
+ 'navigationcomponent' => true,
+ 'tabulator5' => true,
+ 'customCSSs' => array('vendor/vuejs/vuedatepicker_css/main.css'),
+ 'customJSs' => array('vendor/vuejs/vuedatepicker_js/vue-datepicker.iife.js'),
+ 'customJSModules' => array('public/js/apps/Bismeldestichtag/Bismeldestichtag.js')
+ );
+
+ $this->load->view('templates/FHC-Header', $includesArray);
+?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+load->view('templates/FHC-Footer', $includesArray); ?>
diff --git a/composer.json b/composer.json
index d2c03b42b..65ab5cb6a 100644
--- a/composer.json
+++ b/composer.json
@@ -337,28 +337,28 @@
}
}
},
- {
- "type": "package",
- "package": {
- "name": "vuejs/vuedatepicker_js",
- "version": "5.4.0",
- "dist": {
- "url": "https://unpkg.com/@vuepic/vue-datepicker@5.4.0/dist/vue-datepicker.iife.js",
- "type": "file"
- }
- }
- },
- {
- "type": "package",
- "package": {
- "name": "vuejs/vuedatepicker_css",
- "version": "5.4.0",
- "dist": {
- "url": "https://unpkg.com/@vuepic/vue-datepicker@5.4.0/dist/main.css",
- "type": "file"
- }
- }
- },
+ {
+ "type": "package",
+ "package": {
+ "name": "vuejs/vuedatepicker_js",
+ "version": "5.4.0",
+ "dist": {
+ "url": "https://unpkg.com/@vuepic/vue-datepicker@4.2.3/dist/vue-datepicker.iife.js",
+ "type": "file"
+ }
+ }
+ },
+ {
+ "type": "package",
+ "package": {
+ "name": "vuejs/vuedatepicker_css",
+ "version": "5.4.0",
+ "dist": {
+ "url": "https://unpkg.com/@vuepic/vue-datepicker@4.2.3/dist/main.css",
+ "type": "file"
+ }
+ }
+ },
{
"type": "composer",
"url": "https://asset-packagist.org"
diff --git a/content/student/studentDBDML.php b/content/student/studentDBDML.php
index 010ac7af6..4e5f5452c 100644
--- a/content/student/studentDBDML.php
+++ b/content/student/studentDBDML.php
@@ -74,6 +74,7 @@ require_once('../../include/reihungstest.class.php');
require_once('../../include/studienplan.class.php');
require_once('../../include/mobilitaet.class.php');
require_once('../../include/studienordnung.class.php');
+require_once('../../include/bismeldestichtag.class.php');
$user = get_uid();
$db = new basis_db();
@@ -383,7 +384,7 @@ function isBuchungAllowedToChange($buchung_obj)
* @param $new_status_ausbildungssemester Ausbildungssemester des neuen/zu ändernen Status
* @param $old_status_studiensemester Studiensemester des alten Status, leer wenn neuer Status
* @param $old_status_ausbildungssemester Ausbildungssemester des alten Status, leer wenn neuer Status
- * @return array
+ * @return array mit error = true und Fehlerbeschreibung wenn ungültig, andernfalls error = false
*/
function checkStatusaenderung(
$prestudent_id, $status_kurzbz, $new_status_studiensemester, $new_status_datum, $new_status_ausbildungssemester,
@@ -417,7 +418,7 @@ function checkStatusaenderung(
$studiensemester->load($new_status_studiensemester);
$new_status_semesterstart = new DateTime($studiensemester->start);
- // Alle bisherigen prestudentstatus nach Datum sortiert
+ // Alle prestudentstatus nach Datum sortiert
$qry = "SELECT status_kurzbz, studiensemester_kurzbz, ausbildungssemester, datum, sem.start AS studiensemester_start
FROM public.tbl_prestudentstatus pss
JOIN public.tbl_studiensemester sem USING (studiensemester_kurzbz)
@@ -464,7 +465,7 @@ function checkStatusaenderung(
// Gültige Zeitabfolge, bestehenden Status hinzufügen
$statusArr[] = $row;
}
- // oder Neuer/editierter Statuseintrag nach bestehendem Statuseintrag
+ // oder Neuer/editierter Statuseintrag vor bestehendem Statuseintrag
elseif ($new_status_datum <= $status_datum && $new_status_semesterstart <= $studiensemester_start)
{
// Gültige Zeitabfolge, bestehenden Status hinzufügen
@@ -475,8 +476,7 @@ function checkStatusaenderung(
// Zeitabfolge ungültig, Fehler
return array(
'error' => true,
- 'errormsg' => 'Datum des Statuseintrags muss nach dem Statusdatum,'
- .' Semesterstartdatum nach Semesterstartdatum des vorherigen Statuseintrags sein'
+ 'errormsg' => 'Ungültige Zeitabfolge der Statuseinträge (Statusdatum oder Semester)'
);
}
}
@@ -994,6 +994,18 @@ if(!$error)
{
$new_status_datum = isset($_POST['datum']) ? $_POST['datum'] : date('Y-m-d');
+ $bismeldestichtag = new bismeldestichtag();
+
+ $meldestichtag_erreicht = $bismeldestichtag->checkMeldestichtagErreicht($new_status_datum);
+
+ if ($meldestichtag_erreicht === true)
+ {
+ $return = false;
+ $error = true;
+ $errormsg .= 'Studentstatus mit Datum oder Semesterende vor erreichtem Meldestichtag können nicht hinzugefügt werden.';
+ $anzahl_fehler++;
+ }
+
$check_statusaenderung_result = checkStatusaenderung(
$prestudent_id,
$_POST['status_kurzbz'],
@@ -1204,13 +1216,24 @@ if(!$error)
if(isset($_POST['studiensemester_kurzbz']) && isset($_POST['status_kurzbz']) &&
isset($_POST['prestudent_id']) && is_numeric($_POST['prestudent_id']) &&
- isset($_POST['ausbildungssemester']) && is_numeric($_POST['ausbildungssemester']))
+ isset($_POST['ausbildungssemester']) && is_numeric($_POST['ausbildungssemester']) &&
+ isset($_POST['datum']))
{
- if($_POST['status_kurzbz']=='Student' && !$rechte->isBerechtigt('admin', null, 'suid') && !$rechte->isBerechtigt('student/keine_studstatuspruefung', null, 'suid'))
+ $erweiterteBerechtigungen = $rechte->isBerechtigt('admin', null, 'suid') || $rechte->isBerechtigt('student/keine_studstatuspruefung', null, 'suid');
+
+ $bismeldestichtag = new bismeldestichtag();
+ $meldestichtag_erreicht = $bismeldestichtag->checkMeldestichtagErreicht($_POST['datum']);
+
+ if($_POST['status_kurzbz']=='Student' && !$erweiterteBerechtigungen)
{
$return = false;
$errormsg = 'Studentenrolle kann nur durch den Administrator geloescht werden';
}
+ elseif ($meldestichtag_erreicht && !$erweiterteBerechtigungen)
+ {
+ $return = false;
+ $errormsg = 'Studentstatus mit Datum oder Semesterende vor erreichtem Meldestichtag können nicht gelöscht werden.';
+ }
else
{
$qry = "SELECT count(*) as anzahl FROM public.tbl_prestudentstatus WHERE prestudent_id=".$db->db_add_param($_POST['prestudent_id'], FHC_INTEGER);
@@ -1530,6 +1553,17 @@ if(!$error)
$error = true;
$errormsg = isset($check_statusaenderung_result['errormsg']) ? $check_statusaenderung_result['errormsg'] : '';
}
+
+ // Prüfung, ob Meldestichtag erreicht ist
+ $bismeldestichtag = new bismeldestichtag();
+ $meldestichtag_erreicht = $bismeldestichtag->checkMeldestichtagErreicht($_POST['datum']);
+
+ if ($meldestichtag_erreicht === true)
+ {
+ $return = false;
+ $error = true;
+ $errormsg = 'Studentstatus mit Datum oder Semesterende vor erreichtem Meldestichtag können nicht hinzugefügt werden.';
+ }
}
if(!$error)
diff --git a/content/student/studentdetailoverlay.xul.php b/content/student/studentdetailoverlay.xul.php
index 845d48397..4b4fbdd63 100644
--- a/content/student/studentdetailoverlay.xul.php
+++ b/content/student/studentdetailoverlay.xul.php
@@ -806,24 +806,24 @@ echo '';
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/content/student/studentoverlay.js.php b/content/student/studentoverlay.js.php
index d76b647d8..1bf68c809 100644
--- a/content/student/studentoverlay.js.php
+++ b/content/student/studentoverlay.js.php
@@ -1876,7 +1876,6 @@ function StudentPrestudentDisableFields(val)
document.getElementById('student-prestudent-menulist-aufnahmeschluessel').disabled=val;
document.getElementById('student-prestudent-checkbox-facheinschlberuf').disabled=val;
- document.getElementById('student-prestudent-checkbox-bismelden').disabled=val;
document.getElementById('student-prestudent-menulist-foerderrelevant').disabled=val;
document.getElementById('student-prestudent-checkbox-dual').disabled=val;
document.getElementById('student-prestudent-button-save').disabled=val;
@@ -1923,6 +1922,20 @@ function StudentPrestudentDisableFields(val)
document.getElementById('student-prestudent-menulist-zgvmastercode').disabled=true;
}
+ // bismelden checkbox deaktivieren wenn Recht nicht vorhanden ist
+ isBerechtigt('student/editBismelden') ? 'true' : 'false';
+ echo ' var editBismelden = '.$editBismelden.';';
+ ?>
+ if (editBismelden == true)
+ {
+ document.getElementById('student-prestudent-checkbox-bismelden').disabled=val;
+ }
+ else
+ {
+ document.getElementById('student-prestudent-checkbox-bismelden').disabled=true;
+ }
+
//Status Tree leeren
rollentree = document.getElementById('student-prestudent-tree-rolle');
@@ -2080,6 +2093,7 @@ function StudentPrestudentRolleDelete()
var studiensemester_kurzbz = getTreeCellText(tree, 'student-prestudent-tree-rolle-studiensemester_kurzbz', tree.currentIndex);
var prestudent_id = getTreeCellText(tree, 'student-prestudent-tree-rolle-prestudent_id', tree.currentIndex);
var ausbildungssemester = getTreeCellText(tree, 'student-prestudent-tree-rolle-ausbildungssemester', tree.currentIndex);
+ var datum = getTreeCellText(tree, 'student-prestudent-tree-rolle-datum', tree.currentIndex);
studiengang_kz = document.getElementById('student-prestudent-menulist-studiengang_kz').value;
if(confirm('Diese Rolle wirklich loeschen?'))
@@ -2108,6 +2122,7 @@ function StudentPrestudentRolleDelete()
req.add('studiensemester_kurzbz', studiensemester_kurzbz);
req.add('ausbildungssemester', ausbildungssemester);
req.add('studiengang_kz', studiengang_kz);
+ req.add('datum', datum);
var response = req.executePOST();
@@ -2139,6 +2154,7 @@ function StudentPrestudentRolleDelete()
req.add('studiensemester_kurzbz', studiensemester_kurzbz);
req.add('ausbildungssemester', ausbildungssemester);
req.add('studiengang_kz', studiengang_kz);
+ req.add('datum', datum);
var response = req.executePOST();
@@ -2231,8 +2247,9 @@ function StudentRolleBearbeiten()
var studiensemester_kurzbz = getTreeCellText(tree, 'student-prestudent-tree-rolle-studiensemester_kurzbz', tree.currentIndex);
var prestudent_id = getTreeCellText(tree, 'student-prestudent-tree-rolle-prestudent_id', tree.currentIndex);
var ausbildungssemester = getTreeCellText(tree, 'student-prestudent-tree-rolle-ausbildungssemester', tree.currentIndex);
+ var datum = getTreeCellText(tree, 'student-prestudent-tree-rolle-datum', tree.currentIndex);
- window.open('content/student/studentrolledialog.xul.php?prestudent_id='+prestudent_id+'&status_kurzbz='+status_kurzbz+'&studiensemester_kurzbz='+studiensemester_kurzbz+'&ausbildungssemester='+ausbildungssemester,"Status","status=no, width=500, height=450, centerscreen, resizable");
+ window.open('content/student/studentrolledialog.xul.php?prestudent_id='+prestudent_id+'&status_kurzbz='+status_kurzbz+'&studiensemester_kurzbz='+studiensemester_kurzbz+'&ausbildungssemester='+ausbildungssemester+'&datum='+datum,"Status","status=no, width=500, height=450, centerscreen, resizable");
}
// ****
@@ -2290,7 +2307,7 @@ function StudentRolleSpeichern(dialog, studiensemester_old, ausbildungssemester_
timepart_arr[i] = '00';
}
}
-
+
arr = datepart.split('.');
if(arr[0].length==1)
diff --git a/content/student/studentrolledialog.xul.php b/content/student/studentrolledialog.xul.php
index ef2c0919a..88a357b6a 100644
--- a/content/student/studentrolledialog.xul.php
+++ b/content/student/studentrolledialog.xul.php
@@ -31,6 +31,7 @@ require_once('../../include/person.class.php');
require_once('../../include/prestudent.class.php');
require_once('../../include/studienplan.class.php');
require_once('../../include/benutzerberechtigung.class.php');
+require_once('../../include/bismeldestichtag.class.php');
echo ''."\n";
@@ -58,8 +59,17 @@ if(isset($_GET['ausbildungssemester']))
else
$ausbildungssemester='';
+if(isset($_GET['datum']))
+ $datum=$_GET['datum'];
+else
+ $datum='';
+
$vorname = '';
$nachname = '';
+
+$user=get_uid();
+$db = new basis_db();
+
if($prestudent_id!='')
{
$prestudent = new prestudent();
@@ -67,9 +77,16 @@ if($prestudent_id!='')
$vorname = $prestudent->vorname;
$nachname = $prestudent->nachname;
+
+ // Prüfen, ob Studnetrolle vor dem aktuellen Meldestichtag ist. In diesem Fall darf die Rolle nicht mehr bearbeitet werden.
+ $rechte = new benutzerberechtigung();
+ $rechte->getBerechtigungen($user);
+
+ $bismeldestichtag = new bismeldestichtag();
+ $disabled = $bismeldestichtag->checkMeldestichtagErreicht($datum) && !$rechte->isBerechtigt('student/keine_studstatuspruefung', null, 'suid')
+ ? ' disabled="true"'
+ : '';
}
-$db = new basis_db();
-$user=get_uid();
?>
+
+
+
"/>
@@ -112,7 +132,7 @@ $user=get_uid();
diff --git a/include/bismeldestichtag.class.php b/include/bismeldestichtag.class.php
new file mode 100644
index 000000000..143096dd8
--- /dev/null
+++ b/include/bismeldestichtag.class.php
@@ -0,0 +1,185 @@
+,
+ */
+require_once(dirname(__FILE__).'/basis_db.class.php');
+require_once(dirname(__FILE__).'/studiensemester.class.php');
+
+class bismeldestichtag extends basis_db
+{
+ //Tabellenspalten
+ public $meldestichtag_id; // integer
+ public $meldestichtag; // date
+ public $studiensemester_kurzbz; // varchar(16)
+ public $insertamum; // timestamp
+ public $insertvon; // varchar(32)
+ public $updateamum; // timestamp
+ public $updatevon; // varchar(32)
+
+ // ErgebnisArray
+ public $result=array();
+
+ /**
+ * Konstruktor - Uebergibt die Connection und laedt optional einen Meldestichtag
+ * @param $meldestichtag_id Stichtag der geladen werden soll (default=null)
+ */
+ public function __construct($meldestichtag_id=null)
+ {
+ parent::__construct();
+
+ if(!is_null($meldestichtag_id))
+ $this->load($meldestichtag_id);
+ }
+
+ /**
+ * Laedt Meldestichtag mit der uebergebenen ID
+ * @param $meldestichtag_id ID des Stichtags der geladen werden soll
+ */
+ public function load($meldestichtag_id)
+ {
+ $qry = "SELECT * FROM bis.tbl_bismeldestichtag WHERE meldestichtag_id=".$this->db_add_param($meldestichtag_id, FHC_INTEGER);
+
+ if($this->db_query($qry))
+ {
+ if($row = $this->db_fetch_object())
+ {
+ $this->meldestichtag_id = $row->meldestichtag_id;
+ $this->meldestichtag = $row->meldestichtag;
+ $this->studiensemester_kurzbz = $row->studiensemester_kurzbz;
+ $this->insertamum = $row->insertamum;
+ $this->insertvon = $row->insertvon;
+ $this->updateamum = $row->updateamum;
+ $this->updatevon = $row->updatevon;
+ return true;
+ }
+ else
+ {
+ $this->errormsg = 'Kein Eintrag gefunden';
+ return false;
+ }
+ }
+ else
+ {
+ $this->errormsg = "Fehler beim Laden des Stichtags";
+ return false;
+ }
+ }
+
+ /**
+ * Prueft die Variablen vor dem Speichern
+ * auf Gueltigkeit.
+ * @return true wenn ok, false im Fehlerfall
+ */
+ protected function validate()
+ {
+ return true;
+ }
+
+ /**
+ * Liefert zuletzt erreichten Meldestichtag
+ *
+ * @param $studiensemester_kurzbz
+ * @return boolean
+ */
+ public function getLastReachedMeldestichtag($studiensemester_kurzbz = null)
+ {
+ $qry = "SELECT
+ meldestichtag_id, meldestichtag, studiensemester_kurzbz, insertamum, insertvon, updateamum, updatevon
+ FROM
+ bis.tbl_bismeldestichtag
+ WHERE
+ meldestichtag < NOW()";
+
+ if (isset($studiensemester_kurzbz))
+ {
+ $qry .= "
+ AND
+ studiensemester_kurzbz=".$this->db_add_param($studiensemester_kurzbz);
+ }
+
+ $qry .= "
+ ORDER BY
+ meldestichtag DESC
+ LIMIT 1;";
+
+ if($this->db_query($qry))
+ {
+ while($row = $this->db_fetch_object())
+ {
+ $obj = new bismeldestichtag();
+
+ $obj->meldestichtag_id = $row->meldestichtag_id;
+ $obj->meldestichtag = $row->meldestichtag;
+ $obj->studiensemester_kurzbz = $row->studiensemester_kurzbz;
+ $obj->insertamum = $row->insertamum;
+ $obj->insertvon = $row->insertvon;
+ $obj->updateamum = $row->updateamum;
+ $obj->updatevon = $row->updatevon;
+
+ $this->result[] = $obj;
+ }
+
+ return true;
+ }
+ else
+ {
+ $this->errormsg = 'Meldestichtag konnte nicht geladen werden';
+ return false;
+ }
+ }
+
+ /**
+ * Prüft, ob Meldestichtag für ein bestimmtes Statusdatum und Studiensemester erreicht ist.
+ *
+ * @param $status_datum
+ * @param $studiensemester_kurzbz
+ * @return boolean true wenn erreicht, oder false
+ */
+ public function checkMeldestichtagErreicht($status_datum, $studiensemester_kurzbz = null)
+ {
+ $erreicht = false;
+
+ if (isset($studiensemester_kurzbz))
+ {
+ // Studiensemester ende holen
+ $studiensemester = new studiensemester();
+ if ($studiensemester->load($studiensemester_kurzbz))
+ $studiensemester_ende = new DateTime($studiensemester->ende);
+ }
+
+ // letztes erreichtes Bismeldedatum holen
+ if ($this->getLastReachedMeldestichtag() && isset($this->result[0]))
+ $lastReachedMeldestichtag = new DateTime($this->result[0]->meldestichtag);
+
+ $statusDatum = new DateTime($status_datum);
+
+ // Prüfen, ob Studentstatusdatum oder Studiensemester vor dem Stichtagsdatum liegen
+ if (isset($statusDatum))
+ {
+ if (isset($lastReachedMeldestichtag))
+ $erreicht = $statusDatum < $lastReachedMeldestichtag;
+
+ if (isset($studiensemester_ende))
+ $erreicht = $erreicht || $studiensemester_ende < $lastReachedMeldestichtag;
+
+ }
+
+ return $erreicht;
+ }
+}
+?>
diff --git a/public/js/apps/Bismeldestichtag/API.js b/public/js/apps/Bismeldestichtag/API.js
new file mode 100644
index 000000000..6a2989d5c
--- /dev/null
+++ b/public/js/apps/Bismeldestichtag/API.js
@@ -0,0 +1,72 @@
+/**
+ * Copyright (C) 2022 fhcomplete.org
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+import {CoreRESTClient} from '../../RESTClient.js';
+
+//
+const CORE_BISMELDESTICHTAG_CMPT_TIMEOUT = 2000;
+
+/**
+ *
+ */
+export const BismeldestichtagAPIs = {
+ /**
+ *
+ */
+ getStudiensemester: function() {
+ return CoreRESTClient.get(
+ 'codex/Bismeldestichtag/getStudiensemester',
+ null,
+ {
+ timeout: CORE_BISMELDESTICHTAG_CMPT_TIMEOUT
+ }
+ );
+ },
+ getBismeldestichtage: function() {
+ return CoreRESTClient.get(
+ 'codex/Bismeldestichtag/getBismeldestichtage',
+ null,
+ {
+ timeout: CORE_BISMELDESTICHTAG_CMPT_TIMEOUT
+ }
+ );
+ },
+ addBismeldestichtag: function(wsParams) {
+ return CoreRESTClient.post(
+ 'codex/Bismeldestichtag/addBismeldestichtag',
+ {
+ meldestichtag: wsParams.meldestichtag,
+ studiensemester_kurzbz: wsParams.studiensemester_kurzbz
+ },
+ {
+ timeout: CORE_BISMELDESTICHTAG_CMPT_TIMEOUT
+ }
+ );
+ },
+ deleteBismeldestichtag: function(wsParams) {
+ return CoreRESTClient.post(
+ 'codex/Bismeldestichtag/deleteBismeldestichtag',
+ {
+ meldestichtag_id: wsParams.meldestichtag_id
+ },
+ {
+ timeout: CORE_BISMELDESTICHTAG_CMPT_TIMEOUT
+ }
+ );
+ }
+};
+
diff --git a/public/js/apps/Bismeldestichtag/Bismeldestichtag.js b/public/js/apps/Bismeldestichtag/Bismeldestichtag.js
new file mode 100644
index 000000000..79b73a2e5
--- /dev/null
+++ b/public/js/apps/Bismeldestichtag/Bismeldestichtag.js
@@ -0,0 +1,190 @@
+/**
+ * Copyright (C) 2022 fhcomplete.org
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+import {BismeldestichtagTabulatorOptions} from './TabulatorSetup.js';
+import {BismeldestichtagTabulatorEventHandlers} from './TabulatorSetup.js';
+
+import {CoreFilterCmpt} from '../../components/filter/Filter.js';
+import {CoreNavigationCmpt} from '../../components/navigation/Navigation.js';
+import {CoreRESTClient} from '../../RESTClient.js';
+import {CoreFetchCmpt} from '../../components/Fetch.js';
+import {BismeldestichtagAPIs} from './API.js';
+
+const bismeldestichtagApp = Vue.createApp({
+ data: function() {
+ return {
+ bismeldestichtagTabulatorOptions: BismeldestichtagTabulatorOptions,
+ bismeldestichtagTabulatorEventHandlers: BismeldestichtagTabulatorEventHandlers,
+ meldestichtag: null, // date of Meldestichtag
+ semList: null, // all Studiensemester for dropdown
+ currSem: null, // selected Studiensemester
+ fetchCmptApiFunction: {}, // api function call
+ fetchCmptApiFunctionParams: null, // parameters for api function call
+ fetchCmptDataFetched: null, // function to execute after call
+ fetchCmptRefresh: true // for refreshing
+ };
+ },
+ components: {
+ CoreNavigationCmpt,
+ CoreFilterCmpt,
+ BismeldestichtagAPIs,
+ CoreFetchCmpt,
+ "datepicker": VueDatePicker
+ },
+ created() {
+ this.handlerStudiensemester();
+ },
+ methods: {
+ /**
+ * Define Studiensemester call and method to be executed after the call
+ */
+ handlerStudiensemester: function() {
+ this.startFetchCmpt(
+ BismeldestichtagAPIs.getStudiensemester,
+ null,
+ this.fetchCmptDataFetchedStudiensemester
+ );
+ },
+ /**
+ * Define Studiensemester call and method to be executed after the call
+ */
+ handlerBismeldestichtage: function() {
+ this.startFetchCmpt(
+ BismeldestichtagAPIs.getBismeldestichtage,
+ null,
+ this.fetchCmptDataFetchedBismeldestichtage
+ );
+ },
+ /**
+ * Define add Bismeldestichtag call and method to be executed after the call
+ */
+ handlerAddBismeldestichtag: function(event) {
+ this.startFetchCmpt(
+ BismeldestichtagAPIs.addBismeldestichtag,
+ {
+ meldestichtag: this.meldestichtag,
+ studiensemester_kurzbz: this.currSem
+ },
+ this.fetchCmptDataFetchedAddBismeldestichtag
+ );
+ },
+ /**
+ * Define delete Bismeldestichtag call and method to be executed after the call
+ */
+ handlerDeleteBismeldestichtag: function(meldestichtag_id) {
+ this.startFetchCmpt(
+ BismeldestichtagAPIs.deleteBismeldestichtag,
+ {
+ meldestichtag_id: meldestichtag_id
+ },
+ this.fetchCmptDataFetchedDeleteBismeldestichtag
+ );
+ },
+ /**
+ * Called after Studiensemester response is received
+ */
+ fetchCmptDataFetchedStudiensemester: function(data) {
+ if (CoreRESTClient.isError(data)) alert(CoreRESTClient.getError(data));
+ if (CoreRESTClient.hasData(data))
+ {
+ let semRes = CoreRESTClient.getData(data);
+ this.semList = semRes.semList;
+ this.currSem = semRes.currSem;
+ this.handlerBismeldestichtage();
+ }
+ else
+ alert("No Studiensemester data");
+ },
+ /**
+ * Called after Bismeldestichtage response is received
+ */
+ fetchCmptDataFetchedBismeldestichtage: function(data) {
+ if (CoreRESTClient.isError(data)) alert(CoreRESTClient.getError(data));
+ if (CoreRESTClient.hasData(data))
+ {
+ // set the Meldestichtagedata
+ this.$refs.bismeldestichtageTable.tabulator.setData(CoreRESTClient.getData(data));
+
+ // save delete Bismeldestichtag function
+ let funcDeleteBismeldestichtag = this.handlerDeleteBismeldestichtag;
+
+ let btns = document.getElementsByClassName('delete-btn');
+
+ // add click events for deletion
+ for (let btn in btns)
+ {
+ if (btns[btn].addEventListener)
+ {
+ btns[btn].addEventListener('click',
+ function(){
+ funcDeleteBismeldestichtag(btns[btn].getAttribute('data-meldestichtag-id'));
+ }
+ );
+ }
+ }
+ }
+ else
+ this.$refs.bismeldestichtageTable.tabulator.setData([]);
+ },
+ /**
+ * Called after Add Bismeldestichtag response is received
+ */
+ fetchCmptDataFetchedAddBismeldestichtag: function(data) {
+ if (CoreRESTClient.isError(data))
+ alert(CoreRESTClient.getError(data));
+ else if (CoreRESTClient.hasData(data))
+ {
+ this.handlerBismeldestichtage();
+ }
+ else
+ alert("No response data");
+ },
+ /**
+ * Called after Add Bismeldestichtag response is received
+ */
+ fetchCmptDataFetchedDeleteBismeldestichtag: function(data) {
+ if (CoreRESTClient.isError(data))
+ alert(CoreRESTClient.getError(data));
+ else if (CoreRESTClient.hasData(data))
+ {
+ this.handlerBismeldestichtage();
+ }
+ else
+ alert("No response data");
+ },
+ /**
+ * Used to start/refresh the FetchCmpt
+ */
+ startFetchCmpt: function(apiFunction, apiFunctionParameters, dataFetchedCallback) {
+ // Assign the function api of the FetchCmpt binded property
+ this.fetchCmptApiFunction = apiFunction;
+
+ // In case a null value is provided set the parameters as an empty object
+ if (apiFunctionParameters == null) apiFunctionParameters = {};
+
+ // Assign parameters to the FetchCmpt binded properties
+ this.fetchCmptApiFunctionParams = apiFunctionParameters;
+ // Assign data fetch callback to the FetchCmpt binded properties
+ this.fetchCmptDataFetched = dataFetchedCallback;
+ // Set the FetchCmpt binded property refresh to have the component to refresh
+ // NOTE: this should be the last one to be called because it triggers the FetchCmpt to start to refresh
+ this.fetchCmptRefresh === true ? this.fetchCmptRefresh = false : this.fetchCmptRefresh = true;
+ }
+ }
+});
+
+bismeldestichtagApp.mount('#main');
diff --git a/public/js/apps/Bismeldestichtag/TabulatorSetup.js b/public/js/apps/Bismeldestichtag/TabulatorSetup.js
new file mode 100644
index 000000000..d98cc993c
--- /dev/null
+++ b/public/js/apps/Bismeldestichtag/TabulatorSetup.js
@@ -0,0 +1,75 @@
+/**
+ * Copyright (C) 2022 fhcomplete.org
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+/**
+ *
+ */
+export const BismeldestichtagTabulatorOptions = {
+ maxHeight: "100%",
+ minHeight: 50,
+ layout: 'fitColumns',
+ index: 'meldestichtag_id',
+ columns: [
+ {title: 'Meldestichtag',field: 'meldestichtag', headerFilter: true, formatter: function(cell){
+ return BismeldestichtagTabulatorHelperFunctions._formatDate(cell.getValue());
+ }
+ },
+ {title: 'Studiensemester', field: 'studiensemester_kurzbz', headerFilter: true, sorter:function(a, b, aRow, bRow, column, dir, sorterParams) {
+
+ //aRow, bRow - the row components for the values being compared
+ let semesterStartA = new Date(aRow.getData().semester_start);
+ let semesterStartB = new Date(bRow.getData().semester_start);
+
+ return semesterStartA - semesterStartB; // difference between studiensemester start dates
+ }
+ },
+ {title: 'Semesterstart',field: 'semester_start', headerFilter: true, visible: false, formatter: function(cell){
+ return BismeldestichtagTabulatorHelperFunctions._formatDate(cell.getValue());
+ }
+ },
+ {title: 'ID', field: 'meldestichtag_id', headerFilter: true, visible: false},
+ {title: 'Insertamum', field: 'insertamum', headerFilter: true, visible: false},
+ {title: 'Insertvon', field: 'insertvon', headerFilter: true, visible: false},
+ {title: 'Löschen', field: 'loeschen', headerFilter: false, formatter:function(cell){
+ return '';
+ }
+ }
+ ]
+};
+
+/**
+ *
+ */
+export const BismeldestichtagTabulatorEventHandlers = [
+ {
+ event: "rowClick",
+ handler: function(e, row) {
+ if (e.target.nodeName == 'DIV') {
+ let data = row.getData();
+ alert(data.studiensemester_kurzbz + ': ' + BismeldestichtagTabulatorHelperFunctions._formatDate(data.meldestichtag));
+ }
+ }
+ }
+];
+
+let BismeldestichtagTabulatorHelperFunctions = {
+ _formatDate: function(date) {
+ return date.replace(/(.*)-(.*)-(.*)/, '$3.$2.$1');
+ }
+}
diff --git a/rdf/prestudentrolle.rdf.php b/rdf/prestudentrolle.rdf.php
index 7a3dd636b..0a6caf05c 100644
--- a/rdf/prestudentrolle.rdf.php
+++ b/rdf/prestudentrolle.rdf.php
@@ -35,6 +35,7 @@ require_once('../include/prestudent.class.php');
require_once('../include/datum.class.php');
require_once('../include/statusgrund.class.php');
require_once('../include/student.class.php');
+require_once('../include/bismeldestichtag.class.php');
$rdf_url='http://www.technikum-wien.at/prestudentrolle';
$datum = new datum();
@@ -80,6 +81,8 @@ foreach($statusgrund->result as $row)
$studentlehrverband = new student();
$uid = $studentlehrverband->getUid($prestudent_id);
+
+$erstes_stichtag_inaktiv = true;
foreach($ps->result as $row)
{
$lehrverband = '-';
@@ -99,6 +102,21 @@ foreach($ps->result as $row)
}
}
+ // prüfen, ob Meldestichtag erreicht
+ $bismeldestichtag = new bismeldestichtag();
+ $stichtag_erreicht = $bismeldestichtag->checkMeldestichtagErreicht($row->datum);
+
+ // Variablen für layout von prestudentstatus Anzeige
+ $stichtagsaktiv = $stichtag_erreicht ? 'stichtagsinaktiv' : 'stichtagsaktiv';
+ $aktiv = $stichtag_erreicht ? 'false' : 'true';
+
+ // erstes mal stichtag erreicht -> anderes layout
+ if ($stichtag_erreicht && $erstes_stichtag_inaktiv)
+ {
+ $stichtagsaktiv = 'erstes_stichtagsinaktiv';
+ $erstes_stichtag_inaktiv = false;
+ }
+
echo '
@@ -123,6 +141,8 @@ foreach($ps->result as $row)
insertvon.']]>
formatDatum($row->updateamum,'d.m.Y H:i:s').']]>
updatevon.']]>
+
+
';
diff --git a/skin/tempus.css b/skin/tempus.css
index 7684fddb1..597be41f8 100644
--- a/skin/tempus.css
+++ b/skin/tempus.css
@@ -234,3 +234,19 @@ treechildren::-moz-tree-row(makeItMarked)
width: 25px;
height:25px;
}
+
+treechildren::-moz-tree-cell(stichtagsinaktiv)
+{
+ background-color: #e6e6e6;
+}
+
+treechildren::-moz-tree-cell(erstes_stichtagsinaktiv)
+{
+ background-color: #e6e6e6;
+ border-top: 1px solid grey;
+}
+
+label.warning
+{
+ font-weight: bold;
+}
diff --git a/system/dbupdate_3.4.php b/system/dbupdate_3.4.php
index fc743d5ca..0e345fd45 100644
--- a/system/dbupdate_3.4.php
+++ b/system/dbupdate_3.4.php
@@ -40,6 +40,7 @@ require_once('dbupdate_3.4/27107_vilesci_erfassung_abwesenheiten_reinigung.php')
require_once('dbupdate_3.4/24913_tabelle_raumtyp_neues_attribut_aktiv.php');
require_once('dbupdate_3.4/28089_plausichecks_in_extension_hinzufuegen.php');
require_once('dbupdate_3.4/29133_einzelne_studiengaenge_aus_issuechecks_ausnehmen.php');
+require_once('dbupdate_3.4/29144_prestudent_status_nach_bismeldung_sperren.php');
require_once('dbupdate_3.4/27351_digitalisierung_formulare.php');
require_once('dbupdate_3.4/30537_anmerkung_in_tbl_rolleberechtigung.php');
require_once('dbupdate_3.4/30181_tabelle_anrechnung_neue_attribute_fuer_begruendung.php');
@@ -65,6 +66,7 @@ $tabellen=array(
"bis.tbl_bisfunktion" => array("bisverwendung_id","studiengang_kz","sws","updateamum","updatevon","insertamum","insertvon","ext_id"),
"bis.tbl_bisio" => array("bisio_id","mobilitaetsprogramm_code","nation_code","von","bis","zweck_code","student_uid","updateamum","updatevon","insertamum","insertvon","ext_id","ort","universitaet","lehreinheit_id","ects_erworben","ects_angerechnet","herkunftsland_code"),
"bis.tbl_bisio_zweck" => array("bisio_id","zweck_code"),
+ "bis.tbl_bismeldestichtag" => array("meldestichtag_id", "meldestichtag", "studiensemester_kurzbz", "insertamum", "insertvon", "updateamum", "updatevon"),
"bis.tbl_bisstandort" => array("standort_code","bezeichnung","aktiv","insertamum","insertvon","updateamum","updatevon"),
"bis.tbl_bisverwendung" => array("bisverwendung_id","ba1code","ba2code","vertragsstunden","beschausmasscode","verwendung_code","mitarbeiter_uid","hauptberufcode","hauptberuflich","habilitation","beginn","ende","updateamum","updatevon","insertamum","insertvon","ext_id","dv_art","inkludierte_lehre","zeitaufzeichnungspflichtig","azgrelevant", "homeoffice"),
"bis.tbl_bundesland" => array("bundesland_code","kurzbz","bezeichnung"),
diff --git a/system/dbupdate_3.4/29144_prestudent_status_nach_bismeldung_sperren.php b/system/dbupdate_3.4/29144_prestudent_status_nach_bismeldung_sperren.php
new file mode 100644
index 000000000..e473eb37a
--- /dev/null
+++ b/system/dbupdate_3.4/29144_prestudent_status_nach_bismeldung_sperren.php
@@ -0,0 +1,73 @@
+db_query('SELECT 1 FROM bis.tbl_bismeldestichtag LIMIT 1'))
+{
+ $qry = "CREATE TABLE bis.tbl_bismeldestichtag (
+ meldestichtag_id integer,
+ meldestichtag date NOT NULL,
+ studiensemester_kurzbz varchar(16) NOT NULL,
+ insertamum timestamp DEFAULT NOW(),
+ insertvon varchar(32),
+ updateamum timestamp,
+ updatevon varchar(32)
+ );
+
+ COMMENT ON TABLE bis.tbl_bismeldestichtag IS 'Deadline Dates for BIS reporting';
+
+ ALTER TABLE bis.tbl_bismeldestichtag ADD CONSTRAINT pk_bismeldestichtag PRIMARY KEY (meldestichtag_id);
+
+ CREATE SEQUENCE bis.tbl_meldestichtag_meldestichtag_id_seq
+ INCREMENT BY 1
+ NO MAXVALUE
+ NO MINVALUE
+ CACHE 1;
+
+ ALTER TABLE bis.tbl_bismeldestichtag ALTER COLUMN meldestichtag_id SET DEFAULT nextval('bis.tbl_meldestichtag_meldestichtag_id_seq');
+ ALTER TABLE bis.tbl_bismeldestichtag ADD CONSTRAINT fk_bismeldestichtag_studiensemester_kurzbz FOREIGN KEY (studiensemester_kurzbz) REFERENCES public.tbl_studiensemester(studiensemester_kurzbz) ON UPDATE CASCADE ON DELETE RESTRICT;";
+
+ if (!$db->db_query($qry))
+ echo 'bis.tbl_bismeldestichtag: '.$db->db_last_error().'
';
+ else
+ echo '
bis.tbl_bismeldestichtag table created';
+
+ $qry = 'GRANT SELECT ON TABLE bis.tbl_bismeldestichtag TO web;';
+ if (!$db->db_query($qry))
+ echo 'bis.tbl_bismeldestichtag: '.$db->db_last_error().'
';
+ else
+ echo '
Granted privileges to web on bis.tbl_bismeldestichtag';
+
+ $qry = 'GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE bis.tbl_bismeldestichtag TO vilesci;';
+ if (!$db->db_query($qry))
+ echo 'bis.tbl_bismeldestichtag: '.$db->db_last_error().'
';
+ else
+ echo '
Granted privileges to vilesci on bis.tbl_bismeldestichtag';
+
+ $qry = 'GRANT SELECT, UPDATE ON SEQUENCE bis.tbl_meldestichtag_meldestichtag_id_seq TO web;';
+ if (!$db->db_query($qry))
+ echo 'bis.tbl_meldestichtag_meldestichtag_id_seq: '.$db->db_last_error().'
';
+ else
+ echo '
Granted privileges to web on bis.tbl_meldestichtag_meldestichtag_id_seq';
+
+ $qry = 'GRANT SELECT, UPDATE ON SEQUENCE bis.tbl_meldestichtag_meldestichtag_id_seq TO vilesci;';
+ if (!$db->db_query($qry))
+ echo 'bis.tbl_meldestichtag_meldestichtag_id_seq: '.$db->db_last_error().'
';
+ else
+ echo '
Granted privileges to vilesci on bis.tbl_meldestichtag_meldestichtag_id_seq';
+}
+
+// Add permission for edit Bismelden flag
+if($result = @$db->db_query("SELECT 1 FROM system.tbl_berechtigung WHERE berechtigung_kurzbz = 'student/editBismelden';"))
+{
+ if($db->db_num_rows($result) == 0)
+ {
+ $qry = "INSERT INTO system.tbl_berechtigung(berechtigung_kurzbz, beschreibung) VALUES('student/editBismelden', 'Ändern des Bismelden Attributs pro Student');";
+
+ if(!$db->db_query($qry))
+ echo 'system.tbl_berechtigung '.$db->db_last_error().'
';
+ else
+ echo ' system.tbl_berechtigung: Added permission editBismelden
';
+ }
+}
diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php
index bc0d3789a..9b122dded 100644
--- a/system/phrasesupdate.php
+++ b/system/phrasesupdate.php
@@ -4488,7 +4488,7 @@ When on hold, the date is only a reminder.',
)
)
),
-
+
array(
'app' => 'infocenter',
'category' => 'infocenter',
@@ -4818,7 +4818,7 @@ Die Rechnung wird Ihnen erneut zugesendet. Erst nach Erhalt der Rechn
)
)
),
-
+
array(
'app' => 'core',
'category' => 'password',
@@ -22567,6 +22567,66 @@ array(
)
)
),
+ array(
+ 'app' => 'core',
+ 'category' => 'bismeldestichtag',
+ 'phrase' => 'stichtagHinzufuegen',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Meldestichtag hinzufügen',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Add report target date',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'bismeldestichtag',
+ 'phrase' => 'stichtageVerwalten',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'BIS-Meldestichtage verwalten',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Manage report target dates',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'bismeldestichtag',
+ 'phrase' => 'stichtagLoeschen',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Meldestichtag löschen',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Delete report target date',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ )
);