Zuletzt aktualisiert:

Kaufland-Bon-Import gebaut: PDF + KI (07.06.2026, ADR-52)

Executive Summary

Kaufland-Kassenbons landen jetzt im Archiv/Vorrat — über PDF-Upload + KI-Extraktion, nicht über die App-API. Grund: Dennis' mitmproxy-Session (analog eGYM) zeigte, dass die Kaufland-App Certificate Pinning betreibt (app.kaufland.net + account.kaufland.com brechen den Handshake ab, während 1Password/Amazon/Outlook sauber durch denselben Proxy laufen). Der passive Auto-Pull (Phase B) wäre damit nur über App-Repacking/Frida machbar — vertagt. Stattdessen Phase A: Bon-PDF aus der Kaufland-Card-App exportieren → in Silverscale hochladen → fertig.

In einfachen Worten

In der Kaufland-App den digitalen Bon als PDF teilen, in Silverscale unter „Einkäufe" auf 📄 Bon-PDF tippen, hochladen. Die KI liest den Bon (alle Positionen, Preise, Rabatte, Pfand), legt ihn ins Bon-Archiv und bucht den Vorrat — genau wie ein Lidl-Bon, nur eben ohne Automatik. Nach ≤1 Minute taucht er in der Liste auf.

Architektur

📄 PDF  → POST /api/receipts/import-pdf   (Raw-Body, %PDF-Check, 15 MB)
            └─ queut ai_job "receipt_pdf"
        → ai_jobs.job_receipt_pdf (Host-Worker, minütlich)
            └─ claude-CLI + Read-Tool liest PDF → striktes Positions-JSON
        → POST /api/receipts/import        (das JSON)
            └─ receipt_import.import_receipt_dict():
                 · Food-Matching über NAMEN (NFKD-normalisiert):
                   bestehenden Artikel wiederverwenden, sonst neu (store='Kaufland')
                 · Pfand/Leergut → is_deposit (kein food)
                 · Idempotenz: kfl-<sha1(store|datum|summe)>
                 · Auto-Bestand wie Lidl
                 · Kontrollsumme Σ Zeilen == Endbetrag → needs_review-Flag

Bewusst getrennt von importer.py: Der Lidl-Importer ist artId-zentriert (Lidl-Artikelnummern). Fremd-Bons haben die nicht → eigener, namensbasierter Pfad in receipt_import.py. Das Modul ist quelle-agnostisch: ein künftiger dritter Markt bräuchte nur einen Extraktions-Prompt, kein neues Import-Backend.

Sicherheit & Qualität

Vorschau vor dem Import (Nachtrag, gleicher Tag)

Damit ein verlesener Bon nicht still die Datenbank verändert, importiert der PDF-Weg nicht mehr automatisch, sondern zeigt erst eine Vorschau:

📄 PDF hochladen → job_receipt_pdf EXTRAHIERT nur (KI → Bon-JSON in Job-note),
                   importiert selbst NICHTS
   ↓ Frontend pollt den Job (AiProgress-Ring)
📋 Vorschau-Sheet (ReceiptPreview.svelte): erkannte Positionen, Preise,
   Rabatte, Pfand; Kontrollsummen-Warnung falls Σ ≠ Endbetrag
   · jede Food-Position per Checkbox fürs Einlagern abwählbar (Pfand fix aus)
   ↓ „Importieren"                              ↓ „Verwerfen"
POST /api/receipts/import (mit to_inventory     nichts passiert –
je Zeile) → Bon ins Archiv + gewählte           in der DB lag bis hierhin
Positionen in den Vorrat                          ohnehin nichts

Phase B (vertagt)

Auto-Pull via kaufland.py braucht App-Entpinnung (iOS-IPA + Frida + Re-Signing mit Dev-Account, oder Android-Emulator + apk-mitm). Details + Plan-C in der Recherche §8. Bei echtem Bedarf jederzeit nachrüstbar — Phase A deckt den Alltag risikofrei ab.


Bezug: Kaufland-Recherche · ADR-52 in app/ARCHITEKTUR.md