""" 成本费用凭证相关Pydantic模型 """ from datetime import date from typing import Optional, List from pydantic import BaseModel, Field class ExpenseBase(BaseModel): """成本费用凭证基础模型""" voucher_no: str = Field(..., description="凭证号") expense_type: str = Field(..., description="费用类型") expense_category: str = Field(..., description="费用类别") payer_name: str = Field(..., description="付款方名称") payer_account_no: str = Field(..., description="付款方账号") payee_name: str = Field(..., description="收款方名称") payee_account_no: str = Field(..., description="收款方账号") payee_bank_name: Optional[str] = Field(None, description="收款方开户行") expense_date: date = Field(..., description="费用发生日期") expense_amount: float = Field(..., description="费用金额") tax_amount: float = Field(..., description="税额") tax_rate: float = Field(..., description="税率") payment_method: str = Field(..., description="支付方式") payment_status: str = Field(..., description="支付状态") accounting_status: str = Field(..., description="入账状态") fiscal_year: int = Field(..., description="会计年度") fiscal_period: int = Field(..., description="会计期间") is_large_amount: bool = Field(..., description="是否大额费用(>5万)") is_cross_border: bool = Field(..., description="是否跨境支付") expense_description: Optional[str] = Field(None, description="费用说明") related_contract_id: Optional[str] = Field(None, description="关联协议ID") class ExpenseCreate(ExpenseBase): """创建成本费用凭证""" pass class ExpenseUpdate(BaseModel): """更新成本费用凭证""" voucher_no: Optional[str] = None expense_type: Optional[str] = None expense_category: Optional[str] = None payer_name: Optional[str] = None payer_account_no: Optional[str] = None payee_name: Optional[str] = None payee_account_no: Optional[str] = None payee_bank_name: Optional[str] = None expense_date: Optional[date] = None expense_amount: Optional[float] = None tax_amount: Optional[float] = None tax_rate: Optional[float] = None payment_method: Optional[str] = None payment_status: Optional[str] = None accounting_status: Optional[str] = None fiscal_year: Optional[int] = None fiscal_period: Optional[int] = None is_large_amount: Optional[bool] = None is_cross_border: Optional[bool] = None expense_description: Optional[str] = None related_contract_id: Optional[str] = None class ExpenseResponse(ExpenseBase): """成本费用凭证响应模型""" id: int expense_id: str class Config: from_attributes = True class ExpenseListResponse(BaseModel): """成本费用凭证列表响应模型""" records: List[ExpenseResponse] total: int page: int size: int