Spaces:
Running
Running
| from sqlalchemy import ( | |
| Column, String, Boolean, DateTime, Integer, | |
| Float, Text, Date, Index | |
| ) | |
| from sqlalchemy.sql import func | |
| from .base import Base | |
| class UserGoal(Base): | |
| __tablename__ = "user_goals" | |
| id = Column(Integer, primary_key=True) | |
| goal_id = Column(String(36), unique=True, nullable=False, index=True) | |
| user_hash = Column(String(64), nullable=False, index=True) | |
| name = Column(String(200), nullable=False) | |
| goal_type = Column(String(30)) | |
| # savings | debt_payoff | investment | expense | emergency_fund | |
| target_amount = Column(Float, nullable=False) | |
| current_amount = Column(Float, default=0) | |
| target_date = Column(Date, nullable=True) | |
| monthly_contribution = Column(Float) | |
| status = Column(String(20), default="active") | |
| priority = Column(Integer, default=1) | |
| # 1=low, 2=medium, 3=high | |
| notes = Column(Text) | |
| linked_project_id = Column(String(36), nullable=True) | |
| created_at = Column(DateTime, server_default=func.now()) | |
| updated_at = Column(DateTime, onupdate=func.now()) | |
| completed_at = Column(DateTime, nullable=True) | |
| __table_args__ = ( | |
| Index("ix_goals_user", "user_hash"), | |
| Index("ix_goals_status", "status"), | |
| ) | |
| class RecurringBill(Base): | |
| __tablename__ = "recurring_bills" | |
| id = Column(Integer, primary_key=True) | |
| bill_id = Column(String(36), unique=True, nullable=False, index=True) | |
| user_hash = Column(String(64), nullable=False, index=True) | |
| name = Column(String(200), nullable=False) | |
| amount = Column(Float, nullable=False) | |
| currency = Column(String(5), default="KES") | |
| frequency = Column(String(20), default="monthly") | |
| # monthly | weekly | quarterly | annual | |
| day_of_month = Column(Integer) | |
| # 1-31, which day to pay | |
| category = Column(String(50)) | |
| # rent | utilities | insurance | loan | subscription | other | |
| is_active = Column(Boolean, default=True) | |
| last_paid_date = Column(Date, nullable=True) | |
| next_due_date = Column(Date, nullable=True) | |
| created_at = Column(DateTime, server_default=func.now()) | |
| __table_args__ = ( | |
| Index("ix_bills_user", "user_hash"), | |
| Index("ix_bills_next_due", "next_due_date"), | |
| ) | |
| class DebtRecord(Base): | |
| __tablename__ = "debt_records" | |
| id = Column(Integer, primary_key=True) | |
| debt_id = Column(String(36), unique=True, nullable=False, index=True) | |
| user_hash = Column(String(64), nullable=False, index=True) | |
| name = Column(String(200), nullable=False) | |
| # "Fuliza" | "SACCO Loan" | "Bank Loan" | |
| debt_type = Column(String(30)) | |
| # mobile_loan | sacco | bank | hire_purchase | personal | other | |
| original_amount = Column(Float) | |
| current_balance = Column(Float, nullable=False) | |
| interest_rate_annual = Column(Float) | |
| monthly_payment = Column(Float) | |
| # For payoff planning | |
| payoff_strategy = Column(String(20), default="minimum") | |
| # minimum | avalanche | snowball | |
| start_date = Column(Date) | |
| expected_payoff_date = Column(Date, nullable=True) | |
| is_active = Column(Boolean, default=True) | |
| created_at = Column(DateTime, server_default=func.now()) | |
| updated_at = Column(DateTime, onupdate=func.now()) | |
| __table_args__ = ( | |
| Index("ix_debts_user", "user_hash"), | |
| Index("ix_debts_active", "is_active"), | |
| ) | |