fix: Gegenbuchungs-Erkennung beachtet die Richtung
Die Suche prüfte nur Betrag und Zeitfenster. Ein erwarteter Transfer-EINGANG passte damit auch auf eine gleich hohe AUSGABE: Die echte Ausgabe galt als Gegenbuchung, wurde nicht gebucht und der Saldo lief um ihren Betrag zu hoch. Jetzt muss das Vorzeichen zur Seite des Transfers passen (wo Geld ankam, kann keine Ausgabe die Gegenseite sein). Test deckt genau diesen Fall ab; 87 grün. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -278,9 +278,14 @@ def _find_counterpart(
|
||||
absamt = abs(amount)
|
||||
unscharf = None
|
||||
for eintrag in side_index.get(account.id, []):
|
||||
txn_id, t_date, erwartet, other_id = eintrag
|
||||
txn_id, t_date, erwartet, other_id, richtung = eintrag
|
||||
if txn_id in verbraucht or abs((t_date - d).days) > COUNTERPART_DAYS:
|
||||
continue
|
||||
# Die Richtung muss stimmen: Wo Geld ankam, kann keine Ausgabe die
|
||||
# Gegenseite sein. Ohne diese Prüfung verschluckt eine Ausgabe über
|
||||
# denselben Betrag den erwarteten Eingang – der Saldo liefe zu hoch.
|
||||
if (amount < 0) != (richtung < 0):
|
||||
continue
|
||||
# Hat eine Regel ein Gegenkonto gesetzt, muss es dazu passen.
|
||||
if nur_konto is not None and other_id != nur_konto:
|
||||
continue
|
||||
@@ -380,8 +385,8 @@ def detect_rows(db: Session, user: User, account: Account, candidates: list[dict
|
||||
Transaction.to_account_id.isnot(None))
|
||||
):
|
||||
gutschrift = t_to_amt if t_to_amt is not None else t_amt
|
||||
side_index.setdefault(t_acc, []).append((t_id, t_date, t_amt, t_to))
|
||||
side_index.setdefault(t_to, []).append((t_id, t_date, gutschrift, t_acc))
|
||||
side_index.setdefault(t_acc, []).append((t_id, t_date, t_amt, t_to, -1))
|
||||
side_index.setdefault(t_to, []).append((t_id, t_date, gutschrift, t_acc, +1))
|
||||
verbraucht: set[int] = set()
|
||||
waehrung_je_konto: dict[int, str] = dict(
|
||||
db.query(Account.id, Account.currency).filter(Account.owner_id == user.id)
|
||||
|
||||
Reference in New Issue
Block a user