From bbe9832923f8e53e4598b786d3a2d0d3fe5e94cb Mon Sep 17 00:00:00 2001 From: AlexSserb Date: Tue, 12 Nov 2024 14:28:04 +0400 Subject: [PATCH] feat: complete group of deals --- generators/deal_pdf_generator/generator.py | 20 ++------------ services/deal.py | 11 ++++++-- services/deal_group.py | 32 ++++++++++++++++++++++ 3 files changed, 43 insertions(+), 20 deletions(-) create mode 100644 services/deal_group.py diff --git a/generators/deal_pdf_generator/generator.py b/generators/deal_pdf_generator/generator.py index 2e93319..bab3e54 100644 --- a/generators/deal_pdf_generator/generator.py +++ b/generators/deal_pdf_generator/generator.py @@ -9,6 +9,7 @@ from weasyprint import HTML, CSS from constants import DEAL_STATUS_STR, ENV, APP_PATH from generators.deal_pdf_generator.deal_data import DealTechSpecProductData, DealTechSpecData from models import Deal, DealProduct, DealService as DealServiceModel, Product, DealGroup +from services.deal_group import DealGroupService from utils.images_fetcher import fetch_images @@ -90,23 +91,6 @@ class DealTechSpecPdfGenerator: ) return deal - async def _get_deals_by_group_id(self, group_id: int) -> List[Deal]: - group: DealGroup | None = await self._session.scalar( - select(DealGroup) - .where(DealGroup.id == group_id) - .options( - selectinload(DealGroup.deals).selectinload(Deal.products).selectinload(DealProduct.services), - selectinload(DealGroup.deals).selectinload(Deal.products) - .selectinload(DealProduct.product).selectinload(Product.barcodes), - selectinload(DealGroup.deals).selectinload(Deal.services).selectinload(DealServiceModel.service), - selectinload(DealGroup.deals).selectinload(Deal.status_history), - selectinload(DealGroup.deals).selectinload(Deal.group).selectinload(DealGroup.deals), - selectinload(DealGroup.deals).joinedload(Deal.client), - selectinload(DealGroup.deals).joinedload(Deal.shipping_warehouse), - ) - ) - return group.deals if group else [] - def _set_deals_ids_header(self): self.deal_doc["deal_ids_header"] = f"ID: {self.deal.id}" if self.deal.group: @@ -121,7 +105,7 @@ class DealTechSpecPdfGenerator: self._set_deals_ids_header() if deal.group: - deals = await self._get_deals_by_group_id(deal.group.id) + deals = await DealGroupService(self._session).get_deals_by_group_id(deal.group.id) for d in deals: self.deal_doc["deals"].append(d) grouped_products = await self._group_deal_products_by_products(d.products) diff --git a/services/deal.py b/services/deal.py index 77f3f65..1e32ab4 100644 --- a/services/deal.py +++ b/services/deal.py @@ -9,11 +9,13 @@ import models.deal import models.secondary from models import User, Service, Client, DealProductService, deal_relations from models.deal import * +from models.deal_group import DealGroup from schemas.client import ClientDetailsSchema from schemas.deal import * from services.auth import AuthService from services.base import BaseService from services.client import ClientService +from services.deal_group import DealGroupService from services.service import ServiceService from services.shipping_warehouse import ShippingWarehouseService @@ -1044,8 +1046,13 @@ class DealService(BaseService): deal = await self._get_deal_by_id(request.deal_id) if not deal: return DealCompleteResponse(ok=False, message="Сделка не найдена") - deal.is_completed = True - await self.session.commit() + + if deal.group: + await DealGroupService(self.session).complete_group(deal.group.id) + else: + deal.is_completed = True + await self.session.commit() + return DealCompleteResponse(ok=True, message="Сделка успешно завершена") except Exception as e: await self.session.rollback() diff --git a/services/deal_group.py b/services/deal_group.py new file mode 100644 index 0000000..d42a0f7 --- /dev/null +++ b/services/deal_group.py @@ -0,0 +1,32 @@ +from sqlalchemy import select +from sqlalchemy.orm import selectinload + +from models import DealService as DealServiceModel +from models.deal_group import DealGroup +from schemas.deal import * +from services.base import BaseService + + +class DealGroupService(BaseService): + async def get_deals_by_group_id(self, group_id) -> list[Deal]: + group: DealGroup | None = await self.session.scalar( + select(DealGroup) + .where(DealGroup.id == group_id) + .options( + selectinload(DealGroup.deals).selectinload(Deal.products).selectinload(DealProduct.services), + selectinload(DealGroup.deals).selectinload(Deal.products) + .selectinload(DealProduct.product).selectinload(Product.barcodes), + selectinload(DealGroup.deals).selectinload(Deal.services).selectinload(DealServiceModel.service), + selectinload(DealGroup.deals).selectinload(Deal.status_history), + selectinload(DealGroup.deals).selectinload(Deal.group).selectinload(DealGroup.deals), + selectinload(DealGroup.deals).joinedload(Deal.client), + selectinload(DealGroup.deals).joinedload(Deal.shipping_warehouse), + ) + ) + return group.deals if group else [] + + async def complete_group(self, group_id: int) -> None: + deals = await self.get_deals_by_group_id(group_id) + for deal in deals: + deal.is_completed = True + await self.session.commit()