# -*- coding: utf-8 -*- """Pruefstand: welche Nummern gelten als vergeben, welche als frei? Kein Rateraum: legt echte Dateien in einem Wegwerf-Ordner an und fragt bestand.py direkt. Geprueft wird beides - vorhandene_rechnungen() und naechste_freie_nummer(), zusammen sind sie die Nummernvergabe. """ import os import sys import tempfile sys.path.insert(0, r"C:\claude\rechnungstool") from bestand import naechste_freie_nummer, vorhandene_rechnungen # noqa: E402 ordner = tempfile.mkdtemp(prefix="rechnungspruef_") dateien = [ "Rechnung_2026-013_Meier.pdf", # dieselbe Nummer, Kunde Meier "Rechnung_2026-0135_Schmidt.pdf", # laengere Nummer - darf NICHT treffen "Rechnung_2026-777_Gross.PDF", # Endung GROSS geschrieben - zaehlt trotzdem "Rechnung_2026-013_Meier.txt", # richtiger Name, aber kein PDF "Rechnung_2026-050_Alt.pdf", # und drei Windows-Kopien davon: "Rechnung_2026-050_Alt (1).pdf", "Rechnung_2026-050_Alt - Kopie.pdf", "Rechnung_2026-050 (2).pdf", "Kopie von Rechnung_2026-050_Alt.pdf", # aeltere Windows-Fassung "rechnung_2026-050_klein.pdf", # von Hand klein geschrieben "Rechnung_2026-0501_Neu.pdf", # laengere Nummer - darf NICHT mitzaehlen "Rechnung_2026-014_Meier.pdf", # andere Nummer "Rechnung_2026-020.pdf", # ohne Kundenname "Storno_2026-021_Meier.pdf", # Storno verbraucht die Nummer auch "Notiz_2026-013.txt", # kein PDF ] for d in dateien: with open(os.path.join(ordner, d), "w") as f: f.write("x") faelle = [ ("2026-013", ["Rechnung_2026-013_Meier.pdf"], "Nummer vergeben, anderer Kundenname"), ("2026-0135", ["Rechnung_2026-0135_Schmidt.pdf"], "laengere Nummer trifft nur sich selbst"), ("2026-777", ["Rechnung_2026-777_Gross.PDF"], "Endung GROSS geschrieben wird gefunden"), ("2026-020", ["Rechnung_2026-020.pdf"], "ohne Kundenname im Dateinamen"), ("2026-021", ["Storno_2026-021_Meier.pdf"], "Nummer ist von einem Storno belegt"), ("2026-050", ["Kopie von Rechnung_2026-050_Alt.pdf", "Rechnung_2026-050 (2).pdf", "Rechnung_2026-050_Alt (1).pdf", "Rechnung_2026-050_Alt - Kopie.pdf", "Rechnung_2026-050_Alt.pdf", "rechnung_2026-050_klein.pdf"], "alle Windows-Kopien und Kleinschreibung zaehlen mit"), ("2026-0501", ["Rechnung_2026-0501_Neu.pdf"], "laengere Nummer bleibt getrennt"), ("2026-099", [], "freie Nummer"), ("2026-01", [], "Teilnummer darf nicht auf 2026-013 anspringen"), ] fehler = 0 for nummer, erwartet, was in faelle: ist = [os.path.basename(p) for p in vorhandene_rechnungen(ordner, nummer)] ok = ist == erwartet fehler += 0 if ok else 1 print((" OK " if ok else "FEHLER") + f" | {nummer} -> {ist} ({was})") # leerer / nicht vorhandener Ordner darf nicht knallen if vorhandene_rechnungen(os.path.join(ordner, "gibtsnicht"), "2026-013") != []: print("FEHLER | fehlender Ordner") fehler += 1 else: print(" OK | fehlender Ordner gibt leere Liste") # Wegwerf-Ordner nur bei Fehlern behalten if not fehler: import shutil as _sh _sh.rmtree(ordner, ignore_errors=True) print("---") print("alles gruen" if fehler == 0 else f"{fehler} Fehler") sys.exit(1 if fehler else 0)