public async Task <Guid> CreateUserAsync(CreateUserDto createUserDto)
        {
            using (var scope = _dbContextScopeFactory.Create())
            {
                // create user
                var createUser = _userRepository.GetUserByEmail(createUserDto.Email.ToLower());
                if (createUser == null)
                {
                    createUser = User.CreateUser(createUserDto.UserName, createUserDto.FullName,
                                                 createUserDto.Gender, createUserDto.Email, createUserDto.Mobile,
                                                 createUserDto.Address, createUserDto.HomePhone, createUserDto.Ext,
                                                 createUserDto.BirthDate, createUserDto.UserCode, null,
                                                 createUserDto.Language, createUserDto.UserIndex);
                    _userRepository.Add(createUser);
                }
                else
                {
                    createUser.Update(createUserDto.FullName,
                                      createUserDto.Gender, createUserDto.Email, createUserDto.Mobile,
                                      createUserDto.Address, createUserDto.HomePhone, createUserDto.Ext,
                                      createUserDto.BirthDate, createUserDto.UserCode, null,
                                      createUserDto.Language, createUserDto.UserIndex);
                }

                // create user depart
                foreach (var deptId in createUserDto.Departments)
                {
                    var createUserDept = _userDepartmentRepository
                                         .Get(w => w.UserID == createUser.Id && w.DeptID == deptId)
                                         .FirstOrDefault();
                    if (createUserDept == null)
                    {
                        createUserDept = UserDepartment.CreateUserDepartment(
                            createUser.Id, deptId, createUserDto.JobDescription,
                            createUserDto.OrderNumber, createUserDto.JobTitleId,
                            createUserDto.IsManager);
                        _userDepartmentRepository.Add(createUserDept);
                    }
                    else
                    {
                        createUserDept.Update(createUserDto.JobDescription,
                                              createUserDto.OrderNumber, createUserDto.JobTitleId,
                                              createUserDto.IsManager);
                    }
                }

                // create signature
                if (createUserDto.UserSignatures != null && createUserDto.UserSignatures.Count > 0)
                {
                    foreach (var signature in createUserDto.UserSignatures)
                    {
                        var createSignature = UserSignature.CreateUserSignature(
                            signature.SignServerId, createUser.Id,
                            signature.Title, signature.CertificateBin,
                            signature.SignImage, signature.SignImageType,
                            signature.StampImage, signature.StampImageType,
                            signature.Account, signature.Password);
                        _signatureRepository.Add(createSignature);
                    }
                }

                // create notification setting
                if (createUserDto.NotificationSettings != null && createUserDto.NotificationSettings.Count > 0)
                {
                    foreach (var notifySetting in createUserDto.NotificationSettings)
                    {
                        var createMotifySetting = NotificationSetting.Create(createUser.Id,
                                                                             notifySetting.NotificationTypeId, notifySetting.IsUrgent);
                        _notificationSettingRepository.Add(createMotifySetting);
                    }
                }

                await scope.SaveChangesAsync();

                return(createUser.Id);
            }
        }
 public UserDepartment GetUserPrimaryDepartmentById(string userId)
 {
     return(userdepartmentRepository.Get(x => x.UserID == userId && x.IsActive && x.IsPrimary));
 }