import { useMemo, useState } from 'react' import { Badge, Button, Card, EmptyState } from '../ui' import Pager from './Pager' import { pageOf } from '../../lib/financeFormat' import { isNegText, noticeProps } from '../../lib/financeUi' import { transactionRows } from '../../lib/financeView' const PAGE_SIZE = 50 export const TRANSACTIONS_ANCHOR = 'finanzen-buchungen' /** * Block 7: Buchungen. Alle gespeicherten Buchungen, neueste zuerst, 50 je Seite: Datum, Gegenpartei mit * Verwendungszweck (zweizeilig), Betrag mit Vorzeichen, Zuordnung (bei offenen Buchungen der stärkste Vorschlag als * Text) und der Knopf „Zuordnen“ bzw. „Ändern“. Vorgemerkte Buchungen (PDNG) tragen „vorgemerkt“. Die Daten kommen * vom Aufrufer (useFinanceTransactions), damit Seite und Zuordnen-Dialog dieselbe Liste benutzen. * onAssign(buchung) öffnet den Dialog. Schmal (Wrapper .fin-body bis 640 px) wird jede Zeile ein Raster: Datum und * Betrag / Gegenpartei und Verwendungszweck / Zuordnung und Knopf. Beträge mit „−“ stehen in Rot (fin-neg). */ export default function TransactionTable({ transactions, stripeFehler = '', loaded = false, loading = false, error = '', onReload, onAssign }) { const [page, setPage] = useState(1) const rows = useMemo(() => transactionRows(transactions), [transactions]) const paged = pageOf(rows, page, PAGE_SIZE) let body if (!loaded && loading) { body = (
Buchungen werden geladen …
) } else if (!loaded) { body = (

{error || 'Die Buchungen konnten nicht geladen werden.'}

) } else if (rows.length === 0) { body = } else { body = (
{paged.items.map((row) => ( ))}
Buchungen, neueste zuerst
Datum Gegenpartei und Verwendungszweck Betrag Zuordnung Aktion
{row.dateText}
{row.counterparty}
{row.remittance && (
{row.remittance}
)}
{row.amountText}
{row.assignmentText} {row.pending && vorgemerkt}
{row.suggestionText &&
{row.suggestionText}
} {row.note &&
Notiz: {row.note}
}
{row.action && ( )}
) } return (
{loaded && error && (

Die Buchungen konnten nicht neu geladen werden: {error}{' '}

)} {stripeFehler && (

{stripeFehler}

)} {body}
) }