Das zweite Blatt "fuer das Amt" trug DIESELBE Rechnungsnummer, aber einen anderen Gesamtbetrag. Mehrere Blaetter zum selben Umsatz mit verschiedenen Endbetraegen sehen aus, als werde ueber verschiedene Umsaetze abgerechnet - bei einer Pruefung ein Problem. Ersatzlos entfallen; was die Stadt braucht, rechnet das Steuerjournal aus den Kenndaten der PDF. Mit dem Blatt fielen _AmtMarke, gesamtrechnung_betont und der doppelte Renderlauf weg. Die API kann das Fenster jetzt BEDIENEN - mit Schluessel wie bei einem SSH-Key: 32 Byte Zufall in api_schluessel.txt im gemeinsamen Ordner, den nur das Steuerjournal und der Betreiber lesen. Ohne gueltigen Schluessel kein Zutritt (compare_digest). ping und schau_nach bleiben schluessellos, sonst kann ein aelteres Journal nicht mehr anklopfen. Was einen BELEG schreibt, geht nur im Testlauf - eine Fernbedienung, die echte Rechnungen ausstellt, hat in einer Buchhaltung nichts zu suchen. api.py liegt wie immer in beiden Programmen. Der Erststart fragte nach "der zuletzt vergebenen Nummer" - das holt niemanden ab, der bei 0 anfaengt. Jetzt zwei Wege: bei 0 anfangen ODER die eigene Zaehlung weiterfuehren. Unter das schon Vergebene kommt keiner der beiden. pruef_nummernsperre bediente den Dialog nur halb: nach einer abgelehnten Zahl bleibt er offen (so soll er), niemand drueckte "Spaeter" - das Programm wartete in wait_window() ewig. Das war schon vor diesem Umbau so. Neu: pruef_api.py. Alle 14 Pruefstaende gruen. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V4t48uxDok5rJXhC9bX1Ax
107 lines
5.5 KiB
Markdown
107 lines
5.5 KiB
Markdown
# Rechnungstool: rechtssicher, gestaltbar, mit Vorschau
|
||
|
||
**Stand 05.09.2026 — in Arbeit.** Programm `C:\claude\rechnungstool`,
|
||
Repo `git.pcore.de/TheMockTv/rechnungstool` (Pre-Tag `pre/rechtssicher-bilder`).
|
||
|
||
Seine Ansage: *„wir bauen den rechnungs ersteller so um das der nun richtig
|
||
rechtlich sicher ist und die kopf und fuss zeile mit eigenen bildern import"* —
|
||
und im Lauf des Umbaus dazu: *„das die firmen das designen können"*,
|
||
*„eine vorschau butten wäre gut … sonst haben die den storno auf wand"*,
|
||
*„das mit rechnung an das amt kommt raus, das ist nicht § conform"*.
|
||
|
||
## 1. Bilder und Farbe gehören der Firma (fertig)
|
||
|
||
Bis jetzt war das Blatt auf EINEN Betrieb gebaut: Camping-Grün fest im Code,
|
||
das Logo ein Pfad in der config.
|
||
|
||
- **`bilder.py`** (neu): ein gewähltes Bild wird in den Ordner `bilder/` neben
|
||
die `config.json` **kopiert**, gemerkt wird nur `bilder/logo.png`.
|
||
Der Grund: ein Pfad auf den Desktop ist tot, sobald dort jemand aufräumt —
|
||
und das fällt erst beim Drucken auf. Gleicher Name, anderes Bild → `-2`,
|
||
nie überschreiben.
|
||
- **Kopfbild** (Logo, oben links) und **Fußbild** (schmaler Streifen unten)
|
||
sind austauschbar. Das Layout bleibt, wie es war.
|
||
- **Firmenname, Anschrift, Bank, Steuernummer bleiben gezeichnet.** Kein Bild
|
||
kann sie ersetzen — die Steuernummer ist Pflichtangabe
|
||
(§ 14 Abs. 4 Nr. 2 UStG), und was in einem Bild steht, kann niemand prüfen.
|
||
(Ein Haken „Angaben stehen im Bild" war gebaut und ist auf seine Ansage hin
|
||
wieder rausgeflogen.)
|
||
- **Farbe der Rechnung**: EIN Wert (`design.akzent`), Hex-Feld **und**
|
||
Farbwähler in den Einstellungen. Die helle Fläche im Tabellenkopf wird daraus
|
||
gemischt — niemand muss zwei Farben aufeinander abstimmen. Eine unlesbare
|
||
Farbe fällt still auf die Vorgabe zurück, statt das Schreiben der Rechnung zu
|
||
verhindern.
|
||
|
||
Prüfstand: **`pruef_bilder.py`**.
|
||
|
||
## 2. Vorschau-Knopf (fertig)
|
||
|
||
Seine Begründung: *„sonst haben die den storno auf wand"* — eine ausgestellte
|
||
Rechnung lässt sich nur noch über Storno oder Berichtigung geradeziehen.
|
||
|
||
Der Knopf zeigt das fertige Blatt, **bevor** es eine Rechnung wird:
|
||
|
||
- verbraucht **keine** Rechnungsnummer, trägt nichts ins Nummernbuch,
|
||
- landet **nicht** im Rechnungsordner (Temp-Ordner),
|
||
- trägt quer über jeder Seite **„VORSCHAU – keine Rechnung"**,
|
||
- prüft **keine** Pflichtfelder — man will ja gerade sehen, was noch fehlt.
|
||
|
||
Prüfstand: **`pruef_vorschau.py`** (u. a.: die echte Rechnung danach trägt die
|
||
Marke NICHT).
|
||
|
||
## 3. Das Blatt „für das Amt" ist entfallen
|
||
|
||
Bis 05.09.2026 hing an jeder Rechnung mit Beherbergungssteuer ein zweites Blatt
|
||
mit **derselben Rechnungsnummer**, aber ohne die Steuer — also mit einem
|
||
**anderen Gesamtbetrag**.
|
||
|
||
Seine Ansage: *„das mit rechnung an das amt kommt raus … wenn so was in den
|
||
büchern von einem unternehmen drin ist, dann ist das ein genickbruch, wenn der
|
||
prüfer kommt"*. Vorgeschichte: Bartl wollte es so, weil es sonst seine
|
||
Steuerberaterin durcheinanderbringe; der Widerspruch stand schon damals.
|
||
|
||
Nachgeschlagen: mehrere Blätter zum selben Umsatz mit **gleicher** Nummer sind
|
||
für sich noch kein § 14c-Fall — aber unterschiedliche Endbeträge erwecken den
|
||
Eindruck, es werde über **verschiedene Umsätze** abgerechnet. Genau das fällt
|
||
bei einer Prüfung auf.
|
||
|
||
**Was an die Stelle tritt:** nichts im Rechnungstool. Das Steuerjournal liest
|
||
die Kenndaten (`/Subject`) der PDF und rechnet die Bemessungsgrundlage selbst
|
||
aus; ans Amt geht eine **Summenanmeldung**, keine Rechnungskopie mit Gastnamen.
|
||
Vorher geprüft: kein Programm liest die zweite Seite — `pruef_montage.py`
|
||
belegt weiter, dass das Journal die Datei einliest.
|
||
|
||
Mit dem Blatt entfielen: `_AmtMarke`, der Parameter `gesamtrechnung_betont` und
|
||
der doppelte Renderlauf (der existierte nur, um zu wissen, auf welcher Seite das
|
||
Amt-Blatt beginnt). Der Renderer ist dadurch deutlich kürzer.
|
||
|
||
## 4. Prüfstände nehmen keine Maus mehr
|
||
|
||
Sein Fund mitten im Lauf: *„pack doch die maus nicht immer auf das programm,
|
||
weil ich kann dir sonst nichts schreiben"*.
|
||
|
||
- `config.TESTLAUF` steht an **einer** Stelle (`--test` / `CAMPINGHOF_TEST=1`).
|
||
- Hauptfenster und **jeder** Dialog werden im Prüflauf durchsichtig gemacht und
|
||
aus dem Bild geschoben, und `grab_set` fällt weg.
|
||
- ⚠️ **Nicht `withdraw()`**: damit baut ein Fenster seine Dialoge nicht mehr
|
||
richtig auf — vier Prüfstände wurden davon rot und hätten eine Bedienung
|
||
geprüft, die es so nicht gibt.
|
||
- **`pruefsteuerung.py`** (neu): Meldungen wandern ins Protokoll, Ja/Nein-Fragen
|
||
in einen Fahrplan (`antwortet("Hausnummer", True)`). Eine **unangemeldete**
|
||
Frage bricht den Lauf ab — stillschweigend „ja" zu sagen würde genau die Fälle
|
||
übergehen, wegen denen es die Prüfung gibt.
|
||
|
||
## Offen
|
||
|
||
- **Betriebsart abfragen** (Campingplatz / Handwerker / Unternehmen) — sein
|
||
Zielbau: *„nicht jeder braucht das so wie der camping typ"*. Handwerker und
|
||
Unternehmen brauchen **freie Rechnungszeilen** statt des festen Katalogs; das
|
||
ist ein neuer Eingabemodus, kein Schalter.
|
||
- **§ 14-Lücke Leistungszeitpunkt**: ohne An-/Abreise (z. B. nur Gasfüllung)
|
||
steht heute kein Leistungsdatum auf dem Blatt — § 14 Abs. 4 Nr. 6 UStG.
|
||
- **Zahlungsziel** einstellbar.
|
||
- **E-Rechnung (ZUGFeRD)**: Pflicht ab 01.01.2028 für B2B — trifft die
|
||
Montage-Rechnung. Bibliothek `factur-x` ist geprüft und kann XML erzeugen
|
||
(Profil EN 16931), prüfen (XSD + Schematron) und einbetten (PDF/A-3).
|
||
- **GoBD**: PDFs nach dem Schreiben schreibgeschützt; Aufbewahrung seit BEG IV
|
||
8 statt 10 Jahre (§ 147 Abs. 3 AO).
|