import * as React from 'react' import Link from 'next/link' import { AlertTriangle, FileCheck, FileWarning, Paperclip } from 'lucide-react' import { Badge } from '@/components/ui/badge' import { Card, CardContent } from '@/components/ui/card' import { cn, formatCent } from '@/lib/utils' /** * Kleine Bausteine, die in mehreren Finanzseiten vorkommen. * * Alle rein darstellend und ohne Zustand - sie laufen deshalb sowohl in * Server- als auch in Client-Komponenten. Betraege kommen hier immer als * Number in Cent an; die Umwandlung aus BigInt passiert vorher mit * centZuZahl(). */ /** * Ein Geldbetrag. Ausgaben werden mit Minuszeichen UND in gedeckter * Farbe gezeigt - die Farbe allein waere fuer farbfehlsichtige Nutzer * keine Information. */ export function Betrag({ cent, richtung, fett, className, }: { cent: number | null richtung?: 'EINNAHME' | 'AUSGABE' | 'UMBUCHUNG' fett?: boolean className?: string }) { if (cent === null) { return nicht erfasst } const vorzeichenbehaftet = richtung === 'AUSGABE' ? -Math.abs(cent) : cent const negativ = vorzeichenbehaftet < 0 return ( {formatCent(vorzeichenbehaftet)} ) } /** Kachel mit einer Zahl und einer Erklärung, was sie bedeutet. */ export function Kennzahl({ titel, wert, hinweis, ton = 'neutral', href, }: { titel: string wert: React.ReactNode hinweis?: React.ReactNode ton?: 'neutral' | 'gut' | 'achtung' | 'schlecht' href?: string }) { const rahmen = ton === 'gut' ? 'border-ampel-gruen/40' : ton === 'achtung' ? 'border-ampel-orange/50' : ton === 'schlecht' ? 'border-ampel-rot/50' : undefined const inhalt = (

{titel}

{wert}

{hinweis &&

{hinweis}

}
) if (href) { return ( {inhalt} ) } return {inhalt} } /** * Belegzustand einer Buchung. Der Belegzwang verbietet nichts - er macht * sichtbar. Eine Buchung ohne Beleg und ohne Begruendung ist die, nach * der beim Rechtspfleger gefragt wird. */ export function Belegzeichen({ belegTitel, begruendung, belegId, vertragBezeichnung = null, vertragAutomatisch = false, betragZuPruefen = false, }: { belegId: string | null belegTitel: string | null begruendung: string | null /** Dauerzahlung: gesetzt, wenn der Vertrag als Beleg gilt. */ vertragBezeichnung?: string | null /** Beim Import automatisch zugeordnet - eine Vermutung, kein Urteil. */ vertragAutomatisch?: boolean /** Zugeordnet, aber der Betrag weicht ab. */ betragZuPruefen?: boolean }) { if (belegId) { return ( ) } // Zugeordnet, aber der Betrag passt nicht. Steht vor allem anderen: Das // ist der Fall, den jemand ansehen soll. if (betragZuPruefen) { return ( ) } if (vertragBezeichnung) { return ( ) } if (begruendung && begruendung.trim() !== '') { return ( ) } return ( ) } /** * Die Warnung, um die es bei der Trennung der Vermoegensmassen geht: * eine Buchung auf einem Konto des Betreuers, die trotzdem als Vermoegen * der betreuten Person gefuehrt wird. */ export function Vermischungswarnung({ kurz = false }: { kurz?: boolean }) { if (kurz) { return ( ) } return (
) } /** Zeile in einer Bestands- oder Summenaufstellung. */ export function Summenzeile({ beschriftung, cent, betont, }: { beschriftung: React.ReactNode cent: number betont?: boolean }) { return (
{beschriftung}
) } /** Hinweise aus einer Berechnung - Lücken werden benannt, nicht versteckt. */ export function Hinweisliste({ hinweise, titel }: { hinweise: string[]; titel?: string }) { if (hinweise.length === 0) return null return (

{titel ?? 'Das solltest du vor der Abgabe klären'}

) }