No description
Find a file
TheMockTv 96aa51ac22 Kopflogo, Bau an einer Stelle, Startprobe fuer die EXE
Logo
  Das Programmlogo (Wolke mit Paragraphenzeichen) steht jetzt rechts in der
  Kopfleiste - damit sich die beiden Werkzeuge auf einen Blick unterscheiden.

bauen.py
  Der Weg von der Quelle zur Setup-Datei war eine Folge von Befehlen, die
  jemand von Hand eintippen musste. Wer einen Schritt vergisst, liefert eine
  Setup-Datei mit einer alten EXE aus - und sieht es ihr nicht an. Jetzt ist
  es ein Befehl, die Nummer kommt aus version.py, und am Ende stehen die
  SHA256-Summen fuer den Release-Text.

pruef_start_exe.py
  Prueft, was kein anderer Pruefstand prueft: ob die GEBAUTE EXE ein
  sichtbares Fenster zeigt. Alle uebrigen fahren das Programm aus der Quelle,
  dort trat der Fehler nie auf.

pruef_einzelinstanz.py wieder gruen
  Der Erprobungshinweis haette in jedem der drei Starts ein echtes Fenster
  geoeffnet - in einem eigenen Prozess laesst sich kein Dialog abfangen, es
  klickt niemand. Geprueft wird dort die SPERRE, nicht der Hinweis (der hat
  einen eigenen Pruefstand). Die Kenntnisnahme wird deshalb vorher
  eingetragen, und zwar mit genau dem Code, den auch der Klick auf "Ja"
  ausfuehrt. Das trifft nur die Kopie im Temp-Ordner: im echten Journal
  entsteht keine Zustimmung, die niemand gegeben hat.

Aufgeraeumt
  Beherbergungssteuer.exe und die gleichnamige .spec sind raus - das Programm
  heisst jetzt anders. Gebaute Dateien gehoeren ins Release, nicht ins Repo;
  die .spec-Dateien dagegen schon.

Fassung 1.8.0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V4t48uxDok5rJXhC9bX1Ax
2026-09-06 20:35:23 +02:00
assets Kopflogo, Bau an einer Stelle, Startprobe fuer die EXE 2026-09-06 20:35:23 +02:00
.gitignore Kopflogo, Bau an einer Stelle, Startprobe fuer die EXE 2026-09-06 20:35:23 +02:00
ablage.py Eigener Datenordner (ablage.py) 2026-09-02 21:44:51 +02:00
api.py api.py nachgezogen: Schluessel und Bedienung (gleiche Datei wie im Rechnungstool) 2026-09-05 18:24:59 +02:00
app.py Kopflogo, Bau an einer Stelle, Startprobe fuer die EXE 2026-09-06 20:35:23 +02:00
bauen.py Kopflogo, Bau an einer Stelle, Startprobe fuer die EXE 2026-09-06 20:35:23 +02:00
Beherbergungssteuer starten.bat Beherbergungssteuer: Steuerjournal aus den Rechnungs-PDFs 2026-07-12 19:15:44 +02:00
bericht_pdf.py Amtsbericht: Spalte "Art" mit R/S/B und Legende unter der Tabelle 2026-09-04 02:29:48 +02:00
db.py Amtsbericht: die Kette zeigt vorwaerts - Storno nennt die neue Rechnung 2026-09-04 02:19:49 +02:00
doku_aenderungen_pdf.py Amtsbericht: Spalte "Art" mit R/S/B und Legende unter der Tabelle 2026-09-04 02:29:48 +02:00
einzelinstanz.py Doppelte Rechnungsnummern zeigen, nur ein Fenster, keine Handbuchungen 2026-09-03 19:47:44 +02:00
firma.py Firmendaten portabel suchen + Menuepunkt zum Auswaehlen 2026-07-12 19:22:17 +02:00
gemeinsam.py gemeinsam.py nachgezogen: Spalte freigabe (gleiche Datei wie im Rechnungstool) 2026-09-06 15:42:55 +02:00
gui_monat.py Amtsbericht: Spalte "Art" mit R/S/B und Legende unter der Tabelle 2026-09-04 02:29:48 +02:00
hinweis.py Steuerrechnungstool: neuer Name und Erprobungshinweis wie im Rechnungstool 2026-09-06 16:24:43 +02:00
Installer.iss Kopflogo, Bau an einer Stelle, Startprobe fuer die EXE 2026-09-06 20:35:23 +02:00
modell.py Amtsbericht: die Kette zeigt vorwaerts - Storno nennt die neue Rechnung 2026-09-04 02:19:49 +02:00
ordnerwahl.py Storno und Berichtigung kommen an, gemeinsames Nummernbuch, kein Bearbeiten mehr 2026-09-03 20:38:38 +02:00
pdf_parser.py Kopflogo, Bau an einer Stelle, Startprobe fuer die EXE 2026-09-06 20:35:23 +02:00
pruef_berichtigung.py Storno und Berichtigung: das Journal darf die Buchung nicht verlieren 2026-09-02 21:39:41 +02:00
pruef_doppelte.py Steuerrechnungstool: neuer Name und Erprobungshinweis wie im Rechnungstool 2026-09-06 16:24:43 +02:00
pruef_einzelinstanz.py Kopflogo, Bau an einer Stelle, Startprobe fuer die EXE 2026-09-06 20:35:23 +02:00
pruef_start_exe.py Kopflogo, Bau an einer Stelle, Startprobe fuer die EXE 2026-09-06 20:35:23 +02:00
pruef_storno_journal.py Steuerrechnungstool: neuer Name und Erprobungshinweis wie im Rechnungstool 2026-09-06 16:24:43 +02:00
pruef_storno_verrechnet.py Steuerrechnungstool: neuer Name und Erprobungshinweis wie im Rechnungstool 2026-09-06 16:24:43 +02:00
pruef_wache.py Kopflogo, Bau an einer Stelle, Startprobe fuer die EXE 2026-09-06 20:35:23 +02:00
README.md README: Umbenennung nach Steuerrechnungstool vermerkt 2026-09-06 15:55:57 +02:00
Steuerrechnungstool starten.bat Steuerrechnungstool: neuer Name und Erprobungshinweis wie im Rechnungstool 2026-09-06 16:24:43 +02:00
Steuerrechnungstool.spec Kopflogo, Bau an einer Stelle, Startprobe fuer die EXE 2026-09-06 20:35:23 +02:00
updater.py Kopflogo, Bau an einer Stelle, Startprobe fuer die EXE 2026-09-06 20:35:23 +02:00
Updater.spec Kopflogo, Bau an einer Stelle, Startprobe fuer die EXE 2026-09-06 20:35:23 +02:00
version.py Kopflogo, Bau an einer Stelle, Startprobe fuer die EXE 2026-09-06 20:35:23 +02:00
wasserzeichen.py Kopflogo, Bau an einer Stelle, Startprobe fuer die EXE 2026-09-06 20:35:23 +02:00
xlsx_io.py Beherbergungssteuer: Steuerjournal aus den Rechnungs-PDFs 2026-07-12 19:15:44 +02:00
zeig_stornos.py Blick-Skript: was die Stornos in einem Journal bewirken 2026-09-04 01:05:59 +02:00

Steuerrechnungstool – Campinghof Bartl

(früher „Beherbergungssteuer“ – siehe Hinweis unten)

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.

Ersetzt die Excel-Mappe Beherbergungsteuer.xlsx.

Quelle der Wahrheit sind die Rechnungs-PDFs aus dem Rechnungstool. Das Programm liest den Rechnungs-Ordner ein, führt daraus das Steuerjournal und schreibt auf Knopfdruck die Excel-Mappe fürs Amt.

Starten

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

Bedienung

  1. Rechnungs-Ordner… → den Ordner wählen, in dem das Rechnungstool die PDFs ablegt (Standard: Dokumente\Campinghof Rechnungen). Danach wird sofort eingelesen; bei jedem Start passiert das automatisch.
  2. Rechnungen einlesen (oder F5) holt neue Rechnungen nach. Bereits gelesene PDFs werden übersprungen (Vergleich über Pfad, Änderungszeit und Größe) – das geht auch bei tausend Rechnungen schnell.
  3. Monats-Reiter zeigen die Buchungen mit Summenzeile, unten rechts steht die Jahressumme.
  4. PDF fürs Amt schreibt den Monatsbericht des offenen Reiters als PDF im Campinghof-Layout (gleicher Briefkopf wie die Rechnungen) nach berichte/: Tabelle aller Rechnungen, Summenblock mit der Steuer, Unterschriftszeile. Über das Menü gibt es zusätzlich den Jahresbericht. Gedruckt wird aus dem PDF-Programm heraus.

Im Journal wird nichts von Hand geändert (seit v1.4): weder anlegen noch bearbeiten. Jede Zeile gehört zu einer Rechnung aus dem Rechnungstool – auch die Barzahlung. Wer hier Betrag oder Nummer verstellte, meldete dem Amt etwas anderes, als auf dem Beleg steht; beim nächsten Einlesen käme die Änderung ohnehin zurück. Stimmt eine Rechnung nicht, wird sie im Rechnungstool storniert oder berichtigt.

Löschen bleibt: Entf oder die Haken-Spalte mit dem Papierkorb. Das entfernt nur die Zeile aus dem Zwischenspeicher – die PDF bleibt liegen und wird beim nächsten Einlesen wieder gefunden.

Der Briefkopf des Berichts (Firma, Logo, Bankzeile) wird aus der config.json des Rechnungstools gelesen – also nur an einer Stelle gepflegt.

Was aus der PDF gelesen wird

Spalte Herkunft in der Rechnung
Datum Rechnungsdatum:
Rechnung Rechnungsnummer: (z.B. 2026-238)
Nachname erste Zeile unter Rechnung an:
Übernachtungen Zeitraum: 3 Nächte (ersatzweise An-/Abreise)
Gezahlt Zwischensumme: – das ist die Basis der Steuer
Steuer zzgl. Beherbergungssteuer (5 %):

Weicht der in der PDF ausgewiesene Steuerbetrag von der eigenen Rechnung ab, steht das als Warnung in beherbergungssteuer.log.

Doppelt vergebene Rechnungsnummern

Jede Rechnungsnummer darf es nur einmal geben (§ 14 Abs. 4 Nr. 4 UStG). Kommt eine Nummer trotzdem zweimal vor, zeigt das Journal sie an, statt eine der beiden verschwinden zu lassen:

  • die betroffenen Zeilen stehen rot und tragen ein ⚠ vor der Nummer,
  • der Monatsreiter bekommt ebenfalls ein ⚠ – auch dann, wenn die zweite Rechnung in einem anderen Monat liegt (gerechnet wird über das ganze Jahr),
  • unter der Jahressumme steht eine rote Zeile mit dem Knopf „Doppelte Rechnungen anzeigen…": dort stehen alle Belege mit Datum, Gast, Betrag und Dateiname.

Die Beträge bleiben in allen Summen und im Bericht fürs Amt – es wird nichts stillschweigend weggerechnet. Zwei Zeilen zur selben Rechnung (z. B. einmal aus dem Excel-Altbestand und einmal aus der PDF) melden die Übernachtung doppelt ans Amt; zwei verschiedene Gäste unter einer Nummer sind ein Fehler im Rechnungstool. Was zu tun ist, entscheidet der Wirt – das Programm ändert von allein nichts.

Bis Version 1.2 war die Rechnungsnummer der Schlüssel der Datenbank: die zweite Rechnung hat die erste still überschrieben und fehlte danach in der Meldung ans Amt. Seit v1.3 ist der Schlüssel die PDF-Datei, seit v1.4 sieht man den Fall auch.

Nur ein Fenster

Das Programm lässt sich nicht zweimal öffnen. Ein zweiter Doppelklick holt das offene Fenster nach vorn. Grund: beide Fenster würden denselben Rechnungsordner in dieselbe journal.sqlite3 einlesen und danach verschiedene Stände zeigen – wer im älteren Fenster auf „PDF fürs Amt" drückt, meldet einen Stand, den es nicht mehr gibt.

Excel einlesen

Datei → Excel-Tabelle einlesen… zieht die bisherige Beherbergungsteuer.xlsx ins Journal – sowohl den Altbestand aus der Zeit vor dem Rechnungstool als auch jede spätere Fassung, die noch in Excel gepflegt wurde. Zeilen ohne PDF sind in der Tabelle grau dargestellt. Rechnungsnummern werden dabei vereinheitlicht (001, 13, 2026-17 → 2026-013), sonst entstünden doppelte Buchungen.

Dateien

Datei Zweck
app.py Fenster, Menü, Aktionen
gui_monat.py ein Monatsblatt (Tabelle + Summenzeile)
pdf_parser.py Rechnungs-PDF → Buchung
bericht_pdf.py Monats-/Jahresbericht fürs Amt (reportlab)
firma.py Briefkopf aus der config.json des Rechnungstools
db.py Journal (SQLite) + PDF-Scan mit Cache
xlsx_io.py Excel-Import
modell.py Datenmodell + Steuerrechnung + doppelte Nummern (die einzige Rechenstelle)
ablage.py wo der Datenordner liegt (neben der EXE oder in LOCALAPPDATA)
einzelinstanz.py Sperre gegen ein zweites Fenster
pruef_doppelte.py Prüfstand: werden doppelte Nummern angezeigt?
pruef_einzelinstanz.py Prüfstand: geht das Programm wirklich nur einmal auf?
pruef_berichtigung.py Prüfstand: Storno/Berichtigung überschreiben nichts
journal.sqlite3 die Daten (wird beim 1. Start angelegt)
berichte/ die erzeugten Amts-PDFs

Voraussetzungen

Python 3.10+, pypdf, openpyxl und reportlab (pip install pypdf openpyxl reportlab).