import { SeitenKopf } from '@/components/seiten-kopf' import { Rechtshinweis } from '@/components/rechtshinweis' import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert' import { Card, CardContent } from '@/components/ui/card' import { Vermoegensliste, type ListenPosten } from '@/components/sozialhilfe/vermoegensliste' import { oeffnen } from '@/lib/crypto/feld' import { centZuZahl, db, nichtGeloescht } from '@/lib/db' import { alsIsoTag } from '@/lib/fristen/datum' import { VERMOEGENS_ART_BESCHRIFTUNG } from '@/lib/finanzen/kategorien' import { MIT_RUECKKAUFSWERT, VERTRAG_ART_BESCHRIFTUNG } from '@/lib/vertraege/konstanten' import { BEWERTUNG_BESCHRIFTUNG } from '@/lib/sozialhilfe/schonvermoegen' import { freibetragVergleichen, uebersichtBilden } from '@/lib/sozialhilfe/vermoegensuebersicht' import { sozialhilfeKontext } from '@/lib/sozialhilfe/zugang' import { formatCent } from '@/lib/utils' import { AlertCircle } from 'lucide-react' export const dynamic = 'force-dynamic' /** * Vermögens-Bewertungsansicht. * * Sie zählt zusammen und stellt gegenüber - sie entscheidet nichts. Was * geschützt ist, sagt der Träger; bleibt man uneins, das Sozialgericht. * Deshalb heißt die Spalte "Einschätzung" und nicht "Bewertung". */ export default async function VermoegensbewertungSeite() { const { betreuteId, darfSchreiben } = await sozialhilfeKontext() const [posten, vertraege] = await Promise.all([ db.vermoegensposten.findMany({ where: { betreuteId, ...nichtGeloescht }, include: { wertstaende: { orderBy: { stichtag: 'desc' }, take: 1 } }, orderBy: { bezeichnung: 'asc' }, }), db.vertrag.findMany({ where: { betreuteId, // Nur Vertraege, die ueberhaupt einen Wert darstellen koennen. Ein // Stromvertrag hat keinen Rueckkaufswert und wuerde die Liste zumuellen. art: { in: [...MIT_RUECKKAUFSWERT] }, ...nichtGeloescht, }, orderBy: { bezeichnung: 'asc' }, }), ]) // Verträge, die schon als Vermögensposten geführt werden, nicht doppelt // zeigen - sonst wäre die Summe zweimal drin. const bereitsAlsPosten = new Set( posten.map((p) => p.vertragId).filter((id): id is string => id !== null), ) const zeilen: ListenPosten[] = [ ...posten.map((p) => { const geoeffnet = oeffnen('Vermoegensposten', p) const stand = p.wertstaende[0] return { id: p.id, bezeichnung: p.bezeichnung, herkunft: 'VERMOEGEN' as const, art: p.art, artBeschriftung: VERMOEGENS_ART_BESCHRIFTUNG[p.art], bewertung: p.bewertungSozialhilfe, wertCent: stand ? centZuZahl(stand.wertCent) : null, wertStichtag: stand ? alsIsoTag(stand.stichtag) : null, begruendung: geoeffnet.bewertungBegruendung ?? '', zusatz: stand ? stand.wertquelle : null, } }), ...vertraege .filter((v) => !bereitsAlsPosten.has(v.id)) .map((v) => { const geoeffnet = oeffnen('Vertrag', v) return { id: v.id, bezeichnung: v.bezeichnung, herkunft: 'VERTRAG' as const, art: v.art, artBeschriftung: VERTRAG_ART_BESCHRIFTUNG[v.art], bewertung: v.bewertungSozialhilfe, // Der Rückkaufswert steht am Vertrag nicht als Betrag; er wird // als Vermögensposten mit Wertstand geführt. Bis dahin: offen. wertCent: null, wertStichtag: null, begruendung: geoeffnet.bewertungBegruendung ?? '', zusatz: v.gesellschaft, } }), ] const uebersicht = uebersichtBilden( zeilen.map((z) => ({ id: z.id, bezeichnung: z.bezeichnung, herkunft: z.herkunft, artBeschriftung: z.artBeschriftung, bewertung: z.bewertung, wertCent: z.wertCent === null ? null : BigInt(z.wertCent), wertStichtag: null, begruendung: z.begruendung, href: '#', })), ) const vergleich = freibetragVergleichen(uebersicht.jeBewertung.VERWERTBAR.summeCent) return (
{vergleich.hinweis}
{titel}
{formatCent(betrag)}
{anzahl} {anzahl === 1 ? 'Posten' : 'Posten'} {ohneWert > 0 && `, davon ${ohneWert} ohne Wert`}