feat: Konto wird aus der Datei erkannt – ein Kurzbefehl genuegt

Bisher brauchte es je Konto einen eigenen Kurzbefehl, weil account_id
Pflicht war. Jetzt ist sie optional: Raiffeisen fuehrt die eigene IBAN in der
Datei mit (Treffer gegen die Erkennungs-Texte der Konten), Revolut die
Waehrung – zusammen mit der erkannten Bank und dem Import-Verlauf reicht das.

Bleibt es mehrdeutig, wird NICHT geraten: Ein Auszug im falschen Konto
verfaelscht zwei Salden auf einmal. Stattdessen nennt die Fehlermeldung die
Konten samt Nummern, sodass man sie im Kurzbefehl nachtragen kann. Hat der
Schluessel ein Standardkonto, gilt das.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Guido
2026-08-22 23:54:27 +02:00
co-authored by Claude Opus 5
parent 1b401ff358
commit e8a862bd63
5 changed files with 161 additions and 14 deletions
+30 -3
View File
@@ -154,7 +154,7 @@ MAX_UPLOAD = 5 * 1024 * 1024
@router.post("/statement", status_code=status.HTTP_201_CREATED)
async def quick_statement(
file: UploadFile = File(...),
account_id: int = Form(...),
account_id: int | None = Form(None),
marke: ApiToken = Depends(require_quick_token),
db: Session = Depends(get_db),
) -> dict:
@@ -165,7 +165,6 @@ async def quick_statement(
wartet in der Import-Ansicht – dort gibt es Vorschau, Saldo-Abgleich und
die Möglichkeit, einzelne Zeilen abzuwählen.
"""
konto = _konto(db, marke, account_id)
daten = await file.read()
if not daten:
raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="Datei ist leer")
@@ -176,6 +175,33 @@ async def quick_statement(
f"{MAX_UPLOAD // 1024 // 1024} MB)",
)
# Ohne ausdrückliche Angabe das Konto aus der Datei ableiten – dann reicht
# EIN Kurzbefehl fürs Telefon statt einer je Konto.
if account_id is not None:
konto = _konto(db, marke, account_id)
herkunft = "angegeben"
else:
user = db.get(User, marke.owner_id)
erkannt = csv_import.erkenne_format(daten)
gefunden = csv_import.erkenne_konto(db, user, daten, erkannt)
if gefunden["account_id"] is None:
if marke.default_account_id:
konto = _konto(db, marke, marke.default_account_id)
herkunft = "Standardkonto des Schlüssels"
else:
namen = ", ".join(
f"{a.name} = {a.id}" for a in db.query(Account).filter(
Account.owner_id == marke.owner_id, Account.is_archived.is_(False))
)
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail=(f"{gefunden['grund']}. Bitte account_id im Kurzbefehl "
f"angeben. Deine Konten: {namen}"),
)
else:
konto = _konto(db, marke, gefunden["account_id"])
herkunft = gefunden["grund"]
upload = PendingUpload(
owner_id=marke.owner_id,
account_id=konto.id,
@@ -190,5 +216,6 @@ async def quick_statement(
"id": upload.id,
"konto": konto.name,
"size_bytes": upload.size_bytes,
"message": f"Empfangen für {konto.name} – zum Prüfen in Certain öffnen",
"erkannt_als": herkunft,
"message": f"Empfangen für {konto.name} ({herkunft}) – zum Prüfen in Certain öffnen",
}