feat: gleiches Schlagwort für Einnahme UND Ausgabe erlaubt (Art je Regel)
- CategorizationRule bekommt `kind` (expense|income|transfer); Unique jetzt (owner, match_field, pattern, kind) statt ohne kind - Konfliktprüfung/Anlage (add/update Keyword, Transfer-Keyword, gelernte Regeln) arbeiten kind-bewusst: dasselbe Wort je einmal pro Art möglich - Migration 0009 mit Backfill (kind aus Kategorie-Art bzw. is_transfer) - Tests angepasst: quer über Arten erlaubt, gleiche Art weiterhin Konflikt (71 grün) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -405,19 +405,26 @@ def _learn_rule(db: Session, user: User, row: dict) -> None:
|
||||
pattern = normalize_text(payee)[:255]
|
||||
if not pattern:
|
||||
return
|
||||
# Art der gelernten Regel = Art der Kategorie (Einnahme/Ausgabe). Gehört zur
|
||||
# Eindeutigkeit (owner, feld, wort, kind), damit dasselbe Wort je Art zählt.
|
||||
ckind = db.query(Category.type).filter(
|
||||
Category.id == cat, Category.owner_id == user.id
|
||||
).scalar()
|
||||
kind = ckind.value if ckind is not None else "expense"
|
||||
existing = (
|
||||
db.query(CategorizationRule)
|
||||
.filter(
|
||||
CategorizationRule.owner_id == user.id,
|
||||
CategorizationRule.match_field == MatchField.payee,
|
||||
CategorizationRule.pattern == pattern,
|
||||
CategorizationRule.kind == kind,
|
||||
)
|
||||
.first()
|
||||
)
|
||||
if existing is None:
|
||||
db.add(CategorizationRule(
|
||||
owner_id=user.id, match_field=MatchField.payee, pattern=pattern,
|
||||
category_id=cat, source=RuleSource.learned, priority=1, hits=1,
|
||||
category_id=cat, kind=kind, source=RuleSource.learned, priority=1, hits=1,
|
||||
))
|
||||
# Sichtbar machen (Session ist autoflush=False), damit dasselbe Muster ein
|
||||
# zweites Mal im selben Import die vorhandene Regel findet statt zu doppeln.
|
||||
|
||||
Reference in New Issue
Block a user