import uuid from datetime import date, datetime from decimal import Decimal from typing import Optional from pydantic import BaseModel, ConfigDict, Field from app.schemas.attachment import AttachmentRead from app.schemas.contract_fee_payment import ContractFeePaymentRead class ContractFeeCreate(BaseModel): study_id: uuid.UUID center_id: uuid.UUID contract_no: Optional[str] = None signed_date: Optional[date] = None contract_amount: Decimal = Field(ge=0) currency: str = "CNY" remark: Optional[str] = None contract_cases: int = Field(ge=0) actual_cases: Optional[int] = Field(default=None, ge=0) settlement_amount: Optional[Decimal] = Field(default=None, ge=0) final_payment_amount: Optional[Decimal] = Field(default=None, ge=0) class ContractFeeUpdate(BaseModel): contract_no: Optional[str] = None signed_date: Optional[date] = None contract_amount: Optional[Decimal] = Field(default=None, ge=0) currency: Optional[str] = None remark: Optional[str] = None contract_cases: Optional[int] = Field(default=None, ge=0) actual_cases: Optional[int] = Field(default=None, ge=0) settlement_amount: Optional[Decimal] = Field(default=None, ge=0) final_payment_amount: Optional[Decimal] = Field(default=None, ge=0) class ContractFeeRead(BaseModel): id: uuid.UUID study_id: uuid.UUID center_id: uuid.UUID contract_no: Optional[str] signed_date: Optional[date] contract_amount: Decimal currency: str remark: Optional[str] contract_cases: int actual_cases: Optional[int] settlement_amount: Optional[Decimal] final_payment_amount: Optional[Decimal] created_at: datetime updated_at: datetime model_config = ConfigDict(from_attributes=True) class ContractFeeListItem(ContractFeeRead): center_name: str paid_total: Decimal verified_total: Decimal unpaid_balance: Decimal unverified_balance: Decimal last_paid_date: Optional[date] last_verified_date: Optional[date] class ContractFeeDetail(ContractFeeRead): payments: list[ContractFeePaymentRead] attachments: dict[str, list[AttachmentRead]]