diff --git a/application/controllers/Cis/Documents.php b/application/controllers/Cis/Documents.php index 20380ca5a..094ade296 100644 --- a/application/controllers/Cis/Documents.php +++ b/application/controllers/Cis/Documents.php @@ -14,9 +14,12 @@ class Documents extends Auth_Controller { parent::__construct([ 'index' => ['student/anrechnung_beantragen:r','user:r'], // TODO(chris): permissions? - 'Semester' => ['student/anrechnung_beantragen:r','user:r'] // TODO(chris): permissions? + 'student' => ['admin:r'], + 'download' => ['student/anrechnung_beantragen:r','user:r'] // TODO(chris): permissions? ]); + $this->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel'); + $this->loadPhrases([ 'global', 'tools' @@ -27,121 +30,151 @@ class Documents extends Auth_Controller // Public methods /** - * @param string $stsem * @return void */ - public function index($stsem = null) + public function index() { - return $this->Semester($stsem); + return $this->showDocuments(getAuthUID()); } /** - * @param string $stsem + * @param string $uid Administratoren dürfen die UID als Parameter übergeben um die Dokumente von anderen Personen anzuzeigen * @return void */ - public function Semester($stsem = null) + public function student($uid) + { + return $this->showDocuments($uid); + } + + /** + * @param string $uid + * @return void + */ + protected function showDocuments($uid) { - $this->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel'); $this->load->model('crm/Konto_model', 'KontoModel'); $this->load->model('organisation/Studiengang_model', 'StudiengangModel'); - $uid = getAuthUID(); $studiengaenge = []; $stati = $this->PrestudentstatusModel->loadWhereUid($uid, null, true); if (isError($stati)) - return $this->view->load('errors/html/error_db.php', [ + return $this->load->view('errors/html/error_db.php', [ 'heading' => 'Database Error', 'message' => getError($stati) ]); $stati = getData($stati); if (!$stati) - return $this->view->load('errors/html/error_general.php', [ + return $this->load->view('errors/html/error_general.php', [ 'heading' => 'User ist kein Student', 'message' => 'Es konnten keine Studiensemester gefunden werden in denen der User als Student inskripiert ist' ]); - $stsemArray = []; + $stgs = []; + $buchungstypen = implode('\',\'', defined("CIS_DOKUMENTE_STUDIENBEITRAG_TYPEN") ? unserialize(CIS_DOKUMENTE_STUDIENBEITRAG_TYPEN) : []); + $person_ids = []; foreach ($stati as $status) { - if (!isset($studiengaenge[$status->studiengang_kz])) { + $person_ids[] = $status->person_id; + + if (!isset($stgs[$status->studiengang_kz])) { $stg = $this->StudiengangModel->load($status->studiengang_kz); if (isError($stg)) - return $this->view->load('errors/html/error_db.php', [ + return $this->load->view('errors/html/error_db.php', [ 'heading' => 'Database Error', 'message' => getError($stg) ]); $stg = getData($stg); if (!$stg) - return $this->view->load('errors/html/error_db.php', [ + return $this->load->view('errors/html/error_db.php', [ 'heading' => 'Database Error', 'message' => 'No Studiengang found for studiengang_kz ' . $status->studiengang_kz ]); - $studiengaenge[$status->studiengang_kz] = current($stg); + $stgs[$status->studiengang_kz] = current($stg); + $stgs[$status->studiengang_kz]->studiensemester = []; } - if (!isset($stsemArray[$status->studiensemester_kurzbz])) - $stsemArray[$status->studiensemester_kurzbz] = []; - // TODO(chris): maybe just use prestudent_id? - $stsemArray[$status->studiensemester_kurzbz][] = $status; - } - - $hasSemester = true; - $inskriptionsbestaetigungen = []; - - if ($stsem && !isset($stsemArray[$stsem])) { - $hasSemester = false; - } else { - if (!$stsem) - $stsem = end($stsemArray); - - #$stsemArray[$stsem] = array_unique($stsemArray[$stsem]); - - $buchungstypen = implode('\',\'', defined("CIS_DOKUMENTE_STUDIENBEITRAG_TYPEN") ? unserialize(CIS_DOKUMENTE_STUDIENBEITRAG_TYPEN) : []); - - foreach ($stsemArray[$stsem] as $status) { - // NOTE(chris): multiple prestudentstatus for prestudent and semester - if (isset($inskriptionsbestaetigungen[$status->studiengang_kz])) - continue; - - $inskriptionsbestaetigungen[$status->studiengang_kz] = (boolean) getData($this->KontoModel->checkStudienbeitragFromPrestudent($status->prestudent_id, $stsem, $buchungstypen)); + if (!isset($stgs[$status->studiengang_kz]->studiensemester[$status->studiensemester_kurzbz])) { + $stgs[$status->studiengang_kz]->studiensemester[$status->studiensemester_kurzbz] = new stdClass(); + $stgs[$status->studiengang_kz]->studiensemester[$status->studiensemester_kurzbz]->inskriptionsbestaetigung = (boolean) getData($this->KontoModel->checkStudienbeitragFromPrestudent($status->prestudent_id, $status->studiensemester_kurzbz, $buchungstypen)); } } + $person_ids = array_unique($person_ids); $selfservice = null; if (!defined('CIS_DOKUMENTE_SELFSERVICE') || CIS_DOKUMENTE_SELFSERVICE) { $this->load->model('crm/Akte_model', 'AkteModel'); - $result = $this->AkteModel->getArchiv(getAuthPersonId(), null, true); - if (isError($result)) - return $this->view->load('errors/html/error_db.php', [ - 'heading' => 'Database Error', - 'message' => getError($result) - ]); - $selfservice = getData($result) ?: []; + $selfservice = []; + foreach ($person_ids as $person_id) { + $result = $this->AkteModel->getArchiv($person_id, null, true); + if (isError($result)) + return $this->load->view('errors/html/error_db.php', [ + 'heading' => 'Database Error', + 'message' => getError($result) + ]); + $selfservice = array_merge($selfservice, getData($result) ?: []); + } } - // TODO(chris): in array stsem stsemArray: - // TODO(chris): - inskriptionsbestaetigung (konto) - // TODO(chris): - CIS_DOKUMENTE_STUDIENBUCHLBATT_DRUCKEN? studienbuchblatt - // TODO(chris): - CIS_DOKUMENTE_STUDIENERFOLGSBESTAETIGUNG_DRUCKEN? studienerfolgsbestaetigung - // TODO(chris): else: msg - - // TODO(chris): CIS_DOKUMENTE_SELFSERVICE?: ...abschlussdokumente (akte) - - $stsemArray = array_keys($stsemArray); - if (!$hasSemester) - array_unshift($stsemArray, $stsem); - $this->load->view('Cis/Documents', [ + 'stgs' => $stgs, 'uid' => $uid, - 'stsem' => $stsem, - 'stsemArray' => $stsemArray, - 'hasSemester' => $hasSemester, - 'studiengaenge' => $studiengaenge, - 'inskriptionsbestaetigungen' => $inskriptionsbestaetigungen, 'studienbuchblatt' => defined('CIS_DOKUMENTE_STUDIENBUCHLBATT_DRUCKEN') && CIS_DOKUMENTE_STUDIENBUCHLBATT_DRUCKEN, 'studienerfolgsbestaetigung' => defined('CIS_DOKUMENTE_STUDIENERFOLGSBESTAETIGUNG_DRUCKEN') && CIS_DOKUMENTE_STUDIENERFOLGSBESTAETIGUNG_DRUCKEN, 'selfservice' => $selfservice ]); } + /** + * @param integer $akte_id + * @param string $uid (optional) Administratoren dürfen die UID als Parameter übergeben um die Dokumente von anderen Personen anzuzeigen + * + * @return void + */ + public function download($akte_id, $uid = null) + { + if (!is_numeric($akte_id)) + return show_404(); + + $this->load->model('crm/Akte_model', 'AkteModel'); + $result = $this->AkteModel->load($akte_id); + if (isError($result)) + return show_error(getError($result)); + $akte = getData($result); + if (!$akte) + return show_404(); + $akte = current($akte); + + $admin_access = false; + if ($uid !== null && $this->permissionlib->isBerechtigt('admin')) { + $stati = $this->PrestudentstatusModel->loadWhereUid($uid, null, true); + if (hasData($stati)) { + $person_ids = array_map(function ($status) { + return $status->person_id; + }, getData($stati)); + $person_ids = array_unique($person_ids); + if (count($person_ids) == 1 && current($person_ids) == $akte->person_id) { + $admin_access = true; + } + } + } + + if (!$admin_access && ($akte->person_id != getAuthPersonId() || !$akte->stud_selfservice)) + return show_error('Forbidden', 403); + + // NOTE(chris): Log bei einem Download vom Becheid + if (isset($akte->dokument_kurzbz) && ($akte->dokument_kurzbz === 'Bescheid' || $akte->dokument_kurzbz === 'BescheidEng')) { + $this->load->model('system/Webservicelog_model', 'WebservicelogModel'); + $this->WebservicelogModel->insert([ + 'webservicetyp_kurzbz' => 'content', + 'request_id' => (isset($akte->akte_id) && !empty($akte->akte_id)) ? $akte->akte_id : NULL, + 'beschreibung' => 'Bescheidbestaetigungsdownload', + 'request_data' => $_SERVER['QUERY_STRING'], + 'execute_time' => date('c'), + 'execute_user' => getAuthUID() + ]); + } + + $this->output->set_content_type($akte->mimetype); + $this->output->set_output(base64_decode($akte->inhalt)); + } } diff --git a/application/views/Cis/Documents.php b/application/views/Cis/Documents.php index 480fabe85..1e7b0ea48 100644 --- a/application/views/Cis/Documents.php +++ b/application/views/Cis/Documents.php @@ -1,131 +1,210 @@ true, + 'customJSModules' => ['public/js/apps/Cis/Documents.js'] +); $this->load->view('templates/CISHTML-Header', $includesArray); ?>
-

p->t('global', 'dokumente'); ?>p->t('tools', 'bestaetigungenZeugnisse'); ?>

-
- -
-
- -
+

p->t('tools', 'dokumente'); ?>p->t('tools', 'bestaetigungenZeugnisse'); ?>

- -
-

p->t('tools', 'inskriptionsbestaetigung'); ?>

- -
- -
-

p->t('tools', 'studienbuchblatt'); ?>

- -
- - -
-

p->t('tools', 'studienerfolgsbestaetigung'); ?>

-
+ + + + + + + + + + + + + studiensemester as $stsem => $sem) { ?> + inskriptionsbestaetigung) { ?> + + + + + + + + + + + + + + + + - - + +
DokumentStudiengangStudiensemester
+ + PDF p->t('tools', 'inskriptionsbestaetigung'); ?> + + bezeichnung; ?>
+ + PDF p->t('tools', 'studienbuchblatt'); ?> + + bezeichnung; ?>
+
+ +
+
+

p->t('tools', 'studienerfolgsbestaetigung'); ?>

+ +
+ +
+ +
+ +
+
+ +
+
+ + + + + + + + + + + + + + $this->p->t('global', 'deutsch'), 'StudienerfolgEng' => $this->p->t('global', 'englisch')] as $lang_xsl => $lang) { ?> + + + + + + + + + + + + studiensemester as $stsem => $sem) { ?> + + + + + + + + + + + + + + +
DokumentStudiengangStudiensemesterSprachep->t('tools', 'vorlageWohnsitzfinanzamt'); ?>
+ + PDF p->t('tools', 'studienerfolgsbestaetigung'); ?> + + bezeichnung; ?>p->t('tools', 'alleStudiensemester'); ?>
+ + PDF p->t('tools', 'studienerfolgsbestaetigung'); ?> + + bezeichnung; ?>
+
+ + +
+
+

p->t('tools', 'abschlussdokumente'); ?>

+
+ + + + + + + + + + + + + + +
DokumentDatum
+ + PDF bezeichnung; ?> + + erstelltam))->format('d.m.Y'); ?>
+
+ + + +
+
- - - - - -
-

p->t('tools', 'abschlussdokumente'); ?>

- -
- + load->view('templates/CISHTML-Footer', $includesArray); ?> diff --git a/public/js/apps/Cis/Documents.js b/public/js/apps/Cis/Documents.js new file mode 100644 index 000000000..d484c06db --- /dev/null +++ b/public/js/apps/Cis/Documents.js @@ -0,0 +1,93 @@ +import Phrasen from '../../mixins/Phrasen.js'; +//import {TabulatorFull as Tabulator} from '../../../../vendor/olifolkerd/tabulator5/dist/js/tabulator_esm.min.js'; +//import CssLib from '../../helpers/CssLib.js'; +//CssLib.import('../../vendor/olifolkerd/tabulator5/dist/css/tabulator_bootstrap5.min.css'); + +const app = Vue.createApp({ + mixins: [ + Phrasen + ], + data() { + return { + inscriptiontable: null, + inscriptiontableFilters: {}, + studienerfolgsbestaetigungtable: null, + studienerfolgsbestaetigungtableFilters: {}, + abschlussdokumentetable: null + }; + }, + computed: { + inscriptiontableFilter() { + const filter = []; + for (var k in this.inscriptiontableFilters) + if (this.inscriptiontableFilters[k]) + filter.push({ + field: k, + type: '=', + value: this.inscriptiontableFilters[k] + }); + return filter; + }, + inscriptiontableEmpty() { + // NOTE(chris): empty result on filter + if (this.inscriptiontableFilters.Stsem) + return this.p.t('tools', 'studienbeitragFuerSSNochNichtBezahlt', {stsem: this.inscriptiontableFilters.Stsem}); + if (this.inscriptiontableFilters.Stg) + return this.p.t('tools', 'studienbeitragFuerStgNochNichtBezahlt', {stsem: this.inscriptiontableFilters.Stg}); + + return this.p.t('tools', 'studienbeitragNochNichtBezahlt'); + }, + studienerfolgsbestaetigungtableFilter() { + const filter = []; + for (var k in this.studienerfolgsbestaetigungtableFilters) + if (this.studienerfolgsbestaetigungtableFilters[k]) + filter.push({ + field: k, + type: '=', + value: this.studienerfolgsbestaetigungtableFilters[k] + }); + return filter; + } + }, + methods: { + changeFilter(table, field, evt) { + this[table + 'Filters'][field] = evt.target.value; + this[table].clearFilter(); + if (this[table + 'Filter'].length) + this[table].setFilter(this[table + 'Filter']); + } + }, + mounted() { + this.inscriptiontable = new Tabulator(this.$refs.inscriptiontable, { + layout: 'fitDataStretch', + placeholder: this.p.t('tools', 'studienbeitragNochNichtBezahlt') + }); + this.studienerfolgsbestaetigungtable = new Tabulator(this.$refs.studienerfolgsbestaetigungtable, { + layout: 'fitDataStretch' + }); + this.abschlussdokumentetable = new Tabulator(this.$refs.abschlussdokumentetable, { + layout: 'fitDataStretch', + placeholder: this.p.t('tools', 'nochKeineAbschlussdokumenteVorhanden') + }); + + // NOTE(chris): empty result on filter + const div = Vue.h( + 'div', + { + class: 'position-absolute top-0 left-0 w-100 h-100 d-flex justify-content-center align-items-center fw-bold text-muted' + }, + [ + this.inscriptiontableEmpty + ] + ); + this.inscriptiontable.on('dataSorted', (sorters, rows) => { + if (!rows.length) { + div.children = [this.inscriptiontableEmpty]; + Vue.render(div, this.inscriptiontable.element.querySelector('.tabulator-tableholder')); + } else { + Vue.render(null, this.inscriptiontable.element.querySelector('.tabulator-tableholder')); + } + }); + } +}); +app.mount('#content'); \ No newline at end of file diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php index 78807f26d..cf344aa52 100644 --- a/system/phrasesupdate.php +++ b/system/phrasesupdate.php @@ -17318,6 +17318,46 @@ array( ) ) ), + array( + 'app' => 'core', + 'category' => 'global', + 'phrase' => 'englisch', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => "Englisch", + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => "English", + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'global', + 'phrase' => 'deutsch', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => "Deutsch", + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => "German", + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), array( 'app' => 'core', 'category' => 'global', @@ -17341,18 +17381,78 @@ array( array( 'app' => 'core', 'category' => 'tools', - 'phrase' => 'keinStatusImStudiensemester', + 'phrase' => 'dokumente', 'insertvon' => 'system', 'phrases' => array( array( 'sprache' => 'German', - 'text' => 'Für das übergebene Studiensemester {stsem} existiert kein Status. Bitte wählen Sie ein gültiges Studiensemester aus dem DropDown.', + 'text' => 'Dokumente', 'description' => '', 'insertvon' => 'system' ), array( 'sprache' => 'English', - 'text' => 'No status found for {stsem}. Please select a valid semester from the dropdown.', + 'text' => 'Documents', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'tools', + 'phrase' => 'dokument', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Dokument', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Document', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'tools', + 'phrase' => 'erstelldatum', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Erstelldatum', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Creation date', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'tools', + 'phrase' => 'bestaetigungenZeugnisse', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Bestätigungen/Zeugnisse', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Certificates/Transcripts', 'description' => '', 'insertvon' => 'system' ) @@ -17381,18 +17481,258 @@ array( array( 'app' => 'core', 'category' => 'tools', - 'phrase' => 'studienbeitragFuerSSNochNichtBezahlt', + 'phrase' => 'studienbeitragFuerSSBezahlt', 'insertvon' => 'system', 'phrases' => array( array( 'sprache' => 'German', - 'text' => 'Studienbeitrag für das {stsem} noch nicht bezahlt', + 'text' => 'Studienbeitrag für das %1$s bezahlt', 'description' => '', 'insertvon' => 'system' ), array( 'sprache' => 'English', - 'text' => 'tuition fee for semester {stsem} not yet paid', + 'text' => 'tuition fee for semester %1$s paid', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'tools', + 'phrase' => 'studienbeitragFuerSSNochNichtBezahlt', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Studienbeitrag für das %1$s noch nicht bezahlt', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'tuition fee for semester %1$s not yet paid', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'tools', + 'phrase' => 'studienbeitragFuerStgNochNichtBezahlt', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Studienbeitrag für %1$s noch nicht bezahlt', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'tuition fee for %1$s not yet paid', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'tools', + 'phrase' => 'studienbeitragNochNichtBezahlt', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Studienbeitrag noch nicht bezahlt', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'tuition fee not yet paid', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'tools', + 'phrase' => 'studienerfolgsbestaetigung', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Studienerfolgsbestätigung', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Student progress report', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'tools', + 'phrase' => 'studiensemesterAuswaehlen', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Bitte wählen Sie das entsprechende Studiensemester aus', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Please select the corresponding semester', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'tools', + 'phrase' => 'vorlageWohnsitzfinanzamt', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'zur Vorlage beim Wohnsitzfinanzamt', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'for submission to local tax office', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'tools', + 'phrase' => 'studienbuchblatt', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Studienbuchblatt', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Student Record', //Noch zu übersetzen + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'tools', + 'phrase' => 'alleStudiensemester', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Alle Studiensemester', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'All semester', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'tools', + 'phrase' => 'abschlussdokumente', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Abschlussdokumente/Zeugnisse', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Final documents/Transcripts', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'tools', + 'phrase' => 'nochKeineAbschlussdokumenteVorhanden', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Noch keine Abschlussdokumente vorhanden', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'No final documents available yet', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'tools', + 'phrase' => 'keinStatusImStudiensemester', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Für das übergebene Studiensemester %1$s existiert kein Status. Bitte wählen Sie ein gültiges Studiensemester aus dem DropDown.', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'No status found for %1$s. Please select a valid semester from the dropdown.', + 'description' => '', + 'insertvon' => 'system' + ) + ) + ), + array( + 'app' => 'core', + 'category' => 'tools', + 'phrase' => 'warnungDruckDigitaleSignatur', + 'insertvon' => 'system', + 'phrases' => array( + array( + 'sprache' => 'German', + 'text' => 'Hinweis! Digital signierte Dokumente werden in manchen Browsern und PDF-Readern nicht korrekt angezeigt.
Bitte verwenden Sie den Adobe Acrobat Reader, wenn Sie das Dokument ausdrucken möchten.', + 'description' => '', + 'insertvon' => 'system' + ), + array( + 'sprache' => 'English', + 'text' => 'Note! Digitally signed documents are not displayed correctly in some browsers and PDF readers.
Please use the Adobe Acrobat Reader if you want to print the document.', 'description' => '', 'insertvon' => 'system' )