feat: Transfer-Erkennung symmetrisch (Eingänge) + Gegenbuchungs-Erkennung
- Enthält der Buchungstext den Erkennungs-Text (Art „Text") eines ANDEREN Kontos, wird auch ein Eingang als Transfer VON diesem Konto gesetzt – nicht nur die Ausgabe. Richtung ergibt sich aus dem Vorzeichen. - Gegenbuchungs-Erkennung: existiert schon ein Transfer zwischen denselben Konten mit passendem Betrag (±5 Tage), wird die Gegenseite als „Gegenbuchung" markiert und nicht angehakt – so zählt dieselbe Bewegung beim Import beider Auszüge nicht doppelt (überschreibbar in der Prüfansicht). - Tests: Eingang übers Konto-Tag, Gegenbuchung übersprungen (78 grün) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -270,6 +270,35 @@ def test_transfer_keyword_fixed_target(admin):
|
||||
assert r2.json()["target_account_id"] == giro["id"]
|
||||
|
||||
|
||||
def test_incoming_transfer_via_account_tag(admin):
|
||||
# Erkennungs-Text am Quellkonto (Raiffeisen); Eingang auf Revolut wird zum
|
||||
# Transfer VON Raiffeisen (symmetrische Erkennung, ohne Schlagwort).
|
||||
revolut = _account(admin, name="Revolut Sym", identifiers=[{"kind": "text", "value": "Revolut"}])
|
||||
raiff = _account(admin, name="Raiffeisen Sym", identifiers=[{"kind": "text", "value": "Raiffeisen"}])
|
||||
csv = "Datum;Betrag;Empfaenger;Zweck\n01.03.2026;120,00;Gutschrift;Uebertrag Raiffeisen\n"
|
||||
rows = _preview_csv(admin, revolut["id"], csv, COLMAP)
|
||||
assert rows[0]["type"] == "transfer"
|
||||
assert rows[0]["to_account_id"] == raiff["id"]
|
||||
|
||||
|
||||
def test_transfer_counterpart_skipped(admin):
|
||||
a = _account(admin, name="Konto A CP", identifiers=[{"kind": "text", "value": "KontoA"}])
|
||||
b = _account(admin, name="Konto B CP", identifiers=[{"kind": "text", "value": "KontoB"}])
|
||||
# A-Auszug: Ausgang -100 mit „KontoB" -> Transfer nach B; buchen.
|
||||
rowsA = _preview_csv(admin, a["id"],
|
||||
"Datum;Betrag;Empfaenger;Zweck\n05.03.2026;-100,00;Uebertrag;an KontoB\n", COLMAP)
|
||||
assert rowsA[0]["type"] == "transfer" and rowsA[0]["to_account_id"] == b["id"]
|
||||
r = admin.post("/api/imports/commit", json={"account_id": a["id"], "filename": "a.csv", "rows": rowsA})
|
||||
assert r.status_code == 200 and r.json()["imported_count"] == 1
|
||||
|
||||
# B-Auszug: Eingang +100 (2 Tage später) mit „KontoA" -> Gegenbuchung, nicht gebucht.
|
||||
rowsB = _preview_csv(admin, b["id"],
|
||||
"Datum;Betrag;Empfaenger;Zweck\n07.03.2026;100,00;Gutschrift;von KontoA\n", COLMAP)
|
||||
assert rowsB[0]["type"] == "transfer"
|
||||
assert rowsB[0]["is_counterpart"] is True
|
||||
assert rowsB[0]["include"] is False
|
||||
|
||||
|
||||
def test_same_word_across_kinds_allowed(admin):
|
||||
a, b = _expense_cats(admin, 2)
|
||||
inc = _income_cat(admin)
|
||||
|
||||
Reference in New Issue
Block a user