Files
Laufzettel/docs/issues/013-laeufe-abarbeitung.md
T
Florian WildeandClaude Opus 5 abacad1cb7
Prüfung / pruefung (push) Canceled after 0s
Prüfung / pruefung (pull_request) Canceled after 0s
Prüfung / e2e (push) Canceled after 0s
Prüfung / e2e (pull_request) Canceled after 0s
feat(vorlagen): Versionierung, Unveraenderlichkeit und JSON-Austausch
Eine veroeffentlichte Vorlagen-Version ist fuer immer unveraenderlich — daran
haengt, dass ein archivierter Lauf in zehn Jahren noch genau die Schritte zeigt,
mit denen er gestartet wurde. Die Regel steht deshalb zweimal: im Service, der
die verstaendliche Meldung gibt, und in der Datenbank, die die Garantie gibt.
Vier Trigger fangen Schreibzugriffe ab, die nicht durch den Service kommen —
Migrationen, psql, der Seed und ab Phase 4 die Connectoren — und versperren den
Rueckweg nach ENTWURF, der alles andere ausgehebelt haette.

- Service: anlegen, Kopfdaten bearbeiten, Entwurf als tiefe Kopie der letzten
  veroeffentlichten Version, speichern, veroeffentlichen, verwerfen,
  duplizieren, archivieren
- Hoechstens ein Entwurf je Vorlage, durchgesetzt vom partiellen Index; zwei
  gleichzeitige Klicks auf „Bearbeiten“ bekommen denselben Entwurf statt eines
  Fehlers
- Optimistisches Sperren ueber geaendertAm: wer auf einem ueberholten Stand
  speichert, wird abgewiesen statt die Arbeit des anderen spurlos zu ersetzen
- JSON-Export und -Import samt Format-Dokumentation; der Export ist nachsichtig,
  der Import streng
- src/lib/validierung.ts als einzige Zod-Quelle mit deutschen Meldungen, per
  ESLint-Regel erzwungen

Der unabhaengige Review fand drei Blocker, alle an der Mandantengrenze: der
Suchfilter brachte ein zweites OR mit und ueberschrieb die Kundenbedingung,
Historie und Aufbau einer Version filterten gar nicht. Zu queries/vorlagen.ts
gab es keinen Test — jetzt gibt es tests/vorlagen-sicht.test.ts.

428 Tests gruen (vorher 336).

Schliesst #009

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-25 08:09:21 +02:00

3.9 KiB
Raw Blame History

#013 M8 – Läufe: Service und Abarbeitung

Status: offen Meilenstein: v0.1.0 Labels: phase-1, backend, frontend Geschätzt: 14 h Tatsächlich: –

Ziel

Das Herz der Anwendung: ein Lauf wird vorbereitet, abgearbeitet, abgeschlossen und archiviert. Der Archiv-Schreibschutz sitzt an genau einer Stelle.

Aufgaben

  • laufAnlegenService: aus veröffentlichter Version, Kunde per kundeErmitteln(), optional Mitarbeiter (Verzeichnis oder Freitext mitarbeiterName), optional Gerät, Ticket, Variablen, Zuweisung, Fälligkeit
  • Ein Lauf kann als OFFEN angelegt werden, ohne ihn zu starten — das ist der Zuweisungs-Mechanismus, keine eigene Tabelle
  • gestartetAm und IN_ARBEIT erst beim ersten Öffnen zur Bearbeitung
  • Titelvorschlag <Vorlage> – <Hostname oder Mitarbeiter> – <Datum>
  • schrittergebnisSetzenService: einzeln je Schritt (kein Gesamtformular), zustand, wert, notiz, aktualisiertVonId, Protokoll-Eintrag
  • NICHT_ZUTREFFEND und FEHLGESCHLAGEN verlangen eine Notiz, sonst LaufFehler
  • abschnittNichtZutreffendService: setzt alle Schritte eines Abschnitts mit einer Notiz auf NICHT_ZUTREFFEND (für die beiden Konto-Abschnitte im Onboarding)
  • laufAbschliessenService: nur wenn alle Pflichtschritte ERLEDIGT oder NICHT_ZUTREFFEND sind; setzt abgeschlossenAm, abgeschlossenVonId
  • laufArchivierenService und laufZurueckholenService (nur ADMIN), beide mit Protokoll-Eintrag
  • laufMussVeraenderbarSein(lauf) zentral, aufgerufen vor jeder Änderung an Kopfdaten, Schrittergebnis und Kommentar
  • Kommentare je Lauf und je Schrittergebnis
  • „Mit AD-Konto verknüpfen“: ein Lauf mit mitarbeiterName wird nachträglich über UPN oder Name mit einem Mitarbeiter verbunden
  • Start-Dialog: Vorlage → Mitarbeiter → Gerät (wählen, neu anlegen oder scannen) → Ticket, Variablen, Zuweisung, Fälligkeit; Vorbelegung je Aufrufort, Besitzer des Geräts als Mitarbeiter vorgeschlagen; Vorschläge aus den Namensregeln für upn, sam, mail
  • Abarbeitungsansicht: einklappbare Abschnitte mit 01 ·-Nummerierung, Fortschrittsbalken in Lime, je Schritt Zustand, Wert, Notiz, Kommentare und „wer wann“
  • Erledigte Schritte durchgestrichen in Nebentext-Farbe, Checkbox erledigt als Lime-Kachel mit dunklem Haken, Pflichtschritte mit rotem Stern
  • BEFEHL-Schritte als Codeblock auf #0B0D10 mit Lime-Schrift, Kopier-Knopf, Warnung wenn ein Platzhalter unaufgelöst ist; je Abschnitt „Alle Befehle als Skript kopieren“
  • ZAHL außerhalb von Min/Max wird markiert, aber nicht blockiert
  • Route Handler GET /api/laeufe/[id]/zustand, Client pollt alle 10 s und pausiert bei verstecktem Tab
  • Umschalter „Kompakt / Ausführlich“, ausführlich klappt alle Hilfetexte auf
  • Abschließen und Archivieren als getrennte Aktionen
  • Screenshots Start-Dialog, Lauf Desktop, Lauf Handy, Befehlsschritt in docs/screenshots/m8/

Akzeptanzkriterien

  • Test: ein Lauf ohne Mitarbeiter und ohne Gerät lässt sich anlegen, abschließen und archivieren
  • Test: Abschließen scheitert, solange ein Pflichtschritt OFFEN ist
  • Test: NICHT_ZUTREFFEND ohne Notiz wird abgelehnt, mit Notiz akzeptiert
  • Test: an einem archivierten Lauf schlagen Änderung eines Schrittergebnisses, eines Kommentars und der Kopfdaten fehl
  • Test: nur ADMIN holt einen archivierten Lauf auf ABGESCHLOSSEN zurück, mit Protokoll-Eintrag
  • Test: gestartetAm bleibt leer, solange der Lauf nur OFFEN ist
  • Test: jede Änderung an einem Schrittergebnis, jeder Statuswechsel und jedes Veröffentlichen steht im Protokoll
  • Test: die Abschnitts-Aktion setzt alle Schritte des Abschnitts mit derselben Notiz
  • Zwei Browser auf demselben Lauf sehen die Änderung des anderen nach höchstens 10 s
  • Am Handy bei 390 px kein horizontales Scrollen