144 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			144 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
from typing import TYPE_CHECKING
 | 
						|
 | 
						|
from sqlalchemy import Table, Column, ForeignKey, ForeignKeyConstraint, UniqueConstraint
 | 
						|
from sqlalchemy.orm import relationship, mapped_column, Mapped
 | 
						|
 | 
						|
from models import Product
 | 
						|
from models.base import BaseModel
 | 
						|
 | 
						|
if TYPE_CHECKING:
 | 
						|
    from models import Card, Service, User
 | 
						|
 | 
						|
card_product_service_employees = Table(
 | 
						|
    'card_product_service_employees',
 | 
						|
    BaseModel.metadata,
 | 
						|
    Column('card_id', primary_key=True),
 | 
						|
    Column('service_id', primary_key=True),
 | 
						|
    Column('product_id', primary_key=True),
 | 
						|
    Column('user_id', ForeignKey('users.id'), primary_key=True),
 | 
						|
    ForeignKeyConstraint(
 | 
						|
        ['card_id', 'product_id', 'service_id'],
 | 
						|
        ['card_product_services.card_id', 'card_product_services.product_id', 'card_product_services.service_id']
 | 
						|
    )
 | 
						|
)
 | 
						|
card_service_employees = Table(
 | 
						|
    'card_service_employees',
 | 
						|
    BaseModel.metadata,
 | 
						|
    Column('card_id', primary_key=True),
 | 
						|
    Column('service_id', primary_key=True),
 | 
						|
    Column('user_id', ForeignKey('users.id'), primary_key=True),
 | 
						|
    ForeignKeyConstraint(
 | 
						|
        ['card_id', 'service_id'],
 | 
						|
        ['card_services.card_id', 'card_services.service_id']
 | 
						|
    )
 | 
						|
)
 | 
						|
 | 
						|
 | 
						|
class CardService(BaseModel):
 | 
						|
    __tablename__ = 'card_services'
 | 
						|
    card_id: Mapped[int] = mapped_column(
 | 
						|
        ForeignKey('cards.id'),
 | 
						|
        comment='ID Сделки',
 | 
						|
        primary_key=True,
 | 
						|
    )
 | 
						|
    card: Mapped['Card'] = relationship('Card', back_populates='services')
 | 
						|
 | 
						|
    service_id: Mapped[int] = mapped_column(ForeignKey('services.id'), nullable=False, comment='ID Услуги', primary_key=True)
 | 
						|
    service: Mapped['Service'] = relationship('Service')
 | 
						|
 | 
						|
    quantity: Mapped[int] = mapped_column(nullable=False, comment='Кол-во услуги')
 | 
						|
    price: Mapped[int] = mapped_column(nullable=False, server_default='0', comment='Цена услуги')
 | 
						|
    is_fixed_price: Mapped[bool] = mapped_column(default=False, server_default='0', comment='Фиксированная цена')
 | 
						|
 | 
						|
    employees: Mapped[list['User']] = relationship('User', secondary=card_service_employees)
 | 
						|
 | 
						|
    __table_args__ = (
 | 
						|
        UniqueConstraint('card_id', 'service_id', name='uix_card_service'),
 | 
						|
    )
 | 
						|
 | 
						|
 | 
						|
class CardProductService(BaseModel):
 | 
						|
    __tablename__ = 'card_product_services'
 | 
						|
    card_id: Mapped[int] = mapped_column(primary_key=True, nullable=False, comment='ID Сделки')
 | 
						|
 | 
						|
    product_id: Mapped[int] = mapped_column(primary_key=True, nullable=False, comment='ID Продукта')
 | 
						|
 | 
						|
    service_id: Mapped[int] = mapped_column(
 | 
						|
        ForeignKey('services.id'),
 | 
						|
        primary_key=True,
 | 
						|
        nullable=False,
 | 
						|
        comment='ID Услуги',
 | 
						|
    )
 | 
						|
 | 
						|
    price: Mapped[int] = mapped_column(nullable=False, comment='Цена услуги')
 | 
						|
 | 
						|
    is_fixed_price: Mapped[bool] = mapped_column(default=False, server_default='0', comment='Фиксированная цена')
 | 
						|
 | 
						|
    card_product: Mapped['CardProduct'] = relationship(
 | 
						|
        'CardProduct',
 | 
						|
        back_populates='services',
 | 
						|
        primaryjoin="and_(CardProductService.card_id == CardProduct.card_id, "
 | 
						|
                    "CardProductService.product_id == CardProduct.product_id)",
 | 
						|
        foreign_keys=[card_id, product_id],
 | 
						|
    )
 | 
						|
 | 
						|
    service: Mapped['Service'] = relationship(
 | 
						|
        'Service',
 | 
						|
        foreign_keys=[service_id],
 | 
						|
        lazy='joined',
 | 
						|
    )
 | 
						|
    employees: Mapped[list['User']] = relationship(
 | 
						|
        'User',
 | 
						|
        secondary=card_product_service_employees,
 | 
						|
    )
 | 
						|
 | 
						|
    __table_args__ = (
 | 
						|
        ForeignKeyConstraint(
 | 
						|
            ['card_id', 'product_id'],
 | 
						|
            ['card_products.card_id', 'card_products.product_id']
 | 
						|
        ),
 | 
						|
    )
 | 
						|
 | 
						|
 | 
						|
class CardProduct(BaseModel):
 | 
						|
    __tablename__ = 'card_products'
 | 
						|
    card_id: Mapped[int] = mapped_column(ForeignKey('cards.id'), primary_key=True, nullable=False, comment='ID карточки')
 | 
						|
    product_id: Mapped[int] = mapped_column(
 | 
						|
        ForeignKey('products.id'),
 | 
						|
        primary_key=True,
 | 
						|
        nullable=False,
 | 
						|
        comment='ID Продукта',
 | 
						|
    )
 | 
						|
    quantity: Mapped[int] = mapped_column(nullable=False, comment='Кол-во продукта')
 | 
						|
    comment: Mapped[str] = mapped_column(nullable=False, server_default='', comment='Комментарий к товару')
 | 
						|
 | 
						|
    card: Mapped['Card'] = relationship(
 | 
						|
        'Card',
 | 
						|
        back_populates='products',
 | 
						|
        foreign_keys=[card_id],
 | 
						|
    )
 | 
						|
    product: Mapped['Product'] = relationship(
 | 
						|
        'Product',
 | 
						|
        lazy='joined',
 | 
						|
        foreign_keys=[product_id],
 | 
						|
    )
 | 
						|
 | 
						|
    services: Mapped[list['CardProductService']] = relationship(
 | 
						|
        'CardProductService',
 | 
						|
        back_populates='card_product',
 | 
						|
        cascade="all, delete-orphan",
 | 
						|
        primaryjoin="and_(CardProductService.card_id == CardProduct.card_id, "
 | 
						|
                    "CardProductService.product_id == CardProduct.product_id)",
 | 
						|
        foreign_keys=[CardProductService.card_id, CardProductService.product_id],
 | 
						|
        lazy='selectin',
 | 
						|
        order_by="desc(CardProductService.service_id)"
 | 
						|
    )
 | 
						|
 | 
						|
 | 
						|
barcode_template_attribute_link = Table(
 | 
						|
    'barcode_template_attribute_links',
 | 
						|
    BaseModel.metadata,
 | 
						|
    Column('barcode_template_id', ForeignKey('barcode_templates.id')),
 | 
						|
    Column('attribute_id', ForeignKey('barcode_template_attributes.id'))
 | 
						|
)
 |