from sqlalchemy import Column, Integer, String, ForeignKey, Double, asc, Table from sqlalchemy.orm import relationship, mapped_column, Mapped import enums.service from models import BaseModel services_kit_services = Table( 'services_kit_services', BaseModel.metadata, Column('services_kit_id', ForeignKey('services_kits.id')), Column('service_id', ForeignKey('services.id')), ) class Service(BaseModel): __tablename__ = 'services' id: Mapped[int] = mapped_column(Integer, autoincrement=True, primary_key=True, index=True) name = Column(String, nullable=False, comment='Название услуги') category_id = Column(Integer, ForeignKey('service_categories.id'), nullable=False, comment='ID категории услуги') category = relationship('ServiceCategory', lazy='joined') price = Column( Double, nullable=False, comment='Стоимость услуги' ) cost = Column( Double, nullable=False, server_default='0', comment='Себестоимость услуги' ) service_type = Column(Integer, server_default=f'{enums.service.ServiceType.DEAL_SERVICE}', nullable=False, comment='Тип услуги') price_ranges = relationship('ServicePriceRange', back_populates='service', lazy='selectin', order_by="asc(ServicePriceRange.from_quantity)", cascade="all, delete-orphan") category_prices = relationship('ServiceCategoryPrice', back_populates='service', lazy='selectin', cascade="all, delete-orphan") rank: Mapped[str] = mapped_column( nullable=False, server_default='', comment='Ранг услуги' ) class ServicePriceRange(BaseModel): __tablename__ = 'service_price_ranges' id = Column(Integer, autoincrement=True, primary_key=True, index=True) service_id = Column(Integer, ForeignKey('services.id'), nullable=False, comment='ID услуги') service = relationship('Service', back_populates='price_ranges') from_quantity = Column(Integer, nullable=False, comment='От количества') to_quantity = Column(Integer, nullable=False, comment='До количества') price = Column(Double, nullable=False, comment='Цена') class ServiceCategoryPrice(BaseModel): __tablename__ = 'service_category_prices' service_id: Mapped[int] = mapped_column(ForeignKey('services.id'), primary_key=True) category_id: Mapped[int] = mapped_column(ForeignKey('service_price_category.id'), primary_key=True) price: Mapped[float] = mapped_column(Double, nullable=False, comment='Цена') service: Mapped["Service"] = relationship('Service', lazy='joined', back_populates='category_prices') category: Mapped["ServicePriceCategory"] = relationship('ServicePriceCategory', lazy='joined') class ServicePriceCategory(BaseModel): __tablename__ = 'service_price_category' id: Mapped[int] = mapped_column(primary_key=True) name: Mapped[str] = mapped_column(nullable=False) class ServiceCategory(BaseModel): __tablename__ = 'service_categories' id = Column(Integer, autoincrement=True, primary_key=True, index=True) name = Column(String, nullable=False) deal_service_rank: Mapped[str] = mapped_column( nullable=False, server_default='', comment='Ранг услуги для сделки' ) product_service_rank: Mapped[str] = mapped_column( nullable=False, server_default='', comment='Ранг услуги для товара' ) class ServicesKit(BaseModel): __tablename__ = 'services_kits' id: Mapped[int] = mapped_column(primary_key=True) name: Mapped[str] = mapped_column(nullable=False) service_type: Mapped[int] = mapped_column( server_default=f'{enums.service.ServiceType.DEAL_SERVICE}', nullable=False, comment='Тип услуги' ) services: Mapped[list["Service"]] = relationship( secondary=services_kit_services, lazy='selectin' )