Nur noch Beträge, die nach Preis aussehen: direkt hinter einem Summen-Stichwort oder mit Währung (CHF/EUR/€/…) in der Nähe. Ohne solchen Hinweis kein Vorschlag. Datumsangaben (31.12.2027) werden per Lookaround nicht mehr als Betrag (31.12) missgelesen. Kandidatenliste enthaelt entsprechend nur plausible Preise. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
89 lines
2.9 KiB
Python
89 lines
2.9 KiB
Python
"""Lokale Garantieende-Schätzung aus Belegtext (ohne echtes PDF)."""
|
|
|
|
from datetime import date
|
|
|
|
from app.services.warranty import (
|
|
guess_price_candidates,
|
|
guess_price_cents,
|
|
guess_warranty_until,
|
|
)
|
|
|
|
|
|
def test_zeitraum_plus_kaufdatum_vom_stueck():
|
|
# Beleg nennt nur den Zeitraum; das Kaufdatum kommt vom Einzelstück.
|
|
text = "Vielen Dank für Ihren Einkauf. 24 Monate Garantie auf dieses Gerät."
|
|
assert guess_warranty_until(text, acquired_on=date(2024, 3, 31)) == date(2026, 3, 31)
|
|
|
|
|
|
def test_jahre_werden_verstanden():
|
|
text = "2 Jahre Gewährleistung"
|
|
assert guess_warranty_until(text, acquired_on=date(2023, 1, 15)) == date(2025, 1, 15)
|
|
|
|
|
|
def test_zeitraum_plus_rechnungsdatum_aus_dem_beleg():
|
|
text = "Rechnungsdatum: 05.06.2024\nGarantie: 12 Monate"
|
|
assert guess_warranty_until(text) == date(2025, 6, 5)
|
|
|
|
|
|
def test_warranty_keyword_before_period_english():
|
|
text = "Warranty period is 36 months from purchase."
|
|
assert guess_warranty_until(text, acquired_on=date(2022, 2, 1)) == date(2025, 2, 1)
|
|
|
|
|
|
def test_explizites_datum_neben_stichwort():
|
|
text = "Garantie gültig bis 31.12.2027."
|
|
assert guess_warranty_until(text) == date(2027, 12, 31)
|
|
|
|
|
|
def test_ohne_hinweise_kein_vorschlag():
|
|
assert guess_warranty_until("Nur ein Kassenbon ohne alles.") is None
|
|
|
|
|
|
def test_leerer_text_ist_none():
|
|
assert guess_warranty_until("", acquired_on=date(2024, 1, 1)) is None
|
|
|
|
|
|
# ---- Preis ----
|
|
|
|
def test_preis_nahe_total_stichwort():
|
|
text = "Artikel 49.00\nVersand 5.90\nGesamtbetrag: 54.90 CHF"
|
|
assert guess_price_cents(text) == 5490
|
|
|
|
|
|
def test_preis_mit_tausendertrenner_apostroph():
|
|
text = "Total CHF 1'299.00"
|
|
assert guess_price_cents(text) == 129900
|
|
|
|
|
|
def test_preis_deutsches_format():
|
|
text = "Rechnungsbetrag 1.299,00 EUR"
|
|
assert guess_price_cents(text) == 129900
|
|
|
|
|
|
def test_preis_ohne_waehrung_und_ohne_stichwort_ist_none():
|
|
# Reine Zahlen ohne Waehrung/Summen-Stichwort werden NICHT als Preis geraten.
|
|
assert guess_price_cents("Position A 12,90\nPosition B 199,00\nDanke.") is None
|
|
|
|
|
|
def test_preis_mit_waehrung_ohne_stichwort_nimmt_groessten():
|
|
text = "Kabel 12.90 CHF\nGeraet 199.00 CHF"
|
|
assert guess_price_cents(text) == 19900
|
|
|
|
|
|
def test_datum_wird_nicht_als_preis_gelesen():
|
|
assert guess_price_cents("Garantie gültig bis 31.12.2027.") is None
|
|
assert guess_price_candidates("Kaufdatum 05.06.2024, Garantie bis 31.12.2027") == []
|
|
|
|
|
|
def test_preis_ohne_betrag_ist_none():
|
|
assert guess_price_cents("Kein Preis hier.") is None
|
|
assert guess_price_cents("") is None
|
|
|
|
|
|
def test_preis_kandidaten_bester_zuerst_ohne_dubletten():
|
|
text = "Artikel 49.00 CHF\nVersand 5.90 CHF\nGesamtbetrag: 54.90 CHF\nnochmal 49.00 CHF"
|
|
kandidaten = guess_price_candidates(text)
|
|
assert kandidaten[0] == 5490 # bester Tipp (Summe) vorne
|
|
assert set(kandidaten) == {5490, 4900, 590} # ohne Dubletten
|
|
assert guess_price_candidates("") == []
|