from typing import List, Optional, Dict, Any from pydantic import BaseModel, Field from datetime import datetime from enum import Enum from app.models.inventory import LocationType, TransactionType # Location schemas class LocationTypeEnum(str, Enum): WAREHOUSE = "warehouse" STORE = "store" SUPPLIER = "supplier" class LocationBase(BaseModel): name: str type: LocationTypeEnum = LocationTypeEnum.WAREHOUSE address: Optional[str] = None description: Optional[str] = None class LocationCreate(LocationBase): pass class LocationUpdate(BaseModel): name: Optional[str] = None type: Optional[LocationTypeEnum] = None address: Optional[str] = None description: Optional[str] = None class LocationInDB(LocationBase): id: int created_at: datetime updated_at: datetime class Config: from_attributes = True # Inventory item schemas class InventoryItemBase(BaseModel): product_id: int location_id: int quantity: float minimum_stock: float = 0 maximum_stock: Optional[float] = None class InventoryItemCreate(InventoryItemBase): pass class InventoryItemUpdate(BaseModel): quantity: Optional[float] = None minimum_stock: Optional[float] = None maximum_stock: Optional[float] = None class InventoryItemInDB(InventoryItemBase): id: int created_at: datetime updated_at: datetime class Config: from_attributes = True class InventoryItemWithDetails(InventoryItemInDB): product: Dict[str, Any] location: Dict[str, Any] # Transaction schemas class TransactionTypeEnum(str, Enum): PURCHASE = "purchase" SALE = "sale" TRANSFER = "transfer" ADJUSTMENT = "adjustment" RETURN = "return" class InventoryTransactionBase(BaseModel): type: TransactionTypeEnum reference_id: Optional[str] = None notes: Optional[str] = None class InventoryTransactionCreate(InventoryTransactionBase): pass class InventoryTransactionItemBase(BaseModel): product_id: int quantity: float from_location_id: Optional[int] = None to_location_id: Optional[int] = None class InventoryTransactionItemCreate(InventoryTransactionItemBase): pass class InventoryTransactionWithItems(InventoryTransactionBase): items: List[InventoryTransactionItemCreate] class InventoryTransactionItemInDB(InventoryTransactionItemBase): id: int transaction_id: int created_at: datetime updated_at: datetime class Config: from_attributes = True class InventoryTransactionInDB(InventoryTransactionBase): id: int created_at: datetime updated_at: datetime transaction_items: List[InventoryTransactionItemInDB] = [] class Config: from_attributes = True