File size: 2,004 Bytes
f91bd05 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | from sqlalchemy import Column, Integer, String, Float, Boolean, DateTime, ForeignKey, Date
from sqlalchemy.orm import relationship
from database import Base
from datetime import datetime, date
class UserProfile(Base):
__tablename__ = "user_profiles"
id = Column(Integer, primary_key=True)
name = Column(String, default="Default")
monthly_income = Column(Float, default=0)
monthly_expenses = Column(Float, default=0)
birth_year = Column(Integer, default=2000)
target_retirement_age = Column(Integer, default=67)
swr = Column(Float, default=0.04) # Safe Withdrawal Rate
expected_return = Column(Float, default=0.07) # 7% nominal
inflation = Column(Float, default=0.02) # 2%
created_at = Column(DateTime, default=datetime.utcnow)
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
class Asset(Base):
__tablename__ = "assets"
id = Column(Integer, primary_key=True)
name = Column(String, nullable=False) # "Depot1 - Vanguard FTSE", "Wohnung Mannheim"
asset_type = Column(String, nullable=False) # depot, immobilie, cash, crypto, pension, other
current_value = Column(Float, default=0)
monthly_contribution = Column(Float, default=0)
expected_return_override = Column(Float, nullable=True) # optional per-asset return
notes = Column(String, default="")
icon = Column(String, default="") # emoji or icon class
created_at = Column(DateTime, default=datetime.utcnow)
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
snapshots = relationship("Snapshot", back_populates="asset", cascade="all, delete-orphan")
class Snapshot(Base):
__tablename__ = "snapshots"
id = Column(Integer, primary_key=True)
asset_id = Column(Integer, ForeignKey("assets.id"), nullable=False)
date = Column(Date, default=date.today)
value = Column(Float, nullable=False)
asset = relationship("Asset", back_populates="snapshots")
|