Files
Florian Wilde 1ed19eb76e Zeilenenden der 24 verbliebenen Dateien normalisieren
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
2026-08-23 23:37:02 +02:00

8.9 KiB
Raw Permalink Blame History

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:
/// 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)
  1. Wenn beide Lesarten gebraucht werden, ein Feld dafür — sonst muss jedes Modul raten, was in der Zeile steht:
enum Kostenlesart {
  EIGENANTEIL_NETTO
  PFLEGESATZ_BRUTTO
}

lesart Kostenlesart @default(EIGENANTEIL_NETTO)
  1. 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

/// 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

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

/// 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

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

/// 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

/// 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

/// 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.