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="Комплект добавлен в товар")