import uuid from datetime import date, datetime from decimal import Decimal from typing import Optional from pydantic import BaseModel, ConfigDict, Field class SpecialExpenseCreate(BaseModel): project_id: uuid.UUID center_id: Optional[uuid.UUID] = None category: str amount: Decimal = Field(ge=0) happen_date: Optional[date] = None description: Optional[str] = None is_paid: bool = False paid_date: Optional[date] = None is_verified: bool = False verified_date: Optional[date] = None class SpecialExpenseUpdate(BaseModel): center_id: Optional[uuid.UUID] = None category: Optional[str] = None amount: Optional[Decimal] = Field(default=None, ge=0) happen_date: Optional[date] = None description: Optional[str] = None is_paid: Optional[bool] = None paid_date: Optional[date] = None is_verified: Optional[bool] = None verified_date: Optional[date] = None class SpecialExpenseRead(BaseModel): id: uuid.UUID project_id: uuid.UUID center_id: Optional[uuid.UUID] category: str amount: Decimal happen_date: Optional[date] description: Optional[str] is_paid: bool paid_date: Optional[date] is_verified: bool verified_date: Optional[date] created_by: Optional[uuid.UUID] created_at: datetime updated_at: datetime model_config = ConfigDict(from_attributes=True) class SpecialExpenseListItem(SpecialExpenseRead): center_name: Optional[str] attachments_count: int