import uuid from datetime import date, datetime from pydantic import BaseModel, field_validator from app.models.transaction import TransactionType from app.schemas.common import PaginatedResponse class CategoryBrief(BaseModel): id: uuid.UUID name: str color: str | None model_config = {"from_attributes": True} class TransactionCreate(BaseModel): amount_cents: int type: TransactionType category_id: uuid.UUID description: str | None = None transaction_date: date @field_validator("amount_cents") @classmethod def amount_must_be_positive(cls, v: int) -> int: if v <= 0: raise ValueError("amount_cents must be greater than 0") return v class TransactionUpdate(BaseModel): amount_cents: int | None = None type: TransactionType | None = None category_id: uuid.UUID | None = None description: str | None = None transaction_date: date | None = None @field_validator("amount_cents") @classmethod def amount_must_be_positive(cls, v: int | None) -> int | None: if v is not None and v <= 0: raise ValueError("amount_cents must be greater than 0") return v class TransactionResponse(BaseModel): id: uuid.UUID amount_cents: int type: TransactionType description: str | None category: CategoryBrief transaction_date: date created_at: datetime model_config = {"from_attributes": True} PaginatedTransactions = PaginatedResponse[TransactionResponse]