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:
@@ -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": {
|
||||
|
||||
@@ -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": {
|
||||
|
||||
Reference in New Issue
Block a user