Backend: Kassenzettel-Abgleich (POST /products/match) + Schwellwert-Einstellung
Neuer Endpunkt ordnet OCR-Zeilen den aehnlichsten LEBENSMITTELN zu (Score 0-100, difflib + Token-/Praefix-Abgleich fuer abgekuerzte Kassennamen). Gegenstaende inkl. Verbrauchsgegenstaende bleiben aussen vor. Je Zeile die besten Treffer ueber dem Schwellwert (Request oder Einstellung receipt_match_threshold, Default 45). 3 Tests, gesamt 182 gruen. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -487,6 +487,25 @@ class LotSplit(BaseModel):
|
||||
location_id: str | None = None
|
||||
|
||||
|
||||
# ---- Kassenzettel-Abgleich ----
|
||||
class MatchRequest(BaseModel):
|
||||
"""Kassenzettel-Zeilen (OCR) → beste Lebensmittel-Treffer je Zeile."""
|
||||
lines: list[str]
|
||||
threshold: int | None = None # 0–100; ohne Angabe gilt die Einstellung
|
||||
|
||||
|
||||
class MatchCandidate(BaseModel):
|
||||
product_id: int
|
||||
name: str
|
||||
brand: str | None = None
|
||||
score: int # 0–100, Ähnlichkeit zur Kassenzeile
|
||||
|
||||
|
||||
class MatchLine(BaseModel):
|
||||
text: str
|
||||
candidates: list[MatchCandidate] = []
|
||||
|
||||
|
||||
class CheckInResponse(BaseModel):
|
||||
lot: LotOut
|
||||
product_stock: float
|
||||
|
||||
Reference in New Issue
Block a user