import Link from 'next/link' import { FileArchive, Plus, Shield } from 'lucide-react' import { Badge } from '@/components/ui/badge' import { Button } from '@/components/ui/button' import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card' import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table' import { Leerzustand, SeitenKopf } from '@/components/seiten-kopf' import { Rechtshinweis } from '@/components/rechtshinweis' import { KuendigungsUebersicht, type Kuendigungswarnung, } from '@/components/vertraege/kuendigungs-uebersicht' import { aktiveBetreute, erfordereBenutzer, erfordereZugang } from '@/lib/auth/sitzung' import { centZuZahl, db, nichtGeloescht } from '@/lib/db' import { oeffnen } from '@/lib/crypto/feld' import { heuteAlsTag } from '@/lib/fristen/datum' import { kuendigungsampel, kuendigungsplan, laufzeitAusVertrag, } from '@/lib/vertraege/kuendigung' import { BEWERTUNG_BESCHRIFTUNG, jahresbeitragCent, RHYTHMUS_BESCHRIFTUNG, VERTRAG_ART_BESCHRIFTUNG, VERTRAG_STATUS_BESCHRIFTUNG, } from '@/lib/vertraege/konstanten' import { formatCent, formatDatum } from '@/lib/utils' export const dynamic = 'force-dynamic' const BEWERTUNG_VARIANTE = { UNGEPRUEFT: 'outline', VERWERTBAR: 'orange', GESCHUETZT: 'gruen', STRITTIG: 'gelb', } as const export default async function VertraegeUebersicht() { const benutzer = await erfordereBenutzer('/vertraege') const aktive = await aktiveBetreute(benutzer) if (!aktive) return null const { darfSchreiben } = await erfordereZugang(aktive.id, 'VERTRAEGE', 'lesen') const schreiben = darfSchreiben('VERTRAEGE') const vertraege = await db.vertrag.findMany({ where: { betreuteId: aktive.id, ...nichtGeloescht }, include: { vermoegensposten: { where: { art: 'VERSICHERUNG', ...nichtGeloescht }, include: { wertstaende: { orderBy: { stichtag: 'desc' }, take: 1 } }, }, }, orderBy: [{ status: 'asc' }, { bezeichnung: 'asc' }], }) const heute = heuteAlsTag() const warnungen: Kuendigungswarnung[] = [] let jahresbeitragSumme = 0n const zeilen = vertraege.map((vertrag) => { const offen = oeffnen('Vertrag', vertrag) const plan = kuendigungsplan({ beginnAm: vertrag.beginnAm, endeAm: vertrag.endeAm, laufzeitJahre: laufzeitAusVertrag(vertrag.beginnAm, vertrag.endeAm), kuendigungsfristMonate: vertrag.kuendigungsfristMonate, heute, }) const ampel = kuendigungsampel(plan) const jahr = jahresbeitragCent(vertrag.beitragCent, vertrag.rhythmus) if (jahr && vertrag.status === 'AKTIV') jahresbeitragSumme += jahr const laufend = vertrag.status === 'AKTIV' || vertrag.status === 'BEITRAGSFREI' if (laufend && ampel && (ampel.variante === 'rot' || ampel.variante === 'orange')) { warnungen.push({ vertragId: vertrag.id, bezeichnung: vertrag.bezeichnung, absendetag: plan.spaetesterAbsendetag?.toISOString() ?? null, tageBisAbsendetag: plan.tageBisAbsendetag, verpasst: plan.verpasst, variante: ampel.variante, text: ampel.text, }) } return { id: vertrag.id, bezeichnung: vertrag.bezeichnung, gesellschaft: vertrag.gesellschaft, art: vertrag.art, status: vertrag.status, vertragsnummer: offen.vertragsnummer, beitragCent: centZuZahl(vertrag.beitragCent), rhythmus: vertrag.rhythmus, bewertung: vertrag.bewertungSozialhilfe, rueckkaufswertCent: centZuZahl( vertrag.vermoegensposten[0]?.wertstaende[0]?.wertCent ?? null, ), rueckkaufswertStichtag: vertrag.vermoegensposten[0]?.wertstaende[0]?.stichtag.toISOString() ?? null, ampel, } }) return (
Kurz übersetzt: Ob ein Vertrag vor der Sozialhilfe einzusetzen ist, richtet sich nach § 90 SGB XII — eine angemessene Bestattungsvorsorge bleibt regelmäßig geschützt. Und bevor eine Lebens- oder Rentenversicherung verwertet wird, gehört die Frage nach der Genehmigung des Betreuungsgerichts (§ 1850 BGB) an den Rechtspfleger, nicht an diese App.