Exemple #1
0
        public async Task Execute(ReassignEmployeeOperationRequest request)
        {
            if (request.EmployeeId == request.ManagerId)
            {
                throw new ApplicationException("An employee can't manage himself.");
            }

            bool isAuthorizedToReassign = await _authorizationContext.IsAuthorizedForEmployee(request.EmployeeId) &&
                                          await _authorizationContext.IsAuthorizedForEmployee(request.ManagerId);

            if (!isAuthorizedToReassign)
            {
                throw new ApplicationException($"Not authorized to reassign employee {request.EmployeeId}");
            }

            var employeeToAssign = await _employeeRepository.GetByIdAsync(request.EmployeeId);

            var myTeamTree = await _authorizationContext.GetTeamTree();

            var reassignedEmployeeTeamTree = myTeamTree
                                             .FindAnyOrDefault(
                team => team.Employees.Select(employee => employee.ManagedTeam),
                team => team.Manager.Id == employeeToAssign.Id);

            var subordinates = reassignedEmployeeTeamTree?.GetAllEmployees() ?? new List <Domain.Entity.LearningCalendar.Employee>();

            bool isNewManagerASubordinate = subordinates.Any(subordinate => subordinate.Id == request.ManagerId);

            if (isNewManagerASubordinate)
            {
                throw new ApplicationException("Can't reassign an employee to his subordinate");
            }

            var ensureNewManagerHasTeamRequest = new EnsureManagerHasTeamRequest
            {
                ManagerId = request.ManagerId
            };
            await _ensureManagerHasTeamOperation.Execute(ensureNewManagerHasTeamRequest);

            var newManager = await _employeeRepository.GetByIdAsync(request.ManagerId);

            employeeToAssign.Team = newManager.ManagedTeam;

            await _employeeRepository.UpdateAsync(employeeToAssign);
        }
Exemple #2
0
        public async Task <IActionResult> UpdateEmployee(ReassignEmployeeModel model)
        {
            var request = new ReassignEmployeeOperationRequest
            {
                EmployeeId = model.EmployeeId,
                ManagerId  = model.ManagerId
            };

            try
            {
                await _reassignEmployeeOperation.Execute(request);
            }
            catch (ApplicationException ex)
            {
                return(BadRequest(new ErrorModel(ex.Message)));
            }

            return(Ok());
        }