feat: вфыв
This commit is contained in:
		@@ -4,7 +4,7 @@ import models.secondary
 | 
			
		||||
from typing import Union
 | 
			
		||||
import models.deal
 | 
			
		||||
from fastapi import HTTPException
 | 
			
		||||
from sqlalchemy import select, func, update
 | 
			
		||||
from sqlalchemy import select, func, update, delete, insert
 | 
			
		||||
from sqlalchemy.orm import joinedload, selectinload
 | 
			
		||||
 | 
			
		||||
from models import User, Service, Client
 | 
			
		||||
@@ -103,7 +103,8 @@ class DealService(BaseService):
 | 
			
		||||
            client_id=client.id,
 | 
			
		||||
            current_status=DealStatus.CREATED,
 | 
			
		||||
            lexorank=rank,
 | 
			
		||||
            shipping_warehouse_id=shipping_warehouse.id
 | 
			
		||||
            shipping_warehouse_id=shipping_warehouse.id,
 | 
			
		||||
            base_marketplace_key=request.base_marketplace.key
 | 
			
		||||
        )
 | 
			
		||||
        self.session.add(deal)
 | 
			
		||||
        await self.session.flush()
 | 
			
		||||
@@ -183,6 +184,9 @@ class DealService(BaseService):
 | 
			
		||||
            deal: Deal
 | 
			
		||||
            last_status: DealStatusHistory = max(deal.status_history, key=lambda status: status.changed_at)
 | 
			
		||||
            deadline = last_status.next_status_deadline
 | 
			
		||||
            base_marketplace = None
 | 
			
		||||
            if deal.base_marketplace:
 | 
			
		||||
                base_marketplace = BaseMarketplaceSchema.model_validate(deal.base_marketplace)
 | 
			
		||||
            summaries.append(
 | 
			
		||||
                DealSummary(
 | 
			
		||||
                    id=deal.id,
 | 
			
		||||
@@ -192,7 +196,8 @@ class DealService(BaseService):
 | 
			
		||||
                    deadline=deadline,
 | 
			
		||||
                    status=last_status.to_status,
 | 
			
		||||
                    total_price=total_price,
 | 
			
		||||
                    rank=rank
 | 
			
		||||
                    rank=rank,
 | 
			
		||||
                    base_marketplace=base_marketplace
 | 
			
		||||
                )
 | 
			
		||||
            )
 | 
			
		||||
        return DealSummaryResponse(summaries=summaries)
 | 
			
		||||
@@ -214,8 +219,10 @@ class DealService(BaseService):
 | 
			
		||||
                joinedload(Deal.client)
 | 
			
		||||
                .joinedload(Client.details),
 | 
			
		||||
                selectinload(Deal.services)
 | 
			
		||||
                .joinedload(models.secondary.DealService.service)
 | 
			
		||||
                .joinedload(Service.category),
 | 
			
		||||
                .options(
 | 
			
		||||
                    joinedload(models.secondary.DealService.service).joinedload(Service.category),
 | 
			
		||||
                    selectinload(models.secondary.DealService.employees)
 | 
			
		||||
                ),
 | 
			
		||||
                selectinload(Deal.products)
 | 
			
		||||
                .joinedload(models.secondary.DealProduct.product)
 | 
			
		||||
                .joinedload(models.Product.client),
 | 
			
		||||
@@ -224,7 +231,10 @@ class DealService(BaseService):
 | 
			
		||||
                .joinedload(models.Product.barcodes),
 | 
			
		||||
                selectinload(Deal.products)
 | 
			
		||||
                .joinedload(models.secondary.DealProduct.services)
 | 
			
		||||
                .joinedload(models.secondary.DealProductService.service),
 | 
			
		||||
                .options(
 | 
			
		||||
                    joinedload(models.secondary.DealProductService.service),
 | 
			
		||||
                    selectinload(models.secondary.DealProductService.employees)
 | 
			
		||||
                ),
 | 
			
		||||
                selectinload(Deal.status_history)
 | 
			
		||||
                .joinedload(DealStatusHistory.user),
 | 
			
		||||
                selectinload(Deal.status_history)
 | 
			
		||||
@@ -439,13 +449,43 @@ class DealService(BaseService):
 | 
			
		||||
                raise HTTPException(status_code=404, detail="Сделка не найдена")
 | 
			
		||||
            service_dict = request.service.dict()
 | 
			
		||||
            del service_dict['service']
 | 
			
		||||
            del service_dict['employees']
 | 
			
		||||
 | 
			
		||||
            service_dict['service_id'] = request.service.service.id
 | 
			
		||||
 | 
			
		||||
            await self.session.execute(
 | 
			
		||||
                update(models.secondary.DealService)
 | 
			
		||||
                .where(models.secondary.DealService.deal_id == request.deal_id,
 | 
			
		||||
                       models.secondary.DealService.service_id == request.service.service.id)
 | 
			
		||||
                .values(**service_dict)
 | 
			
		||||
            )
 | 
			
		||||
 | 
			
		||||
            # Updating deleting previous employees
 | 
			
		||||
            delete_stmt = (
 | 
			
		||||
                delete(
 | 
			
		||||
                    models.deal_service_employees
 | 
			
		||||
                )
 | 
			
		||||
                .where(
 | 
			
		||||
                    models.deal_service_employees.c.deal_id == request.deal_id,
 | 
			
		||||
                    models.deal_service_employees.c.service_id == request.service.service.id,
 | 
			
		||||
                )
 | 
			
		||||
            )
 | 
			
		||||
            await self.session.execute(delete_stmt)
 | 
			
		||||
            await self.session.flush()
 | 
			
		||||
            insert_data = []
 | 
			
		||||
            for employee in request.service.employees:
 | 
			
		||||
                insert_data.append({
 | 
			
		||||
                    'deal_id': request.deal_id,
 | 
			
		||||
                    'service_id': request.service.service.id,
 | 
			
		||||
                    'user_id': employee.id
 | 
			
		||||
                })
 | 
			
		||||
            if insert_data:
 | 
			
		||||
                await self.session.execute(
 | 
			
		||||
                    insert(models.deal_service_employees),
 | 
			
		||||
                    insert_data
 | 
			
		||||
                )
 | 
			
		||||
                await self.session.flush()
 | 
			
		||||
 | 
			
		||||
            await self.session.commit()
 | 
			
		||||
            return DealUpdateServiceQuantityResponse(ok=True, message='Услуга успешно обновлена')
 | 
			
		||||
        except Exception as e:
 | 
			
		||||
@@ -586,6 +626,35 @@ class DealService(BaseService):
 | 
			
		||||
            # Updating product
 | 
			
		||||
            deal_product.quantity = request.product.quantity
 | 
			
		||||
 | 
			
		||||
            # Updating deleting old employees
 | 
			
		||||
            delete_stmt = (
 | 
			
		||||
                delete(
 | 
			
		||||
                    models.deal_product_service_employees
 | 
			
		||||
                )
 | 
			
		||||
                .where(
 | 
			
		||||
                    models.deal_product_service_employees.c.deal_id == request.deal_id,
 | 
			
		||||
                    models.deal_product_service_employees.c.service_id.in_(request_services.union(database_services)),
 | 
			
		||||
                    models.deal_product_service_employees.c.product_id == request.product.product.id
 | 
			
		||||
                )
 | 
			
		||||
            )
 | 
			
		||||
            await self.session.execute(delete_stmt)
 | 
			
		||||
            await self.session.flush()
 | 
			
		||||
 | 
			
		||||
            insert_data = []
 | 
			
		||||
            for service in request.product.services:
 | 
			
		||||
                service: DealProductServiceSchema
 | 
			
		||||
                for employee in service.employees:
 | 
			
		||||
                    insert_data.append({
 | 
			
		||||
                        'deal_id': request.deal_id,
 | 
			
		||||
                        'service_id': service.service.id,
 | 
			
		||||
                        'product_id': request.product.product.id,
 | 
			
		||||
                        'user_id': employee.id
 | 
			
		||||
                    })
 | 
			
		||||
            if insert_data:
 | 
			
		||||
                await self.session.execute(insert(models.deal_product_service_employees),
 | 
			
		||||
                                           insert_data)
 | 
			
		||||
                await self.session.flush()
 | 
			
		||||
 | 
			
		||||
            await self.session.commit()
 | 
			
		||||
            return DealUpdateProductResponse(ok=True, message='Товар успешно обновлен')
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user