fix: Zweiter Uebertrag fuer dieselbe Bewegung wurde nicht erkannt
Die Sperre sah auf dem Zielkonto nur nach Ausgaben und Einnahmen. Steht dort schon ein UEBERTRAG, der dasselbe Geld zwischen denselben beiden Konten bewegt, fand sie nichts – und der zweite ging durch. Genau das passiert im Alltag: Die eine Seite kommt von der Bank, die andere aus der CSV-Datei, und beide sehen einzeln nach einem Uebertrag aus. Wer beide umwidmet, hat das Quellkonto doppelt belastet und das Ziel doppelt gutgeschrieben – bei 1'575 macht das 3'150 Unterschied auf zwei Konten. Jetzt wird zuerst geprueft, ob zwischen denselben beiden Konten schon ein Uebertrag ueber denselben Betrag in derselben Woche steht. Die Richtung ist dabei egal, ein Uebertrag hat kein Vorzeichen. Dieser Fall laesst sich auch nicht mit "trotzdem" uebergehen: Dasselbe Geld zweimal zu verschieben ist keine Ansichtssache. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -485,3 +485,41 @@ def test_uebertrag_nennt_die_echte_quelle_nicht_die_gegenseite(admin):
|
||||
|
||||
aus_liste = [t for t in admin.get("/api/transactions").json() if t["id"] == txn_id][0]
|
||||
assert aus_liste["herkunft"] == "mail", "nicht 'transfer' – das ist die Gegenseite"
|
||||
|
||||
|
||||
def test_zweiter_uebertrag_fuer_dieselbe_bewegung_wird_verhindert(admin):
|
||||
"""Beide Seiten kommen oft getrennt herein – die eine von der Bank, die
|
||||
andere aus der Datei. Wer beide einzeln zum Uebertrag macht, verschiebt das
|
||||
Geld zweimal: Das Quellkonto ist doppelt belastet, das Ziel doppelt
|
||||
gutgeschrieben."""
|
||||
lohn = _konto(admin, name=f"Lohn {secrets.token_hex(3)}", currency="CHF")
|
||||
revolut = _konto(admin, name=f"Revolut {secrets.token_hex(3)}", currency="CHF")
|
||||
betrag = 157500
|
||||
|
||||
# Die Gutschrift kam von der Bank und wurde zum Uebertrag gemacht.
|
||||
gutschrift = admin.post("/api/transactions", json={
|
||||
"type": "income", "date": "2026-08-25", "account_id": revolut["id"],
|
||||
"amount_cents": betrag, "payee": "Guido Schmit"}).json()
|
||||
r = admin.post(f"/api/transactions/{gutschrift['id']}/transfer",
|
||||
json={"to_account_id": lohn["id"]})
|
||||
assert r.status_code == 200, r.text
|
||||
assert admin.get(f"/api/accounts/{revolut['id']}").json()["balance_cents"] == betrag
|
||||
assert admin.get(f"/api/accounts/{lohn['id']}").json()["balance_cents"] == -betrag
|
||||
|
||||
# Jetzt kommt die Belastung aus der CSV-Datei dazu.
|
||||
belastung = admin.post("/api/transactions", json={
|
||||
"type": "expense", "date": "2026-08-25", "account_id": lohn["id"],
|
||||
"amount_cents": betrag, "payee": "Auftrag Revolut"}).json()
|
||||
r = admin.post(f"/api/transactions/{belastung['id']}/transfer",
|
||||
json={"to_account_id": revolut["id"]})
|
||||
assert r.status_code == 400, r.text
|
||||
assert "schon ein Übertrag" in r.json()["detail"]
|
||||
|
||||
# Auch mit "trotzdem" nicht – doppelt verschieben ist keine Ansichtssache.
|
||||
r = admin.post(f"/api/transactions/{belastung['id']}/transfer",
|
||||
json={"to_account_id": revolut["id"], "trotzdem": True})
|
||||
assert r.status_code == 400
|
||||
|
||||
# Und die Salden sind unangetastet (bis auf die neue Belastung selbst).
|
||||
assert admin.get(f"/api/accounts/{revolut['id']}").json()["balance_cents"] == betrag
|
||||
assert admin.get(f"/api/accounts/{lohn['id']}").json()["balance_cents"] == -2 * betrag
|
||||
|
||||
Reference in New Issue
Block a user