feat(vorlagen): Abschnitte nur fuer bestimmte Abteilungen #58

Merged
florian.wilde merged 1 commits from feat/51-abteilungsabschnitte into main 2026-10-04 18:04:52 +00:00
Owner

Beim Onboarding in der Buchhaltung gehören Schritte dazu, die sonst niemand braucht: DATEV, Drucker für Formulare, Bankportal. Bisher hieß die Wahl: eine Vorlage je Abteilung pflegen, oder Schritte, die für die meisten „nicht zutreffend" sind.

Namen, nicht Kennungen

Jeder Abschnitt kann nennen, für welche Abteilungen er gilt — als Namen. Der Abschnitt gehört zur Version und muss ein Umbenennen oder Archivieren einer Abteilung überleben, ohne ins Leere zu zeigen; dieselbe Entscheidung wie bei Mitarbeiter.abteilung. Deshalb wandert die Einschränkung auch durch Export und Import: ein Abteilungsname bedeutet in einer anderen Installation dasselbe, eine Kennung nicht.

Festgeschrieben beim Start

Wie im Issue vorgeschlagen. Ein späterer Abteilungswechsel ändert die Abschnitte eines Laufs nicht — sonst verschwände ein Schritt, an dem schon eine Notiz hängt, und ein archivierter Lauf muss genau das zeigen, was damals abgearbeitet wurde.

Leer heißt alle. Läufe von vor dieser Fassung verhalten sich damit unverändert, ohne dass eine Migration Daten nachführen müsste. Damit das eindeutig bleibt, wird ein Lauf abgewiesen, für den kein Abschnitt übrig bleibt — es gäbe ohnehin nichts abzuarbeiten.

Die Abschlussregel musste nachziehen

offenePflichtschritte zählte den ausgefilterten Pflichtschritt weiter mit. Der Abschluss wäre damit unerreichbar gewesen: abhaken lässt sich nur, was in der Abarbeitung steht. Der Test hat das sofort gezeigt — das war der Grund, ihn vor dem Code zu schreiben.

Wo die Regel wohnt

src/lib/geltende-abschnitte.ts, nicht in einem Lesemodell. Drei Schichten brauchen sie: der Dienst beim Start und beim Abschluss, und die Lesemodelle der Abarbeitung und der Druckansicht. Zuerst lag sie in queries/laeufe.ts — dann hätte ein Dienst aus einem Lesemodell importiert, eine Abhängigkeit in die falsche Richtung (CLAUDE.md).

Oberfläche

Im Editor je Abschnitt ein Kästchen pro gepflegter Abteilung, darunter ein Freitextfeld für eine, die es noch nicht gibt — kein <select multiple>, das ist am Handy kaum bedienbar. Ein gewählter Name, der zu keiner gepflegten Abteilung passt, erscheint als eigene Zeile mit Entfernen-Knopf; sonst wäre er unsichtbar und beim nächsten Speichern still weg.

Der Start-Dialog sagt vorher, was die gewählte Abteilung hinzunimmt: „Nimmt einen Abschnitt hinzu: Erster Tag" — oder dass Abschnitte nur für andere gelten und wegbleiben.

Im gebauten Stand durchgeklickt: einschränken, speichern, veröffentlichen, dann zwei Läufe mit verschiedenen Abteilungen starten. In der Datenbank danach 6 Abschnitte mit 23 Schritten für die Buchhaltung und 5 mit 20 für den Vertrieb. Dabei einen eigenen Numerusfehler im Hinweistext gefunden („Ein Abschnitt gilt … und bleiben weg") und behoben.

Tests

16 neue (1225 statt 1209): die Auswahlregel einzeln (auch Groß-/Kleinschreibung), alle sechs Akzeptanzkriterien, der Abweisungsfall, und dass ein Lauf von vor dieser Fassung alles zeigt. Gegenprobe gefahren: ohne den Filter werden fünf rot.

Alle Tore grün: lint, typecheck, format:pruefen, pruefe:doku, 1225 Vitest-Tests in 56 Dateien.

Closes #51

🤖 Generated with Claude Code

Beim Onboarding in der Buchhaltung gehören Schritte dazu, die sonst niemand braucht: DATEV, Drucker für Formulare, Bankportal. Bisher hieß die Wahl: eine Vorlage je Abteilung pflegen, oder Schritte, die für die meisten „nicht zutreffend" sind. ## Namen, nicht Kennungen Jeder Abschnitt kann nennen, für welche Abteilungen er gilt — als **Namen**. Der Abschnitt gehört zur Version und muss ein Umbenennen oder Archivieren einer Abteilung überleben, ohne ins Leere zu zeigen; dieselbe Entscheidung wie bei `Mitarbeiter.abteilung`. Deshalb wandert die Einschränkung auch durch Export und Import: ein Abteilungsname bedeutet in einer anderen Installation dasselbe, eine Kennung nicht. ## Festgeschrieben beim Start Wie im Issue vorgeschlagen. Ein späterer Abteilungswechsel ändert die Abschnitte eines Laufs **nicht** — sonst verschwände ein Schritt, an dem schon eine Notiz hängt, und ein archivierter Lauf muss genau das zeigen, was damals abgearbeitet wurde. **Leer heißt alle.** Läufe von vor dieser Fassung verhalten sich damit unverändert, ohne dass eine Migration Daten nachführen müsste. Damit das eindeutig bleibt, wird ein Lauf abgewiesen, für den kein Abschnitt übrig bleibt — es gäbe ohnehin nichts abzuarbeiten. ## Die Abschlussregel musste nachziehen `offenePflichtschritte` zählte den ausgefilterten Pflichtschritt weiter mit. Der Abschluss wäre damit **unerreichbar** gewesen: abhaken lässt sich nur, was in der Abarbeitung steht. Der Test hat das sofort gezeigt — das war der Grund, ihn vor dem Code zu schreiben. ## Wo die Regel wohnt `src/lib/geltende-abschnitte.ts`, nicht in einem Lesemodell. Drei Schichten brauchen sie: der Dienst beim Start und beim Abschluss, und die Lesemodelle der Abarbeitung und der Druckansicht. Zuerst lag sie in `queries/laeufe.ts` — dann hätte ein Dienst aus einem Lesemodell importiert, eine Abhängigkeit in die falsche Richtung (CLAUDE.md). ## Oberfläche Im Editor je Abschnitt ein Kästchen pro gepflegter Abteilung, darunter ein Freitextfeld für eine, die es noch nicht gibt — kein `<select multiple>`, das ist am Handy kaum bedienbar. Ein gewählter Name, der zu keiner gepflegten Abteilung passt, erscheint als eigene Zeile mit Entfernen-Knopf; sonst wäre er unsichtbar und beim nächsten Speichern still weg. Der Start-Dialog sagt vorher, was die gewählte Abteilung hinzunimmt: „Nimmt einen Abschnitt hinzu: Erster Tag" — oder dass Abschnitte nur für andere gelten und wegbleiben. **Im gebauten Stand durchgeklickt:** einschränken, speichern, veröffentlichen, dann zwei Läufe mit verschiedenen Abteilungen starten. In der Datenbank danach **6 Abschnitte mit 23 Schritten** für die Buchhaltung und **5 mit 20** für den Vertrieb. Dabei einen eigenen Numerusfehler im Hinweistext gefunden („Ein Abschnitt gilt … und *bleiben* weg") und behoben. ## Tests 16 neue (1225 statt 1209): die Auswahlregel einzeln (auch Groß-/Kleinschreibung), alle sechs Akzeptanzkriterien, der Abweisungsfall, und dass ein Lauf von vor dieser Fassung alles zeigt. **Gegenprobe gefahren:** ohne den Filter werden fünf rot. Alle Tore grün: `lint`, `typecheck`, `format:pruefen`, `pruefe:doku`, **1225 Vitest-Tests** in 56 Dateien. Closes #51 🤖 Generated with [Claude Code](https://claude.com/claude-code)
florian.wilde added 1 commit 2026-10-04 18:04:50 +00:00
feat(vorlagen): Abschnitte nur fuer bestimmte Abteilungen
Prüfung / pruefung (pull_request) Canceled after 0s
Prüfung / pruefung (push) Canceled after 0s
Prüfung / e2e (pull_request) Canceled after 0s
Prüfung / e2e (push) Canceled after 0s
b8166e10ea
Beim Onboarding in der Buchhaltung gehoeren Schritte dazu, die sonst niemand
braucht: DATEV, Drucker fuer Formulare, Bankportal. Bisher hiess die Wahl: eine
Vorlage je Abteilung pflegen, oder Schritte, die fuer die meisten "nicht
zutreffend" sind.

Jeder Abschnitt kann jetzt nennen, fuer welche Abteilungen er gilt -- als
**Namen**, nicht als Kennungen. Der Abschnitt gehoert zur Version und muss ein
Umbenennen oder Archivieren einer Abteilung ueberleben; dieselbe Entscheidung
wie bei Mitarbeiter.abteilung. Deshalb wandert die Einschraenkung auch durch
Export und Import.

Welche Abschnitte ein Lauf hat, wird beim Start festgeschrieben. Ein spaeterer
Abteilungswechsel aendert ihn nicht -- sonst verschwaende ein Schritt, an dem
schon eine Notiz haengt, und ein archivierter Lauf muss genau das zeigen, was
damals abgearbeitet wurde.

Leer heisst alle: Laeufe von vor dieser Fassung verhalten sich unveraendert,
ohne dass eine Migration Daten nachfuehren muesste. Damit das eindeutig bleibt,
wird ein Lauf abgewiesen, fuer den kein Abschnitt uebrig bleibt -- es gaebe
ohnehin nichts abzuarbeiten.

Die Abschlussregel zaehlt nur geltende Pflichtschritte. Vorher waere der
Abschluss unerreichbar gewesen: abhaken laesst sich nur, was in der Abarbeitung
steht. Der Test hat das sofort gezeigt.

Die Regel liegt in src/lib, weil drei Schichten sie brauchen -- der Dienst beim
Start und beim Abschluss, die Lesemodelle der Abarbeitung und des Drucks. In
einem Lesemodell waere sie eine Abhaengigkeit in die falsche Richtung.

Im gebauten Stand durchgeklickt: einschraenken, speichern, veroeffentlichen,
zwei Laeufe mit verschiedenen Abteilungen starten -- 6 Abschnitte mit 23
Schritten fuer die Buchhaltung, 5 mit 20 fuer den Vertrieb. Dabei einen eigenen
Numerusfehler im Hinweistext gefunden und behoben.

Closes #51
florian.wilde merged commit 855164066c into main 2026-10-04 18:04:52 +00:00
florian.wilde deleted branch feat/51-abteilungsabschnitte 2026-10-04 18:04:53 +00:00
Sign in to join this conversation.