feat: services kit and copy
This commit is contained in:
171
services/deal.py
171
services/deal.py
@@ -13,6 +13,7 @@ from schemas.client import ClientDetailsSchema
|
||||
from schemas.deal import *
|
||||
from services.base import BaseService
|
||||
from services.client import ClientService
|
||||
from services.service import ServiceService
|
||||
from services.shipping_warehouse import ShippingWarehouseService
|
||||
|
||||
|
||||
@@ -317,6 +318,48 @@ class DealService(BaseService):
|
||||
await self.session.commit()
|
||||
return await self.get_summary()
|
||||
|
||||
async def add_kit_to_deal(self, request: DealAddKitRequest) -> DealAddKitResponse:
|
||||
try:
|
||||
deal = await self._get_deal_by_id(request.deal_id)
|
||||
if not deal:
|
||||
return DealAddKitResponse(ok=False, message="Указанная сделка не найдена")
|
||||
kit = await ServiceService(self.session).get_kit_by_id(request.kit_id)
|
||||
if not kit:
|
||||
return DealAddKitResponse(ok=False, message="Указанный набор услуг не найден")
|
||||
services: list[models.Service] = kit.services
|
||||
insert_data = []
|
||||
for service in services:
|
||||
price = self.get_service_price(service, 1)
|
||||
insert_data.append({
|
||||
'deal_id': deal.id,
|
||||
'service_id': service.id,
|
||||
'quantity': 1,
|
||||
'price': price
|
||||
})
|
||||
if not insert_data:
|
||||
return DealAddKitResponse(ok=True, message="Набор услуг успешно добавлен к сделке")
|
||||
# Deleting previous services
|
||||
delete_stmt = (
|
||||
delete(
|
||||
models.DealService
|
||||
)
|
||||
.where(
|
||||
models.DealService.deal_id == request.deal_id
|
||||
)
|
||||
)
|
||||
await self.session.execute(delete_stmt)
|
||||
await self.session.flush()
|
||||
|
||||
await self.session.execute(
|
||||
insert(models.DealService),
|
||||
insert_data
|
||||
)
|
||||
await self.session.flush()
|
||||
await self.session.commit()
|
||||
return DealAddKitResponse(ok=True, message="Набор услуг успешно добавлен к сделке")
|
||||
except Exception as e:
|
||||
return DealAddKitResponse(ok=False, message=str(e))
|
||||
|
||||
# endregion
|
||||
|
||||
# region Deal services
|
||||
@@ -492,6 +535,82 @@ class DealService(BaseService):
|
||||
await self.session.rollback()
|
||||
return DealUpdateServiceQuantityResponse(ok=False, message=str(e))
|
||||
|
||||
async def copy_services(self, request: DealServicesCopyRequest) -> DealServicesCopyResponse:
|
||||
try:
|
||||
|
||||
source_services_stmt = (
|
||||
select(
|
||||
models.DealProductService
|
||||
)
|
||||
.where(
|
||||
models.DealProductService.product_id == request.source_product_id,
|
||||
models.DealProductService.deal_id == request.deal_id,
|
||||
)
|
||||
)
|
||||
deal_product_services: list[models.DealProductService] = (
|
||||
await self.session.scalars(source_services_stmt)).all()
|
||||
source_services: list[models.Service] = [dpc.service for dpc in deal_product_services]
|
||||
|
||||
destination_deal_products_stmt = (
|
||||
select(
|
||||
models.DealProduct
|
||||
)
|
||||
.where(
|
||||
models.DealProduct.product_id.in_(request.destination_product_ids),
|
||||
models.DealProduct.deal_id == request.deal_id
|
||||
)
|
||||
)
|
||||
destination_deal_products = (await self.session.scalars(destination_deal_products_stmt)).all()
|
||||
insert_data = []
|
||||
for deal_product in destination_deal_products:
|
||||
for service in source_services:
|
||||
service_price = self.get_service_price(service, deal_product.quantity)
|
||||
insert_data.append({
|
||||
'deal_id': request.deal_id,
|
||||
'product_id': deal_product.product_id,
|
||||
'service_id': service.id,
|
||||
'price': service_price
|
||||
})
|
||||
if not insert_data:
|
||||
return DealServicesCopyResponse(ok=True, message='Услуги успешно перенесены')
|
||||
# Deleting previous DealProductService-s
|
||||
delete_stmt = (
|
||||
delete(
|
||||
models.DealProductService
|
||||
)
|
||||
.where(
|
||||
models.DealProductService.product_id.in_(request.destination_product_ids),
|
||||
models.DealProductService.deal_id == request.deal_id
|
||||
)
|
||||
)
|
||||
await self.session.execute(delete_stmt)
|
||||
await self.session.flush()
|
||||
|
||||
await self.session.execute(
|
||||
insert(models.DealProductService),
|
||||
insert_data
|
||||
)
|
||||
await self.session.flush()
|
||||
await self.session.commit()
|
||||
return DealServicesCopyResponse(ok=True, message='Услуги успешно перенесены')
|
||||
except Exception as e:
|
||||
return DealServicesCopyResponse(ok=False, message=str(e))
|
||||
|
||||
@staticmethod
|
||||
def get_service_price(service: models.Service, quantity: int):
|
||||
price = 0
|
||||
price_ranges: list[models.ServicePriceRange] = service.price_ranges
|
||||
for price_range in price_ranges:
|
||||
if price_range.from_quantity <= quantity <= price_range.to_quantity:
|
||||
price = price_range.price
|
||||
break
|
||||
|
||||
if not price and len(price_ranges) > 0:
|
||||
price = price_ranges[0].price
|
||||
if not price:
|
||||
price = service.price
|
||||
return price
|
||||
|
||||
# endregion
|
||||
|
||||
# region Deal products
|
||||
@@ -662,4 +781,56 @@ class DealService(BaseService):
|
||||
await self.session.rollback()
|
||||
return DealUpdateProductResponse(ok=False, message=str(e))
|
||||
|
||||
async def add_kit_to_deal_product(self, request: DealProductAddKitRequest) -> DealProductAddKitResponse:
|
||||
try:
|
||||
service_service = ServiceService(self.session)
|
||||
kit = await service_service.get_kit_by_id(request.kit_id)
|
||||
if not kit:
|
||||
return DealProductAddKitResponse(ok=False, message='Указанный набор услуг не найден')
|
||||
services: list[models.Service] = kit.services
|
||||
deal_product_stmt = (
|
||||
select(
|
||||
models.DealProduct
|
||||
)
|
||||
.where(
|
||||
models.DealProduct.deal_id == request.deal_id,
|
||||
models.DealProduct.product_id == request.product_id
|
||||
)
|
||||
)
|
||||
deal_product: Optional[models.DealProduct] = await self.session.scalar(deal_product_stmt)
|
||||
if not deal_product:
|
||||
return DealProductAddKitResponse(ok=False, message='Указанный товар не найден')
|
||||
insert_data = []
|
||||
for service in services:
|
||||
service_price = self.get_service_price(service, deal_product.quantity)
|
||||
insert_data.append({
|
||||
'deal_id': request.deal_id,
|
||||
'product_id': deal_product.product_id,
|
||||
'service_id': service.id,
|
||||
'price': service_price
|
||||
})
|
||||
if not insert_data:
|
||||
return DealProductAddKitResponse(ok=True, message='Набор услуг успешно добавлен к товару')
|
||||
# Deleting previous DealProductService-s
|
||||
delete_stmt = (
|
||||
delete(
|
||||
models.DealProductService
|
||||
)
|
||||
.where(
|
||||
models.DealProductService.product_id == deal_product.product_id,
|
||||
models.DealProductService.deal_id == request.deal_id
|
||||
)
|
||||
)
|
||||
await self.session.execute(delete_stmt)
|
||||
await self.session.flush()
|
||||
|
||||
await self.session.execute(
|
||||
insert(models.DealProductService),
|
||||
insert_data
|
||||
)
|
||||
await self.session.flush()
|
||||
await self.session.commit()
|
||||
return DealProductAddKitResponse(ok=True, message='Набор услуг успешно добавлен к товару')
|
||||
except Exception as e:
|
||||
return DealProductAddKitResponse(ok=False, message=str(e))
|
||||
# endregion
|
||||
|
||||
Reference in New Issue
Block a user