""" Pension account and holding models for retirement pension asset allocation. """ import enum from datetime import datetime from sqlalchemy import ( Column, Integer, String, Numeric, DateTime, Enum as SQLEnum, ForeignKey, ) from sqlalchemy.orm import relationship from app.core.database import Base class AccountType(str, enum.Enum): DC = "dc" IRP = "irp" PERSONAL = "personal" class AssetRiskType(str, enum.Enum): SAFE = "safe" RISKY = "risky" class PensionAccount(Base): __tablename__ = "pension_accounts" id = Column(Integer, primary_key=True, index=True) user_id = Column(Integer, ForeignKey("users.id"), nullable=False, index=True) account_type = Column(SQLEnum(AccountType), nullable=False, index=True) account_name = Column(String(100), nullable=False) total_amount = Column(Numeric(16, 2), nullable=False, default=0) birth_year = Column(Integer, nullable=False) target_retirement_age = Column(Integer, default=60) created_at = Column(DateTime, default=datetime.utcnow) updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) user = relationship("User", backref="pension_accounts") holdings = relationship("PensionHolding", back_populates="account", cascade="all, delete-orphan") class PensionHolding(Base): __tablename__ = "pension_holdings" id = Column(Integer, primary_key=True, index=True) account_id = Column(Integer, ForeignKey("pension_accounts.id"), nullable=False, index=True) asset_name = Column(String(200), nullable=False) asset_type = Column(SQLEnum(AssetRiskType), nullable=False) amount = Column(Numeric(16, 2), nullable=False, default=0) ratio = Column(Numeric(6, 2), nullable=False, default=0) account = relationship("PensionAccount", back_populates="holdings")