from sqlalchemy import Column, Integer, String, Numeric, DateTime, ForeignKey, Boolean, JSON, Enum as SQLEnum from sqlalchemy.orm import relationship from app.db.base_class import Base from app.models.enums import SplitTypeEnum, ExpenseOverallStatusEnum, ExpenseSplitStatusEnum class RecurrencePattern(Base): __tablename__ = "recurrence_patterns" id = Column(Integer, primary_key=True, index=True) type = Column(String, nullable=False) # 'daily', 'weekly', 'monthly', 'yearly' interval = Column(Integer, nullable=False) days_of_week = Column(JSON, nullable=True) # For weekly recurrence end_date = Column(DateTime, nullable=True) max_occurrences = Column(Integer, nullable=True) created_at = Column(DateTime, nullable=False) updated_at = Column(DateTime, nullable=False) # Relationship expense = relationship("Expense", back_populates="recurrence_pattern", uselist=False) class Expense(Base): __tablename__ = "expenses" # ... existing columns ... # New columns for recurring expenses is_recurring = Column(Boolean, default=False, nullable=False) next_occurrence = Column(DateTime, nullable=True) last_occurrence = Column(DateTime, nullable=True) recurrence_pattern_id = Column(Integer, ForeignKey("recurrence_patterns.id"), nullable=True) # New relationship recurrence_pattern = relationship("RecurrencePattern", back_populates="expense", uselist=False) generated_expenses = relationship("Expense", backref=relationship("parent_expense", remote_side=[id]), foreign_keys="Expense.parent_expense_id") parent_expense_id = Column(Integer, ForeignKey("expenses.id"), nullable=True) # ... rest of existing code ...