from sqlalchemy import Column, String, Float, Integer, ForeignKey, Enum from sqlalchemy.orm import relationship import enum from app.models.base import BaseModel class LocationType(str, enum.Enum): WAREHOUSE = "warehouse" STORE = "store" SUPPLIER = "supplier" class Location(BaseModel): """Location model for inventory storage""" __tablename__ = "locations" name = Column(String(100), nullable=False) type = Column(Enum(LocationType), nullable=False, default=LocationType.WAREHOUSE) address = Column(String(255), nullable=True) description = Column(String(255), nullable=True) # Relationships inventory_items = relationship("InventoryItem", back_populates="location") class TransactionType(str, enum.Enum): PURCHASE = "purchase" SALE = "sale" TRANSFER = "transfer" ADJUSTMENT = "adjustment" RETURN = "return" class InventoryTransaction(BaseModel): """Inventory transaction model to track changes""" __tablename__ = "inventory_transactions" type = Column(Enum(TransactionType), nullable=False) reference_id = Column(String(100), nullable=True) notes = Column(String(255), nullable=True) # Relationships transaction_items = relationship("InventoryTransactionItem", back_populates="transaction") class InventoryTransactionItem(BaseModel): """Inventory transaction item model""" __tablename__ = "inventory_transaction_items" transaction_id = Column(Integer, ForeignKey("inventory_transactions.id"), nullable=False) product_id = Column(Integer, ForeignKey("products.id"), nullable=False) quantity = Column(Float, nullable=False) from_location_id = Column(Integer, ForeignKey("locations.id"), nullable=True) to_location_id = Column(Integer, ForeignKey("locations.id"), nullable=True) # Relationships transaction = relationship("InventoryTransaction", back_populates="transaction_items") product = relationship("Product") from_location = relationship("Location", foreign_keys=[from_location_id]) to_location = relationship("Location", foreign_keys=[to_location_id]) class InventoryItem(BaseModel): """Inventory item model representing product stock at a location""" __tablename__ = "inventory_items" product_id = Column(Integer, ForeignKey("products.id"), nullable=False) location_id = Column(Integer, ForeignKey("locations.id"), nullable=False) quantity = Column(Float, nullable=False, default=0) minimum_stock = Column(Float, nullable=False, default=0) maximum_stock = Column(Float, nullable=True) # Relationships product = relationship("Product", back_populates="inventory_items") location = relationship("Location", back_populates="inventory_items")