Automatisches rollierendes Backup der Datenbank beim Start mit Wiederherstellung über die Einstellungen, versionierte Schema-Migration, optionale Passwort-Verschlüsselung der LiteDB-Datei und eine App-Sperre nach Inaktivität mit eigenem Passwort. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
39 KiB
LehrerApp — Entwicklungs-Roadmap
Strukturierte ToDo-Liste aller offenen Entwicklungsschritte. Jeder Punkt ist so formuliert, dass er einzeln an einen Agenten übergeben werden kann.
Stand: 2026-08-04
Legende: [ ] offen · [~] teilweise umgesetzt · [x] fertig
0. Konventionen für alle Aufgaben
Diese Regeln gelten für jede Aufgabe unten und müssen nicht wiederholt werden.
- MVVM: Logik in ViewModels (
CommunityToolkit.Mvvm,[ObservableProperty]/[RelayCommand]), Views enthalten nur Binding. Kein Code-Behind außer Dialog-Verdrahtung. - DI: Neue Repositories/Services/ViewModels in
LehrerApp.Desktop/AppBootstrapper.csregistrieren. Repositories + Listen-VMs = Singleton, Detail-/Dialog-VMs = Transient. - Daten: Neue Collections in
LehrerApp.Data/LiteDbContext.csanlegen, Indexe inEnsureIndexes(). Interface nachLehrerApp.Core/Interfaces/IRepositories.cs, Implementierung nachLehrerApp.Data/Repositories/AllRepositories.cs. - Dialoge:
WindowmitClose(true/false), DataContext manuell gesetzt (Muster siehe AddGroupDialog.axaml.cs). - Sprache: Alle UI-Texte auf Deutsch. Datumsformat
dd.MM.yyyy, Kulturde-DE. - Modelle:
UpdatedAtbei jedem Speichern setzen (Grundlage für Sync-Konfliktauflösung).
1. Klausuren & Leistungsüberprüfungen
Modelle Exam, ExamTask, GradingKeyEntry, ExamResult existieren bereits in
Exam.cs, Repositories ebenfalls. Die komplette UI fehlt.
Niveaudifferenzierung (E/G/Förder) ist bereits umgesetzt — nicht aus dieser Liste, sondern
ein separater Bedarf (Nachteilsausgleich/Binnendifferenzierung): LearningGroup.IsDifferentiated
(Checkbox in den Stammdaten) blendet eine Niveau-Zuordnung je Schüler ein (GroupMembership.Niveau,
Schüler-Tab). Klausuren bekommen optional ein Niveau; Punkteeingabe und Auswertung filtern dann
automatisch auf die passenden Schüler. Workflow: G-Klausur normal anlegen, per "Duplizieren"
(1.1.4) die E-Variante mit eigenen Aufgaben/Punkten ableiten (Niveau wird beim Duplizieren bewusst
zurückgesetzt). Vollständig individuelle Förderklausuren (nur für einen einzelnen Schüler) laufen
pragmatisch über "Abwesend" bei den übrigen Schülern statt über eine eigene Schüler-Zuordnung.
1.1 Klausur anlegen und verwalten
- 1.1.1 Dialog
AddExamDialog— Titel, Datum, Fach, Klausurnummer, Notizen. Ersetzt den TODO-StubAddExam()in GroupViewModels.cs. Umgesetzt alsExamDialog/ExamDialogViewModel. - 1.1.2 Klausur bearbeiten/löschen (Kontextmenü im Klausuren-Tab, Löschen mit Rückfrage).
- 1.1.3 Statuswechsel
Planned → Conducted → Graded → Returnedper Button, inkl. Farbcodierung des Status im DataGrid. - 1.1.4 Klausur aus bestehender Klausur duplizieren (Aufgaben + Notenschlüssel übernehmen, neues Datum) — für Parallelkurse.
1.2 Aufgabenstruktur (ExamTask)
- 1.2.1 Editor für die Aufgabenliste: Nr., Titel, Maximalpunkte, Gewichtung.
Zeilen hinzufügen/entfernen/umsortieren. Umgesetzt im
ExamDialog(Teil von 1.1.1). - 1.2.2 Automatische Anzeige der Gesamtpunktzahl, Warnung bei 0 Punkten.
- 1.2.3 Optional: Teilaufgaben (a/b/c) — erfordert Modellerweiterung, vorher entscheiden.
- 1.2.4 Zuordnung von Kompetenzen (
CompetencyItem) zu einzelnen Aufgaben — Voraussetzung für die Kompetenzauswertung in 8.3.
1.3 Notenschlüssel
- 1.3.1 Editor für
GradingKeymit Vorbelegung ausGradingService.DefaultKey1To6()/DefaultKey0To15()je nachGradingSystemder Gruppe. Umgesetzt imExamDialog(Teil von 1.1.1), analog zum Aufgaben-Editor. - 1.3.2 Notenschlüssel als wiederverwendbare Vorlage speichern (neues Modell
GradingKeyTemplate+ Repository) und in Einstellungen verwalten. - 1.3.3 Live-Vorschau: Punktegrenzen absolut anzeigen (z.B. "Note 2 ab 45 von 60 P.").
- 1.3.4 Validierung: lückenlose, absteigende Prozentgrenzen, keine Dopplungen
(
GradingService.ValidateGradingKey).
1.4 Punkteeingabe & Korrektur
- 1.4.1 Eingaberaster: Zeilen = Schüler, Spalten = Aufgaben, letzte Spalte Summe + Note.
Note wird live über
GradingService.CalculateGrade()berechnet. Umgesetzt als eigener DialogExamGradingDialog, erreichbar über "Punkte eingeben" im Klausuren-Tab (Button/Kontextmenü bei ausgewählter Klausur). - 1.4.2 Tastaturnavigation: Tab bewegt sich nativ zur nächsten Zelle, Enter/Pfeil-Hoch/ Pfeil-Runter springen zur gleichen Spalte in der Nachbarzeile, direkte Zifferneingabe und halbe Punkte (Komma oder Punkt) erlaubt.
- 1.4.3 Kennzeichnung "Abwesend" (
ExamResult.Absent) per Checkbox — Note zeigt "abwesend" statt einer berechneten Note. Ausschluss aus Statistiken über 1.5 umgesetzt. - 1.4.4 Kommentarfeld pro Schüler (
ExamResult.Comment). - 1.4.5 Validierung: Punkte < 0 oder > Maximalpunkte der Aufgabe wird rot markiert und nicht
gespeichert (
PointsCell.TrySetValue). - 1.4.6 Autosave nach jeder Zelle (kein expliziter Speichern-Button nötig).
1.5 Klausurauswertung
- 1.5.1 Notenspiegel (Häufigkeitsverteilung als Balken), Durchschnitt, Median,
Anteil unter 4 / unter 5 Punkten. Umgesetzt als neuer Dialog
ExamEvaluationDialog, erreichbar über "Auswertung" im Klausuren-Tab. Bei Notensystem 1–6 zeigt der Schwellenwert sinngemäß "Anteil nicht ausreichend (Note 5/6)" statt der Punktegrenzen. Abwesende werden aus allen Statistiken ausgeschlossen (löst damit auch den Hinweis aus 1.4.3 ein). - 1.5.2 Aufgabenanalyse: durchschnittlicher Erfüllungsgrad pro Aufgabe in Prozent, Kennzeichnung auffällig schwacher Aufgaben (Ø < 50 %, rot markiert).
- 1.5.3 Notenschlüssel nachträglich verschieben und Auswirkung sofort im Notenspiegel sehen — Änderungen wirken sich live aus, erst "Übernehmen" schreibt sie in die Klausur zurück.
- 1.5.4 Export der Auswertung — als eigenständiger CSV-Export direkt im Dialog umgesetzt (analog zum bestehenden JSON-Export der Kompetenzkataloge), nicht über eine gemeinsame Export-Infrastruktur, da Kapitel 11 ("Bisher nicht vorhanden — komplett neu") noch aussteht.
2. Noten & Zeugnisnoten
Modell Grade existiert in Planning.cs, GradeRepository ebenfalls.
Der Tab "Noten" in GroupDetailView.axaml ist jetzt
vollständig umgesetzt (siehe unten), ebenso der gleichnamige Tab im Schülerdetail (2.5).
2.1 Notenübersicht der Gruppe
- 2.1.1 Matrix: Zeilen = Schüler, Spalten = alle Leistungen (Klausuren, Mitarbeit je Halbjahr, sonstige Noten). Zelle zeigt Note/Punkte.
- 2.1.2 Spalte "Gesamt" mit gewichtetem Durchschnitt über
GradingService.WeightedAverage(). - 2.1.3 Sortierung nach Name / Gesamtnote, Umschalten Noten ↔ Punkte.
- 2.1.4 Halbjahresfilter (H1 / H2 / Gesamtjahr), berücksichtigt
GroupMembership.Period.
2.2 Einzelnoten pflegen
- 2.2.1 Dialog "Note hinzufügen": Kategorie (
GradeCategory), Wert, Datum, Gewichtung, Notiz. - 2.2.2 Note bearbeiten / löschen mit Historie (wer/wann geändert) — mindestens
CreatedAtsichtbar. - 2.2.3 Sammelerfassung: eine Note (z.B. Hausaufgabenkontrolle) für die ganze Gruppe auf einmal.
2.3 Gewichtungsschema
- 2.3.1 Neues Modell
GradingSchemeje Gruppe: prozentuale Anteile von Klausuren / Mitarbeit / sonstige Leistungen (z.B. 50/40/10). - 2.3.2 UI zur Bearbeitung, Validierung auf Summe 100 %.
- 2.3.3 Voreinstellung je Gruppentyp (
Classvs.Course) in den Einstellungen.
2.4 Zeugnisnote
- 2.4.1 Berechnung der Zeugnisnote aus Schema (2.3) + allen Teilnoten, Rundungsregel konfigurierbar (kaufmännisch / pädagogisch abweichbar).
- 2.4.2 Manuelles Übersteuern mit Pflicht-Begründung (pädagogischer Spielraum).
- 2.4.3 Zeugnisnoten-Ansicht mit Sperren/Festschreiben zum Konferenztermin.
- 2.4.4 Export der Zeugnisnotenliste (siehe 11.2).
2.5 Notenentwicklung
- 2.5.1 Verlaufsdiagramm pro Schüler über das Schuljahr (im Schülerdetail).
- 2.5.2 Auffälligkeiten markieren: Abfall um ≥ 1 Note, Versetzungsgefährdung (Note 5/6).
Umgesetzt über GradeOverviewViewModels.cs
(Matrix-Tab, Einzelnoten-Dialoge), ReportGradeViewModels.cs
(Zeugnisnoten-Dialog) und die neuen Modelle GradingScheme/ReportGrade in
Planning.cs. Das Gewichtungsschema wird pro Gruppe gesucht, sonst
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.
3. Mündliche Mitarbeit — offene Punkte
Grundfunktion ist umgesetzt (Sitzungen, Raster, Schnelleingabe-Dialog). Siehe ParticipationViewModels.cs.
3.1 Aspekte konfigurieren
- 3.1.1 UI zum Anlegen/Bearbeiten/Löschen von
ParticipationAspectpro Gruppe (Fach Chemie: z.B. "Experiment", "Protokoll") —GroupId = nullbleibt global. - 3.1.2 Reihenfolge der Aspekte per Drag & Drop oder Hoch/Runter-Buttons festlegen (bestimmt auch die Q/W/E/R/T-Belegung im Schnelleingabe-Dialog).
- 3.1.3 Aspekt-Typen
Scale3,Binary,Pointsin Raster und Dialog vollständig unterstützen (bisher primärScale5). - 3.1.4 Aspekt deaktivieren statt löschen, damit alte Einträge gültig bleiben.
3.2 Aggregation zur Mitarbeitsnote
- 3.2.1 Gewichtung je Aspekt konfigurierbar (z.B. Qualität 50 %, Quantität 30 %, Experiment 20 %).
- 3.2.2 Berechnung einer Mitarbeitsnote je Halbjahr aus allen Sitzungen,
Ausgabe als Note bzw. Punkte je nach
GradingSystemder Gruppe. - 3.2.3 Umgang mit fehlenden Werten festlegen (nicht bewertet ≠ schlecht bewertet).
- 3.2.4 Übernahme der berechneten Mitarbeitsnote als
GrademitCategory = Participation(Anbindung an 2.1). - 3.2.5 Trendanzeige pro Schüler (Entwicklung über die Sitzungen hinweg).
Umgesetzt über den neuen Dialog "Ø Mitarbeitsnote" im Mitarbeit-Tab
(ParticipationGradeViewModels.cs,
ParticipationGradeDialog.axaml):
Zeitraum wählbar (Gesamtjahr/H1/H2), Aspekt-Gewichtung live editierbar (ParticipationAspect.Weight,
da die eigentliche Aspekt-Verwaltung aus 3.1 noch fehlt), Mapping der Bewertungsskala (-2..+2) auf
Note/Punkte über GradingService.ParticipationGrade(), einfache Trendanzeige (↑/↓/→) durch Vergleich
der ersten mit der zweiten Hälfte der Sitzungen. "Übernehmen" aktualisiert eine bestehende
Mitarbeit-Note für denselben Zeitraum statt sie zu duplizieren (erkannt über den Grade.Note-Tag).
3.3 Sitzungen
- 3.3.1 Sitzung automatisch aus einer geplanten
Lessonerzeugen (Datum + Thema übernehmen) — Abhängigkeit zu 4.2. - 3.3.2 Anwesenheit in der Sitzung erfassen — als
ParticipationEntry.Attendance(krank: Entschuldigung offen/entschuldigt/unentschuldigt), nicht als "verspätet"; siehe unten. Vorgriff auf 5.2, ersetzt dessen 5.2.1/5.2.4 aber nicht vollständig (kein Fehlzeitenmodul über alle Stundentypen hinweg, nur innerhalb von Mitarbeit-Sitzungen). - 3.3.3 Sitzung bearbeiten/löschen inkl. Rückfrage bei vorhandenen Bewertungen.
- 3.3.4 Sitzungen mehrerer Gruppen im Kalenderüberblick.
Abschnittsnoten & Mitarbeits-Assistent (nicht aus dieser Liste, eigener Workflow-Bedarf)
Ergänzt den Workflow "regelmäßig (alle 4–7 Wochen) mündliche Noten zu einer Abschnittsnote zusammenziehen, daraus die Halbjahresnote bilden":
ParticipationEntry.HomeworkMissing(bool) und.Attendance(AttendanceStatus?:ExcusePending/Excused/Unexcused) — editierbar direkt im Bewertungsraster (ParticipationTabView.axaml, Spalten "HA"/"Anwesenheit") und im neuen Mitarbeits-Assistenten.ExcusePendingist bewusst ein Zwischenzustand, da die Entschuldigung meist erst später eintrifft.- Neues Modell
ParticipationSection(Abschnitt: Start/Ende/Bezeichnung je Gruppe) — nur abgeschlossene Abschnitte werden gespeichert, der laufende Zeitraum ergibt sich aus dem Ende des letzten Abschnitts bis heute. - Neues Fenster Mitarbeits-Assistent
(ParticipationWizardViewModels.cs,
ParticipationWizardDialog.axaml):
Zeitleiste je Schüler (Sitzungen als Bewertungs-Badges, Klausurtermine, Symbole für Hausaufgaben/
Bemerkung/Anwesenheit), gruppiert nach Abschnitten. "Abschnitt abschließen" berechnet für alle
Schüler einen Notenvorschlag aus den Sitzungen im Zeitraum und speichert ihn als
Grade(Category = Participation,Note = "Abschnitt: <Bezeichnung>"), individuell nachjustierbar. "Halbjahresnote aus Abschnitten übernehmen" mittelt die Abschnittsnoten eines Zeitraums und speichert sie über denselbenGrade.Note-Tag wie der bestehende "Ø Mitarbeitsnote"-Dialog (3.2) — beide Wege sind kompatibel, der Assistent baut auf 3.2 auf statt es zu ersetzen. - Dashboard-Kachel "Offene Entschuldigungen": listet alle
ExcusePending-Einträge der letzten 21 Tage gruppenübergreifend mit Direktauflösung; ältere Einträge werden ausgeblendet statt automatisch entschieden (pädagogische Entscheidung bleibt bei der Lehrkraft).
4. Unterrichtsplanung
Modelle Unit und Lesson existieren, UnitRepository/LessonRepository ebenfalls.
Navigationspunkt "Unterrichtsplanung" ist ein PlaceholderViewModel
(MainWindowViewModel.cs:41).
4.1 Unterrichtseinheiten (Unit)
- 4.1.1 Listenansicht der Einheiten je Gruppe mit Status und Zeitraum (ersetzt den Platzhalter im Tab "Planung").
- 4.1.2 Dialog Einheit anlegen/bearbeiten: Titel, Fach, Zeitraum, Status, Notizen.
- 4.1.3 Kompetenzen aus dem Katalog (siehe 8) einer Einheit zuordnen — Mehrfachauswahl.
- 4.1.4 Einheit als Vorlage speichern und in eine andere Gruppe kopieren (inkl. Stunden, ohne Datumsbezug).
- 4.1.5 Fortschrittsanzeige: gehaltene / geplante Stunden der Einheit.
4.2 Einzelstunden (Lesson)
- 4.2.1 Stundenliste innerhalb einer Einheit, sortiert nach Datum/Stundennummer.
- 4.2.2 Stundeneditor: Thema, Phase, Methoden, Materialien, Hausaufgabe. Methoden/Materialien als Chips mit Autovervollständigung aus bisherigen Einträgen.
- 4.2.3 Status
Planned → Conductedsetzen, Reflexionsfeld nach der Stunde. - 4.2.4 Stunden verschieben (z.B. bei Ausfall) — Folgestunden automatisch nachrücken.
- 4.2.5 Stunden serienweise aus dem Stundenplan (4.3) erzeugen.
4.3 Stundenplan
- 4.3.1 Neues Modell
TimetableSlot(Gruppe, Wochentag, Stunde, Raum) + Repository. - 4.3.2 Wochenstundenplan-Ansicht als Raster mit Farbcodierung je Gruppe.
- 4.3.3 Bearbeitung per Klick/Drag im Raster.
- 4.3.4 Abgleich mit
LearningGroup.HoursPerWeek(Warnung bei Abweichung). - 4.3.5 Schulferien und Feiertage hinterlegen (Bundesland wählbar) und aus der Planung ausnehmen.
4.4 Wochen-/Tagesansicht
- 4.4.1 Kalenderansicht über alle Gruppen: Woche und Tag.
- 4.4.2 Sprung von einer Stunde direkt in die Mitarbeitserfassung dieser Gruppe.
- 4.4.3 Anzeige anstehender Klausurtermine und Abgabefristen im Kalender.
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.
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).
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.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).
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).
6. Arbeitszeit & Aufgaben
Modelle WorkTask und TimeEntry existieren, Repositories ebenfalls.
Navigationspunkt "Arbeitszeit" ist ein PlaceholderViewModel.
6.1 Aufgabenverwaltung
- 6.1.1 Aufgabenliste mit Filter nach Status, Kategorie, Gruppe und Fälligkeit.
- 6.1.2 Aufgabe anlegen/bearbeiten: Titel, Kategorie, Gruppe, Fälligkeit, geschätzte Dauer, Notizen.
- 6.1.3 Status per Klick wechseln (
Open → InProgress → Done), erledigte ausblenden. - 6.1.4 Wiederkehrende Aufgaben (wöchentlich/monatlich).
- 6.1.5 Automatische Aufgabe "Klausur korrigieren" beim Statuswechsel einer Klausur
auf
Conducted(Anbindung an 1.1.3).
6.2 Zeiterfassung
- 6.2.1 Timer starten/stoppen mit Zuordnung zu Aufgabe oder Kategorie.
- 6.2.2 Manuelle Nacherfassung eines Zeitblocks (Datum, Von–Bis oder Dauer).
- 6.2.3 Wochenübersicht der erfassten Zeit, Summen je Kategorie.
- 6.2.4 Schätzung vs. tatsächliche Dauer je Aufgabe vergleichen.
6.3 Auswertung
- 6.3.1 Monats-/Jahresauswertung nach Kategorie und Gruppe (Diagramm + Tabelle).
- 6.3.2 Abgleich mit der Pflichtstundenzahl (in Einstellungen hinterlegt).
- 6.3.3 Export der Arbeitszeitauswertung (siehe 11.2).
7. Schüler & Gruppen — Verfeinerungen
Grundfunktionen sind vorhanden (StudentViewModels.cs,
GroupViewModels.cs).
Niveau-Zuordnung je Schüler (E/G/Förder, GroupMembership.Niveau) ist bereits umgesetzt, siehe
Hinweis in Kapitel 1 — betrifft auch Kurse, nicht nur Klassen.
7.1 Schüler
- 7.1.1 Schüler löschen / auf inaktiv setzen inkl. Hinweis auf verknüpfte Daten.
- 7.1.2 Suche in der Schülerliste (Name, Gruppe) mit Sofortfilter.
- 7.1.3 Foto/Avatar je Schüler (optional, lokal gespeichert) für schnellere Zuordnung.
- 7.1.4 Serienbrieffelder aus Kontaktdaten (Anrede, Adresse) für Elternbriefe.
- 7.1.5 Sitzplan je Gruppe (Raster mit Drag & Drop), Sprung von Sitzplatz zur Bewertung.
7.2 Gruppen
- 7.2.1 Gruppe bearbeiten und löschen — bereits vorhanden (
EditGroupCommand/DeleteGroupCommand/ToggleArchiveCommandinGroupListViewModel), nicht Teil der aktuellen Klausuren-Arbeit, beim Review aber bestätigt. - 7.2.2 Gruppe ins neue Schuljahr übernehmen: Kopie mit gleicher Schülerschaft,
neues
SchoolYear, neueGroupMembership-Einträge. - 7.2.3 Schüler aus einer Gruppe entfernen (
GroupMembership.LeftAtsetzen statt löschen). - 7.2.4 Umgang mit
MembershipPeriod.Customin allen Auswertungen prüfen (Schüler zählt nur im belegten Zeitraum). - 7.2.5 Archivansicht abgeschlossener Schuljahre (schreibgeschützt).
7.3 Import
- 7.3.1 CSV-Import von Schülerlisten mit Spaltenzuordnung im Dialog.
- 7.3.2 Dublettenerkennung beim Import (Name + Geburtsdatum), Zusammenführen anbieten.
- 7.3.3 Import-Vorschau mit Fehlerliste vor dem endgültigen Übernehmen.
8. Kompetenzen
Katalogverwaltung und JSON-Import existieren in SettingsViewModel.cs, Format dokumentiert in Kompetenzkatalog-KI-Prompt.md.
8.1 Katalogverwaltung
- 8.1.1 Kompetenzen innerhalb eines Bereichs umsortieren (
SortOrderbearbeitbar machen). - 8.1.2 Katalog exportieren (JSON) — Gegenstück zum vorhandenen Import.
- 8.1.3 Katalog von einer Jahrgangsstufe in eine andere kopieren.
- 8.1.4 Import-Konflikte behandeln: Merge statt Ersetzen anbieten.
8.2 Verwendung im Unterricht
- 8.2.1 Kompetenzen einer Unterrichtseinheit zuordnen (siehe 4.1.3).
- 8.2.2 Kompetenzen einzelnen Klausuraufgaben zuordnen — umgesetzt mit 1.2.4.
- 8.2.3 Abdeckungsübersicht: welche Kompetenzen wurden im Schuljahr behandelt/geprüft?
8.3 Kompetenzorientierte Auswertung
- 8.3.1 Kompetenzprofil je Schüler aus Klausuraufgaben-Ergebnissen berechnen.
- 8.3.2 Gruppenübersicht: durchschnittlicher Erfüllungsgrad je Kompetenz, Identifikation von Wiederholungsbedarf.
- 8.3.3 Kompetenzbericht je Schüler als Ausdruck/Export.
9. Dashboard
Basis vorhanden in DashboardViewModel.cs.
Kleiner Monatskalender ist bereits umgesetzt (Farbcodierung Unterricht/Klausur,
Hervorhebung "eigene Klasse" über LearningGroup.IsOwnClass, feste Kartenbreite/-position).
- 9.1 Heutige Stunden mit Uhrzeit und Raum anzeigen (Abhängigkeit zu 4.3).
- 9.2 Direkter Absprung von einer Stunde in Mitarbeitserfassung bzw. Stundenplanung.
- 9.3 Kachel "Anstehende Termine": Klausuren, Förderplan-Überprüfungen, Abgabefristen.
- 9.4 Kachel "Offene Korrekturen" mit Fortschritt (x von y Klausuren bewertet).
- 9.5 Kachel "Auffälligkeiten": Fehlzeitenüberschreitungen, Notenabfall, Versetzungsgefährdung.
- 9.6 Dashboard-Kacheln ein-/ausblendbar und in der Reihenfolge konfigurierbar.
- 9.7 Automatische Aktualisierung beim Zurücknavigieren (aktuell nur manueller Refresh).
- 9.8 Kalender-Detailansicht: Tag im Monatskalender anklickbar/auswählbar, zeigt in einem angrenzenden Feld die Termine dieses Tages (Unterricht, Klausuren, perspektivisch Konferenzen/Sondertermine) mit Details und Sprungmöglichkeit in die jeweilige Ansicht. Sinnvoll erst, wenn weitere Terminarten existieren — Abhängigkeit zu Kapitel 4 (Unterrichtsplanung/Termine) sowie ggf. einem neuen Termine-Modell.
10. Sync & Server
Grundgerüst existiert in LehrerApp.Sync und LehrerApp.Api, ist aber nur aktiv, wenn eine Server-URL konfiguriert ist.
10.1 Client
- 10.1.1 Sync-Einrichtung in den Einstellungen: Server-URL, Login, Token speichern.
- 10.1.2 Verbindungstest mit klarer Fehlermeldung (nicht erreichbar / Token ungültig).
- 10.1.3 Konfliktanzeige in der UI — was
ConflictResolverentscheidet, muss sichtbar sein. - 10.1.4 Manuelles Auslösen einer vollständigen Synchronisation.
- 10.1.5 Statusanzeige erweitern: letzter Sync, Anzahl wartender Events, Fehlerzustand.
10.2 Server
- 10.2.1 Benutzerverwaltung/Registrierung prüfen und absichern (Endpoints.cs).
- 10.2.2 Rate Limiting und Request-Größenbegrenzung.
- 10.2.3 Serverseitiges Backup der Event-/Snapshot-Dateien.
- 10.2.4 Docker-Setup in docker/ verifizieren und dokumentieren.
10.3 Verschlüsselung
- 10.3.1 Schlüsselübertragung auf ein zweites Gerät (QR-Code oder Passphrase).
- 10.3.2 Warnung und Wiederherstellungspfad bei verlorenem Schlüssel.
- 10.3.3 Prüfen, welche Daten unverschlüsselt über
PlainEventStorelaufen — personenbezogene Daten dürfen das nicht.
11. Export, Druck & Berichte
Bisher nicht vorhanden — komplett neu.
- 11.1 Basisinfrastruktur: Export-Service mit Formatwahl und Speicherdialog.
- 11.2 CSV-Export für Notenlisten, Klausurauswertung, Arbeitszeit, Fehlzeiten.
- 11.3 PDF-Erzeugung (Bibliothek auswählen — z.B. QuestPDF) mit einheitlichem Layout.
- 11.4 Druckvorlagen: Notenliste, Klausur-Notenspiegel, Sitzplan, Kompetenzbericht, Schülerdokumentation.
- 11.5 Serienbrief/Elternbrief aus Kontaktdaten (Abhängigkeit zu 7.1.4).
- 11.6 Vollständiger Datenexport eines Schuljahres (Archivierung).
12. Einstellungen & Stammdaten
Fächer- und Kompetenzverwaltung existiert bereits in SettingsView.axaml.
- 12.1 Lehrerprofil: Name, Kürzel, Schule, Pflichtstundenzahl.
- 12.2 Schuljahr-Einstellungen: Beginn/Ende, Halbjahresgrenze, Ferien
(
SchoolYearServiceerweitern). - 12.3 Standard-Notenschlüssel und Standard-Gewichtungsschema hinterlegen (2.3.3, 1.3.2).
- 12.4 Darstellung: Hell/Dunkel-Modus, Schriftgröße.
- 12.5 Speicherort der Datenbank anzeigen und ändern.
- 12.6 Backup-Verwaltung (siehe 13.3) in den Einstellungen zugänglich machen.
13. Technische Basis
13.1 Tests
- 13.1.1 Testprojekt
LehrerApp.Testsangelegt (referenziertLehrerApp.Core, analog zu LehrerApp.Data.Tests für die Datenschicht). Noch ohne Testfälle — folgt mit 13.1.2ff. - 13.1.2 Unit-Tests für
GradingService(Notenschlüssel-Grenzfälle, gewichteter Schnitt) — 41 Tests in GradingServiceTests.cs, decktCalculateGrade,ValidateGradingKey,WeightedAverage,RoundToGrade,ParticipationGrade,ValidateGradingSchemeundCalculateReportGradeab. - 13.1.3 Unit-Tests für
SchoolYearService(Jahreswechsel, Schuljahresgrenze) — 13 Tests in SchoolYearServiceTests.cs. DafürCurrentSchoolYear/RecentSchoolYearsum ein optionalestoday-Parameter erweitert (Default weiterhinDateTime.Today), um den 1.-August-Wechsel deterministisch zu testen, ohne bestehende Aufrufer zu ändern. - 13.1.4 Repository-Tests gegen eine In-Memory-LiteDB —
LiteDbContextum einenStream-Konstruktor erweitert (new LiteDatabase(stream), kein Datei-I/O nötig), 19 Tests in RepositoryTests.cs: u.a. Kaskadenlöschung beiGroupRepository.Delete/ExamRepository.Delete/ParticipationSessionRepository.Delete, Eindeutigkeitsprüfungen (GroupMembership,ParticipationEntry), Fach-Validierung (Trimmen, Duplikate, Löschsperre bei Verwendung),GradingScheme-Auflösung gruppenspezifisch vs. Voreinstellung. - 13.1.5 Tests für die Mitarbeits-Aggregation (3.2) und Zeugnisnotenberechnung (2.4) —
neues Testprojekt
LehrerApp.Desktop.Tests(referenziertLehrerApp.Desktop, damit ViewModel-Logik ohne echtes UI getestet werden kann), gemeinsame Fakes in Fakes.cs. 9 Tests für ParticipationGradeAggregationTests.cs (gewichtetes Mittel, "nicht bewertet" ≠ schlechte Note, Trend, Aspektgewicht 0, Halbjahresfilter, Übernehmen-Update-statt-Duplikat) und 9 für ReportGradeCalculationTests.cs (Schema-Auflösung gruppenspezifisch/Voreinstellung/Fallback, Pflicht-Begründung beim Übersteuern, Festschreiben friert den Stand ein, Rundungsregel). - 13.1.6 Tests für
ConflictResolver— neues TestprojektLehrerApp.Sync.Tests, 10 Tests in ConflictResolverTests.cs (Desktop schlägt Companion immer, Gleichstand nach Zeitstempel, kein Konflikt bei unterschiedlicher Entität/gleichem Gerät). Dabei zwei echte Fehler gefunden und behoben: (1)SyncEventhatte keine[BsonId]-Markierung aufEventId— LiteDB vergab dadurch einen eigenen, unabhängigen_id, wodurchEventQueue.Acknowledge()nie etwas aus der Queue löschte (verlorene Konflikte blieben für immer offen). (2)ConflictResolververglichlocal.Timestamp(aus LiteDB,Kind=Localmit verschobenen Ticks) direkt mitremote.Timestamp(Kind=Utc) —DateTime-Vergleiche ignorierenKindund vergleichen nur rohe Ticks, wodurch die Gleichstand-Regel außerhalb von UTC+0 falsch entschied. Fix:.ToUniversalTime()auf beiden Seiten vor dem Vergleich.
13.2 Fehlerbehandlung & Logging
- 13.2.1 Zentrale Exception-Behandlung mit verständlicher Fehlermeldung statt Absturz —
GlobalExceptionHandler.cs.
Dispatcher.UIThread.UnhandledExceptionfängt Fehler aus Befehlen/Ereignis-Handlern auf dem UI-Thread ab, protokolliert sie und setztHandled = true— die App stürzt dabei nachweislich nicht ab (per Headless-Test verifiziert: Fehler in einem Dispatcher-Callback wird geloggt + als Toast angezeigt, App läuft weiter).AppDomain.UnhandledExceptionundTaskScheduler.UnobservedTaskExceptionsind Sicherheitsnetze für Fehler außerhalb des UI-Threads — dort kann ein bereits "IsTerminating"-Fehler nicht mehr verhindert werden, wird aber vollständig protokolliert. - 13.2.2 Logging in Datei im App-Datenverzeichnis, mit Rotation —
AppLogger.cs, tägliche Datei unter
<AppData>/LehrerApp/logs/, Dateien älter als 14 Tage werden beim Start gelöscht. 6 Tests in AppLoggerTests.cs. - 13.2.3 Einheitliche Benachrichtigungen (Toast/Snackbar) für Erfolg und Fehler —
NotificationService.cs, Overlay unten
rechts in MainWindow.axaml, blendet sich nach
3 s (Erfolg) bzw. 6 s (Fehler) automatisch aus. Aktuell an den globalen Exception-Handler
angebunden; bestehende Dialoge zeigen Erfolg/Fehler weiterhin über ihre eigenen
Statuszeilen (
StatusMessage/ValidationMessage) — eine Umstellung dieser bestehenden Stellen auf Toasts wäre ein eigener, größerer Umbau über viele Dateien hinweg und ist bewusst nicht Teil dieser Aufgabe. - 13.2.4 Validierungsmeldungen einheitlich an den Eingabefeldern statt in Sammel-Labels.
Alle Dialoge mit Formularfeldern umgestellt:
AddStudentDialog,ContactEditDialog,AddGroupDialog,StudentGradesDialog(GradeEditItem),CollectiveGradeDialog,ExamDialog,AddSessionDialog,ParticipationWizardDialog(Abschnitt-Formular), Einstellungen (Fach anlegen, Notenschlüssel-Vorlage anlegen, Notenschlüssel-Editor). Muster: pro Feld eine{Feld}Error-Property,Save()leert alle Fehler-Properties am Anfang, sammelt alle Verstöße über eine lokalevalid-Variable statt beim ersten Fehler zurückzukehren, und bricht erst am Ende mitif (!valid) return;ab — so werden mehrere Fehler gleichzeitig angezeigt. Bewusst als Sammel-Meldung belassen, wo die Meldung sich auf eine Kombination mehrerer Felder bezieht statt auf ein einzelnes Feld:GradingKeyValidation(Notenschlüssel-Tabelle als Ganzes),GradingSchemeEditItem.ValidationMessage(Summe der drei Prozent-Felder muss 100 ergeben),ReportGradeRow.ValidationMessage(Override-Wert + Begründung gehören zusammen),CatalogValidation(Kompetenzkatalog-Panel: Fachauswahl, Bereichsname und JSON-Import teilen sich einen Status-Bereich),AddStudentToGroupDialogViewModel.ValidationMessage(einzige Prüfung "Schüler ausgewählt?", kein Textfeld zum Andocken vorhanden).
13.3 Datensicherheit
- 13.3.1 Automatisches lokales Backup der LiteDB beim Start (rollierend, letzte 10) —
BackupService.cs. Reine Dateikopie nach
<AppData>/LehrerApp/backups/, läuft inAppBootstrapper.BuildServices()vor dem Öffnen der Datenbank (unabhängig von Verschlüsselung, kein LiteDB-Handle nötig). Behält standardmäßig die letzten 10 Backups, ältere werden entfernt. 6 Tests in BackupServiceTests.cs. - 13.3.2 Wiederherstellung aus einem Backup über die Einstellungen — neuer Tab
"Sicherheit" in SettingsView.axaml
listet vorhandene Backups mit Zeitstempel/Größe, "Wiederherstellen" fragt über einen neuen
generischen ConfirmDialog nach,
kopiert das Backup über die aktive Datenbankdatei und startet die App danach automatisch
neu (
AppBootstrapper.RestartApplication()) — ein laufender LiteDB-Verbindung kann nicht sicher "heiß" auf eine andere Datei umgehängt werden. - 13.3.3 Schema-Migration mit Versionsnummer —
LiteDbContextschreibt die Schema-Version in einemeta-Collection und führt Migrationsschritte nur noch aus, wenn die gespeicherte Version dahinter liegt (RunVersionedMigrations), statt wie bisher bei jedem Start erneut über alle Daten zu laufen. Die bestehenden (bereits idempotenten) Migrationsschritte wurden als Version-1-Schritt gebündelt, für zukünftige Schema-Änderungen ergänzt man einen weiterenif (version < N)-Block. 2 Tests in LiteDbContextTests.cs. - 13.3.4 Optionale Verschlüsselung der lokalen Datenbank —
DatabaseEncryptionService.cs. Passwort
setzen/ändern/entfernen läuft über eine Kopie (neue Datei mit Zielpasswort anlegen, alle
Collections umkopieren, Datei austauschen) statt über
LiteDatabase.Rebuild(...)mit Passwort — das ist in LiteDB 5.0.21 nachweislich fehlerhaft (per Skript verifiziert: wirft "this data file is encrypted" beim Rebuild einer unverschlüsselten Datei). Ist die Datenbank verschlüsselt, fragt ein eigenes Fenster (DbPasswordPromptWindow) das Passwort ab, bevorAppBootstrapper.BuildServices()(und damit das Öffnen der Datenbank) läuft — sieheApp.axaml.cs. Ändern/Entfernen des Passworts läuft über Einstellungen → Sicherheit, jeweils mit Neustart der App danach. 4 Tests in DatabaseEncryptionServiceTests.cs. - 13.3.5 App-Sperre nach Inaktivität —
AppLockService.cs (eigenes, gesalzenes
PBKDF2-Passwort, unabhängig von einer eventuellen Datenbank-Verschlüsselung) +
AppLockViewModel.cs (Inaktivitäts-Timer,
Sperrbildschirm-Logik). Maus-/Tastatureingaben im Hauptfenster setzen den Timer zurück
(MainWindow.axaml.cs); läuft er ab, blendet
ein Overlay in MainWindow.axaml die gesamte
Oberfläche aus, bis das Passwort stimmt. Einstellbar (aktiv/inaktiv, Zeit, Passwort) über
Einstellungen → Sicherheit, wirkt sofort ohne Neustart. 2 Tests in
AppLockViewModelTests.cs (reine
Unlock-Logik; der zeitbasierte Inaktivitäts-Timer selbst ist nicht automatisiert getestet).
Hinweis:
RestartApplication()startet den Prozess überEnvironment.ProcessPathneu — im veröffentlichten Programm korrekt, im Entwicklungsbetrieb überdotnet runzeigtProcessPathauf dendotnet-Host statt auf die App, ein Neustart über die Einstellungen ist dort also nur in einer veröffentlichten Build (dotnet publish) sinnvoll zu testen.
13.4 Codepflege
- 13.4.1
CLAUDE.mdmit Projektkonventionen anlegen (/init). - 13.4.2
AllRepositories.csundIRepositories.csin Themendateien aufteilen, sobald weitere Repositories dazukommen. - 13.4.3 Wiederkehrende UI-Muster (Suchleiste, Kopfzeile, leere Liste) als
wiederverwendbare Controls in
Views/Shared/. - 13.4.4 Konverter und Styles zentralisieren (aktuell teils inline in den Views).
14. UX-Querschnitt
- 14.1 Tastaturbedienung durchgängig: alle Hauptfunktionen ohne Maus erreichbar (Vorbild: Mitarbeit-Schnelleingabe).
- 14.2 Globale Suche (Schüler, Gruppe, Klausur) über Tastenkürzel.
- 14.3 Rückgängig-Funktion für Löschvorgänge (mindestens Bestätigungsdialog überall).
- 14.4 Ladeanzeigen bei längeren Operationen (Import, Sync, Export).
- 14.5 Leere Zustände mit Handlungsaufforderung statt leerer Tabellen.
- 14.6 Fenstergröße und Spaltenbreiten über Sitzungen hinweg merken.
- 14.7 Bedienung auf Touch-Geräten prüfen (Tablet im Unterricht).
15. Auslieferung
- 15.1 Release-Build und Signierung für macOS.
- 15.2 Windows-Build prüfen (Zielplattform klären).
- 15.3 Versionierung und Changelog-Pflege.
- 15.4 Update-Mechanismus oder zumindest Versionsprüfung beim Start.
- 15.5 Kurze Bedienanleitung für den Eigengebrauch.
Empfohlene Reihenfolge
Die Abschnitte sind thematisch, nicht chronologisch nummeriert. Sinnvolle Bearbeitungsreihenfolge:
- Kapitel 1 (Klausuren) — größte funktionale Lücke, viele andere Punkte hängen daran.
- Kapitel 3.2 (Mitarbeit-Aggregation) — kurz, macht das bestehende Feature erst nutzbar.
- Kapitel 2 (Noten & Zeugnisnoten) — braucht 1 und 3.2 als Datenquellen.
- Kapitel 13.1–13.2 (Tests, Fehlerbehandlung) — bevor die Codebasis weiter wächst.
- Kapitel 4 (Planung) und Kapitel 5 (Dokumentation) — unabhängig, gut parallelisierbar.
- Kapitel 6 (Arbeitszeit), 11 (Export), 10 (Sync) — danach.