import error msg phrase; config for noten which dount count towards prüfungsantritt & load & use that;

This commit is contained in:
Johann Hoffmann
2026-03-03 16:47:17 +01:00
parent 05b2c3c42b
commit ce5da22180
4 changed files with 86 additions and 25 deletions
+6
View File
@@ -0,0 +1,6 @@
<?php
if (!defined('BASEPATH')) exit('No direct script access allowed');
// 'entschuldigt' & 'noch nicht eingetragen' -> wirken sich nicht auf Antritte aus
$config['NOTEN_OHNE_ANTRITT'] = [9, 17]; // tbl_note pk
@@ -78,11 +78,14 @@ class Noten extends FHCAPI_Controller
$this->load->model('codex/Mobilitaet_model', 'MobilitaetModel');
$this->load->model('organisation/Erhalter_model', 'ErhalterModel');
$this->load->config('noten');
$this->load->helper('hlp_sancho_helper');
}
public function getCisConfig() {
$NOTEN_OHNE_ANTRITT = $this->config->item('NOTEN_OHNE_ANTRITT');
$this->terminateWithSuccess(
array(
// Punkte bei der Noteneingabe anzeigen
@@ -92,33 +95,33 @@ class Noten extends FHCAPI_Controller
'CIS_GESAMTNOTE_UEBERSCHREIBEN' => CIS_GESAMTNOTE_UEBERSCHREIBEN,
// only relevant in punkte calculation in backend
// 'CIS_GESAMTNOTE_GEWICHTUNG' => CIS_GESAMTNOTE_GEWICHTUNG,
// 'CIS_GESAMTNOTE_GEWICHTUNG' => CIS_GESAMTNOTE_GEWICHTUNG,
// this one should always be set true since fh prüfungsordnung requires at least 3 antritte (t1+t2+kP)
// send it anyway to use in maxAntritte calculation
'CIS_GESAMTNOTE_PRUEFUNG_TERMIN2' => CIS_GESAMTNOTE_PRUEFUNG_TERMIN2,
// TODO
// should in 99% of cases be kept true to enable 4 antritte in total, but if a certain
// fh still works with 3 antritte per note this can limit the max number of pruefungen accordingly
// fh still works with 3 antritte per note this can limit the max number of antritte accordingly
'CIS_GESAMTNOTE_PRUEFUNG_TERMIN3' => CIS_GESAMTNOTE_PRUEFUNG_TERMIN3,
// used to toggle availability of kommPruef type pruefungen
'CIS_GESAMTNOTE_PRUEFUNG_KOMMPRUEF' => CIS_GESAMTNOTE_PRUEFUNG_KOMMPRUEF,
//technically exists but is never used, could be LE pendant to next flag
// 'CIS_GESAMTNOTE_PRUEFUNG_MOODLE_NOTE' => CIS_GESAMTNOTE_PRUEFUNG_MOODLE_NOTE,
// 'CIS_GESAMTNOTE_PRUEFUNG_MOODLE_NOTE' => CIS_GESAMTNOTE_PRUEFUNG_MOODLE_NOTE,
// basically a toggle for "use teilnoten" and the source is always moodle
// setting this to false breaks legacy tool and if that was fixed it wouldnt render any table at all
// anyway so not sure why this even is a config at all. placebo at best
// TODO: do we really need this?
// toggles availability of the teilnoten column... existas but do we really need this?
'CIS_GESAMTNOTE_PRUEFUNG_MOODLE_LE_NOTE' => CIS_GESAMTNOTE_PRUEFUNG_MOODLE_LE_NOTE,
// send a mail when approving grades
'CIS_GESAMTNOTE_FREIGABEMAIL_NOTE' => CIS_GESAMTNOTE_FREIGABEMAIL_NOTE
'CIS_GESAMTNOTE_FREIGABEMAIL_NOTE' => CIS_GESAMTNOTE_FREIGABEMAIL_NOTE,
'NOTEN_OHNE_ANTRITT' => $NOTEN_OHNE_ANTRITT
)
);
}
@@ -377,8 +377,7 @@ export const Benotungstool = {
student = this.studenten.find(s => s.uid?.trim() === idTrimmed)
}
if(!student) {
// TODO: phrase
this.$fhcAlert.alertWarning('Kein Student gefunden für ID ' + rowParts[0] + ' in Zeile Nr. ' + rowNum + ' Die Zeile wurde übersprungen.')
this.$fhcAlert.alertWarning(this.$p.t('benotungstool/c4importNoStudentFoundForIdInRow', [rowParts[0], rowNum]))
return
}
@@ -392,8 +391,7 @@ export const Benotungstool = {
// find notenoption and check if its allowed to use in lehre
const notenOption = this.notenOptions.find(n => n.note == note)
if(!notenOption.lehre) {
// TODO: phrasen
this.$fhcAlert.alertWarning('Keine gültige Note gefunden für ID ' + rowParts[0] + ' in Zeile Nr. ' + rowNum + ' Die Zeile wurde übersprungen.')
this.$fhcAlert.alertWarning(this.$p.t('benotungstool/c4importNoGradeFoundForIdInRow', [rowParts[0], rowNum]))
return
}
}
@@ -410,15 +408,13 @@ export const Benotungstool = {
student = this.studenten.find(s => s.uid?.trim() === idTrimmed)
}
if(!student) {
// TODO: phrase
this.$fhcAlert.alertWarning('Kein Student gefunden für ID ' + rowParts[0] + ' in Zeile Nr. ' + rowNum + ' Die Zeile wurde übersprungen.')
this.$fhcAlert.alertWarning(this.$p.t('benotungstool/c4importNoStudentFoundForIdInRow', [rowParts[0], rowNum]))
return
}
const datum = rowParts[1] // should be in 'dd.MM.yyyy'
if(!this.isValidDate_ddmmyyyy(datum)) {
// TODO: phrase
this.$fhcAlert.alertWarning('Ungültiges Datumformat für ID ' + rowParts[0] + ' in Zeile Nr. ' + rowNum + '. Bitte verwenden Sie das Format "DD.MM.YYYY". Die Zeile wurde übersprungen.')
this.$fhcAlert.alertWarning(this.$p.t('benotungstool/c4importInvalidDateFoundForIdInRow', [rowParts[0], rowNum]))
return
}
const datumParts = datum.split('.')
@@ -443,8 +439,7 @@ export const Benotungstool = {
// find notenoption and check if its allowed to use in lehre
const notenOption = this.notenOptions.find(n => n.note == note)
if(!notenOption.lehre) {
// TODO: phrasen
this.$fhcAlert.alertWarning('Keine gültige Note gefunden für ID ' + rowParts[0] + ' in Zeile Nr. ' + rowNum + ' Die Zeile wurde übersprungen.')
this.$fhcAlert.alertWarning(this.$p.t('benotungstool/c4importNoGradeFoundForIdInRow', [rowParts[0], rowNum]))
return
}
}
@@ -632,8 +627,7 @@ export const Benotungstool = {
}
this.loading = false
// TODO: find some solution so the tool does not appear "jumpy" after pruefung calls
const colsFinal = colsUsed ?? cols
this.$refs.notenTable.tabulator.setColumns(colsFinal)
this.$refs.notenTable.tabulator.setData(this.studenten);
@@ -1694,9 +1688,7 @@ export const Benotungstool = {
this.reformatStudentRow(s)
}
this.$refs.notenTable.tabulator.redraw(true)
Vue.nextTick(()=> {
const table = this.$refs.notenTable.tabulator.element.querySelector('.tabulator-tableholder')
if(table) {
@@ -2006,9 +1998,9 @@ export const Benotungstool = {
const pLen = student.pruefungen.length
for(let i = 0; i < pLen; i++) {
const p = student.pruefungen[i]
// TODO: CHECK AGAINST NOTEN OPTIONS
if(p.note != 9 && p.note != 17) pruefungsAntrittCount++
const isDefinedAsAntrittsloseNote = this.config.NOTEN_OHNE_ANTRITT.find(n_pk => n_pk == p.note)
if(!isDefinedAsAntrittsloseNote) pruefungsAntrittCount++
}
// when student never had to take an exam beyond the original benotung
+60
View File
@@ -54774,6 +54774,66 @@ and represent the current state of research on the topic. The prescribed citatio
)
)
),
array(
'app' => 'core',
'category' => 'benotungstool',
'phrase' => 'c4importNoStudentFoundForIdInRow',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Keine StudentIn gefunden für ID {0} in Zeile Nr. {1}. Die Zeile wurde übersprungen.',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'No student found for ID {0} in row no. {1}. The row has been skipped.',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'benotungstool',
'phrase' => 'c4importNoGradeFoundForIdInRow',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Keine Note gefunden für ID {0} in Zeile Nr. {1}. Die Zeile wurde übersprungen.',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'No grade found for ID {0} in row no. {1}. The row has been skipped.',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'benotungstool',
'phrase' => 'c4importInvalidDateFoundForIdInRow',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Ungültiges Datumformat für ID {0} in Zeile Nr. {1}. Bitte verwenden Sie das Format "DD.MM.YYYY". Die Zeile wurde übersprungen.',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Invalid date found for ID {0} in row no. {1}. Please use the format "DD.MM.YYYY". The row has been skipped.',
'description' => '',
'insertvon' => 'system'
)
)
),
// CIS4 GESAMTNOTENEINGABE ENDE ------------------------------------------------------------------------------------
array(
'app' => 'core',