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 (
{offen.notizen}
{plan.hinweise[0] ?? 'Ohne Laufzeitbeginn lässt sich kein Kündigungstermin berechnen.'}
)}{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.
)}