feat: assignment of employees to deals
This commit is contained in:
		@@ -1,7 +1,7 @@
 | 
			
		||||
import lexorank
 | 
			
		||||
from attr import dataclass
 | 
			
		||||
from fastapi import HTTPException
 | 
			
		||||
from sqlalchemy import select, func, update, delete, insert
 | 
			
		||||
from sqlalchemy import select, func, update, delete, insert, and_
 | 
			
		||||
from sqlalchemy.orm import joinedload, selectinload
 | 
			
		||||
from starlette import status
 | 
			
		||||
 | 
			
		||||
@@ -339,6 +339,8 @@ class DealService(BaseService):
 | 
			
		||||
                selectinload(Deal.boxes)
 | 
			
		||||
                .selectinload(Box.product)
 | 
			
		||||
                .noload(Product.barcodes),
 | 
			
		||||
                selectinload(Deal.assignments)
 | 
			
		||||
                .joinedload(Assignment.user),
 | 
			
		||||
            )
 | 
			
		||||
            .where(Deal.id == deal_id)
 | 
			
		||||
        )
 | 
			
		||||
@@ -1136,7 +1138,6 @@ class DealService(BaseService):
 | 
			
		||||
        for deal in deals:
 | 
			
		||||
            await self._recalculate_price_single(deal, services_quantity)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    async def recalculate_price(self, request: DealRecalculatePriceRequest) -> DealRecalculatePriceResponse:
 | 
			
		||||
        try:
 | 
			
		||||
            deal_stmt = (
 | 
			
		||||
@@ -1164,6 +1165,59 @@ class DealService(BaseService):
 | 
			
		||||
        except Exception as e:
 | 
			
		||||
            return DealRecalculatePriceResponse(ok=False, message=str(e))
 | 
			
		||||
 | 
			
		||||
    async def _assign_employee(self, deal: Deal, user: User) -> tuple[bool, str]:
 | 
			
		||||
        assigned_employee_ids = [assignment.user_id for assignment in deal.assignments]
 | 
			
		||||
        if user.id in assigned_employee_ids:
 | 
			
		||||
            return False, "Работник уже назначен"
 | 
			
		||||
 | 
			
		||||
        assignment = Assignment(user_id=user.id, deal_id=deal.id, created_at=datetime.datetime.now())
 | 
			
		||||
        self.session.add(assignment)
 | 
			
		||||
        await self.session.commit()
 | 
			
		||||
 | 
			
		||||
        return True, "Работник успешно назначен"
 | 
			
		||||
 | 
			
		||||
    async def _unassign_employee(self, deal: Deal, user: User) -> tuple[bool, str]:
 | 
			
		||||
        assigned_employee_ids = [assignment.user_id for assignment in deal.assignments]
 | 
			
		||||
        if user.id not in assigned_employee_ids:
 | 
			
		||||
            return False, "Работник еще не назначен"
 | 
			
		||||
 | 
			
		||||
        stmt = delete(Assignment).where(and_(Assignment.user_id == user.id, Assignment.deal_id == deal.id))
 | 
			
		||||
        await self.session.execute(stmt)
 | 
			
		||||
        await self.session.commit()
 | 
			
		||||
 | 
			
		||||
        return True, "Работник успешно удален"
 | 
			
		||||
 | 
			
		||||
    async def manage_employee(self, request: ManageEmployeeRequest) -> ManageEmployeeResponse:
 | 
			
		||||
        deal: Optional[Deal] = await self._get_deal_by_id(request.deal_id)
 | 
			
		||||
        if not deal:
 | 
			
		||||
            return ManageEmployeeResponse(ok=False, message=f"Сделка с ID {request.deal_id} не найдена")
 | 
			
		||||
 | 
			
		||||
        user: Optional[User] = await self.session.get(User, request.user_id)
 | 
			
		||||
        if not user:
 | 
			
		||||
            return ManageEmployeeResponse(ok=False, message=f"Пользователь с ID {request.user_id} не найден")
 | 
			
		||||
 | 
			
		||||
        if request.is_assign:
 | 
			
		||||
            ok, message = await self._assign_employee(deal, user)
 | 
			
		||||
        else:
 | 
			
		||||
            ok, message = await self._unassign_employee(deal, user)
 | 
			
		||||
 | 
			
		||||
        return ManageEmployeeResponse(ok=ok, message=message)
 | 
			
		||||
 | 
			
		||||
    async def get_available_employees_to_assign(self, deal_id: int) -> GetAvailableEmployeesToAssignResponse:
 | 
			
		||||
        assigned_users = select(Assignment.user_id).where(Assignment.deal_id == deal_id)
 | 
			
		||||
 | 
			
		||||
        stmt_free_employees = (
 | 
			
		||||
            select(User)
 | 
			
		||||
            .where(and_(
 | 
			
		||||
                User.is_deleted == False,
 | 
			
		||||
                User.role_key == "employee",
 | 
			
		||||
                User.id.not_in(assigned_users),
 | 
			
		||||
            ))
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
        free_employees = (await self.session.execute(stmt_free_employees)).scalars().all()
 | 
			
		||||
        return GetAvailableEmployeesToAssignResponse(employees=free_employees)
 | 
			
		||||
 | 
			
		||||
    async def add_to_group(self, user: User, request: DealAddToGroupRequest) -> DealAddToGroupResponse:
 | 
			
		||||
        try:
 | 
			
		||||
            group_bill_request = await self.session.get(GroupBillRequest, request.group_id)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user