Files
audi-app/.tmp-patch.mjs
T
tobias 8557bfe230 Markenerkennung: Grenzen gemessen, Summenzeile im Kopf ist keine Marke
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.
2026-09-04 17:09:12 +02:00

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")