Ausschliesslich Zeilenenden. Nachgewiesen mit "git diff --cached --ignore-cr-at-eol": Der Diff ist leer, es hat sich kein Zeichen Inhalt geaendert. Deshalb ein eigener Commit: 7448 geaenderte Zeilen in einem Commit mit echten Aenderungen zu verstecken, macht die Historie an dieser Stelle unlesbar. So laesst er sich beim Durchsehen ueberspringen. Refs #26
244 lines
8.9 KiB
Markdown
244 lines
8.9 KiB
Markdown
# Schema-Wünsche aus Etappe 5 „Behörde“
|
||
|
||
Das Schema wurde nicht angefasst. Was beim Bauen des Sozialhilfemoduls
|
||
gefehlt hat, steht hier — nach Dringlichkeit sortiert, jeweils mit dem
|
||
Behelf, der jetzt an seiner Stelle steht.
|
||
|
||
---
|
||
|
||
## 1. `Heimkostenmonat`: Kostenseite und Deckungsseite überschneiden sich — wichtig
|
||
|
||
Dieselbe Sache wie Punkt 1 in `docs/schema-wuensche/dashboard.md`, hier aus
|
||
Sicht des Moduls, das die Gegenüberstellung baut.
|
||
|
||
**Das Problem.** `pflegeEigenanteilCent` heißt „einrichtungseinheitlicher
|
||
Eigenanteil". Der ist definitionsgemäß **schon um die Pauschale der
|
||
Pflegekasse nach § 43 Abs. 2 SGB XI gekürzt**. Steht in derselben Zeile
|
||
zusätzlich `pflegekasseCent` als Deckung, wird dasselbe Geld zweimal
|
||
gezählt — die Deckungslücke fällt um die Pauschale zu klein aus, bei
|
||
Pflegegrad 3 um 1.319 Euro im Monat.
|
||
|
||
**Was ich entschieden habe.** Dieses Modul rechnet in der Lesart
|
||
`EIGENANTEIL_NETTO` (siehe Kopfkommentar in
|
||
`src/lib/sozialhilfe/heimkosten.ts`):
|
||
|
||
```
|
||
Bedarf = pflegeEigenanteil (netto, wie auf der Heimrechnung)
|
||
+ unterkunftVerpflegung + investitionskosten
|
||
+ ausbildungsumlage + zusatzleistungen
|
||
+ barbetrag + bekleidungspauschale
|
||
|
||
Deckung = leistungszuschlag + rente + sonstigeEinkuenfte
|
||
+ sozialhilfe + eigenmittel
|
||
|
||
Deckungslücke = Bedarf − Deckung
|
||
```
|
||
|
||
`pflegekasseCent` zählt **nicht** als Deckung. Der Wert wird als
|
||
`pflegekasseNachrichtlichCent` mitgeführt und angezeigt; ist er ungleich
|
||
null, gibt `heimkostenAuswerten()` einen Hinweis aus, der die
|
||
Doppelzählung erklärt. Das Formular belegt das Feld nicht mehr vor.
|
||
|
||
`leistungszuschlagCent` zählt dagegen **sehr wohl** als Deckung: Der
|
||
Zuschlag nach § 43c SGB XI mindert den Eigenanteil erst danach und steht
|
||
auf der Heimrechnung als eigene Abzugsposition.
|
||
|
||
Die Alternative — durchgängig den Bruttosatz erfassen — ist als Lesart
|
||
`PFLEGESATZ_BRUTTO` implementiert und getestet: Bei konsistenter Erfassung
|
||
kommen beide Lesarten auf dieselbe Deckungslücke. Benutzt wird sie in der
|
||
Oberfläche nicht, weil das Schema keinen Ort hat, um die Wahl zu
|
||
speichern.
|
||
|
||
**Wunsch, in dieser Reihenfolge:**
|
||
|
||
1. Den Kommentar am Feld schärfen, damit die Lesart im Schema steht und
|
||
nicht nur hier:
|
||
|
||
```prisma
|
||
/// NETTO: der einrichtungseinheitliche Eigenanteil, wie er auf der
|
||
/// Heimrechnung steht - bereits um § 43 Abs. 2 SGB XI gekuerzt, noch
|
||
/// nicht um den Leistungszuschlag. pflegekasseCent zaehlt deshalb NICHT
|
||
/// als Deckung, sondern nur nachrichtlich.
|
||
pflegeEigenanteilCent BigInt @default(0)
|
||
```
|
||
|
||
2. Wenn beide Lesarten gebraucht werden, ein Feld dafür — sonst muss jedes
|
||
Modul raten, was in der Zeile steht:
|
||
|
||
```prisma
|
||
enum Kostenlesart {
|
||
EIGENANTEIL_NETTO
|
||
PFLEGESATZ_BRUTTO
|
||
}
|
||
|
||
lesart Kostenlesart @default(EIGENANTEIL_NETTO)
|
||
```
|
||
|
||
3. Alternativ ein `heimrechnungGesamtCent`, das schlicht den
|
||
Rechnungsbetrag trägt; die Aufteilung wäre dann nur noch informativ und
|
||
die Summe könnte gegen sie geprüft werden.
|
||
|
||
**Verabredung bis dahin**: Wer `Heimkostenmonat` schreibt — dieses Modul,
|
||
das Dashboard, ein Import — trägt als `pflegeEigenanteilCent` den Netto-
|
||
Eigenanteil ein und lässt `pflegekasseCent` auf 0.
|
||
|
||
---
|
||
|
||
## 2. `Nachforderung.checklistenSchluessel` — wichtig
|
||
|
||
```prisma
|
||
/// Stabiler Schluessel aus src/lib/sozialhilfe/checkliste.ts.
|
||
/// Verhindert Dubletten beim erneuten Uebernehmen der Standardunterlagen.
|
||
checklistenSchluessel String?
|
||
|
||
@@unique([antragId, checklistenSchluessel])
|
||
```
|
||
|
||
**Warum**: `ausCheckliste: Boolean` merkt sich nur *dass* eine Zeile aus der
|
||
Checkliste kam, nicht *welche* Position. Um beim zweiten Aufruf des Panels
|
||
nicht dieselbe Unterlage noch einmal anzulegen, vergleicht
|
||
`nochNichtUebernommen()` derzeit über die **Bezeichnung** (kleingeschrieben,
|
||
getrimmt). Das reicht, solange niemand die Bezeichnung ändert — tut er es,
|
||
entsteht beim nächsten Übernehmen eine Dublette.
|
||
|
||
**Behelf**: Vergleich über die Bezeichnung in
|
||
`src/lib/sozialhilfe/checkliste.ts` und in `checklisteUebernehmen()`.
|
||
|
||
---
|
||
|
||
## 3. Rückkaufswert am Vertrag — wichtig
|
||
|
||
```prisma
|
||
model Vertrag {
|
||
// ...
|
||
rueckkaufswertCent BigInt?
|
||
rueckkaufswertStichtag DateTime? @db.Date
|
||
}
|
||
```
|
||
|
||
**Warum**: Die Bewertungsansicht stellt Vermögensposten und Verträge
|
||
nebeneinander. Ein Vermögensposten trägt seinen Wert über `Wertstand`,
|
||
ein Vertrag hat gar kein Wertfeld — nur `beitragCent`, und das ist die
|
||
Prämie, nicht der Wert. Verträge erscheinen deshalb ohne Betrag, und die
|
||
Summe „verwertbar“ ist unvollständig, solange nicht zu jeder Versicherung
|
||
zusätzlich ein Vermögensposten angelegt wurde.
|
||
|
||
Für das Sozialhilfeverfahren ist genau dieser Wert der entscheidende: Der
|
||
Träger fragt nach Rückkaufswerten, nicht nach Versicherungssummen.
|
||
|
||
**Behelf**: Die Bewertungsansicht zeigt nur Verträge, die überhaupt einen
|
||
Wert haben können (`MIT_RUECKKAUFSWERT` aus
|
||
`src/lib/vertraege/konstanten.ts`), und markiert sie mit „Wert noch nicht
|
||
ermittelt“. Wer den Betrag braucht, legt zusätzlich einen
|
||
`Vermoegensposten` mit `vertragId` und einem `Wertstand` an — dann wird der
|
||
Vertrag in der Liste ausgeblendet, damit die Summe nicht doppelt zählt.
|
||
|
||
---
|
||
|
||
## 4. `Bescheid.rechtsbehelfsbelehrungVorhanden` — mittel
|
||
|
||
```prisma
|
||
/// Ausdrueckliche Einschaetzung, nicht aus der Fristlaenge abgeleitet.
|
||
rechtsbehelfsbelehrungVorhanden Boolean @default(true)
|
||
rechtsbehelfsbelehrungBemerkung String?
|
||
```
|
||
|
||
**Warum**: Ob die Jahresfrist des § 66 Abs. 2 SGG gilt, ist eine bewusste
|
||
Einschätzung mit Begründung („die Belehrung nennt die falsche Behörde“).
|
||
Derzeit wird sie aus `rechtsbehelfsfristMonate === 12` zurückgeschlossen —
|
||
das trägt, verliert aber die Begründung, und die bräuchte man genau dann,
|
||
wenn man sich im Widerspruchsverfahren darauf beruft.
|
||
|
||
**Behelf**: `belehrungZuMonaten()` in
|
||
`src/lib/sozialhilfe/rechtsbehelf.ts`. Die Begründung gehört bis auf
|
||
Weiteres in `notizenVerschluesselt`.
|
||
|
||
---
|
||
|
||
## 5. `Bescheid.widerspruchFristId` → `Frist` — mittel
|
||
|
||
```prisma
|
||
widerspruchFristId String? @unique
|
||
widerspruchFrist Frist? @relation(fields: [widerspruchFristId], references: [id], onDelete: SetNull)
|
||
```
|
||
|
||
**Warum**: Die angelegte Frist „Widerspruch möglich bis“ wird derzeit über
|
||
`Frist.systemSchluessel = "sozialhilfe-widerspruch-<bescheidId>"` gefunden.
|
||
Das funktioniert (`@@unique([betreuteId, systemSchluessel])` trägt es), ist
|
||
aber eine Verknüpfung über eine zusammengesetzte Zeichenkette. Ein echter
|
||
Fremdschlüssel wäre sauberer und ließe die Frist beim Löschen des Bescheids
|
||
mitziehen. Dasselbe gilt für
|
||
`"sozialhilfe-nachforderung-<nachforderungId>"`.
|
||
|
||
**Behelf**: `systemSchluessel` mit festem Präfix, `upsert` statt `create`.
|
||
|
||
---
|
||
|
||
## 6. `Heimkostenmonat` — Feld für die tatsächliche Zahlung — mittel
|
||
|
||
```prisma
|
||
/// Was tatsaechlich vom Konto ging - fuer den Abgleich mit dem Bescheid.
|
||
gezahltCent BigInt?
|
||
gezahltAm DateTime? @db.Date
|
||
rechnungsnummer String?
|
||
```
|
||
|
||
**Warum**: Die Gegenüberstellung rechnet Bedarf gegen Deckung. Was
|
||
tatsächlich abgebucht wurde, steht nirgends — und genau die Differenz
|
||
zwischen „laut Bescheid“ und „tatsächlich abgebucht“ ist der Anlass, beim
|
||
Träger nachzufragen.
|
||
|
||
**Behelf**: `bemerkung`.
|
||
|
||
---
|
||
|
||
## 7. `Heimkostenmonat.abwesenheitsminderungCent` — klein
|
||
|
||
```prisma
|
||
/// Tatsaechliche Minderung laut Heimrechnung, nicht die Schaetzung.
|
||
abwesenheitsminderungCent BigInt @default(0)
|
||
```
|
||
|
||
**Warum**: `abwesenheitstage` ist da, die Wirkung schätzt
|
||
`abwesenheitSchaetzen()` nach dem Rahmenvertrag (drei Karenztage, danach
|
||
25 % auf Pflegeanteil sowie Unterkunft und Verpflegung). Was die
|
||
Einrichtung wirklich abgezogen hat, steht auf der Rechnung und ließe sich
|
||
nicht festhalten.
|
||
|
||
**Behelf**: Die Schätzung wird ausdrücklich als Schätzung ausgewiesen und
|
||
neben die erfasste Lücke gestellt, nicht in sie hineingerechnet.
|
||
|
||
---
|
||
|
||
## 8. `Leistung.wiederholungsfristMonat/-tag` — klein
|
||
|
||
```prisma
|
||
/// Fuer jaehrlich zu wiederholende Antraege: Stichtag im Jahr.
|
||
antragsschlussMonat Int?
|
||
antragsschlussTag Int?
|
||
```
|
||
|
||
**Warum**: `jaehrlichNeuBeantragen: Boolean` sagt, *dass* wiederholt werden
|
||
muss, nicht *bis wann*. Beim Landespflegegeld ist der 31.12. eine
|
||
Ausschlussfrist — daraus ließe sich automatisch eine Frist ableiten,
|
||
statt sie von Hand anzulegen.
|
||
|
||
**Behelf**: `antragsschluss` als Text im Katalog
|
||
(`src/lib/sozialhilfe/leistungskatalog.ts`) und ein Hinweis in der
|
||
Oberfläche. Die Fristableitung übernimmt `pflichtfristenAbleiten()` mit
|
||
`landespflegegeld-<jahr>` (siehe `docs/SCHNITTSTELLEN.md`).
|
||
|
||
---
|
||
|
||
## 9. `Nachforderung.notizenVerschluesselt` — klein
|
||
|
||
**Warum**: `erlaeuterung` und `begruendungNichtVorhanden` liegen im
|
||
Klartext. Beides ist meist harmlos („Grundbuchauszug beim Amtsgericht
|
||
angefordert“), kann aber Gesundheits- oder Vermögensangaben enthalten
|
||
(„Rückkaufswert 12.480 Euro, Police verpfändet“). Wäre mindestens die
|
||
Begründung verschlüsselt, wäre das konsequenter zum Rest des Schemas.
|
||
|
||
**Behelf**: keiner. Die Felder werden benutzt, wie sie sind. Falls sie
|
||
verschlüsselt werden sollen, gehört `Nachforderung` in
|
||
`VERSCHLUESSELTE_FELDER` in `src/lib/crypto/feld.ts`.
|