Der Rechnungszaehler kann nicht mehr hinter das Vergebene zurueck
Sein Einwand: 'er kann jetzt bescheissen, indem er das in den einstellungen aendert' - und sein Vorschlag: 'dann koennte man noch die pdfs nutzen als referenz, die haben auch die nummern'. Der hoechste je vergebene Stand kommt jetzt aus ZWEI Quellen: * den PDFs im Rechnungsordner (der Dateiname traegt die Nummer - kein Oeffnen noetig) * dem gemeinsamen Nummernbuch (kennt auch Nummern OHNE PDF, den Altbestand) Der Zaehler in der config taugt nicht als Wahrheit, er ist ja gerade das, was sich aendern laesst. Deshalb: beim Nummernvorschlag wird ein zurueckgedrehter Zaehler stillschweigend wieder angehoben, und die Einstellungen nehmen keinen Wert mehr an, der hinter dem Vergebenen liegt - mit Meldung, welcher Stand schon erreicht ist und woher er kommt. Nach VORN bleibt er frei: eine lueckenlose Folge verlangt das Gesetz nicht, jede Nummer aber nur einmal (§ 14 Abs. 4 Nr. 4 UStG). Pruefstand pruef_nummernsperre.py: 17 Pruefungen - zurueckgedrehter Zaehler, Einstellungen vor und zurueck, nur Ordner, nur Buch, und beides weg. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GYeAfLtccFrbU3MTj1MMTx
This commit is contained in:
parent
ad1ac9af6f
commit
d884cff6f8
6 changed files with 326 additions and 3 deletions
43
app.py
43
app.py
|
|
@ -33,7 +33,8 @@ import gemeinsam
|
|||
import ordnerwahl
|
||||
import pdf_renderer
|
||||
from helfer import ANREDEN, kunde_maengel, parse_date, parse_num, saeubern, safe_filename, ziffern
|
||||
from bestand import (naechste_freie_nummer, rechnungen_im_ordner,
|
||||
from bestand import (hoechster_zaehler_im_ordner, naechste_freie_nummer,
|
||||
rechnungen_im_ordner,
|
||||
vorhandene_rechnungen)
|
||||
from einzelinstanz import (eigene_pid_merken, einzelinstanz_pruefen, fenster_nach_vorn,
|
||||
laufende_pid_lesen)
|
||||
|
|
@ -595,6 +596,42 @@ class RechnungsApp(ThemeMixin, KorrekturMixin, EinstellungenMixin, tk.Tk):
|
|||
self.buch_lbl.configure(text=f"Nummernbuch: {anzahl} Nummern",
|
||||
foreground=self.col_muted)
|
||||
|
||||
def hoechster_stand(self, jahr=None):
|
||||
"""Hoechster JE VERGEBENER Zaehler dieses Jahres - aus beiden Quellen.
|
||||
|
||||
Der Zaehler in der config allein taugt nicht als Wahrheit: er laesst
|
||||
sich in den Einstellungen zuruecksetzen. Deshalb zaehlt, was WIRKLICH
|
||||
vergeben ist - die PDFs im Ordner und das gemeinsame Nummernbuch (das
|
||||
kennt auch die Nummern aus dem Altbestand, zu denen es keine PDF gibt).
|
||||
"""
|
||||
jahr = int(jahr or self.cfg.get("rechnung_jahr", 0) or datetime.date.today().year)
|
||||
hoch = hoechster_zaehler_im_ordner(config.ensure_output_dir(self.cfg), jahr)
|
||||
if self.buch is not None:
|
||||
try:
|
||||
hoch = max(hoch, self.buch.hoechster_zaehler(jahr))
|
||||
except Exception as e: # noqa: BLE001 - ohne Buch bleibt der Ordner
|
||||
print("[nummernbuch] Hoechststand nicht lesbar:", e)
|
||||
return hoch
|
||||
|
||||
def _zaehler_absichern(self):
|
||||
"""Einen zurueckgedrehten Zaehler stillschweigend wieder anheben.
|
||||
|
||||
Nicht als Vorwurf - es reicht ein alter Rechner, eine wiederhergestellte
|
||||
config oder ein Jahreswechsel von Hand. Vergeben ist vergeben.
|
||||
"""
|
||||
jahr = int(self.cfg.get("rechnung_jahr", 0) or datetime.date.today().year)
|
||||
if jahr != datetime.date.today().year:
|
||||
return
|
||||
hoch = self.hoechster_stand(jahr)
|
||||
if hoch > int(self.cfg.get("rechnung_zaehler", 0) or 0):
|
||||
print(f"[nummern] Zaehler stand auf {self.cfg.get('rechnung_zaehler')}, "
|
||||
f"vergeben ist bis {hoch} - angehoben")
|
||||
self.cfg["rechnung_zaehler"] = hoch
|
||||
try:
|
||||
config.save_config(self.cfg)
|
||||
except OSError as e: # noqa: BLE001
|
||||
print("[nummern] Zaehler nicht gespeichert:", e)
|
||||
|
||||
def _belegte_nummern(self):
|
||||
"""Alle im Buch vergebenen Nummern. Faellt das Buch aus, ist die Menge
|
||||
leer - eine Rechnung muss auch dann geschrieben werden koennen."""
|
||||
|
|
@ -803,6 +840,10 @@ class RechnungsApp(ThemeMixin, KorrekturMixin, EinstellungenMixin, tk.Tk):
|
|||
"""
|
||||
if self.storno_stand or self.berichtigung_stand:
|
||||
return
|
||||
# Erst sicherstellen, dass der Zaehler nicht hinter dem steht, was
|
||||
# schon vergeben ist - sonst schlaegt das Programm eine Nummer vor,
|
||||
# die es ein zweites Mal vergeben wuerde.
|
||||
self._zaehler_absichern()
|
||||
frei = naechste_freie_nummer(config.ensure_output_dir(self.cfg), self.cfg,
|
||||
self._belegte_nummern())
|
||||
if frei:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue