feat(sprint8): Phase 2 — Treasury frontend + PDF receipts

Backend:
- ReceiptPdfService: Generates Quittung PDF per payment (OpenPDF, A4)
- FinancialReportService: Annual financial report PDF (Jahresabschluss)
- FinanceController: Added receipt download, annual report, CSV export endpoints
- Portal receipt download with member ownership verification

Frontend:
- src/services/finance.ts: Complete React Query service (types, hooks, mutations)
- /finance: Dashboard with KPI cards, recent transactions, outstanding members
- /finance/payments: Payment list with filtering, void, receipt download
- /finance/kassenbuch: Kassenbuch ledger with date range, CSV export
- /finance/fee-schedules: Fee schedule CRUD with interval management
- /finance/reports: Annual report PDF download
- /portal/finance: Member self-service balance + payment history + receipts

Navigation & i18n:
- Added Finanzen (Wallet icon) to admin sidebar
- Portal finance page for member payments
- Comprehensive de.json + en.json finance keys (~100 translations)
This commit is contained in:
Patrick Plate
2026-06-15 08:24:43 +02:00
parent 721503b231
commit 3211ade5be
13 changed files with 2419 additions and 1 deletions
+110
View File
@@ -839,5 +839,115 @@
"topicLocked": "This topic is locked. New replies are not possible.",
"reportReason": "Reason for report:",
"backToTopics": "Back to overview"
},
"finance": {
"title": "Club Finances",
"subtitle": "Overview of income, expenses, and member contributions",
"totalBalance": "Total Balance",
"incomeThisMonth": "Income (Month)",
"expensesThisMonth": "Expenses (Month)",
"outstandingMembers": "Outstanding Fees",
"outstandingTitle": "Outstanding Members",
"monthsOverdue": "months overdue",
"noOutstanding": "No outstanding fees",
"recentTransactions": "Recent Transactions",
"noTransactions": "No transactions available",
"recordPayment": "Record Payment",
"recordExpense": "Record Expense",
"payments": "Payments",
"kassenbuch": "Cash Book",
"feeSchedules": "Fee Schedules",
"reports": "Reports",
"exportCsv": "Export CSV",
"from": "From",
"to": "To",
"date": "Date",
"type": "Type",
"description": "Description",
"income": "Income",
"expense": "Expense",
"balance": "Balance",
"incomeLabel": "Income",
"expenseLabel": "Expense",
"loading": "Loading...",
"previous": "Previous",
"next": "Next",
"member": "Member",
"amount": "Amount",
"period": "Period",
"paymentMethod": "Payment Method",
"actions": "Actions",
"filterByStatus": "Filter by status",
"allStatuses": "All",
"noPayments": "No payments available",
"voidReason": "Reason for voiding:",
"memberIdPlaceholder": "Enter member ID",
"periodFrom": "Period from",
"periodTo": "Period to",
"reference": "Reference",
"referencePlaceholder": "e.g. transfer reference",
"expenseReferencePlaceholder": "e.g. invoice number",
"saving": "Saving...",
"category": "Category",
"descriptionPlaceholder": "e.g. Electricity bill June",
"bankTransfer": "Bank Transfer",
"cash": "Cash",
"sepa": "SEPA Direct Debit",
"card": "Card Payment",
"createFeeSchedule": "Create Fee Schedule",
"scheduleName": "Name",
"scheduleNamePlaceholder": "e.g. Standard Monthly Fee",
"intervalLabel": "Interval",
"scheduleDescPlaceholder": "Optional description",
"default": "Default",
"deactivate": "Deactivate",
"noFeeSchedules": "No fee schedules available",
"annualReport": "Annual Report",
"annualReportDescription": "Complete financial report with income, expenses, and member contributions.",
"auditorReport": "Auditor Report",
"auditorReportDescription": "Report for the auditor with all transaction details.",
"downloadPdf": "Download PDF",
"comingSoon": "Coming soon",
"status": {
"label": "Status",
"paid": "Paid",
"pending": "Pending",
"overdue": "Overdue",
"voided": "Voided"
},
"method": {
"BANK_TRANSFER": "Bank Transfer",
"CASH": "Cash",
"SEPA": "SEPA Direct Debit",
"CARD": "Card Payment"
},
"interval": {
"MONTHLY": "Monthly",
"QUARTERLY": "Quarterly",
"YEARLY": "Yearly",
"ONE_TIME": "One-time"
},
"categories": {
"rent": "Rent",
"utilities": "Utilities",
"equipment": "Equipment",
"seeds": "Seeds",
"supplies": "Supplies",
"insurance": "Insurance",
"legal": "Legal",
"other": "Other"
},
"portal": {
"title": "My Payments",
"currentBalance": "Current Balance",
"allPaid": "All fees paid",
"paymentDue": "Payment due",
"noFeeAssigned": "No fee schedule assigned",
"feeSchedule": "Fee Schedule",
"noFee": "None",
"lastPayment": "Last payment",
"paymentHistory": "Payment History",
"noPayments": "No payments yet"
}
}
}