feat: Gleich aussehende Buchungen stehen in der Arbeitsliste
Bisher fand man Dubletten nur zufaellig beim Durchscrollen der Buchungsliste – oder ich habe ein Skript dafuer geschrieben, und der Nutzer musste sich auf einen Server einloggen, um seine eigenen Zahlen zu reparieren. Beides ist falsch. Die Arbeitsliste zeigt sie jetzt: gleiches Konto, gleicher Tag, gleicher Betrag, gleicher Text. Je Zeile steht die Kennung der Bank dabei, und die entscheidet die Frage – dieselbe Kennung heisst sicher dieselbe Zahlung, verschiedene heissen, die Bank hat sie als verschieden gemeldet. Entschieden wird bewusst NICHTS von selbst. Drei Aufrundungen ueber 1.00 am selben Tag sind echt, drei gleiche Einkaeufe koennen es auch sein; das weiss nur der Nutzer. Certain meldet und laesst loeschen. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -78,3 +78,46 @@ def test_verknuepfte_buchungen_sind_nicht_mehr_offen(admin):
|
||||
params={"uncategorized": True}).json()}
|
||||
assert raus["id"] not in danach and rein["id"] not in danach, \
|
||||
"verknuepfte Buchungen brauchen keine Kategorie mehr"
|
||||
|
||||
|
||||
def test_gleich_aussehende_buchungen_werden_gemeldet_nicht_entschieden(admin):
|
||||
"""Drei Aufrundungen ueber 1.00 am selben Tag sind echt, drei gleiche
|
||||
Einkaeufe koennen es auch sein – das weiss nur der Nutzer. Deshalb wird
|
||||
gemeldet, nicht entschieden, und die Kennung der Bank steht dabei."""
|
||||
import secrets
|
||||
|
||||
from app.database import SessionLocal
|
||||
from app.models import InboxItem, InboxSource, InboxStatus, User
|
||||
|
||||
konto = admin.post("/api/accounts", json={
|
||||
"name": f"Dublette {secrets.token_hex(3)}", "type": "girokonto",
|
||||
"currency": "CHF", "opening_balance_cents": 0}).json()
|
||||
text = f"Migrolino {secrets.token_hex(3)}"
|
||||
ids = [admin.post("/api/transactions", json={
|
||||
"type": "expense", "date": "2026-08-25", "account_id": konto["id"],
|
||||
"amount_cents": 390, "payee": text}).json()["id"] for _ in range(3)]
|
||||
|
||||
# Zwei davon kamen von der Bank, unter verschiedenen Kennungen.
|
||||
db = SessionLocal()
|
||||
try:
|
||||
besitzer = db.query(User).order_by(User.id).first()
|
||||
for i, txn_id in enumerate(ids[:2]):
|
||||
db.add(InboxItem(owner_id=besitzer.id, source=InboxSource.bank,
|
||||
status=InboxStatus.booked, account_id=konto["id"],
|
||||
date=__import__("datetime").date(2026, 8, 25),
|
||||
amount_cents=-390, currency="CHF", payee=text,
|
||||
external_id=f"acc-x:ref-{i}", transaction_id=txn_id))
|
||||
db.commit()
|
||||
finally:
|
||||
db.close()
|
||||
|
||||
gruppen = admin.get("/api/transactions/dubletten").json()["gruppen"]
|
||||
meine = next(g for g in gruppen if g["account_id"] == konto["id"])
|
||||
assert len(meine["zeilen"]) == 3
|
||||
assert meine["amount_cents"] == 390
|
||||
kennungen = {z["kennung"] for z in meine["zeilen"]}
|
||||
assert kennungen == {"ref-0", "ref-1", None}, "die Kennung muss dabeistehen"
|
||||
assert {z["herkunft"] for z in meine["zeilen"]} == {"bank", "manuell"}
|
||||
|
||||
# Und nichts wurde geloescht.
|
||||
assert admin.get(f"/api/accounts/{konto['id']}").json()["balance_cents"] == -1170
|
||||
|
||||
Reference in New Issue
Block a user