From 1851ed707441607047a9afd9ce296f11895692de Mon Sep 17 00:00:00 2001 From: dfuhrmann3 Date: Mon, 13 Jul 2026 15:15:38 +0200 Subject: [PATCH] fix(parser): stop description scan at sub-position numbers like '2.1' (ZenIT R26-105) Bei Unterpositionsnummern ('N.M', z.B. 2.1) lief der Beschreibungs-Scan nach oben ueber die Referenzzeilen hinweg -> Artikelname war faelschlich die Auftragsbestaetigungs-Zeile und die Beschreibung enthielt Referenzen + Positionsnummer. Jetzt bricht der Scan auch bei gegliederten Nummern ab. Seriennummer-Fragmente (reine Ziffern ohne Punkt) bleiben unberuehrt. Co-Authored-By: Claude Opus 4.8 --- invoice_logic.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/invoice_logic.py b/invoice_logic.py index e307f41..ce137ce 100644 --- a/invoice_logic.py +++ b/invoice_logic.py @@ -329,10 +329,13 @@ def extract_invoice_items_pure_python(text): if any(prev_lower.startswith(w) for w in ["zwischensumme", "endbetrag", "gesamtbetrag", "umsatzsteuer"]): break - # Nur bei der ECHTEN Positionsnummer abbrechen (die naechste erwartete Position = - # len(items)+1). Sonst wuerden auch alleinstehende Ziffern-Fragmente von - # aufgesplitteten Seriennummern (z.B. "9" als letzte Zeile einer S/N) faelschlich - # als Positionsnummer gewertet und die Position verworfen. + # Abbrechen bei der echten Positionsnummer: + # - gegliederte Nummer "N.M" (z.B. "2.1") ist eindeutig eine (Unter-)Position; + # - eine alleinstehende Zahl nur, wenn sie der erwarteten Positionsnummer + # (len(items)+1) entspricht - so werden Ziffern-Fragmente aufgesplitteter + # Seriennummern (z.B. "9") NICHT faelschlich als Positionsnummer gewertet. + if re.match(r"^\d{1,3}\.\d{1,3}$", prev_line): + break if prev_line.isdigit() and len(prev_line) <= 2 and int(prev_line) == len(items) + 1: break