feat(accounting): expenses ledger + supplier-payment toggle

Adds Accounting → Expenses, the view of everything triaged out of the inbox:

- ExpensesLedgerPage: filter by status / disposition; each row shows the
  disposition + status badge, CHF amount, created date, and a link to the
  client invoice for re-billed items. Supplier-payment toggle ("Mark paid" ->
  method + date + reference modal; "Paid" -> click to revert) wired to
  /:id/supplier-payment. Payment status is decoupled from categorisation, per
  the locked design; declined/duplicate rows skip the toggle.
- AccountingLayout: "Expenses" sub-nav item (gated by incomingInvoices).
- App.tsx: /admin/accounting/expenses route.
- i18n: accounting.subnav.expenses, accounting.ledger/expenseStatus/
  paymentMethod (EN + DE, DE authored natively).

Verified: en/de JSON valid; npm run build green.
This commit is contained in:
Luca
2026-06-11 00:42:46 +02:00
parent 502fbad5a8
commit 0c35ac43e6
5 changed files with 246 additions and 1 deletions
+31
View File
@@ -3400,6 +3400,7 @@
},
"subnav": {
"incomingInvoices": "Eingangsrechnungen",
"expenses": "Aufwände",
"taxReport": "Steuer"
},
"disposition": {
@@ -3449,6 +3450,36 @@
"eventId": "Event-ID (optional)",
"markup": "Zuschlag"
}
},
"expenseStatus": {
"open": "Offen",
"parked": "Geparkt",
"billed": "Verrechnet",
"declined": "Abgelehnt"
},
"paymentMethod": {
"bank_transfer": "Überweisung",
"cash": "Bargeld",
"twint": "TWINT",
"paypal": "PayPal",
"card": "Karte",
"other": "Sonstiges"
},
"ledger": {
"allStatuses": "Alle Status",
"allDispositions": "Alle Zuordnungen",
"empty": "Noch keine Aufwände — Dokumente im Eingang kategorisieren.",
"untitled": "Aufwand",
"invoiceLink": "Rechnung",
"paid": "Bezahlt",
"markPaid": "Als bezahlt markieren",
"markPaidTitle": "Lieferant als bezahlt markieren",
"paidDate": "Zahldatum",
"method": "Methode",
"reference": "Referenz (optional)",
"confirmPaid": "Als bezahlt markieren",
"paidToast": "Als bezahlt markiert.",
"unpaidToast": "Als nicht bezahlt markiert."
}
},
"calendar": {
+31
View File
@@ -3400,6 +3400,7 @@
},
"subnav": {
"incomingInvoices": "Incoming invoices",
"expenses": "Expenses",
"taxReport": "Tax"
},
"disposition": {
@@ -3449,6 +3450,36 @@
"eventId": "Event ID (optional)",
"markup": "Markup"
}
},
"expenseStatus": {
"open": "Open",
"parked": "Parked",
"billed": "Billed",
"declined": "Declined"
},
"paymentMethod": {
"bank_transfer": "Bank transfer",
"cash": "Cash",
"twint": "TWINT",
"paypal": "PayPal",
"card": "Card",
"other": "Other"
},
"ledger": {
"allStatuses": "All statuses",
"allDispositions": "All dispositions",
"empty": "No expenses yet — categorize documents in the inbox.",
"untitled": "Expense",
"invoiceLink": "Invoice",
"paid": "Paid",
"markPaid": "Mark paid",
"markPaidTitle": "Mark supplier paid",
"paidDate": "Payment date",
"method": "Method",
"reference": "Reference (optional)",
"confirmPaid": "Mark paid",
"paidToast": "Marked as paid.",
"unpaidToast": "Marked as not paid."
}
},
"calendar": {