mitlist/be/app/models/expense.py
Mohamad.Elsena 5018ce02f7 feat: Implement recurring expenses feature with scheduling and management
- Added support for recurring expenses, allowing users to define recurrence patterns (daily, weekly, monthly, yearly) for expenses.
- Introduced `RecurrencePattern` model to manage recurrence details and linked it to the `Expense` model.
- Implemented background job scheduling using APScheduler to automatically generate new expenses based on defined patterns.
- Updated expense creation logic to handle recurring expenses, including validation and database interactions.
- Enhanced frontend components to allow users to create and manage recurring expenses through forms and lists.
- Updated documentation to reflect new features and usage guidelines for recurring expenses.
2025-05-22 16:37:14 +02:00

39 lines
1.7 KiB
Python

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 ...