feat: total services amount and recalculating

This commit is contained in:
2024-10-22 19:32:27 +03:00
parent 4fa5c0d05b
commit 9a12ddb6af
5 changed files with 93 additions and 8 deletions

View File

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