fix: Ein Uebertrag im Eingang fragt nicht mehr nach der Kategorie
Die Zeile im Eingang zeigte die Kategorie-Auswahl bedingungslos – auch bei einem Kontouebertrag, der gar keine bekommt. Die Oberflaeche konnte es auch nicht wissen: InboxItemOut hatte kein Feld, an dem sich ein Uebertrag erkennen laesst. Jetzt liefert der Eintrag transfer_account_id mit – das jeweils ANDERE Konto, aus seiner Sicht. Steht es, zeigt die Zeile '↔ Kontoname' statt der Auswahl. Ermittelt wird es mit einer Sammelabfrage, nicht je Zeile: Die Liste geht bis 200 Eintraege. Dazu die Luecke dahinter: set_category schrieb die Kategorie auch auf die Buchung und konnte sie so auf einem TxnType.transfer ablegen – genau das, was das Buchungsformular beim Anlegen verhindert. Bei einem Uebertrag lehnt der Endpunkt jetzt ab; bei allem anderen bleibt es, wie es war. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -16,6 +16,14 @@ def _konto(admin, **kw):
|
||||
return r.json()
|
||||
|
||||
|
||||
def _kategorie(admin):
|
||||
"""Irgendeine Ausgabe-Kategorie aus den Vorgaben."""
|
||||
for gruppe in admin.get("/api/categories").json():
|
||||
if gruppe["kind"] == "expense" and gruppe["categories"]:
|
||||
return gruppe["categories"][0]["id"]
|
||||
raise AssertionError("keine Ausgabe-Kategorie vorhanden")
|
||||
|
||||
|
||||
def _eingang(admin, konto, betrag_cents, datum="2026-08-20", payee="Umbuchung"):
|
||||
"""Ein OFFENER Eintrag – so wie ihn Mail und Bankabruf hinterlassen.
|
||||
|
||||
@@ -142,3 +150,44 @@ def test_angebundenes_zielkonto_wird_abgefangen(admin):
|
||||
json={"to_account_id": ziel["id"], "trotzdem": True})
|
||||
assert r.status_code == 200, r.text
|
||||
assert admin.get(f"/api/accounts/{ziel['id']}").json()["balance_cents"] == 10000
|
||||
|
||||
|
||||
def test_uebertrag_nennt_das_gegenkonto_und_nimmt_keine_kategorie(admin):
|
||||
"""Ohne das Gegenkonto kann die Oberfläche einen Übertrag nicht von einer
|
||||
Ausgabe unterscheiden – und fragt weiter nach einer Kategorie."""
|
||||
von = _konto(admin, name=f"Nenn-Von {secrets.token_hex(3)}", currency="CHF")
|
||||
nach = _konto(admin, name=f"Nenn-Nach {secrets.token_hex(3)}", currency="CHF")
|
||||
eintrag = _eingang(admin, von, -8000)
|
||||
|
||||
r = admin.post(f"/api/inbox/{eintrag['id']}/transfer", json={"to_account_id": nach["id"]})
|
||||
assert r.status_code == 200, r.text
|
||||
assert r.json()["transfer_account_id"] == nach["id"]
|
||||
|
||||
# Auch in der Liste, und aus Sicht des Eintrags das jeweils ANDERE Konto.
|
||||
aus_liste = [e for e in admin.get("/api/inbox").json() if e["id"] == eintrag["id"]][0]
|
||||
assert aus_liste["transfer_account_id"] == nach["id"]
|
||||
|
||||
r = admin.post(f"/api/inbox/{eintrag['id']}/category/{_kategorie(admin)}")
|
||||
assert r.status_code == 400, r.text
|
||||
assert "Kategorie" in r.json()["detail"]
|
||||
|
||||
# Und die Buchung hat weiterhin keine.
|
||||
txn = admin.get(f"/api/transactions/{aus_liste['transaction_id']}").json()
|
||||
assert txn["category_id"] is None
|
||||
|
||||
|
||||
def test_normale_buchung_nimmt_weiterhin_eine_kategorie(admin):
|
||||
"""Die Sperre darf nur Überträge treffen."""
|
||||
konto = _konto(admin, name=f"Normal {secrets.token_hex(3)}", currency="CHF")
|
||||
# Eigener Betrag: Die Testdatenbank lebt ueber den ganzen Lauf, und ein
|
||||
# runder Betrag kollidiert mit dem, wonach ein anderer Test sucht.
|
||||
eintrag = _eingang(admin, konto, -(700000 + secrets.randbelow(90000)))
|
||||
admin.post(f"/api/inbox/{eintrag['id']}/book")
|
||||
|
||||
kat = _kategorie(admin)
|
||||
r = admin.post(f"/api/inbox/{eintrag['id']}/category/{kat}")
|
||||
assert r.status_code == 200, r.text
|
||||
assert r.json()["category_id"] == kat
|
||||
assert r.json()["transfer_account_id"] is None
|
||||
txn = admin.get(f"/api/transactions/{r.json()['transaction_id']}").json()
|
||||
assert txn["category_id"] == kat, "die Kategorie muss auch an der Buchung stehen"
|
||||
|
||||
Reference in New Issue
Block a user