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
311 lines
11 KiB
TypeScript
311 lines
11 KiB
TypeScript
'use client'
|
|
|
|
import { useActionState, useState } from 'react'
|
|
import { Feld, Feldgruppe } from '@/components/feld'
|
|
import { Rechtshinweis } from '@/components/rechtshinweis'
|
|
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'
|
|
import { Input } from '@/components/ui/input'
|
|
import { Select } from '@/components/ui/select'
|
|
import { Textarea } from '@/components/ui/textarea'
|
|
import { Absenden, Meldung } from '@/components/sozialhilfe/bausteine'
|
|
import { MONATSNAMEN } from '@/lib/sozialhilfe/heimkosten'
|
|
import { heimkostenSpeichern, type Formularzustand } from '@/server/actions/sozialhilfe'
|
|
|
|
export type HeimkostenWerte = {
|
|
jahr: number
|
|
monat: number
|
|
pflegeEigenanteil: string
|
|
unterkunftVerpflegung: string
|
|
investitionskosten: string
|
|
ausbildungsumlage: string
|
|
zusatzleistungen: string
|
|
pflegekasse: string
|
|
leistungszuschlagProzent: number
|
|
leistungszuschlag: string
|
|
rente: string
|
|
sonstigeEinkuenfte: string
|
|
sozialhilfe: string
|
|
eigenmittel: string
|
|
barbetrag: string
|
|
bekleidungspauschale: string
|
|
abwesenheitstage: number
|
|
bemerkung: string
|
|
}
|
|
|
|
/**
|
|
* Ein Monat der Gegenüberstellung.
|
|
*
|
|
* Die Reihenfolge folgt der Heimrechnung: erst die vier Bausteine der
|
|
* Kosten, dann die Deckungsquellen, dann das, was der betreuten Person
|
|
* verbleiben muss. Wer von oben nach unten abtippt, findet alles an der
|
|
* Stelle, an der es auf der Rechnung steht.
|
|
*/
|
|
export function HeimkostenFormular({
|
|
werte,
|
|
jahre,
|
|
hinweisPflegekasse,
|
|
vorschlagBarbetrag,
|
|
}: {
|
|
werte: HeimkostenWerte
|
|
jahre: number[]
|
|
/**
|
|
* Erklaerung zum Feld "Leistung der Pflegekasse". Bewusst KEIN
|
|
* Uebernehmen-Knopf: Unter der Lesart dieses Moduls ist der
|
|
* Eigenanteil bereits um die Pauschale gekuerzt, das Feld gehoert
|
|
* deshalb auf 0. Siehe src/lib/sozialhilfe/heimkosten.ts.
|
|
*/
|
|
hinweisPflegekasse: string
|
|
vorschlagBarbetrag: { betrag: string; text: string }
|
|
}) {
|
|
const [zustand, aktion] = useActionState<Formularzustand, FormData>(heimkostenSpeichern, {})
|
|
const [barbetrag, setBarbetrag] = useState(werte.barbetrag)
|
|
|
|
return (
|
|
<form action={aktion} className="space-y-6">
|
|
<Meldung zustand={zustand} />
|
|
|
|
<Card>
|
|
<CardHeader>
|
|
<CardTitle>Monat erfassen</CardTitle>
|
|
<CardDescription>
|
|
Beträge wie auf der Heimrechnung, z.B. 1.234,56. Ein bereits erfasster Monat wird
|
|
überschrieben.
|
|
</CardDescription>
|
|
</CardHeader>
|
|
|
|
<CardContent className="space-y-6">
|
|
<div className="grid gap-4 sm:grid-cols-2">
|
|
<Feld id="jahr" beschriftung="Jahr" pflicht fehler={zustand.felder?.jahr}>
|
|
<Select name="jahr" defaultValue={String(werte.jahr)}>
|
|
{jahre.map((j) => (
|
|
<option key={j} value={j}>
|
|
{j}
|
|
</option>
|
|
))}
|
|
</Select>
|
|
</Feld>
|
|
|
|
<Feld id="monat" beschriftung="Monat" pflicht fehler={zustand.felder?.monat}>
|
|
<Select name="monat" defaultValue={String(werte.monat)}>
|
|
{MONATSNAMEN.map((name, i) => (
|
|
<option key={name} value={i + 1}>
|
|
{name}
|
|
</option>
|
|
))}
|
|
</Select>
|
|
</Feld>
|
|
</div>
|
|
|
|
<Feldgruppe
|
|
titel="Kosten"
|
|
beschreibung="Die vier Bausteine der Heimrechnung, dazu Zusatzleistungen."
|
|
>
|
|
<Feld
|
|
id="pflegeEigenanteil"
|
|
beschriftung="Einrichtungseinheitlicher Eigenanteil"
|
|
fehler={zustand.felder?.pflegeEigenanteil}
|
|
erklaerung="Der pflegebedingte Anteil (EEE), genau wie er auf der Heimrechnung steht — also bereits abzüglich der Pauschale der Pflegekasse (§ 43 Abs. 2 SGB XI). In jedem Pflegegrad gleich hoch. Nur auf ihn wirkt der Leistungszuschlag."
|
|
>
|
|
<Input
|
|
name="pflegeEigenanteil"
|
|
inputMode="decimal"
|
|
defaultValue={werte.pflegeEigenanteil}
|
|
/>
|
|
</Feld>
|
|
|
|
<Feld
|
|
id="unterkunftVerpflegung"
|
|
beschriftung="Unterkunft und Verpflegung"
|
|
fehler={zustand.felder?.unterkunftVerpflegung}
|
|
>
|
|
<Input
|
|
name="unterkunftVerpflegung"
|
|
inputMode="decimal"
|
|
defaultValue={werte.unterkunftVerpflegung}
|
|
/>
|
|
</Feld>
|
|
|
|
<Feld
|
|
id="investitionskosten"
|
|
beschriftung="Investitionskosten"
|
|
fehler={zustand.felder?.investitionskosten}
|
|
erklaerung="Gebäude und Instandhaltung. Laufen auch bei Abwesenheit weiter."
|
|
>
|
|
<Input
|
|
name="investitionskosten"
|
|
inputMode="decimal"
|
|
defaultValue={werte.investitionskosten}
|
|
/>
|
|
</Feld>
|
|
|
|
<Feld
|
|
id="ausbildungsumlage"
|
|
beschriftung="Ausbildungsumlage"
|
|
fehler={zustand.felder?.ausbildungsumlage}
|
|
>
|
|
<Input
|
|
name="ausbildungsumlage"
|
|
inputMode="decimal"
|
|
defaultValue={werte.ausbildungsumlage}
|
|
/>
|
|
</Feld>
|
|
|
|
<Feld
|
|
id="zusatzleistungen"
|
|
beschriftung="Zusatzleistungen"
|
|
fehler={zustand.felder?.zusatzleistungen}
|
|
erklaerung="Friseur, Komfortleistungen. Der Träger übernimmt sie in aller Regel nicht — sie gehen vom Barbetrag ab."
|
|
>
|
|
<Input
|
|
name="zusatzleistungen"
|
|
inputMode="decimal"
|
|
defaultValue={werte.zusatzleistungen}
|
|
/>
|
|
</Feld>
|
|
</Feldgruppe>
|
|
|
|
<Feldgruppe titel="Deckung" beschreibung="Wer zahlt welchen Teil?">
|
|
<Feld
|
|
id="pflegekasse"
|
|
beschriftung="Leistung der Pflegekasse (nachrichtlich)"
|
|
fehler={zustand.felder?.pflegekasse}
|
|
erklaerung={hinweisPflegekasse}
|
|
>
|
|
<Input name="pflegekasse" inputMode="decimal" defaultValue={werte.pflegekasse} />
|
|
</Feld>
|
|
|
|
<Feld
|
|
id="leistungszuschlagProzent"
|
|
beschriftung="Leistungszuschlag in Prozent"
|
|
fehler={zustand.felder?.leistungszuschlagProzent}
|
|
erklaerung="§ 43c SGB XI: 15 / 30 / 50 / 75 Prozent nach Verweildauer. Steht auf der Heimrechnung."
|
|
>
|
|
<Input
|
|
name="leistungszuschlagProzent"
|
|
type="number"
|
|
min={0}
|
|
max={100}
|
|
defaultValue={werte.leistungszuschlagProzent}
|
|
/>
|
|
</Feld>
|
|
|
|
<Feld
|
|
id="leistungszuschlag"
|
|
beschriftung="Leistungszuschlag in Euro"
|
|
fehler={zustand.felder?.leistungszuschlag}
|
|
erklaerung="Nur auf den pflegebedingten Eigenanteil, nicht auf die ganze Rechnung."
|
|
>
|
|
<Input
|
|
name="leistungszuschlag"
|
|
inputMode="decimal"
|
|
defaultValue={werte.leistungszuschlag}
|
|
/>
|
|
</Feld>
|
|
|
|
<Feld id="rente" beschriftung="Rente" fehler={zustand.felder?.rente}>
|
|
<Input name="rente" inputMode="decimal" defaultValue={werte.rente} />
|
|
</Feld>
|
|
|
|
<Feld
|
|
id="sonstigeEinkuenfte"
|
|
beschriftung="Sonstige Einkünfte"
|
|
fehler={zustand.felder?.sonstigeEinkuenfte}
|
|
erklaerung="Betriebsrente, Mieteinnahmen, Zinsen."
|
|
>
|
|
<Input
|
|
name="sonstigeEinkuenfte"
|
|
inputMode="decimal"
|
|
defaultValue={werte.sonstigeEinkuenfte}
|
|
/>
|
|
</Feld>
|
|
|
|
<Feld
|
|
id="sozialhilfe"
|
|
beschriftung="Anteil der Sozialhilfe"
|
|
fehler={zustand.felder?.sozialhilfe}
|
|
erklaerung="Was der Bezirk laut Bescheid übernimmt."
|
|
>
|
|
<Input name="sozialhilfe" inputMode="decimal" defaultValue={werte.sozialhilfe} />
|
|
</Feld>
|
|
|
|
<Feld
|
|
id="eigenmittel"
|
|
beschriftung="Eigenmittel"
|
|
fehler={zustand.felder?.eigenmittel}
|
|
erklaerung="Was aus dem eigenen Vermögen zugeschossen wurde."
|
|
>
|
|
<Input name="eigenmittel" inputMode="decimal" defaultValue={werte.eigenmittel} />
|
|
</Feld>
|
|
</Feldgruppe>
|
|
|
|
<Feldgruppe
|
|
titel="Was verbleiben muss"
|
|
beschreibung="Barbetrag und Bekleidungspauschale sind Teil des Bedarfs, nicht Rest."
|
|
>
|
|
<Feld
|
|
id="barbetrag"
|
|
beschriftung="Barbetrag"
|
|
fehler={zustand.felder?.barbetrag}
|
|
erklaerung={
|
|
<>
|
|
{vorschlagBarbetrag.text}{' '}
|
|
<button
|
|
type="button"
|
|
onClick={() => setBarbetrag(vorschlagBarbetrag.betrag)}
|
|
className="font-medium text-primary underline-offset-4 hover:underline"
|
|
>
|
|
Wert übernehmen
|
|
</button>
|
|
</>
|
|
}
|
|
>
|
|
<Input
|
|
name="barbetrag"
|
|
inputMode="decimal"
|
|
value={barbetrag}
|
|
onChange={(e) => setBarbetrag(e.target.value)}
|
|
/>
|
|
</Feld>
|
|
|
|
<Feld
|
|
id="bekleidungspauschale"
|
|
beschriftung="Bekleidungspauschale"
|
|
fehler={zustand.felder?.bekleidungspauschale}
|
|
erklaerung="Höhe legt der Träger fest (§ 27b Abs. 1 SGB XII) — übernimm den Betrag aus dem Bescheid."
|
|
>
|
|
<Input
|
|
name="bekleidungspauschale"
|
|
inputMode="decimal"
|
|
defaultValue={werte.bekleidungspauschale}
|
|
/>
|
|
</Feld>
|
|
|
|
<Feld
|
|
id="abwesenheitstage"
|
|
beschriftung="Abwesenheitstage"
|
|
fehler={zustand.felder?.abwesenheitstage}
|
|
erklaerung="Krankenhaus, Reha, Urlaub. Die ersten drei Tage sind voll zu zahlen; ab dem vierten mindert sich das Entgelt nach dem Rahmenvertrag — die Anwendung schätzt das nur, maßgeblich ist die Heimrechnung."
|
|
>
|
|
<Input
|
|
name="abwesenheitstage"
|
|
type="number"
|
|
min={0}
|
|
max={31}
|
|
defaultValue={werte.abwesenheitstage}
|
|
/>
|
|
</Feld>
|
|
</Feldgruppe>
|
|
|
|
<Feld id="bemerkung" beschriftung="Bemerkung" fehler={zustand.felder?.bemerkung}>
|
|
<Textarea name="bemerkung" defaultValue={werte.bemerkung} rows={2} />
|
|
</Feld>
|
|
</CardContent>
|
|
</Card>
|
|
|
|
<Rechtshinweis rechtsgrundlage="§ 43 SGB XI, § 43c SGB XI, § 27b SGB XII" />
|
|
|
|
<Absenden>Monat speichern</Absenden>
|
|
</form>
|
|
)
|
|
}
|