from sqlalchemy import Column, String, Boolean, Integer, Numeric, ForeignKey from sqlalchemy.orm import relationship from app.core.database.db_session import Base class Part(Base): __tablename__ = "parts" part_id = Column(String(26), primary_key=True) sku = Column(String(100), unique=True, nullable=False) name = Column(String(255), nullable=False) cost_price = Column(Numeric(10, 2), nullable=False) low_stock_alert = Column(Integer, default=3) supplier = Column(String(255), nullable=True) barcode = Column(String(100), unique=True, nullable=True) is_active = Column(Boolean, default=True) compatibilities = relationship("PartDeviceCompatibility", back_populates="part", cascade="all, delete-orphan") bom_variants = relationship("RepairVariantPart", back_populates="part", cascade="all, delete-orphan") class PartDeviceCompatibility(Base): __tablename__ = "part_device_compatibility" id = Column(String(26), primary_key=True) part_id = Column(String(26), ForeignKey("parts.part_id", ondelete="CASCADE"), nullable=False) model_id = Column(String(26), nullable=False) part = relationship("Part", back_populates="compatibilities") model = relationship("DeviceModel", primaryjoin="DeviceModel.model_id == PartDeviceCompatibility.model_id", foreign_keys=[model_id]) class RepairVariantPart(Base): __tablename__ = "repair_variant_parts" id = Column(String(26), primary_key=True) variant_id = Column(String(26), ForeignKey("repair_variants.variant_id", ondelete="CASCADE"), nullable=False) part_id = Column(String(26), ForeignKey("parts.part_id", ondelete="RESTRICT"), nullable=False) quantity = Column(Integer, default=1, nullable=False) variant = relationship("RepairVariant", back_populates="bom_parts") part = relationship("Part", back_populates="bom_variants")