diff --git a/application/views/system/infocenter/stammdaten.php b/application/views/system/infocenter/stammdaten.php
index f143c9c03..f852e9ace 100644
--- a/application/views/system/infocenter/stammdaten.php
+++ b/application/views/system/infocenter/stammdaten.php
@@ -32,12 +32,6 @@
| p->t('person','staatsbuergerschaft')) ?> |
diff --git a/cis/infoterminal/index.php b/cis/infoterminal/index.php
index 1b4c7d637..04c591ee1 100644
--- a/cis/infoterminal/index.php
+++ b/cis/infoterminal/index.php
@@ -843,7 +843,6 @@ function meine_uid_informationen_detail($db,$uid,$count=0)
$aktiv=$db->db_result($erg,0,"aktiv");
- $svnr=$db->db_result($erg,0,"svnr");
$titelpre=$db->db_result($erg,0,"titelpre");
$titelpost=$db->db_result($erg,0,"titelpost");
diff --git a/cis/private/profile/zeitsperre_resturlaub.php b/cis/private/profile/zeitsperre_resturlaub.php
index ffd179401..1b6546d41 100644
--- a/cis/private/profile/zeitsperre_resturlaub.php
+++ b/cis/private/profile/zeitsperre_resturlaub.php
@@ -285,15 +285,16 @@ function showHideBezeichnungDropDown()
if (dd.options[dd.selectedIndex].value == 'DienstV')
{
var str = '';
sp.innerHTML = str;
diff --git a/content/dokumentenakt.pdf.php b/content/dokumentenakt.pdf.php
index a27b8d562..a737ee72d 100644
--- a/content/dokumentenakt.pdf.php
+++ b/content/dokumentenakt.pdf.php
@@ -307,8 +307,6 @@ foreach($prestudent_ids as $pid)
$nation->load($prestudent->zgvnation);
$zgvnation = $nation->kurztext;
- $svnr = ($prestudent->svnr == '')?($prestudent->ersatzkennzeichen != ''?'Ersatzkennzeichen: '.$prestudent->ersatzkennzeichen:''):$prestudent->svnr;
-
foreach($adresse->result as $row_adresse)
{
if($row_adresse->heimatadresse)
@@ -439,7 +437,6 @@ foreach($prestudent_ids as $pid)
'zustell_ort' => $zustellOrt,
'zustell_bundesland' => $zustellBundesland,
'geburtsnation' => $geburtsnation,
- 'svnr' => $svnr,
'staatsbuergerschaft' => $staatsbuergerschaft,
'geschlecht' => $prestudent->geschlecht,
'telefonnummer' => $telefonnummer,
diff --git a/content/statistik/studentenexportextended.xls.php b/content/statistik/studentenexportextended.xls.php
index 89acbe18f..5ab34d026 100644
--- a/content/statistik/studentenexportextended.xls.php
+++ b/content/statistik/studentenexportextended.xls.php
@@ -125,8 +125,6 @@ $worksheet->write($zeile, ++$i, "PERSONENKENNZEICHEN", $format_bold);
$maxlength[$i] = 19;
$worksheet->write($zeile, ++$i, "STAATSBÜRGERSCHAFT", $format_bold);
$maxlength[$i] = 16;
-$worksheet->write($zeile, ++$i, "SVNR", $format_bold);
-$maxlength[$i] = 4;
$worksheet->write($zeile, ++$i, "PERSON_ID", $format_bold);
$maxlength[$i] = 6;
$worksheet->write($zeile, ++$i, "ERSATZKENNZEICHEN", $format_bold);
@@ -396,12 +394,7 @@ function draw_content($row)
$worksheet->write($zeile, $i, $row->staatsbuergerschaft);
$i++;
- //SVNR
- if (mb_strlen($row->svnr) > $maxlength[$i])
- $maxlength[$i] = mb_strlen($row->svnr);
- $worksheet->write($zeile, $i, $row->svnr);
- $i++;
-
+
//Person_id
if (mb_strlen($row->person_id) > $maxlength[$i])
$maxlength[$i] = mb_strlen($row->person_id);
diff --git a/content/student/studentDBDML.php b/content/student/studentDBDML.php
index e1bcffd84..041af9c20 100644
--- a/content/student/studentDBDML.php
+++ b/content/student/studentDBDML.php
@@ -594,7 +594,6 @@ if(!$error)
$student->anmerkungen = $_POST['anmerkung'];
$student->homepage = $_POST['homepage'];
$student->matr_nr = $_POST['matr_nr'];
- $student->svnr = $_POST['svnr'];
$student->ersatzkennzeichen = $_POST['ersatzkennzeichen'];
$student->familienstand = $_POST['familienstand'];
$student->geschlecht = $_POST['geschlecht'];
@@ -746,7 +745,6 @@ if(!$error)
$person->gebzeit = $_POST['geburtszeit'];
$person->anmerkungen = $_POST['anmerkung'];
$person->homepage = $_POST['homepage'];
- $person->svnr = $_POST['svnr'];
$person->ersatzkennzeichen = $_POST['ersatzkennzeichen'];
$person->familienstand = $_POST['familienstand'];
$person->geschlecht = $_POST['geschlecht'];
diff --git a/content/student/studentdetailoverlay.xul.php b/content/student/studentdetailoverlay.xul.php
index 132667395..36740d209 100644
--- a/content/student/studentdetailoverlay.xul.php
+++ b/content/student/studentdetailoverlay.xul.php
@@ -134,8 +134,7 @@ echo '';
-
-
+
diff --git a/content/student/studentenoverlay.xul.php b/content/student/studentenoverlay.xul.php
index 739cde39c..809055c2e 100644
--- a/content/student/studentenoverlay.xul.php
+++ b/content/student/studentenoverlay.xul.php
@@ -284,10 +284,6 @@ else
class="sortDirectionIndicator"
sort="rdf:http://www.technikum-wien.at/student/rdf#titelpost" onclick="StudentTreeSort()"/>
-
-
@@ -445,7 +441,6 @@ else
-
diff --git a/content/student/studentoverlay.js.php b/content/student/studentoverlay.js.php
index d2030f493..f64ed5f91 100644
--- a/content/student/studentoverlay.js.php
+++ b/content/student/studentoverlay.js.php
@@ -786,7 +786,6 @@ function StudentDetailReset()
document.getElementById('student-detail-textbox-geburtszeit').value='';
document.getElementById('student-detail-textbox-anmerkung').value='';
document.getElementById('student-detail-textbox-homepage').value='';
- document.getElementById('student-detail-textbox-svnr').value='';
document.getElementById('student-detail-textbox-ersatzkennzeichen').value='';
document.getElementById('student-detail-menulist-familienstand').value='l';
document.getElementById('student-detail-menulist-geschlecht').value='m';
@@ -819,7 +818,6 @@ function StudentDetailDisableFields(val)
document.getElementById('student-detail-textbox-geburtszeit').disabled=val;
document.getElementById('student-detail-textbox-anmerkung').disabled=val;
document.getElementById('student-detail-textbox-homepage').disabled=val;
- document.getElementById('student-detail-textbox-svnr').disabled=val;
document.getElementById('student-detail-textbox-ersatzkennzeichen').disabled=val;
document.getElementById('student-detail-menulist-familienstand').disabled=val;
document.getElementById('student-detail-menulist-geschlecht').disabled=val;
@@ -860,7 +858,6 @@ function StudentDetailSave()
geburtszeit = document.getElementById('student-detail-textbox-geburtszeit').value;
anmerkung = document.getElementById('student-detail-textbox-anmerkung').value;
homepage = document.getElementById('student-detail-textbox-homepage').value;
- svnr = document.getElementById('student-detail-textbox-svnr').value;
ersatzkennzeichen = document.getElementById('student-detail-textbox-ersatzkennzeichen').value;
familienstand = document.getElementById('student-detail-menulist-familienstand').value;
geschlecht = document.getElementById('student-detail-menulist-geschlecht').value;
@@ -919,7 +916,6 @@ function StudentDetailSave()
req.add('geburtszeit', geburtszeit);
req.add('anmerkung', anmerkung);
req.add('homepage', homepage);
- req.add('svnr', svnr);
req.add('ersatzkennzeichen', ersatzkennzeichen);
req.add('familienstand', familienstand);
req.add('geschlecht', geschlecht);
@@ -1167,7 +1163,6 @@ function StudentAuswahl()
geburtszeit=getTargetHelper(dsource,subject,rdfService.GetResource( predicateNS + "#gebzeit" ));
anmerkung=getTargetHelper(dsource,subject,rdfService.GetResource( predicateNS + "#anmerkungen" ));
homepage=getTargetHelper(dsource,subject,rdfService.GetResource( predicateNS + "#homepage" ));
- svnr=getTargetHelper(dsource,subject,rdfService.GetResource( predicateNS + "#svnr" ));
ersatzkennzeichen=getTargetHelper(dsource,subject,rdfService.GetResource( predicateNS + "#ersatzkennzeichen" ));
familienstand=getTargetHelper(dsource,subject,rdfService.GetResource( predicateNS + "#familienstand" ));
geschlecht=getTargetHelper(dsource,subject,rdfService.GetResource( predicateNS + "#geschlecht" ));
@@ -1211,7 +1206,6 @@ function StudentAuswahl()
document.getElementById('student-detail-textbox-geburtszeit').value=geburtszeit;
document.getElementById('student-detail-textbox-anmerkung').value=anmerkung;
document.getElementById('student-detail-textbox-homepage').value=homepage;
- document.getElementById('student-detail-textbox-svnr').value=svnr;
document.getElementById('student-detail-textbox-ersatzkennzeichen').value=ersatzkennzeichen;
document.getElementById('student-detail-menulist-familienstand').value=familienstand;
@@ -3553,6 +3547,15 @@ function StudentZeugnisDokumentArchivieren()
xml = 'abschlussdokument_lehrgaenge.xml.php';
break;
+ case 'microcredentialzertifikat_1':
+ case 'microcredentialzertifikat_2':
+ case 'microcredentialzertifikat_3':
+ case 'microcredential_1':
+ case 'microcredential_2':
+ case 'microcredential_3':
+ xml = 'microcredential.xml.php';
+ break;
+
default:
alert('Das Archivieren fuer diesen Dokumenttyp wird derzeit nicht unterstuetzt');
return
@@ -4783,7 +4786,7 @@ function StudentNotenMoveFromAntrag()
var uid = document.getElementById('student-detail-textbox-uid').value;
req.add('student_uid', uid);
-
+
var txt = "?";
for(var q in req.parms) {
txt = txt+'&'+req.parms[q].name+'='+encodeURIComponent(req.parms[q].value);
diff --git a/include/prestudent.class.php b/include/prestudent.class.php
index 06b974b1a..7317572ba 100644
--- a/include/prestudent.class.php
+++ b/include/prestudent.class.php
@@ -1051,7 +1051,6 @@ class prestudent extends person
//$ps->foto = $row->foto;
$ps->anmerkungen = $row->anmerkungen;
$ps->homepage = $row->homepage;
- $ps->svnr = $row->svnr;
$ps->ersatzkennzeichen = $row->ersatzkennzeichen;
$ps->familienstand = $row->familienstand;
$ps->geschlecht = $row->geschlecht;
diff --git a/include/student.class.php b/include/student.class.php
index cfea879a9..66154c3ca 100644
--- a/include/student.class.php
+++ b/include/student.class.php
@@ -294,7 +294,6 @@ class student extends benutzer
$l->gebort=$row->gebort;
$l->gebzeit=$row->gebzeit;
$l->familienstand = $row->familienstand;
- $l->svnr=$row->svnr;
$l->foto=$row->foto;
$l->anmerkungen=$row->anmerkung;
$l->aktiv=$this->db_parse_bool($row->aktiv);
@@ -649,7 +648,7 @@ class student extends benutzer
{
$sql_query = "SELECT
person_id, staatsbuergerschaft, geburtsnation, sprache, anrede, titelpost, titelpre,
- nachname, vorname, vornamen, gebdatum, gebort, gebzeit, anmerkung, homepage, svnr,
+ nachname, vorname, vornamen, gebdatum, gebort, gebzeit, anmerkung, homepage,
ersatzkennzeichen, familienstand, geschlecht, anzahlkinder, tbl_person.aktiv, kurzbeschreibung,
tbl_benutzer.aktiv as bnaktiv, tbl_student.studiengang_kz, tbl_student.semester, tbl_student.verband,
tbl_student.gruppe, tbl_student.prestudent_id, tbl_benutzer.uid
@@ -691,7 +690,6 @@ class student extends benutzer
$l->gebzeit = $row->gebzeit;
$l->anmerkungen = $row->anmerkung;
$l->homepage = $row->homepage;
- $l->svnr = $row->svnr;
$l->ersatzkennzeichen = $row->ersatzkennzeichen;
$l->familienstand = $row->familienstand;
$l->geschlecht = $row->geschlecht;
diff --git a/include/tw/cis_menu_lv.inc.php b/include/tw/cis_menu_lv.inc.php
index 73a347dc3..29ba54724 100644
--- a/include/tw/cis_menu_lv.inc.php
+++ b/include/tw/cis_menu_lv.inc.php
@@ -244,10 +244,10 @@ function checkZeilenUmbruch()
if(defined('CIS_LEHRVERANSTALTUNG_ANWESENHEIT_ANZEIGEN') && CIS_LEHRVERANSTALTUNG_ANWESENHEIT_ANZEIGEN && $angemeldet
&& (!defined('CIS_LEHRVERANSTALTUNG_ANWESENHEIT_ANZEIGEN_STG') || in_array($lv->studiengang_kz, unserialize(CIS_LEHRVERANSTALTUNG_ANWESENHEIT_ANZEIGEN_STG)))
&& (!defined('CIS_LEHRVERANSTALTUNG_ANWESENHEIT_ANZEIGEN_LVA') || in_array($lv->lehrveranstaltung_id, unserialize(CIS_LEHRVERANSTALTUNG_ANWESENHEIT_ANZEIGEN_LVA)))
- && ($rechte->isBerechtigt('extension/anw_ent_admin')
- || $rechte->isBerechtigt('extension/anwesenheit_lektor')
- || $rechte->isBerechtigt('extension/anwesenheit_student')
- || $rechte->isBerechtigt('extension/anwesenheit_admin')))
+ && ($rechte->isBerechtigt('extension/anw_r_ent_assistenz')
+ || $rechte->isBerechtigt('extension/anw_r_lektor')
+ || $rechte->isBerechtigt('extension/anw_r_student')
+ || $rechte->isBerechtigt('extension/anw_r_full_assistenz')))
{
$link='';
$text='';
diff --git a/public/js/components/Bootstrap/Modal.js b/public/js/components/Bootstrap/Modal.js
index af81e469f..a84d9d8d7 100644
--- a/public/js/components/Bootstrap/Modal.js
+++ b/public/js/components/Bootstrap/Modal.js
@@ -3,7 +3,8 @@
export default {
name: 'BootstrapModal',
data: () => ({
- modal: null
+ modal: null,
+ fullscreen: false
}),
props: {
backdrop: {
@@ -34,6 +35,10 @@ export default {
footerClass: {
type: [String,Array,Object],
default: ''
+ },
+ allowFullscreenExpand: {
+ type: Boolean,
+ default: false
}
},
emits: [
@@ -58,6 +63,9 @@ export default {
},
toggle() {
return this.modal.toggle();
+ },
+ toggleFullscreen() {
+ this.fullscreen = !this.fullscreen
}
},
mounted() {
@@ -122,13 +130,18 @@ export default {
});
});
},
- template: `
-
+ template: `
+
diff --git a/public/js/components/Calendar/Mode/Day.js b/public/js/components/Calendar/Mode/Day.js
index 68ca1fa89..e9764b495 100644
--- a/public/js/components/Calendar/Mode/Day.js
+++ b/public/js/components/Calendar/Mode/Day.js
@@ -44,11 +44,16 @@ export default {
},
watch: {
currentDate() {
- this.rangeOffset = this.currentDate.startOf('day').diff(this.focusDate.startOf('day'), 'days').days;
- if (this.rangeOffset) {
- this.$refs.view.$refs.grid.disableAutoScroll();
+ if (this.currentDate.locale != this.focusDate.locale) {
+ this.focusDate = this.currentDate;
this.$emit('update:range', this.range);
- this.$refs.slider.slidePages(this.rangeOffset).then(this.updatePage);
+ } else {
+ this.rangeOffset = this.currentDate.startOf('day').diff(this.focusDate.startOf('day'), 'days').days;
+ if (this.rangeOffset) {
+ this.$refs.view.$refs.grid.disableAutoScroll();
+ this.$emit('update:range', this.range);
+ this.$refs.slider.slidePages(this.rangeOffset).then(this.updatePage);
+ }
}
}
},
diff --git a/public/js/components/Calendar/Mode/List.js b/public/js/components/Calendar/Mode/List.js
index 97990a5a3..76acfc610 100644
--- a/public/js/components/Calendar/Mode/List.js
+++ b/public/js/components/Calendar/Mode/List.js
@@ -47,10 +47,15 @@ export default {
},
watch: {
currentDate() {
- this.rangeOffset = this.currentDate.startOf('day').diff(this.focusDate.startOf('day'), 'days').days;
- if (this.rangeOffset) {
+ if (this.currentDate.locale != this.focusDate.locale) {
+ this.focusDate = this.currentDate;
this.$emit('update:range', this.range);
- this.$refs.slider.slidePages(this.rangeOffset).then(this.updatePage);
+ } else {
+ this.rangeOffset = this.currentDate.startOf('day').diff(this.focusDate.startOf('day'), 'days').days;
+ if (this.rangeOffset) {
+ this.$emit('update:range', this.range);
+ this.$refs.slider.slidePages(this.rangeOffset).then(this.updatePage);
+ }
}
}
},
diff --git a/public/js/components/Form/Input.js b/public/js/components/Form/Input.js
index c85272aab..81b47d504 100644
--- a/public/js/components/Form/Input.js
+++ b/public/js/components/Form/Input.js
@@ -3,6 +3,7 @@ import FhcFragment from "../Fragment.js";
let _uuid = {};
export default {
+ name: "FormInput",
inheritAttrs: false,
components: {
FhcFragment
@@ -220,7 +221,7 @@ export default {
if (this.tag == 'VueDatePicker' && !this._.components.VueDatePicker) {
this._.components.VueDatePicker = Vue.defineAsyncComponent(() => import("../vueDatepicker.js.php"));
} else if (this.tag == 'PvAutocomplete' && !this._.components.PvAutocomplete) {
- this._.components.PvAutocomplete = Vue.defineAsyncComponent(() => import(FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + "/public/js/components/primevue/autocomplete/autocomplete.esm.min.js"));
+ this._.components.PvAutocomplete = primevue.autocomplete;
} else if (this.tag == 'UploadImage' && !this._.components.UploadImage) {
this._.components.UploadImage = Vue.defineAsyncComponent(() => import("./Upload/Image.js"));
} else if (this.tag == 'UploadDms' && !this._.components.UploadDms) {
diff --git a/public/js/components/Stv/Studentenverwaltung/Details/Details.js b/public/js/components/Stv/Studentenverwaltung/Details/Details.js
index 45ee3bdd5..fdb4ec016 100644
--- a/public/js/components/Stv/Studentenverwaltung/Details/Details.js
+++ b/public/js/components/Stv/Studentenverwaltung/Details/Details.js
@@ -318,16 +318,6 @@ export default {
-
-
{
+ .then(result => {
+ const messagesSuccessful = result.filter(res => res.status == 'fulfilled');
+ if (messagesSuccessful.length) {
+ this.$fhcAlert.alertDefault(
+ 'info',
+ 'Feedback',
+ messagesSuccessful.length + " erfolgreiche Statusänderung(en) durchgeführt", // TODO(chris): translate
+ false,
+ true
+ );
+ }
this.$emit('reloadTable');
this.$reloadList();
});
diff --git a/public/js/components/Stv/Studentenverwaltung/List.js b/public/js/components/Stv/Studentenverwaltung/List.js
index 965395556..67cada523 100644
--- a/public/js/components/Stv/Studentenverwaltung/List.js
+++ b/public/js/components/Stv/Studentenverwaltung/List.js
@@ -50,7 +50,6 @@ export default {
{title:"Wahlname", field:"wahlname", visible:false, headerFilter: true},
{title:"Vornamen", field:"vornamen", visible:false, headerFilter: true},
{title:"TitelPost", field:"titelpost", headerFilter: "list", headerFilterParams: {valuesLookup:true, listOnEmpty:true, autocomplete:true, sort:"asc"}},
- {title:"SVNR", field:"svnr", headerFilter: true},
{title:"Ersatzkennzeichen", field:"ersatzkennzeichen", headerFilter: true},
{title:"Geburtsdatum", field:"gebdatum", formatter:dateFormatter,
headerFilter: true, headerFilterFunc: function(headerValue, rowValue, rowData, filterParams) {
diff --git a/public/js/components/Stv/Studentenverwaltung/List/New.js b/public/js/components/Stv/Studentenverwaltung/List/New.js
index dc78aedb6..8de217e00 100644
--- a/public/js/components/Stv/Studentenverwaltung/List/New.js
+++ b/public/js/components/Stv/Studentenverwaltung/List/New.js
@@ -193,7 +193,7 @@ export default {
// TODO(chris): move to fhcapi.factory
this.$refs.form
- .send('api/frontend/v1/stv/student/add', data)
+ .post('api/frontend/v1/stv/student/add', data)
.then(result => {
this.$fhcAlert.alertSuccess('Gespeichert');
this.$refs.modal.hide();
@@ -213,7 +213,7 @@ export default {
},
template: `
-
+
InteressentIn anlegen
diff --git a/public/js/infocenter/stammdaten.js b/public/js/infocenter/stammdaten.js
index c7600f677..8e34996cd 100644
--- a/public/js/infocenter/stammdaten.js
+++ b/public/js/infocenter/stammdaten.js
@@ -44,7 +44,6 @@ $(document).ready(function ()
"nachname" : $('#nachname_input').val(),
"titelpost" : $('#titelpost_input').val(),
"gebdatum" : $('#gebdatum_input').val(),
- "svnr" : $('#svnr_input').val(),
"buergerschaft" : $('#buergerschaft').val(),
"geschlecht" : $('#geschlecht').val(),
"gebnation" : $('#gebnation').val(),
diff --git a/public/js/plugins/Api.js b/public/js/plugins/Api.js
index 43c2b3064..0b8e2fd17 100644
--- a/public/js/plugins/Api.js
+++ b/public/js/plugins/Api.js
@@ -10,7 +10,232 @@ export default {
if (!app.config.globalProperties.$fhcAlert)
app.use(FhcAlert);
- function _get_config(form, uri, data, config) {
+ const $fhcAlert = app.config.globalProperties.$fhcAlert;
+
+ function _send_array_or_object(errors, func) {
+ if (Array.isArray(errors))
+ errors.forEach(func);
+ else
+ Object.entries(errors).forEach(
+ ([title, errs]) => errs.forEach(
+ error => func(error, title)
+ )
+ );
+ }
+ let DEFAULT_ERROR_CONFIG = {
+ success: true,
+ fail: true,
+ combine: {
+ form: ['validation', 'general'],
+ toast: ['validation', 'general', 'not_found', 'site_failed']
+ },
+ handler: {
+ form(form, errors) {
+ form.clearValidation();
+ errors.forEach(err => form.setFeedback(
+ false,
+ err.messages || err.message
+ ));
+ },
+ async toast(errors) {
+ const $p = app.config.globalProperties.$p;
+ if (!$p)
+ return Promise.reject('Phrasen plugin not loaded!');
+
+ async function _format_toast(errors) {
+ errors = errors.reduce((result, err) => {
+ switch (err.type) {
+ case 'not_found':
+ case 'site_failed':
+ if (err.message)
+ result[err.message] = [err.url];
+ else
+ result._default = [err.url];
+ break;
+ case 'general':
+ if (!result._default)
+ result._default = [];
+ result._default.push(err.message);
+ break;
+ case 'validation':
+ Object.entries(err.messages)
+ .forEach(([field, msg]) => {
+ if (!result[field])
+ result[field] = [];
+ if (Array.isArray(msg))
+ result[field].push(...msg);
+ else
+ result[field].push(msg);
+ });
+ break;
+ }
+ return result;
+ }, {});
+ let counter = 0;
+ const msgs = await Promise.all(Object.entries(errors)
+ .sort((a, b) => ['_default'].indexOf(b[0]) - ['_default'].indexOf(a[0])) // sort _default first
+ .map(async ([field, msgs]) => {
+ if (field == '_default') {
+ await $p.loadCategory('dashboard');
+ const general = $p.t('dashboard/general');
+ field = '' + general + '';
+ } else {
+ field = '' + field + '';
+ }
+ counter += msgs.length;
+ return field
+ + ''
+ + msgs.join('')
+ + '';
+ }));
+ return {
+ counter,
+ msgs
+ }
+ }
+
+ let counter, msgs;
+ if (Array.isArray(errors)) {
+ ({ counter, msgs } = await _format_toast(errors));
+ } else {
+ ({ counter, msgs } = await Object.entries(errors)
+ .reduce(async (res, [title, errs]) => {
+ const result = await res;
+ const { counter, msgs } = await _format_toast(errs);
+ result.counter += counter;
+ result.msgs.push(''
+ + title
+ + ''
+ + msgs.join('')
+ + ' ');
+ return result;
+ }, Promise.resolve({ counter: 0, msgs: []})));
+ }
+
+ await $p.loadCategory('ui');
+ const n_errors = $p.t('ui/n_errors', { n: counter });
+
+ $fhcAlert.alertDefault(
+ 'error',
+ n_errors,
+ '' + msgs.join('') + ' ',
+ true,
+ true
+ );
+ },
+ php(errors) {
+ _send_array_or_object(errors, (error, title) => {
+ var message = '';
+ message += 'Message: ' + error.message + '\n\n';
+ message += 'Filename: ' + error.filename + '\n';
+ message += 'Line Number: ' + error.line + '\n';
+ if (error.backtrace && error.backtrace.length) {
+ message += '\nBacktrace: ';
+ error.backtrace.forEach(err => {
+ message += '\n\tFile: ' + err.file + '\n';
+ message += '\tLine: ' + err.line + '\n';
+ message += '\tFunction: ' + err.function + '\n';
+ });
+ }
+ switch (error.severity) {
+ case 'Warning':
+ case 'Core Warning':
+ case 'Compile Warning':
+ case 'User Warning':
+ if (title)
+ title += ': PHP ' + error.severity;
+ else
+ title = 'PHP ' + error.severity;
+ $fhcAlert.alertDefault('warn', title, message, true);
+ break;
+ case 'Notice':
+ case 'User Notice':
+ case 'Runtime Notice':
+ if (title)
+ title += ': PHP ' + error.severity;
+ else
+ title = 'PHP ' + error.severity;
+ $fhcAlert.alertDefault('info', title, message, true);
+ break;
+ default:
+ message = 'Type: PHP ' + error.severity + '\n\n' + message;
+ if (title)
+ message = title + '\n\n' + message;
+ $fhcAlert.alertSystemError(message);
+ break;
+ }
+ });
+ },
+ exception(errors) {
+ _send_array_or_object(errors, (error, title) => {
+ var message = '';
+ if (title)
+ message += title + '\n\n';
+ message += 'Type: ' + error.class + '\n\n';
+ message += 'Message: ' + error.message + '\n\n';
+ message += 'Filename: ' + error.filename + '\n';
+ message += 'Line Number: ' + error.line + '\n';
+ if (error.backtrace && error.backtrace.length) {
+ message += '\nBacktrace: ';
+ error.backtrace.forEach(err => {
+ message += '\n\tFile: ' + err.file + '\n';
+ message += '\tLine: ' + err.line + '\n';
+ message += '\tFunction: ' + err.function + '\n';
+ });
+ }
+ $fhcAlert.alertSystemError(message);
+ });
+ },
+ db(errors) {
+ _send_array_or_object(errors, (error, title) => {
+ var message = '';
+ if (title)
+ message += title + '\n\n';
+ if (error.heading !== undefined)
+ message += error.heading + '\n\n';
+ if (error.code !== undefined)
+ message += 'Code: ' + error.code + '\n\n';
+ if (error.sql !== undefined)
+ message += 'SQL: ' + error.sql + '\n\n';
+ if (error.message !== undefined)
+ message += 'Message: ' + error.message + '\n\n';
+ else if (error.messages !== undefined)
+ message += 'Messages: ' + error.messages.join('\n\t') + '\n\n';
+ if (error.filename !== undefined)
+ message += 'Filename: ' + error.filename + '\n';
+ if (error.line !== undefined)
+ message += 'Line Number: ' + error.line + '\n';
+
+ $fhcAlert.alertSystemError(message);
+ });
+ },
+ auth(errors) {
+ _send_array_or_object(errors, (error, title) => {
+ if (title)
+ title += ': ' + error.message;
+ else
+ title = error.message;
+
+ var message = '';
+ message += 'Controller name: ' + error.controller + '\n';
+ message += 'Method name: ' + error.method + '\n';
+ message += 'Required permissions: ' + error.required_permissions;
+
+ $fhcAlert.alertDefault(
+ 'error',
+ title,
+ message,
+ true
+ );
+ });
+ }
+ }
+ };
+
+ if (options?.errorHandling !== undefined)
+ DEFAULT_ERROR_CONFIG = _merge_error_config(options.errorHandling);
+
+ function get_config(form, uri, data, config) {
if (typeof form == 'string' && config === undefined) {
[uri, data, config] = [form, uri, data];
form = undefined;
@@ -40,10 +265,9 @@ export default {
return [uri, data, config];
}
-
- function _clean_return_value(response) {
+ function clean_return_value(response) {
if (typeof response.data === 'string' || response.data instanceof String)
- return _clean_return_value({ data: response });
+ return clean_return_value({ data: response });
const result = response.data;
delete response.data;
@@ -55,10 +279,111 @@ export default {
result.meta.response = response;
return result;
}
- const baseURL = FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + "/";
+ function _merge_error_config(config) {
+ if (config === false || config === 'off')
+ return { ...DEFAULT_ERROR_CONFIG, success: false, fail: false };
+
+ if (!config || config === true)
+ return { ...DEFAULT_ERROR_CONFIG };
+
+ if (config === 'success')
+ return { ...DEFAULT_ERROR_CONFIG, fail: false };
+
+ if (config === 'fail')
+ return { ...DEFAULT_ERROR_CONFIG, success: false };
+
+ const { success, fail, handler, combine } = config;
+
+ config = { ...DEFAULT_ERROR_CONFIG };
+
+ Object.entries({ fail, success }).forEach(([key, value]) => {
+ if (value !== undefined)
+ config[key] = value;
+ });
+ Object.entries({ handler, combine }).forEach(([key, value]) => {
+ if (value !== undefined)
+ config[key] = { ...config[key], ...value };
+ });
+
+ return config;
+ }
+ function get_error_handler(config) {
+ const result = _merge_error_config(config?.errorHandling);
+
+ if (!config?.form) {
+ result.combine = { ...result.combine, form: [] };
+ } else {
+ const formHandler = result.handler.form;
+ result.handler = { ...result.handler, form: errors => formHandler(config.form, errors) };
+ }
+
+ return result;
+ }
+ function get_error_list(error) {
+ if (error.response) {
+ if (error.response.status == 404) {
+ return [{
+ type: 'not_found',
+ message: error.message,
+ url: error.request.responseURL
+ }];
+ } else {
+ return error.response.data.errors;
+ }
+ } else if (error.request) {
+ return [{
+ type: 'site_failed',
+ message: error.message,
+ url: error.request.responseURL
+ }];
+ } else {
+ return [{
+ type: 'script',
+ message: error.message
+ }];
+ }
+ }
+ function popHandleableErrors(errorHandling, errors) {
+ const result = {};
+ const copy = [];
+ while (errors.length)
+ copy.push(errors.pop());
+ for (var error of copy) {
+ let type = error.type;
+ let newType = null;
+ for (var t in errorHandling.combine) {
+ let newTypeCombinesType = errorHandling
+ .combine[t]
+ .includes(type);
+ let newTypeHasHandler = errorHandling.handler[t];
+ if (newTypeCombinesType && newTypeHasHandler) {
+ newType = t;
+ if (newType == 'form')
+ break;
+ }
+ }
+ if (newType)
+ type = newType;
+ const handler = errorHandling.handler[type];
+ if (handler) {
+ if (!result[type])
+ result[type] = [];
+ if (Array.isArray(error))
+ result[type].push(...error);
+ else
+ result[type].push(error);
+ continue;
+ }
+ errors.push(error);
+ }
+ return result;
+ }
+
const fhcApiAxios = axios.create({
timeout: 500000,
- baseURL: FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + "/"
+ baseURL: FHC_JS_DATA_STORAGE_OBJECT.app_root
+ + FHC_JS_DATA_STORAGE_OBJECT.ci_router
+ + "/"
});
fhcApiAxios.interceptors.request.use(config => {
@@ -100,57 +425,51 @@ export default {
return config;
});
- fhcApiAxios.interceptors.response.use(response => {
- if (response.config?.errorHandling == 'off'
- || response.config?.errorHandling === false
- || response.config?.errorHandling == 'fail')
- return _clean_return_value(response);
-
- // NOTE(chris): loop through errors
- if (response.data.errors)
- response.data.errors = response.data.errors.filter(
- err => (response.config[err.type + 'ErrorHandler'] || app.config.globalProperties.$api._defaultErrorHandlers[err.type])(err, response.config)
- );
-
- return _clean_return_value(response);
- }, error => {
- if (error.code == 'ERR_CANCELED')
- return Promise.reject({...{handled: true}, ...error});
-
- if (error.config?.errorHandling == 'off'
- || error.config?.errorHandling === false
- || error.config?.errorHandling == 'success')
- return Promise.reject(error);
-
- if (error.response) {
- if (error.response.status == 404) {
- app.config.globalProperties.$fhcAlert.alertDefault('error', error.message, error.request.responseURL, true);
- return Promise.reject({...{handled: true}, ...error});
- }
+ fhcApiAxios.interceptors.response.use(
+ response => {
+ if (response.config?.errorHandling == 'off'
+ || response.config?.errorHandling === false
+ || response.config?.errorHandling == 'fail')
+ return clean_return_value(response);
// NOTE(chris): loop through errors
- error.response.data.errors = error.response.data.errors.filter(
- err => (error.config[err.type + 'ErrorHandler'] || app.config.globalProperties.$api._defaultErrorHandlers[err.type])(err, error.config)
- );
- if (!error.response.data.errors.length)
- return Promise.reject({...{handled: true}, ...error});
- } else if (error.request) {
- app.config.globalProperties.$fhcAlert.alertDefault('error', error.message, error.request.responseURL);
- return Promise.reject({...{handled: true}, ...error});
- } else {
- app.config.globalProperties.$fhcAlert.alertError(error.message);
- return Promise.reject({...{handled: true}, ...error});
- }
+ if (response.data.errors)
+ response.data.errors = response.data.errors.filter(
+ err => (response.config[err.type + 'ErrorHandler'] || app.config.globalProperties.$api._defaultErrorHandlers[err.type])(err, response.config)
+ );
- return Promise.reject(error);
- });
+ return clean_return_value(response);
+ },
+ error => {
+ if (error.code == 'ERR_CANCELED')
+ return Promise.reject({ handled: true, ...error });
+
+ const errorConfig = get_error_handler(error.config);
+
+ if (!errorConfig.fail)
+ return Promise.reject(error);
+
+ const remaining = get_error_list(error);
+
+ const errors = popHandleableErrors(errorConfig, remaining);
+
+ for (var type in errors) {
+ errorConfig.handler[type](errors[type]);
+ }
+
+ if (remaining.length)
+ return Promise.reject(error);
+
+ return Promise.reject({ handled: true, ...error });
+ }
+ );
app.config.globalProperties.$api = {
getUri(url) {
return fhcApiAxios.getUri({url});
},
get(form, uri, params, config) {
- [uri, params, config] = _get_config(form, uri, params, config);
+ [uri, params, config] = get_config(form, uri, params, config);
if (params) {
if (config)
config.params = params;
@@ -160,82 +479,58 @@ export default {
return fhcApiAxios.get(uri, config);
},
post(form, uri, data, config) {
- [uri, data, config] = _get_config(form, uri, data, config);
+ [uri, data, config] = get_config(form, uri, data, config);
return fhcApiAxios.post(uri, data, config);
},
call(factory, configoverwrite, form) {
if (Array.isArray(factory)) {
- const $fhcAlert = app.config.globalProperties.$fhcAlert;
const $api = app.config.globalProperties.$api;
- Promise
+ return Promise
.allSettled(factory.map((config, index) => {
- if (Array.isArray(config))
- return $api.call(config[1], {
- errorHeader: config[0],
- errorHandling: false
- });
- else
- return $api.call(config, {
- errorHeader: '#' + index,
- errorHandling: false
- });
- }))
- .then(res => {
- // TODO(chris): obey form & configoverwrite
- let messagesError = [];
- let messagesSuccessful = [];
-
- res.forEach(result => {
- if (result.status === 'fulfilled') {
- //console.log(JSON.parse(result.value.data));
- const successTitle = "" + result.value.data + "";
- messagesSuccessful.push(successTitle + "ok");
- } else {
- const errorTitle = "" + result.reason.config.errorHeader + "";
- const errorMsg = JSON.parse(result.reason.request.response);
- const fullMessage = errorMsg.errors.map(error => {
- if (error.type == 'validation') {
- // TODO(chris): do we want the keys?
- return '' + Object.values(error.messages).join("") + '';
- }
- // TODO(chris): other types
- if (error.message)
- return '' + error.message + '';
- if (error.messages)
- return '' + error.messages.join("\n") + '';
- // TODO(chris): what to do here
- return '' + "Generic Error" + ''; // TODO(chris): translate
- }).join("\n");
- messagesError.push(errorTitle + fullMessage);
- }
+ if (!Array.isArray(config))
+ config = ['#' + index, config];
+ return $api.call(config[1], {
+ errorHeader: config[0],
+ errorHandling: false
});
+ }))
+ .then(result => {
+ const [ , , config ] = get_config(form, undefined, undefined, configoverwrite || {});
+ const errorConfig = get_error_handler(config);
- if (messagesError.length)
- {
- const test = document.createElement('b');
- $fhcAlert.alertDefault(
- 'error',
- messagesError.length + " Fehler", // TODO(chris): translate
- '' + messagesError.join("") + ' ',
- true,
- true
- );
+ if (!errorConfig.success && !errorConfig.fail) {
+ return result;
}
- if (messagesSuccessful.length)
- {
- const test = document.createElement('b');
- $fhcAlert.alertDefault(
- 'info',
- 'Feedback',
- messagesSuccessful.length + " erfolgreiche Statusänderung(en) durchgeführt", // TODO(chris): translate
- false,
- true
- );
+
+ const typedErrors = {};
+ for (var res of result) {
+ const [ allowed, item ] = res.status === 'fulfilled'
+ ? [ errorConfig.success, res.value ]
+ : [ errorConfig.fail, res.reason ];
+ if (!allowed)
+ return;
+
+ const errors = popHandleableErrors(errorConfig, get_error_list(item));
+
+ for (var type in errors) {
+ if (!typedErrors[type])
+ typedErrors[type] = {
+ [item.config.errorHeader]: errors[type]
+ };
+ else
+ typedErrors[type][item.config.errorHeader] = errors[type];
+ }
+ };
+
+ for (var errType in typedErrors) {
+ errorConfig.handler[errType](typedErrors[errType]);
}
+
+ return result;
});
}
- let {method, url, params, config} = factory;
+ let { method, url, params, config } = factory;
if (configoverwrite !== undefined) {
config = configoverwrite;
}
@@ -251,141 +546,6 @@ export default {
} else {
console.error("FhcApi: method not allowed:", method);
}
- },
- _defaultErrorHandlers: {
- validation(error, config) {
- const $fhcAlert = app.config.globalProperties.$fhcAlert;
-
- if (config?.form) {
- config.form.clearValidation();
- config.form.setFeedback(false, error.messages);
- return false;
- }
- if (Array.isArray(error.messages)) {
- error.messages.forEach($fhcAlert.alertError);
- return false;
- } else if (typeof error.messages == 'object') {
- if (config?.errorHeader)
- Object.values(error.messages).forEach(
- value => $fhcAlert.alertDefault(
- 'error',
- Array.isArray(config.errorHeader) ? app.config.globalProperties.$p.t.apply(null, config.errorHeader) : config.errorHeader,
- value,
- true
- )
- );
- else
- Object.entries(error.messages).forEach(
- ([key, value]) => $fhcAlert.alertDefault('error', key, value, true)
- );
- return false;
- }
- return true;
- },
- general(error, config) {
- const $fhcAlert = app.config.globalProperties.$fhcAlert;
-
- if (config?.form)
- config.form.setFeedback(false, error.message);
- else if (config?.errorHeader)
- $fhcAlert.alertDefault(
- 'error',
- Array.isArray(config.errorHeader) ? app.config.globalProperties.$p.t.apply(null, config.errorHeader) : config.errorHeader,
- error.message,
- true
- );
- else
- $fhcAlert.alertError(error.message);
- },
- php(error) {
- const $fhcAlert = app.config.globalProperties.$fhcAlert;
-
- var message = '';
- message += 'Message: ' + error.message + '\n\n';
- message += 'Filename: ' + error.filename + '\n';
- message += 'Line Number: ' + error.line + '\n';
- if (error.backtrace && error.backtrace.length) {
- message += '\nBacktrace: ';
- error.backtrace.forEach(err => {
- message += '\n\tFile: ' + err.file + '\n';
- message += '\tLine: ' + err.line + '\n';
- message += '\tFunction: ' + err.function + '\n';
- });
- }
- switch (error.severity) {
- case 'Warning':
- case 'Core Warning':
- case 'Compile Warning':
- case 'User Warning':
- $fhcAlert.alertDefault('warn', 'PHP ' + error.severity, message, true);
- break;
- case 'Notice':
- case 'User Notice':
- case 'Runtime Notice':
- $fhcAlert.alertDefault('info', 'PHP ' + error.severity, message, true);
- break;
- default:
- message = 'Type: PHP ' + error.severity + '\n\n' + message;
- $fhcAlert.alertSystemError(message);
- break;
- }
- },
- exception(error) {
- const $fhcAlert = app.config.globalProperties.$fhcAlert;
-
- var message = '';
- message += 'Type: ' + error.class + '\n\n';
- message += 'Message: ' + error.message + '\n\n';
- message += 'Filename: ' + error.filename + '\n';
- message += 'Line Number: ' + error.line + '\n';
- if (error.backtrace && error.backtrace.length) {
- message += '\nBacktrace: ';
- error.backtrace.forEach(err => {
- message += '\n\tFile: ' + err.file + '\n';
- message += '\tLine: ' + err.line + '\n';
- message += '\tFunction: ' + err.function + '\n';
- });
- }
- $fhcAlert.alertSystemError(message);
- },
- db(error) {
- const $fhcAlert = app.config.globalProperties.$fhcAlert;
-
- var message = '';
- if (error.heading !== undefined)
- message += error.heading + '\n\n';
- if (error.code !== undefined)
- message += 'Code: ' + error.code + '\n\n';
- if (error.sql !== undefined)
- message += 'SQL: ' + error.sql + '\n\n';
- if (error.message !== undefined)
- message += 'Message: ' + error.message + '\n\n';
- else if (error.messages !== undefined)
- message += 'Messages: ' + error.messages.join('\n\t') + '\n\n';
- if (error.filename !== undefined)
- message += 'Filename: ' + error.filename + '\n';
- if (error.line !== undefined)
- message += 'Line Number: ' + error.line + '\n';
-
- $fhcAlert.alertSystemError(message);
- },
- auth(error, config) {
- const $fhcAlert = app.config.globalProperties.$fhcAlert;
-
- var message = '';
- message += 'Controller name: ' + error.controller + '\n';
- message += 'Method name: ' + error.method + '\n';
- message += 'Required permissions: ' + error.required_permissions;
- if (config?.errorHeader)
- $fhcAlert.alertDefault(
- 'error',
- Array.isArray(config.errorHeader) ? app.config.globalProperties.$p.t.apply(null, config.errorHeader) : config.errorHeader,
- error.message,
- true
- );
- else
- $fhcAlert.alertDefault('error', error.message, message);
- }
}
};
diff --git a/rdf/ausbildungsvertrag.xml.php b/rdf/ausbildungsvertrag.xml.php
index 293ee7959..56dfd95a4 100644
--- a/rdf/ausbildungsvertrag.xml.php
+++ b/rdf/ausbildungsvertrag.xml.php
@@ -123,8 +123,6 @@ foreach($uid_arr as $uid)
$studiengang_bezeichnung = empty($studiengangbezeichnung) ? $studiengang->bezeichnung : $studiengangbezeichnung;
$studiengang_bezeichnung_englisch = empty($studiengangbezeichnung_englisch) ? $studiengang->english : $studiengangbezeichnung_englisch;
- $svnr = ($student->svnr == '')?'Ersatzkennzeichen: '.$student->ersatzkennzeichen:$student->svnr;
-
//Wenn Lehrgang, dann Erhalter-KZ vor die Studiengangs-Kz hängen
if ($studiengang->studiengang_kz<0)
{
@@ -146,7 +144,6 @@ foreach($uid_arr as $uid)
echo "\t\t".$gebdatum."\n";
echo "\t\t".$student->gebort."\n";
echo "\t\t".$staatsbuergerschaft->langtext."\n";
- echo "\t\t".$svnr."\n";
echo "\t\t".trim($student->matrikelnr)."\n";
echo "\t\t".$db->convert_html_chars($studiengang_bezeichnung)."\n";
echo "\t\t".$db->convert_html_chars($studiengang_bezeichnung_englisch)."\n";
@@ -340,8 +337,6 @@ foreach($prestudent_arr as $prest_id)
$studiengang_bezeichnung = empty($studiengangbezeichnung) ? $studiengang->bezeichnung : $studiengangbezeichnung;
$studiengang_bezeichnung_englisch = empty($studiengangbezeichnung_englisch) ? $studiengang->english : $studiengangbezeichnung_englisch;
- $svnr = ($person->svnr == '')?($person->ersatzkennzeichen != ''?'Ersatzkennzeichen: '.$person->ersatzkennzeichen:''):$person->svnr;
-
//Wenn Lehrgang, dann Erhalter-KZ vor die Studiengangs-Kz hängen
if ($studiengang->studiengang_kz<0)
{
@@ -363,7 +358,6 @@ foreach($prestudent_arr as $prest_id)
echo "\t\t".$gebdatum."\n";
echo "\t\t".$person->gebort."\n";
echo "\t\t".$staatsbuergerschaft->langtext."\n";
- echo "\t\t".$svnr."\n";
echo "\t\t".$db->convert_html_chars($studiengang_bezeichnung)."\n";
echo "\t\t".$db->convert_html_chars($studiengang_bezeichnung_englisch)."\n";
echo "\t\t".$studiengang->kurzbzlang."\n";
diff --git a/rdf/student.rdf.php b/rdf/student.rdf.php
index 61c903bd6..439ded6ec 100644
--- a/rdf/student.rdf.php
+++ b/rdf/student.rdf.php
@@ -235,7 +235,6 @@ function draw_content_liste($row)
vorname.']]>
nachname.']]>
geschlecht.']]>
- '.($row->svnr==''?' ':'svnr.']]>').'
'.($row->ersatzkennzeichen==''?' ':'ersatzkennzeichen.']]>').'
convertISODate($row->gebdatum).']]>
gebdatum.']]>
@@ -349,7 +348,6 @@ function draw_content($row)
gebzeit.']]>
'.($row->anmerkungen==''?' ':'anmerkungen.']]>').'
anrede.']]>
- svnr.']]>
ersatzkennzeichen.']]>
familienstand.']]>
geschlecht.']]>
@@ -470,7 +468,6 @@ function draw_empty_content()
-
@@ -647,7 +644,7 @@ if($xmlformat=='rdf')
$sql_query="
SELECT
p.person_id, tbl_student.prestudent_id, tbl_benutzer.uid, titelpre, titelpost,vorname, wahlname, vornamen, geschlecht,
- nachname, gebdatum, tbl_prestudent.anmerkung,ersatzkennzeichen,svnr, tbl_student.matrikelnr, p.anmerkung as anmerkungen,
+ nachname, gebdatum, tbl_prestudent.anmerkung,ersatzkennzeichen, tbl_student.matrikelnr, p.anmerkung as anmerkungen,
tbl_studentlehrverband.semester, tbl_studentlehrverband.verband, tbl_studentlehrverband.gruppe,
tbl_student.studiengang_kz, aufmerksamdurch_kurzbz, mentor, public.tbl_benutzer.aktiv AS bnaktiv,
( SELECT kontakt
@@ -985,8 +982,7 @@ if($xmlformat=='rdf')
$qry .= " prestudent_id = ".$db->db_add_param($searchItems_string_orig).";";
else
$qry .= " matrikelnr = ".$db->db_add_param($searchItems_string_orig)." OR
- matr_nr = ".$db->db_add_param($searchItems_string_orig)." OR
- svnr = ".$db->db_add_param($searchItems_string_orig).";";
+ matr_nr = ".$db->db_add_param($searchItems_string_orig).";";
}
if($result = $db->db_query($qry))
{
@@ -1282,7 +1278,6 @@ else
anrede.']]>
geschlecht.']]>
- svnr.']]>
ersatzkennzeichen.']]>
familienstand.']]>
diff --git a/rdf/studienblatt.xml.php b/rdf/studienblatt.xml.php
index 3ee805c04..a9b78d968 100644
--- a/rdf/studienblatt.xml.php
+++ b/rdf/studienblatt.xml.php
@@ -105,9 +105,6 @@ foreach($uid_arr as $uid)
$staatsbuergerschaft = new nation();
$staatsbuergerschaft->load($student->staatsbuergerschaft);
-
- $svnr = ($student->svnr == '')?'Ersatzkennzeichen: '.$student->ersatzkennzeichen:$student->svnr;
-
$geschlecht_obj = new geschlecht();
$geschlecht_obj->load($student->geschlecht);
@@ -143,7 +140,6 @@ foreach($uid_arr as $uid)
echo "\t\t\n";
echo "\t\tgebort."]]>\n";
echo "\t\tlangtext."]]>\n";
- echo "\t\t\n";
echo "\t\tmatr_nr)."]]>\n";
echo "\t\tmatrikelnr)."]]>\n";
echo "\t\tstudiengangbezeichnung."]]>\n";
diff --git a/system/dbupdate_3.4/39911_tabulator_in_contentmittitel.php b/system/dbupdate_3.4/39911_tabulator_in_contentmittitel.php
index b743648ed..73ad7e319 100644
--- a/system/dbupdate_3.4/39911_tabulator_in_contentmittitel.php
+++ b/system/dbupdate_3.4/39911_tabulator_in_contentmittitel.php
@@ -1,5 +1,6 @@
@@ -8,27 +9,56 @@ xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
-
-
+
+
+
+
+
+
+
+
+
diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php
index 642ec80e9..9658489e1 100644
--- a/system/phrasesupdate.php
+++ b/system/phrasesupdate.php
@@ -1475,6 +1475,26 @@ $phrases = array(
)
)
),
+ array(
+ 'app' => 'core',
+ 'category' => 'ui',
+ 'phrase' => 'n_errors',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => '{n} Fehler',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => '{n} Error(s)',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
array(
'app' => 'core',
'category' => 'ui',
@@ -30282,7 +30302,6 @@ array(
)
),
-
//ProfilUpdate Phrasen ende
array(
'app' => 'core',
@@ -30627,6 +30646,46 @@ array(
)
)
),
+ array(
+ 'app' => 'anwesenheiten',
+ 'category' => 'global',
+ 'phrase' => 'entschuldigtLegendeBlau',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Student ist am gewählten Datum bestätigt entschuldigt.',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Student is confirmed excused on the selected date.',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'anwesenheiten',
+ 'category' => 'global',
+ 'phrase' => 'entschuldigtLegendeTuerkis',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Student hat eine offene Entschuldigung am gewählten Datum.',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Student has an open excuse on the selected date.',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
array(
'app' => 'anwesenheiten',
'category' => 'global',
@@ -30887,6 +30946,26 @@ array(
)
)
),
+ array(
+ 'app' => 'anwesenheiten',
+ 'category' => 'global',
+ 'phrase' => 'kontrolleOhneQR',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Anwesenheiten ohne QR-Code einfügen',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Insert attendances without QR-Code',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
array(
'app' => 'anwesenheiten',
'category' => 'global',
@@ -30947,6 +31026,46 @@ array(
)
)
),
+ array(
+ 'app' => 'anwesenheiten',
+ 'category' => 'global',
+ 'phrase' => 'kontrolle',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Anwesenheitskontrolle',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'attendance check',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'anwesenheiten',
+ 'category' => 'global',
+ 'phrase' => 'offen',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Offen',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Open',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
array(
'app' => 'anwesenheiten',
'category' => 'global',
@@ -31010,18 +31129,58 @@ array(
array(
'app' => 'anwesenheiten',
'category' => 'global',
- 'phrase' => 'entschuldigungAutoEmailBetreff',
+ 'phrase' => 'entFullEmailBetreff',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
- 'text' => 'Entschuldigung zur Befreiung der Anwesenheitspflicht: Neues Dokument wurde hochgeladen.',
+ 'text' => 'Neue Entschuldigung zur Befreiung der Anwesenheitspflicht: Neues Dokument wurde hochgeladen.',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
- 'text' => 'Excuse note for digital attendances - a new document has been uploaded.',
+ 'text' => 'New Excuse note for digital attendances - a new document has been uploaded.',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'anwesenheiten',
+ 'category' => 'global',
+ 'phrase' => 'entNewEmailBetreff',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Neue Entschuldigung zur Befreiung der Anwesenheitspflicht: Dokument wird nachgereicht.',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'New Excuse note for digital attendances - Document will be submitted later',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'anwesenheiten',
+ 'category' => 'global',
+ 'phrase' => 'entEditEmailBetreff',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Entschuldigung zur Befreiung der Anwesenheitspflicht: Dokument wurde eingereicht.',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Excuse note for digital attendances - Document has been submitted',
'description' => '',
'insertvon' => 'system'
)
@@ -32310,18 +32469,78 @@ array(
array(
'app' => 'anwesenheiten',
'category' => 'global',
- 'phrase' => 'studentConfig',
+ 'phrase' => 'errorCodeTooOld',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
- 'text' => 'Studenten auswählen.',
+ 'text' => 'Der Zugangscode ist zeitlich abgelaufen.',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
- 'text' => 'Configure student profile.',
+ 'text' => 'The access code has expired.',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'anwesenheiten',
+ 'category' => 'global',
+ 'phrase' => 'profil',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Profil',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'profile',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'anwesenheiten',
+ 'category' => 'global',
+ 'phrase' => 'admin',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Entschuldigungsmanagement',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'excuse note management',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'anwesenheiten',
+ 'category' => 'global',
+ 'phrase' => 'allowed',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Aktuell prüfbar',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'allowed to test',
'description' => '',
'insertvon' => 'system'
)
@@ -32367,6 +32586,26 @@ array(
)
)
),
+ array(
+ 'app' => 'anwesenheiten',
+ 'category' => 'global',
+ 'phrase' => 'termineV2',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Unterricht laut LV-Plan',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Lesson as per Timetable',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
array(
'app' => 'anwesenheiten',
'category' => 'global',
@@ -32375,7 +32614,7 @@ array(
'phrases' => array(
array(
'sprache' => 'German',
- 'text' => 'Termine laut Stundenplan',
+ 'text' => 'Unterricht laut LV-Plan',
'description' => '',
'insertvon' => 'system'
),
@@ -32470,18 +32709,18 @@ array(
array(
'app' => 'anwesenheiten',
'category' => 'global',
- 'phrase' => 'noStudentsFound',
+ 'phrase' => 'noStudentsFoundV2',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
- 'text' => 'Keine zugeteilten Studenten gefunden!',
+ 'text' => 'Keine zugeteilten Studenten für Mitarbeiter {0} in dem gewählten LV-Teil {1} gefunden!',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
- 'text' => 'No assigned students found!',
+ 'text' => 'No assigned students for employee {0} in the selected teaching unit {1} found!',
'description' => '',
'insertvon' => 'system'
)
@@ -32490,7 +32729,7 @@ array(
array(
'app' => 'anwesenheiten',
'category' => 'global',
- 'phrase' => 'kontrolldatum',
+ 'phrase' => 'kontrolldatumV2',
'insertvon' => 'system',
'phrases' => array(
array(
@@ -32501,7 +32740,27 @@ array(
),
array(
'sprache' => 'English',
- 'text' => 'Attendance Check Date',
+ 'text' => 'Check Date',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'anwesenheiten',
+ 'category' => 'global',
+ 'phrase' => 'kontrollen',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Kontrollen',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Attendance Checks',
'description' => '',
'insertvon' => 'system'
)
@@ -32810,12 +33069,12 @@ array(
array(
'app' => 'anwesenheiten',
'category' => 'global',
- 'phrase' => 'zeitNichtAusStundenplanBeginn',
+ 'phrase' => 'zeitNichtAusStundenplanBeginnV2',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
- 'text' => 'Unterrichtbeginn entspricht keinem Unterrichtstermin laut Stundenplan.',
+ 'text' => 'Unterrichtbeginn entspricht keinem Unterrichtstermin laut LV-Plan.',
'description' => '',
'insertvon' => 'system'
),
@@ -32830,12 +33089,12 @@ array(
array(
'app' => 'anwesenheiten',
'category' => 'global',
- 'phrase' => 'zeitNichtAusStundenplanEnde',
+ 'phrase' => 'zeitNichtAusStundenplanEndeV2',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
- 'text' => 'Unterrichtende entspricht keinem Unterrichtstermin laut Stundenplan.',
+ 'text' => 'Unterrichtende entspricht keinem Unterrichtstermin laut LV-Plan.',
'description' => '',
'insertvon' => 'system'
),
@@ -32850,12 +33109,12 @@ array(
array(
'app' => 'anwesenheiten',
'category' => 'global',
- 'phrase' => 'datumNichtAusStundenplan',
+ 'phrase' => 'datumNichtAusStundenplanV2',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
- 'text' => 'Datum entspricht keinem Stundenplan Termin.',
+ 'text' => 'Datum entspricht keinem LV-Plan Termin.',
'description' => '',
'insertvon' => 'system'
),
@@ -32867,6 +33126,66 @@ array(
)
)
),
+ array(
+ 'app' => 'anwesenheiten',
+ 'category' => 'global',
+ 'phrase' => 'kontrolleTimeOverlap',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Kontrollzeiten überlappen mit Kontrolle von {0} bis {1}.',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Times overlap with attendance check from {0} to {1}.',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'anwesenheiten',
+ 'category' => 'global',
+ 'phrase' => 'keineKontrollenAnDatumFallback',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Keine Kontrollen an {0} gefunden, es werden alle Kontrollen angezeigt.',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'No attendance checks found on {0}, all attendance checks are being shown.',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'anwesenheiten',
+ 'category' => 'global',
+ 'phrase' => 'noLePreselectTermineTooOld',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Keine intelligente LV-Teil Vorauswahl möglich, da sämtliche Termine außerhalb des erlaubten Kontrollzeitraums liegen. Bitte wählen Sie sorgfältig den gewünschten LV-Teil aus.',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'No intelligent pre-selection of teaching unit is possible, as all dates fall outside the permitted control period. Please carefully select the desired teaching unit.',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
array(
'app' => 'anwesenheiten',
'category' => 'global',
@@ -32922,22 +33241,18 @@ array(
array(
'app' => 'anwesenheiten',
'category' => 'global',
- 'phrase' => 'tooltipAssistenz',
+ 'phrase' => 'tooltipAssistenzV2',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
- 'text' => 'Im Entschuldigungsmanagement können Sie als Studiengangsassistenz beziehungsweise als Administrator die von Studenten hochgeladenen Entschuldigungsdokumente überprüfen und den Status entsprechend vergeben.
-
- Bitte beachten Sie dass nur Entschuldigungen INNERHALB des angegebenen Zeitraumes angezeigt werden. Sollten Sie nach einer lang wirken Entschuldigung suchen, müssen Sie die Zeitspanne entsprechend weit setzen.',
+ 'text' => 'Im Entschuldigungsmanagement können Sie als Studiengangsassistenz beziehungsweise als Administrator die von Studenten hochgeladenen Entschuldigungsdokumente überprüfen und den Status entsprechend vergeben.',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
- 'text' => 'In the excuse management, you as a course assistant or administrator can check the excuse documents uploaded by students and assign the status accordingly.
-
- Please note that only excuses WITHIN the specified time period are displayed. If you are looking for a long-lasting excuse, you must set the time period accordingly.',
+ 'text' => 'In the excuse management, you as a course assistant or administrator can check the excuse documents uploaded by students and assign the status accordingly.',
'description' => '',
'insertvon' => 'system'
)
@@ -32970,16 +33285,16 @@ array(
array(
'app' => 'anwesenheiten',
'category' => 'global',
- 'phrase' => 'tooltipLektorStartKontrolle',
+ 'phrase' => 'tooltipLektorStartKontrolleV4',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
- 'text' => 'Um eine Anwesenheitskontrolle für Ihre ausgewählte Unterrichtsgruppe durchzuführen, wählen Sie bitte einen Termin aus dem Stundenplan aus oder geben händisch die gewünschte Gültigkeitkeitsdauer der Kontrolle an.
+ 'text' => 'Um eine Anwesenheitskontrolle für Ihre ausgewählte Unterrichtsgruppe durchzuführen, wählen Sie bitte einen Termin aus dem LV-Plan aus oder geben händisch die gewünschte Gültigkeitkeitsdauer der Kontrolle an.
- Die Gültigkeitsdauer bestimmt die Gewichtung der Anwesenheit in Relation zum Gesamtausmaß, sie können diese aber nach eigenem Ermessen anpassen und müssen sich nicht streng an die Termine im Stundenplan halten.
+ Die Gültigkeitsdauer bestimmt die Gewichtung der Anwesenheit in Relation zum Gesamtausmaß, sie können diese aber nach eigenem Ermessen anpassen und müssen sich nicht streng an die Termine im LV-Plan halten.
- Sie können pro Datum und Unterrichtsgruppe eine Anwesenheitskontrolle pro Tag eröffnen, welche jedoch beliebig oft aufgerufen und von Studenten eingecheckt werden kann. Es gelten dabei ihre zuletzt eingetragenen Zeiten. Ein Student muss nur einmal am Tag pro Gruppe einchecken um als anwesend registriert zu sein, egal wie oft Sie die Kontrolle starten.',
+ Sie können pro Datum und Unterrichtsgruppe mehrere Anwesenheitskontrollen am Tag durchführen, solange sich diese nicht in Ihren Zeiten überschneiden und eine Mindestlänge von {0} Minuten beträgt.',
'description' => '',
'insertvon' => 'system'
),
@@ -32989,7 +33304,7 @@ array(
The validity period determines the weighting of attendance in relation to the overall extent, but you can adjust this at your own discretion and do not have to stick strictly to the dates in the timetable.
- You can open one attendance check per day for each date and class group, which can be called up and checked in by students as often as you like. The times they last entered apply. A student only has to check in once a day per group to be registered as present, regardless of how often you start the check.',
+ You can conduct multiple attendance checks per day per date and lesson group, as long as they do not overlap in your times and are at least {0} minutes long.',
'description' => '',
'insertvon' => 'system'
)
@@ -33066,18 +33381,38 @@ array(
array(
'app' => 'anwesenheiten',
'category' => 'global',
- 'phrase' => 'anwTimeline',
+ 'phrase' => 'anwTimelineV2',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
- 'text' => 'Digitale Anwesenheiten Timeline',
+ 'text' => 'Digitale Anwesenheiten Timeline EXPERIMENTELL',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
- 'text' => 'Digital Attendances Timeline',
+ 'text' => 'Digital Attendances Timeline EXPERIMENTAL',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'anwesenheiten',
+ 'category' => 'global',
+ 'phrase' => 'studentenInLVTeil',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Studenten in LV-Teil',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Students in teaching unit',
'description' => '',
'insertvon' => 'system'
)
@@ -33103,6 +33438,26 @@ array(
)
)
),
+ array(
+ 'app' => 'anwesenheiten',
+ 'category' => 'global',
+ 'phrase' => 'file',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Dokument',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Document',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
array(
'app' => 'anwesenheiten',
'category' => 'global',
@@ -33206,12 +33561,12 @@ array(
array(
'app' => 'anwesenheiten',
'category' => 'global',
- 'phrase' => 'termineAusStundenplan',
+ 'phrase' => 'termineAusStundenplanV2',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
- 'text' => 'Unterricht Termine laut Stundenplan',
+ 'text' => 'Unterricht Termine laut LV-Plan',
'description' => '',
'insertvon' => 'system'
),
@@ -33226,12 +33581,12 @@ array(
array(
'app' => 'anwesenheiten',
'category' => 'global',
- 'phrase' => 'tooltipUnterrichtZeitCustom',
+ 'phrase' => 'tooltipUnterrichtZeitCustomV2',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
- 'text' => 'Unterrichtszeiten werden aus dem Stundenplan geladen, überschreiben Sie diese nur falls Ihre tatsächliche Unterrichtszeiten davon abweichen!',
+ 'text' => 'Unterrichtszeiten werden aus dem LV-Plan geladen, überschreiben Sie diese nur falls Ihre tatsächliche Unterrichtszeiten davon abweichen!',
'description' => '',
'insertvon' => 'system'
),
@@ -33246,12 +33601,12 @@ array(
array(
'app' => 'anwesenheiten',
'category' => 'global',
- 'phrase' => 'tooltipUnterrichtDatumCustom',
+ 'phrase' => 'tooltipUnterrichtDatumCustomV2',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
- 'text' => 'Unterrichtsdaten werden aus dem Stundenplan geladen, überschreiben Sie dieses nur falls Ihr tatsächliches Unterrichtsdatum abweicht!',
+ 'text' => 'Unterrichtsdaten werden aus dem LV-Plan geladen, überschreiben Sie dieses nur falls Ihr tatsächliches Unterrichtsdatum abweicht!',
'description' => '',
'insertvon' => 'system'
),
@@ -33363,6 +33718,338 @@ array(
)
)
),
+ array(
+ 'app' => 'anwesenheiten',
+ 'category' => 'global',
+ 'phrase' => 'kontrolleDatumOutOfRange',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Datum liegt außerhalb der erlaubten Kontrollspanne!',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Date is outside the permitted control range!',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'anwesenheiten',
+ 'category' => 'global',
+ 'phrase' => 'alertBetreuungSelected',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Der ausgewählte LV-Teil hat die Lehrform Betreuung! Bitte überprüfen sie die korrekte Auswahl des LV-Teils um fehlerhafte Kontrollen zu vermeiden!',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'The selected course component is taught in a supervised format! Please check that you have selected the correct course component to avoid incorrect assessments!',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'anwesenheiten',
+ 'category' => 'global',
+ 'phrase' => 'editEntschuldigung',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Entschuldigung bearbeiten',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Edit Excuse note',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'anwesenheiten',
+ 'category' => 'global',
+ 'phrase' => 'anwUserEntry',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Anwesenheitseintrag',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Attendance Entry',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'anwesenheiten',
+ 'category' => 'global',
+ 'phrase' => 'highlightsettings',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Datumsmarkierung',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Date Highlighting',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'anwesenheiten',
+ 'category' => 'global',
+ 'phrase' => 'editAnwKontrolle',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Anwesenheitskontrolle bearbeiten',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Edit Attendance Checks',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'anwesenheiten',
+ 'category' => 'global',
+ 'phrase' => 'tooltipAnwTimeline',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Die "Digitale Anwesenheiten Timeline" ist ein experimentelles feature, welches eine zeitliche Visualisierung von Entschuldigungszeiträumen und Kontrollzeiträumen im Kontext eines Studenten anzeigt.
+
+ Wenn Sie auf eine aufgelistete Entschuldigung oder Kontrolle klicken, versucht die Timeline diese zu finden, falls diese im angegebenen Zeitraum liegt, welcher standardmäßig das gesamte aktuelle Jahr beträgt. Sie können diese Grenzen manuell anpassen.
+
+ Wenn man innerhalb der Timeline scrollt, ändert sich der visuelle Abstand zwischen einzelnen Tagen.
+
+ Bei Klick auf eine gerenderte Datumsreichweite in der Timeline, listet sich oben rechts eine Liste von zugehörigen Attributen auf, welche Administratoren und Entwicklern in Fehlerfällen helfen sollen den Zustand der digitalen Amwesenheiten im Kontext eines Studierenden nachzuvollziehen',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'The "Digital Attendance Timeline" is an experimental feature that displays a temporal visualization of excuse periods and check-in periods in the context of a student.
+
+ When you click on a listed excuse or check-in period, the timeline attempts to find it if it falls within the specified period, which by default is the entire current year. You can adjust these boundaries manually.
+
+ Scrolling within the timeline changes the visual spacing between individual days.
+
+ Clicking on a rendered date range in the timeline displays a list of associated attributes in the upper right corner. These attributes are intended to help administrators and developers understand the status of digital attendance in the context of a student in case of errors.',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'anwesenheiten',
+ 'category' => 'global',
+ 'phrase' => 'kontrolleRestart',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Kontrolle wiederholen',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Restart attendance check',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'anwesenheiten',
+ 'category' => 'global',
+ 'phrase' => 'tooltipLegende',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Status Legende für das Digitales Anwesenheiten und Entschuldigungsmanagement anzeigen',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Show status legend for the digital attendance and excuse note management',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'anwesenheiten',
+ 'category' => 'global',
+ 'phrase' => 'tooltipCsv',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Tabelle als CSV Datei exportiern',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Export table as CSV file',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'anwesenheiten',
+ 'category' => 'global',
+ 'phrase' => 'tooltipEdit',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Anwesenheitskontrollen bearbeiten',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Edit attendance checks',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'anwesenheiten',
+ 'category' => 'global',
+ 'phrase' => 'tooltipSaveChanges',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Manuell veränderte Anwesenheiten speichern',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Save manually edited attendance entries',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'anwesenheiten',
+ 'category' => 'global',
+ 'phrase' => 'tooltipRestartKontrolle',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Bestehende Anwesenheitskontrolle neu starten. Studierende, welche bereits gültig registriert sind, gelten weiterhin als anwesend!',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Restart existing attendance check. Students who are already validly registered will continue to be considered present!',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'anwesenheiten',
+ 'category' => 'global',
+ 'phrase' => 'tooltipDeleteKontrolle',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Anwesenheitskontrolle löschen. Die dazugehörigen Statuseinträge der Studierenden werden auch gelöscht!',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Delete attendance checks. The corresponding student status entries will also be deleted!',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'anwesenheiten',
+ 'category' => 'global',
+ 'phrase' => 'tooltipEditKontrollzeiten',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Zeitgrenzen einer Kontrolle bearbeiten',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Edit time limits of an attendance check',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'anwesenheiten',
+ 'category' => 'global',
+ 'phrase' => 'anwesenheit',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Anwesenheit',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Attendance',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
//
// DIGITALE ANWESENHEITEN PHRASEN END
//
diff --git a/system/xsl/Anwesenheitsliste.xsl b/system/xsl/Anwesenheitsliste.xsl
index 55e72900c..fc9dede58 100644
--- a/system/xsl/Anwesenheitsliste.xsl
+++ b/system/xsl/Anwesenheitsliste.xsl
@@ -309,7 +309,8 @@ xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0"
(nz) ... nicht zugelassen
(ma) ... MitarbeiterIn
(a.o.) ... Außerordentliche/r HörerIn
- (d.d.) ... Double Degree Program
+ (d.d.i) ... Double Degree Incoming Program
+ (d.d.o) ... Double Degree Outgoing Program
diff --git a/vilesci/personen/import/interessentenimport.php b/vilesci/personen/import/interessentenimport.php
index d1830eaeb..8734a1353 100644
--- a/vilesci/personen/import/interessentenimport.php
+++ b/vilesci/personen/import/interessentenimport.php
@@ -1167,8 +1167,7 @@ if ($where != '')
}
}
$status = mb_substr($status, 0, mb_strlen($status)-2);
-
- echo ' | '."$row->nachname | $row->vorname | $row->wahlname | $row->vornamen | $row->gebdatum | $row->svnr | ".($row->geschlecht=='m'?'männlich':'weiblich')." | ";
+ echo ' | | '."$row->nachname | $row->vorname | $row->wahlname | $row->vornamen | $row->gebdatum | ".((strpos($status, 'Mitarbeiter') !== false) ? $row->svnr : '')." | ".($row->geschlecht=='m'?'männlich':'weiblich')." | ";
$qry_adr = "SELECT * FROM public.tbl_adresse WHERE person_id=".$db->db_add_param($row->person_id, FHC_INTEGER);
if ($result_adr = $db->db_query($qry_adr))
while ($row_adr = $db->db_fetch_object($result_adr))
diff --git a/vilesci/personen/personen_details.php b/vilesci/personen/personen_details.php
index d1dcd8815..b274558bd 100644
--- a/vilesci/personen/personen_details.php
+++ b/vilesci/personen/personen_details.php
@@ -125,6 +125,7 @@ $verband = (isset($_POST['verband'])?$_POST['verband']:'');
$gruppe = (isset($_POST['gruppe'])?$_POST['gruppe']:'');
$dms_id_lichtbild = '';
+$is_mitarbeiter = false;
if($uid!='')
{
$qry = "SELECT person_id, true as mitarbeiter FROM campus.vw_mitarbeiter WHERE uid=".$db->db_add_param($uid)."
@@ -144,7 +145,17 @@ if($uid!='')
else
die('Fehler beim Ermitteln der UID');
}
-
+else if ($person_id !='')
+{
+ $qry = "SELECT person_id, true as mitarbeiter FROM campus.vw_mitarbeiter WHERE person_id=".$db->db_add_param($person_id);
+ if($result = $db->db_query($qry))
+ {
+ if($row = $db->db_fetch_object($result))
+ {
+ $is_mitarbeiter = ($row->mitarbeiter=='t'?true:false);
+ }
+ }
+}
if(isset($_POST['saveperson']))
{
if(!$rechte->isBerechtigt('student/stammdaten', null, 'su') && !$rechte->isBerechtigt('mitarbeiter/stammdaten', null, 'su'))
@@ -163,7 +174,8 @@ if(isset($_POST['saveperson']))
$person->gebdatum = $geburtsdatum;
$person->gebort = $geburtsort;
$person->geburtsnation = $geburtsnation;
- $person->svnr = $svnr;
+ if ($is_mitarbeiter)
+ $person->svnr = $svnr;
$person->ersatzkennzeichen = $ersatzkennzeichen;
$person->gebzeit = $geburtszeit;
$person->staatsbuergerschaft = $staatsbuergerschaft;
@@ -332,7 +344,8 @@ if(!$error_person_save)
$geburtsdatum = $person->gebdatum;
$geburtsort = $person->gebort;
$geburtsnation = $person->geburtsnation;
- $svnr = $person->svnr;
+ if ($is_mitarbeiter)
+ $svnr = $person->svnr;
$ersatzkennzeichen = $person->ersatzkennzeichen;
$geburtszeit = $person->gebzeit;
$staatsbuergerschaft = $person->staatsbuergerschaft;
@@ -398,10 +411,16 @@ foreach ($nation->nation as $row_nation)
echo "
|
-
- | SVNR |
- |
- Ersatzkennzeichen |
+ ";
+
+if ($is_mitarbeiter)
+{
+ echo "| SVNR |
+ | ";
+}
+
+echo
+ "Ersatzkennzeichen |
|
Geburtszeit |
|
diff --git a/vilesci/personen/preinteressent_anlegen.php b/vilesci/personen/preinteressent_anlegen.php
index 3ba5865d2..cc9ecbf53 100644
--- a/vilesci/personen/preinteressent_anlegen.php
+++ b/vilesci/personen/preinteressent_anlegen.php
@@ -140,7 +140,6 @@ function disablefields(obj)
document.getElementById('vorname').disabled=val;
document.getElementById('geschlecht').disabled=val;
document.getElementById('geburtsdatum').disabled=val;
- document.getElementById('svnr').disabled=val;
document.getElementById('ersatzkennzeichen').disabled=val;
//document.getElementById('adresse').disabled=val;
//document.getElementById('plz').disabled=val;
@@ -159,21 +158,6 @@ function disablefields(obj)
}
}
-function GeburtsdatumEintragen()
-{
- svnr = document.getElementById('svnr').value;
- gebdat = document.getElementById('geburtsdatum');
-
- if(svnr.length==10 && gebdat.value=='')
- {
- var tag = svnr.substr(4,2);
- var monat = svnr.substr(6,2);
- var jahr = svnr.substr(8,2);
-
- gebdat.value='19'+jahr+'-'+monat+'-'+tag;
- }
-}
-
function disablefields2(val)
{
document.getElementById('adresse').disabled=val;
@@ -368,7 +352,6 @@ $email = (isset($_REQUEST['email'])?$_REQUEST['email']:'');
$telefon = (isset($_REQUEST['telefon'])?$_REQUEST['telefon']:'');
$mobil = (isset($_REQUEST['mobil'])?$_REQUEST['mobil']:'');
$person_id = (isset($_REQUEST['person_id'])?$_REQUEST['person_id']:'');
-$svnr = (isset($_REQUEST['svnr'])?$_REQUEST['svnr']:'');
$ersatzkennzeichen = (isset($_REQUEST['ersatzkennzeichen'])?$_REQUEST['ersatzkennzeichen']:'');
$ueberschreiben = (isset($_REQUEST['ueberschreiben'])?$_REQUEST['ueberschreiben']:'');
@@ -413,7 +396,6 @@ if(isset($_POST['save']))
$person->geschlecht = $geschlecht;
$person->gebdatum = $datum_obj->formatDatum($geburtsdatum,'Y-m-d');
$person->staatsbuergerschaft = $nation;
- $person->svnr = $svnr;
$person->ersatzkennzeichen = $ersatzkennzeichen;
$person->aktiv = true;
$person->insertamum = date('Y-m-d H:i:s');
@@ -689,39 +671,38 @@ if($result = $db->db_query($qry))
}
echo '';
echo ' ';
-echo '| SVNR | | ';
echo '| Ersatzkennzeichen | | ';
echo '| Geburtsdatum | (Format dd.mm.JJJJ) | ';
echo '| Geburtsort | | ';
-echo '| Geburtsnation | ';
+echo ' | | Geburtsnation | ';
echo ' | ';
-echo '| Sprache | | |