public void Given_valid_viewmodel_is_entered_with_registered_employee_When_update_is_clicked_with_site_id_selected_Then_correct_user_service_is_called()
        {
            // Given
            var controller = CreateUserRoleController();

            var viewModel = new AddUsersViewModel
            {
                CompanyId = 999L,
                EmployeeId = Guid.NewGuid(),
                UserId = Guid.NewGuid(),
                RoleId = Guid.NewGuid(),
                SiteId = 10,
                SiteGroupId = null,
                EmployeeAlreadyExistsAsUser = true
            };

            _userPermissionsViewModelFactory.Setup(x => x.GetViewModel(viewModel.CompanyId, viewModel.EmployeeId, true, true)).Returns(
               new AddUsersViewModel());

            // When
            controller.UpdateUser(viewModel);

            // Then
            _userService.Verify(x => x.SetRoleAndSite(It.Is<SetUserRoleAndSiteRequest>(
                y => y.CompanyId == viewModel.CompanyId
                    && y.UserToUpdateId == viewModel.UserId
                    && y.RoleId == viewModel.RoleId
                    && y.SiteId == viewModel.SiteId
                )));

            _cacheHelper.Verify(x => x.RemoveUser(viewModel.UserId));

            Assert.IsTrue(controller.ModelState.IsValid);
        }
        public void Setup()
        {
            _baseAddUsersViewModel = new AddUsersViewModel
            {
                CompanyId = 999L,
                EmployeeId = Guid.NewGuid(),
                UserId = Guid.NewGuid(),
                RoleId = Guid.NewGuid(),
                SiteId = 10,
                SiteGroupId = null
            };

            _baseEmployeeDto = new EmployeeDto
            {
                Id = _baseAddUsersViewModel.EmployeeId,
                MainContactDetails = new EmployeeContactDetailDto
                {
                    Email = "*****@*****.**",
                    Telephone2 = "333444555"
                }
            };
            _employeeService = new Mock<IEmployeeService>();
            _employeeService
                .Setup(x => x.ValidateRegisterAsUser(It.IsAny<CreateEmployeeAsUserRequest>()))
                .Returns(new ValidationResult());
            _employeeService
                .Setup(x => x.GetEmployee(It.IsAny<Guid>(), It.IsAny<long>()))
                .Returns(_baseEmployeeDto);
            _employeeService
                .Setup(x => x.CreateUser(It.IsAny<CreateEmployeeAsUserRequest>()));


            _newUserId = Guid.NewGuid();
            _newRegistrationRequestService = new Mock<INewRegistrationRequestService>();
            _newRegistrationRequestService
                .Setup(x => x.RegisterNonAdminUser(It.IsAny<RegisterNonAdminUserRequest>()))
                .Returns(_newUserId);

            _newRegistrationRequestService
                .Setup(x => x.HasEmailBeenRegistered(It.IsAny<string>()))
                .Returns(false);

            _userPermissionsViewModelFactory = new Mock<IAddUsersViewModelFactory>();
            _userPermissionsViewModelFactory
                .Setup(x => x.GetViewModel(It.IsAny<long>(), It.IsAny<Guid>(), It.IsAny<bool>(), It.IsAny<bool>()))
                .Returns(new AddUsersViewModel());

            _userPermissionsViewModelFactory
                .Setup(x => x.WithCurrentUser(It.IsAny<ICustomPrincipal>()))
                .Returns(_userPermissionsViewModelFactory.Object);
        }
        public CreateEmployeeAsUserRequest Map(AddUsersViewModel viewModel, Guid actioningUserId)
        {
            var siteId = default(long);
            if(viewModel.SiteGroupId.HasValue) siteId = viewModel.SiteGroupId.Value;
            if(viewModel.SiteId.HasValue) siteId = viewModel.SiteId.Value;

            return new CreateEmployeeAsUserRequest
                       {
                           EmployeeId = viewModel.EmployeeId,
                           NewUserId = viewModel.UserId,
                           CompanyId = viewModel.CompanyId,
                           RoleId = viewModel.RoleId,
                           SiteId = siteId,
                           ActioningUserId = actioningUserId,
                           MainSiteId = viewModel.MainSiteId
                       };
        }
 public SetUserRoleAndSiteRequest Map(AddUsersViewModel viewModel, Guid actioningUserId)
 {
     var siteId = default(long);
     if(viewModel.SiteGroupId.HasValue) siteId = viewModel.SiteGroupId.Value;
     if(viewModel.SiteId.HasValue) siteId = viewModel.SiteId.Value;
     if(viewModel.PermissionsApplyToAllSites)
     {
         siteId = viewModel.MainSiteId;
     }
     return new SetUserRoleAndSiteRequest
                {
                    UserToUpdateId = viewModel.UserId,
                    RoleId = viewModel.RoleId,
                    SiteId = siteId,
                    ActioningUserId = actioningUserId,
                    CompanyId = viewModel.CompanyId,
                    PermissionsApplyToAllSites = viewModel.PermissionsApplyToAllSites,
                };
 }
        public ActionResult CreateUser(AddUsersViewModel viewModel)
        {
            if (!ModelState.IsValid)
            {
                return View("Index", RehydrateViewModel(viewModel));
            }

            CreateEmployeeAsUserRequest registerEmployeeAsUserRequest = new RegisterEmployeeAsUserRequestMapper().Map(viewModel, CurrentUser.UserId);
            var employee = _employeeService.GetEmployee(viewModel.EmployeeId, CurrentUser.CompanyId);

            if (!RegistrationAttemptIsValid(employee, registerEmployeeAsUserRequest))
                return View("Index", RehydrateViewModel(viewModel));

            RegisterEmployeeAsUser(employee, registerEmployeeAsUserRequest);

            return viewModel.CanChangeEmployeeDdl
                ? RedirectToAction("Index", new { companyId = CurrentUser.CompanyId, saveSuccess = true })
                : RedirectToAction("Index", "ViewUsers", new { companyId = CurrentUser.CompanyId });
        }
        public void Given_valid_viewmodel_with_deleted_user_When_update_is_clicked_with_site_id_selected_Then_correct_user_service_is_called()
        {
            // Given
            var controller = CreateUserRoleController();

            var viewModel = new AddUsersViewModel
            {
                CompanyId = 999L,
                EmployeeId = Guid.NewGuid(),
                UserId = Guid.NewGuid(),
                RoleId = Guid.NewGuid(),
                SiteId = 10,
                SiteGroupId = null,
                EmployeeAlreadyExistsAsUser = true,
                IsUserDeleted = true
            };

            _userPermissionsViewModelFactory.Setup(x => x.GetViewModel(viewModel.CompanyId, viewModel.EmployeeId, true, true)).Returns(
               new AddUsersViewModel());

            UserDto user = new UserDto
                               {
                                   Id = Guid.NewGuid(),
                                   Employee = new EmployeeDto
                                                  {
                                                      MainContactDetails = new EmployeeContactDetailDto
                                                                               {
                                                                                   Email = "*****@*****.**",
                                                                                   Telephone1 = "098098",
                                                                                   Telephone2 = "098098"

                                                                               }
                                                  }
                               };
            _userService.Setup(x => x.GetByIdAndCompanyIdIncludeDeleted(It.IsAny<Guid>(), It.IsAny<long>())).Returns(
                user);
            // When
            controller.UpdateUser(viewModel);

            // Then
            _userService.Verify(
                x => x.ReinstateUser(viewModel.UserId, TestControllerHelpers.UserIdAssigned));
        }
        public ActionResult UpdateUser(AddUsersViewModel viewModel)
        {
            if (!ModelState.IsValid)
            {
                return View("Index", RehydrateViewModel(viewModel));
            }

            if (viewModel.IsUserDeleted)
            {
                var user = _userService.GetByIdAndCompanyIdIncludeDeleted(viewModel.UserId, viewModel.CompanyId);
                
                if (_newRegistrationRequestService.HasEmailBeenRegistered(user.Employee.MainContactDetails.Email))
                {
                    ModelState.AddModelError("User", "Sorry you are unable to reinstate this user: the email address has been registered to another user");
                    return View("Index", RehydrateViewModel(viewModel));
                }
                
                _userService.ReinstateUser(viewModel.UserId, CurrentUser.UserId);  
            }

            var request = new SetUserRoleAndSiteRequestMapper().Map(viewModel, CurrentUser.UserId);
            _userService.SetRoleAndSite(request);

            _cacheHelper.RemoveUser(viewModel.UserId); 

            if (viewModel.CanChangeEmployeeDdl)
                return RedirectToAction("Index", new { companyId = viewModel.CompanyId, saveSuccess = true });
            
            return RedirectToAction("Index", "ViewUsers", new { companyId = viewModel.CompanyId });
        }
 private AddUsersViewModel RehydrateViewModel(AddUsersViewModel viewModel)
 {
     return _addUsersViewModelFactory
         .WithCurrentUser(CurrentUser)
         .GetViewModel(viewModel.CompanyId, viewModel.EmployeeId, false, viewModel.CanChangeEmployeeDdl);
 }
        public AddUsersViewModel GetViewModel()
        {
            var viewModel = new AddUsersViewModel();

            //var employeesNotRegisteredAsUsers = _employeeService.GetEmployeesNotRegisteredAsUsers(_companyId);
            //var employeesRegisteredAsUsers = _employeeService.GetEmployeesRegisteredAsUsers(_companyId);

            //var employees = employeesNotRegisteredAsUsers.Union(employeesRegisteredAsUsers);

            var employees = _employeeService.Search(new SearchEmployeesRequest
                                                    {
                                                        CompanyId = _companyId,
                                                        ShowDeleted = false,
                                                        ExcludeWithActiveUser = true
                                                    });

            var roles = _rolesService.GetAllRoles(_companyId);

            var sites = _siteService.GetByCompanyId(_companyId);
            var siteGroups = _siteGroupService.GetByCompanyId(_companyId);

            viewModel.MainSiteId = sites.Where(x => x.IsMainSite).Select(x => x.Id).Single();

            viewModel.CompanyId = _companyId;


            viewModel.Employees = employees
                                        .OrderBy(x => x.FullName)
                                        .Select(AutoCompleteViewModel.ForEmployee)
                                        .AddDefaultOption();

            viewModel.Roles = roles
                                    .Where(role => role.Name != "UserAdmin")
                                    .Select(AutoCompleteViewModel.ForRole)
                                    .AddDefaultOption();

            viewModel.SiteGroups = siteGroups
                                        .Select(AutoCompleteViewModel.ForSiteGroup)
                                        .AddDefaultOption();

            viewModel.Sites = sites
                                   .Select(AutoCompleteViewModel.ForSite)
                                   .AddDefaultOption();

            viewModel.SaveSuccessNotificationVisible = _saveSuccessNotificationVisible;
            viewModel.CanChangeEmployeeDdl = _canChangeEmployee;
            viewModel.CanChangeRoleDdl = true;

            if (_employeeId != default(Guid))
            {
                viewModel.SaveCancelButtonsVisible = true;
                viewModel.EmployeeId = _employeeId;

                //todo: change this call to call Peninsula Online - that way we can see if the employee is already registered
                //as a user for other systems. If it is, then we need that User Guid, rather than creating a new one as below
                //because we need it to have the same ID.
                var employee = _employeeService.GetEmployee(_employeeId, _companyId);

                viewModel.EmployeeName = employee.FullName;
                viewModel.EmployeeReference = employee.EmployeeReference;
                viewModel.JobTitle = employee.JobTitle;
                //Todo: store employee department?
                viewModel.Department = "NOT AVAILABLE";
                //Todo: store manager?
                viewModel.ManagerName = "NOT AVAILABLE";

                if (employee.User != null)
                {
                    viewModel.EmployeeAlreadyExistsAsUser = true;
                    viewModel.UserId = employee.User.Id;
                    viewModel.IsUserDeleted = employee.User.Deleted;
                    viewModel.IsUserRegistered = employee.User.IsRegistered;
                    viewModel.RoleId = employee.User.Role.Id;
                    viewModel.RoleDescription = employee.User.Role.Description;

                    if (employee.User.SiteStructureElement != null)
                    {
                        viewModel.PermissionsApplyToAllSites = employee.User.SiteStructureElement.IsMainSite;

                        if (viewModel.PermissionsApplyToAllSites == false)
                        {
                            if (employee.User.SiteStructureElement.GetType() == typeof(SiteGroupDto))
                                viewModel.SiteGroupId = employee.User.SiteStructureElement.Id;
                            else if (employee.User.SiteStructureElement.GetType() == typeof(SiteDto))
                                viewModel.SiteId = employee.User.SiteStructureElement.Id;
                        }
                    }

                    if (_currentUser != null
                        && employee.User.Role.Description == "User Admin"
                        && _currentUser.UserId == employee.User.Id)
                    {
                        viewModel.CanChangeRoleDdl = false;
                    }
                }
                else
                {
                    viewModel.EmployeeAlreadyExistsAsUser = false;
                    viewModel.UserId = Guid.NewGuid();
                }
            }
            else
            {
                viewModel.SaveCancelButtonsVisible = false;
            }

            return viewModel;
        }