| from pydantic import BaseModel, Field | |
| from typing import Optional | |
| from datetime import datetime | |
| from enum import Enum | |
| class ExpenseType(str, Enum): | |
| INCOME = "income" | |
| EXPENSE = "expense" | |
| class Expense(BaseModel): | |
| user_id: str | |
| amount: float = Field(..., gt=0, description="Expense amount") | |
| category: str = Field(..., description="Expense category (e.g., Groceries, Transport)") | |
| description: Optional[str] = None | |
| date: datetime | |
| type: ExpenseType = ExpenseType.EXPENSE | |
| class Budget(BaseModel): | |
| user_id: str | |
| category: str | |
| amount: float = Field(..., gt=0, description="Budget amount") | |
| period: str = Field(..., description="Budget period: daily, weekly, monthly, yearly") | |
| start_date: datetime | |
| end_date: Optional[datetime] = None | |
| class BudgetRecommendation(BaseModel): | |
| category: str | |
| average_expense: float | |
| recommended_budget: float | |
| reason: str | |
| confidence: float = Field(..., ge=0, le=1, description="Confidence score (0-1)") | |
| action: Optional[str] = Field( | |
| None, | |
| description="AI suggestion: increase, decrease, or keep" | |
| ) | |
| class CategoryExpense(BaseModel): | |
| category: str | |
| average_monthly_expense: float | |
| total_expenses: int | |
| months_analyzed: int | |