# Buchhaltung Implementation Plan — 2026-03-30

## Priority Order
1. P1: Transfers (bank → bank) — needs migration first
2. P2: BankkontoDetail page — depends on P1 migration for transfer direction
3. P3: Konto-Typen + Einstellungen UI — pure frontend, self-contained
4. P4: Bestellungen integration — einzelpreis validation + auto-pending
5. P5: Haushaltsplan pages — large feature
6. P6: PDF Export — last, all data endpoints stable

## Key Findings
- `typ='transfer'` is NOT in the current DB CHECK constraint — migration required
- `einzelpreis` on `bestellpositionen` already exists (migration 038) — no schema change for P4
- `buchhaltung_planung` and `buchhaltung_planpositionen` tables exist (migrations 075/077), 2-level hierarchy (not 3-level as in original design sketch)
- All konto-typen and einstellungen backend routes exist — P3 is frontend-only
- Split-booking dialog and Freigaben-from-plan flow (design sections 4/8) are deferred

---

## P1: Transfers [x]

### Migration `082_buchhaltung_transfer.sql`
- Extend CHECK: add `'transfer'` to `typ` enum
- Add column `transfer_ziel_bankkonto_id INT REFERENCES buchhaltung_bankkonten(id) ON DELETE SET NULL`

### Backend
- `buchhaltung.service.ts` — add `createTransfer(data, userId)`: DB transaction creating two rows (debit on source, credit on target)
- `buchhaltung.controller.ts` — add `createTransfer` handler
- `buchhaltung.routes.ts` — `POST /transfers`
- Update `listTransaktionen` JOIN to include `transfer_ziel_bezeichnung`

### Frontend
- `buchhaltung.types.ts` — add `'transfer'` to `TransaktionTyp`; add `transfer_ziel_bankkonto_id?`, `transfer_ziel_bezeichnung?` to `Transaktion`; add `TransferFormData`
- `buchhaltung.ts` (service) — add `createTransfer` API method
- `Buchhaltung.tsx` — add `TransferDialog` component + "Transfer" button in TransaktionenTab toolbar; show Transfer chip in typ column

---

## P2: BankkontoDetail Page [x]

### Backend
- `buchhaltung.service.ts` — add `getBankkontoStatement(id, filters)`: queries transactions for one bank account, computes running balance per row (einnahme=+, ausgabe=−, transfer direction from `transfer_ziel_bankkonto_id`)
- `buchhaltung.controller.ts` — add `getBankkontoStatement` handler
- `buchhaltung.routes.ts` — `GET /bankkonten/:id/transaktionen`

### Frontend
- `buchhaltung.types.ts` — add `BankkontoStatement` interface
- `buchhaltung.ts` — add `getBankkontoStatement(id, filters?)` API method
- New file `BuchhaltungBankkontoDetail.tsx` — date range filter, summary cards, table with running balance column
- `App.tsx` — add route `/buchhaltung/bankkonto/:id`
- `Buchhaltung.tsx` (KontenTab, Bankkonten sub-tab) — make table rows clickable → navigate to detail

---

## P3: Einstellungen UI [x]

### Frontend only
- `buchhaltung.ts` — add `getEinstellungen` + `setEinstellungen` API methods
- `Buchhaltung.tsx` — add 4th sub-tab "Einstellungen" in KontenTab:
  - KontoTypen CRUD table + add/edit dialog
  - Default alert threshold TextField + save button
  - Gate with `hasPermission('buchhaltung:manage_settings')`

---

## P4: Bestellungen Integration [x]

### Backend
- `bestellung.service.ts` — block `vollstaendig`/`abgeschlossen` transition if any position has null/zero `einzelpreis`
- `buchhaltung.service.ts` — add `createPendingFromBestellung(bestellungId, userId)`: non-fatal, finds open Haushaltsjahr, inserts pending ausgabe transaction
- `bestellung.service.ts` — call `createPendingFromBestellung` after status → `abgeschlossen`

### Frontend
- `BestellungDetail.tsx` — show warning Alert when advancing to `abgeschlossen` but prices missing

---

## P5: Haushaltsplan [x]

### Backend
- `buchhaltung.service.ts` — Planung CRUD + Planposition CRUD + `createHaushaltsjahrFromPlan`
- `buchhaltung.controller.ts` — handlers for all
- `buchhaltung.routes.ts` — full set of Planung + Planposition routes + `POST /planung/:id/create-haushaltsjahr`

### Frontend
- `buchhaltung.types.ts` — add `Planung`, `Planposition`, `PlanungDetail`, form data interfaces
- `buchhaltung.ts` — add all Planung API methods
- New file `Haushaltsplan.tsx` — list view + detail view, position inline editing, "Haushaltsjahr erstellen" action
- `App.tsx` — routes `/haushaltsplan` and `/haushaltsplan/:id`
- `Sidebar.tsx` — add Haushaltsplan sub-item under Buchhaltung group

---

## P6: PDF Export (client-side jsPDF) [x]

### Frontend
- `Buchhaltung.tsx` (UebersichtTab) — add `generatePdf()` using jsPDF + `fetchPdfSettings()` pattern
  - Cover: year name + totals summary
  - Page 2+: konten tree table with budget/spent/utilization
  - Page 3+: full transaction list sorted by date
- "PDF exportieren" button gated by `buchhaltung:export`
