from pydantic import BaseModel, ConfigDict, Field from typing import Optional, List from datetime import datetime, date from decimal import Decimal class PurchaseOrderItemCreate(BaseModel): product_id: int quantity: int = Field(..., gt=0, description="采购数量") unit_price: Optional[Decimal] = Field(None, description="单价(可选,不填则使用物料成本价格)") remark: Optional[str] = None class PurchaseOrderCreate(BaseModel): supplier_id: int expected_date: Optional[date] = None remark: Optional[str] = None items: List[PurchaseOrderItemCreate] = Field(min_length=1) class PurchaseOrderResponse(BaseModel): id: int order_no: str supplier_name: str order_date: datetime expected_date: Optional[date] status: str receipt_status: str # "pending" | "partial_received" | "received" | "cancelled" payment_status: str # "unpaid" | "paid" total_amount: Decimal paid_amount: Decimal remark: Optional[str] created_at: datetime received_date: Optional[datetime] paid_date: Optional[datetime] model_config = ConfigDict(from_attributes=True) class PurchaseOrderItemResponse(BaseModel): id: int product_id: int product_sku: str product_name: str quantity: int received_quantity: int unit_price: Decimal amount: Decimal remark: Optional[str] = None class PurchaseOrderDetailResponse(PurchaseOrderResponse): supplier_id: int items: List[PurchaseOrderItemResponse] class PurchaseOrderReceiveItem(BaseModel): item_id: int receive_quantity: int = Field(gt=0) class PurchaseOrderReceiveRequest(BaseModel): warehouse_id: Optional[int] = None items: List[PurchaseOrderReceiveItem] = Field(min_length=1) remark: Optional[str] = None