Files
IBKRTrader/docs/archiv/KONZEPT-Modul-Accounting.md
RichardandClaude Opus 5 9f66183f1c
Build & Test / build (ubuntu-latest) (push) Waiting to run
Build & Test / build (windows-latest) (push) Waiting to run
Eine Roadmap statt sieben Konzepte; Quelldokumente ins Archiv
Der offene Stand lag ueber sieben Konzepte, zwei Referenzdokumente und die
Phasen-Checkliste der Architektur verteilt. Dieselbe Aufgabe stand teils
doppelt unter zwei Namen - die asynchrone Fill-Verfolgung etwa als "bekannte
Grenze" in IBKR-Integration.md und zugleich als W-2 im OptionsWheel-Konzept.
Wer wissen wollte, was als Naechstes ansteht, musste alles neun lesen.

docs/ROADMAP.md fuehrt das zusammen:
  - Fuenf Stufen in Abhaengigkeitsreihenfolge, von "Fundament schliessen" bis
    zum OptionsWheel, dazu vier laufende Bahnen (Auslieferung, Accounting,
    Supervisor, technische Schulden).
  - Jede Zeile traegt ihre Herkunft (W-2, P5, Kapitalmodell 5, ...), damit die
    Herleitung im Archiv auffindbar bleibt.
  - Eigene Abschnitte fuer Zurueckgestelltes und Verworfenes. Zurueckgestellte
    Ideen nennen ausdruecklich, WAS sie wieder aktuell macht; verworfene nennen
    den Grund, damit sie nicht in sechs Monaten erneut vorgeschlagen werden.
  - Erledigtes bleibt als Zeile mit Datum stehen statt zu verschwinden.

Archiv (git erkennt alle sieben als Umbenennung, Historie bleibt):
  docs/konzepte/*         -> docs/archiv/
  docs/Kapital-und-Buchmodell.md -> docs/archiv/
Jedes archivierte Dokument bekommt oben einen Vermerk, warum es erhalten bleibt
und wo der lebende Stand steht. Inhaltlich ist keines veraendert.

Weiter gepflegt werden ARCHITECTURE.md (Aufbau + Phasen-Historie),
IBKR-Integration.md (Adapter-Design und Grenzen) und die TWS-Setup-Checkliste -
das sind Referenzen, keine Planung. Ihre eigenen Offen-Listen verweisen jetzt
mit Roadmap-Kennung dorthin, statt einen zweiten Stand zu fuehren.

Alle 63 relativen Markdown-Links geprueft, keiner tot. Fuenf Pfadverweise in
Code, csproj und systemd-Unit mitgezogen; die Unit zeigte auf die
Portierungsanalyse, die ausdruecklich den Stand VOR dem Umbau beschreibt - jetzt
auf ARCHITECTURE.md. Build 0 Warnungen, 198/198 Tests gruen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-23 18:14:51 +02:00

5.7 KiB
Raw Permalink Blame History

📦 Archiviert am 2026-08-23

Dieses Dokument wird nicht mehr gepflegt. Was davon noch offen ist, steht in der Roadmap (Bahn „Accounting") dort und nur dort wird der Stand nachgeführt.

Es bleibt erhalten, weil es die Leitprinzipien traegt unabhaengige Quelle, Idempotenz, append-only und die Datenbeschaffung ueber die Flex Query beschreibt. Zum Nachschlagen also weiterhin richtig, als Aufgabenliste nicht mehr.


Konzept: Modul „Accounting" (Buchhaltung/Reporting aller Konten)

UMGESETZT (Modulgerüst). Das Modul steht: acc_-Schema mit Migration InitialAccounting, AccountingIngestService (append-only, idempotent über IdempotencyKey), AccountingClassifier, AccountingEngine, FxConverter, AccountingReportService sowie CSV- und PDF-Export. Die Ingest-Quellen liegen hinter Interfaces mit Offline-Null-Stubs — das Modul läuft vollständig und bucht dabei korrekt nichts.

Weiterhin offen ist genau die Zielland-Arbeit aus §6 — vor allem der Live-Flex-Abruf, ohne den keine echten Buchungen entstehen, und die Steuerschicht, deren Jurisdiktion nicht festgelegt ist. Das Modul ist damit lauffähig, aber noch nicht in Betrieb.

Stand: 2026-07-30 Ziel: Vollständige, von unserer Trading-DB unabhängige, buchhalterisch korrekte Erfassung ALLER Kontobewegungen der IBKR-Konten. Periodische (meist monatliche), vor einer Steuerbehörde nachvollziehbare Aufstellungen — je Konto ODER über alle Konten, für frei wählbare Zeiträume. BWA-artige Kennzahlen-Übersicht in der UI. Export als CSV und PDF. Kein Handel; reines Ingest-/Reporting-Modul.

Vorbild: gleichnamiges Modul in PolytraderSharp (Polymarket). Hier auf IBKR-Aktien übertragen.

0. Leitprinzipien

  1. Unabhängige Quelle = IBKR-Kontoauszug, NICHT unsere DB. Das Modul erhebt die Buchungsgrundlage ausschließlich über eigene Abrufe des IBKR Activity Flex Query (XML) und speichert sie roh + normalisiert in eigenen acc_-Tabellen. Der Flex Web Service (Token + Query-Id) braucht keine laufende TWS-Socket-Verbindung. Unsere eigenen Trade-Logs dienen nur dem optionalen Abgleich, nie als Buchungsgrundlage.
  2. Nachvollziehbarkeit / Audit. Jeder Buchungssatz führt über TransactionId (IBKR tradeID / transactionID) und den unveränderlichen IdempotencyKey auf einen prüfbaren Nachweis zurück. Der Roh-Ingest ist append-only; Abrechnungen sind daraus reproduzierbar.
  3. Lesend / idempotent. Überlappende Wiederholungs-Abrufe buchen nichts doppelt (Unique-Index auf IdempotencyKey, Upsert statt Insert).

1. Architektur-Einbettung

Projekt src/IBKRTrader.Modules.Accounting/ als IModule (Name="Accounting", DbPrefix="acc_"), Registrierung in Program.cs. Referenziert nur den Core. Eigener AccountingDbContext, eigene UI (ein Fenster mit Tabs), eigene Settings-Sektion.

2. Datenbeschaffung

  • Activity Flex Query = primärer Kontoauszug: <Trade> (Käufe/Verkäufe: Preis, Menge, Kommission, Währung, FX-Rate zur Basiswährung, tradeID) und <CashTransaction> (Dividenden, Quellensteuer, Zinsen, Ein-/Auszahlungen, Gebühren).
  • Backfill + Inkrementell: Erstlauf lädt die volle Historie, danach nur Neues ab dem letzten bekannten Zeitpunkt mit Sicherheits-Lookback (Standard 24 h).
  • Idempotenz-Schlüssel je Satz: TRD|<Typ>|<tradeID> bzw. CASH|<Typ>|<transactionID>.
  • Balance-Anker: gemeldeter Kontosaldo je Abruf als Soll-Ist-Kontrollpunkt.
  • Der Abruf liegt hinter Interfaces (IStatementSource/IBalanceAnchorSource/IAccountingAccountSource) mit Offline-Null-Stubs — das Modul läuft ohne Live-Anbindung vollständig (bucht dann korrekt nichts). Der Live-Flex-Abruf ist Zielland-Arbeit.

3. Persistenz (acc_-Tabellen, append-only)

Tabelle Inhalt
acc_ledger Normalisierte, unveränderliche Buchungssätze (Typ, Vorzeichen=Cash-Wirkung, native + Basiswährung, TransactionId, IdempotencyKey unique)
acc_ingest_runs Abruf-Protokoll je Konto (Von/Bis, #neu/#Duplikate, Balance-Anker-Δ)
acc_raw Rohdaten-Snapshots je Batch (Nachweis)
acc_fx_rates amtliche USD→EUR-Tageskurse (EZB) je Datum

4. Logik (pur, unit-getestet — Logic/)

  • AccountingClassifier — Flex-Zeile → Buchungssatz (Typ, Vorzeichen, Idempotenz-Key). Ein-/Auszahlung per Vorzeichen (kombinierte IBKR-Kategorie).
  • AccountingEngine — Periodenabrechnung (Anfangs-/Endsaldo, Einlagen/Entnahmen, Handelsvolumen, Dividenden, Zinsen, Fees, Quellensteuer, Netto-Handelsergebnis Cash-Basis) + Monatsvergleich. Invariante: EndsaldoAnfang = Ergebnis + Einzahlungen Auszahlungen.
  • FxConverter — USD→EUR (Nearest-on-or-before). CsvExporter (RFC-4180, kulturinvariant). PdfExporter (PDFsharp/MigraDoc, MIT).
  • Realisierte GuV nutzt den Core-RealizedPnlEngine (FIFO) — kein Duplikat.

5. UI (Avalonia, ein Fenster mit Registerkarten)

Übersicht/BWA (KPI-Kacheln + Monatsvergleich, Zeitraum-/Konto-/Währungswahl), Ledger (filterbar), Steuer (Platzhalter, s. u.), Abrechnung/Export (CSV/PDF), Abruf/Status (Ingest-Läufe, Soll-Ist, manueller Trigger). DB-Zugriff nur auf Interaktion (Smoke-UI-sicher).

6. Bewusst offen / Zielland-Arbeit

  • Live-IBKR-Flex-Abruf (Token/Query-Id) + Balance-Anker → echte Buchungen (heute Null-Stub).
  • Steuerschicht: Jurisdiktion (DE-Kapitalertragsteuer / US Form 8949) noch nicht festgelegt. Der neutrale Ledger + die Abrechnung gelten unabhängig davon; die Steuer-UI/Engine ist als klar abgetrennter, später füllbarer Platzhalter angelegt. Keine Steuerberatung.
  • EZB-FX-Ingest (acc_fx_rates füllen) → EUR-Ansicht; USD (Basis) ist sofort verfügbar.