From b9d6041f3b470a655e6a4326e39ad3e39f5d6665 Mon Sep 17 00:00:00 2001 From: Florian Wilde Date: Thu, 10 Sep 2026 21:00:30 +0200 Subject: [PATCH] Baustein 6: Checklisten mit Durchlaeufen und PDF-Export - Durchlauf aus einer Vorlage, mit Datum, Ticket und Kunde - Schritt fuer Schritt abhaken, Bemerkung je Schritt - Fortschritt gesamt und je Gruppe (Vorbereiten/Durchfuehren/Pruefen/Abschliessen) - Abschliessen erst, wenn alles abgehakt ist; Meldung nennt die offenen Schritte - Abgeschlossene Durchlaeufe sind gesperrt und bleiben als Nachweis - Titel und Schritttexte werden beim Start kopiert, nicht verwiesen - PDF-Export mit gezeichneten Ankreuzkaestchen und Unterschriftenzeilen - Gemeinsame PDF-Grundlage fuer alle kuenftigen Ausgaben - Ausbilder liest mit und darf das PDF abrufen, hakt aber nicht ab - Abgeschlossene Durchlaeufe zaehlen im Wochenfortschritt mit Behoben beim Durchstich: Die Fusszeile wurde unterhalb des Satzspiegels gesetzt, wodurch PDFKit je Fusszeile eine leere Seite anhaengte - aus zwei Seiten wurden sechs. Ein Test zaehlt jetzt die Seitenobjekte im PDF. 29 neue Tests, insgesamt 186. Co-Authored-By: Claude Opus 5 --- CHANGELOG.md | 38 +++ DEVLOG.md | 35 +++ ENTSCHEIDUNGEN.md | 49 ++++ README.md | 7 +- ROADMAP.md | 9 +- docs/beispiel-checkliste.pdf | Bin 0 -> 7077 bytes docs/bilder/02-ausbilder-ueberblick.png | Bin 52588 -> 53515 bytes docs/bilder/03-verwaltung.png | Bin 85498 -> 86298 bytes docs/bilder/04-wochenplan.png | Bin 173157 -> 174488 bytes docs/bilder/05-aufgabe-abnahme.png | Bin 224145 -> 225176 bytes docs/bilder/10-azubi-woche.png | Bin 128350 -> 128954 bytes docs/bilder/11-handouts-liste.png | Bin 127371 -> 127855 bytes docs/bilder/12-handouts-suche.png | Bin 32488 -> 32995 bytes docs/bilder/13-handout-n3.png | Bin 167623 -> 168087 bytes docs/bilder/14-merkkarten.png | Bin 76865 -> 77465 bytes docs/bilder/15-glossar.png | Bin 278222 -> 278906 bytes docs/bilder/16-aufgaben-liste.png | Bin 43377 -> 44165 bytes docs/bilder/17-aufgabe-azubi.png | Bin 178790 -> 179665 bytes docs/bilder/18-checklisten.png | Bin 0 -> 105643 bytes docs/bilder/19-checklisten-lauf.png | Bin 0 -> 172074 bytes docs/bilder/20-dunkel.png | Bin 141002 -> 141473 bytes docs/bilder/30-handy-handout.png | Bin 512272 -> 512347 bytes docs/bilder/31-handy-lernmodus-frage.png | Bin 76483 -> 76644 bytes docs/bilder/32-handy-lernmodus-antwort.png | Bin 102701 -> 102858 bytes scripts/screenshots.ts | 11 + .../(angemeldet)/checklisten/Formulare.tsx | 174 ++++++++++++ src/app/(angemeldet)/checklisten/aktionen.ts | 166 +++++++++++ .../checklisten/lauf/[laufId]/page.tsx | 233 +++++++++++++++ .../checklisten/lauf/[laufId]/pdf/route.ts | 55 ++++ src/app/(angemeldet)/checklisten/page.tsx | 159 +++++++++++ src/app/(angemeldet)/layout.tsx | 2 + src/app/globals.css | 117 ++++++++ src/lib/checklisten/fortschritt.test.ts | 136 +++++++++ src/lib/checklisten/fortschritt.ts | 116 ++++++++ src/lib/db/migrationen/0006_checklisten.sql | 40 +++ src/lib/db/schema.ts | 47 ++++ src/lib/pdf/checkliste.test.ts | 127 +++++++++ src/lib/pdf/checkliste.ts | 124 ++++++++ src/lib/pdf/grundlage.ts | 265 ++++++++++++++++++ src/lib/planung/sicht.ts | 6 +- src/lib/repos/checklisten.ts | 163 +++++++++++ 41 files changed, 2074 insertions(+), 5 deletions(-) create mode 100644 docs/beispiel-checkliste.pdf create mode 100644 docs/bilder/18-checklisten.png create mode 100644 docs/bilder/19-checklisten-lauf.png create mode 100644 src/app/(angemeldet)/checklisten/Formulare.tsx create mode 100644 src/app/(angemeldet)/checklisten/aktionen.ts create mode 100644 src/app/(angemeldet)/checklisten/lauf/[laufId]/page.tsx create mode 100644 src/app/(angemeldet)/checklisten/lauf/[laufId]/pdf/route.ts create mode 100644 src/app/(angemeldet)/checklisten/page.tsx create mode 100644 src/lib/checklisten/fortschritt.test.ts create mode 100644 src/lib/checklisten/fortschritt.ts create mode 100644 src/lib/db/migrationen/0006_checklisten.sql create mode 100644 src/lib/pdf/checkliste.test.ts create mode 100644 src/lib/pdf/checkliste.ts create mode 100644 src/lib/pdf/grundlage.ts create mode 100644 src/lib/repos/checklisten.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index c043235..5cedf55 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,43 @@ Vor `npm version` wandert der Abschnitt „Unveröffentlicht" unter eine neue ## [Unveröffentlicht] +## [0.6.0] – 2026-09-10 + +Checklisten mit Durchläufen – und der erste PDF-Export. + +### Hinzugefügt + +- Aus einer Checklistenvorlage wird ein **Durchlauf**, der zu einem Datum und + wahlweise zu einem Ticket und einem Kunden oder Bereich gehört +- Schritt für Schritt abhaken, je Schritt eine Bemerkung +- Fortschritt gesamt **und je Gruppe** (Vorbereiten, Durchführen, Prüfen, + Abschließen), jeweils als Balken mit Zahlen +- Ein Durchlauf lässt sich erst abschließen, wenn jeder Schritt abgehakt ist; + die Meldung nennt, wie viele Schritte noch offen sind +- Abgeschlossene Durchläufe sind gesperrt und lassen sich nicht löschen – sie + sind der Nachweis. Wieder öffnen geht, verwerfen nur, solange nichts abgehakt ist +- **PDF-Export** eines Durchlaufs: Kopfangaben, alle Gruppen mit gezeichneten + Ankreuzkästchen, Bemerkungen, Unterschriftenzeilen für Bearbeiter und + Ausbilder, Fußzeile mit Herkunft und Seitenzahl +- Gemeinsame PDF-Grundlage (`src/lib/pdf/grundlage.ts`) für alle künftigen + Ausgaben – das Berichtsheft setzt darauf auf +- Der Ausbilder sieht die Durchläufe seiner Azubis und kann das PDF abrufen, + hakt aber nichts für sie ab: Im Nachweis soll keine Arbeit stehen, die der + Azubi nicht gemacht hat +- Titel und Schritttexte werden beim Start aus der Vorlage **kopiert**. Ein + abgeschlossener Durchlauf bleibt damit lesbar, auch wenn die Vorlage im + Repository später geändert oder gelöscht wird +- Abgeschlossene Durchläufe zählen im Wochenfortschritt mit +- 29 Tests für Gruppenfortschritt, Abschlussregel, PDF-Erzeugung und + Zeichenvorrat + +### Angemerkt + +- Die PDF-Ausgabe nutzt die Standardschriften jedes Betrachters (Helvetica). + Das spart eine eingebettete Schriftdatei, beschränkt den Zeichenvorrat aber + auf WinAnsi. Umlaute, ß, €, § und ° sind enthalten; Zeichen wie ✓, ○ oder ▲ + nicht. `fuerPdf()` ersetzt sie, Ankreuzkästchen und Haken werden **gezeichnet** + ## [0.5.0] – 2026-09-10 Praxisaufgaben: bearbeiten, belegen, abnehmen. @@ -230,6 +267,7 @@ anmelden und verwalten. - `npm run konto:anlegen` für das erste Ausbilderkonto [Unveröffentlicht]: #unveröffentlicht +[0.6.0]: #060--2026-09-10 [0.5.0]: #050--2026-09-10 [0.4.0]: #040--2026-09-10 [0.3.0]: #030--2026-09-10 diff --git a/DEVLOG.md b/DEVLOG.md index ec05a01..c78a95a 100644 --- a/DEVLOG.md +++ b/DEVLOG.md @@ -7,6 +7,41 @@ Format: `HH:MM–HH:MM (Dauer) · was gemacht wurde` --- +## 2026-09-10 · Baustein 6 – Checklisten und PDF + +| Von | Bis | Dauer | Tätigkeit | +|---|---|---|---| +| 20:35 | 20:42 | 0:07 | Datenmodell, Migration, Schema | +| 20:42 | 20:48 | 0:06 | Gruppenfortschritt als reine Rechnung, 16 Tests | +| 20:48 | 20:52 | 0:04 | PDF-Grundlage und Checklisten-PDF | +| 20:52 | 21:00 | 0:08 | Repository, Aktionen, Seiten, PDF-Route | +| 21:00 | 21:10 | 0:10 | Durchstich; PDF gerendert und den Fußzeilenfehler gefunden | +| 21:10 | 21:20 | 0:10 | Fehler behoben, Regressionstest, Dokumente | + +**Summe Baustein 6: rund 45 min** + +### Was aufgefallen ist + +- **Das PDF hatte sechs Seiten, vier davon leer.** Aufgefallen ist das erst + beim Ansehen – die Prüfung „Status 200, Content-Type application/pdf" war + grün. Ursache: Die Fußzeile wird unterhalb des Satzspiegels gesetzt, und + PDFKit hält das für überlaufenden Text und legt eine neue Seite an. Bei zwei + Seiten mal zwei Textaufrufen macht das vier leere Seiten. Behoben, indem der + untere Rand für die Dauer der Fußzeile auf 0 gesetzt wird. Ein Test zählt + jetzt die Seitenobjekte im PDF und hätte den Fehler gefunden. +- Headless-Chromium rendert keine PDFs. Für den Blick aufs Ergebnis musste + der Browser mit Fenster starten (`headless: false`) – auf diesem Rechner + geht das, auf einem Server nicht. Für die spätere Prüfstrecke heißt das: + Seitenzahl und Inhalt maschinell prüfen, das Aussehen von Hand. +- Titel und Schritttexte werden beim Start des Durchlaufs kopiert statt + verwiesen. Ein Nachweis, der sich rückwirkend ändert, wenn jemand die + Vorlage anfasst, wäre keiner. +- Der Ausbilder darf das PDF abrufen und mitlesen, aber nicht abhaken. Erst + beim Schreiben der Aktion ist mir aufgefallen, dass „darf sehen" und „darf + bearbeiten" hier auseinanderfallen – daher zwei getrennte Prüffunktionen. + +--- + ## 2026-09-10 · Baustein 5 – Praxisaufgaben | Von | Bis | Dauer | Tätigkeit | diff --git a/ENTSCHEIDUNGEN.md b/ENTSCHEIDUNGEN.md index f0add15..8632e14 100644 --- a/ENTSCHEIDUNGEN.md +++ b/ENTSCHEIDUNGEN.md @@ -208,3 +208,52 @@ Der Abstand ist Absicht: Eine zu große Datei soll die **eigene**, verständlich Meldung bekommen und nicht den Rumpfgrößenfehler des Gerüsts, der nur im Serverprotokoll auftaucht. Zusätzlich prüft der Browser vorab, damit am Mobilfunk nicht erst 30 MB übertragen und dann abgelehnt werden. + +## E23 · PDF mit Standardschriften statt eingebetteter Schrift + +Die PDF-Ausgabe benutzt Helvetica, also eine der Schriften, die jeder +PDF-Betrachter mitbringt. Das spart eine eingebettete Schriftdatei im +Repository und hält die Dateien klein (ein Checklistenblatt wiegt rund 7 KB). + +Der Preis ist der Zeichenvorrat **WinAnsi**. Enthalten sind alle deutschen +Umlaute, ß, €, § und °. Nicht enthalten sind Zeichen wie ✓, ○, ▲ oder Emoji. +Deshalb: + +- `fuerPdf()` ersetzt typografische Feinheiten (Anführungszeichen, + Auslassungspunkte, geschützte Leerzeichen) und wirft nicht Darstellbares weg. +- Ankreuzkästchen und Haken werden **gezeichnet**, nicht gesetzt. Das sieht in + jedem Betrachter gleich aus und ist unabhängig von der Schrift. + +Sollte später ein Zeichen außerhalb von WinAnsi wirklich gebraucht werden, ist +der Weg das Einbetten einer freien Schrift – nicht das Aufweichen dieser Regel. + +## E24 · Fußzeilen brauchen einen aufgehobenen unteren Rand + +PDFKit legt eine neue Seite an, sobald Text unterhalb des Satzspiegels +geschrieben wird. Eine Fußzeile steht dort per Definition. Ohne Gegenmaßnahme +entsteht je Seite und je Textaufruf eine leere Folgeseite. + +`fusszeilen()` setzt deshalb `page.margins.bottom` kurzzeitig auf 0 und stellt +den Wert danach wieder her. Ein Test zählt die Seitenobjekte im erzeugten PDF – +damit fällt ein Rückfall sofort auf. + +## E25 · Ein Durchlauf kopiert die Texte seiner Vorlage + +`checkliste_lauf.titel` und `checkliste_schritt.text` werden beim Start aus der +Vorlage übernommen, statt zur Anzeigezeit nachgeschlagen zu werden. + +Grund: Ein abgeschlossener Durchlauf ist ein Nachweis. Er muss auch in zwei +Jahren noch dasselbe aussagen – auch wenn die Vorlage unter `content/` +inzwischen umformuliert, erweitert oder gelöscht wurde. Die Seite zeigt einen +Hinweis, wenn es die Vorlage nicht mehr gibt, bleibt aber vollständig lesbar. + +## E26 · Mitlesen und Bearbeiten sind getrennte Rechte + +Beim Checklisten-Durchlauf fallen die beiden Rechte auseinander: + +- **Lesen** darf der Eigentümer und sein Ausbilder (`laufZumLesen`). +- **Bearbeiten** darf nur der Eigentümer (`laufZumBearbeiten`). + +Der Ausbilder hakt also nichts für seinen Azubi ab. Im Nachweis soll keine +Arbeit stehen, die der Azubi nicht selbst gemacht hat. Für die Abnahme gibt es +die Praxisaufgaben – dort ist es genau andersherum. diff --git a/README.md b/README.md index 7e103e0..4e07093 100644 --- a/README.md +++ b/README.md @@ -9,9 +9,10 @@ und – der wichtigste Teil – den gesetzlich vorgeschriebenen Ausbildungsnachw Gebaut für **einen Ausbilder und ein bis drei Auszubildende**. Kein Lernplattform-Baukasten, keine Mandanten, keine Cloud. -> **Stand:** Bausteine 1 bis 5 von 10 sind fertig – Fundament, Inhalte, -> Wochenplan, Merkkarten, Praxisaufgaben. Der [Fahrplan](ROADMAP.md) zeigt, -> was folgt, das [Änderungsprotokoll](CHANGELOG.md), was schon drin ist. +> **Stand:** Bausteine 1 bis 6 von 10 sind fertig – Fundament, Inhalte, +> Wochenplan, Merkkarten, Praxisaufgaben, Checklisten. Der +> [Fahrplan](ROADMAP.md) zeigt, was folgt, das +> [Änderungsprotokoll](CHANGELOG.md), was schon drin ist. --- diff --git a/ROADMAP.md b/ROADMAP.md index d39af91..31fe217 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -64,7 +64,14 @@ Legende: `[ ]` offen · `[~]` in Arbeit · `[x]` fertig - [x] Anhänge nur über Kennung, Berechtigung bei jedem Abruf geprüft - [x] „Was auf dich wartet" zeigt offene Abnahmen - [x] Aufgaben zählen im Wochenfortschritt mit -- [ ] **B6 · Checklisten mit Durchläufen und PDF** +- [x] **B6 · Checklisten mit Durchläufen und PDF** + - [x] Durchlauf aus einer Vorlage, mit Datum, Ticket und Kunde + - [x] Schritt für Schritt abhaken, Bemerkung je Schritt + - [x] Fortschritt je Gruppe (Vorbereiten / Durchführen / Prüfen / Abschließen) + - [x] Abschließen erst, wenn alles abgehakt ist + - [x] Abgeschlossene Durchläufe bleiben als Nachweis und sind gesperrt + - [x] PDF-Export mit Unterschriftenzeilen + - [x] Ausbilder liest mit, hakt aber nicht für den Azubi ab - [ ] **B7 · Berichtsheft: Tagesnotizen, Vorschläge, Prüfung, Abzeichnen, PDF** ## 0.5 – Bewertung diff --git a/docs/beispiel-checkliste.pdf b/docs/beispiel-checkliste.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f8daf0796030a286b6c8ab6f5d294959e7f9e6f1 GIT binary patch literal 7077 zcmb_h2|QG7+t*XVkRBl(OO22%X2)0(S+ZvtlC8lEQ)7mip^#)RTV>5o%34H3WT&!b z387GA-;$m9X2e_X)BFA2_xFC^nctjq?(1CleO>2T&+mT=pI23vgh;^v!rRmXAOi#g zi8hx33JL&_v6~YH2s)3p#{j5j5{5tlLa2`o0U%wB9S*HRyaqG}QwazpLJBGil!Zg2 zWRaEt&{-mZLS-fc5kI&MF=V0($reKfO79R(p9WwEb~Gup@t(BvB%-Ymh5|GPQ8faB zj4{_JK#-;*Rl3UV_3Z9dlPW`!D5^SmBFV@J zZHu8zpi+LyrzyB6Uk5|5r#JxNaEL5*RUDpzApt?^cr*p0im@fyVQACH6cPsQ2)LH; zF;SZ+ge1M5TjyA#4`|X*IG2)I`*?r{>kk}$ zv2R?}|HzlV&EzU#GWVpd&wPn+JBiIG1qKn3Gq}6Wt*9nWVpwGsRP1`)csVZOzOnDR zU9e)u<<%_3s|fM!1-^-zGhFNICG~x+?1`V(oCPaAgN~iSs~#4~G8DhJqP_K~rE0zM z{-dlSiW>*9%U)dh2kuE$aKlP}dKBWo>f62qNW!-wC%+33{qjgn(4AOsO z7^zu5#=-7+?G3b>lE?V;X0(>}3Sr_-AMg1F`QoF(_=iWak{?dgY7AOA z&dl;M-^QqZ{ZtIA9f)7=lG6E_QiY4Rd>8diMf&F zT{-SFJ3NS42Kh6YthWyGK`LH{Mw?U!Pc};GLDm+9KOJ@=I~T(u^3C`K8YM^%fpQ#wPA{v|L~&2E=0H67HS0s+yUG+ESMxZz@Eq zICBG+Z{zQ0oKwp<=JLMUbNp*H%z&j{c%*OH=f=x3-`Cn&I#Z|eJwxjK?|$R{xDr0b zFvop0V6|4HychjVDlgA8`oWUFyq(|SX{TT@`O8ud&6JdYB^)r-WB#IC99+Tr3C7-e zTS>=^@3{>c?+d$E+`!=kdsGxFSJZv~#tk}B-9BWfN=h%*=!q+8;4&AY4;c&9Fd5W8 zye$@ymzcp>!^ySK>Oz>bj4HSg%@y7E?GIOBB3pQ{+8l)Awc$-EQn`MEnj_MbpKo)y z<=R+@MhO}nC|nmW^fuPu;2BAI)L2VuU~vpdM6lfdD~U(YQEwW-Mk-j%>~zSW_O8S*S*2xPqjO@m~5_3+G^je3w;E$ zDm5SVSX>nPdLj3r+-1d{NcATSpuSG+JTI(f*!daXTa$E_Mp}|g(16jeRnlae zf)24(KGB?7q9ddW`hwgMFl zIL&9WeY$e9i^;DZBMa7VfO#8ywcTt4-AK0&@^&ofT&-6>5x5n7$nUje9fak|l`171 z4@#5UY~uL^vDhUG)1yVThU%)g;sRFWmBVR?NvBZHzq&UA&%UZDurgtf&lp!eI8
@&5e+#MpB>&M)!1i<p7&2@;JW_t;? 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 literal 0 HcmV?d00001 diff --git a/docs/bilder/02-ausbilder-ueberblick.png b/docs/bilder/02-ausbilder-ueberblick.png index 53421617385dc26005858bba33078d590d191a67..a16833dfc453bc2df6df66db5f6c038cd85b26b1 100644 GIT binary patch literal 53515 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