2025-06-02 11:37:11 +00:00

89 lines
2.0 KiB
Python

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