public void Given_valid_request_When_register_employee_as_user_called_Then_should_call_correct_methods()
        {
            // Given
            var request = new CreateEmployeeAsUserRequest
                              {
                                  CompanyId = 1,
                                  EmployeeId = Guid.NewGuid(),
                                  NewUserId = Guid.NewGuid(),
                                  RoleId = Guid.NewGuid(),
                                  SiteId = 66L,
                                  ActioningUserId = Guid.NewGuid()
                              };

            var target = CreateEmployeeService();

            _employeeRepository
                .Setup(x => x.GetByIdAndCompanyId(request.EmployeeId, request.CompanyId))
                .Returns(new Employee {Id = request.EmployeeId, CompanyId = request.CompanyId});

            _registerEmployeeAsUserParametersMapper
                .Setup(x => x.Map(request))
                .Returns(new RegisterEmployeeAsUserParameters
                             {
                                 NewUserId = request.NewUserId,
                                 Role = new Role {Id = request.RoleId},
                                 Site = new Site {Id = request.SiteId, ClientId = request.CompanyId},
                                 ActioningUser = new UserForAuditing {Id = request.ActioningUserId, CompanyId = request.CompanyId},
                                 CompanyId = request.CompanyId
                             });
            // When
            target.CreateUser(request);

            // Then
            _employeeRepository.Verify(x => x.SaveOrUpdate(It.Is<Employee>(
                y => y.Id == request.EmployeeId
                && y.CompanyId == request.CompanyId
                && y.LastModifiedBy.Id == request.ActioningUserId
                && y.LastModifiedOn.HasValue
                && y.User != null
                && y.User.Id == request.NewUserId
                && y.User.CompanyId == request.CompanyId
                && y.User.Site != null
                && y.User.Site.Id == request.SiteId
                && y.User.Role != null
                && y.User.Role.Id == request.RoleId
                && y.User.CreatedBy != null
                && y.User.CreatedBy.Id == request.ActioningUserId
                && y.User.CreatedOn.HasValue 
                )));
        }
        public RegisterEmployeeAsUserParameters Map(CreateEmployeeAsUserRequest request)
        {
            var parameters = new RegisterEmployeeAsUserParameters
                                 {
                                     NewUserId = request.NewUserId,
                                     CompanyId = request.CompanyId
                                 };
            parameters.ActioningUser = _userForAuditingRepository.GetByIdAndCompanyId(request.ActioningUserId, request.CompanyId);
            if (request.MainSiteId != default(long)) parameters.MainSite = _siteRepository.GetByIdAndCompanyId(request.MainSiteId, request.CompanyId);
            if (request.RoleId != default(Guid)) parameters.Role = _roleRepository.GetByIdAndCompanyId(request.RoleId, request.CompanyId);
            if (request.PermissionsForAllSites)
                parameters.Site = _siteRepository.GetByCompanyId(request.CompanyId).First(x => x.IsMainSite);
            else
            {
                if (request.SiteId != default(long)) parameters.Site = _siteRepository.GetByIdAndCompanyId(request.SiteId, request.CompanyId);
            }

            return parameters;
        }
        public void Given_valid_request_When_ValidateRegisterAsUser_called_Then_should_not_return_errors()
        {
            // Given
            var request = new CreateEmployeeAsUserRequest
            {
                CompanyId = 1,
                EmployeeId = Guid.NewGuid(),
                NewUserId = Guid.NewGuid(),
                RoleId = Guid.NewGuid(),
                SiteId = 66L,
                ActioningUserId = Guid.NewGuid()
            };

            var target = CreateEmployeeService();

            _employeeRepository
              .Setup(x => x.GetByIdAndCompanyId(request.EmployeeId, request.CompanyId))
              .Returns(new Employee { Id = request.EmployeeId, CompanyId = request.CompanyId ,
                  ContactDetails = new List<EmployeeContactDetail>(){ new EmployeeContactDetail{Email="*****@*****.**",Telephone1="01612381883"}}});

            _registerEmployeeAsUserParametersMapper
                .Setup(x => x.Map(request))
                .Returns(new RegisterEmployeeAsUserParameters
                {
                    NewUserId = request.NewUserId,
                    Role = new Role { Id = request.RoleId },
                    Site = new Site { Id = request.SiteId, ClientId = request.CompanyId },
                    ActioningUser = new UserForAuditing { Id = request.ActioningUserId, CompanyId = request.CompanyId },
                    CompanyId = request.CompanyId
                });

            //When
            var results = target.ValidateRegisterAsUser(request);

            //Then
            Assert.That(results.IsValid, Is.EqualTo(true));
        }
        public void CreateUser(CreateEmployeeAsUserRequest request)
        {
            _log.Add(request);

            var employee = _employeeRepository.GetByIdAndCompanyId(request.EmployeeId, request.CompanyId);
            var parameters = _registerEmployeeAsUserParametersMapper.Map(request);
            employee.CreateUser(parameters);
            _employeeRepository.SaveOrUpdate(employee);

        }
        public ValidationResult ValidateRegisterAsUser(CreateEmployeeAsUserRequest request)
        {
            _log.Add(request);

            try
            {
                var employee = _employeeRepository.GetByIdAndCompanyId(request.EmployeeId, request.CompanyId);
                var parameters = _registerEmployeeAsUserParametersMapper.Map(request);
                return employee.ValidateRegisterAsUser(parameters);
            }
            catch (Exception ex)
            {
                _log.Add(ex);
                throw;
            }
        }
        private void RegisterEmployeeAsUser(EmployeeDto employee, CreateEmployeeAsUserRequest request)
        {
            var registerNonAdminUserRequest = new RegisterNonAdminUserRequest
            {
                ClientId = CurrentUser.CompanyId,
                PeninsulaApplicationId = Guid.Parse(ConfigurationManager.AppSettings["BSOGuid"]),
                RegistrationEmail = employee.MainContactDetails.Email,
                TelephoneNumber = employee.MainContactDetails.Telephone1 ?? employee.MainContactDetails.Telephone2
            };

            request.NewUserId = _newRegistrationRequestService.RegisterNonAdminUser(registerNonAdminUserRequest);

            _employeeService.CreateUser(request);
        }
        private bool RegistrationAttemptIsValid(EmployeeDto employee, CreateEmployeeAsUserRequest createEmployeeAsUserRequest)
        {

            var validationResult = _employeeService.ValidateRegisterAsUser(createEmployeeAsUserRequest);

            if (!validationResult.IsValid)
            {
                foreach (var error in validationResult.Errors)
                {
                    ModelState.AddModelError(error.PropertyName, error.ErrorMessage);
                }
                return false;
            }

            if (_newRegistrationRequestService.HasEmailBeenRegistered(employee.MainContactDetails.Email))
            {
                ModelState.AddModelError(
                    string.Empty,
                    "Sorry you are unable to create this User: the email address has already been registered"
                );
                return false;
            }
            return true;
        }
        public void Given_valid_request_When_ValidateRegisterAsUser_called_employee_dosent_have_phone_Then_should_not_return_errors()
        {
            // Given
            var request = new CreateEmployeeAsUserRequest
            {
                CompanyId = 1,
                EmployeeId = Guid.NewGuid(),
                NewUserId = Guid.NewGuid(),
                RoleId = Guid.NewGuid(),
                SiteId = 66L,
                ActioningUserId = Guid.NewGuid()
            };

            var target = CreateEmployeeService();

            _employeeRepository
              .Setup(x => x.GetByIdAndCompanyId(request.EmployeeId, request.CompanyId))
              .Returns(new Employee
              {
                  Id = request.EmployeeId,
                  CompanyId = request.CompanyId
              });

            _registerEmployeeAsUserParametersMapper
                .Setup(x => x.Map(request))
                .Returns(new RegisterEmployeeAsUserParameters
                {
                    NewUserId = request.NewUserId,
                    Role = new Role { Id = request.RoleId },
                    Site = new Site { Id = request.SiteId, ClientId = request.CompanyId },
                    ActioningUser = new UserForAuditing { Id = request.ActioningUserId, CompanyId = request.CompanyId },
                    CompanyId = request.CompanyId
                });

            //When
            var results = target.ValidateRegisterAsUser(request);

            //Then
            Assert.That(results.IsValid, Is.EqualTo(false));
        }
        public void Given_valid_request_When_CreateUser_Then_User_IsRegistered_equals_false()
        {
            // Given
            var request = new CreateEmployeeAsUserRequest
                              {
                                  CompanyId = 1,
                                  EmployeeId = Guid.NewGuid(),
                                  NewUserId = Guid.NewGuid(),
                                  RoleId = Guid.NewGuid(),
                                  SiteId = 66L,
                                  ActioningUserId = Guid.NewGuid()
                              };

            var employee = new Employee {Id = request.EmployeeId, CompanyId = request.CompanyId};
            
            _employeeRepository
                .Setup(x => x.GetByIdAndCompanyId(request.EmployeeId, request.CompanyId))
                .Returns(() => employee);

            _registerEmployeeAsUserParametersMapper
                .Setup(x => x.Map(request))
                .Returns(new RegisterEmployeeAsUserParameters
                {
                    NewUserId = request.NewUserId,
                    Role = new Role { Id = request.RoleId },
                    Site = new Site { Id = request.SiteId, ClientId = request.CompanyId },
                    ActioningUser = new UserForAuditing { Id = request.ActioningUserId, CompanyId = request.CompanyId },
                    CompanyId = request.CompanyId
                });

            var target = CreateEmployeeService();

            // When
            target.CreateUser(request);

            Assert.IsFalse(employee.User.IsRegistered.Value);

        }
        public void Given_a_user_exists_for_the_employee_When_CreateUser_Then_exception_is_thrown()
        {
            // Given
            var request = new CreateEmployeeAsUserRequest
            {
                CompanyId = 1,
                EmployeeId = Guid.NewGuid(),
                NewUserId = Guid.NewGuid(),
                RoleId = Guid.NewGuid(),
                SiteId = 66L,
                ActioningUserId = Guid.NewGuid()
            };

            var employee = new Employee { Id = request.EmployeeId, CompanyId = request.CompanyId };
            employee.User = new User();

            _employeeRepository
                .Setup(x => x.GetByIdAndCompanyId(request.EmployeeId, request.CompanyId))
                .Returns(() => employee);

            _registerEmployeeAsUserParametersMapper
                .Setup(x => x.Map(request))
                .Returns(new RegisterEmployeeAsUserParameters
                {
                    NewUserId = request.NewUserId,
                    Role = new Role { Id = request.RoleId },
                    Site = new Site { Id = request.SiteId, ClientId = request.CompanyId },
                    ActioningUser = new UserForAuditing { Id = request.ActioningUserId, CompanyId = request.CompanyId },
                    CompanyId = request.CompanyId
                });

            var target = CreateEmployeeService();

            // When
            target.CreateUser(request);

        }