from datetime import datetime from typing import List, Optional from pydantic import BaseModel, Field from app.models.shipment import ShipmentStatus # Shipment Item Schema class ShipmentItemBase(BaseModel): product_id: int quantity: int = Field(1, gt=0) class ShipmentItemCreate(ShipmentItemBase): pass class ShipmentItemUpdate(ShipmentItemBase): pass class ShipmentItemInDBBase(ShipmentItemBase): id: int shipment_id: int class Config: from_attributes = True class ShipmentItem(ShipmentItemInDBBase): pass class ShipmentItemInDB(ShipmentItemInDBBase): pass # Shipment Schema class ShipmentBase(BaseModel): order_id: Optional[int] = None origin_warehouse_id: Optional[int] = None destination_warehouse_id: Optional[int] = None customer_address: Optional[str] = None status: Optional[ShipmentStatus] = ShipmentStatus.PENDING carrier: Optional[str] = None estimated_delivery: Optional[datetime] = None shipping_cost: Optional[float] = 0.0 created_by_id: Optional[int] = None class ShipmentCreate(ShipmentBase): origin_warehouse_id: int created_by_id: int items: List[ShipmentItemCreate] # Either destination_warehouse_id or customer_address must be provided # This will be validated in the service layer class ShipmentUpdate(ShipmentBase): pass class ShipmentInDBBase(ShipmentBase): id: int tracking_number: str actual_delivery: Optional[datetime] = None created_at: datetime updated_at: Optional[datetime] = None class Config: from_attributes = True class Shipment(ShipmentInDBBase): items: List[ShipmentItem] = [] class ShipmentInDB(ShipmentInDBBase): pass # Schema for tracking info that can be shared publicly class ShipmentTracking(BaseModel): tracking_number: str status: ShipmentStatus carrier: Optional[str] = None estimated_delivery: Optional[datetime] = None actual_delivery: Optional[datetime] = None