models.pyā¢3.33 kB
"""
Data models for the Income/Expense Tracker API
"""
from pydantic import BaseModel, Field
from typing import List, Optional
from datetime import datetime
from enum import Enum
class TransactionType(str, Enum):
"""Transaction type enumeration"""
INCOME = "income"
EXPENSE = "expense"
class Category(str, Enum):
"""Predefined categories for transactions"""
# Income categories
SALARY = "salary"
FREELANCE = "freelance"
INVESTMENT = "investment"
BUSINESS = "business"
OTHER_INCOME = "other_income"
# Expense categories
FOOD = "food"
TRANSPORTATION = "transportation"
HOUSING = "housing"
UTILITIES = "utilities"
HEALTHCARE = "healthcare"
ENTERTAINMENT = "entertainment"
SHOPPING = "shopping"
EDUCATION = "education"
TRAVEL = "travel"
OTHER_EXPENSE = "other_expense"
class TransactionBase(BaseModel):
"""Base transaction model"""
title: str = Field(..., min_length=1, max_length=100, description="Transaction title")
amount: float = Field(..., gt=0, description="Transaction amount (positive value)")
type: TransactionType = Field(..., description="Transaction type (income or expense)")
category: Category = Field(..., description="Transaction category")
description: Optional[str] = Field(None, max_length=500, description="Additional description")
tags: List[str] = Field(default_factory=list, description="Transaction tags")
date: datetime = Field(default_factory=datetime.now, description="Transaction date")
class TransactionCreate(TransactionBase):
"""Model for creating a new transaction"""
pass
class TransactionUpdate(BaseModel):
"""Model for updating a transaction (all fields optional)"""
title: Optional[str] = Field(None, min_length=1, max_length=100)
amount: Optional[float] = Field(None, gt=0)
type: Optional[TransactionType] = None
category: Optional[Category] = None
description: Optional[str] = Field(None, max_length=500)
tags: Optional[List[str]] = None
date: Optional[datetime] = None
class Transaction(TransactionBase):
"""Complete transaction model with metadata"""
id: str = Field(..., description="Unique transaction identifier")
created_at: datetime = Field(..., description="Creation timestamp")
updated_at: datetime = Field(..., description="Last update timestamp")
class TransactionSummary(BaseModel):
"""Summary statistics for transactions"""
total_income: float = Field(..., description="Total income amount")
total_expenses: float = Field(..., description="Total expenses amount")
net_balance: float = Field(..., description="Net balance (income - expenses)")
transaction_count: int = Field(..., description="Total number of transactions")
income_count: int = Field(..., description="Number of income transactions")
expense_count: int = Field(..., description="Number of expense transactions")
class CategorySummary(BaseModel):
"""Summary by category"""
category: str = Field(..., description="Category name")
total_amount: float = Field(..., description="Total amount for this category")
transaction_count: int = Field(..., description="Number of transactions in this category")
percentage: float = Field(..., description="Percentage of total amount")