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