89 lines
4.3 KiB
Python
89 lines
4.3 KiB
Python
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")
|