from sqlalchemy import Column, String, Boolean, Integer, Numeric, ForeignKey, DateTime from sqlalchemy.sql import func from sqlalchemy.orm import relationship from app.core.database.db_session import Base from app.models.BrandModel import Brand from app.models.PartsModel import RepairVariantPart class DeviceSeries(Base): __tablename__ = "device_series" series_id = Column(String(26), primary_key=True) brand_id = Column(String(26), ForeignKey("brands.brand_id", ondelete="SET NULL"), nullable=True) name = Column(String(100), nullable=False) slug = Column(String(100), unique=True, nullable=False) device_type = Column(String(50), nullable=True) # laptop, tablet, mobile sort_order = Column(Integer, default=0) is_active = Column(Boolean, default=True) brand = relationship("Brand") models = relationship("DeviceModel", back_populates="series") class DeviceModel(Base): __tablename__ = "device_models" model_id = Column(String(26), primary_key=True) series_id = Column(String(26), ForeignKey("device_series.series_id", ondelete="SET NULL"), nullable=True) brand_id = Column(String(26), ForeignKey("brands.brand_id", ondelete="SET NULL"), nullable=True) name = Column(String(100), nullable=False) slug = Column(String(100), unique=True, nullable=False) device_type = Column(String(50), nullable=True) # laptop, tablet, mobile full_path = Column(String(500), nullable=False) release_year = Column(Integer, nullable=True) image_url = Column(String(500), nullable=True) is_active = Column(Boolean, default=True) series = relationship("DeviceSeries", back_populates="models") brand = relationship("Brand") services = relationship("RepairService", primaryjoin="DeviceModel.model_id == RepairService.model_id", foreign_keys="[RepairService.model_id]", back_populates="model", cascade="all, delete-orphan") class ServiceType(Base): __tablename__ = "service_types" service_type_id = Column(String(26), primary_key=True) name = Column(String(100), unique=True, nullable=False) slug = Column(String(100), unique=True, nullable=False) icon_url = Column(String(500), nullable=True) description = Column(String(500), nullable=True) is_active = Column(Boolean, default=True) class RepairService(Base): __tablename__ = "repair_services" repair_service_id = Column(String(26), primary_key=True) model_id = Column(String(26), nullable=False) service_type_id = Column(String(26), ForeignKey("service_types.service_type_id", ondelete="RESTRICT"), nullable=False) slug = Column(String(100), nullable=False) full_path = Column(String(500), nullable=False) description = Column(String(1000), nullable=True) model = relationship("DeviceModel", primaryjoin="DeviceModel.model_id == RepairService.model_id", foreign_keys=[model_id], back_populates="services") service_type = relationship("ServiceType") variants = relationship("RepairVariant", back_populates="repair_service", cascade="all, delete-orphan") class RepairVariant(Base): __tablename__ = "repair_variants" variant_id = Column(String(26), primary_key=True) repair_service_id = Column(String(26), ForeignKey("repair_services.repair_service_id", ondelete="CASCADE"), nullable=False) name = Column(String(100), nullable=False) # e.g. "Original OLED", "Premium OLED" price = Column(Numeric(10, 2), nullable=False) cost = Column(Numeric(10, 2), nullable=False) duration_minutes = Column(Integer, default=45) warranty_days = Column(Integer, default=90) status = Column(String(20), default="active") # active, inactive created_at = Column(DateTime, server_default=func.now()) repair_service = relationship("RepairService", back_populates="variants") images = relationship("RepairVariantImage", back_populates="variant", cascade="all, delete-orphan") bom_parts = relationship("RepairVariantPart", back_populates="variant", cascade="all, delete-orphan") class RepairVariantImage(Base): __tablename__ = "repair_variant_images" image_id = Column(String(26), primary_key=True) variant_id = Column(String(26), ForeignKey("repair_variants.variant_id", ondelete="CASCADE"), nullable=False) image_url = Column(String(500), nullable=False) sort_order = Column(Integer, default=0) variant = relationship("RepairVariant", back_populates="images")