feat: Doppelt gebuchte Uebertraege auffindbar machen

Solange beim Anlegen eines Uebertrags nicht geprueft wurde, ob die Gegenseite
schon gebucht ist, konnte dieselbe Bewegung zweimal auf einem Konto landen.
Das ist seit dem vorigen Commit unterbunden – die Daten von vorher bleiben
aber, wie sie sind.

Das Skript findet sie: Zu jedem Uebertrag sieht es auf BEIDEN Konten nach, ob
dort zusaetzlich eine passende Buchung steht (gleiche Tage, passender Betrag,
ueber Waehrungen hinweg mit Spielraum), und rechnet zusammen, wieviel dann zu
viel dasteht.

Es aendert NICHTS und oeffnet die Datenbank nur lesend. Aufraeumen bleibt Sache
des Nutzers, denn welche der beiden Zeilen falsch ist, haengt daran, ob Certain
das Gegenkonto selbst abholt – das kann das Skript nicht wissen, und ein
Aufraeumskript hat hier schon einmal Richtiges mit weggeraeumt. Beide Faelle
stehen als Anleitung dabei.

Dazu ein Regressionstest fuer genau den gemeldeten Fall: Gutschrift steht schon
auf dem Zielkonto, die Belastung soll zum Uebertrag werden – das wird jetzt
abgefangen, und der Saldo des Zielkontos bleibt unveraendert.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Guido
2026-08-27 11:28:12 +02:00
co-authored by Claude Opus 5
parent 6cd1c100c0
commit 0cd0aab90d
2 changed files with 127 additions and 0 deletions
+20
View File
@@ -433,3 +433,23 @@ def test_uebertrag_nimmt_den_kurs_der_bank_auch_nachtraeglich(admin):
assert r.status_code == 200, r.text
assert r.json()["to_amount_cents"] == 42532, "der Betrag der Bank, nicht der gerechnete"
assert admin.get(f"/api/accounts/{eur['id']}").json()["balance_cents"] == 42532
def test_lohnzahlung_auf_zwei_konten_wird_abgefangen(admin):
"""Genau der gemeldete Fall: Die Gutschrift steht schon auf dem Zielkonto,
die Belastung soll zum Uebertrag werden. Ohne Sperre stuenden 1'575 zweimal
auf dem Zielkonto."""
lohn = _konto(admin, name=f"Raiffeisen Lohn {secrets.token_hex(3)}", currency="CHF")
revolut = _konto(admin, name=f"Revolut CHF {secrets.token_hex(3)}", currency="CHF")
raus = admin.post("/api/transactions", json={
"type": "expense", "date": "2026-08-25", "account_id": lohn["id"],
"amount_cents": 157500, "payee": "Guido Schmit"}).json()
admin.post("/api/transactions", json={
"type": "income", "date": "2026-08-25", "account_id": revolut["id"],
"amount_cents": 157500, "payee": "GUIDO SCHMIT"})
r = admin.post(f"/api/transactions/{raus['id']}/transfer",
json={"to_account_id": revolut["id"]})
assert r.status_code == 409, r.text
assert admin.get(f"/api/accounts/{revolut['id']}").json()["balance_cents"] == 157500, \
"das Geld darf nicht zweimal dastehen"