Vodafone: Zuordnung über Kundennamen in GROSSBUCHSTABEN, feste Händler-Zuweisung, nur erste Seite
Windows-Build / windows-exe (push) Successful in 1m20s
Windows-Build / windows-exe (push) Successful in 1m20s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
322d2ed1c3
commit
6f860746ca
6 files changed
+235
-27
No files matched your search
@@ -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", "80210760", "705136", "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", "80210760", "705136", ""), 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", "80210760")])
|
||||
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()
|
||||
Reference in new issue
Block a user