feat: Geld, an das man nicht herankommt, zaehlt nicht mehr als verfuegbar

Eine Saeule 3a ist gesperrt – bis zur Rente, zur Selbstaendigkeit oder
zur Auswanderung. Bisher zaehlte ihr Stand in dieselbe Summe wie das
Girokonto, und die Antwort auf "wie viel habe ich" war um genau diesen
Betrag zu hoch. Das Geld steht da und ist doch nicht da.

Konten lassen sich jetzt als gebunden kennzeichnen. "Gesamt" zeigt dann
nur noch, was wirklich ausgegeben werden kann; darunter steht
"zusaetzlich CHF 2'004.61 gebunden" – aufklappbar, mit jedem Konto
einzeln. Eine Summe, die man nicht nachrechnen kann, muss man glauben.

Verschwiegen wird nichts: Der Saldo bleibt am Konto stehen, und
Vermoegensverlauf wie Nettovermoegen rechnen weiter damit. Es nicht
ausgeben zu koennen heisst nicht, es nicht zu besitzen – das ist der
ganze Unterschied, und ein Test haelt ihn fest.

Ein eigenes Kennzeichen, keine Ableitung aus dem Kontotyp: Ein frei
verkaeufliches Depot und eine gesperrte Saeule 3a kommen beide als
"depot" herein. Am Typ laesst sich das nicht ablesen – am
ausdruecklichen Eintrag schon.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-10-01 20:29:34 +02:00
co-authored by Claude Opus 5
parent 35c5d2c84a
commit 76dbd3b481
11 changed files with 272 additions and 5 deletions
+4
View File
@@ -164,6 +164,8 @@ class AccountCreate(BaseModel):
opening_date: date_t | None = None
# Was die Karte ausgeben darf – kein Guthaben. Nur bei Kreditkarten sinnvoll.
credit_limit_cents: int | None = Field(default=None, ge=0)
# Gesperrtes Geld (z. B. Saeule 3a): zaehlt nicht als verfuegbar.
is_locked: bool = False
# Ueberweisungen hierher zaehlen als Sparen gegen diese Ausgabe-Kategorie.
savings_category_id: int | None = None
identifiers: list[AccountIdentifierIn] = Field(default_factory=list)
@@ -189,6 +191,7 @@ class AccountUpdate(BaseModel):
opening_balance_cents: int | None = None
opening_date: date_t | None = None
credit_limit_cents: int | None = Field(default=None, ge=0)
is_locked: bool | None = None
is_archived: bool | None = None
position: int | None = None
savings_category_id: int | None = None
@@ -211,6 +214,7 @@ class AccountOut(BaseModel):
opening_balance_cents: int
opening_date: date_t | None
credit_limit_cents: int | None = None
is_locked: bool = False
is_archived: bool
position: int
savings_category_id: int | None = None