feat: complete group of deals
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
@@ -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
32
services/deal_group.py
Normal 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()
|
||||||
Reference in New Issue
Block a user