import json from datetime import datetime from typing import Any from pydantic import BaseModel, Field, validator from app.models.order import OrderStatus, ShippingMethod class AddressSchema(BaseModel): first_name: str last_name: str address_line1: str address_line2: str | None = None city: str state: str postal_code: str country: str phone_number: str | None = None email: str | None = None class OrderItemBase(BaseModel): product_id: str quantity: int = Field(..., gt=0) unit_price: float product_options: dict[str, Any] | None = None class OrderItemCreate(OrderItemBase): pass class OrderItemInDB(OrderItemBase): id: str order_id: str subtotal: float discount: float = 0.0 tax_amount: float = 0.0 product_name: str product_sku: str | None = None created_at: datetime class Config: orm_mode = True @validator('product_options', pre=True) def parse_product_options(cls, v): if isinstance(v, str): try: return json.loads(v) except: return None return v class OrderBase(BaseModel): shipping_method: ShippingMethod shipping_address: AddressSchema billing_address: AddressSchema | None = None notes: str | None = None class OrderCreate(OrderBase): cart_items: list[str] = [] # List of cart item IDs coupon_code: str | None = None use_default_addresses: bool = False class OrderUpdate(BaseModel): status: OrderStatus | None = None tracking_number: str | None = None notes: str | None = None class OrderInDBBase(OrderBase): id: str user_id: str order_number: str status: OrderStatus total_amount: float subtotal: float tax_amount: float shipping_amount: float discount_amount: float = 0.0 tracking_number: str | None = None created_at: datetime updated_at: datetime | None = None class Config: orm_mode = True @validator('shipping_address', 'billing_address', pre=True) def parse_address(cls, v): if isinstance(v, str): try: return json.loads(v) except: return {} return v class Order(OrderInDBBase): items: list[OrderItemInDB] = [] class OrderSummary(BaseModel): id: str order_number: str status: OrderStatus total_amount: float created_at: datetime item_count: int class Config: orm_mode = True