From e4d9b5ef167f3ae52e87d90a3f8303556a14157a Mon Sep 17 00:00:00 2001 From: AlexSserb Date: Tue, 15 Oct 2024 21:25:32 +0400 Subject: [PATCH] feat: deal prefilling --- routers/deal.py | 14 ++++++++++++++ schemas/deal.py | 9 +++++++++ services/deal.py | 38 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 61 insertions(+) diff --git a/routers/deal.py b/routers/deal.py index a4df919..599e026 100644 --- a/routers/deal.py +++ b/routers/deal.py @@ -207,6 +207,20 @@ async def get_detailed_deal_document( return Response(pdf_file.getvalue(), media_type='application/pdf') +@deal_router.post( + '/prefill', + response_model=DealPrefillResponse, + operation_id='prefill_deal', + dependencies=[Depends(authorized_user)] +) +async def post_prefill_deal( + session: SessionDependency, + request: DealPrefillRequest, + user: CurrentUserDependency +): + return await DealService(session).prefill_deal(user, request) + + # endregion # region Deal services diff --git a/schemas/deal.py b/schemas/deal.py index 8a06203..b84b21c 100644 --- a/schemas/deal.py +++ b/schemas/deal.py @@ -238,6 +238,11 @@ class DealCompleteRequest(BaseSchema): deal_id: int +class DealPrefillRequest(BaseSchema): + old_deal_id: int + new_deal_id: int + + # endregion Requests # region Responses @@ -338,4 +343,8 @@ class DealCreateGuestUrlResponse(OkMessageSchema): class DealCompleteResponse(OkMessageSchema): pass + +class DealPrefillResponse(OkMessageSchema): + pass + # endregion Responses diff --git a/services/deal.py b/services/deal.py index a6fedfe..86574f7 100644 --- a/services/deal.py +++ b/services/deal.py @@ -455,6 +455,44 @@ class DealService(BaseService): url = f"deals/{request.deal_id}?accessToken={access_token}" return DealCreateGuestUrlResponse(ok=True, message='Ссылка успешно создана!', url=url) + async def _create_deal_services_for_prefilling(self, old_deal: models.Deal, new_deal: models.Deal): + for service in old_deal.services: + deal_service = models.secondary.DealService( + service_id=service.service_id, + deal_id=new_deal.id, + quantity=service.quantity, + price=service.price, + ) + self.session.add(deal_service) + + async def _create_deal_products_for_prefilling(self, old_deal: models.Deal, new_deal: models.Deal): + for old_deal_product in old_deal.products: + deal_product = models.secondary.DealProduct( + deal_id=new_deal.id, + product_id=old_deal_product.product.id, + quantity=old_deal_product.quantity + ) + self.session.add(deal_product) + await self.session.flush() + for old_service in old_deal_product.services: + deal_product_service = models.secondary.DealProductService( + deal_id=new_deal.id, + product_id=old_deal_product.product.id, + service_id=old_service.service.id, + price=old_service.price + ) + self.session.add(deal_product_service) + + async def prefill_deal(self, user, request: DealPrefillRequest) -> DealPrefillResponse: + old_deal: models.Deal = await self.get_by_id(user, request.old_deal_id, return_raw=True) + new_deal: models.Deal = await self.get_by_id(user, request.new_deal_id, return_raw=True) + + await self._create_deal_services_for_prefilling(old_deal, new_deal) + await self._create_deal_products_for_prefilling(old_deal, new_deal) + await self.session.commit() + + return DealPrefillResponse(ok=True, message="Сделка успешно предзаполнена") + # endregion # region Deal services