feat(accounting): Layer A frontend — chart of accounts CRUD + Treuhänder export UI

- ledger.service.ts: accounts/VAT-codes/mappings CRUD + export client
- ChartOfAccountsPage: full CRUD for the Swiss/LI KMU chart + MWST codes,
  category→account mapping, default/system accounts + tax-treatment/rate→VAT
  maps, with a 'guideline only' note
- LedgerExportPage: period + currency + target tool (generic/Banana/bexio)
  → collective-journal CSV download, with accrual-only + Treuhänder disclaimer
- AccountingLayout: 'Treuhänder export' (taxReport flag) + 'Chart of accounts'
  (accounting flag) sub-nav entries; App routes wired
- en/de translations (accounting.taxTreatment.* enum + ledger.* namespace)

de/en authored natively; no machine-translated locales touched here.
This commit is contained in:
Luca
2026-06-12 00:48:39 +02:00
parent 03cc250b47
commit 7e0098edcd
7 changed files with 687 additions and 4 deletions
+6
View File
@@ -67,6 +67,8 @@ import { ClientsLayout } from './components/admin/ClientsLayout';
import { AccountingLayout, AccountingIndex } from './components/admin/AccountingLayout';
import { AccountingInboxPage } from './pages/admin/accounting/AccountingInboxPage';
import { ExpensesLedgerPage } from './pages/admin/accounting/ExpensesLedgerPage';
import { ChartOfAccountsPage } from './pages/admin/accounting/ChartOfAccountsPage';
import { LedgerExportPage } from './pages/admin/accounting/LedgerExportPage';
import { RequireFeature } from './components/admin/RequireFeature';
import { PageErrorBoundary, OfflineIndicator, SkipLink, DynamicFavicon, RobotsMetaTags, CMSContentBlock, Loading } from './components/common';
import { MaintenanceWrapper } from './components/MaintenanceWrapper';
@@ -278,7 +280,11 @@ function App() {
</Route>
<Route element={<RequireFeature flag="taxReport" />}>
<Route path="tax-report" element={<TaxReportPage />} />
<Route path="export" element={<LedgerExportPage />} />
</Route>
{/* Chart of accounts + VAT codes (Layer A) — gated by
the accounting master flag alongside the section. */}
<Route path="ledger" element={<ChartOfAccountsPage />} />
<Route index element={<AccountingIndex />} />
</Route>
</Route>