No description
Find a file
TheMockTv 65eec9937a Storno und Berichtigung: das Journal darf die Buchung nicht verlieren
Das Rechnungstool schreibt seit heute auch Storno- und Berichtigungsblaetter in
denselben Ordner. Zwei Fehler, die daraus entstanden waeren - beide still:

1. Ein Berichtigungsblatt (§ 31 Abs. 5 UStDV) traegt die Nummer DER RECHNUNG,
   die es berichtigt, und lauter Nullen. Unter dem alten Schluessel
   (jahr, rechnungsnummer) hat es die echte Buchung ueberschrieben - im
   Amtsbericht fehlte die Uebernachtung dann. Wird jetzt uebersprungen
   (pdf_parser.keine_buchung), in beiden Scannern.
2. Der Schluessel ist jetzt die DATEI. Zwei Rechnungen mit derselben Nummer -
   der Altbestand, bevor das Rechnungstool eine Sperre bekam - ueberschrieben
   sich sonst gegenseitig. Bestehende Journale werden beim Oeffnen einmalig
   umgebaut, in einer Transaktion, mit Rueckfall auf den alten Stand.
   Buchungen von Hand (kein PDF-Pfad) bleiben davon unberuehrt.

Stornos zaehlen weiter mit - sie sind negativ und heben die Uebernachtung im
Bericht genau so auf, wie es sein soll.

pruef_berichtigung.py (neu): schreibt mit dem echten Renderer des
Rechnungstools eine Rechnung, ein Berichtigungsblatt dazu und zwei Rechnungen
mit derselben Nummer, liest sie ein und prueft das Ergebnis in der Tabelle.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EKvGkdNW1vKdnMPAM9Bp3X
2026-09-02 21:39:41 +02:00
.gitignore Beherbergungssteuer: Steuerjournal aus den Rechnungs-PDFs 2026-07-12 19:15:44 +02:00
app.py Firmendaten portabel suchen + Menuepunkt zum Auswaehlen 2026-07-12 19:22:17 +02:00
Beherbergungssteuer starten.bat Beherbergungssteuer: Steuerjournal aus den Rechnungs-PDFs 2026-07-12 19:15:44 +02:00
bericht_pdf.py Fusszeile raus - sie ragte in die Tabelle 2026-07-13 20:59:20 +02:00
db.py Storno und Berichtigung: das Journal darf die Buchung nicht verlieren 2026-09-02 21:39:41 +02:00
firma.py Firmendaten portabel suchen + Menuepunkt zum Auswaehlen 2026-07-12 19:22:17 +02:00
gui_dialoge.py Beherbergungssteuer: Steuerjournal aus den Rechnungs-PDFs 2026-07-12 19:15:44 +02:00
gui_monat.py Beherbergungssteuer: Steuerjournal aus den Rechnungs-PDFs 2026-07-12 19:15:44 +02:00
modell.py Beherbergungssteuer: Steuerjournal aus den Rechnungs-PDFs 2026-07-12 19:15:44 +02:00
pdf_parser.py Storno und Berichtigung: das Journal darf die Buchung nicht verlieren 2026-09-02 21:39:41 +02:00
pruef_berichtigung.py Storno und Berichtigung: das Journal darf die Buchung nicht verlieren 2026-09-02 21:39:41 +02:00
README.md Beherbergungssteuer: Steuerjournal aus den Rechnungs-PDFs 2026-07-12 19:15:44 +02:00
xlsx_io.py Beherbergungssteuer: Steuerjournal aus den Rechnungs-PDFs 2026-07-12 19:15:44 +02:00

Beherbergungssteuer – Campinghof Bartl

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.

Eine Zeile per Doppelklick bearbeiten, mit Entf aus dem Journal löschen (die PDF bleibt liegen und wird beim nächsten Einlesen wieder gefunden). Barzahlungen ohne PDF gehen über Neue Buchung.

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.

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)
gui_dialoge.py Buchung von Hand anlegen/bearbeiten
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 (die einzige Rechenstelle)
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).