feat: filling deals from excel file
This commit is contained in:
@@ -1218,6 +1218,92 @@ class DealService(BaseService):
|
||||
free_employees = (await self.session.execute(stmt_free_employees)).scalars().all()
|
||||
return GetAvailableEmployeesToAssignResponse(employees=free_employees)
|
||||
|
||||
async def _create_deal_from_excel(
|
||||
self,
|
||||
client: Client,
|
||||
breakdown: CityBreakdownFromExcelSchema,
|
||||
user: User,
|
||||
) -> Deal:
|
||||
rank = await self._get_rank_for_deal(DealStatus.CREATED)
|
||||
deal = Deal(
|
||||
name=f"{client.name} - {breakdown.base_marketplace.key.upper()} - {breakdown.shipping_warehouse.name}",
|
||||
created_at=datetime.datetime.now(),
|
||||
current_status=DealStatus.CREATED,
|
||||
lexorank=rank,
|
||||
client_id=client.id,
|
||||
base_marketplace_key=breakdown.base_marketplace.key,
|
||||
shipping_warehouse_id=breakdown.shipping_warehouse.id,
|
||||
)
|
||||
|
||||
self.session.add(deal)
|
||||
await self.session.flush()
|
||||
await self.change_status(deal, DealStatus.AWAITING_ACCEPTANCE, user)
|
||||
|
||||
return deal
|
||||
|
||||
async def _create_group(self) -> DealGroup:
|
||||
group = models.DealGroup(
|
||||
name='',
|
||||
lexorank=lexorank.middle(lexorank.Bucket.BUCEKT_0).__str__(),
|
||||
)
|
||||
self.session.add(group)
|
||||
await self.session.flush()
|
||||
return group
|
||||
|
||||
async def _get_or_create_warehouse(
|
||||
self,
|
||||
shipping_warehouse: OptionalShippingWarehouseSchema,
|
||||
) -> OptionalShippingWarehouseSchema:
|
||||
if not shipping_warehouse.id:
|
||||
stmt = select(ShippingWarehouse).where(ShippingWarehouse.name == shipping_warehouse.name)
|
||||
row = (await self.session.execute(stmt)).first()
|
||||
warehouse_model: Optional[ShippingWarehouse] = row[0] if row else None
|
||||
if warehouse_model:
|
||||
shipping_warehouse.id = warehouse_model.id
|
||||
else:
|
||||
warehouse = await ShippingWarehouseService(self.session).create_by_name(shipping_warehouse.name)
|
||||
shipping_warehouse.id = warehouse.id
|
||||
|
||||
return shipping_warehouse
|
||||
|
||||
async def create_deals_from_excel(
|
||||
self,
|
||||
request: CreateDealsFromExcelRequest,
|
||||
user: User,
|
||||
) -> CreateDealsFromExcelResponse:
|
||||
client: Optional[Client] = await self.session.get(Client, request.client_id)
|
||||
if not client:
|
||||
return CreateDealsFromExcelResponse(ok=False, message=f"Клиент с ID {request.client_id} не найден")
|
||||
|
||||
deals_dict: dict[str, Deal] = {}
|
||||
group = await self._create_group()
|
||||
|
||||
for product_data in request.products:
|
||||
for breakdown in product_data.cities_breakdown:
|
||||
breakdown.shipping_warehouse = await self._get_or_create_warehouse(breakdown.shipping_warehouse)
|
||||
|
||||
key = f"{breakdown.shipping_warehouse.id} - {breakdown.base_marketplace.key}"
|
||||
deal = deals_dict.get(key)
|
||||
if not deal:
|
||||
deal = await self._create_deal_from_excel(client, breakdown, user)
|
||||
deals_dict[key] = deal
|
||||
|
||||
insert_stmt = insert(deal_relations).values({
|
||||
'deal_id': deal.id,
|
||||
'group_id': group.id
|
||||
})
|
||||
await self.session.execute(insert_stmt)
|
||||
|
||||
deal_product = DealProduct(
|
||||
deal_id=deal.id,
|
||||
product_id=product_data.product_id,
|
||||
quantity=breakdown.quantity,
|
||||
)
|
||||
self.session.add(deal_product)
|
||||
|
||||
await self.session.commit()
|
||||
return CreateDealsFromExcelResponse(ok=True, message="Сделки успешно созданы")
|
||||
|
||||
async def add_to_group(self, user: User, request: DealAddToGroupRequest) -> DealAddToGroupResponse:
|
||||
try:
|
||||
group_bill_request = await self.session.get(GroupBillRequest, request.group_id)
|
||||
@@ -1254,14 +1340,8 @@ class DealService(BaseService):
|
||||
try:
|
||||
# getting lexorank for grop
|
||||
|
||||
group = models.DealGroup(
|
||||
name='',
|
||||
lexorank=lexorank.middle(lexorank.Bucket.BUCEKT_0).__str__(),
|
||||
group = await self._create_group()
|
||||
|
||||
)
|
||||
|
||||
self.session.add(group)
|
||||
await self.session.flush()
|
||||
for deal_id in [request.dragging_deal_id, request.hovered_deal_id]:
|
||||
insert_stmt = insert(deal_relations).values({
|
||||
'deal_id': deal_id,
|
||||
@@ -1339,7 +1419,7 @@ class DealService(BaseService):
|
||||
await self.session.rollback()
|
||||
return DealGroupChangeStatusResponse(ok=False, message=str(e))
|
||||
|
||||
async def get_deals_grouped(self, deal:models.Deal)->List[models.Deal]:
|
||||
async def get_deals_grouped(self, deal: models.Deal) -> List[models.Deal]:
|
||||
if not deal.group:
|
||||
return [deal]
|
||||
deals = await self.session.scalars(
|
||||
@@ -1354,4 +1434,4 @@ class DealService(BaseService):
|
||||
.where(Deal.group == deal.group)
|
||||
)
|
||||
deals = list(deals.all())
|
||||
return deals
|
||||
return deals
|
||||
|
||||
Reference in New Issue
Block a user