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:
@@ -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],
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user