import Link from 'next/link' import { notFound } from 'next/navigation' import { FileX2, Pencil, 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 { SeitenKopf } from '@/components/seiten-kopf' import { Datenzeile } from '@/components/substanz-formular' import { Rechtshinweis } from '@/components/rechtshinweis' import { Rueckkaufswert } from '@/components/vertraege/rueckkaufswert' import { aktiveBetreute, erfordereBenutzer, erfordereZugang } from '@/lib/auth/sitzung' import { centZuZahl, db, nichtGeloescht } from '@/lib/db' import { oeffnen } from '@/lib/crypto/feld' import { alsIsoTag, heuteAlsTag } from '@/lib/fristen/datum' import { briefkopfBauen } from '@/lib/vertraege/briefkopf' import { kuendigungsampel, kuendigungsplan, laufzeitAusVertrag, } from '@/lib/vertraege/kuendigung' import { anfrageStatus, rueckkaufswertAnschreiben, wertHistorie, } from '@/lib/vertraege/rueckkaufswert' import { wertalterBestimmen } from '@/lib/finanzen/wertalter' import { BEWERTUNG_BESCHRIFTUNG, BEWERTUNG_ERKLAERUNG, jahresbeitragCent, kannRueckkaufswertHaben, RHYTHMUS_BESCHRIFTUNG, VERTRAG_ART_BESCHRIFTUNG, VERTRAG_STATUS_BESCHRIFTUNG, } from '@/lib/vertraege/konstanten' import { formatCent, formatDatum } from '@/lib/utils' export const dynamic = 'force-dynamic' export default async function VertragDetail({ params }: { params: Promise<{ id: string }> }) { const { id } = await params const benutzer = await erfordereBenutzer(`/vertraege/${id}`) const aktive = await aktiveBetreute(benutzer) if (!aktive) return null const { darfSchreiben } = await erfordereZugang(aktive.id, 'VERTRAEGE', 'lesen') const schreiben = darfSchreiben('VERTRAEGE') const vertrag = await db.vertrag.findFirst({ where: { id, betreuteId: aktive.id, ...nichtGeloescht }, include: { // Ueber die Verknuepfung, nicht ueber die Art - siehe wertHistorie(). vermoegensposten: { where: nichtGeloescht, include: { wertstaende: { orderBy: { stichtag: 'desc' } } }, }, }, }) if (!vertrag) notFound() const offen = oeffnen('Vertrag', vertrag) const heute = heuteAlsTag() const plan = kuendigungsplan({ beginnAm: vertrag.beginnAm, endeAm: vertrag.endeAm, laufzeitJahre: laufzeitAusVertrag(vertrag.beginnAm, vertrag.endeAm), kuendigungsfristMonate: vertrag.kuendigungsfristMonate, heute, }) const ampel = kuendigungsampel(plan) const anfrage = anfrageStatus(vertrag.rueckkaufswertAngefragtAm, heute) const jahresbeitrag = jahresbeitragCent(vertrag.beitragCent, vertrag.rhythmus) const kopf = briefkopfBauen({ betreute: aktive, benutzer }) const anschreiben = rueckkaufswertAnschreiben({ kopf, empfaenger: { gesellschaft: vertrag.gesellschaft, anschrift: null }, vertragsbezeichnung: `${VERTRAG_ART_BESCHRIFTUNG[vertrag.art]} — ${vertrag.bezeichnung}`, vertragsnummer: offen.vertragsnummer, stichtag: heute, heute, }) const wertstaende = wertHistorie(vertrag.vermoegensposten) return (
) } /> Die Vertragsnummer wird verschlüsselt gespeichert und hier nur zum Lesen angezeigt.
{offen.vertragsnummer ?? '–'} {VERTRAG_STATUS_BESCHRIFTUNG[vertrag.status]} {formatDatum(vertrag.beginnAm)} {formatDatum(vertrag.endeAm)} {vertrag.kuendigungsfristMonate !== null ? `${vertrag.kuendigungsfristMonate} Monate` : 'nicht erfasst'}
{formatCent(vertrag.beitragCent)} {vertrag.rhythmus ? ` (${RHYTHMUS_BESCHRIFTUNG[vertrag.rhythmus]})` : ''} {formatCent(jahresbeitrag)} {formatDatum(vertrag.gekuendigtAm)} {formatDatum(vertrag.kuendigungZum)} {formatDatum(vertrag.rueckkaufswertAngefragtAm)}
{offen.notizen && (

{offen.notizen}

)}
Kündigungsfrist Eine Kündigung wird mit dem Zugang wirksam, nicht mit dem Absenden. Deshalb ist der Absendetag früher als der Fristablauf. {plan.berechenbar ? ( <>
Nächster Kündigungstermin
{formatDatum(plan.naechsterTermin)}
Zugang spätestens
{formatDatum(plan.zugangSpaetestensAm)}
Brief spätestens absenden
{formatDatum(plan.spaetesterAbsendetag)}
{ampel && (
{ampel.text}
)}
) : (

{plan.hinweise[0] ?? 'Ohne Laufzeitbeginn lässt sich kein Kündigungstermin berechnen.'}

)}
{kannRueckkaufswertHaben(vertrag.art) && ( ({ id: w.id, stichtag: w.stichtag.toISOString(), wertCent: centZuZahl(w.wertCent) ?? 0, wertquelle: w.wertquelle, bemerkung: w.bemerkung, }))} /> )} Bewertung fürs Sozialamt Meine Einordnung und meine Begründung — keine Rechtsauskunft. {BEWERTUNG_BESCHRIFTUNG[vertrag.bewertungSozialhilfe]}

{BEWERTUNG_ERKLAERUNG[vertrag.bewertungSozialhilfe]}

{offen.bewertungBegruendung ? (

{offen.bewertungBegruendung}

) : (

Noch keine Begründung hinterlegt. Sie gehört dazu, bevor der Vertrag in einer Aufstellung an den Bezirk auftaucht.

)}
) }