No description
Find a file
TheMockTv 2b09d15cd0 Aufraeumen nach der Pruefkette: doppelter Code an eine Stelle
Die Runde vom 07.09.2026 hat neben den zwei echten Fehlern eine Reihe
Wiederholungen und stumme Stellen gemeldet. Abgearbeitet in Etappen, jede fuer
sich pruefbar - nach jeder liefen beide Pruefketten gruen.

* Menueleiste: der Wechsel von einem Titel zum anderen brauchte ZWEI Klicks.
  Der grab_set der offenen Liste schluckt den ersten, die <Button-1>-Bindung
  des Titels feuert gar nicht. Das native tk.Menu, das diese Leiste ersetzt
  hat, wechselte schon beim blossen Ueberfahren - zwei Klicks waren also eine
  Verschlechterung gegenueber dem, was vorher da war. Die Klappliste wird
  ausserdem jetzt wie jede andere Position ueber theme.auf_bildschirm()
  begrenzt; am unteren Fensterrand lief sie vorher hinaus.
  Neu: pruef_menueleiste.py misst beides ueber echte Klickereignisse.

* %LOCALAPPDATA%/ravokk wurde an drei Stellen einzeln ausgerechnet. Jetzt
  fragen alle gemeinsam.standard_ordner(). Laufen die je auseinander, fuehren
  die beiden Programme zwei Nummernbuecher - und das faellt erst auf, wenn
  eine Rechnungsnummer zum zweiten Mal vergeben ist (§ 14 Abs. 4 Nr. 4 UStG).

* pruefe() stand 35-mal im Quelltext, in sechs Fassungen -> pruefhelfer.py.
  Die zwei Ausreisser sind mitgezogen: pruef_bilder.py schrieb ein eigenes
  Format, pruef_storno_verrechnet.py zaehlte in einer Zahl und konnte am Ende
  nicht sagen, WAS fehlschlug.

* dlg_darstellung() und die drei Handgriffe des Umschaltens standen in beiden
  app.py fast wortgleich -> ThemeMixin in theme.py. Beide trugen inzwischen
  denselben langen Kommentar zu demselben Fehler; das war der Beweis, dass es
  eine Sache ist. Programmspezifisch bleiben der Hinweistext im Dialog (R31)
  und die Frage, ob die Einstellungen ausdruecklich gespeichert werden muessen.

* pruef_gemeinsam_automatisch.py sagte im Text "genau ein Buch" und prueft
  ">= 1" mit einem any() - eine Pruefung, die nicht rot werden kann. Jetzt
  == 1, und der Dateiname wird mitgeprueft.
  Dazu neu: die neun Dateien, die im Kopf zusagen, sie laegen in beiden
  Programmen gleich, werden byteweise verglichen. Bei hinweis.py stimmte die
  Zusage seit dem 06.09. nicht mehr - gleicher Inhalt, CRLF gegen LF.

* .gitattributes, damit die Zeilenenden nicht von der Maschine abhaengen.
  Ohne das meldet genau diese Pruefung nach einem frischen Checkout einen
  Unterschied, den es im Repository gar nicht gibt.

* Sechs stumme "except OSError" sagen jetzt, warum sie schweigen duerfen, und
  einer meldet statt zu schweigen: schlaegt die Uebernahme einer alten
  config.json fehl, faengt das Programm ohne Firmendaten, Katalog und Zaehler
  neu an - und der Erfolgsfall schrieb eine Zeile, der Fehlerfall nicht. Die
  24 stummen tk.TclError bleiben: dort wird ein Widget angefasst, das gerade
  zerstoert wurde, und eine Meldung waere Rauschen.

* Tote Parameter und Variablen aus dem Umbau des Vortags: symbol_setzen(dunkel=),
  kachel(grund=, radius=), mit_trennlinie, sechs x/y-Berechnungen, die von
  theme.mittig() sofort ueberschrieben wurden, vier lokale "import ctypes".

39 Pruefstaende, 0 rot.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V4t48uxDok5rJXhC9bX1Ax
2026-09-07 18:39:03 +02:00
assets Windows-Symbol in den Programmfarben 2026-09-07 10:52:00 +02:00
.gitattributes Aufraeumen nach der Pruefkette: doppelter Code an eine Stelle 2026-09-07 18:39:03 +02:00
.gitignore Logo in der Statuszeile, Bau an einer Stelle, Startprobe fuer die EXE 2026-09-06 20:34:59 +02:00
api.py Aufraeumen nach der Pruefkette: doppelter Code an eine Stelle 2026-09-07 18:39:03 +02:00
app.py Aufraeumen nach der Pruefkette: doppelter Code an eine Stelle 2026-09-07 18:39:03 +02:00
AUFGABE_AUSSENDIENST_ARBEITSPROTOKOLL.md Logo in der Statuszeile, Bau an einer Stelle, Startprobe fuer die EXE 2026-09-06 20:34:59 +02:00
AUFGABE_BEWEISKETTE_PRUEFBAR.md Darstellung waehlbar: hell, dunkel oder wie Windows 2026-09-07 00:34:16 +02:00
AUFGABE_KUNDENSTAMM_UND_WEB.md Amt-Blatt: die letzten Reste raus - das Programm behauptet keine zweite Seite mehr 2026-09-06 15:33:18 +02:00
AUFGABE_ONLINE_API_MYSQL.md Logo in der Statuszeile, Bau an einer Stelle, Startprobe fuer die EXE 2026-09-06 20:34:59 +02:00
AUFGABE_PREISVORSCHLAG.md Aufgabe festgehalten: Preisvorschlag beim Rechnungschreiben 2026-09-07 00:06:25 +02:00
AUFGABE_RECHTSSICHER_BILDER_VORSCHAU.md Amt-Blatt raus, Bedienung ueber die API, Erststart fragt nach zwei Wegen 2026-09-05 18:24:59 +02:00
bauen.py Alles unter ravokk - und ein Deinstallieren laesst nichts liegen 2026-09-07 10:43:09 +02:00
berechnung.py Rechnungstool Campinghof - Rechnungen als PDF statt Excel-Vorlage 2026-07-12 19:18:38 +02:00
bestand.py Der Rechnungszaehler kann nicht mehr hinter das Vergebene zurueck 2026-09-03 22:43:23 +02:00
bilder.py Bilder und Farbe gehoeren der Firma, dazu ein Vorschau-Knopf 2026-09-05 17:35:37 +02:00
config.py Aufraeumen nach der Pruefkette: doppelter Code an eine Stelle 2026-09-07 18:39:03 +02:00
Diagnose.spec Alles unter ravokk - und ein Deinstallieren laesst nichts liegen 2026-09-07 10:43:09 +02:00
einstellungen.py Erprobungshinweis beim Start - mit Kenntnisnahme und Signatur unter Info 2026-09-06 15:55:56 +02:00
einzelinstanz.py Aufraeumen nach der Pruefkette: doppelter Code an eine Stelle 2026-09-07 18:39:03 +02:00
flaeche.py Layout: die Formularseite nimmt nur, was sie braucht 2026-09-06 23:41:24 +02:00
gemeinsam.py Alles unter ravokk - und ein Deinstallieren laesst nichts liegen 2026-09-07 10:43:09 +02:00
helfer.py Zwei getrennte Knoepfe und app.py in Module aufgeteilt 2026-09-02 19:41:00 +02:00
hinweis.py Erprobungshinweis beim Start - mit Kenntnisnahme und Signatur unter Info 2026-09-06 15:55:56 +02:00
icons.py Kaesten verschiebbar wie bei OPNsense: Knopf, schieben, speichern 2026-09-05 19:53:42 +02:00
Installer.iss Alles unter ravokk - und ein Deinstallieren laesst nichts liegen 2026-09-07 10:43:09 +02:00
korrektur.py Aufraeumen nach der Pruefkette: doppelter Code an eine Stelle 2026-09-07 18:39:03 +02:00
menueleiste.py Aufraeumen nach der Pruefkette: doppelter Code an eine Stelle 2026-09-07 18:39:03 +02:00
ordnerwahl.py Aufraeumen nach der Pruefkette: doppelter Code an eine Stelle 2026-09-07 18:39:03 +02:00
pdf_renderer.py Logo in der Statuszeile, Bau an einer Stelle, Startprobe fuer die EXE 2026-09-06 20:34:59 +02:00
pruef_angebot.py Aufraeumen nach der Pruefkette: doppelter Code an eine Stelle 2026-09-07 18:39:03 +02:00
pruef_api.py Aufraeumen nach der Pruefkette: doppelter Code an eine Stelle 2026-09-07 18:39:03 +02:00
pruef_bilder.py Aufraeumen nach der Pruefkette: doppelter Code an eine Stelle 2026-09-07 18:39:03 +02:00
pruef_darstellung.py Aufraeumen nach der Pruefkette: doppelter Code an eine Stelle 2026-09-07 18:39:03 +02:00
pruef_dialoge.py Erprobungshinweis beim Start - mit Kenntnisnahme und Signatur unter Info 2026-09-06 15:55:56 +02:00
pruef_doppelte_leistung.py Aufraeumen nach der Pruefkette: doppelter Code an eine Stelle 2026-09-07 18:39:03 +02:00
pruef_flaeche.py Aufraeumen nach der Pruefkette: doppelter Code an eine Stelle 2026-09-07 18:39:03 +02:00
pruef_freigabe.py Aufraeumen nach der Pruefkette: doppelter Code an eine Stelle 2026-09-07 18:39:03 +02:00
pruef_gemeinsam_automatisch.py Aufraeumen nach der Pruefkette: doppelter Code an eine Stelle 2026-09-07 18:39:03 +02:00
pruef_hinweis.py Aufraeumen nach der Pruefkette: doppelter Code an eine Stelle 2026-09-07 18:39:03 +02:00
pruef_installation.py Aufraeumen nach der Pruefkette: doppelter Code an eine Stelle 2026-09-07 18:39:03 +02:00
pruef_kernregeln.py Aufraeumen nach der Pruefkette: doppelter Code an eine Stelle 2026-09-07 18:39:03 +02:00
pruef_kette.py Aufraeumen nach der Pruefkette: doppelter Code an eine Stelle 2026-09-07 18:39:03 +02:00
pruef_menueleiste.py Aufraeumen nach der Pruefkette: doppelter Code an eine Stelle 2026-09-07 18:39:03 +02:00
pruef_montage.py Aufraeumen nach der Pruefkette: doppelter Code an eine Stelle 2026-09-07 18:39:03 +02:00
pruef_nummern.py Die Kette steht auf dem Storno-Blatt - kein gemerkter Zustand noetig 2026-09-02 20:42:31 +02:00
pruef_nummernbuch.py Aufraeumen nach der Pruefkette: doppelter Code an eine Stelle 2026-09-07 18:39:03 +02:00
pruef_nummernsperre.py Aufraeumen nach der Pruefkette: doppelter Code an eine Stelle 2026-09-07 18:39:03 +02:00
pruef_nur_storno.py Aufraeumen nach der Pruefkette: doppelter Code an eine Stelle 2026-09-07 18:39:03 +02:00
pruef_release.py Aufraeumen nach der Pruefkette: doppelter Code an eine Stelle 2026-09-07 18:39:03 +02:00
pruef_selbstbezug.py Aufraeumen nach der Pruefkette: doppelter Code an eine Stelle 2026-09-07 18:39:03 +02:00
pruef_spaltenbreiten.py Aufraeumen nach der Pruefkette: doppelter Code an eine Stelle 2026-09-07 18:39:03 +02:00
pruef_start_exe.py Aufraeumen nach der Pruefkette: doppelter Code an eine Stelle 2026-09-07 18:39:03 +02:00
pruef_storno.py Aufraeumen nach der Pruefkette: doppelter Code an eine Stelle 2026-09-07 18:39:03 +02:00
pruef_updater.py Aufraeumen nach der Pruefkette: doppelter Code an eine Stelle 2026-09-07 18:39:03 +02:00
pruef_vorschau.py Aufraeumen nach der Pruefkette: doppelter Code an eine Stelle 2026-09-07 18:39:03 +02:00
pruefhelfer.py Aufraeumen nach der Pruefkette: doppelter Code an eine Stelle 2026-09-07 18:39:03 +02:00
pruefsteuerung.py Amt-Blatt raus, Bedienung ueber die API, Erststart fragt nach zwei Wegen 2026-09-05 18:24:59 +02:00
README.md Erprobungshinweis beim Start - mit Kenntnisnahme und Signatur unter Info 2026-09-06 15:55:56 +02:00
Rechnung starten.bat Rechnungstool Campinghof - Rechnungen als PDF statt Excel-Vorlage 2026-07-12 19:18:38 +02:00
Rechnungstool.spec Alles unter ravokk - und ein Deinstallieren laesst nichts liegen 2026-09-07 10:43:09 +02:00
reiter.py Reiter selbst gebaut - clam liess den ruhenden nicht dunkel werden 2026-09-05 19:21:20 +02:00
storno.py Funde der drei Agenten: zwei kaputte Dialoge, haengende Flags, scharfe Pruefstaende 2026-09-02 19:57:31 +02:00
theme.py Aufraeumen nach der Pruefkette: doppelter Code an eine Stelle 2026-09-07 18:39:03 +02:00
updater.py Aufraeumen nach der Pruefkette: doppelter Code an eine Stelle 2026-09-07 18:39:03 +02:00
Updater.spec Logo in der Statuszeile, Bau an einer Stelle, Startprobe fuer die EXE 2026-09-06 20:34:59 +02:00
version.py Windows-Symbol in den Programmfarben 2026-09-07 10:52:00 +02:00
wasserzeichen.py Aufraeumen nach der Pruefkette: doppelter Code an eine Stelle 2026-09-07 18:39:03 +02:00

Rechnungstool Campinghof Bartl

Umbenennung, 06.09.2026

Die Repositories heissen jetzt:

bisher jetzt
beherbergungssteuer Steuerrechnungstool - https://git.pcore.de/TheMockTv/Steuerrechnungstool
rechnungstool unveraendert - https://git.pcore.de/TheMockTv/rechnungstool

Grund: „Beherbergungssteuer“ beschrieb nur noch einen Teil dessen, was das Programm tut. Alte Links leitet Forgejo weiter, bestehende Klone laufen weiter - das origin sollte trotzdem umgestellt werden:

git remote set-url origin https://git.pcore.de/TheMockTv/Steuerrechnungstool.git

Fehler und Wünsche bitte als Issue im jeweiligen Repository melden - die Adresse steht auch im Programm unter Hilfe → Info und im Hinweis beim Start.

⚠️ Der lokale Ordner heißt weiterhin C:\claude\beherbergungssteuer. Der Pfad steht fest verdrahtet in mehreren Prüfständen und in den Spec-Dateien - das Umbenennen ist ein eigener Schritt.

Desktop-Programm (Python/Tkinter), das die alte Excel-Rechnungsvorlage ersetzt: Kundendaten + Anzahl eingeben → druckfertige PDF-Rechnung im Campinghof-Layout.

Starten

  • Doppelklick auf Rechnung starten.bat
  • oder im Terminal: python app.py

Bedienung

  1. Kunde (Name/Anschrift) und An-/Abreise eintragen – die Nächte werden automatisch berechnet.
  2. Bei den passenden Leistungen die Anzahl (Tage/Menge) eingeben; bei Personengebühren zusätzlich die Personen.
  3. Summen (inkl. Steuer-Aufschlüsselung) erscheinen live unten.
  4. PDF erstellen → die Rechnung landet im Ordner rechnungen/ und öffnet sich zum Drucken.

Die Rechnungsnummer (JJJJ-NNN) zählt nach jedem Erstellen automatisch hoch.

Einstellungen (Menü „Einstellungen")

  • Steuersätze & Bettensteuer – ermäßigter/regulärer USt-Satz; Beherbergungssteuer per Checkbox an/aus + Prozentsatz. Bei aktiver Bettensteuer wird sie auf das Netto der Beherbergungs-Positionen aufgeschlagen und eigen ausgewiesen.
  • Leistungskatalog / Preise – Bezeichnung, USt-Satz und Brutto-Preis je Position.
  • Firmendaten & Texte – Kopf, Bankverbindung, Fußzeile, Danktexte.
  • Rechnungsnummer – Jahr und Zähler setzen.

Alle Einstellungen werden in config.json gespeichert (neben den Programmdateien).

Berechnung (wie in der Excel-Vorlage)

  • Position-Gesamt = Anzahl × Einzelpreis (Personengebühren zusätzlich × Personen).
  • Preise sind brutto; die USt wird herausgerechnet (7 %: ÷107×7, 19 %: ÷119×19).
  • Optionale Beherbergungssteuer = Satz % auf das Netto der Beherbergungs-Positionen.

Dateien

Datei Zweck
app.py GUI (Eingabe + Einstellungen)
berechnung.py Rechenkern (eine Quelle für GUI + PDF)
pdf_renderer.py PDF-Erstellung (reportlab)
config.py Standardwerte + Laden/Speichern der config.json
config.json gespeicherte Einstellungen (wird beim 1. Start angelegt)
rechnungen/ Ausgabeordner für die PDFs

Voraussetzungen

  • Python 3.10+
  • reportlab (pip install reportlab)
  • tkinter (bei Standard-Windows-Python dabei)