
- 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.
39 lines
1.7 KiB
Python
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 ... |