feat: complete group of deals

This commit is contained in:
2024-11-12 14:28:04 +04:00
parent 1dde0089b9
commit bbe9832923
3 changed files with 43 additions and 20 deletions

View File

@@ -9,6 +9,7 @@ from weasyprint import HTML, CSS
from constants import DEAL_STATUS_STR, ENV, APP_PATH from constants import DEAL_STATUS_STR, ENV, APP_PATH
from generators.deal_pdf_generator.deal_data import DealTechSpecProductData, DealTechSpecData from generators.deal_pdf_generator.deal_data import DealTechSpecProductData, DealTechSpecData
from models import Deal, DealProduct, DealService as DealServiceModel, Product, DealGroup from models import Deal, DealProduct, DealService as DealServiceModel, Product, DealGroup
from services.deal_group import DealGroupService
from utils.images_fetcher import fetch_images from utils.images_fetcher import fetch_images
@@ -90,23 +91,6 @@ class DealTechSpecPdfGenerator:
) )
return deal 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): def _set_deals_ids_header(self):
self.deal_doc["deal_ids_header"] = f"ID: {self.deal.id}" self.deal_doc["deal_ids_header"] = f"ID: {self.deal.id}"
if self.deal.group: if self.deal.group:
@@ -121,7 +105,7 @@ class DealTechSpecPdfGenerator:
self._set_deals_ids_header() self._set_deals_ids_header()
if deal.group: 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: for d in deals:
self.deal_doc["deals"].append(d) self.deal_doc["deals"].append(d)
grouped_products = await self._group_deal_products_by_products(d.products) grouped_products = await self._group_deal_products_by_products(d.products)

View File

@@ -9,11 +9,13 @@ import models.deal
import models.secondary import models.secondary
from models import User, Service, Client, DealProductService, deal_relations from models import User, Service, Client, DealProductService, deal_relations
from models.deal import * from models.deal import *
from models.deal_group import DealGroup
from schemas.client import ClientDetailsSchema from schemas.client import ClientDetailsSchema
from schemas.deal import * from schemas.deal import *
from services.auth import AuthService from services.auth import AuthService
from services.base import BaseService from services.base import BaseService
from services.client import ClientService from services.client import ClientService
from services.deal_group import DealGroupService
from services.service import ServiceService from services.service import ServiceService
from services.shipping_warehouse import ShippingWarehouseService from services.shipping_warehouse import ShippingWarehouseService
@@ -1044,8 +1046,13 @@ class DealService(BaseService):
deal = await self._get_deal_by_id(request.deal_id) deal = await self._get_deal_by_id(request.deal_id)
if not deal: if not deal:
return DealCompleteResponse(ok=False, message="Сделка не найдена") 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="Сделка успешно завершена") return DealCompleteResponse(ok=True, message="Сделка успешно завершена")
except Exception as e: except Exception as e:
await self.session.rollback() await self.session.rollback()

32
services/deal_group.py Normal file
View File

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