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 <noreply@anthropic.com>
This commit is contained in:
dfuhrmann3 2026-07-13 15:15:38 +02:00
parent 71bb9885c6
commit 1851ed7074
1 changed files with 7 additions and 4 deletions

View File

@ -329,10 +329,13 @@ def extract_invoice_items_pure_python(text):
if any(prev_lower.startswith(w) for w in ["zwischensumme", "endbetrag", "gesamtbetrag", "umsatzsteuer"]): if any(prev_lower.startswith(w) for w in ["zwischensumme", "endbetrag", "gesamtbetrag", "umsatzsteuer"]):
break break
# Nur bei der ECHTEN Positionsnummer abbrechen (die naechste erwartete Position = # Abbrechen bei der echten Positionsnummer:
# len(items)+1). Sonst wuerden auch alleinstehende Ziffern-Fragmente von # - gegliederte Nummer "N.M" (z.B. "2.1") ist eindeutig eine (Unter-)Position;
# aufgesplitteten Seriennummern (z.B. "9" als letzte Zeile einer S/N) faelschlich # - eine alleinstehende Zahl nur, wenn sie der erwarteten Positionsnummer
# als Positionsnummer gewertet und die Position verworfen. # (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: if prev_line.isdigit() and len(prev_line) <= 2 and int(prev_line) == len(items) + 1:
break break