feat: total services amount and recalculating
This commit is contained in:
@@ -6,7 +6,7 @@ from starlette import status
|
||||
|
||||
import models.deal
|
||||
import models.secondary
|
||||
from models import User, Service, Client
|
||||
from models import User, Service, Client, DealProductService
|
||||
from models.deal import *
|
||||
from schemas.client import ClientDetailsSchema
|
||||
from schemas.deal import *
|
||||
@@ -732,7 +732,8 @@ class DealService(BaseService):
|
||||
'deal_id': request.deal_id,
|
||||
'product_id': deal_product.product_id,
|
||||
'service_id': service.service.id,
|
||||
'price': service.price
|
||||
'price': service.price,
|
||||
'is_fixed_price': service.is_fixed_price
|
||||
})
|
||||
if not insert_data:
|
||||
return DealServicesCopyResponse(ok=True, message='Услуги успешно перенесены')
|
||||
@@ -916,6 +917,7 @@ class DealService(BaseService):
|
||||
continue
|
||||
request_service = services_dict[service.service_id]
|
||||
service.price = request_service.price
|
||||
service.is_fixed_price = request_service.is_fixed_price
|
||||
await self.session.flush()
|
||||
|
||||
# Creating services
|
||||
@@ -1001,7 +1003,7 @@ class DealService(BaseService):
|
||||
'deal_id': request.deal_id,
|
||||
'product_id': deal_product.product_id,
|
||||
'service_id': service.id,
|
||||
'price': service_price
|
||||
'price': service_price,
|
||||
})
|
||||
if not insert_data:
|
||||
return DealProductAddKitResponse(ok=True, message='Набор услуг успешно добавлен к товару')
|
||||
@@ -1029,6 +1031,7 @@ class DealService(BaseService):
|
||||
return DealProductAddKitResponse(ok=False, message=str(e))
|
||||
|
||||
# endregion
|
||||
|
||||
async def complete(self, user: User, request: DealCompleteRequest) -> DealCompleteResponse:
|
||||
try:
|
||||
# check for admin
|
||||
@@ -1044,3 +1047,59 @@ class DealService(BaseService):
|
||||
except Exception as e:
|
||||
await self.session.rollback()
|
||||
return DealCompleteResponse(ok=False, message=str(e))
|
||||
|
||||
async def recalculate_price(self, request: DealRecalculatePriceRequest) -> DealRecalculatePriceResponse:
|
||||
try:
|
||||
deal_stmt = (
|
||||
select(
|
||||
Deal
|
||||
)
|
||||
.options(
|
||||
selectinload(Deal.services)
|
||||
.joinedload(models.DealService.service),
|
||||
selectinload(Deal.products)
|
||||
.selectinload(DealProduct.services)
|
||||
.joinedload(DealProductService.service),
|
||||
)
|
||||
.where(Deal.id == request.deal_id)
|
||||
)
|
||||
deal: Deal = await self.session.scalar(deal_stmt)
|
||||
services_quantity = defaultdict(lambda: 0)
|
||||
for product in deal.products:
|
||||
product: DealProduct
|
||||
for service in product.services:
|
||||
service: DealProductService
|
||||
if service.is_fixed_price:
|
||||
continue
|
||||
services_quantity[service.service_id] += product.quantity
|
||||
|
||||
services_prices = {}
|
||||
for product in deal.products:
|
||||
for service in product.services:
|
||||
if service.is_fixed_price:
|
||||
continue
|
||||
quantity = services_quantity[service.service_id]
|
||||
print(service.service_id, quantity)
|
||||
if service.service_id in services_prices:
|
||||
service.price = services_prices[service.service_id]
|
||||
continue
|
||||
price = self.get_service_price(
|
||||
service=service.service,
|
||||
quantity=quantity
|
||||
)
|
||||
print(service.service_id, price)
|
||||
service.price = price
|
||||
services_prices[service.service_id] = price
|
||||
for service in deal.services:
|
||||
service: models.DealService
|
||||
if service.is_fixed_price:
|
||||
continue
|
||||
price = self.get_service_price(
|
||||
service=service.service,
|
||||
quantity=service.quantity
|
||||
)
|
||||
service.price = price
|
||||
await self.session.commit()
|
||||
return DealRecalculatePriceResponse(ok=True, message="Цены успешно пересчитаны")
|
||||
except Exception as e:
|
||||
return DealRecalculatePriceResponse(ok=False, message=str(e))
|
||||
|
||||
Reference in New Issue
Block a user