Commit graph

7 commits

Author SHA1 Message Date
TheMockTv
95a9063ce1 Freigabe vor dem Beleg - mit Zeitstempel im gemeinsamen Nummernbuch
Sein Grund, woertlich (06.09.2026):

  "ich will fuer den pruefer sichtbar machen: ich wollte das so. die software
   dokumentiert das, und damit wird es nachvollziehbar, weil es einen checkmark
   nun gibt in der sqlite"  -  "das soll alles von anfang bis ende pruefbar sein"

WAS PASSIERT

Vor dem Schreiben eines Belegs fragt das Programm einmal ausdruecklich nach.
Der Text nennt, was gleich entsteht und was daran bindend ist:

  Rechnung: ausgestellt im Sinne des § 14 UStG; die Nummer ist danach vergeben
            und darf kein zweites Mal verwendet werden (§ 14 Abs. 4 Nr. 4 UStG);
            zehn Jahre aufzubewahren (§ 147 Abs. 3 AO); nachtraeglich nicht
            aenderbar (§ 146 Abs. 4 AO) - eine falsche Rechnung wird nicht
            ueberschrieben, sondern storniert.
  Angebot:  unverbindlich, KEINE Rechnung, weist keine Steuer aus, verbraucht
            keine Rechnungsnummer, wird nirgends gebucht.

Storno/Korrektur und Berichtigung haben ihre eigene Rueckfrage - sie wird nicht
verdoppelt (ein Schritt pro Fenster).

DIE SPUR

Ein Popup allein waere fuer einen Pruefer wertlos, es hinterlaesst nichts.
Deshalb bekommt die Tabelle "nummern" im gemeinsamen Buch eine Spalte
"freigabe": der ISO-Zeitstempel der ausdruecklichen Freigabe, an der
Rechnungsnummer haengend. Bestehende Buecher werden per ALTER TABLE nachgezogen;
alte Zeilen bleiben LEER - dort wurde nie gefragt, und ein nachtraeglich
erfundener Zeitstempel waere schlimmer als keiner.

gemeinsam.py liegt in beiden Programmen gleich und wurde mit hinuebergezogen.

PRUEFSTAND

pruef_freigabe.py prueft beide Richtungen, weil jede einzeln wertlos waere:
  NEIN -> kein PDF, Zaehler unveraendert, Nummer im Feld unveraendert,
          Nummernbuch leer
  JA   -> genau ein PDF, eine Nummer im Buch, Freigabe gesetzt und ein ISO-Datum

Die sieben Pruefstaende, die Belege erzeugen, melden die Freigabe jetzt
ausdruecklich an (pruefsteuerung bricht bei unangemeldeten Dialogen absichtlich
ab - kein stilles "ja").

Alle 16 Pruefstaende gruen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V4t48uxDok5rJXhC9bX1Ax
2026-09-06 15:42:55 +02:00
TheMockTv
5ebb02b267 Oberflaeche im Pcore-Stil: Tuerkis, Kacheln, Glas-Knoepfe, Roboto
Seine Ansage: "schau dir unsern fivem server an und unsere webseiten, dann
weisst du wie mein design ist" - also die Palette aus _ui_www und der
Adminpage: Tuerkis #06C6A4 auf gestuften dunklen Flaechen (#0d0e10 Grund,
#15171b Kachel), Raender #25282e, Text #e8e8ea / #8a8e96, Rot #e85a5a.

Das PROGRAMM traegt diese Handschrift, die RECHNUNG die Farbe der jeweiligen
Firma - das Blatt gehoert dem Kunden, nicht uns.

- Roboto wird mitgeliefert und nur fuer den Prozess geladen
  (AddFontResourceEx mit FR_PRIVATE): keine Installation, keine Adminrechte,
  nach dem Schliessen ist der Rechner wie vorher. Fehlt sie, bleibt es bei
  Segoe UI. Die Schriftdateien gehen mit in die exe (spec).
- Abschnitte sind Kacheln mit Ueberschrift statt grauer Rahmen.
- Knoepfe im Glas-Stil wie in seinen Oberflaechen: getoente Flaeche, Rand in
  Akzent-Transparenz. Tk kann kein backdrop-filter - die Toenung wird
  ausgerechnet (theme.mischen), das Ergebnis ist auf einfarbigem Grund
  identisch. "PDF erstellen" fuehrt, "Storno" ist rot.
- Zebrastreifen in der Leistungsliste: bei 17 Zeilen verrutscht man sonst.
- Kein expand am offenen Reiter mehr - dadurch sprang beim Umschalten die
  ganze Leiste ("das taben macht den aktiven kleiner").
- Das Fenster fuer den gemeinsamen Ordner stand als einziges noch in Weiss da:
  es kam nie durch _style_dialog.

Dazu ein Fund, der nichts mit dem Design zu tun hat: die Pruefstaende erbten
"nummer_eingerichtet" aus der config DIESES Rechners. Sobald hier jemand die
Nummer einmal einrichtet, liefen sie in einen anderen Zweig und wurden rot -
ohne dass sich am Programm etwas geaendert haette. Sie legen den Zustand jetzt
selbst fest. Alle 14 gruen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V4t48uxDok5rJXhC9bX1Ax
2026-09-05 18:52:42 +02:00
TheMockTv
ecad4b00ea Gemeinsames Nummernbuch, Storno kuerzt die Naechte, Testlauf-Schalter
Das Rechnungstool kannte nur die Nummern seiner eigenen PDFs. Im Steuerjournal
stehen aber Buchungen ohne PDF - der Altbestand aus der Excel-Mappe - und deren
Nummern hat es ein zweites Mal vergeben. § 14 Abs. 4 Nr. 4 UStG laesst jede
Nummer nur einmal zu.

Deshalb fuehren beide Programme jetzt EIN gemeinsames Buch (gemeinsam.py): eine
SQLite in einem Ordner, den beide kennen. Es ist ein Register, keine zweite
Buchhaltung - die Wahrheit bleiben die PDFs. Was hineinkommt: jede geschriebene
Rechnung, jeder Storno (mit storno_zu), jede Neuausstellung. Die Nummernvergabe
und die Kollisionspruefung beim Erstellen fragen es mit ab; ein verworfener
Storno gibt seine Nummer wieder frei. Faellt der Ordner aus (Netzlaufwerk weg),
laeuft alles weiter - dann steht es in der Fussleiste.

ordnerwahl.py fragt den Ordner beim ersten Start ab: auswaehlen, OK,
Sicherheitsfrage, bei Nein zurueck ins Feld. Zwei Fehler daran gleich behoben,
bevor sie jemand treffen konnte: das Fenster war zu schmal (der Auswahl-Knopf
lag ausserhalb) und der Griff (grab_set) muss waehrend des Windows-Ordner-
dialogs los sein, sonst nimmt der keine Eingabe an.

Storno: er ist das Spiegelbild der Rechnung - auch bei den UEBERNACHTUNGEN.
Vorher stand dort nichts, und das Steuerjournal meldete dem Amt die Naechte der
aufgehobenen Rechnung weiter mit. Auf dem Blatt steht "4 Naechte (aufgehoben)",
in den Kenndaten -4.

"Neue Rechnung:" auf dem Storno-Blatt heisst jetzt "Berichtigte Rechnung:" -
die alte Beschriftung las sich wie die Nummer DIESES Blattes.

--test / CAMPINGHOF_TEST=1 unterdrueckt den Erststart-Dialog. In der EXE kommt
man ohnehin nicht daran, und die Pruefstaende bleiben sonst im Dialog stehen.

Pruefstand pruef_nummernbuch.py (neu): beide Programme auf einem Ordner - das
Journal traegt drei Altbestands-Nummern ein, das Rechnungstool schlaegt danach
2026-004 statt 2026-001 vor. Alle uebrigen Pruefstaende gruen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GYeAfLtccFrbU3MTj1MMTx
2026-09-03 20:38:57 +02:00
TheMockTv
5c68278191 Sicherheitsfrage vor dem Erstellen, Datenordner, toter Aufruf raus
- "Rechnung endgueltig erstellen?" nennt Nummer, Kunde und Betrag und weist
  darauf hin, dass danach nur noch Storno oder Berichtigung bleibt
  (§ 14 Abs. 4 Nr. 4 UStG, § 31 Abs. 5 UStDV). Geprueft ist auch, dass "Nein"
  wirklich nichts schreibt - sonst waere die Frage eine Attrappe.
- Als EXE legt das Programm sich beim ersten Start einen Ordner "Daten" neben
  die EXE (config.json). Ist dort nicht schreibbar (EXE unter "Programme"),
  weicht es nach LOCALAPPDATA aus. Lag die config.json noch direkt neben der
  EXE, zieht sie um - sonst faengt das Programm ohne Firmendaten neu an.
- Aufruf von _storno_fortsetzen entfernt: die Methode gibt es nicht mehr, seit
  die Kette auf dem Storno-Blatt steht. War unerreichbar, waere aber beim
  naechsten Anfassen ein AttributeError geworden.
- Pruefstaende raeumen ihren Wegwerf-Ordner weg und haben eine Reissleine
  (Abbruch nach zwei Minuten), damit kein Dialog mehr ewig offen steht.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EKvGkdNW1vKdnMPAM9Bp3X
2026-09-02 21:20:11 +02:00
TheMockTv
3ea31b3421 Die Kette steht auf dem Storno-Blatt - kein gemerkter Zustand noetig
Statt einer Zustandsmaschine ("offener Storno" ueber den Neustart retten) traegt
das Storno jetzt einfach beide Nummern:

    Storno zu Rechnung:  2026-002
    Neue Rechnung:       2026-004

und im Text "2026-002 -> 2026-003 -> 2026-004". Damit ist die Kette aus dem
Beleg allein lesbar. Wird das Programm zwischendurch geschlossen, sagt der
Storno, unter welcher Nummer die berichtigte Rechnung gehoert; der Dialog
nennt sie ebenfalls, statt nur "bereits storniert" zu melden.

naechste_freie_nummer_nach() bestimmt die Folgenummer, damit sie nicht von der
Reihenfolge abhaengt, in der der Zaehler mitzieht.

Ausserdem: die Pruefstaende raeumen ihren Wegwerf-Ordner wieder weg, wenn sie
gruen sind. Ein Testlauf hatte 398 Ordner im Temp-Verzeichnis hinterlassen.
Bei Fehlern bleibt der Ordner stehen, damit man hineinsehen kann.

Weitere Funde des Code-Agenten behoben:
- "Kopie von Rechnung_...pdf" und klein geschriebene Dateinamen zaehlen jetzt
  bei der Nummernvergabe mit (vorher galt die Nummer als frei).
- Strg+P feuerte auch aus einem offenen Dialog heraus (bind_all -> bind).

167 Pruefungen gruen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EKvGkdNW1vKdnMPAM9Bp3X
2026-09-02 20:42:31 +02:00
TheMockTv
d22631467d Windows-Kopien zaehlen mit, und bei doppelter Nummer wird nicht geraten
Duplikatanzeige gehoert nicht hierher, sondern in den Steuerrechner - wieder
ausgebaut (duplikate.py, pruef_duplikate.py).

Zwei echte Loecher, die dabei auffielen:

1. vorhandene_rechnungen() uebersah Windows-Kopien. "Rechnung_2026-013 (1).pdf"
   und "... - Kopie.pdf" galten nicht als vergeben, die Nummer wurde also ein
   zweites Mal ausgegeben. Genau so ist der Altbestand entstanden. Jetzt zaehlt
   alles mit, was nach der Nummer KEINE weitere Ziffer hat - "2026-0135" bleibt
   getrennt.

2. Liegt eine Nummer mehrfach im Ordner, nahm der Storno-Dialog blind den ersten
   Treffer. Jetzt erscheint eine Auswahlliste mit Datum, Name, Betrag und
   Dateiname; ohne Auswahl passiert nichts, und die Meldung nennt die konkrete
   Datei.

pruef_kernregeln.py: 37 Pruefungen (10 neue), pruef_nummern.py 10.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EKvGkdNW1vKdnMPAM9Bp3X
2026-09-02 20:20:13 +02:00
TheMockTv
1060a6421f Vorgangsnummer: eine Klammer um die ganze Kette
Bisher zeigte jeder Beleg nur auf seinen Vorgaenger (storno_zu, ersetzt,
storno_nummer). Ein zweites Programm musste sich die Kette daraus
zusammensuchen. Jetzt tragen ALLE Blaetter einer Kette dieselbe
Vorgangsnummer - die der ersten Rechnung. Gruppieren heisst dort: nach
"vorgang" sortieren, fertig. Eine normale Rechnung ist ihr eigener Vorgang.

Wichtig fuer den Fall "schon korrigierte Rechnung wird noch einmal
storniert": Storno und Berichtigung uebernehmen den VORGANG der alten
Rechnung, nicht deren Nummer - sonst zerfaellt die Kette in zwei.

Die Einzelbezuege bleiben zusaetzlich stehen, damit man die Reihenfolge
innerhalb der Kette lesen kann.

Neu pruef_kette.py (13 Pruefungen): spielt den schlimmsten Fall durch -
Rechnung, Storno, berichtigte Rechnung, Berichtigung der Anschrift, zweiter
Storno, zweite berichtigte Rechnung. Alle sechs landen unter einem
Schluessel, die Summe der Kette ergibt genau die letzte gueltige Rechnung
(27,30 €), und der Steuerrechner liest davon 5 Geldbelege - das
Berichtigungsblatt zaehlt nicht mit.

148 Pruefungen gruen (100 + 27 + 13 + 8) plus 7 Dialoge.

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