Files
Florian Wilde 6b4df4c9cb feat: Dashboard Heute, Kontakte und Kontaktprotokoll
Das Dashboard beantwortet die Frage, was heute ansteht - nicht, welche
Daten es gibt. Jede Kachel endet in einer Handlung: Fristen-Ampel,
wartet auf andere (mit Tagen seit dem letzten Kontakt), offene
Nachforderungen des Bezirks mit Fortschrittsbalken, ungepruefter
Posteingang, unverbuchte Belege, Kennzahlen.

Zwoelf Abfragen in einem Promise.all, kein N+1. Cent-Betraege werden
beim Verlassen der Serverseite gewandelt.

Kacheln zu Modulen, die ein Mitleser nicht freigegeben bekommen hat,
entfallen ganz - sie zeigen nicht "0", denn das waere eine Aussage ueber
Daten, die er nicht sehen darf.

Kontaktprotokoll als Schnellerfassung: Datum vorbelegt, Art als grosse
Knopfreihe, Dauer als Schnellwahl, ein Freitextfeld. Alles andere
eingeklappt. Ziel sind unter 20 Sekunden am Handy.

Das Haekchen "persoenlicher Kontakt zur betreuten Person" ist bewusst
NICHT vorbelegt - es wandert in den Jahresbericht nach § 1863 BGB, und
ein versehentlich gesetztes Haekchen waere dort eine falsche Angabe
gegenueber dem Gericht.

Aus demselben Grund gilt der Textbaustein "regelmaessiger persoenlicher
Kontakt" erst ab persoenlichem Kontakt in mindestens 75 Prozent der
Monate. Sonst schreibt die Auswertung ausdruecklich, dass kein
persoenlicher Kontakt dokumentiert ist. Ein geschoenter Bericht hilft
niemandem.

Protokolldaten werden als 12:00 UTC gespeichert und durchgaengig in UTC
gerechnet, sonst kippt die Zeitzone einzelne Besuchstage.

51 Tests.

Etappe: 2
Phase: Alltag
2026-08-22 02:26:38 +02:00

121 lines
4.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Schema-Wünsche aus Dashboard und Kontakten
Diese Datei sammelt, was beim Bauen von `/heute` und den Kontakten
aufgefallen ist. `prisma/schema.prisma` wurde **nicht** geändert – alles
hier ist ein Vorschlag für eine spätere Migration, mit der Begründung
daneben.
---
## 1. `Heimkostenmonat`: Kostenseite und Deckungsseite überschneiden sich
**Was ich gebaut habe.** Die Kennzahl „Deckungslücke“ rechnet exakt nach
der Gruppierung im Schema:
```
Gesamtkosten = pflegeEigenanteil + unterkunftVerpflegung
+ investitionskosten + ausbildungsumlage + zusatzleistungen
Deckung = pflegekasse + leistungszuschlag + rente
+ sonstigeEinkuenfte + sozialhilfe + eigenmittel
Deckungslücke = Gesamtkosten − Deckung
```
**Das Problem.** `pflegeEigenanteilCent` heißt „Eigenanteil“. Der
einrichtungseinheitliche Eigenanteil ist definitionsgemäß **schon um die
Leistung der Pflegekasse nach § 43 SGB XI gekürzt**. Steht in derselben
Zeile zusätzlich `pflegekasseCent` als Deckung, wird dieser Betrag doppelt
gezählt, und das Dashboard weist eine Überdeckung aus, die es nicht gibt.
Dasselbe gilt für `leistungszuschlagCent` (§ 43c SGB XI), der den
Eigenanteil ebenfalls mindert.
**Wunsch.** Entweder
- den Kommentar am Feld schärfen: „`pflegeEigenanteilCent` ist der
**Brutto**-Pflegesatz; `pflegekasseCent` und `leistungszuschlagCent`
werden davon abgezogen" – dann stimmt die Rechnung oben; oder
- ein Feld `heimrechnungGesamtCent` ergänzen, das schlicht die Summe der
Heimrechnung trägt, und die Aufteilung nur noch informativ führen.
Solange das offen ist, sollte das Heim-Modul entweder den Bruttosatz oder
`pflegekasseCent = 0` erfassen – konsequent das eine oder das andere.
Wer die Kachel zum ersten Mal sieht und einen absurden Wert findet, weiß
mit dieser Notiz, woran es liegt.
---
## 2. `Kontaktprotokoll.datum` könnte `@db.Date` sein
**Was ich gebaut habe.** Das Feld ist `DateTime`. Die Schnellerfassung
kennt nur einen Tag, keine Uhrzeit; gespeichert wird deshalb bewusst
**12:00 UTC**. Um die Mittagszeit herum verschiebt keine Zeitzone den
Eintrag auf den Vor- oder Folgetag, und die Auswertung („an wie vielen
Tagen bestand persönlicher Kontakt?") zählt zuverlässig.
**Wunsch.** `datum DateTime @db.Date` – dann verschwindet die
12:00-Konvention, und der Typ sagt, was gemeint ist. Fachlich zählt beim
Jahresbericht nach § 1863 BGB der Tag, nicht die Uhrzeit.
Falls die Uhrzeit später doch gebraucht wird (Zeiterfassung für die
Vergütung), wäre ein zusätzliches `beginnUhrzeit String?` sauberer als das
Datumsfeld doppelt zu belegen.
---
## 3. `Kontakt`: kein Feld für „nicht mehr zuständig"
Sachbearbeiter wechseln. Heute bleibt nur der Papierkorb – dann ist aber
auch die Gesprächshistorie aus dem Verzeichnis verschwunden, obwohl sie
für den Jahresbericht und für Rückfragen weiter gebraucht wird.
**Wunsch.** `aktivBis DateTime? @db.Date` oder `aktiv Boolean @default(true)`.
Das Verzeichnis würde inaktive Kontakte einklappen statt löschen, und die
Historie bliebe sichtbar. Ein `nachfolgerId String?` auf denselben Typ
wäre die Kür: „Frau Krämer, jetzt Herr Sandner".
---
## 4. `Nachforderung`: kein `betreuteId`
`Nachforderung` hängt nur über `antrag` an der betreuten Person. Jede
Abfrage muss deshalb über die Beziehung filtern:
```ts
where: { antrag: { betreuteId, geloeschtAm: null }, geloeschtAm: null }
```
Das funktioniert, ist aber die einzige Stelle im Dashboard, an der die
Zugriffsprüfung nicht direkt auf einer Spalte sitzt. Bei einer späteren
Row-Level-Security in Postgres wäre eine denormalisierte `betreuteId`
(wie bei `DokumentVerknuepfung`) die einfachere Grundlage.
---
## 5. `Vermoegensposten`: kein Kennzeichen „zählt nicht in die Summe"
Die Kachel „Vermögen" summiert je Posten den jüngsten `Wertstand` und
zieht `VERBINDLICHKEIT` ab. Posten ohne jeden Wertstand werden gesondert
gezählt und ausgewiesen („2 Posten haben noch keinen Wert und fehlen in
dieser Summe") – stillschweigend als 0 zu führen wäre in einer
Rechnungslegung nach § 1865 BGB falsch.
Offen bleibt der Fall „bewusst nicht bewertbar" (Hausrat, persönliche
Gegenstände). Heute sieht er aus wie „vergessen".
**Wunsch.** `ohneWertBegruendung String?` – analog zu
`belegFehltBegruendung` bei `Buchung`. Dann kann die Kachel zwischen
„fehlt noch" und „bewusst ohne Wert" unterscheiden.
---
## 6. Kein Modell für die Sachstandsanfrage
Die Kachel „Wartet auf andere" verlinkt auf
`/vorgaenge/<id>?aktion=sachstandsanfrage`. Ob daraus ein Schreiben wird,
entscheidet das Vorgangsmodul. Wird eine Anfrage verschickt, sollte
`Vorgang.letzterKontaktAm` fortgeschrieben werden – sonst bleibt der
Vorgang für immer rot, obwohl gerade nachgefasst wurde. Das ist kein
Schema-Wunsch, sondern eine Verabredung zwischen den Modulen; sie steht
hier, damit sie nicht verloren geht.