Beherbergungssteuer: Steuerjournal aus den Rechnungs-PDFs

Ersetzt die Excel-Mappe des Campinghofs. Die Rechnungs-PDFs des
Rechnungstools sind die Quelle; SQLite ist nur Cache, Excel nur noch
Import des Altbestands. Bericht fuers Amt als PDF im Briefkopf der
Rechnungen (Firmendaten aus der config.json des Rechnungstools).

- pdf_parser: liest Datum, Nummer, Name, Naechte, Zwischensumme, Satz
- db: Journal + Scan mit Cache (Pfad/mtime/Groesse)
- xlsx_io: Import der alten Tabelle, vereinheitlicht Rechnungsnummern
- bericht_pdf: Monats- und Jahresbericht (reportlab)
- GUI: Monatsreiter, Suche, Anhaken + Papierkorb, Kennzahlen-Leiste

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
TheMockTv 2026-07-12 19:15:44 +02:00
commit 80967de26f
12 changed files with 1908 additions and 0 deletions

77
README.md Normal file
View file

@ -0,0 +1,77 @@
# 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`).