import Link from 'next/link' import { AlertCircle, FileSearch, Plus, Repeat } from 'lucide-react' import { Alert, AlertDescription } from '@/components/ui/alert' 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 { Betrag } from '@/components/finanzen/bausteine' import { AlsGeklaertAbhaken, ZahlungenZuordnen, Zurueckholen, } from '@/components/finanzen/wiederkehrend-aktionen' import { finanzKontext } from '@/lib/finanzen/seite' import { wiederkehrendLaden } from '@/lib/finanzen/wiederkehrend-laden' import { EINZELZAHLUNG_AB_CENT, RHYTHMUS_BESCHRIFTUNG, rhythmusErklaerung, } from '@/lib/finanzen/wiederkehrend' import { centZuZahl } from '@/lib/db' import { formatCent, formatDatum } from '@/lib/utils' export const metadata = { title: 'Wiederkehrende Zahlungen' } export const dynamic = 'force-dynamic' /** * Wiederkehrende Zahlungen — die Suche nach unbekannten Verträgen. * * Am Anfang einer Betreuung weiß niemand, welche Verträge es gibt. Die * Antwort steht im Kontoauszug: Wer regelmäßig abbucht, hat einen Vertrag. * Diese Seite macht aus hunderten Buchungszeilen eine Arbeitsliste. * * Sie legt von sich aus nichts an. Jede Zeile endet in einer Entscheidung, * die ein Mensch trifft — Vertrag anlegen oder abhaken. */ export default async function WiederkehrendSeite() { const { betreute, darfSchreiben } = await finanzKontext() const schreiben = darfSchreiben('FINANZEN') const bild = await wiederkehrendLaden(betreute.id) const ohneVertrag = bild.gruppen.filter((gruppe) => gruppe.vertragId === null) const mitVertrag = bild.gruppen.filter((gruppe) => gruppe.vertragId !== null) return (
Zu den Buchungen } /> {bild.ausgabenGesamt === 0 ? ( Kontoauszug einlesen } /> ) : ( <> {/* --- Kandidaten ohne Vertrag ----------------------------------- */} Nach Jahresbetrag sortiert — was am meisten kostet, will man zuerst geklärt haben. {ohneVertrag.length === 0 ? (

Zu jeder regelmäßigen Abbuchung liegt ein Vertrag in der Akte. Das ist der Zustand, den man haben will.

) : (
Empfänger Rhythmus je Zahlung im Jahr Zeitraum {schreiben && Und jetzt?} {ohneVertrag.map((gruppe) => (

{gruppe.anzeigename}

{gruppe.schreibweisen.length > 1 && (

{gruppe.schreibweisen.length} Schreibweisen zusammengefasst

)}
{RHYTHMUS_BESCHRIFTUNG[gruppe.rhythmus]}

{rhythmusErklaerung(gruppe)}

{gruppe.betragSchwankt && (

schwankt: {formatCent(centZuZahl(gruppe.kleinsterBetragCent))} bis{' '} {formatCent(centZuZahl(gruppe.groessterBetragCent))}

)}
{gruppe.rhythmus === 'UNREGELMAESSIG' && (

tatsächlich gezahlt

)}
{formatDatum(gruppe.ersteZahlung)}
bis {formatDatum(gruppe.letzteZahlung)}
{schreiben && (
)}
))}
)}
{/* --- Einzelne groessere Zahlungen ------------------------------ */} {bild.einzelne.length > 0 && ( Einzelne größere Zahlungen Kein Vertragsverdacht, sondern eine Merkliste. Die Gruppierung oben braucht mindestens zwei Zahlungen — eine jährlich abgebuchte Prämie erscheint bei einem importierten Jahr aber nur einmal. Ausgerechnet Versicherungen werden oft jährlich gezahlt, deshalb steht hier alles ab{' '} {formatCent(centZuZahl(EINZELZAHLUNG_AB_CENT))}.
Empfänger Datum Betrag Vertrag {bild.einzelne.map((zahlung) => ( {zahlung.anzeigename} {formatDatum(zahlung.datum)} {zahlung.vertragBezeichnung ? ( {zahlung.vertragBezeichnung} ) : ( keiner )} ))}
)} {/* --- Bereits erklaert ------------------------------------------ */} {mitVertrag.length > 0 && ( Schon einem Vertrag zugeordnet Erkannt am Namen der Gesellschaft. Steht hier etwas Falsches, stimmt die Schreibweise am Vertrag nicht mit der auf dem Kontoauszug überein.
    {mitVertrag.map((gruppe) => (
  • {gruppe.anzeigename} {RHYTHMUS_BESCHRIFTUNG[gruppe.rhythmus]},{' '} {formatCent(centZuZahl(gruppe.jahresbetragCent))} im Jahr
    {/* Der Vertrag liegt vor - dann belegt er auch die Zahlungen. Einzeln anzuklicken waeren bei drei Jahren Laufzeit 36 Klicks. */} {schreiben && gruppe.offeneBuchungIds.length > 0 && ( )} {gruppe.offeneBuchungIds.length === 0 && (

    Alle {gruppe.anzahl} Zahlungen sind dem Vertrag zugeordnet und damit belegt.

    )}
  • ))}
)} {/* --- Abgehakt --------------------------------------------------- */} {bild.abgehakt.length > 0 && ( Als „kein Vertrag“ abgehakt Diese Empfänger bleiben aus der Liste heraus, auch nach dem nächsten Import.
    {bild.abgehakt.map((eintrag) => (
  • {eintrag.anzeigename} {eintrag.begruendung && ( — {eintrag.begruendung} )} {schreiben && ( )}
  • ))}
)} )}
) }