8557bfe230
Auf die Frage, ob Belege einheitlich gestaltet sind: nein. Die Erkennung haengt an drei Annahmen - Marke in den ersten acht Zeilen, Marke in der festen Liste, Marke ueberhaupt vorhanden. Alle drei sind jetzt gemessen und in Tests festgehalten. Dabei ein echter Defekt gefunden: "Total" ist Kopfmarke UND Summenwort. Ein Beleg mit Betrag in den ersten acht Zeilen lieferte faelschlich die Marke "Total" (an einem echten Beleg reproduziert). _betragszeile() filtert Summenzeilen jetzt aus dem Kopf - verlangt werden beide Kennzeichen zugleich, Summenwort und Geldangabe, damit "SHELL TANKSTELLE, 6450 SOELDEN" nicht mitfaellt. Gegenprobe: ein echter "TOTAL TANKSTELLE"-Kopf ergibt weiter Total. Der Ausfall beschaedigt nichts: mit unbekannter Marke im Kopf bleiben Liter, Betrag, Rabatt und Anschrift unveraendert richtig, nur die Marke fehlt. Parser-Suite 17 Tests (von 11), alle zwoelf abgelegten Belege liefern weiter Shell, audi_ha_test auf 2026.9.4.22 ohne Traceback.
50 lines
2.3 KiB
JavaScript
50 lines
2.3 KiB
JavaScript
import { readFileSync, writeFileSync } from "node:fs"
|
|
const p = "custom_components/audi_dashboard/shell_beleg_parser.py"
|
|
let s = readFileSync(p, "utf8")
|
|
const alt = [
|
|
"def _marke(zeilen):",
|
|
' """Markenname aus dem Belegkopf ("SHELL STATION" -> "Shell"). None, wenn',
|
|
' keine bekannte Marke draufsteht - dann bleibt es beim Betreibernamen."""',
|
|
' kopf = "\n".join(zeilen[:8])',
|
|
" for marke in _MARKEN:",
|
|
' if re.search(r"\b" + re.escape(marke) + r"\b", kopf, re.IGNORECASE):',
|
|
" return marke",
|
|
" return None",
|
|
].join("\n")
|
|
const neu = [
|
|
"def _betragszeile(zeile):",
|
|
' """Eine Summenzeile ("GESAMT 78,78 EUR")? Sie darf im Kopf nicht nach',
|
|
" Marken durchsucht werden.",
|
|
"",
|
|
' Grund: "Total" ist beides - eine Kopfmarke und ein Summenwort. Auf einem',
|
|
" Beleg mit knappem Kopf, der den Betrag schon in den ersten acht Zeilen",
|
|
' druckt, wuerde daraus faelschlich die Marke "Total" (am 04.09.2026 an',
|
|
" einem echten Beleg mit vorangestellter Summenzeile nachgestellt und",
|
|
" reproduziert). Verlangt werden beide Kennzeichen zugleich - Summenwort",
|
|
" UND echte Geldangabe -, damit eine Anschrift mit Hausnummer oder eine",
|
|
' Postleitzahl ("SHELL TANKSTELLE, 6450 SÖLDEN") nicht mitfaellt."""',
|
|
' kompakt = re.sub(r"\s+", "", zeile).upper()',
|
|
" if not any(wort in kompakt for wort in _GESAMT_WOERTER):",
|
|
" return False",
|
|
" return bool(re.search(_GELD, zeile))",
|
|
"",
|
|
"",
|
|
"def _marke(zeilen):",
|
|
' """Markenname aus dem Belegkopf ("SHELL STATION" -> "Shell"). None, wenn',
|
|
" keine bekannte Marke draufsteht - dann bleibt es beim Betreibernamen.",
|
|
"",
|
|
" Acht Zeilen, weil die Marke in den bekannten Belegen in Zeile 0 steht und",
|
|
" im oesterreichischen Format in Zeile 1 (am 04.09.2026 ueber alle zwoelf",
|
|
' abgelegten Belege gemessen) - das Fenster ist der Puffer, nicht die",',
|
|
' Erwartung."""',
|
|
" kopf = [z for z in zeilen[:8] if not _betragszeile(z)]",
|
|
' text = "\n".join(kopf)',
|
|
" for marke in _MARKEN:",
|
|
' if re.search(r"\b" + re.escape(marke) + r"\b", text, re.IGNORECASE):',
|
|
" return marke",
|
|
" return None",
|
|
].join("\n")
|
|
if (s.split(alt).length - 1 !== 1) throw new Error("Anker nicht eindeutig")
|
|
writeFileSync(p, s.replace(alt, neu))
|
|
console.log("ok")
|