from datetime import datetime from decimal import Decimal from sqlalchemy import String, Boolean, Text, Numeric, ForeignKey, DateTime, func from sqlalchemy.orm import Mapped, mapped_column, relationship from app.database import Base class AccountType(Base): __tablename__ = "account_types" id: Mapped[int] = mapped_column(primary_key=True) name: Mapped[str] = mapped_column(String(100), unique=True, nullable=False) icon: Mapped[str | None] = mapped_column(String(50)) description: Mapped[str | None] = mapped_column(Text) accounts: Mapped[list["Account"]] = relationship("Account", back_populates="account_type") class Account(Base): __tablename__ = "accounts" id: Mapped[int] = mapped_column(primary_key=True) user_id: Mapped[int] = mapped_column(ForeignKey("users.id"), nullable=False, index=True) name: Mapped[str] = mapped_column(String(200), nullable=False) account_type_id: Mapped[int] = mapped_column(ForeignKey("account_types.id"), nullable=False) currency_id: Mapped[int] = mapped_column(ForeignKey("currencies.id"), nullable=False) balance: Mapped[Decimal] = mapped_column(Numeric(20, 2), default=0, nullable=False) initial_balance: Mapped[Decimal] = mapped_column(Numeric(20, 2), default=0, nullable=False) is_active: Mapped[bool] = mapped_column(Boolean, default=True, nullable=False) credit_limit: Mapped[Decimal | None] = mapped_column(Numeric(20, 2)) description: Mapped[str | None] = mapped_column(Text) icon: Mapped[str | None] = mapped_column(String(50)) color: Mapped[str | None] = mapped_column(String(7)) # hex #RRGGBB created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) updated_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), server_default=func.now(), onupdate=func.now() ) user: Mapped["User"] = relationship("User", back_populates="accounts") account_type: Mapped["AccountType"] = relationship("AccountType", back_populates="accounts") currency: Mapped["Currency"] = relationship("Currency", back_populates="accounts") operations: Mapped[list] = relationship("Operation", back_populates="account")