import uuid from datetime import date, datetime from decimal import Decimal from typing import Optional from pydantic import BaseModel, ConfigDict, Field class FinanceCreate(BaseModel): site_id: Optional[uuid.UUID] = None subject_id: Optional[uuid.UUID] = None visit_id: Optional[uuid.UUID] = None category: str title: str description: Optional[str] = None currency: str = "CNY" amount: Decimal = Field(gt=0) occur_date: date class FinanceUpdate(BaseModel): site_id: Optional[uuid.UUID] = None subject_id: Optional[uuid.UUID] = None visit_id: Optional[uuid.UUID] = None category: Optional[str] = None title: Optional[str] = None description: Optional[str] = None currency: Optional[str] = None amount: Optional[Decimal] = Field(default=None, gt=0) occur_date: Optional[date] = None class FinanceStatusUpdate(BaseModel): status: str reject_reason: Optional[str] = None class FinanceRead(BaseModel): id: uuid.UUID study_id: uuid.UUID site_id: Optional[uuid.UUID] subject_id: Optional[uuid.UUID] visit_id: Optional[uuid.UUID] category: str title: str description: Optional[str] currency: str amount: Decimal occur_date: date status: str submitted_at: Optional[datetime] approved_at: Optional[datetime] rejected_at: Optional[datetime] paid_at: Optional[datetime] approver_id: Optional[uuid.UUID] payer_id: Optional[uuid.UUID] reject_reason: Optional[str] created_by: uuid.UUID created_at: datetime updated_at: datetime month: Optional[str] = None model_config = ConfigDict(from_attributes=True) class FinanceSummaryRead(BaseModel): total_amount: Decimal paid_amount: Decimal approved_amount: Decimal submitted_amount: Decimal count_total: int count_paid: int