feat: Buchungen lassen sich von Hand einem Abo zuordnen – und das merkt sich

Die Erkennung lief seit Stufe 3, aber nur automatisch: Was sie nicht
sicher traf, blieb liegen, und sehen konnte man davon nichts. Die
Endpunkte gab es, die Oberflaeche kannte keinen davon.

Jetzt steht in der Buchungsliste eine Spalte "Abo" – dieselbe Form wie
die Kategorie daneben: Die Auswahl zeigt, zu welchem Vertrag die Zahlung
gehoert, aendert es, und leer loest die Zuordnung. Uebertraege bleiben
aussen vor; sie verschieben nur Geld.

Und sie lernt. Musste man von Hand ran, hat der Erkennungstext nicht
gepasst – also wird der Empfaenger dieser Buchung der neue. Beim
naechsten Mal faellt dieselbe Zahlung von selbst zu, statt dass man
jeden Monat dasselbe klickt. Der Vertragsname bleibt als zweite Chance:
_passt_text prueft beide, nicht entweder/oder, sonst verlaere man beim
Lernen, was vorher schon getroffen hat.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-10-15 09:59:55 +02:00
co-authored by Claude Opus 5
parent 493a98ab6b
commit 0ea2ab1322
7 changed files with 122 additions and 9 deletions
+12 -7
View File
@@ -77,13 +77,18 @@ def _passt_text(vertrag: Subscription, text: str) -> bool:
am Stück vor. Kurze Wörter bleiben draussen; „SA" oder „AG" trifft sonst
die halbe Kontoauszug.
"""
muster = normalize_text(vertrag.payee_pattern or vertrag.name)
if not muster:
return False
if muster in text:
return True
woerter = [w for w in muster.split() if len(w) >= 4]
return bool(woerter) and any(w in text for w in woerter)
# Beides pruefen, nicht entweder/oder: Der gelernte Text (payee_pattern)
# kommt beim Zuordnen von Hand dazu und soll den Namen nicht verdraengen.
for roh in (vertrag.payee_pattern, vertrag.name):
muster = normalize_text(roh)
if not muster:
continue
if muster in text:
return True
woerter = [w for w in muster.split() if len(w) >= 4]
if woerter and any(w in text for w in woerter):
return True
return False
def _erwartet_in(db: Session, vertrag: Subscription, konto: Account,