feat: Aufschluesselung zeigt, was der Stichtag ausschliesst

Buchungen bis einschliesslich des Stichtags zaehlen nicht in den Kontostand –
sie stecken schon im Anfangsbestand. In der Liste stehen sie aber, und in den
Auswertungen zaehlen sie mit. Das ist richtig so, war in der Oberflaeche aber
nirgends zu sehen: Der Unterschied zwischen dem, was man sieht, und dem, was
gerechnet wird, liess sich nicht erklaeren.

Ein Konto, dessen Stichtag nach dem Beginn des eingelesenen Auszugs liegt,
zeigt deshalb einen Kontostand, der zu den sichtbaren Buchungen nicht passt –
und niemand kaeme darauf, warum.

Die Rechnung nennt jetzt Stichtag, Anzahl und Summe der ausgeschlossenen
Buchungen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Guido
2026-08-30 13:41:22 +02:00
co-authored by Claude Opus 5
parent 7c0d13cc8a
commit 67a32bdda9
5 changed files with 80 additions and 2 deletions
+31
View File
@@ -269,3 +269,34 @@ def test_saldo_laesst_sich_aufschluesseln(admin):
gegen = admin.get(f"/api/accounts/{b['id']}/aufschluesselung").json()
assert gegen["teile"]["uebertraege_rein"] == {"cents": 30000, "anzahl": 1}
assert gegen["uebertraege"][0]["raus"] is False
def test_aufschluesselung_zeigt_was_der_stichtag_ausschliesst(admin):
"""Buchungen bis zum Stichtag stehen in der Liste, zaehlen aber nicht in
den Kontostand – sie stecken schon im Anfangsbestand. In der Oberflaeche
war das unsichtbar, und der Unterschied zwischen Gesehenem und Gerechnetem
nicht zu erklaeren."""
import secrets
konto = admin.post("/api/accounts", json={
"name": f"Stichtag {secrets.token_hex(3)}", "type": "girokonto",
"currency": "CHF", "opening_balance_cents": 120000,
"opening_date": "2026-08-15"}).json()
# Vor dem Stichtag – steckt schon im Anfangsbestand.
admin.post("/api/transactions", json={
"type": "expense", "date": "2026-08-10", "account_id": konto["id"],
"amount_cents": 150000, "payee": "Alt"})
# Danach – zaehlt.
admin.post("/api/transactions", json={
"type": "expense", "date": "2026-08-20", "account_id": konto["id"],
"amount_cents": 30000, "payee": "Neu"})
teile = admin.get(f"/api/accounts/{konto['id']}/aufschluesselung").json()["teile"]
assert teile["stichtag"] == "2026-08-15"
assert teile["vor_stichtag"] == {"cents": -150000, "anzahl": 1}
assert teile["ausgaben"] == {"cents": 30000, "anzahl": 1}, "nur die nach dem Stichtag"
assert teile["saldo"]["cents"] == 120000 - 30000
# Und die Kontenliste sagt dasselbe.
assert admin.get(f"/api/accounts/{konto['id']}").json()["balance_cents"] == 90000