Files
dashboard/.claude/plans/2026-03-30-buchhaltung-implementation.md

4.7 KiB
Raw Blame History

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.tsPOST /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.tsGET /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