Vodafone: Zuordnung über Kundennamen in GROSSBUCHSTABEN, feste Händler-Zuweisung, nur erste Seite

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
adminandClaude Opus 5.5 committed 2026-11-02 09:32:04 +01:00
1 parent da2e3c9ba1
commit a837ddc4d4
6 files changed
+235 -27

No files matched your search

+80
View File
@@ -185,3 +185,83 @@ def test_datei_doppelt_erkannt_und_entfernbar(db, freenet_csv):
did = db.dateien(aid)[0]["id"]
db.datei_entfernen(did)
assert db.positionen(aid) == []
# --------------------------------------------------------------------------- Vodafone: GROSSBUCHSTABEN-Regel
def test_grossbuchstaben_erkennung():
from provtool.db import ist_grossgeschrieben
assert ist_grossgeschrieben("HUBERMEIER")
assert ist_grossgeschrieben("ÖSTERLEHNER ")
assert ist_grossgeschrieben("GROß") # ß gibt es nicht als Großbuchstabe
assert not ist_grossgeschrieben("Musterfrau")
assert not ist_grossgeschrieben("Max & Moritz Test")
assert not ist_grossgeschrieben("")
assert not ist_grossgeschrieben("X")
@pytest.fixture
def vodafone_caps_xlsx(tmp_path):
wb = openpyxl.Workbook()
ws = wb.active
ws.title = "All"
kopf = ["Anschaltdatum", "Kartennummer", "IMEI", "Rufnummer", "Kunde", "Artikelbezeichnung", "Tarif",
"TarifKey02", "Prämie in EUR", "Abrechnungslauf", "Vo-Nr", "Lieferantennr", "Text"]
for c, h in enumerate(kopf, 1):
ws.cell(6, c, h)
for r, (kunde, betrag) in enumerate([("HUBERMEIER ", 295), ("Musterfrau", 370), ("BEISPIELER", 235)], 7):
for c, v in enumerate((datetime(2026, 9, 1), "1", "", "4917", kunde, "Vergütung aus VVL otelo", "Tarif",
"otelo Allnet Flat", betrag, "VF2609", "80000001", "700000", "10000"), 1):
ws.cell(r, c, v)
# zweite Seite mit Daten – darf NICHT eingelesen werden
ws2 = wb.create_sheet("VF2609")
for c, h in enumerate(kopf, 1):
ws2.cell(5, c, h)
for c, v in enumerate((datetime(2026, 9, 1), "1", "", "4917", "DOPPELT", "Vergütung aus VVL otelo", "T",
"x", 999, "VF2609", "80000001", "700000", ""), 1):
ws2.cell(6, c, v)
p = tmp_path / "vf_caps.xlsx"
wb.save(p)
return p
def test_vodafone_nur_erste_seite(vodafone_caps_xlsx):
erg = lies_datei(vodafone_caps_xlsx)
assert [p.name for p in erg.positionen] == ["HUBERMEIER", "Musterfrau", "BEISPIELER"]
assert erg.warnungen
def test_caps_regel_und_feste_zuweisung(db, vodafone_caps_xlsx):
from provtool.db import CAPS_ANBIETER, CAPS_WERT
laden = db.haendler_speichern(Haendler(0, "Eigener Laden"), [("vodafone", "80000001")])
uh = db.haendler_speichern(Haendler(0, "Unterhändler Caps", standard_prozent=90), [(CAPS_ANBIETER, CAPS_WERT)])
with pytest.raises(ValueError):
db.haendler_speichern(Haendler(0, "Noch einer"), [(CAPS_ANBIETER, CAPS_WERT)])
aid = db.abrechnung_neu("September")
db.importieren(aid, lies_datei(vodafone_caps_xlsx))
pos = {p["name"]: p for p in db.positionen(aid)}
assert pos["HUBERMEIER"]["haendler_id"] == uh and pos["BEISPIELER"]["haendler_id"] == uh
assert pos["Musterfrau"]["haendler_id"] == laden
assert pos["HUBERMEIER"]["betrag"] == 26550 # 90 % von 295 €
# Fehltreffer: BEISPIELER gehört eigentlich zum Laden → fest zuweisen
db.haendler_zuweisen([pos["BEISPIELER"]["id"]], laden)
mayr = next(p for p in db.positionen(aid) if p["name"] == "BEISPIELER")
assert mayr["haendler_id"] == laden and mayr["betrag"] == 23500
# zurück auf automatisch
db.haendler_zuweisen([mayr["id"]], None)
mayr = next(p for p in db.positionen(aid) if p["name"] == "BEISPIELER")
assert mayr["haendler_id"] == uh and mayr["betrag"] == 21150
def test_migration_alter_datenbank(tmp_path):
import sqlite3
from provtool.db import SCHEMA
pfad = tmp_path / "alt.db"
con = sqlite3.connect(pfad)
con.executescript(SCHEMA) # Schema v1 ohne Spalte haendler_fest
con.close()
d = Datenbank(pfad)
spalten = {r[1] for r in d.con.execute("PRAGMA table_info(position)")}
assert "haendler_fest" in spalten
d.close()