from datetime import datetime from enum import Enum from typing import Optional from pydantic import BaseModel class MovementTypeEnum(str, Enum): STOCK_IN = "STOCK_IN" STOCK_OUT = "STOCK_OUT" ADJUSTMENT = "ADJUSTMENT" RETURN = "RETURN" # Shared properties class InventoryMovementBase(BaseModel): product_id: Optional[str] = None quantity: Optional[int] = None type: Optional[MovementTypeEnum] = None reference: Optional[str] = None notes: Optional[str] = None unit_price: Optional[float] = None # Properties to receive via API on creation class InventoryMovementCreate(InventoryMovementBase): product_id: str quantity: int type: MovementTypeEnum # Properties to receive via API on update class InventoryMovementUpdate(InventoryMovementBase): pass # Properties to return via API class InventoryMovementInDB(InventoryMovementBase): id: str product_id: str quantity: int type: MovementTypeEnum created_by: Optional[str] = None created_at: datetime class Config: from_attributes = True # Additional properties to return via API class InventoryMovement(InventoryMovementInDB): pass # Inventory movement with product details class InventoryMovementWithProduct(InventoryMovement): product: "ProductMinimal" class Config: from_attributes = True # Minimal product representation for movement response class ProductMinimal(BaseModel): id: str name: str sku: Optional[str] = None current_stock: int class Config: from_attributes = True # Update recursive forward references InventoryMovementWithProduct.model_rebuild()