public ActionResult Create()
        {
            ViewBag.Empresas = _Empresas;

            var viewModel = new BOAccountCreateViewModel
            {
                Ativo = true
            };

            return(View(viewModel));
        }
        public async Task <ActionResult> Create(BOAccountCreateViewModel model)
        {
            ViewBag.Empresas = _Empresas;

            for (int i = 0; i < model.EmpresasGrupos.Count; i++)
            {
                model.EmpresasGrupos[i].PerfilImpressora = PerfilImpressorasList(model.EmpresasGrupos[i].IdEmpresa, idPerfilImpressora: model.EmpresasGrupos[i].IdPerfilImpressoraPadrao);
            }

            Func <string, ViewResult> errorView = (error) =>
            {
                if (error != null)
                {
                    Notify.Error(Resources.CommonStrings.RequestUnexpectedErrorMessage);
                }
                return(View(model));
            };

            if (!ModelState.IsValid)
            {
                return(errorView(null));
            }

            if (model.EmpresasGrupos.Any(x => x.IdPerfilImpressoraPadrao == null))
            {
                ModelState.AddModelError(nameof(model.EmpresasGrupos), "Selecione um Perfil de Impressão Padrão em todas as empresas.");
            }

            var existingUserByName = await UserManager.FindByNameAsync(model.UserName).ConfigureAwait(false);

            if (existingUserByName != null)
            {
                ModelState.AddModelError(nameof(model.UserName), "O código de usuário informado já existe");
            }

            var existsUserByEmail = await UserManager.FindByEmailAsync(model.Email).ConfigureAwait(false);

            if (existsUserByEmail != null)
            {
                ModelState.AddModelError(nameof(model.Email), "E-mail informado já utilizado por outro usuário");
            }

            if (model.EmpresasGrupos.NullOrEmpty())
            {
                ModelState.AddModelError(nameof(model.EmpresasGrupos), Res.RequiredOnlyCompany);
                return(errorView(null));
            }

            if (!model.EmpresasGrupos.All(w => w.Grupos.Any(a => a.IsSelected)))
            {
                ModelState.AddModelError(nameof(model.EmpresasGrupos), Res.RequiredOnlyGroup);
                return(errorView(null));
            }

            if (!model.EmpresasGrupos.Where(w => w.IsEmpresaPrincipal).Any())
            {
                ModelState.AddModelError(nameof(model.EmpresasGrupos), "Selecione a empresa principal do usuário");
                return(errorView(null));
            }

            for (int i = 0; i < model.EmpresasGrupos.Count; i++)
            {
                if (model.EmpresasGrupos[0].CorredorEstoqueInicio == null && model.EmpresasGrupos[0].CorredorEstoqueFim != null)
                {
                    ModelState.AddModelError($"[{i}].CorredorEstoque", "Preencha o valor inicial do Corredor Estoque");
                }

                if (model.EmpresasGrupos[0].CorredorEstoqueInicio != null && model.EmpresasGrupos[0].CorredorEstoqueFim == null)
                {
                    ModelState.AddModelError($"[{i}].CorredorEstoque", "Preencha o valor final do Corredor Estoque");
                }

                if (model.EmpresasGrupos[0].CorredorEstoqueInicio.HasValue && model.EmpresasGrupos[0].CorredorEstoqueFim.HasValue)
                {
                    if (model.EmpresasGrupos[0].CorredorEstoqueInicio.Value > model.EmpresasGrupos[0].CorredorEstoqueFim.Value)
                    {
                        ModelState.AddModelError($"[{i}].CorredorEstoque", "O valor inicial do Corredor Estoque não pode ser maior do que o final");
                    }
                }

                if (model.EmpresasGrupos[0].CorredorSeparacaoInicio == null && model.EmpresasGrupos[0].CorredorSeparacaoFim != null)
                {
                    ModelState.AddModelError($"[{i}].CorredorSeparacao", "Preencha o valor inicial do Corredor Separação");
                }

                if (model.EmpresasGrupos[0].CorredorSeparacaoInicio != null && model.EmpresasGrupos[0].CorredorSeparacaoFim == null)
                {
                    ModelState.AddModelError($"[{i}].CorredorSeparacao", "Preencha o valor final do Corredor Separação");
                }

                if (model.EmpresasGrupos[0].CorredorSeparacaoInicio.HasValue && model.EmpresasGrupos[0].CorredorSeparacaoFim.HasValue)
                {
                    if (model.EmpresasGrupos[0].CorredorSeparacaoInicio.Value > model.EmpresasGrupos[0].CorredorSeparacaoFim.Value)
                    {
                        ModelState.AddModelError($"[{i}].CorredorSeparacao", "O valor inicial do Corredor Separação não pode ser maior do que o final");
                    }
                }
            }

            if (!ModelState.IsValid)
            {
                return(errorView(null));
            }

            var user = new ApplicationUser {
                UserName = model.UserName, Email = model.Email
            };

            user.Id = Guid.NewGuid().ToString();
            var result = await UserManager.CreateAsync(user, model.Password).ConfigureAwait(false);

            if (!result.Succeeded)
            {
                throw new InvalidOperationException(Resources.CommonStrings.RequestUnexpectedErrorMessage);
            }

            var perfilUsuario = new PerfilUsuario
            {
                Ativo          = model.Ativo,
                Cargo          = model.Cargo,
                DataNascimento = model.DataNascimento,
                Departamento   = model.Departamento,
                Nome           = model.Nome,
                UsuarioId      = user.Id,
                EmpresaId      = model.EmpresasGrupos.Where(w => w.IsEmpresaPrincipal).First().IdEmpresa
            };

            _unitOfWork.PerfilUsuarioRepository.Add(perfilUsuario);
            _unitOfWork.SaveChanges();

            foreach (var f in model.EmpresasGrupos)
            {
                var newUsuarioEmpresa = new UsuarioEmpresa
                {
                    UserId                   = user.Id,
                    IdEmpresa                = f.IdEmpresa,
                    PerfilUsuarioId          = perfilUsuario.PerfilUsuarioId,
                    IdPerfilImpressoraPadrao = f.IdPerfilImpressoraPadrao,
                    CorredorEstoqueInicio    = f.CorredorEstoqueInicio,
                    CorredorEstoqueFim       = f.CorredorEstoqueFim,
                    CorredorSeparacaoInicio  = f.CorredorSeparacaoInicio,
                    CorredorSeparacaoFim     = f.CorredorSeparacaoFim,
                };
                _unitOfWork.UsuarioEmpresaRepository.Add(newUsuarioEmpresa);
            }

            _unitOfWork.SaveChanges();

            var empresasGruposNew = new StringBuilder();

            foreach (var item in model.EmpresasGrupos.Where(x => x.Grupos.Any(y => y.IsSelected)))
            {
                IEnumerable <string> selectedRoles = item.Grupos.Where(x => x.IsSelected).Select(x => x.Name);

                empresasGruposNew.AppendLine(string.Format("{0}: {1}", item.Nome, string.Join(", ", selectedRoles.ToArray())));
                empresasGruposNew.AppendLine(" || ");

                result = UserManager.AddToRolesByEmpresa(user, selectedRoles.ToArray(), item.IdEmpresa);

                if (!result.Succeeded)
                {
                    Notify.Error(Resources.CommonStrings.RequestUnexpectedErrorMessage);

                    return(View(model));
                }
            }

            var userInfo = new BackOfficeUserInfo();

            Notify.Success(Resources.CommonStrings.RegisterCreatedSuccessMessage);
            return(RedirectToAction("Index"));
        }