from sqlalchemy import Column, Integer, String, DateTime, ForeignKey, UniqueConstraint from sqlalchemy.orm import relationship from sqlalchemy.sql import func from app.core.database import Base class Product(Base): __tablename__ = "products" id = Column(Integer, primary_key=True, index=True) name = Column(String(255), nullable=False) sku = Column(String(100), unique=True, nullable=False, index=True) quantity_in_stock = Column(Integer, nullable=False, default=0) created_at = Column( DateTime(timezone=True), server_default=func.now(), nullable=False ) updated_at = Column( DateTime(timezone=True), server_default=func.now(), onupdate=func.now(), nullable=False, ) stock_movements = relationship( "StockMovement", back_populates="product", cascade="all, delete-orphan" ) class StockMovement(Base): __tablename__ = "stock_movements" id = Column(Integer, primary_key=True, index=True) product_id = Column( Integer, ForeignKey("products.id", ondelete="CASCADE"), nullable=False, index=True, ) order_id = Column(Integer, nullable=False, index=True) movement_type = Column(String(50), nullable=False) quantity_change = Column(Integer, nullable=False) created_at = Column( DateTime(timezone=True), server_default=func.now(), nullable=False ) product = relationship("Product", back_populates="stock_movements") class ProcessedEvent(Base): __tablename__ = "processed_events" id = Column(Integer, primary_key=True, index=True) order_id = Column(Integer, unique=True, nullable=False, index=True) processed_at = Column( DateTime(timezone=True), server_default=func.now(), nullable=False )