Wer auf ein Pocket spart, budgetiert dafuer eine Ausgabe – im Budget stand
davon aber nichts. Zwei Gruende:
Erstens gibt es zwei Formen von Uebertrag. Die eine ist EINE Buchung mit
Zielkonto, wie sie das Formular anlegt; nur fuer die gab es die Sparen-Logik.
Die andere sind ZWEI verknuepfte Buchungen, und genau so kommt ein Uebertrag
ueber die Bankanbindung herein. Beide Seiten uebersprang die Auswertung
ausnahmslos.
Zweitens hing das Sparen am Kontotyp. Ein Revolut-Pocket ist bei der Bank ein
ganz normales Konto und kommt als "girokonto" herein – am Typ ist nicht
abzulesen, dass man darauf spart.
Jetzt sagt man es dem Konto einmal ("Sparen gegen Kategorie X"), und es gilt
fuer beide Formen. Wer eine einzelne Bewegung anders sieht, nimmt sie an der
Buchung heraus oder gibt ihr eine eigene Kategorie – dieselben zwei Felder wie
bisher.
Der Normalfall aendert sich nicht: Ein Uebertrag auf ein Konto ohne Sparziel
ist weiterhin bloss verschobenes Geld.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
41 lines
1.4 KiB
Python
41 lines
1.4 KiB
Python
"""Ein Konto kann sagen, dass Ueberweisungen darauf Sparen sind.
|
||
|
||
Bisher entschied das allein der Kontotyp (sparkonto/depot), und auch nur fuer
|
||
Uebertraege, die als EINE Buchung mit Zielkonto vorliegen. Ein Revolut-Pocket
|
||
faellt durch beide Raster: Es kommt ueber die Bank als ganz normales Konto
|
||
herein, und sein Uebertrag besteht aus ZWEI verknuepften Buchungen. Gespart
|
||
wurde trotzdem – im Budget stand davon nichts.
|
||
|
||
Mit dieser Spalte sagt man es dem Konto einmal, und es gilt fuer beide Formen.
|
||
|
||
Revision ID: 0028
|
||
Revises: 0027
|
||
"""
|
||
|
||
import sqlalchemy as sa
|
||
from alembic import op
|
||
|
||
revision = "0028"
|
||
down_revision = "0027"
|
||
branch_labels = None
|
||
depends_on = None
|
||
|
||
|
||
def upgrade() -> None:
|
||
# Der Tabellen-Umbau ist hier sicher: migrations/env.py schaltet die
|
||
# Fremdschluessel fuer die Dauer der Migration ab, sonst risse das
|
||
# implizite DELETE beim DROP die Kontomerkmale, Buchungen und
|
||
# Eingangs-Eintraege mit. Siehe tests/test_migrations.py.
|
||
with op.batch_alter_table("accounts") as batch:
|
||
batch.add_column(sa.Column("savings_category_id", sa.Integer(), nullable=True))
|
||
batch.create_foreign_key(
|
||
"fk_accounts_savings_category", "categories",
|
||
["savings_category_id"], ["id"], ondelete="SET NULL",
|
||
)
|
||
|
||
|
||
def downgrade() -> None:
|
||
with op.batch_alter_table("accounts") as batch:
|
||
batch.drop_constraint("fk_accounts_savings_category", type_="foreignkey")
|
||
batch.drop_column("savings_category_id")
|