feat: services kit and copy

This commit is contained in:
2024-08-06 04:53:50 +03:00
parent 93b0315b4a
commit a7c4fabed0
9 changed files with 442 additions and 28 deletions

View File

@@ -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