/// <summary>
        /// Método para listar os orcamentos
        /// </summary>
        /// <param name="Orcamento">Objeto com os dados do filtro</param>
        /// <returns>Contrato.RetornoOrcamento</returns>
        internal static Contrato.RetornoOrcamento ListarOrcamento(Contrato.EntradaOrcamento entradaOrcamento)
        {
            // Objeto que recebe o retorno do método
            Contrato.RetornoOrcamento retOrcamento = new Contrato.RetornoOrcamento();

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

            // Verifica se o usuário está autenticado
            if (retSessao.Codigo == Contrato.Constantes.COD_RETORNO_SUCESSO)
            {
                // Verifica se a empresa não foi informada
                if (string.IsNullOrWhiteSpace(entradaOrcamento.EmpresaLogada.Id.ToString()))
                {
                    entradaOrcamento.EmpresaLogada.Id = Guid.Empty;
                }

                // Verifica se o código não foi informado
                if (string.IsNullOrWhiteSpace(entradaOrcamento.Orcamento.Codigo))
                {
                    entradaOrcamento.Orcamento.Codigo = string.Empty;
                }

                // Verifica se o cliente não foi informado
                if (entradaOrcamento.Orcamento.Cliente == null)
                {
                    entradaOrcamento.Orcamento.Cliente = new Contrato.Cliente();
                }

                // Verifica se o Vendedor não foi informado
                if (entradaOrcamento.Orcamento.Vendedor == null)
                {
                    entradaOrcamento.Orcamento.Vendedor = new Contrato.Usuario();
                }

                // Verifica se o Responsável não foi informado
                if (entradaOrcamento.Orcamento.Responsavel == null)
                {
                    entradaOrcamento.Orcamento.Responsavel = new Contrato.Usuario();
                }

                // Verifica se o estado do orçamento não foi informado
                if (entradaOrcamento.Orcamento.Estado == null)
                {
                    entradaOrcamento.Orcamento.Estado = new Contrato.EstadoOrcamento();
                }

                // Loga no banco de dados
                Dados.BRASIL_DIDATICOS context = new Dados.BRASIL_DIDATICOS();
                context.ContextOptions.LazyLoadingEnabled = true;

                if (entradaOrcamento.Paginar)
                {
                    // Busca o orcamento no banco
                    var lstOrcamentos = (from o in context.T_ORCAMENTO.Include("T_ITEM")
                                    where
                                        (entradaOrcamento.EmpresaLogada.Id == Guid.Empty || o.ID_EMPRESA == entradaOrcamento.EmpresaLogada.Id)
                                    &&  (o.DATA_ORCAMENTO >= entradaOrcamento.Orcamento.Data)
                                    &&  (entradaOrcamento.Orcamento.Codigo == string.Empty || o.COD_ORCAMENTO.Contains(entradaOrcamento.Orcamento.Codigo))
                                    &&  (entradaOrcamento.Orcamento.Cliente.Id == Guid.Empty || o.ID_CLIENTE == entradaOrcamento.Orcamento.Cliente.Id)
                                    &&  (entradaOrcamento.Orcamento.Vendedor.Id == Guid.Empty || o.ID_USUARIO_VENDEDOR == entradaOrcamento.Orcamento.Vendedor.Id)
                                    &&  (entradaOrcamento.Orcamento.Responsavel.Id == Guid.Empty || o.ID_USUARIO_RESPONSAVEL == entradaOrcamento.Orcamento.Responsavel.Id)
                                    &&  (entradaOrcamento.Orcamento.Estado.Id == Guid.Empty || o.ID_ESTADO_ORCAMENTO == entradaOrcamento.Orcamento.Estado.Id)
                                    select o
                                    ).OrderByDescending(o => o.DATA_ORCAMENTO).Skip(entradaOrcamento.PosicaoUltimoItem).Take(entradaOrcamento.CantidadeItens)
                                     .Select(o => new
                                     {
                                         o,
                                         e = o.T_ESTADO_ORCAMENTO,
                                         c = o.T_CLIENTE,
                                         v = o.T_USUARIO_VENDEDOR,
                                         r = o.T_USUARIO_RESPOSANVEL,
                                         i = o.T_ITEM
                                     }).ToList();

                    // Verifica se foi encontrado algum registro
                    if (lstOrcamentos.Count > 0)
                    {
                        // Preenche o objeto de retorno
                        retOrcamento.Codigo = Contrato.Constantes.COD_RETORNO_SUCESSO;
                        retOrcamento.Orcamentos = new List<Contrato.Orcamento>();

                        foreach (var item in lstOrcamentos)
                        {
                            retOrcamento.Orcamentos.Add(new Contrato.Orcamento()
                            {
                                Id = item.o.ID_ORCAMENTO,
                                Codigo = item.o.COD_ORCAMENTO,
                                Data = item.o.DATA_ORCAMENTO,
                                ValorDesconto = item.o.NUM_DESCONTO,
                                PrazoEntrega = item.o.NUM_PRAZO_ENTREGA,
                                ValidadeOrcamento = item.o.NUM_VALIDADE_ORCAMENTO,
                                Estado = Negocio.EstadoOrcamento.BuscarOrcamentoEstadoOrcamento(item.e),
                                Cliente = Negocio.Cliente.BuscarCliente(item.c),
                                Responsavel = Negocio.Usuario.BuscarUsuario(item.r),
                                Vendedor = Negocio.Usuario.BuscarUsuario(item.v),
                                Itens = Negocio.Item.ListarOrcamentoItem(item.i)
                            });
                        }
                    }
                }
                else
                {
                    var lstOrcamentos = (from o in context.T_ORCAMENTO
                                         where (entradaOrcamento.EmpresaLogada.Id == Guid.Empty || o.ID_EMPRESA == entradaOrcamento.EmpresaLogada.Id)
                                          && (o.DATA_ORCAMENTO >= entradaOrcamento.Orcamento.Data)
                                          && (entradaOrcamento.Orcamento.Codigo == string.Empty || o.COD_ORCAMENTO.Contains(entradaOrcamento.Orcamento.Codigo))
                                          && (entradaOrcamento.Orcamento.Cliente.Id == Guid.Empty || o.ID_CLIENTE == entradaOrcamento.Orcamento.Cliente.Id)
                                          && (entradaOrcamento.Orcamento.Vendedor.Id == Guid.Empty || o.ID_USUARIO_VENDEDOR == entradaOrcamento.Orcamento.Vendedor.Id)
                                          && (entradaOrcamento.Orcamento.Responsavel.Id == Guid.Empty || o.ID_USUARIO_RESPONSAVEL == entradaOrcamento.Orcamento.Responsavel.Id)
                                          && (entradaOrcamento.Orcamento.Estado.Id == Guid.Empty || o.ID_ESTADO_ORCAMENTO == entradaOrcamento.Orcamento.Estado.Id)
                                         select new { o, i = o.T_ITEM }).ToList();

                    // Verifica se foi encontrado algum registro
                    if (lstOrcamentos.Count > 0)
                    {
                        // Preenche o objeto de retorno
                        retOrcamento.Codigo = Contrato.Constantes.COD_RETORNO_SUCESSO;
                        retOrcamento.Orcamentos = new List<Contrato.Orcamento>();

                        foreach (var item in lstOrcamentos)
                        {
                            retOrcamento.Orcamentos.Add(new Contrato.Orcamento()
                            {
                                Id = item.o.ID_ORCAMENTO,
                                Codigo = item.o.COD_ORCAMENTO,
                                Data = item.o.DATA_ORCAMENTO,
                                ValorDesconto = item.o.NUM_DESCONTO,
                                PrazoEntrega = item.o.NUM_PRAZO_ENTREGA,
                                ValidadeOrcamento = item.o.NUM_VALIDADE_ORCAMENTO,
                                Estado = Negocio.EstadoOrcamento.BuscarOrcamentoEstadoOrcamento(item.o.T_ESTADO_ORCAMENTO),
                                Cliente = Negocio.Cliente.BuscarCliente(item.o.T_CLIENTE),
                                Responsavel = Negocio.Usuario.BuscarUsuario(item.o.T_USUARIO_RESPOSANVEL),
                                Vendedor = Negocio.Usuario.BuscarUsuario(item.o.T_USUARIO_VENDEDOR),
                                Itens = Negocio.Item.ListarOrcamentoItem(item.i)
                            });
                        }
                    }
                }

                if (retOrcamento.Orcamentos == null || retOrcamento.Orcamentos.Count == 0)
                {
                    // Preenche o objeto de retorno
                    retOrcamento.Codigo = Contrato.Constantes.COD_RETORNO_VAZIO;
                    retOrcamento.Mensagem = "Não existe dados para o filtro informado.";
                }
            }
            else
            {
                // retorna quando o usuário não está autenticado
                retOrcamento.Codigo = retSessao.Codigo;
                retOrcamento.Mensagem = retSessao.Mensagem;
            }

            // retorna os dados
            return retOrcamento;
        }
        /// <summary>
        /// Método para salvar o orcamento
        /// </summary>
        /// <param name="entradaOrcamento">Objeto com os dados do orcamento</param>
        /// <returns>Contrato.RetornoOrcamento</returns>
        internal static Contrato.RetornoOrcamento SalvarOrcamento(Contrato.EntradaOrcamento entradaOrcamento)
        {
            // Objeto que recebe o retorno do método
            Contrato.RetornoOrcamento retOrcamento = new Contrato.RetornoOrcamento();

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

            // Verifica se o usuário está autenticado
            if (retSessao.Codigo == Contrato.Constantes.COD_RETORNO_SUCESSO)
            {
                // Verifica se as informações do orcamento foram informadas
                string strValidacao = ValidarOrcamentoPreenchido(entradaOrcamento.Orcamento);

                // Se existe algum erro
                if (strValidacao.Length > 0)
                {
                    retOrcamento.Codigo = Contrato.Constantes.COD_FILTRO_VAZIO;
                    retOrcamento.Mensagem = strValidacao;
                }
                else
                {
                    // Loga no banco de dados
                    Dados.BRASIL_DIDATICOS context = new Dados.BRASIL_DIDATICOS();
                    context.ContextOptions.LazyLoadingEnabled = true;

                    // Busca o orcamento no banco
                    List<Dados.ORCAMENTO> lstOrcamentos = (from p in context.T_ORCAMENTO
                                                           where (p.COD_ORCAMENTO == entradaOrcamento.Orcamento.Codigo
                                                                 && (entradaOrcamento.EmpresaLogada.Id == Guid.Empty || p.ID_EMPRESA == entradaOrcamento.EmpresaLogada.Id))
                                                              || (entradaOrcamento.Novo == null && entradaOrcamento.Orcamento.Id == p.ID_ORCAMENTO)
                                                           select p).ToList();

                    // Verifica se foi encontrado algum registro
                    if (lstOrcamentos.Count > 0 && entradaOrcamento.Novo != null && (bool)entradaOrcamento.Novo)
                    {
                        // Preenche o objeto de retorno
                        retOrcamento.Codigo = Contrato.Constantes.COD_REGISTRO_DUPLICADO;
                        retOrcamento.Mensagem = string.Format("O orcamento de código '{0}' já existe!", lstOrcamentos.First().COD_ORCAMENTO);
                    }
                    else
                    {
                        // Se existe o orcamento
                        if (lstOrcamentos.Count > 0)
                        {
                            // Atualiza o orcamento
                            lstOrcamentos.First().COD_ORCAMENTO = entradaOrcamento.Orcamento.Codigo;
                            lstOrcamentos.First().DATA_ORCAMENTO = entradaOrcamento.Orcamento.Data;
                            lstOrcamentos.First().ID_CLIENTE = entradaOrcamento.Orcamento.Cliente.Id;
                            lstOrcamentos.First().ID_ESTADO_ORCAMENTO = entradaOrcamento.Orcamento.Estado.Id;
                            lstOrcamentos.First().ID_USUARIO_VENDEDOR = entradaOrcamento.Orcamento.Vendedor.Id;
                            lstOrcamentos.First().ID_USUARIO_RESPONSAVEL = entradaOrcamento.Orcamento.Responsavel.Id;
                            lstOrcamentos.First().NUM_DESCONTO = entradaOrcamento.Orcamento.ValorDesconto;
                            lstOrcamentos.First().NUM_PRAZO_ENTREGA = entradaOrcamento.Orcamento.PrazoEntrega;
                            lstOrcamentos.First().NUM_VALIDADE_ORCAMENTO = entradaOrcamento.Orcamento.ValidadeOrcamento;
                            lstOrcamentos.First().DATA_ATUALIZACAO = DateTime.Now;
                            lstOrcamentos.First().LOGIN_USUARIO = entradaOrcamento.UsuarioLogado;

                            // Apaga todos os itens que estão relacionados
                            while (lstOrcamentos.First().T_ITEM.Count > 0)
                            {
                                context.T_ITEM.DeleteObject(lstOrcamentos.First().T_ITEM.First());
                            }

                            // Verifica se existe algum item associado ao orçamento
                            if (entradaOrcamento.Orcamento.Itens != null)
                            {
                                // Para cada item associado
                                foreach (Contrato.Item item in entradaOrcamento.Orcamento.Itens)
                                {
                                    Negocio.Item.SalvarItemOrcamento(lstOrcamentos.First(), entradaOrcamento.UsuarioLogado, item);
                                }
                            }
                        }
                        else
                        {
                            // Recupera o código do orçamento
                            string codigoOrcamento = string.Empty;
                            if (entradaOrcamento.Orcamento.Codigo != string.Empty)
                                codigoOrcamento = entradaOrcamento.Orcamento.Codigo;
                            else
                            {
                                System.Data.Objects.ObjectParameter objCodigoOrcamento = new System.Data.Objects.ObjectParameter("P_CODIGO", typeof(global::System.Int32));
                                context.RETORNAR_CODIGO(Contrato.Constantes.TIPO_COD_ORCAMENTO, entradaOrcamento.EmpresaLogada.Id, objCodigoOrcamento);
                                codigoOrcamento = Util.RecuperaCodigo((int)objCodigoOrcamento.Value, Contrato.Constantes.TIPO_COD_ORCAMENTO);
                            }

                            // Cria o orcamento
                            Dados.ORCAMENTO tOrcamento = new Dados.ORCAMENTO();
                            tOrcamento.ID_ORCAMENTO = Guid.NewGuid();
                            tOrcamento.COD_ORCAMENTO = codigoOrcamento;
                            tOrcamento.DATA_ORCAMENTO = entradaOrcamento.Orcamento.Data;
                            tOrcamento.ID_EMPRESA = entradaOrcamento.EmpresaLogada.Id;
                            tOrcamento.ID_CLIENTE = entradaOrcamento.Orcamento.Cliente.Id;
                            tOrcamento.ID_ESTADO_ORCAMENTO = entradaOrcamento.Orcamento.Estado.Id;
                            tOrcamento.ID_USUARIO_VENDEDOR = entradaOrcamento.Orcamento.Vendedor.Id;
                            tOrcamento.ID_USUARIO_RESPONSAVEL = entradaOrcamento.Orcamento.Responsavel.Id;
                            tOrcamento.NUM_DESCONTO = entradaOrcamento.Orcamento.ValorDesconto;
                            tOrcamento.NUM_PRAZO_ENTREGA = entradaOrcamento.Orcamento.PrazoEntrega;
                            tOrcamento.NUM_VALIDADE_ORCAMENTO = entradaOrcamento.Orcamento.ValidadeOrcamento;
                            tOrcamento.DATA_ATUALIZACAO = DateTime.Now;
                            tOrcamento.LOGIN_USUARIO = entradaOrcamento.UsuarioLogado;

                            // Verifica se existe algum item associado ao orçamento
                            if (entradaOrcamento.Orcamento.Itens != null)
                            {
                                // Para cada item associado
                                foreach (Contrato.Item item in entradaOrcamento.Orcamento.Itens)
                                {
                                    Negocio.Item.SalvarItemOrcamento(tOrcamento, entradaOrcamento.UsuarioLogado, item);
                                }
                            }

                            context.AddToT_ORCAMENTO(tOrcamento);
                        }

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

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

            // retorna dos dados
            return retOrcamento;
        }