82 lines
3.0 KiB
Python
82 lines
3.0 KiB
Python
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from modules.fulfillment_base.models import DealProductService
|
|
from modules.fulfillment_base.repositories import (
|
|
ProductServiceRepository,
|
|
ServicesKitRepository,
|
|
DealProductRepository,
|
|
)
|
|
from modules.fulfillment_base.schemas.product_service import *
|
|
|
|
|
|
class ProductServiceService:
|
|
schema_class = ProductServiceSchema
|
|
|
|
def __init__(self, session: AsyncSession):
|
|
self.repository = ProductServiceRepository(session)
|
|
|
|
async def create(
|
|
self, request: CreateProductServiceRequest
|
|
) -> CreateProductServiceResponse:
|
|
await self.repository.create(request.entity)
|
|
deal_product = await self.repository.get_by_id(
|
|
request.entity.deal_id,
|
|
request.entity.product_id,
|
|
request.entity.service_id,
|
|
)
|
|
return CreateProductServiceResponse(
|
|
entity=ProductServiceSchema.model_validate(deal_product),
|
|
message="Услуга добавлена к товару",
|
|
)
|
|
|
|
async def update(
|
|
self,
|
|
deal_id: int,
|
|
product_id: int,
|
|
service_id: int,
|
|
data: UpdateProductServiceRequest,
|
|
) -> UpdateProductServiceResponse:
|
|
entity = await self.repository.get_by_id(deal_id, product_id, service_id)
|
|
|
|
await self.repository.update(entity, data.entity)
|
|
return UpdateProductServiceResponse(message="Услуга обновлена")
|
|
|
|
async def delete(
|
|
self, deal_id: int, product_id: int, service_id: int
|
|
) -> DeleteProductServiceResponse:
|
|
entity = await self.repository.get_by_id(deal_id, product_id, service_id)
|
|
await self.repository.delete(entity)
|
|
return DeleteProductServiceResponse(message="Товар удален из сделки")
|
|
|
|
async def duplicate_product_services(
|
|
self, request: ProductServicesDuplicateRequest
|
|
) -> ProductServicesDuplicateResponse:
|
|
services_to_copy: list[
|
|
DealProductService
|
|
] = await self.repository.get_product_services(
|
|
request.deal_id, request.source_deal_product_id
|
|
)
|
|
|
|
await self.repository.duplicate_services(
|
|
request.deal_id, request.target_deal_product_ids, services_to_copy
|
|
)
|
|
return ProductServicesDuplicateResponse(message="Услуги продублированы")
|
|
|
|
async def add_services_kit(
|
|
self, request: DealProductAddKitRequest
|
|
) -> DealProductAddKitResponse:
|
|
services_kit_repo = ServicesKitRepository(self.repository.session)
|
|
services_kit = await services_kit_repo.get_by_id(request.kit_id)
|
|
|
|
deal_product_repo = DealProductRepository(self.repository.session)
|
|
deal_product = await deal_product_repo.get_by_id(
|
|
request.deal_id, request.product_id
|
|
)
|
|
|
|
await self.repository.delete_product_services(
|
|
request.deal_id, [request.product_id]
|
|
)
|
|
await self.repository.add_services_kit(deal_product, services_kit)
|
|
|
|
return DealProductAddKitResponse(message="Комплект добавлен в товар")
|