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:
@@ -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.1–13.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.1–13.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.
|
||||
|
||||
Reference in New Issue
Block a user