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