Schülerdokumentation: Einträge, Fehlzeitenbilanz, Datenschutz (Kapitel 5)

Dokumentationseinträge mit Typwahl (Gespräch, Vorkommnis, Förderplan,
Fehlzeit, Elternanruf, Elternbrief), vertrauliche Einträge nur nach
Bestätigung sichtbar, weiche Löschung mit Nachvollziehbarkeit. Fehlzeiten
als Auswertung des bestehenden Anwesenheits-Trackings statt zweiter
Erfassung, mit Schwellenwert-Warnung im Schülerdetail und Dashboard.
Förderplan-Wiedervorlage als Dashboard-Karte. Datenschutz: Löschfristen
mit manueller Bereinigung und DSGVO-Art.-15-Datenauskunft als Export.

Auf Nutzer-Feedback hin ergänzt: Elternanruf mit begleitendem
Gesprächsprotokoll-Dialog (Punkte abhaken, Eindrücke festhalten),
Elternbrief mit Versand-/Rückmeldungs-Tracking, Datei-Anhänge über
LiteDBs Dateispeicher, frei vergebbare Labels zur Nachverfolgung mit
Dringlichkeits-Farbcodierung, sowie eine sichtbare Farblegende für das
bestehende Notenentwicklungs-Diagramm. Dabei einen Absturz behoben:
leere Textfelder lieferten über das Binding null statt "", was beim
Speichern eine NullReferenceException auslöste.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-13 17:49:03 +02:00
co-authored by Claude Sonnet 5
parent 629b8d1bf0
commit d987b93315
36 changed files with 2395 additions and 62 deletions
+115 -26
View File
@@ -141,7 +141,12 @@ Umgesetzt über [GradeOverviewViewModels.cs](LehrerApp.Desktop/ViewModels/Groups
die Voreinstellung des Gruppentyps (Einstellungen → Notenschema), sonst ein Fallback 50/40/10 verwendet;
Bereiche ohne Werte werden bei der Berechnung ausgelassen und die verbleibenden Prozentanteile neu normiert
(`GradingService.CalculateReportGrade()`). Notenentwicklung im Schülerdetail zeigt ein einfaches
Balken-Sparkline je Lerngruppe über alle Klausur- und Einzelnoten-Einträge chronologisch.
Balken-Sparkline je Lerngruppe über alle Klausur- und Einzelnoten-Einträge chronologisch — **jeder
Balken ist ein einzelner `Grade`- bzw. Klausurergebnis-Eintrag, keine Mitarbeit-"Sitzung"**. Die
Herkunft (Kategorie wie "Mündlich"/"Mitarbeit" oder Klausurtitel) stand ursprünglich nur im
Tooltip und nicht sichtbar auf der Kachel — das führte zu Verwirrung, welche Zahl wofür steht,
und wurde ergänzt (`GradeHistoryPoint.Label` jetzt auch unter dem Balken sichtbar, nicht nur im
Tooltip), siehe [StudentDetailView.axaml](LehrerApp.Desktop/Views/Students/StudentDetailView.axaml).
---
@@ -255,33 +260,114 @@ Navigationspunkt "Unterrichtsplanung" ist ein `PlaceholderViewModel`
## 5. Schülerdokumentation
Modelle `Documentation`, `AbsenceData`, `SupportData` existieren, Repository ebenfalls.
Der Tab "Dokumentation" in der Gruppenansicht ist ein Platzhalter, im Schülerdetail
werden `DocEntry`-Einträge bereits gelesen.
**Wichtige Abweichung von der ursprünglichen Planung (5.2):** Vor der Umsetzung zeigte sich,
dass 5.2 wie ursprünglich beschrieben eine zweite, parallele Fehlzeiten-Erfassung neben dem
bereits bestehenden Anwesenheits-Tracking aus Kapitel 3 (`ParticipationEntry.Attendance`,
`AttendanceStatus`) ergeben hätte — zwei potenziell widersprüchliche Datenquellen für dieselbe
Frage ("war der Schüler da?"). Auf Rückfrage entschieden: 5.2 wird als **Auswertung** der
bestehenden Anwesenheitsdaten umgesetzt, keine zweite Erfassung. 5.2.1 und 5.2.4 existierten
dadurch faktisch schon (Quick-Input-Dialog bzw. "Offene Entschuldigungen" im Dashboard).
### 5.1 Einträge erfassen
- [ ] **5.1.1** Dialog "Dokumentation hinzufügen" mit Typwahl
(`Conversation`, `Incident`, `SupportPlan`, `Absence`) und typabhängigen Feldern.
- [ ] **5.1.2** Teilnehmerliste (`Participants`) bei Gesprächen erfassen.
- [ ] **5.1.3** Kennzeichen "vertraulich" (`IsConfidential`) mit Ausblenden in Übersichten.
- [ ] **5.1.4** Bearbeiten/Löschen mit Rückfrage; gelöschte Einträge nicht hart entfernen,
sondern als gelöscht markieren (Nachvollziehbarkeit).
- [x] **5.1.1** Dialog "Dokumentation hinzufügen" mit Typwahl
(`Conversation`, `Incident`, `SupportPlan`, `Absence`) und typabhängigen Feldern
[DocumentationDialog.axaml](LehrerApp.Desktop/Views/Students/DocumentationDialog.axaml),
[DocumentationViewModels.cs](LehrerApp.Desktop/ViewModels/Students/DocumentationViewModels.cs).
Deutsche Anzeige über `DocumentationTypeDisplay`/`SupportStatusDisplay`, analog zum
`NiveauDisplay`-Muster. Feldbezogene Validierung wie in 13.2.4.
- [x] **5.1.2** Teilnehmerliste (`Participants`) bei Gesprächen — Chip-Liste mit Hinzufügen/
Entfernen im Dialog, nur sichtbar bei Typ "Gespräch".
- [x] **5.1.3** Kennzeichen "vertraulich" — vertrauliche Einträge zeigen in der Übersicht nur
Datum/Typ/Schloss-Symbol, Titel und Inhalt erst nach Klick auf "Anzeigen"
(`DocumentationItem.IsRevealed`, session-lokal, keine erneute Passwortabfrage — dafür gibt
es bereits die App-Sperre aus 13.3.5).
- [x] **5.1.4** Bearbeiten/Löschen mit Rückfrage (neuer generischer `ConfirmDialog`); Löschen
markiert nur `IsDeleted`/`DeletedAt` statt hart zu entfernen —
`IDocumentationRepository.Delete`. Ein echtes `HardDelete` existiert separat, nur für die
Löschfristen-Bereinigung in 5.4.2.
- [x] **5.1.5** Zwei weitere Dokumentationstypen ergänzt (Nutzer-Feedback nach Erstauslieferung):
- **Elternanruf** (`DocumentationType.ParentCall`): Gesprächspunkte werden im normalen
Dialog vorab geplant (`ParentCallData.Points`); ein separater
[ParentCallSessionDialog](LehrerApp.Desktop/Views/Students/ParentCallSessionDialog.axaml)
("Gespräch begleiten", Button an jedem Elternanruf-Eintrag) hakt sie während des
Telefonats ab und hält Eindrücke/Ergänzungen als Protokoll fest
(`ParentCallData.Impressions`, `IsConducted`, `ConductedDate`). Punkte mit
unverändertem Text behalten beim erneuten Bearbeiten ihren Abhak-Status (Zuordnung
über `ParentCallPoint.Id`, sonst über Textabgleich — ein umbenannter Punkt gilt als
neu und startet offen; bewusste Vereinfachung).
- **Elternbrief** (`DocumentationType.ParentLetter`): Entwurf/Inhalt, Absendedatum,
Rückmeldung erhalten (ja/nein), Rückmeldedatum und -notiz (`ParentLetterData`).
- **Datei-Anhänge** (an allen Dokumentationstypen, nicht nur Elternbrief): über LiteDBs
eingebauten Dateispeicher (`ILiteStorage<string>`, per Skript verifiziert — funktioniert
zuverlässig, im Gegensatz zum defekten `Rebuild`-mit-Passwort aus 13.3.4) —
[LiteAttachmentStorage.cs](LehrerApp.Data/LiteAttachmentStorage.cs). Größe strikt auf
10 MB je Datei begrenzt (`IAttachmentStorage.MaxSizeBytes`), damit die Datenbankdatei
(und jedes Backup, 13.3.1) nicht durch Anhänge aufgebläht wird. Neu hochgeladene, aber
nie gespeicherte Anhänge werden beim Abbrechen des Dialogs wieder gelöscht, damit keine
verwaisten Blobs zurückbleiben; beim endgültigen Löschen eines Eintrags (5.4.2) werden
auch dessen Anhänge mit entfernt.
**Randnotiz:** Beim Schreiben der Tests für den Datei-Speicher fiel eine bereits vorher
latent vorhandene Testinfrastruktur-Schwäche auf: `LiteDbContext` nutzt LiteDBs
statischen, geteilten `BsonMapper.Global` für die Index-Auflösung — bei paralleler
Testausführung über mehrere Testklassen hinweg (xUnit-Standard) führte das sporadisch zu
"Member X not found on BsonMapper"-Fehlern in völlig unbeteiligten Tests. Behoben durch
`[assembly: CollectionBehavior(DisableTestParallelization = true)]` in
[AssemblyInfo.cs](LehrerApp.Data.Tests/AssemblyInfo.cs) — Data-Tests laufen jetzt
sequenziell (bei elementaren In-Memory-Tests kein spürbarer Zeitverlust).
- [x] **5.1.6** Labels zur Nachverfolgung (Nutzer-Feedback): freie Text-Labels an jedem
Dokumentationseintrag (`Documentation.Tags`), mit AutoCompleteBox-Vorschlägen
(`DocumentationTagDisplay.Suggestions`: Kritisch, Nacharbeiten, Mit JGL abklären,
Erkundigung einholen, Elterngespräch nötig, Mit Schulleitung abklären, Klassenkonferenz,
Frist beachten, Beobachten, Erledigt — eigene Labels bleiben trotzdem frei möglich).
Farbcodierung nach Dringlichkeit statt nach Label-Identität
(`DocumentationTagDisplay.ColorHex`): rot = Priorität, orange = Handlungsbedarf,
blau = im Blick behalten, grün = abgeschlossen, grau = freies Label. Als farbige Chips in
der Dokumentationsliste sichtbar (`DocumentationItem.TagChips`).
Dabei außerdem behoben: die Farblegende der Notenentwicklung-Balken (2.5) fehlte sichtbar
im UI (nur im Tooltip) — wirkte dadurch wie zufällige/abwechselnde Farbgebung statt wie das
eigentliche Signal "Auffälligkeit". Jetzt als kleine Legende über dem Diagramm sichtbar,
siehe [StudentDetailView.axaml](LehrerApp.Desktop/Views/Students/StudentDetailView.axaml).
### 5.2 Fehlzeiten
- [ ] **5.2.1** Schnelle Abwesenheitserfassung je Stunde (entschuldigt/unentschuldigt).
- [ ] **5.2.2** Fehlzeitenbilanz je Schüler und Halbjahr (Summe Stunden, Quote).
- [ ] **5.2.3** Schwellenwert-Warnung (z.B. > 20 % Fehlzeiten) im Schülerdetail und Dashboard.
- [ ] **5.2.4** Nachträgliches Entschuldigen mit Frist-Hinweis.
### 5.2 Fehlzeiten (als Auswertung des bestehenden Anwesenheits-Trackings, siehe oben)
- [x] **5.2.1** Schnelle Abwesenheitserfassung je Stunde — bereits vorhanden über
`AttendanceHomeworkQuickInputDialog` und den Mitarbeits-Assistenten (Kapitel 3).
- [x] **5.2.2** Fehlzeitenbilanz je Schüler und laufendes Schuljahr —
[AttendanceBalanceService.cs](LehrerApp.Core/Services/AttendanceBalanceService.cs), reine
Auswertungslogik (kontrollierte Stunden, entschuldigt/unentschuldigt/offen, Fehlquote in %),
angezeigt im Schülerdetail-Tab "Dokumentation". Schulisch veranlasste Abwesenheit
(`OtherSchoolEvent`) zählt bewusst nicht als Fehlzeit des Schülers.
- [x] **5.2.3** Schwellenwert-Warnung (> 20 %) — `AttendanceBalance.ExceedsThreshold` im
Schülerdetail sowie eine neue "Fehlzeiten-Warnung"-Karte im Dashboard (alle Schüler über
dem Schwellenwert, sortiert nach Fehlquote).
- [x] **5.2.4** Nachträgliches Entschuldigen mit Frist-Hinweis — bereits vorhanden über die
"Offene Entschuldigungen"-Karte im Dashboard (21-Tage-Grenze, aus Kapitel 3).
### 5.3 Förderpläne
- [ ] **5.3.1** Förderplan anlegen: Maßnahmenliste, Überprüfungsdatum, Status.
- [ ] **5.3.2** Wiedervorlage: fällige Überprüfungen erscheinen im Dashboard.
- [ ] **5.3.3** Verlaufsdokumentation zum Förderplan (mehrere Einträge über die Zeit).
- [x] **5.3.1** Förderplan anlegen (Maßnahmenliste, Überprüfungsdatum, Status) — über den
5.1-Dialog mit Typ "Förderplan" (`SupportData`: `Measures`, `ReviewDate`, `Status`).
- [x] **5.3.2** Wiedervorlage: fällige Überprüfungen (Status Aktiv, Überprüfungsdatum in den
nächsten 14 Tagen oder überfällig) erscheinen als eigene Dashboard-Karte
"Förderplan-Wiedervorlage", überfällige rot hervorgehoben.
- [x] **5.3.3** Verlaufsdokumentation — die Dokumentationsliste im Schülerdetail zeigt alle
Förderplan-Einträge chronologisch; bewusst keine zusätzliche Gruppierung über eine
Plan-ID, da das bestehende flache `Documentation`-Modell dafür ausreicht.
### 5.4 Datenschutz
- [ ] **5.4.1** Vertrauliche Einträge nur nach zusätzlicher Bestätigung anzeigen.
- [ ] **5.4.2** Löschfristen definieren und abgelaufene Einträge zum Löschen vorschlagen.
- [ ] **5.4.3** Export einzelner Schülerdaten für Auskunftsersuchen (Art. 15 DSGVO).
- [x] **5.4.1** Vertrauliche Einträge nur nach zusätzlicher Bestätigung anzeigen — siehe 5.1.3
(zusammen umgesetzt, da es sich um dieselbe UI-Stelle handelt).
- [x] **5.4.2** Löschfristen — neuer Tab "Datenschutz" in den Einstellungen: konfigurierbare
Aufbewahrungsfrist in Jahren
([PrivacySettingsService.cs](LehrerApp.Core/Services/PrivacySettingsService.cs), Standard 3
Jahre), Liste abgelaufener Einträge zur manuellen Prüfung mit "Endgültig löschen"
(`IDocumentationRepository.HardDelete`). Löscht nie automatisch.
- [x] **5.4.3** Export einzelner Schülerdaten für Auskunftsersuchen (Art. 15 DSGVO) —
[PersonalDataExportService.cs](LehrerApp.Core/Services/PersonalDataExportService.cs),
JSON-Export mit Stammdaten, Gruppenzuordnungen, Noten, Klausurergebnissen, Mitarbeit und
Dokumentation (auch als vertraulich markierte Einträge — das Vertraulich-Kennzeichen blendet
nur die laufende Ansicht aus, ist aber keine pauschale rechtliche Ausnahme vom
Auskunftsanspruch der betroffenen Person selbst). **Hinweis:** ob im Einzelfall eine
Ausnahme greift (z.B. schutzwürdige Belange Dritter nach Landes-Schulrecht), muss die
verantwortliche Lehrkraft/Schule selbst prüfen — das ist keine Rechtsberatung.
---
@@ -637,9 +723,12 @@ Fächer- und Kompetenzverwaltung existiert bereits in
Die Abschnitte sind thematisch, nicht chronologisch nummeriert. Sinnvolle Bearbeitungsreihenfolge:
1. **Kapitel 1** (Klausuren) — größte funktionale Lücke, viele andere Punkte hängen daran.
2. **Kapitel 3.2** (Mitarbeit-Aggregation) — kurz, macht das bestehende Feature erst nutzbar.
3. **Kapitel 2** (Noten & Zeugnisnoten) — braucht 1 und 3.2 als Datenquellen.
4. **Kapitel 13.113.2** (Tests, Fehlerbehandlung) — bevor die Codebasis weiter wächst.
5. **Kapitel 4** (Planung) und **Kapitel 5** (Dokumentation) — unabhängig, gut parallelisierbar.
1. ~~**Kapitel 1** (Klausuren)~~ — erledigt.
2. ~~**Kapitel 3.2** (Mitarbeit-Aggregation)~~ — erledigt.
3. ~~**Kapitel 2** (Noten & Zeugnisnoten)~~ — erledigt.
4. ~~**Kapitel 13** (Technische Basis: Tests, Fehlerbehandlung, Datensicherheit, Codepflege)~~
erledigt (13.113.4 vollständig; 13.4.2 bewusst zurückgestellt, siehe dort).
5. ~~**Kapitel 5** (Schülerdokumentation)~~ — erledigt (5.2 als Auswertung des bestehenden
Anwesenheits-Trackings statt zweiter Erfassung, siehe dort). **Kapitel 4** (Planung) war als
parallelisierbar dazu vorgesehen und ist weiterhin offen. **→ nächster sinnvoller Schritt.**
6. **Kapitel 6** (Arbeitszeit), **11** (Export), **10** (Sync) — danach.