Berichtigen: zweiter Knopf im Storno-Popup, alles haengt an einem Flag
Fuer Rechnungen, bei denen nur die Kundenangaben falsch sind - falsche Betraege bleiben der Storno-Weg. - Kein eigener Dialog: das Storno-Popup hat jetzt zwei Knoepfe. "Nur berichtigen" laedt die Rechnung ins Formular, sperrt die Nummer und setzt ein Flag; "PDF erstellen" schreibt daraus das berichtigte Blatt. - Die Rechnung behaelt Nummer, Datum und Betraege; dazu kommt "Berichtigt am". Der Zaehler bleibt stehen - das Blatt verbraucht keine Nummer. - Ueberschrift "Berichtigte Rechnung", darunter die vollstaendige Rechnung, darunter der Bezug nach § 31 Abs. 5 UStDV und der Satz, dass es KEINE zusaetzliche Leistung und keine zweite Rechnung ist. Ohne den kann ein zweites Blatt mit ausgewiesener USt die Steuer nach § 14c UStG ein zweites Mal ausloesen. - Kenndaten des Blattes tragen Nullen und "art": "berichtigung". Damit zaehlt ein Programm, das die Art nicht kennt, 0,00 € statt den Umsatz doppelt; der Steuerrechner ueberspringt es ganz (einnahmen.py). - Dateiname "Berichtigte Rechnung_JJJJ-MM-TT_<Nummer>.pdf". pruef_storno.py: 100 Pruefungen gruen, darunter der ganze Berichtigungsweg inklusive Text auf dem Blatt und Gegenprobe mit dem Steuerrechner. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EKvGkdNW1vKdnMPAM9Bp3X
This commit is contained in:
parent
abb462725f
commit
d3962ec8d1
3 changed files with 220 additions and 30 deletions
|
|
@ -223,6 +223,11 @@ def _seite_inhalt(story, st, cfg, rechnung, kopf, gesamtrechnung_betont):
|
|||
info_rows.append(("Rechnung vom:", kopf["storno_datum"]))
|
||||
elif art == "korrektur" and kopf.get("ersetzt"):
|
||||
info_rows.append(("Ersetzt Rechnung:", kopf.get("ersetzt", "")))
|
||||
elif art == "berichtigung":
|
||||
# Die Rechnung behaelt Nummer und Datum - dazu kommt der Tag der
|
||||
# Berichtigung, damit man die Reihenfolge sieht.
|
||||
if kopf.get("berichtigt_am"):
|
||||
info_rows.append(("Berichtigt am:", kopf["berichtigt_am"]))
|
||||
if kopf.get("anreise"):
|
||||
info_rows.append(("Anreise:", kopf.get("anreise", "")))
|
||||
if kopf.get("abreise"):
|
||||
|
|
@ -252,7 +257,8 @@ def _seite_inhalt(story, st, cfg, rechnung, kopf, gesamtrechnung_betont):
|
|||
# in der Ueberschrift. Der Zusatz sagt nur noch, fuer wen das Blatt ist.
|
||||
# Das Wort "Stornorechnung" muss auf dem Blatt stehen, damit der Beleg
|
||||
# eindeutig als Aufhebung erkennbar ist.
|
||||
titel = "Stornorechnung" if art == "storno" else "Rechnungsübersicht"
|
||||
titel = {"storno": "Stornorechnung",
|
||||
"berichtigung": "Berichtigte Rechnung"}.get(art, "Rechnungsübersicht")
|
||||
titel += " (für das Amt)" if gesamtrechnung_betont else ""
|
||||
story.append(Paragraph(titel, st["h"]))
|
||||
|
||||
|
|
@ -382,6 +388,19 @@ def _seite_inhalt(story, st, cfg, rechnung, kopf, gesamtrechnung_betont):
|
|||
f"Diese Stornorechnung hebt die Rechnung {bezug} vollständig auf. "
|
||||
"Bereits gezahlte Beträge werden erstattet oder mit der berichtigten "
|
||||
"Rechnung verrechnet.", st["dank"]))
|
||||
elif art == "berichtigung":
|
||||
# Der Satz ist kein Beiwerk: ein zweites Blatt mit ausgewiesener USt,
|
||||
# das nicht klar als Berichtigung erkennbar ist, kann die Steuer ein
|
||||
# zweites Mal ausloesen (§ 14c UStG).
|
||||
block.append(Paragraph(
|
||||
f"Dieses Blatt berichtigt die Angaben zur Rechnung "
|
||||
f"{kopf.get('berichtigt_zu','')} vom {kopf.get('datum','')} nach "
|
||||
"§ 31 Abs. 5 UStDV. Leistungen, Beträge und Umsatzsteuer sind "
|
||||
"unverändert – es handelt sich <b>nicht</b> um eine zusätzliche "
|
||||
"Leistung und nicht um eine zweite Rechnung. Die Rechnung behält "
|
||||
"ihre Nummer.", st["dank"]))
|
||||
if texte.get("dank1"):
|
||||
block.append(Paragraph(texte["dank1"], st["dank"]))
|
||||
else:
|
||||
if art == "korrektur" and kopf.get("ersetzt"):
|
||||
hinweis = f"Diese Rechnung ersetzt die Rechnung {kopf['ersetzt']}"
|
||||
|
|
@ -422,6 +441,22 @@ def _kenndaten(rechnung, kopf):
|
|||
Steuerrechner summieren dadurch von allein richtig (+100 -100 +120 = 120).
|
||||
"""
|
||||
aufschlag = rechnung.aufschlaege[0] if rechnung.aufschlaege else None
|
||||
if kopf.get("art") == "berichtigung":
|
||||
# Das berichtigte Blatt zeigt dieselben Betraege wie die Rechnung, ist aber
|
||||
# KEINE zweite Einnahme. Es traegt deshalb Nullen: ein Programm, das "art"
|
||||
# nicht kennt, zaehlt dann 0,00 € statt den Umsatz ein zweites Mal.
|
||||
return json.dumps({
|
||||
"quelle": "rechnungstool", "version": 3, "art": "berichtigung",
|
||||
"rechnungsnummer": kopf.get("berichtigt_zu", ""),
|
||||
"berichtigt_zu": kopf.get("berichtigt_zu", ""),
|
||||
"berichtigt_am": kopf.get("berichtigt_am", ""),
|
||||
"datum": kopf.get("datum", ""),
|
||||
"nachname": kopf.get("nachname", ""), "vorname": kopf.get("vorname", ""),
|
||||
"zwischensumme": 0.0, "gesamt": 0.0,
|
||||
"steuer_satz": 0.0, "steuer_betrag": 0.0,
|
||||
"netto_gesamt": 0.0, "ust_gesamt": 0.0, "ust_bloecke": [],
|
||||
"kunde": kopf.get("kunde", {}),
|
||||
}, ensure_ascii=False)
|
||||
daten = {
|
||||
"quelle": "rechnungstool",
|
||||
"version": 3,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue