fix: Konto loeschen veraendert keine fremden Salden mehr
Beide Konto-Spalten einer Buchung hingen an ON DELETE CASCADE. Wurde ein Zielkonto geloescht, verschwand die ganze Buchung – auch die Abgangsseite, die einem anderen Konto gehoert. Dessen Saldo stieg dadurch stillschweigend um den Uebertrag; beim Loeschen von 'Revolut investments' waren es 1'020.99. Vor dem Loeschen werden solche Uebertraege jetzt zu gewoehnlicher Ausgabe bzw. Einnahme auf dem verbleibenden Konto. Nur was allein am geloeschten Konto haengt, geht mit ihm. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -162,3 +162,41 @@ def test_ohne_stichtag_zaehlt_alles(admin):
|
||||
admin.post("/api/transactions", json={"type": "expense", "date": "2020-01-01",
|
||||
"account_id": acc["id"], "amount_cents": 2500})
|
||||
assert admin.get(f"/api/accounts/{acc['id']}").json()["balance_cents"] == 7500
|
||||
|
||||
|
||||
def test_konto_loeschen_laesst_fremden_saldo_unberuehrt(admin):
|
||||
"""Ein gelöschtes Konto darf den Saldo eines anderen nicht verändern.
|
||||
|
||||
``to_account_id`` hängt an ON DELETE CASCADE. Wurde das Zielkonto gelöscht,
|
||||
verschwand die ganze Buchung – auch die Abgangsseite, die dem Quellkonto
|
||||
gehört. Dessen Saldo stieg dadurch stillschweigend um den Übertrag.
|
||||
"""
|
||||
quelle = _mk_account(admin, name="Quelle", currency="CHF", opening_balance_cents=100000)
|
||||
ziel = _mk_account(admin, name="Depot", currency="CHF")
|
||||
r = admin.post("/api/transactions", json={
|
||||
"type": "transfer", "date": "2026-03-01", "account_id": quelle["id"],
|
||||
"to_account_id": ziel["id"], "amount_cents": 30000,
|
||||
})
|
||||
assert r.status_code == 201, r.text
|
||||
assert admin.get(f"/api/accounts/{quelle['id']}").json()["balance_cents"] == 70000
|
||||
|
||||
assert admin.delete(f"/api/accounts/{ziel['id']}").status_code == 204
|
||||
# Das Geld ist abgeflossen und bleibt abgeflossen.
|
||||
assert admin.get(f"/api/accounts/{quelle['id']}").json()["balance_cents"] == 70000
|
||||
verbleibend = [t for t in admin.get("/api/transactions").json()
|
||||
if t["account_id"] == quelle["id"] and t["date"] == "2026-03-01"]
|
||||
assert len(verbleibend) == 1
|
||||
assert verbleibend[0]["type"] == "expense"
|
||||
|
||||
|
||||
def test_konto_loeschen_erhaelt_zugang_beim_zielkonto(admin):
|
||||
"""Umgekehrt: War das gelöschte Konto die Quelle, bleibt der Zugang beim Ziel."""
|
||||
quelle = _mk_account(admin, name="Weg", currency="CHF", opening_balance_cents=50000)
|
||||
ziel = _mk_account(admin, name="Bleibt", currency="CHF")
|
||||
admin.post("/api/transactions", json={
|
||||
"type": "transfer", "date": "2026-03-02", "account_id": quelle["id"],
|
||||
"to_account_id": ziel["id"], "amount_cents": 20000,
|
||||
})
|
||||
assert admin.get(f"/api/accounts/{ziel['id']}").json()["balance_cents"] == 20000
|
||||
assert admin.delete(f"/api/accounts/{quelle['id']}").status_code == 204
|
||||
assert admin.get(f"/api/accounts/{ziel['id']}").json()["balance_cents"] == 20000
|
||||
|
||||
Reference in New Issue
Block a user