public UsuarioViewModel Run(Repository value)
        {
            UsuarioViewModel r      = (UsuarioViewModel)value;
            UsuarioViewModel result = new UsuarioViewModel()
            {
                uri       = r.uri,
                empresaId = r.empresaId,
                login     = r.login,
                mensagem  = new Validate()
                {
                    Code = 0, Message = "Registro processado com sucesso"
                }
            };

            try
            {
                #region Validar LOGIN
                Usuario u = seguranca_db.Usuarios.Where(info => info.login == r.login && info.empresaId == r.empresaId).FirstOrDefault();

                if (u == null)
                {
                    result.mensagem = new Validate()
                    {
                        Code = 999, Message = "Login inválido ou inexistente."
                    };
                    throw new App_DominioException(result.mensagem);
                }
                else if (u.situacao != "A")
                {
                    result.mensagem = new Validate()
                    {
                        Code = 998, Message = "Este login possui pendências administrativas. Favor entrar em contato com a secretaria para providenciar a atualização."
                    };
                    throw new App_DominioException(result.mensagem);
                }
                ;
                #endregion

                #region Atualizar o cadastro do usuário com a keyword
                Random random = new Random();
                u.keyword    = random.Next(9999, 99999999).ToString();
                u.dt_keyword = Funcoes.Brasilia().AddDays(1);

                seguranca_db.Entry(u).State = EntityState.Modified;
                seguranca_db.SaveChanges();
                #endregion

                #region Enviar e-mail
                int    _sistemaId      = int.Parse(db.Parametros.Find(r.empresaId, (int)Enumeracoes.Enumeradores.Param.SISTEMA).Valor);
                string _URL_CONDOMINIO = db.Parametros.Find(r.empresaId, (int)Enumeracoes.Enumeradores.Param.URL_CONDOMINIO).Valor;
                int    EmailTipoID     = (int)Enumeracoes.Enumeradores.EmailTipo.FORGOT;
                string EmailMensagem   = db.EmailTemplates.Where(info => info.CondominioID == r.empresaId && info.EmailTipoID == EmailTipoID).FirstOrDefault().EmailMensagem;
                EmailMensagem = EmailMensagem.Replace("@link_esqueci_minha_senha", "<p><a href=\"" + _URL_CONDOMINIO + "/Account/EsqueciMinhaSenha?id=" + u.usuarioId.ToString() + "&key=" + u.keyword + "\" target=\"_blank\"><span style=\"font-family: Verdana; font-size: small; color: #0094ff\">recuperar senha</span></a></p>");
                EmailMensagem = EmailMensagem.Replace("@nome", u.nome).Replace("@email", u.login);
                #region Verifica se o usuário é um condômino
                CondominoUnidade cu            = null;
                int?        _EdificacaoID      = null;
                string      _Descricao_Unidade = null;
                int?        _UnidadeID         = null;
                CondominoPF CondominoPF        = db.CondominoPFs.Where(info => info.UsuarioID == u.usuarioId && info.CondominioID == u.empresaId && info.IndSituacao == "A").FirstOrDefault();
                if (CondominoPF != null)
                {
                    cu = (from cou in db.CondominoUnidades
                          where cou.CondominoID == CondominoPF.CondominoID
                          select cou).FirstOrDefault();

                    _EdificacaoID      = cu.EdificacaoID;
                    _Descricao_Unidade = db.Edificacaos.Find(cu.EdificacaoID).Descricao;
                    _UnidadeID         = cu.UnidadeID;
                }
                #endregion

                #region Envia o e-mail de renovação de senha
                EmailLogViewModel EmailLogViewModel = new EmailLogViewModel()
                {
                    uri                      = r.uri,
                    empresaId                = u.empresaId,
                    EmailTipoID              = EmailTipoID, // "Esqueci minha senha"
                    CondominioID             = u.empresaId,
                    EdificacaoID             = _EdificacaoID,
                    Descricao_Edificacao     = _Descricao_Unidade,
                    UnidadeID                = _UnidadeID,
                    GrupoCondominoID         = null,
                    Descricao_GrupoCondomino = "",
                    DataEmail                = Funcoes.Brasilia(),
                    Assunto                  = db.EmailTipos.Find(EmailTipoID, u.empresaId).Assunto,
                    EmailMensagem            = EmailMensagem,
                    Nome                     = u.nome,
                    Email                    = u.login
                };

                EmailNotificacaoBI notificacaoBI = new EmailNotificacaoBI(this.db, this.seguranca_db, true);
                EmailLogViewModel = notificacaoBI.Run(EmailLogViewModel);
                if (EmailLogViewModel.mensagem.Code > 0)
                {
                    throw new App_DominioException(EmailLogViewModel.mensagem);
                }
                db.SaveChanges();
                #endregion
                #endregion

                result.mensagem.Code = -1; // Tem que devolver -1 porque na Superclasse, se devolver zero, vai executar novamente o SaveChanges.
            }
            catch (ArgumentException ex)
            {
                result.mensagem = new Validate()
                {
                    Code = 997, Message = MensagemPadrao.Message(997).ToString(), MessageBase = ex.Message
                };
            }
            catch (App_DominioException ex)
            {
                result.mensagem = ex.Result;

                if (ex.InnerException != null)
                {
                    result.mensagem.MessageBase = new App_DominioException(ex.InnerException.Message ?? ex.Message, GetType().FullName).Message;
                }
                else
                {
                    result.mensagem.MessageBase = new App_DominioException(ex.Result.Message, GetType().FullName).Message;
                }
            }
            catch (DbUpdateException ex)
            {
                result.mensagem.MessageBase = ex.InnerException.InnerException.Message ?? ex.Message;
                if (result.mensagem.MessageBase.ToUpper().Contains("REFERENCE"))
                {
                    if (result.mensagem.MessageBase.ToUpper().Contains("DELETE"))
                    {
                        result.mensagem.Code        = 16;
                        result.mensagem.Message     = MensagemPadrao.Message(16).ToString();
                        result.mensagem.MessageType = MsgType.ERROR;
                    }
                    else
                    {
                        result.mensagem.Code        = 28;
                        result.mensagem.Message     = MensagemPadrao.Message(28).ToString();
                        result.mensagem.MessageType = MsgType.ERROR;
                    }
                }
                else if (result.mensagem.MessageBase.ToUpper().Contains("PRIMARY"))
                {
                    result.mensagem.Code        = 37;
                    result.mensagem.Message     = MensagemPadrao.Message(37).ToString();
                    result.mensagem.MessageType = MsgType.WARNING;
                }
                else if (result.mensagem.MessageBase.ToUpper().Contains("UNIQUE KEY"))
                {
                    result.mensagem.Code        = 54;
                    result.mensagem.Message     = MensagemPadrao.Message(54).ToString();
                    result.mensagem.MessageType = MsgType.WARNING;
                }
                else
                {
                    result.mensagem.Code        = 44;
                    result.mensagem.Message     = MensagemPadrao.Message(44).ToString();
                    result.mensagem.MessageType = MsgType.ERROR;
                }
            }
            catch (System.Data.Entity.Validation.DbEntityValidationException ex)
            {
                result.mensagem = new Validate()
                {
                    Code = 42, Message = MensagemPadrao.Message(42).ToString(), MessageBase = ex.EntityValidationErrors.Select(m => m.ValidationErrors.First().ErrorMessage).First()
                };
            }
            catch (Exception ex)
            {
                result.mensagem.Code        = 17;
                result.mensagem.Message     = MensagemPadrao.Message(17).ToString();
                result.mensagem.MessageBase = new App_DominioException(ex.InnerException.InnerException.Message ?? ex.Message, GetType().FullName).Message;
                result.mensagem.MessageType = MsgType.ERROR;
            }
            return(result);
        }
        public CredenciadoViewModel Run(Repository value)
        {
            CredenciadoViewModel rec = (CredenciadoViewModel)value;
            string habilitaEmail     = db.Parametros.Find(sessaoCorrente.empresaId, (int)Enumeracoes.Enumeradores.Param.HABILITA_EMAIL).Valor;

            if (habilitaEmail == "S")
            {
                int _empresaId = sessaoCorrente.empresaId;
                int _sistemaId = int.Parse(db.Parametros.Find(_empresaId, (int)Enumeracoes.Enumeradores.Param.SISTEMA).Valor);

                Sistema          sistema                 = seguranca_db.Sistemas.Find(_sistemaId);
                Condominio       condominio              = db.Condominios.Find(sessaoCorrente.empresaId);
                CondominoUnidade CondominoUnidade        = db.CondominoUnidades.Where(info => info.CondominoID == rec.CondominoID && !info.DataFim.HasValue).FirstOrDefault();
                Edificacao       Edificacao              = db.Edificacaos.Find(CondominoUnidade.EdificacaoID);
                Credenciado      Credenciado             = db.Credenciados.Where(info => info.Email == rec.Email).FirstOrDefault();
                Unidade          Unidade                 = db.Unidades.Find(_empresaId, CondominoUnidade.EdificacaoID, CondominoUnidade.UnidadeID);
                string           DescricaoTipoEdificacao = DWMSessaoLocal._GetTipoEdificacao(_empresaId, this.db).Descricao;

                rec.empresaId = _empresaId;

                SendEmail sendMail = new SendEmail();

                MailAddress   sender     = new MailAddress(condominio.RazaoSocial + " <" + condominio.Email + ">");
                List <string> recipients = new List <string>();

                recipients.Add(rec.Nome + "<" + rec.Email + ">");

                string Subject = "Confirmação de cadastro no " + condominio.RazaoSocial;
                string Text    = "<p>Confirmação de cadastro</p>";
                string Html    = "<p><span style=\"font-family: Verdana; font-size: larger; color: #656464\">" + sistema.descricao + "</span></p>" +
                                 "<p><span style=\"font-family: Verdana; font-size: xx-large; color: #0094ff\">" + rec.Nome.ToUpper() + "</span></p>" +
                                 "<p></p>" +
                                 "<p><span style=\"font-family: Verdana; font-size: small; color: #000\">" + DescricaoTipoEdificacao + ": <b>" + Edificacao.Descricao + "</b></span></p>" +
                                 "<p></p>" +
                                 "<p><span style=\"font-family: Verdana; font-size: small; color: #000\">Unidade: <b>" + Unidade.Codigo + "</b></span></p>" +
                                 "<p></p>" +
                                 "<p><span style=\"font-family: Verdana; font-size: small; color: #000\">Essa é uma mensagem de confirmação de seu cadastro de credenciado. Seu registro no Sistema Administrativo do " + condominio.RazaoSocial + " foi realizado com sucesso.</span></p>" +
                                 "<p></p>";

                Html += "<p></p>" +
                        "<p><span style=\"font-family: Verdana; font-size: small; color: #000\">Seu Login de acesso é: </span></p>" +
                        "<p></p>" +
                        "<p><span style=\"font-family: Verdana; font-size: xx-large; color: #0094ff\">" + rec.Email + "</span></p>" +
                        "<p></p>" +
                        "<p><span style=\"font-family: Verdana; font-size: small; color: #000\">Clique no link abaixo para ativar o seu cadastro e acessar o sistema:</span></p>" +
                        "<p><a href=\"http://www.parcparadiso.com.br/Account/AtivarCredenciado?id=" + Credenciado.UsuarioID.ToString() + "&key=" + rec.mensagem.Field + "\" target=\"_blank\"><span style=\"font-family: Verdana; font-size: small; color: #0094ff\">Acesso ao " + sistema.descricao + "</span></a></p>" +
                        "<p></p>" +
                        "<p><span style=\"font-family: Verdana; font-size: small; color: #000\">Observação: este link estará disponível para ativação por 24 h</span></p>" +
                        "<hr />";

                Html += "<p></p>" +
                        "<p></p>" +
                        "<p><span style=\"font-family: Verdana; font-size: small; color: #000\">Através do sistema o credenciado poderá:</span></p>" +
                        "<p></p>" +
                        "<p><span style=\"font-family: Verdana; font-size: small; color: #000\">- Consultar os documentos e comunicados oficiais do condomínio postados pelo síndico.</span></p>" +
                        "<p><span style=\"font-family: Verdana; font-size: small; color: #000\">- Consultar os comunicados específicos destinados a sua torre.</span></p>" +
                        "<p><span style=\"font-family: Verdana; font-size: small; color: #000\">- Abrir chamados à administração como por exemplo fazer o registro de uma ocorrência ou uma solicitação.</ span></p>" +
                        "<p><span style=\"font-family: Verdana; font-size: small; color: #000\">- Receber mensagens e alertas personalizados.</ span></p>" +
                        "<p><span style=\"font-family: Verdana; font-size: small; color: #000\">- Consultar o histórico de notificações.</ span></p>" +
                        "<hr />" +
                        "<p></p>" +
                        "<p><span style=\"font-family: Verdana; font-size: small; color: #000\">Além desses recursos, estaremos implementando outras novidades. Aguarde !</span></p>" +
                        "<p>&nbsp;</p>" +
                        "<p>&nbsp;</p>" +
                        "<p><span style=\"font-family: Verdana; font-size: small; color: #000\">Obrigado,</span></p>" +
                        "<p><span style=\"font-family: Verdana; font-size: small; color: #000\">Administração " + condominio.RazaoSocial + "</span></p>";

                Validate result = sendMail.Send(sender, recipients, Html, Subject, Text);
                if (result.Code > 0)
                {
                    result.MessageBase = "Seu cadastro foi realizado com sucesso, mas por falhas de comunicação não foi possível enviar seu e-mail de confirmação. Favor entrar em contato com [email protected] e solicite seu e-mail de ativação.";
                    throw new App_DominioException(result);
                }
            }
            rec.mensagem = new Validate()
            {
                Code = 0, Message = MensagemPadrao.Message(0).ToString(), MessageType = MsgType.SUCCESS
            };
            return(rec);
        }
        public CredenciadoViewModel Run(Repository value)
        {
            bool EnviaEmail = false;

            CredenciadoViewModel r      = (CredenciadoViewModel)value;
            CredenciadoViewModel result = new CredenciadoViewModel()
            {
                uri                    = r.uri,
                empresaId              = sessaoCorrente.empresaId,
                CredenciadoID          = r.CredenciadoID,
                CondominoID            = r.CondominoID,
                Nome                   = r.Nome,
                Email                  = r.Email,
                TipoCredenciadoID      = r.TipoCredenciadoID,
                Sexo                   = r.Sexo,
                Observacao             = r.Observacao,
                UsuarioID              = r.UsuarioID,
                IndVisitantePermanente = r.IndVisitantePermanente,
                mensagem               = new Validate()
                {
                    Code = 0, Message = "Registro processado com sucesso"
                }
            };

            try
            {
                int    _empresaId = SessaoLocal.empresaId;
                string _keyword   = null;

                CredenciadoModel CredenciadoModel = new CredenciadoModel(this.db, this.seguranca_db);

                if (r.CredenciadoID == 0) // Incluir credenciado
                {
                    #region Validar Credenciado
                    if (CredenciadoModel.Validate(result, Crud.INCLUIR).Code > 0)
                    {
                        throw new App_DominioException(result.mensagem);
                    }
                    #endregion

                    #region Cadastrar o credenciado como um usuário em DWM-Segurança

                    if (!string.IsNullOrEmpty(result.Email))
                    {
                        Random random = new Random();
                        string _senha = random.Next(9999, 999999).ToString();
                        _keyword = random.Next(9999, 99999999).ToString();
                        int _grupoId = int.Parse(db.Parametros.Find(_empresaId, (int)Enumeracoes.Enumeradores.Param.GRUPO_CREDENCIADO).Valor);

                        #region Usuario
                        EmpresaSecurity <SecurityContext> security = new EmpresaSecurity <SecurityContext>();

                        Usuario user = new Usuario()
                        {
                            nome        = r.Nome.ToUpper(),
                            login       = r.Email,
                            empresaId   = _empresaId,
                            dt_cadastro = Funcoes.Brasilia(),
                            situacao    = "D",
                            isAdmin     = "N",
                            senha       = security.Criptografar(_senha),
                            keyword     = _keyword,
                            dt_keyword  = Funcoes.Brasilia().AddDays(1)
                        };

                        // Verifica se o E-mail do usuário já não existe para a empresa
                        if (seguranca_db.Usuarios.Where(info => info.empresaId == _empresaId && info.login == r.Email).Count() > 0)
                        {
                            throw new ArgumentException("E-mail já cadastrado");
                        }

                        seguranca_db.Usuarios.Add(user);
                        #endregion

                        #region UsuarioGrupo
                        UsuarioGrupo ug = new UsuarioGrupo()
                        {
                            Usuario  = user,
                            grupoId  = _grupoId,
                            situacao = "A"
                        };

                        seguranca_db.UsuarioGrupos.Add(ug);
                        #endregion

                        seguranca_db.SaveChanges();

                        result.UsuarioID = user.usuarioId;
                        EnviaEmail       = true;
                    }
                    #endregion

                    #region Incluir o credenciado
                    result = CredenciadoModel.Insert(result);
                    result.mensagem.Field = _keyword;
                    #endregion
                }
                else if (Operacao == "S") // Alterar credenciado
                {
                    #region Validar Credenciado
                    if (CredenciadoModel.Validate(result, Crud.ALTERAR).Code > 0)
                    {
                        throw new App_DominioException(result.mensagem);
                    }
                    #endregion

                    #region Atualiza o cadastro do usuário
                    if (result.UsuarioID.HasValue && result.UsuarioID > 0 && !string.IsNullOrEmpty(result.Email)) // antes existia UsuarioID e tem E-mail
                    {
                        Usuario user = seguranca_db.Usuarios.Find(result.UsuarioID.Value);

                        if (user != null)
                        {
                            user.login       = result.Email;
                            user.nome        = result.Nome.ToUpper();
                            user.dt_cadastro = Funcoes.Brasilia();

                            seguranca_db.Entry(user).State = EntityState.Modified;

                            seguranca_db.SaveChanges();
                        }
                    }
                    else if ((!result.UsuarioID.HasValue || result.UsuarioID.Value == 0) && !string.IsNullOrEmpty(result.Email)) // antes não existia UsuarioID e na altração passou a existir (e-mail)
                    {
                        Random random = new Random();
                        string _senha = random.Next(9999, 999999).ToString();
                        _keyword = random.Next(9999, 99999999).ToString();
                        int _grupoId = int.Parse(db.Parametros.Find(_empresaId, (int)Enumeracoes.Enumeradores.Param.GRUPO_CREDENCIADO).Valor);

                        #region Usuario
                        EmpresaSecurity <SecurityContext> security = new EmpresaSecurity <SecurityContext>();

                        Usuario user = new Usuario()
                        {
                            nome        = r.Nome.ToUpper(),
                            login       = r.Email,
                            empresaId   = _empresaId,
                            dt_cadastro = Funcoes.Brasilia(),
                            situacao    = "D",
                            isAdmin     = "N",
                            senha       = security.Criptografar(_senha),
                            keyword     = _keyword,
                            dt_keyword  = Funcoes.Brasilia().AddDays(1)
                        };

                        // Verifica se o E-mail do usuário já não existe para a empresa
                        if (seguranca_db.Usuarios.Where(info => info.empresaId == _empresaId && info.login == r.Email).Count() > 0)
                        {
                            throw new ArgumentException("E-mail já cadastrado");
                        }

                        seguranca_db.Usuarios.Add(user);
                        #endregion

                        #region UsuarioGrupo
                        UsuarioGrupo ug = new UsuarioGrupo()
                        {
                            Usuario  = user,
                            grupoId  = _grupoId,
                            situacao = "A"
                        };

                        seguranca_db.UsuarioGrupos.Add(ug);
                        #endregion

                        seguranca_db.SaveChanges();

                        result.UsuarioID = user.usuarioId;

                        EnviaEmail = true;
                    }
                    else if (result.UsuarioID.HasValue && result.UsuarioID > 0 && string.IsNullOrEmpty(result.Email)) // antes existia usuário e agora não existe mais => Exclui o usuário em dwm-segurança
                    {
                        #region Exclui o cadastro do usuário
                        int _grupoId = int.Parse(db.Parametros.Find(_empresaId, (int)Enumeracoes.Enumeradores.Param.GRUPO_CREDENCIADO).Valor);

                        // Exclui o usuário do Grupo
                        UsuarioGrupo ug = seguranca_db.UsuarioGrupos.Find(result.UsuarioID, _grupoId);
                        seguranca_db.Set <UsuarioGrupo>().Remove(ug);

                        // Exclui o usuário da tabela Sessao
                        seguranca_db.Database.ExecuteSqlCommand("delete from Sessao where usuarioId = " + result.UsuarioID.ToString() + " and empresaId = " + sessaoCorrente.empresaId.ToString());

                        // Exclui o usuário
                        Usuario user = seguranca_db.Usuarios.Find(result.UsuarioID);
                        seguranca_db.Set <Usuario>().Remove(user);

                        seguranca_db.SaveChanges();
                        #endregion

                        result.UsuarioID = null;
                    }
                    #endregion

                    #region Alterar credenciado
                    result = CredenciadoModel.Update(result);
                    #endregion
                }
                else // Excluir credenciado
                {
                    #region Validar Credenciado
                    if (CredenciadoModel.Validate(result, Crud.EXCLUIR).Code > 0)
                    {
                        throw new App_DominioException(result.mensagem);
                    }
                    #endregion

                    #region Exclui o cadastro do usuário
                    if (result.UsuarioID.HasValue && result.UsuarioID.Value > 0)
                    {
                        int _grupoId = int.Parse(db.Parametros.Find(_empresaId, (int)Enumeracoes.Enumeradores.Param.GRUPO_CREDENCIADO).Valor);

                        // Exclui o usuário do Grupo
                        UsuarioGrupo ug = seguranca_db.UsuarioGrupos.Find(result.UsuarioID, _grupoId);
                        seguranca_db.Set <UsuarioGrupo>().Remove(ug);

                        // Exclui o usuário da tabela Sessao
                        seguranca_db.Database.ExecuteSqlCommand("delete from Sessao where usuarioId = " + result.UsuarioID.ToString() + " and empresaId = " + sessaoCorrente.empresaId.ToString());

                        // Exclui o usuário
                        Usuario user = seguranca_db.Usuarios.Find(result.UsuarioID);
                        seguranca_db.Set <Usuario>().Remove(user);

                        seguranca_db.SaveChanges();
                    }
                    #endregion

                    #region Alterar credenciado
                    result = CredenciadoModel.Delete(result);
                    #endregion
                }

                if (result.mensagem.Code > 0)
                {
                    throw new App_DominioException(result.mensagem);
                }

                db.SaveChanges();

                if (EnviaEmail)
                {
                    int    _sistemaId      = int.Parse(db.Parametros.Find(SessaoLocal.empresaId, (int)Enumeracoes.Enumeradores.Param.SISTEMA).Valor);
                    string _URL_CONDOMINIO = db.Parametros.Find(SessaoLocal.empresaId, (int)Enumeracoes.Enumeradores.Param.URL_CONDOMINIO).Valor;
                    #region envio de e-mail ao credenciado para ativação
                    int    EmailTipoID   = (int)DWM.Models.Enumeracoes.Enumeradores.EmailTipo.CADASTRO_CREDENCIADO;
                    string EmailMensagem = db.EmailTemplates.Where(info => info.CondominioID == SessaoLocal.empresaId && info.EmailTipoID == EmailTipoID).FirstOrDefault().EmailMensagem;
                    EmailMensagem = EmailMensagem.Replace("@link_credenciado", "<p><a href=\"" + _URL_CONDOMINIO + "/Account/AtivarCredenciado?id=" + result.UsuarioID.ToString() + "&key=" + _keyword + "\" target=\"_blank\"><span style=\"font-family: Verdana; font-size: small; color: #0094ff\">Acesso ao " + seguranca_db.Sistemas.Find(_sistemaId).descricao + "</span></a></p>");

                    CondominoUnidade cu = (from cou in db.CondominoUnidades
                                           where cou.CondominioID == SessaoLocal.empresaId &&
                                           cou.CondominoID == r.CondominoID
                                           select cou).FirstOrDefault();

                    EmailLogViewModel EmailLogViewModel = new EmailLogViewModel()
                    {
                        uri                      = r.uri,
                        empresaId                = SessaoLocal.empresaId,
                        EmailTipoID              = EmailTipoID, // "Cadastro Credenciado"
                        CondominioID             = SessaoLocal.empresaId,
                        EdificacaoID             = cu.EdificacaoID,
                        Descricao_Edificacao     = db.Edificacaos.Find(cu.EdificacaoID).Descricao,
                        UnidadeID                = cu.UnidadeID,
                        GrupoCondominoID         = null,
                        Descricao_GrupoCondomino = "",
                        DataEmail                = Funcoes.Brasilia(),
                        Assunto                  = db.EmailTipos.Find(EmailTipoID, SessaoLocal.empresaId).Assunto,
                        EmailMensagem            = EmailMensagem,
                        Nome                     = r.Nome,
                        Email                    = r.Email
                    };

                    EmailNotificacaoBI notificacaoBI = new EmailNotificacaoBI(this.db, this.seguranca_db);
                    EmailLogViewModel = notificacaoBI.Run(EmailLogViewModel);
                    if (EmailLogViewModel.mensagem.Code > 0)
                    {
                        throw new App_DominioException(EmailLogViewModel.mensagem);
                    }


                    //result.CredenciadoViewModel.mensagem.Field = factory.Mensagem.Field; // senha do credenciado
                    //EnviarEmailCredenciadoBI EnviarEmailCredenciadoBI = new EnviarEmailCredenciadoBI(this.db, this.seguranca_db);
                    //CredenciadoViewModel repository = EnviarEmailCredenciadoBI.Run(result);
                    //if (repository.mensagem.Code > 0)
                    //    throw new ArgumentException(repository.mensagem.MessageBase);
                    #endregion
                }
                else
                {
                    result.mensagem.Code = -1; // Tem que devolver -1 porque na Superclasse, se devolver zero, vai executar novamente o SaveChanges.
                }
            }
            catch (ArgumentException ex)
            {
                result.mensagem = new Validate()
                {
                    Code = 997, Message = MensagemPadrao.Message(997).ToString(), MessageBase = ex.Message
                };
            }
            catch (App_DominioException ex)
            {
                result.mensagem = ex.Result;

                if (ex.InnerException != null)
                {
                    result.mensagem.MessageBase = new App_DominioException(ex.InnerException.Message ?? ex.Message, GetType().FullName).Message;
                }
                else
                {
                    result.mensagem.MessageBase = new App_DominioException(ex.Result.Message, GetType().FullName).Message;
                }
            }
            catch (DbUpdateException ex)
            {
                result.mensagem.MessageBase = ex.InnerException.InnerException.Message ?? ex.Message;
                if (result.mensagem.MessageBase.ToUpper().Contains("REFERENCE"))
                {
                    if (result.mensagem.MessageBase.ToUpper().Contains("DELETE"))
                    {
                        result.mensagem.Code        = 16;
                        result.mensagem.Message     = MensagemPadrao.Message(16).ToString();
                        result.mensagem.MessageType = MsgType.ERROR;
                    }
                    else
                    {
                        result.mensagem.Code        = 28;
                        result.mensagem.Message     = MensagemPadrao.Message(28).ToString();
                        result.mensagem.MessageType = MsgType.ERROR;
                    }
                }
                else if (result.mensagem.MessageBase.ToUpper().Contains("PRIMARY"))
                {
                    result.mensagem.Code        = 37;
                    result.mensagem.Message     = MensagemPadrao.Message(37).ToString();
                    result.mensagem.MessageType = MsgType.WARNING;
                }
                else if (result.mensagem.MessageBase.ToUpper().Contains("UNIQUE KEY"))
                {
                    result.mensagem.Code        = 54;
                    result.mensagem.Message     = MensagemPadrao.Message(54).ToString();
                    result.mensagem.MessageType = MsgType.WARNING;
                }
                else
                {
                    result.mensagem.Code        = 44;
                    result.mensagem.Message     = MensagemPadrao.Message(44).ToString();
                    result.mensagem.MessageType = MsgType.ERROR;
                }
            }
            catch (System.Data.Entity.Validation.DbEntityValidationException ex)
            {
                result.mensagem = new Validate()
                {
                    Code = 42, Message = MensagemPadrao.Message(42).ToString(), MessageBase = ex.EntityValidationErrors.Select(m => m.ValidationErrors.First().ErrorMessage).First()
                };
            }
            catch (Exception ex)
            {
                result.mensagem.Code        = 17;
                result.mensagem.Message     = MensagemPadrao.Message(17).ToString();
                result.mensagem.MessageBase = new App_DominioException(ex.InnerException.InnerException.Message ?? ex.Message, GetType().FullName).Message;
                result.mensagem.MessageType = MsgType.ERROR;
            }
            return(result);
        }