from typing import Optional, List from datetime import datetime from decimal import Decimal from pydantic import BaseModel, Field, condecimal # Shared properties for purchase order item class PurchaseOrderItemBase(BaseModel): product_id: int quantity: int = Field(..., gt=0) unit_price: condecimal(decimal_places=2, ge=0) # Properties for purchase order item creation class PurchaseOrderItemCreate(PurchaseOrderItemBase): pass # Properties for purchase order item in DB class PurchaseOrderItemInDBBase(PurchaseOrderItemBase): id: int purchase_order_id: int class Config: from_attributes = True # Properties to return via API class PurchaseOrderItem(PurchaseOrderItemInDBBase): pass # Shared properties for purchase order class PurchaseOrderBase(BaseModel): supplier_name: str notes: Optional[str] = None status: str = "pending" # pending, received, cancelled # Properties for purchase order creation class PurchaseOrderCreate(PurchaseOrderBase): items: List[PurchaseOrderItemCreate] # Properties for purchase order update class PurchaseOrderUpdate(BaseModel): supplier_name: Optional[str] = None notes: Optional[str] = None status: Optional[str] = None # Properties for purchase order in DB class PurchaseOrderInDBBase(PurchaseOrderBase): id: int created_at: datetime updated_at: Optional[datetime] = None created_by: int class Config: from_attributes = True # Properties to return via API class PurchaseOrder(PurchaseOrderInDBBase): items: List[PurchaseOrderItem] total_amount: condecimal(decimal_places=2)