Amtsbericht beschriftet die Storno-Zeilen

Sein Wort: "musst dann rein schreiben storniert oder so was dran setzen".

Im Bericht fuers Amt stand bisher nur die Rechnungsnummer. Bei einem
Storno sieht das Amt damit eine Stornonummer neben einer voellig anderen
Rechnungsnummer und im Folgemonat eine Minuszeile - ohne einen Hinweis,
was wozu gehoert. Im Fenster gibt es dafuer die Spalte "Art", auf dem
Blatt fehlte sie.

Jetzt steht unter der Nummer in kleiner grauer Schrift dasselbe Wort wie
im Fenster: "storniert", "Storno zu 2026-900", "Neuausstellung". Die
Zuordnung wird ueber ALLE uebergebenen Buchungen bestimmt (das ganze
Jahr), weil der Storno in einem anderen Monat liegen kann als seine
Rechnung - genau der Fall, um den es geht.

An den Summen aendert sich nichts: verrechnet bleibt verrechnet.

pruef_storno_verrechnet prueft die drei Beschriftungen jetzt mit.
Angesehen wurde es auch: Monatsbericht August und September als Bild
gerendert, Zeilen und Summen stimmen (August 9 Naechte/117,00,
September -4/-52,00).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017bEsoFUk16DfnNA7MjY36H
This commit is contained in:
TheMockTv 2026-09-04 01:20:02 +02:00
parent 13fe1d97f9
commit 3a9f1278c8
3 changed files with 30 additions and 3 deletions

Binary file not shown.

View file

@ -23,7 +23,7 @@ from reportlab.lib.styles import ParagraphStyle
from reportlab.pdfbase.pdfmetrics import stringWidth
from reportlab.platypus import SimpleDocTemplate, Table, TableStyle, Paragraph, Spacer
from modell import MONATE, summiere, eur, eur_kurz
from modell import MONATE, summiere, aufgehobene, eur, eur_kurz
log = logging.getLogger("bst.bericht")
@ -198,8 +198,28 @@ def _ort(firma):
# ------------------------------------------------------------- Monat --------
def _art_text(b, weg) -> str:
"""Was in der Rechnungsspalte unter der Nummer steht.
Ohne das steht im Bericht fuers Amt eine Stornonummer neben einer voellig
anderen Rechnungsnummer, und niemand sieht, was zusammengehoert. Sein Wort
dazu am 04.09.2026: *"musst dann rein schreiben storniert oder so was dran
setzen"*. Dieselben Worte wie in der Spalte "Art" im Fenster.
"""
if b.storno_zu:
return f"Storno zu {b.storno_zu}"
if b.id in weg:
return "storniert"
if b.art == "korrektur":
return "Neuausstellung"
return ""
def render_monat(pfad, firma, jahr: int, monat: int, buchungen):
st = _styles()
# Ueber ALLE uebergebenen Buchungen bestimmt (das ganze Jahr): der Storno
# kann in einem anderen Monat liegen als die Rechnung, die er aufhebt.
weg = aufgehobene(buchungen)
# Storno und aufgehobene Rechnung stehen BEIDE im Bericht, jede in ihrem
# Monat und mit ihrem Vorzeichen - so ist die Meldung aus sich heraus
# nachvollziehbar (Entscheidung des Auftraggebers, siehe modell.summiere).
@ -219,7 +239,9 @@ def render_monat(pfad, firma, jahr: int, monat: int, buchungen):
for b in liste:
daten.append([
Paragraph(b.datum.strftime("%d.%m.%Y"), st["zelle_c"]),
Paragraph(b.voll_nummer, st["zelle_c"]),
Paragraph(b.voll_nummer + (f'<br/><font size="6.5" color="#555555">'
f'{_art_text(b, weg)}</font>'
if _art_text(b, weg) else ""), st["zelle_c"]),
Paragraph(b.nachname, st["zelle"]),
Paragraph(str(b.naechte), st["zelle_c"]),
Paragraph(eur_kurz(b.gezahlt), st["zelle_r"]),

View file

@ -140,7 +140,12 @@ text = (PdfReader(pfad).pages[0].extract_text() or "").replace("\n", " ")
pruefe("2026-900" in text and "2026-901" in text,
"Rechnung UND Storno stehen im Bericht - die Meldung erklaert sich selbst")
pruefe("-52,00" in text, "der Storno steht mit seinem Minusbetrag drin")
pruefe("117,00" in text, f"und die Monatssumme ist 117,00 Euro")
pruefe("117,00" in text, "und die Monatssumme ist 117,00 Euro")
# Ohne Beschriftung steht im Bericht eine Stornonummer neben einer voellig
# anderen Rechnungsnummer - sein Wort: "musst dann rein schreiben storniert".
pruefe("storniert" in text, "die aufgehobene Rechnung ist im Bericht als 'storniert' beschriftet")
pruefe("Storno zu 2026-900" in text, "und der Storno nennt die Rechnung, die er aufhebt")
pruefe("Neuausstellung" in text, "die neue Rechnung ist als Neuausstellung beschriftet")
# ---------------------------------------------------------------------------
print("--- Fall 4: das echte Fenster ---")