fix: Dieselbe Zahlung ueber zwei Bankzugaenge kam doppelt herein
Wer dieselbe Bank zweimal verbindet, bekommt fuer dieselbe Zahlung zwei verschiedene Kennungen – Enable Banking fuehrt eine Bank je Land getrennt. Genau das passiert bei Revolut: Ueber den DE-Eintrag kommen drei Konten, ueber den LT-Eintrag zusaetzlich die Pockets, also verbindet man beide. Zeigen dann zwei Bankkonten auf dasselbe Konto in Certain, holt jeder Zugang dieselben Umsaetze, und der Duplikatschutz kann sie nicht als dieselben erkennen. Drei Aenderungen: - Ein Konto in Certain wird nur noch von EINEM Bankkonto gefuellt. Ordnet man ein zweites zu, wird die alte Zuordnung geloest. Sie ist ohnehin nie richtig, und stillschweigend doppelt zu buchen ist schlimmer als eine geloeste Zuordnung. - Die Ausnahme im Ueberschneidungsschutz gilt nur noch fuer DASSELBE Bankkonto. Dort entscheidet die Kennung der Bank, und die ist exakt – zwei Aufrundungen ueber 1.00 duerfen sich nicht verschlucken. Buchungen aus einem ANDEREN Zugang zaehlen jetzt mit. - Das Aufraeumskript kennt den Fall: Findet es in einer Gruppe (Konto, Art, Tag, Betrag) Buchungen aus zwei Zugaengen, bleibt die Fassung EINES Zugangs stehen. Aufrundungen aus einem einzigen Zugang bleiben unangetastet, auch wenn sie gleich aussehen. An nachgestellten Daten geprueft: Aus -579.50 wird -290.50; die drei gleichen Aufrundungen aus einem Zugang bleiben alle stehen. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -1157,3 +1157,64 @@ def test_uebergangene_konten_werden_gezeigt_nicht_nur_gezaehlt(admin, fake_bank)
|
||||
# Und zwar mitsamt dem, was ankam – sonst raet man, was ihnen fehlt.
|
||||
namen = {k.get("name") for k in daten["uebergangen"]}
|
||||
assert namen == {"Sparen", "Steuern"}
|
||||
|
||||
|
||||
def test_ein_konto_wird_nur_von_einem_bankkonto_gefuellt(admin, fake_bank):
|
||||
"""Sonst holen zwei Zugaenge dieselben Umsaetze – mit verschiedenen
|
||||
Kennungen, also ohne dass der Duplikatschutz greift. Genau das passiert,
|
||||
wenn dieselbe Bank zweimal verbunden ist: Enable Banking fuehrt sie je
|
||||
Land getrennt und vergibt eigene Kennungen."""
|
||||
_app(admin)
|
||||
konto = _konto(admin, name=f"Doppelt gefuellt {secrets.token_hex(3)}", currency="EUR")
|
||||
|
||||
links = []
|
||||
for land in ("DE", "LT"):
|
||||
uid = f"acc-{secrets.token_hex(4)}"
|
||||
fake_bank(konten=[{"uid": uid, "currency": "EUR"}])
|
||||
state = admin.post("/api/bank/connect",
|
||||
json={"aspsp_name": f"Revolut-{land}-{secrets.token_hex(3)}",
|
||||
"country": land}).json()["state"]
|
||||
admin.post(f"/api/bank/callback?state={state}&code=guter-code")
|
||||
links.append([v for v in admin.get("/api/bank/links").json()
|
||||
if v["remote_uid"] == uid][0])
|
||||
|
||||
admin.post(f"/api/bank/links/{links[0]['id']}/account/{konto['id']}")
|
||||
admin.post(f"/api/bank/links/{links[1]['id']}/account/{konto['id']}")
|
||||
|
||||
zugeordnet = [v for v in admin.get("/api/bank/links").json()
|
||||
if v["account_id"] == konto["id"]]
|
||||
assert len(zugeordnet) == 1, "zwei Bankkonten fuellen dasselbe Konto"
|
||||
assert zugeordnet[0]["id"] == links[1]["id"], "die neuere Zuordnung gewinnt"
|
||||
|
||||
|
||||
def test_zweiter_bankzugang_bucht_dieselbe_zahlung_nicht_noch_einmal(admin, fake_bank):
|
||||
"""Auch wenn die Zuordnung von Hand geaendert wurde: Eine Zahlung, die
|
||||
ueber den einen Zugang schon gebucht ist, darf ueber den anderen nicht
|
||||
ein zweites Mal hereinkommen."""
|
||||
_app(admin)
|
||||
heute = date.today().isoformat()
|
||||
konto = _konto(admin, name=f"Zwei Zugaenge {secrets.token_hex(3)}", currency="EUR")
|
||||
salden = [{"balance_type": "CLBD",
|
||||
"balance_amount": {"amount": "0.00", "currency": "EUR"}}]
|
||||
|
||||
def verbinde(land):
|
||||
uid = f"acc-{secrets.token_hex(4)}"
|
||||
fake_bank(konten=[{"uid": uid, "currency": "EUR"}], salden=salden,
|
||||
umsaetze=[dict(UMSATZ, entry_reference=f"ref-{land}",
|
||||
booking_date=heute)])
|
||||
state = admin.post("/api/bank/connect",
|
||||
json={"aspsp_name": f"Zwei-{land}-{secrets.token_hex(3)}",
|
||||
"country": land}).json()["state"]
|
||||
admin.post(f"/api/bank/callback?state={state}&code=guter-code")
|
||||
return [v for v in admin.get("/api/bank/links").json() if v["remote_uid"] == uid][0]
|
||||
|
||||
eins, zwei = verbinde("DE"), verbinde("LT")
|
||||
admin.post(f"/api/bank/links/{eins['id']}/account/{konto['id']}")
|
||||
admin.post(f"/api/bank/links/{eins['id']}/sync")
|
||||
assert admin.get(f"/api/accounts/{konto['id']}").json()["balance_cents"] == -1490
|
||||
|
||||
# Jetzt derselbe Umsatz ueber den zweiten Zugang – andere Kennung.
|
||||
admin.post(f"/api/bank/links/{zwei['id']}/account/{konto['id']}")
|
||||
r = admin.post(f"/api/bank/links/{zwei['id']}/sync").json()
|
||||
assert r["doppelt"] == 1, r
|
||||
assert admin.get(f"/api/accounts/{konto['id']}").json()["balance_cents"] == -1490
|
||||
|
||||
Reference in New Issue
Block a user