89 lines
2.0 KiB
Python
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 |