# Budget Import Review UAT v2

Datum: 2026-05-18T09:25:32Z

Branch: `feat/budget-import-production-v2`

Basis-Commit vor UAT: `a4a1a75aec47e1ac398337d92b73b58aab3cb7cc`

## Scope

Kontrollierter UAT-Lauf mit echten Budget-Import-Kandidaten aus den v2-Quellen:

- `visa_credit_card`
- `migros_receipts`
- `raiffeisen_bank`
- `akb_bank`

Nicht Teil dieses UAT:

- keine neuen Importquellen
- keine neue Feature-Entwicklung
- keine Portfolio-Importfunktion
- kein Bulk Confirm
- keine CSV-Dateien im Git
- keine Runtime-DB im Git
- keine Beträge in dieser Dokumentation

## Runtime-Preflight

- Korrekte Branch: ja
- Backend erreichbar: ja
- Frontend erreichbar: ja
- Runtime-DB erreichbar: ja
- Runtime-DB außerhalb Repo: ja
- Kandidaten vorhanden: ja
- Git working tree vor UAT sauber: ja
- Git-Safety vor UAT sauber: ja

## Runtime-Backup

- Backup erstellt: ja
- Backup-Datei: `/home/agent/jarvis_runtime/finance-system/backups/finance-runtime-db-budget-import-review-uat-v2-20260518T092019Z.sqlite3`
- Checksum-Datei: `/home/agent/jarvis_runtime/finance-system/backups/finance-runtime-db-budget-import-review-uat-v2-20260518T092019Z.sqlite3.sha256`
- Checksum verifiziert: ja
- Backup außerhalb Repo: ja

## Kandidatenübersicht vor UAT

Gesamtbestand Kandidaten: 13274

V2-Quellen:

- VISA (`visa_credit_card`): 1376
- Migros (`migros_receipts`): 49
- Raiffeisen (`raiffeisen_bank`): 47
- AKB (`akb_bank`): 332

Aggregierte Qualitäts-/Statuszählung über alle Kandidaten:

- Auto-kategorisiert / mit Kategorie-Vorschlag: 9208
- Review nötig: 2695
- Transfers: 61
- Investment Transfers / True Wealth: 0
- Kreditkartenausgleich: 0
- covered_by_migros: 540
- Duplikat-Kandidaten: 49
- Einnahmen-Kandidaten: 0
- Unklare Kandidaten: 592

Hinweis: Neben den v2-Quellen existieren Legacy-/superseded-/Reference-Kandidaten aus früheren Budgetphasen. Der UAT wurde auf die v2-Quellen beschränkt.

## UAT-Auswahl

Maximal kleine Stichprobe, keine Massenbestätigung:

- 3 sichere VISA-Abo-Kandidaten: ausgewählt und bestätigt
- 3 Migros-Bon-Kandidaten: geprüft, aber nicht bestätigt, da alle als Duplikatkandidaten erkannt
- 2 klare VISA-Ausgaben ohne Galaxus/Digitec: ausgewählt und bestätigt
- 1 Galaxus/Digitec-Kandidat: Split-Draft/Review getestet, nicht produktiv bestätigt
- 1 AKB/Raiffeisen-Transferkandidat: Transfer-Review/Preview getestet, nicht produktiv bestätigt
- 1 Kreditkartenausgleich-Kandidat: nicht vorhanden
- 1 True-Wealth-/Investment-Transfer-Kandidat: nicht vorhanden
- 1 Einnahmen-Kandidat: nicht vorhanden

## Durchgeführte Confirm-Fälle

Produktiv bestätigt wurden ausschließlich einzelne, vorher per Preview geprüfte Kandidaten:

- VISA-Abos: 3
- klare VISA-Ausgaben: 2

Gesamt produktive neue `budget_transactions`: 5

Alle 5 Confirm-Fälle wurden geprüft:

- Kandidatstatus `confirmed`: ja
- `confirmed_transaction_id` gesetzt: ja
- produktive `budget_transactions` vorhanden: ja
- `source_type='import_candidate'`: ja
- `source_candidate_id` verlinkt: ja
- Audit vorhanden: ja

## Nicht-confirmed Fälle

- Migros-Bons: 3 geprüft, 0 bestätigt
  - Grund: v2-Migros-Bons sind als Duplikatkandidaten erkannt; Confirm ohne explizites `allow_duplicate` wurde blockiert.
  - Artikelzeilen bleiben Detaildaten.
- Galaxus/Digitec: 1 geprüft, 0 bestätigt
  - Split-Draft wurde angelegt, aber kein Split-Confirm durchgeführt.
- Transfer: 1 geprüft, 0 bestätigt
  - Als Transfer-Review belassen.
- Kreditkartenausgleich: keine Kandidaten vorhanden.
- Investment Transfer / True Wealth: keine Kandidaten vorhanden.
- Einnahmen: keine klaren Kandidaten vorhanden.

## Transfer-Fälle

- Transfer-Review durchgeführt: ja
- Produktiver Transfer bestätigt: nein
- Transfer-/Investment-/Kreditkartenausgleichskandidaten als Einkommen/Ausgabe bestätigt: nein
- Nachkontrolle: 0 Transfer-Kandidaten wurden im UAT als Expense/Income verbucht.

## Duplikatfälle

- Migros-v2-Duplikatkandidaten vorhanden: ja
- Geprüfte Migros-Duplikatfälle: 3
- Confirm ohne explizite Duplikatfreigabe blockiert: 3
- Produktive Migros-v2-Doppelbuchungen erzeugt: 0
- Migros Artikelzeilen als Detaildaten vorhanden: 1448

## covered_by_migros

- VISA-2026 `covered_by_migros` offen/markiert: 52
- `covered_by_migros` produktiv bestätigt: 0
- Doppelzählung durch covered-by-Migros im UAT: nein

## Merchant/Alias/Regeln

- Neue Merchant Aliases angelegt: nein
- Neue Regeln angelegt: nein
- Kategorie-Overrides auf UAT-Stichprobe: 5
- Produktive Buchung durch Regelanwendung: nein

## Dashboard/API-Nachkontrolle

Alle folgenden lokalen Routen/APIs lieferten HTTP 200:

- `/api/health`
- `/api/budget/transactions?transaction_type=expense&year=2026`
- `/api/budget/transactions?transaction_type=income&year=2026`
- `/api/budget/status/categories?year=2026`
- `/api/budget/analysis/categories?year=2026&tx_type=expense`
- `/api/budget/analysis/monthly-comparison?year=2026`
- `/api/budget/transaction-candidates?tab=visa&budget_year=2026`
- `/planning/budget/expenses/review`
- `/planning/budget/expenses/actual`
- `/planning/budget/income/actual`
- `/planning/budget/status`
- `/planning/budget/analysis/categories`
- `/planning/budget/analysis/monthly-comparison`

Nachkontrolle:

- Effektive Ausgaben aktualisiert: ja
- Effektive Einnahmen erreichbar: ja, aber keine neuen Einnahmen bestätigt
- Budgetstatus erreichbar/aktualisiert aus bestätigten Transaktionen: ja
- Kategorieanalyse erreichbar: ja
- Monatsvergleich erreichbar: ja
- Kandidatenreview aktualisiert: ja

## Offene Probleme / Grenzen

- Die aktuelle v2-Runtime-Auswahl enthält keine erkannten Kreditkartenausgleich-, True-Wealth-/Investment-Transfer- oder Einnahmen-Kandidaten.
- Migros-v2-Kandidaten sind vollständig als Duplikatkandidaten erkannt, daher wurden im UAT keine Migros-Bons produktiv bestätigt. Das ist sicherheitsseitig korrekt, muss aber fachlich im Review weiter betrachtet werden.
- Die VISA-Abos benötigten Kategorie-Overrides auf die vorhandene Abo-/Freizeit-Kategorie, bevor Confirm möglich war. Das spricht für eine spätere Regel-/Alias-Verfeinerung, nicht für eine UAT-Blockade.
- Galaxus/Digitec wurde bewusst nur als Split-Draft geprüft und nicht produktiv gebucht.
- Transfer wurde bewusst nur als Review/Preview geprüft und nicht produktiv gebucht.

## Verification

Nach UAT auszuführen bzw. im Abschlussbericht zu dokumentieren:

- Python compile
- kritische pytest-Suite
- kritische Frontend-Tests
- Frontend build, falls Build-/Frontend-Änderung relevant
- Git-Safety
- `git diff --check`
- Browser sanity
- Commit/Push dieses UAT-Dokuments
