feat: filling deals from excel file

This commit is contained in:
2024-12-25 21:14:00 +04:00
parent e8af9f2237
commit 2abc198a39
6 changed files with 302 additions and 12 deletions

View File

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