Geprüft: das Modell trägt Fallarten, aber keine Dokumentarten

Vor Phase 3 geprüft, ob neue Dokumentarten ohne Code auskommen. Ergebnis:
für Fallarten ja, für alles andere nein.

CaseSection hängt fest an caseId. Ein Bußgeld ist keine Ermittlung, ein
Sonderarbeitsvertrag erst recht nicht. PersonnelFile.fields ist ein nacktes
JSON-Feld ohne Vorlage: ein Vertrag dort hätte keine Versionierung, keinen
Diff, keine Begründungspflicht, kein minClearance je Feld und keinen Eintrag
im Zugriffsprotokoll — genau die Eigenschaften, wegen derer das System gebaut
wird. Und würde man solche Dokumente behelfsweise als Case führen, stünden sie
in Fallliste, Fallzählung und Suche nach Ermittlungen.

Dazu ein zweiter Befund aus den beiden Beispieldokumenten: sie sind
grundverschieden gebaut. Der Vorfallsbericht ist ein Formular und wird von den
vorhandenen Feldtypen vollständig abgedeckt. Der Sonderarbeitsvertrag ist
fester Vertragstext mit Platzhaltern, Paragraphen und Unterschriftenzeilen —
dafür reicht eine Feldliste nicht.

Empfehlung in docs/13: eine gemeinsame Dokumentebene, additiv, mit denselben
Zusicherungen wie CaseSection. Case, CaseSection und CaseEntry bleiben
unangetastet.

Nichts davon gebaut. Die Entscheidung steht als erster Punkt in Phase 3.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Harlekin
2026-09-01 23:24:59 +02:00
co-authored by Claude Opus 5
parent 70bcfdc4d8
commit 87c74b251d
3 changed files with 89 additions and 4 deletions
+13 -4
View File
@@ -145,6 +145,12 @@ model CaseTemplate {
description String?
isActive Boolean @default(true)
fields Json // TemplateField[]
/// Muster des Aktenzeichens, siehe docs/13-entscheidungen.md. Die Abteilung
/// fuehrt gewachsene Praefixe wie "AKT-PA"; der Nummernkreis laeuft je
/// Praefix und Jahr, damit zwei Fallarten sich nicht in die Quere kommen.
numberPrefix String @default("AfiS")
numberPadding Int @default(4)
createdAt DateTime @default(now())
createdById String?
@@ -209,11 +215,14 @@ enum CaseStatus {
SEALED
}
/// Kollisionsfreie Vergabe des Aktenzeichens. Gelesen mit SELECT ... FOR UPDATE
/// in derselben Transaktion wie das Anlegen des Falls.
/// Kollisionsfreie Vergabe des Aktenzeichens, ein Nummernkreis je Praefix und
/// Jahr. Hochgezaehlt in derselben Transaktion wie das Anlegen des Falls.
model CaseCounter {
year Int @id
lastNumber Int @default(0)
prefix String
year Int
lastNumber Int @default(0)
@@id([prefix, year])
}
model CaseSection {