Skip to content
Twentyfirst UIHalo

Ledger Table

Data · LedgerTable, PnLStatement, ReceiptSuggestion

Bookkeeping: LedgerTable (bookings with project and agent suggestions), PnLStatement and ReceiptSuggestion.

LedgerTable: rows ({id, date, ref, text, category, project, projectTint, net, vat, gross, suggested, status, statusLabel}), categories (makes the category editable in place) + onEdit(row, change), currency, selectable, bulkActions, toolbar, maxHeight.
PnLStatement: columns (months), rows ({kind: "section" | "subtotal" | "total", label, values}), currency, total (false hides it).
ReceiptSuggestion: file, source, fields ({label, value, mono, confidence 0–1}), suggestion, onConfirm, onDiscard, confirmLabel, discardLabel, children.

  • Agent suggestions carry the signal diamond until a person confirms them.
  • Negative amounts are blush; amounts use the locale's currency format.
Ref.DescriptionCategoryProjectVATStatus
02.04.RE-0412Hetzner Online GmbHHostingNorthwind€84.03€15.97€100.00Booked
03.04.ST-2231Stripe payoutRevenueChatteo€4,210.00€0.00€4,210.00Booked
04.04.MAIL-88Google Ireland Ltd. Suggested by LedgerMarketingNorthwind-€320.00€0.00-€320.00Suggested
JanFebMarTotal
Revenue
Subscriptions€18,200€19,400€21,100€58,700
One-off€2,100€1,800€2,600€6,500
Costs
Hosting-€820-€840-€910-€2,570
Marketing-€4,200-€3,900-€5,100-€13,200
Result€15,280€16,460€17,690€49,430
Rechnung_2026-0412.pdfFrom billing@hetzner.com · 2 Apr
VendorHetzner Online GmbH99 %
Date02.04.202698 %
Gross€100.0097 %
VAT19 %72 %
Hosting · Northwind · as every month

Props

LedgerTable

PropTypeNotes
rowsLedgerRow[]Required
categories?string[]
onEdit?(row: LedgerRow, change: Partial<LedgerRow>) => void
currency?string
selectable?boolean
bulkActions?BulkAction<LedgerRow>[]
toolbar?ReactNode
maxHeight?number
columnToggle?boolean
className?stringExtra class on the root element.
style?CSSPropertiesInline style on the root element.

PnLStatement

PropTypeNotes
columnsstring[]Required
rows{ kind?: "section" | "subtotal" | "total"; label: string; values?: number[] }[]Required
currency?string
total?boolean
label?string
className?stringExtra class on the root element.
style?CSSPropertiesInline style on the root element.

ReceiptSuggestion

PropTypeNotes
filestringRequired
source?ReactNode
fields{ label: string; value: ReactNode; mono?: boolean; confidence?: number }[]Required
suggestion?ReactNode
onConfirm?() => void
onDiscard?() => void
confirmLabel?string
discardLabel?string
children?ReactNode
className?stringExtra class on the root element.
style?CSSPropertiesInline style on the root element.