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")