feat: Eine Arbeitsliste, und Kategorien direkt in der Buchungsliste

'Eingang' und 'Offene Buchungen' zeigten fast dasselbe. Seit angebundene Konten
selbst buchen, ist eine Bank-Buchung sofort gebucht und ohne Kategorie – sie
stand damit in BEIDEN Listen. Die Trennung stammte aus der Zeit, als der
Eingang nur Vorschlaege enthielt.

Jetzt eine Seite 'Zu erledigen' mit allem, was noch eine Hand braucht: offene
Vorschlaege zum Buchen oder Uebertragen und Buchungen ohne Kategorie, egal ob
von Bank, Mail, Kurzbefehl oder Datei. Aelteste zuerst, mit der Herkunft in der
Zeile. Erledigtes verschwindet – die Eingangs-Eintraege bleiben in der
Datenbank, weil der spaetere Import gegen sie abgleicht. /offen leitet um.

Das Haekchen 'Schlagwort merken' aus der alten Seite bleibt: Es ist der Grund,
warum der Stapel mit der Zeit kleiner wird, und der Eingang hatte es nie. Der
Uebertrags-Knopf gilt jetzt auch fuer schon gebuchte Buchungen – sonst haette
in einer gemeinsamen Liste die eine Haelfte der Zeilen ihn gehabt und die
andere nicht.

In der Buchungsliste steht die Kategorie jetzt als Auswahl in der Zeile, dort
wo bisher nur ihr Name stand. Vorher musste man jede Buchung einzeln zum
Bearbeiten oeffnen. Die Zeile aendert sich an Ort und Stelle, die
Bildlaufposition bleibt.

Ausserdem tragen API-Antworten jetzt 'Cache-Control: no-store'. Ohne das darf
ein Browser selbst entscheiden, und der Zurueck-Knopf zeigt Salden von vorhin –
bei Geld ist eine veraltete Anzeige schlimmer als eine langsame.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Guido
2026-08-27 10:25:20 +02:00
co-authored by Claude Opus 5
parent 8309f58a67
commit b303c87801
12 changed files with 393 additions and 274 deletions
+14
View File
@@ -161,6 +161,20 @@ if settings.cors_origins.strip():
allow_headers=["*"],
)
@app.middleware("http")
async def keine_zwischenspeicherung(request, call_next):
"""API-Antworten nie zwischenspeichern.
Ohne Cache-Control darf ein Browser selbst entscheiden, und der Zurueck-
Knopf zeigt dann Salden von vorhin. Bei Geld ist eine veraltete Anzeige
schlimmer als eine langsame.
"""
antwort = await call_next(request)
if request.url.path.startswith("/api"):
antwort.headers["Cache-Control"] = "no-store"
return antwort
# --- API -------------------------------------------------------------------
# Die Abhängigkeit hängt am Sammel-Router, nicht an jedem einzelnen Endpunkt:
# Konten mit offener Pflicht (Passwortwechsel, 2FA-Einrichtung) kommen so an
+1
View File
@@ -45,6 +45,7 @@ def to_out(db: Session, txn: Transaction, base: str, ccy_by_account: dict[int, s
category_id=txn.category_id,
budget_treatment=txn.budget_treatment,
budget_category_id=txn.budget_category_id,
import_batch_id=txn.import_batch_id,
payee=txn.payee,
description=txn.description,
notes=txn.notes,
+3
View File
@@ -323,6 +323,9 @@ class TransactionOut(BaseModel):
category_id: int | None
budget_treatment: BudgetTreatment | None
budget_category_id: int | None
# Woher die Buchung stammt, fuer die Arbeitsliste: Ist sie gesetzt,
# kam die Buchung aus einem Datei-Import.
import_batch_id: int | None = None
payee: str | None
description: str | None
notes: str | None