
This commit implements a comprehensive inventory management system for small businesses using FastAPI and SQLAlchemy. Features include: - Product and category management - Inventory tracking across multiple locations - Supplier management - Purchase management - Transaction tracking for inventory movements - Complete API documentation generated with BackendIM... (backend.im)
69 lines
2.7 KiB
Python
69 lines
2.7 KiB
Python
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") |