fix: Die Budget-Vorlage nennt wieder Betriebsart und Zuschlag

GET /api/budget/template gab je Zeile nur planned_cents heraus, obwohl das
Modell modus und zuschlag_cents fuehrt und PUT sie zurueckgibt. Wer die
Vorlage so liest, haelt eine berechnete Zeile fuer eine feste - und schreibt
sie beim naechsten Speichern auch als feste zurueck.

Die Weboberflaeche traf es nicht, weil sie die Betriebsart aus der
Monatsansicht nimmt. Die iOS-App bietet beide Richtungen an und haette den
Fehler sichtbar gemacht.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Guido
2026-10-21 20:10:21 +02:00
co-authored by Claude Opus 5
parent 1649c84f6a
commit 82edc29dfe
2 changed files with 43 additions and 1 deletions
+13 -1
View File
@@ -46,7 +46,19 @@ def get_template(db: Session = Depends(get_db), user: User = Depends(get_current
.all() .all()
) )
return { return {
"lines": [{"category_id": ln.category_id, "planned_cents": ln.planned_cents} for ln in lines], # Betriebsart und Zuschlag gehören dazu: PUT gibt sie zurück und die
# Monatsansicht liefert sie ohnehin. Ohne sie zeigt ein Client eine
# berechnete Zeile als feste an und schreibt sie beim nächsten
# Speichern auch als feste zurück.
"lines": [
{
"category_id": ln.category_id,
"planned_cents": ln.planned_cents,
"modus": ln.modus,
"zuschlag_cents": ln.zuschlag_cents,
}
for ln in lines
],
"income": [PlannedIncomeOut.model_validate(i).model_dump() for i in income], "income": [PlannedIncomeOut.model_validate(i).model_dump() for i in income],
} }
+30
View File
@@ -369,3 +369,33 @@ def test_aufstellung_zeigt_eine_verschobene_buchung_im_neuen_monat(admin):
assert not any(r["id"] == tx["id"] for r in auf["rows"]) assert not any(r["id"] == tx["id"] for r in auf["rows"])
karte2 = admin.get("/api/dashboard/expense-share?group_by=category").json() karte2 = admin.get("/api/dashboard/expense-share?group_by=category").json()
assert auf["total"] == next(r for r in karte2["rows"] if r["name"] == "Lebensmittel")["amount"] assert auf["total"] == next(r for r in karte2["rows"] if r["name"] == "Lebensmittel")["amount"]
def test_vorlage_nennt_betriebsart_und_zuschlag(admin):
"""Die Vorlage gab bisher nur planned_cents heraus.
Wer sie so liest, haelt eine berechnete Zeile fuer eine feste - und
schreibt sie beim naechsten Speichern auch als feste zurueck. PUT und die
Monatsansicht nennen beide Felder laengst; hier fehlten sie schlicht.
Eine eigene Kategorie statt Lebensmittel: Die Testdatenbank lebt ueber den
ganzen Lauf, und eine Vorlagenzeile auf "berechnet" umzustellen wuerde die
Nachbartests treffen.
"""
import secrets
gruppe = next(g for g in admin.get("/api/categories").json()
if g["kind"] == "expense")
kat = admin.post("/api/categories", json={
"group_id": gruppe["id"], "name": f"Vorlagenart {secrets.token_hex(3)}"}).json()
r = admin.put(f"/api/budget/template/category/{kat['id']}",
params={"planned_cents": 12000, "modus": "berechnet",
"zuschlag_cents": 2500})
assert r.status_code == 200, r.text
zeile = next(l for l in admin.get("/api/budget/template").json()["lines"]
if l["category_id"] == kat["id"])
assert zeile["planned_cents"] == 12000
assert zeile["modus"] == "berechnet"
assert zeile["zuschlag_cents"] == 2500