feat: Vollstaendiges Datenmodell als Prisma-Schema

Alle Fachentitaeten der Betreuung in einem Schema - bewusst komplett,
damit spaetere Etappen keine Migration am Fundament brauchen.

Kernentscheidungen:
- Geldbetraege durchgaengig als BigInt in Cent. Eine Rechnungslegung nach
  § 1865 BGB darf keine Rundungsfehler erben.
- Felder mit Suffix Verschluesselt tragen einen AES-256-GCM-Umschlag.
  Wo trotzdem gesucht werden muss (IBAN), steht ein HMAC-Blindindex daneben.
- Fristen und Stichtage sind @db.Date, nicht DateTime - sonst verschiebt
  die Zeitzone eine Frist um einen Tag.
- Frist.systemSchluessel macht die aus dem Bestellungsdatum abgeleiteten
  Pflichtfristen idempotent.
- Genehmigung.beschlussDokumentId ist die technische Voraussetzung dafuer,
  dass ein Vorgang ohne Beschluss nicht auf VOLLZOGEN gesetzt werden kann.
- DokumentVerknuepfung mit echten Fremdschluesseln statt loser Typ/ID-
  Spalte: eine Akte muss referenzsicher sein.
- Wertstand und Saldostand sind Historien - Werte werden nie ueberschrieben.

Dazu zwei SQL-Skripte, die Prisma nicht abbilden kann:
- volltextsuche.sql: tsvector-Trigger (deutsch) mit Gewichtung A/B/C,
  plus Trigram-Indizes fuer unscharfe Absendersuche.
- audit-schutz.sql: Trigger, die UPDATE und DELETE auf audit_log
  verweigern. Das Log ist Nachweis gegenueber Gericht und Miterben,
  also nur anhaengend - auch gegen psql.

Etappe: 1
Phase: Fundament
This commit is contained in:
Florian Wilde
2026-08-22 01:36:36 +02:00
parent cc72f5efd7
commit 6c1915ab9c
5 changed files with 1867 additions and 2 deletions
+5 -2
View File
@@ -20,9 +20,12 @@
"db:volltext": "prisma db execute --schema prisma/schema.prisma --file prisma/sql/volltextsuche.sql",
"db:seed": "prisma db seed",
"db:studio": "prisma studio",
"setup": "prisma migrate deploy && npm run db:volltext && npm run db:seed",
"setup": "prisma migrate deploy && npm run db:sql && npm run db:seed",
"schluessel": "node scripts/schluessel-erzeugen.mjs",
"postinstall": "prisma generate"
"postinstall": "prisma generate",
"db:audit-schutz": "prisma db execute --schema prisma/schema.prisma --file prisma/sql/audit-schutz.sql",
"db:sql": "npm run db:volltext && npm run db:audit-schutz",
"protokoll": "node scripts/bauprotokoll.mjs"
},
"prisma": {
"seed": "tsx prisma/seed.ts"