# models/schema/product.py from datetime import datetime from pydantic import BaseModel, ConfigDict, Field from app.modules.inventory.schemas import InventoryLocationResponse from models.schema.marketplace_product import MarketplaceProductResponse class ProductCreate(BaseModel): marketplace_product_id: int = Field( ..., description="MarketplaceProduct ID to add to vendor catalog" ) vendor_sku: str | None = Field(None, description="Vendor's internal SKU") price: float | None = Field(None, ge=0) sale_price: float | None = Field(None, ge=0) currency: str | None = None availability: str | None = None condition: str | None = None is_featured: bool = False min_quantity: int = Field(1, ge=1) max_quantity: int | None = Field(None, ge=1) class ProductUpdate(BaseModel): vendor_sku: str | None = None price: float | None = Field(None, ge=0) sale_price: float | None = Field(None, ge=0) currency: str | None = None availability: str | None = None condition: str | None = None is_featured: bool | None = None is_active: bool | None = None min_quantity: int | None = Field(None, ge=1) max_quantity: int | None = Field(None, ge=1) class ProductResponse(BaseModel): model_config = ConfigDict(from_attributes=True) id: int vendor_id: int marketplace_product: MarketplaceProductResponse vendor_sku: str | None price: float | None sale_price: float | None currency: str | None availability: str | None condition: str | None is_featured: bool is_active: bool display_order: int min_quantity: int max_quantity: int | None created_at: datetime updated_at: datetime # Include inventory summary total_inventory: int | None = None available_inventory: int | None = None class ProductDetailResponse(ProductResponse): """Product with full inventory details.""" inventory_locations: list[InventoryLocationResponse] = [] class ProductListResponse(BaseModel): products: list[ProductResponse] total: int skip: int limit: int class ProductDeleteResponse(BaseModel): """Response for product deletion.""" message: str class ProductToggleResponse(BaseModel): """Response for product toggle operations (active/featured).""" message: str is_active: bool | None = None is_featured: bool | None = None