rechnungstool/pruef_nummern.py
TheMockTv 2277a12e0f Zwei getrennte Knoepfe und app.py in Module aufgeteilt
Knoepfe: "Storno" und "Berichtigen" setzen den Weg schon beim Oeffnen fest,
das Popup fragt dann nur noch die Nummer. Vorher entschied ein zweiter Knopf
im Popup - der ist raus.

app.py war 1802 Zeilen, jetzt 672. Neu daneben:
  helfer.py        Zahlen, Datum, Namen, Pruefungen        (87)
  bestand.py       was im Rechnungsordner liegt, nur lesen (171)
  storno.py        den spiegelbildlichen Storno rechnen     (57)
  einzelinstanz.py nur ein Fenster zulassen                 (90)
  theme.py         Farben nach Windows hell/dunkel         (120)
  korrektur.py     Storno- und Berichtigungsweg            (306)
  einstellungen.py die Dialoge aus dem Menue               (358)

Die Oberflaeche bleibt eine Klasse - die Teile sind Mixins, damit kein
einziger self-Zugriff umgeschrieben werden musste. Kein Modul importiert
app.py zurueck, keine ungenutzten Importe mehr. Die Pruefstaende holen die
Funktionen jetzt aus dem Modul, dem sie gehoeren.

pruef_storno.py 100 gruen, pruef_nummern.py 7 gruen, Fenster nach der
Aufteilung gestartet und angesehen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EKvGkdNW1vKdnMPAM9Bp3X
2026-09-02 19:41:00 +02:00

52 lines
1.9 KiB
Python

# -*- coding: utf-8 -*-
"""Pruefstand: findet vorhandene_rechnungen() eine schon vergebene Nummer?
Kein Rateraum: legt echte Dateien in einem Wegwerf-Ordner an und fragt die
Funktion aus app.py direkt.
"""
import os
import sys
import tempfile
sys.path.insert(0, r"C:\claude\rechnungstool")
from bestand import vorhandene_rechnungen # noqa: E402
ordner = tempfile.mkdtemp(prefix="rechnungspruef_")
dateien = [
"Rechnung_2026-013_Meier.pdf", # dieselbe Nummer, Kunde Meier
"Rechnung_2026-130_Schmidt.pdf", # laengere Nummer - darf NICHT treffen
"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-130", ["Rechnung_2026-130_Schmidt.pdf"], "laengere Nummer trifft sich selbst"),
("2026-020", ["Rechnung_2026-020.pdf"], "ohne Kundenname im Dateinamen"),
("2026-021", ["Storno_2026-021_Meier.pdf"], "Nummer ist von einem Storno belegt"),
("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")
print("---")
print("alles gruen" if fehler == 0 else f"{fehler} Fehler")
sys.exit(1 if fehler else 0)