feat: PDF-Druck für Sitzplan, Notenliste, Klausur-Notenspiegel, Kompetenzbericht, Dokumentation

QuestPDF als PDF-Bibliothek eingeführt (11.3), bewusst nur in LehrerApp.Desktop referenziert -
zieht SkiaSharp-Native-Binaries mit, die im Server-Docker-Image nichts verloren haben. Neuer
PdfExportService mit gemeinsamem Kopf-/Fußzeilen-Layout (Titel, Stand-Datum, Seitenzahlen) und
schlanken Druck-DTOs statt ViewModels, damit die Erzeugung ohne Avalonia-Bezug testbar bleibt.
Speicherdialog läuft über den bestehenden ExportService (neues PDF-Format).

Fünf Druckvorlagen (11.4) als "Als PDF"-Button direkt in der jeweiligen Ansicht:
- Sitzplan: Raster mit Tafel-Banner, Tischabständen als echte Lücken, ausgeblendeten Plätzen als
  leere Rasterposition.
- Notenliste: druckt exakt die aktuell angezeigte Matrix (Zeitraum/Darstellung/Sortierung).
- Klausur-Notenspiegel: Kennzahlen, Notenverteilung und Aufgabenanalyse mit Balkendiagrammen,
  auffällig schwache Aufgaben rot markiert.
- Kompetenzbericht: Analyse-Tabelle für den ausgewählten Schüler (erledigt zugleich 8.3.3).
- Schülerdokumentation: alle Einträge chronologisch, vertrauliche/Entwurfs-Einträge markiert.

Layout an gerenderten Muster-PDFs visuell geprüft, nicht nur per Unit-Test.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-20 14:27:05 +02:00
co-authored by Claude Sonnet 5
parent 4cce84c7dd
commit 7365947edc
18 changed files with 785 additions and 15 deletions
+59 -7
View File
@@ -1397,9 +1397,23 @@ Hinweis in Kapitel 1 — betrifft auch Kurse, nicht nur Klassen.
in eine aktive Gruppe bleiben möglich.
### 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.
Nachträglich als erledigt markiert — die Umsetzung existierte bereits vollständig
(`StudentImportService`, `Core/Importing/`, `StudentImportDialogViewModel`), nur die Checkliste
war nie nachgezogen worden.
- [x] **7.3.1** CSV-Import von Schülerlisten. Abweichend vom ursprünglichen Plan keine manuelle
Spaltenzuordnung im Dialog, sondern drei fest hinterlegte, automatisch erkannte Formate
(`StudentMasterDataCsvImportHandler`, `LessonStudentListCsvImportHandler`,
`MarksPerLessonCsvImportHandler` über `ImportHandlerCatalog`) — deckt die real
vorkommenden Schulverwaltungs-Exporte ab, ohne Zuordnungs-UI.
- [x] **7.3.2** Dublettenerkennung mit Konfliktauflösung im Dialog: eindeutige Treffer werden
automatisch als "vorhanden" übernommen (`StudentImportResolutionKind.UseExisting`),
mehrdeutige Fälle als `ImportConflict` einzeln entschieden (bestehenden Schüler wählen /
neu anlegen / überspringen), inkl. "für alle übernehmen"-Abkürzung.
- [x] **7.3.3** Import-Vorschau (`StudentImportPreview`) mit Meldungsliste nach Schweregrad —
Fehler blockieren das Übernehmen (`CanApply`), dazu Zusammenfassung (neu / vorhanden / zu
ergänzen) und Lerngruppen-Zuordnungsübersicht vor dem endgültigen Übernehmen.
---
@@ -1439,7 +1453,9 @@ Format dokumentiert in [Kompetenzkatalog-KI-Prompt.md](docs/Kompetenzkatalog-KI-
- [x] **8.3.2** Gruppenübersicht: durchschnittlicher Erfüllungsgrad je Kompetenz,
Identifikation von Wiederholungsbedarf. Gruppenmittel, Zahl der beteiligten Schüler und
Aufgabenwerte werden angezeigt; die Schwelle für Wiederholungsbedarf ist frei einstellbar.
- [ ] **8.3.3** Kompetenzbericht je Schüler als Ausdruck/Export.
- [x] **8.3.3** Kompetenzbericht je Schüler als Ausdruck/Export — umgesetzt als PDF-Druckvorlage
der Kompetenzübersicht (Details siehe 11.4, "Kompetenzbericht"): druckt die Analyse für
den aktuell im Tab ausgewählten Schüler.
---
@@ -2107,9 +2123,45 @@ beides vor dem ersten produktiven Zwei-Geräte-Einsatz empfehlenswert nachzuhole
- [~] **11.2** CSV-Export für Notenlisten, Klausurauswertung, Arbeitszeit, Fehlzeiten —
Klausurauswertung, Zeugnisnotenliste und Arbeitszeitauswertung sind umgesetzt; allgemeine
Notenmatrix und Fehlzeitenbilanz fehlen noch.
- [ ] **11.3** PDF-Erzeugung (Bibliothek auswählen — z.B. QuestPDF) mit einheitlichem Layout.
- [ ] **11.4** Druckvorlagen: Notenliste, Klausur-Notenspiegel, Sitzplan, Kompetenzbericht,
Schülerdokumentation.
- [x] **11.3** PDF-Erzeugung mit einheitlichem Layout.
**Umsetzung:** QuestPDF (Community-Lizenz, in `Directory.Packages.props` gepinnt),
referenziert **nur von `LehrerApp.Desktop`** — bewusst nicht von Core: QuestPDF zieht
SkiaSharp-Native-Binaries mit, die sonst transitiv (Core → Sync → Api) im
Server-Docker-Image landen würden. Neuer `PdfExportService`
(`Desktop/Services/PdfExportService.cs`) mit gemeinsamen Layout-Bausteinen (Kopfzeile mit
Titel/Untertitel/Stand-Datum, Fußzeile mit Seitenzahlen, A4 quer) und schlanken Druck-DTOs
statt ViewModels — die Erzeugung bleibt dadurch ohne Avalonia-Bezug testbar
(`PdfExportServiceTests`, Layout zusätzlich an gerenderten Muster-PDFs visuell geprüft).
Der Speicherdialog läuft über den bestehenden `ExportService` (neues Format
`ExportFormat.Pdf` + `ExportFile.Pdf`).
- [x] **11.4** Druckvorlagen: Notenliste, Klausur-Notenspiegel, Sitzplan, Kompetenzbericht,
Schülerdokumentation — alle fünf umgesetzt, jeweils als "Als PDF"-Button direkt in der
zugehörigen Ansicht, alle über `PdfExportService` (11.3) mit einheitlichem Kopf/Fuß-Layout.
**Sitzplan** (Kopfzeile des Sitzplan-Tabs): druckt das Raster mit Tafel-Banner an der
konfigurierten Position, Tischabständen als echte Lücken (Spaltenbreiten analog
`SeatingPlanPanel`), ausgeblendeten Plätzen als leere Rasterposition (Reihen verrutschen
nicht) und freien Plätzen dezent markiert — gedacht z. B. für Vertretungslehrer oder
Klausuraufsicht.
**Notenliste** (Werkzeugleiste der Notenübersicht): druckt exakt die aktuell angezeigte
Matrix (gewählter Zeitraum, Punkte-/Noten-Darstellung, Sortierung) mit Namens-, Noten-
und Schnitt-Spalten — gedacht z. B. für die Zeugniskonferenz.
**Klausur-Notenspiegel** (Fußleiste des Klausurauswertungs-Dialogs, neben dem
CSV-Export): Kennzahlen (bewertet/abwesend/Durchschnitt/Median/Schwellen je nach
Notensystem), Notenverteilung und Aufgabenanalyse jeweils mit Balkendiagramm; auffällig
schwache Aufgaben (< 50 %) rot markiert — gedacht z. B. für die Klausurrückgabe oder die
Dokumentationspflicht gegenüber der Schulleitung.
**Kompetenzbericht** (Kopfzeile der Kompetenzübersicht): druckt die Analyse-Tabelle für
den aktuell ausgewählten Schüler (Bereich/Code/Kompetenz, Unterrichts- und
Klausurabdeckung, Gruppen- vs. Schülerergebnis, farbige Empfehlung) samt
Schwellenwert-Angabe — erledigt zugleich 8.3.3.
**Schülerdokumentation** (Kopfzeile der Eintragsliste im Schülerdetail): druckt alle
Einträge chronologisch als Blöcke mit Typ/Datum, Inhalt und Tags; vertrauliche Einträge
und Entwürfe sind deutlich markiert — vertrauliche Inhalte werden bewusst MIT gedruckt
(der Ausdruck ist ein Werkzeug der Lehrkraft selbst, z. B. zur Vorbereitung eines
Elterngesprächs), die Markierung erinnert an die nötige Sorgfalt beim Umgang mit dem
Papier.
- [x] **11.5a** Einzelner Elternbrief als bearbeitbare DOCX-Kopie aus einer in Word gestalteten
Vorlage. Vorlagenverwaltung in den Einstellungen; das Original bleibt unverändert. Vor
Import und erneut vor jeder Erzeugung werden Inhaltssteuerelemente auch in Kopf-/Fußzeilen