Steuerrechnungstool/hinweis.py
TheMockTv 40f53c85a0 Steuerrechnungstool: neuer Name und Erprobungshinweis wie im Rechnungstool
NAME
Das Programm heisst jetzt Steuerrechnungstool - wie sein Repository
(https://git.pcore.de/TheMockTv/Steuerrechnungstool). Umgestellt: Fenstertitel,
Kopfzeile, "laeuft bereits"-Meldung, Startdatei, Spec-Datei (EXE-Name), Logzeile.

NICHT umbenannt, mit Absicht:
  * "Beherbergungssteuer" als NAME DER STEUER - das ist ein Rechtsbegriff und
    steht weiter so in Berichten, Anmeldung und Oberflaeche.
  * LOCALAPPDATA\Beherbergungssteuer in ablage.py - dort liegt der Zeiger auf
    den Datenordner. Wer den umbenennt, kappt bestehenden Installationen den
    Weg zu ihren Daten.
  * Der lokale Ordner C:\claude\beherbergungssteuer - steht in Pruefstaenden
    und Spec-Dateien fest, eigener Schritt.

HINWEIS
hinweis.py aus dem Rechnungstool uebernommen (liegt in beiden Programmen
gleich). Der Hinweis kommt beim Start, Ablehnen beendet das Programm ohne
etwas zu vermerken, die Kenntnisnahme wird mit Benutzer, Zeit und Fassung in
der Einstellungstabelle des Journals gespeichert. Neu: Menue Hilfe -> Info mit
dem Text und der Signaturzeile.

PRUEFSTAENDE
Vier Prueflaeufe hatten gar keinen Dialogabfang - bisher fragte das Programm
beim Start nichts. Jetzt bleiben sie sonst vor einem echten Fenster stehen.
pruef_doppelte und pruef_storno_verrechnet haben einen bekommen, der bei
UNBEKANNTEN Fragen abbricht statt still "ja" zu sagen. pruef_storno_journal und
pruef_wache melden Hinweis und Freigabe ausdruecklich an. pruef_wache treibt
ausserdem die Ereignisschleife an (update), sonst kaeme after_idle nie dran.

pruef_wache: die Erwartung "im gemeinsamen Ordner liegt genau EINE Datei" ist
auf die richtige Menge gebracht - Nummernbuch UND Schluessel der Mini-API, der
seit dem 05.09.2026 dorthin gehoert. Alles darueber hinaus faellt weiter auf.

⚠️ pruef_wache bleibt ROT an einer Stelle, die NICHT von diesen Arbeiten kommt
(vor dem Umbau gemessen, war schon rot): die Statuszeile soll nach einem Push
"Rechnungstool meldet" zeigen, wird aber vom Ergebnis des Einlesens
ueberschrieben. Dokumentiert in AUFGABE_BEWEISKETTE_PRUEFBAR.md.

5 von 6 Pruefstaenden gruen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V4t48uxDok5rJXhC9bX1Ax
2026-09-06 16:24:43 +02:00

109 lines
4.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# -*- coding: utf-8 -*-
"""Der Hinweis auf die Erprobungsfassung - und die Kenntnisnahme des Nutzers.
WARUM ES DAS GIBT
-----------------
Beide Programme schreiben Belege, die steuerlich zaehlen. Solange sie erprobt
werden, muss der Betreiber wissen, woran er ist: dass es eine Erprobungsfassung
ist, dass fuer falsch ausgestellte Belege nicht gehaftet wird, und dass er jeden
Beleg vor dem Herausgeben SELBST ansehen muss - dafuer gibt es die Vorschau.
Sein Wortlaut (06.09.2026):
"bei jedem oeffnen, solange wir die testen, ein popup, dass dies eine
experimentelle software ist und ich keine haftung fuer irgendwelche falsch
ausgestellten uebernehme. der user muss selbst pruefen ueber den vorschau
button auf beiden tools, ob das alles seine richtigkeit hat. wenn nicht,
auf dem link eine issue erstellen. und das alles auch noch mal in die info
mit signatur: user hat dies gelesen und zur kenntnis genommen. wenn er nein
drueckt oder ablehnt, schliesst sich die software und geht beim naechsten
start wieder mit dem selben auf, bis er auf ja drueckt."
WIE ES WIRKT
------------
* Beim Start kommt der Hinweis, BEVOR gearbeitet werden kann.
* "Nein" beendet das Programm. Es wird nichts geschrieben, nichts gespeichert.
* "Ja" wird mit Benutzername, Zeitpunkt und Fassung in der Konfiguration
vermerkt - das ist die Signatur. Danach kommt der Hinweis nicht mehr.
* Aendert sich der TEXT (also FASSUNG), wird erneut gefragt. Eine Zustimmung
gilt fuer das, was dagestanden hat, nicht fuer alles Kuenftige.
* Unter "Info" steht derselbe Text dauerhaft, mit der Signaturzeile darunter.
Diese Datei liegt in BEIDEN Programmen gleich. Wer sie aendert, kopiert sie
hinueber - sonst steht in zwei Programmen zweierlei.
"""
import datetime
import getpass
# Fassung des HINWEISTEXTES, nicht des Programms. Wird der Text geaendert,
# gehoert dieses Datum mitgeaendert - dann wird die Kenntnisnahme neu eingeholt.
FASSUNG = "2026-09-06"
# Wo Fehler gemeldet werden. Je Programm eine eigene Adresse.
#
# Das frueher "Beherbergungssteuer" genannte Programm heisst seit dem
# 06.09.2026 STEUERRECHNUNGSTOOL - so wie sein Repository. Der lokale Ordner
# heisst noch beherbergungssteuer: der Pfad steht in mehreren Pruefstaenden und
# in den Spec-Dateien fest, das ist ein eigener Schritt.
ISSUES = {
"rechnungstool": "https://git.pcore.de/TheMockTv/rechnungstool",
"steuerrechnungstool": "https://git.pcore.de/TheMockTv/Steuerrechnungstool",
}
TITEL = "Erprobungsfassung – bitte lesen"
def text(programm):
"""Der Hinweistext. `programm` ist ein Schluessel aus ISSUES."""
url = ISSUES.get(programm, "")
return (
"Diese Software ist eine ERPROBUNGSFASSUNG.\n\n"
"Sie wird noch getestet. Für Belege, die falsch ausgestellt werden, "
"wird keine Haftung übernommen.\n\n"
"Prüfen Sie jeden Beleg selbst, bevor Sie ihn herausgeben oder "
"verbuchen. Nutzen Sie dafür die Vorschau – in diesem Programm und im "
"jeweils anderen. Stimmt etwas nicht, melden Sie es bitte als Fehler "
"unter:\n\n"
f" {url}\n\n"
"Mit „Ja\" bestätigen Sie, dass Sie diesen Hinweis gelesen und zur "
"Kenntnis genommen haben.\n"
"Mit „Nein\" wird das Programm beendet; der Hinweis erscheint beim "
"nächsten Start erneut."
)
def _stand(cfg):
return (str(cfg.get("hinweis_fassung", "") or ""),
str(cfg.get("hinweis_zeit", "") or ""),
str(cfg.get("hinweis_benutzer", "") or ""))
def angenommen(cfg):
"""Hat der Nutzer GENAU DIESE Fassung schon zur Kenntnis genommen?"""
fassung, zeit, benutzer = _stand(cfg)
return fassung == FASSUNG and bool(zeit) and bool(benutzer)
def vermerken(cfg):
"""Die Kenntnisnahme festhalten. Gibt die Signaturzeile zurueck."""
cfg["hinweis_fassung"] = FASSUNG
cfg["hinweis_zeit"] = datetime.datetime.now().isoformat(timespec="seconds")
try:
cfg["hinweis_benutzer"] = getpass.getuser()
except Exception: # noqa: BLE001 - ohne Benutzernamen ist es kein Grund zu scheitern
cfg["hinweis_benutzer"] = "unbekannt"
return signatur(cfg)
def signatur(cfg):
"""Die Zeile fuer den Info-Dialog - oder '' , wenn nichts vorliegt."""
fassung, zeit, benutzer = _stand(cfg)
if not (fassung and zeit and benutzer):
return ""
try:
wann = datetime.datetime.fromisoformat(zeit).strftime("%d.%m.%Y um %H:%M")
except ValueError:
wann = zeit
return (f"Gelesen und zur Kenntnis genommen von {benutzer} "
f"am {wann} (Fassung {fassung}).")