fix: Ein Uebertragsvorschlag erscheint nur noch einmal

Jedes Paar steht in der Kandidatenliste zweimal, einmal je Richtung. Was
verknuepft wird, faellt ueber "verbraucht" heraus - ein blosser Vorschlag aber
nicht. Also bot /uebertraege/vorschlaege dieselbe Zahlung zweimal zum
Verbinden an, und wer das zweite anklickte, bekam "bereits verknuepft" fuer
etwas, das er gerade selbst verknuepft hatte.

Betrifft auch die Weboberflaeche: Uebertragsvorschlaege.jsx zeigt die Liste
unveraendert an und hatte denselben Doppeleintrag.

Gefunden beim Bauen der Arbeitsliste fuer die iOS-App - die Pruefdatei brachte
den Vorschlag doppelt zurueck.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Guido
2026-10-21 21:28:00 +02:00
co-authored by Claude Opus 5
parent d04b6b74ad
commit adbc3e0aa4
3 changed files with 76 additions and 4 deletions
+27
View File
@@ -354,3 +354,30 @@ def test_vorschlag_auch_wenn_die_gegenseite_tage_spaeter_steht(admin):
# Bestaetigen kann der Nutzer es trotzdem.
assert admin.post("/api/uebertraege/verbinden",
json={"a_id": raus["id"], "b_id": rein["id"]}).status_code == 200
def test_ein_paar_wird_nur_einmal_vorgeschlagen(admin):
"""Jedes Paar steht intern zweimal, einmal je Richtung.
Ohne Entdopplung saehe der Nutzer dieselbe Zahlung zweimal zum Verbinden
angeboten - und wer das zweite anklickt, bekaeme den Fehler "bereits
verknuepft" fuer etwas, das er gerade selbst verknuepft hat.
"""
import secrets
betrag = 100000 + secrets.randbelow(800000)
a = admin.post("/api/accounts", json={
"name": f"A {secrets.token_hex(3)}", "currency": "EUR"}).json()
b = admin.post("/api/accounts", json={
"name": f"B {secrets.token_hex(3)}", "currency": "EUR"}).json()
raus = admin.post("/api/transactions", json={
"type": "expense", "date": "2026-07-14", "account_id": a["id"],
"amount_cents": betrag, "payee": "Umbuchung"}).json()
rein = admin.post("/api/transactions", json={
"type": "income", "date": "2026-07-14", "account_id": b["id"],
"amount_cents": betrag, "payee": "Umbuchung"}).json()
paare = admin.get("/api/uebertraege/vorschlaege").json()["vorschlaege"]
meins = [p for p in paare
if {p["a"]["id"], p["b"]["id"]} == {raus["id"], rein["id"]}]
assert len(meins) == 1, f"einmal vorschlagen, nicht {len(meins)}-mal"