diff --git a/backend/app/services/warranty.py b/backend/app/services/warranty.py index 30369c8..3d59946 100644 --- a/backend/app/services/warranty.py +++ b/backend/app/services/warranty.py @@ -309,22 +309,23 @@ def guess_price_cents(text: str) -> int | None: def guess_price_candidates(text: str) -> list[int]: - """Plausible Beträge (Rappen/Cent), bester zuerst, ohne Dubletten. + """Alle geldartigen Beträge (Rappen/Cent) zur Auswahl, bester Tipp zuerst. - Nur Beträge, die nach Preis aussehen – d.h. mit Währung in der Nähe oder kurz - hinter einem Summen-Stichwort. Beliebige Zahlen (Mengen, Artikelnummern, - Datumsteile) fliegen raus. So bleibt die Auswahl kurz und brauchbar. + Bei einer Rechnung mit mehreren Artikeln soll man auch den Zeilenpreis des + passenden Produkts wählen können – deshalb kommen hier alle Beträge rein + (Zeilen- und Summenbeträge). Mengen, Artikelnummern und Prozentsätze fallen + schon in :func:`_price_hits` weg. Der automatische Tipp (Gesamtsumme) steht + vorne. """ if not text: return [] - plausibel = { - c for pos, c, cur in _price_hits(text) if cur or _near_total(text, pos) - } - if not plausibel: + werte = {c for _pos, c, _cur in _price_hits(text)} + werte.discard(0) + if not werte: return [] - kandidaten = sorted(plausibel, reverse=True) + kandidaten = sorted(werte, reverse=True) best = guess_price_cents(text) if best is not None and best in kandidaten: kandidaten.remove(best) kandidaten.insert(0, best) - return kandidaten[:8] + return kandidaten[:12] diff --git a/backend/tests/test_warranty.py b/backend/tests/test_warranty.py index 6a21e0c..26dd117 100644 --- a/backend/tests/test_warranty.py +++ b/backend/tests/test_warranty.py @@ -147,3 +147,12 @@ def test_galaxus_mwst_satz_ist_kein_preis(): def test_galaxus_garantieende_aus_zeitraum(): assert guess_warranty_until(GALAXUS, acquired_on=date(2025, 10, 5)) == date(2027, 10, 6) + + +def test_galaxus_zeilenpreise_sind_kandidaten(): + # Bei mehreren Artikeln soll man den Zeilenpreis wählen können. + kandidaten = guess_price_candidates(GALAXUS) + assert 14680 in kandidaten # Gesamt inkl. + assert 11100 in kandidaten # Logitech, Betrag/Preis inkl. + assert 3580 in kandidaten # Kabel, Betrag inkl. + assert 810 not in kandidaten # MwSt-Satz weiterhin draußen