public User RegisterManualAlumni(ManualUserRegVm userDetails)
        {
            lock (_regSync)
            {
                if (string.IsNullOrEmpty(userDetails.Email))
                {
                    var count = _db.Users.ToList().Last().UserId + 1;
                    userDetails.Email = "unknown_" + count + "@nitcaa.com";
                }

                _userService.ValidateEmailUnique(userDetails.Email);
                var user = userDetails.GetUserEntity();
                user.HashedPassword   = _hashService.CreateHash(Constants.DefaultPassword);
                user.AccountStatus    = UserRegisterStatus.Approved;
                user.EmailConfirmedOn = DateTime.UtcNow; // For Dummy Logging in
                user.CreateType       = UserCreateTypes.Admin;
                user.UserRoles.Add(new UserRole
                {
                    RoleType = UserRoleType.Alumni
                });
                UpdateCourseDetails(userDetails.Batch, userDetails.BranchId, user);

                _db.Users.Add(user);
                _db.SaveChanges();
                AddUserLog(user.UserId, "User Created Manually");
                return(user);
            }
        }
        /// <summary>
        /// Creates a new User and Employee from the details provided
        /// </summary>
        /// <param name="newUserDetails"></param>
        /// <returns></returns>
        public async Task <UserFullDetailsDto> CreateUserAsync(UserForRegistrationDto newUserDetails)
        {
            if (newUserDetails == null)
            {
                throw new ArgumentNullException(nameof(newUserDetails));
            }

            // map elements of the UserForRegistrationDto to JobDescription and Employee
            var newJobDescription = new JobDescription()
            {
                Description = newUserDetails.JobDescription,
                Role        = newUserDetails.Role
            };

            var newEmployeeDetails = new Employee()
            {
                Firstname = newUserDetails.FirstName,
                Lastname  = newUserDetails.LastName,
                Title     = newUserDetails.Title,
            };

            // Create the Password Hash and Salt
            _cryptoSvc.CreateHash(newUserDetails.Password, out var passwordHash, out var passwordSalt);

            // Combine elements to make the new user
            var newUser = new User()
            {
                Username        = newUserDetails.Username,
                PasswordHash    = passwordHash,
                PasswordSalt    = passwordSalt,
                State           = newUserDetails.State,
                JobDescription  = newJobDescription,
                EmployeeDetails = newEmployeeDetails
            };

            // Save to the database
            var result = await _userDal.AddAsync(newUser);

            return(result != null ? new UserFullDetailsDto(result) : null);
        }