fix: WebUntis-Schülerreport verkraftet fehlenden externKey

Klassenlehrer-Übersicht scheiterte komplett mit "Ungültige Zahl in Spalte
externKey", sobald ein Schüler der Klasse keinen gepflegten externen
Schlüssel hat (in echten Schuldaten vorkommend). externKey ist jetzt
optional statt Pflichtfeld (UntisStudent/UntisStudentDto.ExternKey -> int?);
betraf denselben Bericht wie der bestehende WebUntis-Klassenimport, der das
aber schon immer beim Weiterimport toleriert hatte.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-25 22:47:04 +02:00
co-authored by Claude Sonnet 5
parent 33c15ffe3e
commit 056e864edd
6 changed files with 34 additions and 4 deletions
+4 -1
View File
@@ -41,9 +41,12 @@ public sealed record UntisStudentAddress(
string? PostCode,
string? Street);
// ExternKey optional: reale Schuldaten enthalten Schüler*innen (z.B. frisch angelegt/übernommen)
// ohne gepflegten externen Schlüssel - ein fehlender Wert bei einer/einem soll nicht den Abruf der
// gesamten Klassenliste zum Absturz bringen (siehe WebUntisStudentReportParser).
public sealed record UntisStudent(
int UntisId,
int ExternKey,
int? ExternKey,
string ClassName,
string? Name,
string? LongName,
@@ -23,7 +23,7 @@ public static class WebUntisStudentReportParser
values[headers[index]] = index < row.Count ? row[index].Trim() : null;
var untisId = RequiredInt(Get(values, "id"), "id");
var externalKey = RequiredInt(Get(values, "externKey"), "externKey");
var externalKey = OptionalInt(Get(values, "externKey"));
var name = Optional(Get(values, "name"));
var lastName = Optional(Get(values, "longName"));
var firstName = Optional(Get(values, "foreName"));
@@ -73,6 +73,11 @@ public static class WebUntisStudentReportParser
? parsed
: throw new InvalidDataException($"Ungültige Zahl in Spalte \"{field}\".");
private static int? OptionalInt(string? value) =>
int.TryParse(value?.Trim(), NumberStyles.Integer, CultureInfo.InvariantCulture, out var parsed)
? parsed
: null;
private static int? GermanDate(string? value)
{
if (!DateOnly.TryParseExact(value?.Trim(), ["dd.MM.yyyy", "yyyyMMdd"], CultureInfo.InvariantCulture,