Sein Bild (06.09.2026): "der updater schaut beim starten erst: ist auf dem git link eine neue version mit exe? wenn ja, erst laden, ersetzen und dann starten." "einmal pruefen auf vollstaendigkeit." "wir werden den namen mit nummer fuehren - wenn er merkt, eh warte mal, die heisst anders, dann neu machen" DER AUFBAU Der Updater IST der Starter. Er laeuft, BEVOR das Programm laeuft - damit gibt es das Windows-Problem "laufende EXE laesst sich nicht ersetzen" gar nicht. Und weil die installierte Datei die Nummer im Namen traegt (Rechnungstool-1.6.0.exe), wird ueberhaupt nichts ueberschrieben: eine neue Fassung ist eine neue Datei. Die vorige bleibt liegen und ist damit die Rueckfallebene, ohne dass jemand eine Sicherung anlegen muesste. Der Updater sieht am NAMEN, was da ist - er muss keiner Angabe glauben. version.py: die Nummer an EINER Stelle, im Code, in die EXE kompiliert. Sie entspricht dem Release-Tag ohne "v". Zusaetzlich fuehrt der Updater ein eigenes Buch (installiert.json); wer eine Datei umbenennt, verursacht hoechstens einen ueberfluessigen Download. BEIM BAUEN AUFGEFALLEN /releases/latest liefert NICHTS, weil alle Fassungen als Vorabversion gekennzeichnet sind - Forgejo laesst Vorabversionen dort aus. Der Updater nimmt deshalb die Liste und sucht selbst die hoechste Nummer. Waere das erst beim Nutzer aufgefallen, haette der Updater nie ein Update gefunden. Beide Repositories sind oeffentlich - kein Token noetig. Ein Token in einer verteilten EXE waere ohnehin keins. VOLLSTAENDIGKEIT Geladen wird in einen Zwischenordner. Erst wenn GROESSE und (falls das Release eine .sha256 anhaengt) PRUEFSUMME stimmen, kommt die Datei in den Installationsordner. Sonst wird verworfen und die vorhandene Fassung gestartet - lieber kein Update als ein kaputtes. PRUEFSTAND pruef_updater.py prueft vor allem, wann NICHT aktualisiert werden darf: gleiche Fassung, aeltere im Netz, kein passender Anhang, Entwurf, kein Netz, falsche Groesse, falsche Pruefsumme. Und den wichtigsten Punkt: eine halbe Datei erreicht den Installationsordner nie. Alle 18 Pruefstaende gruen. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V4t48uxDok5rJXhC9bX1Ax |
||
|---|---|---|
| assets | ||
| .gitignore | ||
| api.py | ||
| app.py | ||
| AUFGABE_BEWEISKETTE_PRUEFBAR.md | ||
| AUFGABE_KUNDENSTAMM_UND_WEB.md | ||
| AUFGABE_RECHTSSICHER_BILDER_VORSCHAU.md | ||
| berechnung.py | ||
| bestand.py | ||
| bilder.py | ||
| config.py | ||
| einstellungen.py | ||
| einzelinstanz.py | ||
| flaeche.py | ||
| gemeinsam.py | ||
| helfer.py | ||
| hinweis.py | ||
| icons.py | ||
| korrektur.py | ||
| ordnerwahl.py | ||
| pdf_renderer.py | ||
| pruef_angebot.py | ||
| pruef_api.py | ||
| pruef_bilder.py | ||
| pruef_dialoge.py | ||
| pruef_doppelte_leistung.py | ||
| pruef_flaeche.py | ||
| pruef_freigabe.py | ||
| pruef_hinweis.py | ||
| pruef_kernregeln.py | ||
| pruef_kette.py | ||
| pruef_montage.py | ||
| pruef_nummern.py | ||
| pruef_nummernbuch.py | ||
| pruef_nummernsperre.py | ||
| pruef_nur_storno.py | ||
| pruef_storno.py | ||
| pruef_updater.py | ||
| pruef_vorschau.py | ||
| pruefsteuerung.py | ||
| README.md | ||
| Rechnung starten.bat | ||
| reiter.py | ||
| storno.py | ||
| theme.py | ||
| updater.py | ||
| version.py | ||
Rechnungstool Campinghof Bartl
Umbenennung, 06.09.2026
Die Repositories heissen jetzt:
bisher jetzt beherbergungssteuerSteuerrechnungstool- https://git.pcore.de/TheMockTv/Steuerrechnungstoolrechnungstoolunveraendert - 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
originsollte trotzdem umgestellt werden:git remote set-url origin https://git.pcore.de/TheMockTv/Steuerrechnungstool.gitFehler 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
- Kunde (Name/Anschrift) und An-/Abreise eintragen – die Nächte werden automatisch berechnet.
- Bei den passenden Leistungen die Anzahl (Tage/Menge) eingeben; bei Personengebühren zusätzlich die Personen.
- Summen (inkl. Steuer-Aufschlüsselung) erscheinen live unten.
- 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)