/// <summary>
 /// Create a new PERFIL object.
 /// </summary>
 /// <param name="iD_PERFIL">Initial value of the ID_PERFIL property.</param>
 /// <param name="cOD_PERFIL">Initial value of the COD_PERFIL property.</param>
 /// <param name="nOME_PERFIL">Initial value of the NOME_PERFIL property.</param>
 /// <param name="bOL_ATIVO">Initial value of the BOL_ATIVO property.</param>
 /// <param name="iD_EMPRESA">Initial value of the ID_EMPRESA property.</param>
 public static PERFIL CreatePERFIL(global::System.Guid iD_PERFIL, global::System.String cOD_PERFIL, global::System.String nOME_PERFIL, global::System.Boolean bOL_ATIVO, global::System.Guid iD_EMPRESA)
 {
     PERFIL pERFIL = new PERFIL();
     pERFIL.ID_PERFIL = iD_PERFIL;
     pERFIL.COD_PERFIL = cOD_PERFIL;
     pERFIL.NOME_PERFIL = nOME_PERFIL;
     pERFIL.BOL_ATIVO = bOL_ATIVO;
     pERFIL.ID_EMPRESA = iD_EMPRESA;
     return pERFIL;
 }
 /// <summary>
 /// Deprecated Method for adding a new object to the T_PERFIL EntitySet. Consider using the .Add method of the associated ObjectSet&lt;T&gt; property instead.
 /// </summary>
 public void AddToT_PERFIL(PERFIL pERFIL)
 {
     base.AddObject("T_PERFIL", pERFIL);
 }
        /// <summary>
        /// Método para salvar o perfil
        /// </summary>
        /// <param name="Perfis">Objeto com os dados do perfil</param>
        /// <returns>Contrato.RetornoPerfil</returns>
        internal static Contrato.RetornoPerfil SalvarPerfil(Contrato.EntradaPerfil entradaPerfil)
        {
            // Objeto que recebe o retorno do método
            Contrato.RetornoPerfil retPerfil = new Contrato.RetornoPerfil();

            // Verifica se as informações do perfil foram informadas
            string strValidacao = ValidarPerfilPreenchido(entradaPerfil.Perfil);

            // Objeto que recebe o retorno da sessão
            Contrato.RetornoSessao retSessao = Negocio.Sessao.ValidarSessao(new Contrato.Sessao() { Login = entradaPerfil.UsuarioLogado, Chave = entradaPerfil.Chave });

            // Verifica se o usuário está autenticado
            if (retSessao.Codigo == Contrato.Constantes.COD_RETORNO_SUCESSO)
            {
                // Se existe algum erro
                if (strValidacao.Length > 0)
                {
                    retPerfil.Codigo = Contrato.Constantes.COD_FILTRO_VAZIO;
                    retPerfil.Mensagem = strValidacao;
                }
                else
                {
                    // Loga no banco de dados
                    Dados.BRASIL_DIDATICOS context = new Dados.BRASIL_DIDATICOS();
                    context.ContextOptions.LazyLoadingEnabled = true;

                    // Busca o perfil no banco
                    List<Dados.PERFIL> lstPerfis = (from p in context.T_PERFIL
                                                    where (p.COD_PERFIL == entradaPerfil.Perfil.Codigo
                                                          && (entradaPerfil.EmpresaLogada.Id == Guid.Empty || p.ID_EMPRESA == entradaPerfil.EmpresaLogada.Id))
                                                       || (entradaPerfil.Novo == null && entradaPerfil.Perfil.Id == p.ID_PERFIL)
                                                    select p).ToList();

                     // Verifica se foi encontrado algum registro
                    if (lstPerfis.Count > 0 && entradaPerfil.Novo != null && (bool)entradaPerfil.Novo)
                    {
                        // Preenche o objeto de retorno
                        retPerfil.Codigo = Contrato.Constantes.COD_REGISTRO_DUPLICADO;
                        retPerfil.Mensagem = string.Format("O perfil de código '{0}' já existe!", lstPerfis.First().COD_PERFIL);
                    }
                    else
                    {
                        // Se existe o perfil
                        if (lstPerfis.Count > 0)
                        {
                            // Atualiza o perfil
                            lstPerfis.First().NOME_PERFIL = entradaPerfil.Perfil.Nome;
                            lstPerfis.First().DES_PERFIL = entradaPerfil.Perfil.Descricao;
                            lstPerfis.First().BOL_ATIVO = entradaPerfil.Perfil.Ativo;
                            lstPerfis.First().DATA_ATUALIZACAO = DateTime.Now;
                            lstPerfis.First().LOGIN_USUARIO = entradaPerfil.UsuarioLogado;

                            // Apaga todos os perfis que estão relacionados
                            while (lstPerfis.First().T_PERFIL_PERMISSAO.Count > 0)
                            {
                                context.T_PERFIL_PERMISSAO.DeleteObject(lstPerfis.First().T_PERFIL_PERMISSAO.First());
                            }

                            // Verifica se existe algum perfil associado ao usuário
                            if (entradaPerfil.Perfil.Permissoes != null)
                            {
                                // Para cada perfil associado
                                foreach (Contrato.Permissao permissao in entradaPerfil.Perfil.Permissoes)
                                {
                                    // Associa o perfil ao usuário
                                    lstPerfis.First().T_PERFIL_PERMISSAO.Add(new Dados.PERFIL_PERMISSAO()
                                    {
                                        ID_PERFIL_PERMISSAO = Guid.NewGuid(),
                                        ID_PERFIL = lstPerfis.First().ID_PERFIL,
                                        ID_PERMISSAO = permissao.Id,
                                        LOGIN_USUARIO = entradaPerfil.UsuarioLogado,
                                        DATA_ATUALIZACAO = DateTime.Now
                                    });
                                }
                            }
                        }
                        else
                        {
                            // Cria o perfil
                            Dados.PERFIL tPerfil = new Dados.PERFIL();
                            tPerfil.ID_PERFIL = Guid.NewGuid();
                            tPerfil.ID_EMPRESA = entradaPerfil.EmpresaLogada.Id;
                            tPerfil.COD_PERFIL = entradaPerfil.Perfil.Codigo;
                            tPerfil.NOME_PERFIL = entradaPerfil.Perfil.Nome;
                            tPerfil.DES_PERFIL = entradaPerfil.Perfil.Descricao;
                            tPerfil.BOL_ATIVO = entradaPerfil.Perfil.Ativo;
                            tPerfil.DATA_ATUALIZACAO = DateTime.Now;
                            tPerfil.LOGIN_USUARIO = entradaPerfil.UsuarioLogado;

                            // Verifica se existe algum perfil associado ao usuário
                            if (entradaPerfil.Perfil.Permissoes != null)
                            {
                                // Para cada perfil associado
                                foreach (Contrato.Permissao permissao in entradaPerfil.Perfil.Permissoes)
                                {
                                    // Associa o perfil ao usuário
                                    tPerfil.T_PERFIL_PERMISSAO.Add(new Dados.PERFIL_PERMISSAO()
                                    {
                                        ID_PERFIL_PERMISSAO = Guid.NewGuid(),
                                        ID_PERFIL = entradaPerfil.Perfil.Id,
                                        ID_PERMISSAO = permissao.Id,
                                        LOGIN_USUARIO = entradaPerfil.UsuarioLogado,
                                        DATA_ATUALIZACAO = DateTime.Now
                                    });
                                }
                            }

                            context.AddToT_PERFIL(tPerfil);
                        }

                        // Salva as alterações
                        context.SaveChanges();

                        // Preenche o objeto de retorno
                        retPerfil.Codigo = Contrato.Constantes.COD_RETORNO_SUCESSO;
                    }
                }
            }
            else
            {
                // retorna quando o usuário não está autenticado
                retPerfil.Codigo = retSessao.Codigo;
                retPerfil.Mensagem = retSessao.Mensagem;
            }

            // retorna dos dados
            return retPerfil;
        }