from datetime import datetime, timezone from sqlalchemy import Column, Integer, String, Float, ForeignKey, DateTime, Text from sqlalchemy.orm import relationship from .database import Base class Category(Base): __tablename__ = "categories" id = Column(Integer, primary_key=True, index=True) name = Column(String, unique=True, nullable=False) created_at = Column(DateTime, default=lambda: datetime.now(timezone.utc)) piggy_banks = relationship("PiggyBank", back_populates="category") class PiggyBank(Base): __tablename__ = "piggy_banks" id = Column(Integer, primary_key=True, index=True) name = Column(String, nullable=False) target_amount = Column(Float, nullable=False) current_amount = Column(Float, default=0.0, nullable=False) currency = Column(String, default="USD", nullable=False) category_id = Column(Integer, ForeignKey("categories.id"), nullable=True) created_at = Column(DateTime, default=lambda: datetime.now(timezone.utc)) updated_at = Column(DateTime, default=lambda: datetime.now(timezone.utc), onupdate=lambda: datetime.now(timezone.utc)) category = relationship("Category", back_populates="piggy_banks") transactions = relationship("Transaction", back_populates="piggy_bank", cascade="all, delete-orphan") class Transaction(Base): __tablename__ = "transactions" id = Column(Integer, primary_key=True, index=True) piggy_bank_id = Column(Integer, ForeignKey("piggy_banks.id"), nullable=False) amount = Column(Float, nullable=False) description = Column(Text, nullable=True) created_at = Column(DateTime, default=lambda: datetime.now(timezone.utc)) piggy_bank = relationship("PiggyBank", back_populates="transactions")