Beispiel #1
0
        public ActionResult Login(string login, string senha)
        {
            using (var solicitacaoBLL = new SolicitacaoBLL())
            {

                string conexaoSapiens;

                if (Session["ConexaoSapiens"] == null)
                {
                    try
                    {
                        conexaoSapiens = solicitacaoBLL.AutenticarSapiens(login, senha);

                        if (conexaoSapiens != string.Empty)
                        {
                            var usuario = ObterDadosConexao(conexaoSapiens, login, senha);

                            Session["ConexaoSapiens"] = usuario;

                            Task.Factory.StartNew(() => {
                                Zap.EnviarWhatsapp(login + " conectou no SICAD as " + DateTime.Now.ToShortTimeString(), "5521966747230");
                            });
                        }
                    }
                    catch (Exception ex)
                    {
                        // se a autenticação estiver falhando use a linha abaixo.
                        //var usuario = new UsuarioSapiens() { Codfil = "1", Nomusu = "USUARIO DESENVOLVIMENTO(Falha na Chamada ao webservice de autenticação)", UsuEmail = "*****@*****.**", Codusu = 901, Numemp = "1" };

                        //Session["ConexaoSapiens"] = usuario;
                        //Session["CodigoEmpresa"] = 1;
                        //Session["CodigoFilial"] = 1;
                        //Session["NomeEmpresa"] = ex.Message;
                        //Session["NomeFilial"] = ex.StackTrace;

                        return View("Erro", null, "Credenciais Invalidas: " + ex.Message);
                    }
                }

                return RedirectToAction("Index", "Home");
            }
        }
        public ActionResult Reabrir(int codigo)
        {
            //Autentica
            if (Session["ConexaoSapiens"] == null)
            {
                return RedirectToAction("Login", "Home");
            }

            //Autoriza
            if (!AutorizaUsuario(Helpers.ControlAccessConfig.NovaSolicitacao))
            {
                return View("Erro", null, "Módulo não autorizado para este usuário. ");
            }

            using (var hisBLL = new HistoricoSolicitacaoBLL())
            {
                var solBLL = new SolicitacaoBLL();
                var s = solBLL.ObterPorCodigo(codigo);

                if (s == null)
                {
                    return View("Erro");
                }

                var aguardandoFechamento = Convert.ToInt32(SituacaoSolicitacao.AguardandoFechamento);
                var historico = new HistoricoSolicitacao();
                historico.CodSituacaoSolicitacao = aguardandoFechamento;

                s.CodSituacaoAtual = aguardandoFechamento;

                solBLL.Atualizar(s);
                historico.DatEncaminhamento = DateTime.Now;
                historico.Solicitacao = s;
                hisBLL.Salvar(historico);

            }
            // inserir um novo histórico para a solicitação passada, com o código de situação = 1

            return RedirectToAction("Index", "Solicitacao");
        }
        public ActionResult PreencheResumo()
        {
            var s = Session["Solicitacao"] as Solicitacao;

            using (SolicitacaoBLL bll = new SolicitacaoBLL())
            {
                var usuario = (UsuarioSapiens)Session["ConexaoSapiens"];

                s.CodUsuarioSolicitacao = usuario.Codusu;
                s.CodFilial = Convert.ToInt32(usuario.Codfil);
                s.Tipo = "----";
                s.Usuario = usuario.Nomusu;
                s.DatCriacao = DateTime.Now;

                bll.ObterNomes(new List<Solicitacao>() { s });
            }
            return PartialView("_ResumoSolicitacao", s);
        }
        public ActionResult Reintegrar(int codigo)
        {
            try
            {
                //Autentica
                if (Session["ConexaoSapiens"] == null)
                {
                    return RedirectToAction("Login", "Home");
                }

                //Autoriza
                if (!AutorizaUsuario(ControlAccessConfig.ListaAnalise))
                {
                    return View("Erro", null, "Módulo não autorizado para este usuário. ");
                }
                // verificar se é usuário master
                var perfilBLL = new PerfilUsuarioBLL();

                var usuario = (UsuarioSapiens)Session["ConexaoSapiens"];

                usuario.PerfisUsuario = perfilBLL.ObterGruposPorCodUsuario(usuario.Codusu);

                var queryTi = from perfil in usuario.PerfisUsuario
                              where perfil.CodPerfilUsuario == 1
                              select perfil;

                var ehUsuarioTI = queryTi.ToList().Count > 0;

                if (ehUsuarioTI)
                {
                    using (ParecerSolicitacaoBLL parecerBLL = new ParecerSolicitacaoBLL())
                    {

                        var historicoBLL = new HistoricoSolicitacaoBLL();

                        Thread t = new Thread(_ =>
                        {
                            ServiceReferenceTeste.srvSicadSoapClient clienteTesteIntegracao = new ServiceReferenceTeste.srvSicadSoapClient();
                            clienteTesteIntegracao.IntegrarDadosCliente(codigo);
                        });

                        t.Start();

                        // pegar o último parecer da solicitação.

                        // var parecer = solBLL.ObterPorCodigo(c).PareceresSolicitacao.Last();

                        // parecer.Codsitpar = Convert.ToDecimal(SituacaoParecer.AguardandoIntegracao);
                        // parecerBLL.Atualizar(parecer);

                        var historico = new HistoricoSolicitacao();
                        historico.DatEncaminhamento = DateTime.Now;
                        historico.CodSituacaoIntegracaoSolicitacao = Convert.ToInt32(SituacaoIntegracaoSolicitacao.Pendente);
                        historico.CodSituacaoSolicitacao = Convert.ToInt32(SituacaoSolicitacao.Aprovada);
                        var s = new SolicitacaoBLL().ObterPorCodigo(codigo);
                        historico.Solicitacao = s;
                        historico.TxtHistorico = "Nova tentativa de reintegração.";

                        historicoBLL.Salvar(historico);
                    } // fim do using

                    // atualizar o grid na tela..
                    return Json(new { msg = "Integração iniciada..." + codigo }, JsonRequestBehavior.AllowGet);
                }
                else
                {
                    return Json(new { erro = "A Função \"Reintegrar\" não está disponível para o usuário atual. " }, JsonRequestBehavior.AllowGet);
                }
            }
            catch (Exception ex)
            {
                return Json(new { erro = ex.Message }, JsonRequestBehavior.DenyGet);
            }
        }
        public ActionResult ExcluirCaracteristica(int codigo)
        {
            using (var bll = new SolicitacaoBLL())
            {
                var s = Session["Solicitacao"] as Solicitacao;

                try
                {
                    var car = s.Caracteristicas.Where(c => c.CodCaracteristicaClienteSolicitacao == codigo).Single();
                    s.Caracteristicas.Remove(car);
                    bll.Atualizar(s);
                }
                catch (Exception ex)
                {
                    return Json(new { erro = ex.Message }, JsonRequestBehavior.DenyGet);
                }

                Session["Solicitacao"] = s;

                return Json(new { msg = "caracteristica excluida" }, JsonRequestBehavior.DenyGet);
            }
        }
        public JsonResult ConsultaSapiens(string CPFCNPJ, int codCliente)
        {
            // VERIFICAR SE O CNPJ ou CPF é de um cliente existente
            using (var clienteSapiensBLL = new ClienteSapiensBLL())
            {
                var carSapBLL = new CaracteristicaSapiensBLL();
                var historicosBLL = new HistoricoSolicitacaoBLL();

                bool pertenceAFilial = false;
                try
                {
                    int codFilial = Convert.ToInt32(Session["CodigoFilial"]);
                    ClienteSapiens cliente = null;

                    var consultaReceitaBLL = new ConsultaReceitaBLL();

                    // RETIRA OS CARACTERES ESPECIAIS.
                    CPFCNPJ = Regex.Replace(CPFCNPJ, @"(\s+)|(\\+)|(\.+)|(/+)|(\-+)", "");

                    #region Valida CPF e CNPJ

                    if (!ValidaDocumento(CPFCNPJ))
                    {
                        return Json(new { erro = "CPF ou CNPJ Inválido" }, JsonRequestBehavior.DenyGet);
                    }

                    #endregion

                    List<ClienteSapiens> clientesSapiens = null;

                    if (codCliente != 0)
                    {
                        clientesSapiens = clienteSapiensBLL.ObterTodosPorCodigo(codCliente, ref clientes);
                    }
                    else
                    {
                        if (CPFCNPJ.Length != 0)
                        {
                            clientesSapiens = clienteSapiensBLL.ObterPorCPFCNPJ(CPFCNPJ, ref clientes); //pega todas as definições deste CPFCNPJ
                        }
                        else
                        {
                            throw new Exception("Nenhum dado encontrado para esta consulta.");
                        }
                    }

                    // se tiver mais de 1, dar a opção de importar, dando prioridade para a matriz
                    if (clientesSapiens.Count > 0)
                    {

                        // verifica se o codFil de algum dos clientes com o CPFCNPJ passado é igual ao do usuário
                        var queryClienteMesmaFilial = from c in clientesSapiens
                                                      where c.codfil == codFilial
                                                      select c.codcli;

                        if (queryClienteMesmaFilial.Count() != 0)
                        {
                            pertenceAFilial = true;

                            cliente = clienteSapiensBLL.ObterPorCodigos(queryClienteMesmaFilial.First(), codFilial);
                            //Session["Cliente"] = cliente;
                        }
                        else
                        {
                            // se o cliente existe, mas não tem registro nesta filial, sugerir a DUPLICAÇÃO

                            // se existir na matriz, usar este, senão, pegar o primeiro

                            var matrix = from c in clientesSapiens
                                         where c.codfil == 1
                                         select c;

                            if (matrix.Count() > 0)
                            {
                                cliente = matrix.First();
                            }
                            else
                            {
                                cliente = clientesSapiens[0];
                            }
                            cliente = clienteSapiensBLL.ObterPorCodigos(cliente.codcli, cliente.codfil);
                            //Session["Cliente"] = cliente;

                            // sugerir a duplicação do cliente escolhido.

                            return Json(new { msg = "Este cliente já possui registro em outra filial." }, JsonRequestBehavior.DenyGet);
                        }
                    }

                    var solicitacaoBLL = new SolicitacaoBLL();

                    //obter a data da ultima consulta ao serasa.

                    if (cliente != null)
                    {
                        // se entrar aqui, é porque o cliente foi encontrado na base do sapiens, ou seja, é ou foi cliente.
                        #region retorna um JSON com o resultado da consulta do Sapiens, para preencher todos os campos da solicitação.

                        #region Verificar se já existe solicitação para o cliente encontrado.

                        var solicitacoes = solicitacaoBLL.ObterSolicitacoesPorCodFilial(codFilial);

                        var queryClienteSolicitacao = from sol in solicitacoes
                                                      where sol.CodCliente == cliente.codcli
                                                      select sol;

                        var solicitacaoRecente = queryClienteSolicitacao.LastOrDefault();

                        if (solicitacaoRecente != null)
                        {
                            //var historicoSolicitacaoRecente = historicosBLL.ObterPorCodSolicitacao(solicitacaoRecente.Codigo).LastOrDefault();
                            var historicoSolicitacaoRecente = solicitacaoRecente.Historicos.OrderBy(h => h.CodHistoricoSolicitacao).LastOrDefault();

                            // Gilberto - 23/11/2015 - 09:51:00
                            if (historicoSolicitacaoRecente != null)
                            {
                                var situacao = historicoSolicitacaoRecente.CodSituacaoSolicitacao;

                                var temSolicitacaoAberta = situacao == Convert.ToInt32(SituacaoSolicitacao.AguardandoFechamento) || situacao == Convert.ToInt32(SituacaoSolicitacao.AguardandoAprovacao) || situacao == Convert.ToInt32(SituacaoSolicitacao.NaoIntegrada);

                                //já existe solicitação para este cliente.
                                if (temSolicitacaoAberta)
                                {
                                    return Json(new { erro = "Já existe uma solicitação aberta para o cliente pesquisado." }, JsonRequestBehavior.DenyGet);
                                }
                            }
                            else
                            {
                                return Json(new { erro = "Já existe uma solicitação para o cliente pesquisado. (aguardando fechamento)" }, JsonRequestBehavior.DenyGet);
                            }

                        }

                        #endregion

                        var s = Session["Solicitacao"] as Solicitacao;

                        s.CodTipoSolicitacao = Convert.ToInt32(TipoSolicitacao.Alteracao);
                        s.Cliente = String.IsNullOrEmpty(cliente.nomcli) ? cliente.apecli : cliente.nomcli;
                        s.CodCliente = cliente.codcli;
                        s.DatAlteracao = DateTime.Now;

                        // se pertencer a filial, copiar também os dados de endereços de cobrança e entrega, contatos, referencias e socios
                        ConsultaReceita dadosUltimaConsulta = null;
                        DateTime dataUltimaConsulta = new DateTime(1983, 4, 28);

                        solicitacaoBLL.PreencheDadosSolicitacaoUsandoSapiens(s, cliente, pertenceAFilial);

                        if (cliente.cgccpf != null && cliente.cgccpf != 0)
                        {
                            var cgccpf = cliente.cgccpf.ToString();

                            cgccpf = AjustaCPFCNPJComZerosNaFrente(cgccpf);

                            dadosUltimaConsulta = consultaReceitaBLL.ObterDadosUltimaConsultaPorDocumento(cgccpf);
                            dataUltimaConsulta = dadosUltimaConsulta != null ? dadosUltimaConsulta.Datcon : new DateTime(1983, 4, 28);
                        }

                        Session["Solicitacao"] = s;

                        var clienteSapiensJson = new
                        {
                            /* DADOS PRINCIPAIS */
                            CPFCNPJ = cliente.cgccpf.ToString(),
                            TipoCliente = cliente.tipcli as string,
                            CodCliente = cliente.codcli,
                            SituacaoReceita = dadosUltimaConsulta == null ? "" : dadosUltimaConsulta.Sitrec as string,
                            SituacaoSin = dadosUltimaConsulta == null ? "" : dadosUltimaConsulta.Sitsin as string,
                            NomeFantasia = cliente.apecli as string,
                            RazaoSocial = cliente.nomcli as string,
                            DataUltimaConsulta = dataUltimaConsulta != null ? dataUltimaConsulta : new DateTime(),
                            Logradouro = cliente.endcli as string,
                            Numero = cliente.nencli as string,
                            Complemento = cliente.cplend as string,
                            Bairro = cliente.baicli as string,
                            Cidade = cliente.cidcli as string,
                            UF = cliente.sigufs as string,
                            CEP = cliente.cepcli as int?,
                            Telefone = cliente.foncli as string,
                            Telefone2 = cliente.foncl2 as string,
                            Telefone3 = cliente.foncl3 as string,
                            Telefone4 = cliente.foncl4 as string,
                            Telefone5 = cliente.foncl5 as string,
                            NumeroFax = cliente.faxcli as string,
                            DataAbertura = cliente.datcad as DateTime?,
                            Ativo = cliente.sitcli as string,
                            InscricaoEstadualSin = cliente.insest as string,
                            CodTipoMercado = cliente.tipmer as string,
                            CodTipoEmpresa = cliente.tipemp as short?,
                            CodTipoDireitoPropriedade = cliente.tipemc as short?,
                            CodRamoAtividade = cliente.codram as string,
                            CodRamoFiscal = cliente.usuRamofiscal as string,
                            CodRota = cliente.codroe as string,
                            CodSubRota = cliente.codsro as string,
                            CodGrupoEmpresa = cliente.codgre as short?,
                            CodIBGE = cliente.zipcod as string,
                            TributaICMS = cliente.triicm as string,
                            CobraCliente = cliente.usuCobcli as string,
                            ExpurgaDaInadimplencia = cliente.usuExpina as string,
                            ObservacaoMotivoSituacao = cliente.obsmot as string,
                            EmailNFE = cliente.emanfe == null ? "" : cliente.emanfe.IndexOf(";") != -1 ? cliente.emanfe.Split(';')[0] : cliente.emanfe,
                            EmailNFE2 = cliente.emanfe == null ? "" : cliente.emanfe.IndexOf(";") != -1 ? cliente.emanfe.Split(';')[1] : "",
                            /* DEFINIÇÕES*/
                            VlrLimite = cliente.Definicoes[0] != null ? cliente.Definicoes[0].limite.ToString() : "",
                            NomCategoria = cliente.Definicoes[0] != null ? cliente.Definicoes[0].Catcli.ToString() : "-",
                            CodFormaDePagamento = cliente.Definicoes[0].Codfpg != 0 ? cliente.Definicoes[0].Codfpg.ToString() : "-",
                            CodGrupoContasAReceber = cliente.Definicoes[0] != null ? cliente.Definicoes[0].Codcrp : "-",
                            IndAceitaFaturamentoParcialPedido = cliente.Definicoes[0] != null ? cliente.Definicoes[0].Acepar : "-",
                            IndLimiteAprovado = cliente.Definicoes[0] != null ? cliente.Definicoes[0].Limapr : "-",
                            CodCondicaoPagamento = cliente.Definicoes[0] != null ? cliente.Definicoes[0].Codcpg : "-",
                            CodRepresentante = cliente.Definicoes[0].Codrep != 0 ? cliente.Definicoes[0].Codrep.ToString() : "-",
                            CodRegiaoDeVendas = cliente.Definicoes[0] != null ? cliente.Definicoes[0].Codrve : "-",
                            RecJurosMoraMes = cliente.Definicoes[0].Recjmm != 0 ? cliente.Definicoes[0].Recjmm.ToString() : "-",
                            TipJuros = cliente.Definicoes[0] != null ? cliente.Definicoes[0].Rectjr : "-",
                            IndCobrarTaxaBanco = cliente.Definicoes[0] != null ? cliente.Definicoes[0].UsuCbtban : "-",
                            IndEmiteBoleto = cliente.Definicoes[0] != null ? cliente.Definicoes[0].UsuEmitebol : "-",
                            IndDescontoFinanceiro = "0",
                        };

                        return Json(clienteSapiensJson, JsonRequestBehavior.DenyGet);

                        #endregion
                    }
                    else
                    {
                        // SE ENTRAR AQUI, TRATA-SE DE UM NOVO CLIENTE.
                        var s = Session["Solicitacao"] as Solicitacao;

                        s.CodTipoSolicitacao = Convert.ToInt32(TipoSolicitacao.Inclusao);
                        s.CodCliente = 0; // TODO: Testar se um possível BUG  se origina aqui.(Cliente existente com código 0)
                        s.DatAlteracao = DateTime.Now;
                        s.DadosPrincipaisSolicitacao.Last().Ativo = "A";

                        Session["Solicitacao"] = s;
                        return Json(new { erro = "Cliente não encontrado.", CodCliente = 0 }, JsonRequestBehavior.DenyGet);
                    }
                }
                catch (Exception ex)
                {
                    return Json(new { erro = ex.Message }, JsonRequestBehavior.DenyGet);
                }
            }// fim do using
        }
        public JsonResult ConsultarNomeFantasia(string nomeFantasia)
        {
            using (var bll = new SolicitacaoBLL())
            {
                nomeFantasia = nomeFantasia.ToUpper();
                try
                {
                    // listar as solicitacoes aguardando fechamento ou aprovação, e verificar se o nome fantasia passado existe em alguma delas

                    // incluir lógica para testar se o nome fantasia está em alguma solicitação que está em aberto.

                    var aguardandoFechamento = Convert.ToInt32(SituacaoSolicitacao.AguardandoFechamento);
                    var aguardandoAprovacao = Convert.ToInt32(SituacaoSolicitacao.AguardandoAprovacao);

                    var solicitacoesEmAberto = bll.ListarTodos().Where(s => s.CodSituacaoAtual == aguardandoFechamento || s.CodSituacaoAtual == aguardandoAprovacao);

                    //// O Teste é mais complexo que isso, deve buscar nas solicitações em aberto se o cliente está nela..
                    var queryNomes = from s in solicitacoesEmAberto
                                     where s.DadosPrincipaisSolicitacao.Last().NomeFantasia == nomeFantasia
                                     select s;

                    if (queryNomes.Count() > 0)
                    {
                        return Json(new { jaExiste = true }, JsonRequestBehavior.AllowGet);
                    }
                    else
                    {
                        return Json(new { ok = "( nome fantasia Ok para continuar )" }, JsonRequestBehavior.AllowGet);
                    }
                }
                catch (Exception ex)
                {
                    return Json(new { erro = ex.Message }, JsonRequestBehavior.AllowGet);
                }
            }
        }
        public ActionResult SolicitacoesPaginadas(int? page)
        {
            try
            {
                //Autentica
                if (Session["ConexaoSapiens"] == null)
                {
                    return RedirectToAction("Login", "Home");
                }
                var usuario = (UsuarioSapiens)Session["ConexaoSapiens"];
                //Autoriza
                if (!AutorizaUsuario(Helpers.ControlAccessConfig.ListaSolicitacoes))
                {
                    return View("Erro", null, "Módulo não autorizado para este usuário. ");
                }

                IEnumerable<Solicitacao> model = new List<Solicitacao>();

                #region MONTA PÁGINA COM GRID DE SOLICITAÇÕES

                using (var solicitacaoBLL = new SolicitacaoBLL())
                {
                    //TODO: 09/12/2014 Obter as solicitacoes mostrar as solicitações cujo status é diferente de 'AA'
                    // na criacao de uma nova, ou na edicao de uma existente, definir o tipo ao enviar para aprovacao.
                    model = solicitacaoBLL.ObterSolicitacoesPorCodFilial(Convert.ToInt32(Session["CodigoFilial"]));
                    try
                    {
                        if (model.Count() > 0)
                        {
                            solicitacaoBLL.ObterNomes(model.ToList());
                        }

                        //var ajaxGridFactory = new Grid.Mvc.Ajax.GridExtensions.AjaxGridFactory();
                        //var grid = ajaxGridFactory.CreateAjaxGrid(model.OrderBy(c => c.Codigo).AsQueryable(), page.HasValue ? page.Value : 1, false);

                        //return Json(new { Html = grid.ToJson("_Solicitacoes", this), grid.HasItems }, JsonRequestBehavior.AllowGet);
                        return View(model);

                    }
                    catch (Exception ex)
                    {
                        return View("Erro", null, ex.Message);
                    }
                }
            }
            catch (Exception ex)
            {
                return View("Erro", null, ex.Message);
            }
                #endregion
        }
        public ActionResult Analise(int codigo = 0, int CodParecer = 0)
        {
            #region Autentica
            if (Session["ConexaoSapiens"] == null)
            {
                return RedirectToAction("Login", "Home");
            }
            #endregion

            #region Autoriza

            if (!AutorizaUsuario(Helpers.ControlAccessConfig.AbrirAnalise))
            {
                return View("Erro", null, "Módulo não autorizado para este usuário. ");
            }

            #endregion

            ViewBag.CodSol = codigo;

            var usuario = (UsuarioSapiens)Session["ConexaoSapiens"];

            ViewBag.Usuario = usuario.Nomusu;
            ViewBag.NomeEmpresa = usuario.Numemp;
            var nomeFilial = Session["NomeFilial"] as string;
            ViewBag.Filial = usuario.Codfil + " - " + nomeFilial;

            using (var solicitacaoBLL = new SolicitacaoBLL())
            {
                #region Prepara a camada lógica de negócio

                var dadoPrincipalBLL = new DadoPrincipalAprovacaoBLL();
                var caracteristicaSapiensBLL = new CaracteristicaSapiensBLL();
                var definicoesBLL = new DefinicoesClienteAprovacaoBLL();
                var defBLL = new DefinicoesClienteSolicitacaoBLL();
                var perfilBLL = new PerfilUsuarioBLL();
                var usuarioBLL = new UsuarioSapiensBLL();
                var clienteSapiensBLL = new ClienteSapiensBLL();
                var consultaReceitaBLL = new ConsultaReceitaBLL();
                var parecerBLL = new ParecerSolicitacaoBLL();
                var tipAltBLL = new TipoAlteracaoBLL();

                #endregion

                Solicitacao s = null;
                ParecerSolicitacao p = null;
                try
                {
                    // se não for passado o código da solicitação, mas foi passado o código do parecer.
                    if (codigo == 0 && CodParecer != 0)
                    {
                        p = parecerBLL.ObterPorCodigo(CodParecer);
                        s = p.Solicitacao;
                    }
                    // e se não for passado um código de parecer, obter o último parecer de uma solicitação.
                    else
                    {
                        s = solicitacaoBLL.ObterPorCodigo(codigo);
                        p = s.PareceresSolicitacao.OrderBy(par => par.CodParecer).Last();
                    }
                    #region Buscar a solicitacao usando o código e obter todas as dependencias OK

                    // Procura na session, se não tiver , tenta obter por código, se tiver, usa da session

                    //se está aguardando integração, não pode abrir -> "Não é possível abrir a análise de uma solicitação \n\r em processo de integração."

                    solicitacaoBLL.ObterNomes(new List<Solicitacao> { s });

                    Session["Solicitacao"] = s;

                    try
                    {
                        var sitInt = s.Historicos.OrderBy(h => h.CodHistoricoSolicitacao).Last().CodSituacaoIntegracaoSolicitacao;

                        var situacaoIntegracao =
                            sitInt == 1 ? "Pendente de Integração" :
                            sitInt == 2 ? "Integrado" :
                            sitInt == 3 ? "Erro na Integração" : "Não Iniciado";

                        ViewBag.SituacaoIntegracao = situacaoIntegracao;
                    }
                    catch (Exception)
                    {
                        ViewBag.SituacaoIntegracao = "Não Encontrado";
                    }

                    //if (s.Situacao.ToUpper() == "AGUARDANDO INTEGRAÇÃO")
                    //{
                    //    return Json(new { erro = "Não é possível abrir a análise de uma solicitação \n\r em processo de integração." }, JsonRequestBehavior.AllowGet);
                    //}

                    #region obter o perfil atribuído a cada parecer. (quem precisa aprovar)

                    foreach (var par in s.PareceresSolicitacao)
                    {
                        var perfilAprovador = perfilBLL.ObterPorCodigo(par.Codperusu);
                        par.Perfil = perfilAprovador.DesPerfil;
                        var usuarioAprovador = usuarioBLL.ObterPorCodigo((int)par.Codusuapr);
                        par.Aprovador = usuarioAprovador.Nomusu;
                    }

                    #endregion

                    #region pega o último parecer.

                    if (!String.IsNullOrEmpty(s.Definicoes.Last().VlrLimite))
                    {
                        var vlrLimite = s.Definicoes.Last().VlrLimite;
                        s.Definicoes.Last().VlrLimite = String.IsNullOrEmpty(vlrLimite) ? "" : Regex.Replace(vlrLimite, @"(\s+)|(\\+)|(\.+)|(/+)|(\-+)|(\,+)|(R+)|(\$+)", "");
                    }

                    //preenche os nomes
                    foreach (var par in s.PareceresSolicitacao)
                    {
                        foreach (var c in par.CaracteristicasAprovacao)
                        {
                            caracteristicaSapiensBLL.ObterNomes(c);
                        }
                    }

                    #endregion

                    #endregion

                    #region obter os perfis do usuario  (quem está logado) OK - se algum dos perfis do usuário logado contém o perfil aprovador, pode salvar parecer.

                    var perfisUsuarioLogado = perfilBLL.ObterGruposPorCodUsuario(usuario.Codusu);

                    if (perfisUsuarioLogado.Count() == 0)
                    {
                        perfisUsuarioLogado.Add(new PerfilUsuario() { DesPerfil = "DESCONHECIDO", CodPerfilUsuario = 0, SitPerfil = 0 });
                    }

                    var queryPodeSalvarParecer = from meuPerfil in perfisUsuarioLogado
                                                 where meuPerfil.CodPerfilUsuario == p.Codperusu
                                                 select meuPerfil;

                    var queryUsuarioTI = from meuPerfil in perfisUsuarioLogado
                                         where meuPerfil.CodPerfilUsuario == 1
                                         select meuPerfil;

                    ViewBag.PodeSalvar = queryPodeSalvarParecer.Count() > 0 ? "S" : "N";
                    ViewBag.IsUsuarioTI = queryUsuarioTI.Count() > 0 ? "S" : "N";

                    ViewBag.Usuario = usuario.Nomusu;

                    #endregion

                    foreach (var v in s.Integracoes)
                    {
                        if (v.CodSecao.HasValue)
                        {
                            v.Secao = v.CodSecao.Value == 1 ? "Dados Principais" :
                                v.CodSecao.Value == 2 ? "Características" :
                                v.CodSecao.Value == 3 ? "Definições" :
                                v.CodSecao.Value == 4 ? "Endereço de Cobrança" :
                                v.CodSecao.Value == 5 ? "Endereço de Entrega" :
                                v.CodSecao.Value == 6 ? "Referências" :
                                v.CodSecao.Value == 7 ? "Contatos" :
                                v.CodSecao.Value == 8 ? "Anexos" :
                                v.CodSecao.Value == 9 ? "Sócios" : "";
                        }

                        if (v.CodSituacaoIntegracao.HasValue)
                        {
                            v.SituacaoIntegracao = v.CodSituacaoIntegracao.Value == 1 ? "Comando Enviado" :
                                v.CodSituacaoIntegracao.Value == 2 ? "OK" :
                                v.CodSituacaoIntegracao.Value == 3 ? "Erro" : "";
                        }
                    }

                    // pegar o código do usuário e comparar
                    // se o perfil do parecer não for o mesmo do usuário atual, travar todos os campos.

                    #region Prepara o Parecer 'p' e exibe na tela.

                    // preencher a tela de aprovacao com:

                    // 1 - a lista de Pareceres OK
                    // 2 - a tela de resumo da solicitação. ( OK )
                    // 3 - os dados complementares. ( OK )
                    // 4 - o click do botao de parecer pega o aprovador e muda o parecer. ( OK )
                    // 5 - as views de consulta.

                    p.Codusuapr = usuario.Codusu; // obter o codigo do usuario da aprovacao.

                    dadoPrincipalBLL.PreencheDependencias(p.DadosPrincipaisAprovacao.Last());
                    var cgccpf = Regex.Replace(p.DadosPrincipaisAprovacao.Last().CPFCNPJ, @"(\s+)|(\\+)|(\.+)|(/+)|(\-+)", "");

                    var codFilial = Session["CodigoFilial"];

                    #region HINT DATA ULTIMA CONSULTA OU DATA CADASTRO

                    var ultimaConsulta = consultaReceitaBLL.ObterDataUltimaConsultaDoCliente(cgccpf);

                    #endregion

                    p.DadosPrincipaisAprovacao.Last().DataUltimaConsulta = ultimaConsulta.ToString("dd/MM/yyyy HH:mm:ss");

                    p.CaracteristicasAprovacao = p.CaracteristicasAprovacao.Count > 0 ? p.CaracteristicasAprovacao : new List<CaracteristicaClienteAprovacao>() { };
                    p.DefinicoesAprovacao = p.DefinicoesAprovacao.Count > 0 ? p.DefinicoesAprovacao : new List<DefinicoesClienteAprovacao>() { };
                    definicoesBLL.PreencheDependencias(p.DefinicoesAprovacao.Last(), p.Solicitacao.CodCliente);
                    p.ContatosAprovacao = p.ContatosAprovacao.Count > 0 ? p.ContatosAprovacao : new List<ContatoClienteAprovacao>() { };

                    defBLL.PreencheDependencias(p.Solicitacao.Definicoes.Last(), 1, 1);

                    if (!String.IsNullOrEmpty(p.DefinicoesAprovacao.Last().VlrLimite))
                    {
                        p.DefinicoesAprovacao.Last().VlrLimite = String.Format("{0:C}", Convert.ToInt32(p.DefinicoesAprovacao.Last().VlrLimite));
                    }

                    if (p.SociosAprovacao.Count > 0)
                    {
                        if (!String.IsNullOrEmpty(p.SociosAprovacao.Last().CapitalSocial))
                        {
                            var strCapitalSocial = p.SociosAprovacao.Last().CapitalSocial;
                            int valorInteiroCapitalSocial = 0;
                            if (Int32.TryParse(strCapitalSocial, out valorInteiroCapitalSocial))
                            {

                                p.SociosAprovacao.Last().CapitalSocial = String.Format("{0:C}",valorInteiroCapitalSocial);
                            }

                        }
                    }

                    #endregion

                    #region Preencher Dependencias do Tableau

                    PreencherDependenciasTableau(p.DadosPrincipaisAprovacao.Last());

                    #endregion

                    #region Buscar Cliente e verificar a data da última solicitação ( se houver prepara dependências dos dados complementares )

                    var clienteSapiens = clienteSapiensBLL.ObterPorCodigo(s.CodCliente);

                    // se já é cliente, verifica se já tem alguma solicitação.
                    if (clienteSapiens != null)
                    {
                        int codFilAnulavel = s.Definicoes.Last().CodFilial;

                        var definicoesClienteSapiens = new DefinicoesSapiensBLL().ObterDefinicoesPorCliente(clienteSapiens.codcli, codFilAnulavel);

                        clienteSapiens.Definicoes.Add(definicoesClienteSapiens);

                        var pessoaJuridica = new SocioSapiensBLL().ObterSociosPorCliente(clienteSapiens.codcli).LastOrDefault();

                        var solicitacoes = solicitacaoBLL.ObterSolicitacoesPorCodFilial(Convert.ToInt32(Session["CodigoFilial"]));
                        var queryClienteSolicitacao = from sol in solicitacoes
                                                      where sol.CodCliente == clienteSapiens.codcli
                                                      select sol;

                        #region Preencher Dependências dos Dados Complementares OK Gilberto 20/03/2015 - Atualizado em 26/08/2015

                        var umAnoAtras = new DateTime(DateTime.Now.Year - 1, DateTime.Now.Month, DateTime.Now.Day).ToShortDateString();
                        var hoje = DateTime.Now.ToShortDateString();

                        ViewBag.GrupoDeEmpresasCadastro = s.DadosPrincipaisSolicitacao.Last().GrupoEmpresas.Where(g => g.codgre == clienteSapiens.codgre).Select(grupo => grupo.nomgre).FirstOrDefault();
                        if (clienteSapiens.Definicoes.Last() != null)
                        {
                            ViewBag.DescontoFinanceiroCadastro =
                            clienteSapiens.Definicoes.Last().UsuPerds1 == 0 ? "NÃO" : "SIM";

                            ///////////

                            var codcpgAtual = clienteSapiens.Definicoes.Last().Codcpg;
                            var codcpgSolicitado = s.Definicoes.Last().CodCondicaoPagamento;

                            var prazoDePagamentoAtual = s.Definicoes.Last().CondicoesPagamento.Where(c => c.codcpg == codcpgAtual).Select(cond => cond.descpg).FirstOrDefault();
                            ViewBag.PrazoDePagamentoCadastro = prazoDePagamentoAtual;

                            if (codcpgAtual != codcpgSolicitado)
                            {
                                ViewBag.HouveAlteracaoPrazo = "S";
                            }
                            else
                            {
                                ViewBag.HouveAlteracaoPrazo = "N";
                            }

                            var codFpgAtual = clienteSapiens.Definicoes.Last().Codfpg;
                            var codFpgSolicitado = s.Definicoes.Last().CodFormaDePagamento;

                            var formaDePagamentoAtual = s.Definicoes.Last().FormasPagamento.Where(c => c.codfpg == codFpgAtual).Select(cond => cond.desfpg).FirstOrDefault();
                            ViewBag.FormaDePagamentoCadastro = formaDePagamentoAtual;

                            if (codFpgAtual.ToString() != codFpgSolicitado)
                            {
                                ViewBag.HouveAlteracaoFormaPagamento = "S";
                            }
                            else
                            {
                                ViewBag.HouveAlteracaoFormaPagamento = "N";
                            }

                        }
                        ///////////

                        if (pessoaJuridica != null)
                        {
                            ViewBag.CapitalSocialCadastro = String.Format("{0:C}", pessoaJuridica.USU_CAPSOC.HasValue ? pessoaJuridica.USU_CAPSOC.Value : 0);
                            ViewBag.DataFundacaoCadastro = pessoaJuridica.DATFDC.HasValue ? pessoaJuridica.DATFDC.Value.ToShortDateString() : "";
                            ViewBag.DataInclusaoCadastro = pessoaJuridica.DATPAL.HasValue ? pessoaJuridica.DATPAL.Value.ToShortDateString() : "";
                        }
                        ViewBag.TktMedioTitulosLiquidados = clienteSapiensBLL.TicketMedioCompras("cliente", s.CodCliente.ToString(), umAnoAtras, hoje);
                        ViewBag.TktMedioAVencer = clienteSapiensBLL.TkTMedVencer("cliente", s.CodCliente.ToString(), umAnoAtras, hoje);
                        ViewBag.ValorFinanceiroTotal = clienteSapiensBLL.ValorFinTotal("cliente", s.CodCliente.ToString(), umAnoAtras, hoje);
                        ViewBag.QtdTitulosVencidos = clienteSapiensBLL.QtdeTitulosVencidos("cliente", s.CodCliente.ToString(), umAnoAtras, hoje);
                        ViewBag.PercentualMedioPontualidade = clienteSapiensBLL.PercentPontualidade("cliente", s.CodCliente.ToString(), umAnoAtras, hoje);
                        ViewBag.PrazoMedioPgtoTitulos = clienteSapiensBLL.PrazoMedioPgto("cliente", s.CodCliente.ToString(), umAnoAtras, hoje);
                        ViewBag.VlrTotalTitulosVencidos = clienteSapiensBLL.VlrTotalTitulosVencidos("cliente", s.CodCliente.ToString(), umAnoAtras, hoje);
                        ViewBag.LimiteUtilizado = clienteSapiensBLL.LimiteUtilizado(1, s.CodFilial, s.CodCliente.ToString());

                        var limiteAtual = clienteSapiensBLL.ListaLimiteAtual(1, s.CodCliente); // ex de retorno : "R$ 100,00"
                        ViewBag.LimiteAtual = limiteAtual;

                        #region lógica pra mostrar o limite solicitado na tela de análise, somente se o solicitante alterou o limite cadastrado.

                        limiteAtual = Regex.Replace(limiteAtual, @"(\s+)|(\\+)|(\.+)|(/+)|(\-+)|(\,+)|(R+)|(\$+)", "");
                        if (limiteAtual.Length > 1)
                        {
                            limiteAtual = limiteAtual.Substring(0, limiteAtual.Length - 2);
                        }
                        else
                        {
                            limiteAtual = "0";
                        }

                        string limiteSolicitado = String.Format("{0:C}", s.Definicoes.Last().VlrLimite);

                        if (limiteAtual != limiteSolicitado)
                        {
                            ViewBag.HouveAlteracaoLimite = "S";
                            ViewBag.LimiteSolicitado = String.Format("{0:C}", Decimal.Parse(limiteSolicitado));
                        }
                        else
                        {
                            ViewBag.HouveAlteracaoLimite = "N";
                            ViewBag.LimiteSolicitado = "---";
                        }
                        #endregion

                        ViewBag.LimiteDisponivel = clienteSapiensBLL.ListaLimiteDisponivel(1, s.CodCliente);

                        ViewBag.MaiorFatura = clienteSapiensBLL.MaiorFatura(s.CodCliente.ToString());
                        ViewBag.MaiorAtraso = clienteSapiensBLL.TituloMaiorAtraso(s.CodCliente.ToString());
                        ViewBag.DataUltimoPedido = clienteSapiensBLL.BuscarUltimoPedido(1, s.CodCliente);

                        var dataUltimaSolicitacaov2 = solicitacaoBLL.ObterDataUltimaSolicitacaoNoSICADV2(s.CodCliente);
                        var dataUltimaSolicitacaov3 = "";
                        if (queryClienteSolicitacao.LastOrDefault() != null)
                        {
                            // já existe solicitação para este cliente.
                            dataUltimaSolicitacaov3 = queryClienteSolicitacao.Last().DatCriacao.ToString("dd/MM/yyyy");
                        }

                        ViewBag.DataUltimaSolicitacao = String.IsNullOrEmpty(dataUltimaSolicitacaov3) ? dataUltimaSolicitacaov2 : dataUltimaSolicitacaov3;
                        ViewBag.DataUltimaSolicitacaov2 = dataUltimaSolicitacaov2;

                        string valorFaturamento1;
                        string valorFaturamento2;
                        string valorFaturamento3;
                        string dataFaturamento1;
                        string dataFaturamento2;
                        string dataFaturamento3;
                        string mediaFaturamentoTrimestre;

                        clienteSapiensBLL.ObterDadosFaturamentoCliente(s.CodCliente, out valorFaturamento1, out valorFaturamento2, out valorFaturamento3, out  dataFaturamento1, out  dataFaturamento2, out  dataFaturamento3, out mediaFaturamentoTrimestre);

                        ViewBag.ValorFaturamento1 = dataFaturamento1 + " R$ " + valorFaturamento1;
                        ViewBag.ValorFaturamento2 = dataFaturamento2 + " R$ " + valorFaturamento2;
                        ViewBag.ValorFaturamento3 = dataFaturamento3 + " R$ " + valorFaturamento3;
                        ViewBag.MediaFaturamentoTrimestre = " " + mediaFaturamentoTrimestre;

                        #endregion
                    }
                    else
                    {
                        // se ainda não é cliente, devo marcar como S pra exibir os valores solicitados na tela.
                        ViewBag.HouveAlteracaoLimite = "S";
                        ViewBag.HouveAlteracaoFormaPagamento = "S";
                        ViewBag.HouveAlteracaoPrazo = "S";

                        string limiteSolicitado = String.Format("{0:C}", s.Definicoes.Last().VlrLimite);
                        if(!String.IsNullOrEmpty(limiteSolicitado))
                        {
                            ViewBag.LimiteSolicitado = String.Format("{0:C}", Decimal.Parse(limiteSolicitado));
                        }
                        else
                        {
                            ViewBag.HouveAlteracaoLimite = "N";
                            ViewBag.LimiteSolicitado = "---";
                        }
                    }

                    #endregion

                    if (s.CodTipoSolicitacao == 3)
                    {
                        ViewBag.PrecisaValidar = "N";
                    }// TODO : desativar a validação em caso de inativação.

                    Session["Parecer"] = p;
                    return View("Analise", p); // sem as dependencias.
                }
                catch (Exception ex)
                {
                    return Json(new { msg = "Não foi possível abrir a Solicitação nº " + s.Codigo + " , ERRO -> " + ex.Message }, JsonRequestBehavior.AllowGet);
                }
            }
        }
        public ActionResult ConsultarSerasa(string CPFCNPJ, string UF)
        {
            var solicitacaoBLL = new SolicitacaoBLL();

            // SE NÃO FOR, Consultar o Serasa.
            #region retorna um JSON com o resultado da consulta Confie do Serasa

            // RETIRA OS CARACTERES ESPECIAIS.
            CPFCNPJ = Regex.Replace(CPFCNPJ, @"(\s+)|(\\+)|(\.+)|(/+)|(\-+)", "");

            if (!ValidaDocumento(CPFCNPJ))
            {
                return Json(new { erro = "CPF ou CNPJ Inválido" }, JsonRequestBehavior.DenyGet);
            }

            var resConsulta = solicitacaoBLL.PreparaConsultaConfie(CPFCNPJ, UF);

            var CodIBGE = resConsulta.DadosReceita.CodIBGE;
            var CodIBGESin = resConsulta.DadosSintegra.CodIBGE;

            if (resConsulta.DadosReceita == null && resConsulta.DadosSintegra == null)
            {
                return Json(new { erro = "Dados não encontrados." }, JsonRequestBehavior.DenyGet);
            }
            else
            {
                // Salva o LOG da consulta na base.
                var consultaReceitaBLL = new ConsultaReceitaBLL();
                var consultaReceita = new ConsultaReceita();

                consultaReceita.Codusucon = ((UsuarioSapiens)Session["ConexaoSapiens"]).Codusu;

                consultaReceita.Datcon = DateTime.Now;

                consultaReceita.Sitrec = resConsulta.DadosReceita.Situacao;
                consultaReceita.Sitsin = resConsulta.DadosSintegra.Situacao;
                consultaReceita.Documento = CPFCNPJ;

                //consultaReceita.Solicitacao = s;
                consultaReceitaBLL.Salvar(consultaReceita);

                // se já existirem dados de solicitação, use-os , senão, use o que veio na consulta.
                // atualizar sempre :
                var p = Session["Parecer"] as ParecerSolicitacao;

                var jaTemDadosPrincipais = p.DadosPrincipaisAprovacao.Count > 0;

                var dps = jaTemDadosPrincipais ? p.DadosPrincipaisAprovacao.Last() : null;

                return Json(new
                {
                    CPFCNPJ = jaTemDadosPrincipais ? dps.CPFCNPJ : CPFCNPJ,
                    TipoCliente = jaTemDadosPrincipais ? dps.TipoCliente as string : "",
                    CodCliente = jaTemDadosPrincipais ? dps.CodClienteDadoPrincipalApr.ToString() : "",

                    /* Dados Principais do Sapiens ------------------------------------ */

                    NomeFantasia = !String.IsNullOrEmpty(resConsulta.DadosReceita.Nome) ? resConsulta.DadosReceita.Nome : resConsulta.DadosSintegra.Nome,
                    RazaoSocial = resConsulta.DadosReceita.RazaoSocial,
                    Logradouro = !String.IsNullOrEmpty(resConsulta.DadosReceita.Endereco) ? resConsulta.DadosReceita.Endereco : resConsulta.DadosSintegra.Endereco,
                    DataUltimaConsulta = new DateTime(),

                    Bairro = !String.IsNullOrEmpty(resConsulta.DadosReceita.Bairro) ? resConsulta.DadosReceita.Bairro : resConsulta.DadosSintegra.Bairro,
                    Cidade = !String.IsNullOrEmpty(resConsulta.DadosReceita.Municipio) ? resConsulta.DadosReceita.Municipio : resConsulta.DadosSintegra.Municipio,
                    UF = !String.IsNullOrEmpty(resConsulta.DadosReceita.UF) ? resConsulta.DadosReceita.UF : resConsulta.DadosSintegra.UF,
                    CEP = !String.IsNullOrEmpty(resConsulta.DadosReceita.CEP) ? resConsulta.DadosReceita.CEP : resConsulta.DadosSintegra.CEP,
                    Complemento = !String.IsNullOrEmpty(resConsulta.DadosReceita.Complemento) ? resConsulta.DadosReceita.Complemento : resConsulta.DadosSintegra.Complemento,
                    Numero = !String.IsNullOrEmpty(resConsulta.DadosReceita.Numero) ? resConsulta.DadosReceita.Numero : resConsulta.DadosSintegra.Num,

                    Telefone = jaTemDadosPrincipais ? dps.Telefone : "",
                    Telefone2 = jaTemDadosPrincipais ? dps.Telefone2 : "",
                    Telefone3 = jaTemDadosPrincipais ? dps.Telefone3 : "",
                    Telefone4 = jaTemDadosPrincipais ? dps.Telefone4 : "",
                    Telefone5 = jaTemDadosPrincipais ? dps.Telefone5 : "",

                    NumeroFax = jaTemDadosPrincipais ? dps.NumeroFax : "",

                    // DataAbertura = cliente.datcad as DateTime?, //usar no socio.
                    // Ativo = cliente.sitcli as string,

                    InscricaoEstadualSin = resConsulta.DadosSintegra.InscricaoEstadual,
                    CodTipoMercado = jaTemDadosPrincipais ? dps.TipoMercado : "",
                    CodTipoEmpresa = jaTemDadosPrincipais ? dps.TipoEmpresa : "",
                    CodTipoDireitoPropriedade = jaTemDadosPrincipais ? dps.TipoDireitoPropriedadeEmpresa : "",
                    CodRamoAtividade = jaTemDadosPrincipais ? dps.CodRamoAtividade : "",
                    CodRamoFiscal = jaTemDadosPrincipais ? dps.RamoFiscal : "",
                    CodRota = jaTemDadosPrincipais ? dps.CodRota : "",
                    CodSubRota = jaTemDadosPrincipais ? dps.CodSubRota : "",
                    CodGrupoEmpresa = jaTemDadosPrincipais ? dps.CodGrupoEmpresa : "",
                    CodIBGE = !String.IsNullOrEmpty(resConsulta.DadosReceita.CodIBGE) ? resConsulta.DadosReceita.CodIBGE : resConsulta.DadosSintegra.CodIBGE,
                    TributaICMS = jaTemDadosPrincipais ? dps.TributaICMS : "",
                    CobraCliente = jaTemDadosPrincipais ? dps.CobraCliente : "",
                    ExpurgaDaInadimplencia = jaTemDadosPrincipais ? dps.ExpurgaDaInadimplencia : "",
                    ObservacaoMotivoSituacao = jaTemDadosPrincipais ? dps.ObservacaoMotivoSituacao : "",

                    //----------------------  daqui pra baixo, é o que veio do SERASA ---------------//
                    //Bairro = resConsulta.DadosReceita.Bairro,
                    //CEP = resConsulta.DadosReceita.CEP,
                    CNAE = resConsulta.DadosReceita.CNAE,
                    DataAbertura = resConsulta.DadosReceita.DataAbertura,
                    DescCNAE = resConsulta.DadosReceita.DescCNAE,
                    NaturezaJuridica = resConsulta.DadosReceita.NaturezaJuridica,
                    Simples = resConsulta.DadosReceita.Simples,
                    SituacaoReceita = resConsulta.DadosReceita.Situacao,
                    SituacaoSin = resConsulta.DadosSintegra.Situacao,
                    DescAtividadeEconomicaSin = resConsulta.DadosSintegra.DescAtividadeEconomica,
                    DistritoIBGESin = resConsulta.DadosSintegra.DistritoIBGE,
                    ObservacaoSin = resConsulta.DadosSintegra.Observacao,
                    //Complemento = resConsulta.DadosReceita.Complemento,
                    //Logradouro = resConsulta.DadosReceita.Endereco,
                    //Cidade = resConsulta.DadosReceita.Municipio,
                    //NomeFantasia = resConsulta.DadosReceita.Nome,
                    //Numero = resConsulta.DadosReceita.Numero,
                    //RazaoSocial = resConsulta.DadosReceita.RazaoSocial,
                    //UF = resConsulta.DadosReceita.UF,

                    //BairroSin = resConsulta.DadosSintegra.Bairro,
                    //CEPSin = resConsulta.DadosSintegra.CEP,
                    //ComplementoSin = resConsulta.DadosSintegra.Complemento,
                    //EnderecoSin = resConsulta.DadosSintegra.Endereco,
                    //InscricaoEstadualSin = resConsulta.DadosSintegra.InscricaoEstadual,
                    //CidadeSin = resConsulta.DadosSintegra.Municipio,
                    //NomeSin = resConsulta.DadosSintegra.Nome,
                    //NumeroSin = resConsulta.DadosSintegra.Num,
                    //UFSin = resConsulta.DadosSintegra.UF

                }, JsonRequestBehavior.DenyGet);
            }
            #endregion
        }
        public JsonResult ConsultaAprovador(int CodParecer = 0)
        {
            // pegar o usuario por seu codigo
            // obter o parecer da solicitacao em que o usuario aparecer, retornar os dados deste parecer.
            // o que precisa ser alterado? os dados de parecer.(Aprovacao)

            // recarregar a tela com um novo parecer.

            using (var solicitacaoBLL = new SolicitacaoBLL())
            {
                var carSapBLL = new CaracteristicaSapiensBLL();
                var parecerSolicitacaoBLL = new ParecerSolicitacaoBLL();
                var usuario = Session["ConexaoSapiens"] as UsuarioSapiens;
                var perfilBLL = new PerfilUsuarioBLL();
                var clienteSapiensBLL = new ClienteSapiensBLL();

                var p = parecerSolicitacaoBLL.ObterPorCodigo(CodParecer);

                Solicitacao s = p.Solicitacao;

                foreach (var c in p.CaracteristicasAprovacao)
                {
                    carSapBLL.ObterNomes(c);
                }

                solicitacaoBLL.ObterNomes(new List<Solicitacao> { p.Solicitacao });

                new DefinicoesClienteSolicitacaoBLL().PreencheDependencias(p.Solicitacao.Definicoes.Last(), p.Solicitacao.CodCliente, Convert.ToInt32(Session["CodigoFilial"]));

                p.ContatosAprovacao = p.ContatosAprovacao.Count > 0 ? p.ContatosAprovacao : new List<ContatoClienteAprovacao>() { /* new ContatoClienteAprovacao() */ };

                var perfisUsuarioLogado = perfilBLL.ObterGruposPorCodUsuario(usuario.Codusu);

                var queryPodeSalvarParecer = from meuPerfil in perfisUsuarioLogado
                                             where meuPerfil.CodPerfilUsuario == p.Codperusu
                                             select meuPerfil;

                // aqui, verifico se o usuário atual, tem perfil de aprovador
                var podeSalvar = queryPodeSalvarParecer.Count() > 0 ? "S" : "N";

                //aqui, verifico se o parecer está aguardando aprovação
                if (p.Codsitpar != Convert.ToInt32(SituacaoParecer.AguardandoAprovacao))
                {
                    podeSalvar = "N";
                }

                #region obter o perfil atribuído a cada parecer. (quem precisa aprovar)

                var perfilAprovador = perfilBLL.ObterPorCodigo(p.Codperusu);
                p.Perfil = perfilAprovador.DesPerfil;
                var usuarioAprovador = new UsuarioSapiensBLL().ObterPorCodigo((int)p.Codusuapr);
                p.Aprovador = usuarioAprovador.Nomusu;

                #endregion

                Session["Parecer"] = p;
                var dpa = p.DadosPrincipaisAprovacao.Last();
                var def = p.DefinicoesAprovacao.Last();
                //return PartialView("_Parecer", p);

                var parecerJson = new
                {

                    Ativo = dpa.Ativo,
                    CodParecer = p.CodParecer,
                    Txtpar = p.Txtpar,
                    Perfil = p.Perfil,
                    Aprovador = p.Aprovador,
                    LimiteSugerido = p.LimiteSugerido,
                    CodigoDadoPrincipalAprovacao = dpa.CodigoDadoPrincipalAprovacao,
                    CodCliente = dpa.CodCliente,
                    CPFCNPJ = dpa.CPFCNPJ,
                    TipoCliente = dpa.TipoCliente,
                    InscricaoEstadual = dpa.InscricaoEstadual,
                    SituacaoReceitaFederal = dpa.SituacaoReceitaFederal,
                    SituacaoReceitaEstadual = dpa.SituacaoReceitaEstadual,
                    RazaoSocial = dpa.RazaoSocial,
                    NomeFantasia = dpa.NomeFantasia,
                    TipoMercado = dpa.TipoMercado,
                    TipoEmpresa = dpa.TipoEmpresa,
                    TipoDireitoPropriedadeEmpresa = dpa.TipoDireitoPropriedadeEmpresa,
                    CodRamoAtividade = dpa.CodRamoAtividade,
                    RamoFiscal = dpa.RamoFiscal,
                    CodRota = dpa.CodRota,

                    CodSubRota = dpa.CodSubRota,

                    CodGrupoEmpresa = dpa.CodGrupoEmpresa,
                    CEP = dpa.CEP,
                    Logradouro = dpa.Logradouro,
                    Numero = dpa.Numero,
                    Complemento = dpa.Complemento,
                    Bairro = dpa.Bairro,
                    Cidade = dpa.Cidade,
                    UF = dpa.UF,
                    Telefone = dpa.Telefone,
                    EmailNFE = dpa.EmailNFE,
                    PontoDeReferencia = dpa.PontoDeReferencia,
                    ObservacaoMotivoSituacao = dpa.ObservacaoMotivoSituacao,
                    //Definicoes = p.DefinicoesAprovacao.Last(),

                    CodDefinicoesClienteAprovacao = def.CodDefinicoesClienteAprovacao,
                    CodCategoria = def.CodCategoria,
                    CodCondicaoPagamento = def.CodCondicaoPagamento,
                    CodFilial = def.CodFilial,
                    CodFormaDePagamento = def.CodFormaDePagamento,
                    CodGrupoContasAReceber = def.CodGrupoContasAReceber,
                    CodRegiaoDeVendas = def.CodRegiaoDeVendas,
                    CodRepresentante = def.CodRepresentante,
                    ConsumidorFinal = def.ConsumidorFinal,
                    ContratoDesconto = def.ContratoDesconto,
                    IndAceitaFaturamentoParcialPedido = def.IndAceitaFaturamentoParcialPedido,
                    IndCobrarTaxaBanco = def.IndCobrarTaxaBanco,
                    IndDescontoFinanceiro = def.IndDescontoFinanceiro,
                    Rodrigo = def.Rodrigo,
                    VlrDescontoFinanceiro = def.VlrDescontoFinanceiro,
                    VlrLimite = def.VlrLimite,
                    podeSalvar = podeSalvar

                };

                return Json(parecerJson, JsonRequestBehavior.AllowGet);

            }
        }
        //sem suporte nativo no 2010, instalar o ASync CTP e testar futuramente...
        //      public async Task DoWork()
        //      {
        //          int[] ids = new[] { 1, 2, 3, 4, 5 };
        //          await Task.WhenAll(ids.Select(i => DoSomething(1, i, blogClient)));
        //      }
        /// <summary>
        /// Aprova várias solicitações usando paralelismo (uso de vários núcleos da CPU disponível)
        /// </summary>
        /// <param name="solicitacoes">uma lista dos códigos das solicitações a aprovar, passados como uma string.</param>
        /// <returns></returns>
        public ActionResult AprovarVarias(string solicitacoes)
        {
            try
            {
                //Autentica
                if (Session["ConexaoSapiens"] == null)
                {
                    return RedirectToAction("Login", "Home");
                }

                //Autoriza
                if (!AutorizaUsuario(ControlAccessConfig.ListaAnalise))
                {
                    return View("Erro", null, "Módulo não autorizado para este usuário. ");
                }
                // verificar se é usuário master
                var perfilBLL = new PerfilUsuarioBLL();

                var usuario = (UsuarioSapiens)Session["ConexaoSapiens"];

                usuario.PerfisUsuario = perfilBLL.ObterGruposPorCodUsuario(usuario.Codusu);

                var queryMaster = from perfil in usuario.PerfisUsuario
                                  where perfil.CodPerfilUsuario == 8
                                  select perfil;

                var isUsuarioMaster = queryMaster.ToList().Count > 0;

                if (isUsuarioMaster)
                {
                    // array [1,2,3,4] veio na request como uma string 1,2,3,4, separar e criar um array de inteiros.
                    var codigos = solicitacoes.Split(',').Select(x => Int32.Parse(x)).ToArray();

                    List<int> aprovados = new List<int>();

                    using (ParecerSolicitacaoBLL parecerBLL = new ParecerSolicitacaoBLL())
                    {

                        var historicoBLL = new HistoricoSolicitacaoBLL();

                        foreach (var c in codigos)
                        {
                            // aprovar várias...
                            // pegar o último parecer de cada solicitação.

                            Thread t = new Thread(_ =>
                            {
                                ServiceReferenceTeste.srvSicadSoapClient clienteTesteIntegracao = new ServiceReferenceTeste.srvSicadSoapClient();
                                clienteTesteIntegracao.IntegrarDadosCliente(c);
                            });

                            t.Start();

                            aprovados.Add(c);

                            //var parecer = solBLL.ObterPorCodigo(c).PareceresSolicitacao.Last();

                            // parecer.Codsitpar = Convert.ToDecimal(SituacaoParecer.AguardandoIntegracao);
                            // parecerBLL.Atualizar(parecer);
                            var historico = new HistoricoSolicitacao();
                            historico.DatEncaminhamento = DateTime.Now;
                            historico.CodSituacaoIntegracaoSolicitacao = Convert.ToInt32(SituacaoIntegracaoSolicitacao.Integrado);
                            historico.CodSituacaoSolicitacao = Convert.ToInt32(SituacaoSolicitacao.Integrada);
                            var s = new SolicitacaoBLL().ObterPorCodigo(c);
                            historico.Solicitacao = s;

                            historicoBLL.Salvar(historico);
                        }
                    }
                    // atualizar o grid na tela..
                    return Json(new { aprovados = aprovados }, JsonRequestBehavior.DenyGet);
                }
                else
                {
                    return Json(new { erro = "A Função \"Aprovar Selecionados\" não está disponível para o usuário atual. " }, JsonRequestBehavior.DenyGet);
                }
            }
            catch (Exception ex)
            {
                return Json(new { erro = ex.Message }, JsonRequestBehavior.DenyGet);
            }
        }
        public ActionResult AprovacoesPaginadas(int? page)
        {
            //Autentica
            if (Session["ConexaoSapiens"] == null)
            {
                return RedirectToAction("Login", "Home");
            }
            //Autoriza
            if (!AutorizaUsuario(ControlAccessConfig.ListaAnalise))
            {
                return View("Erro", null, "Módulo não autorizado para este usuário. ");
            }

            using (var solicitacaoBLL = new SolicitacaoBLL())
            {
                try
                {
                    // obter todas as solicitações cujo usu_sitsol == 'aguardando aprovação'. OK 09/12
                    var model = solicitacaoBLL.ObterSolicitacoesAguardandoAprovacao();

                    solicitacaoBLL.ObterNomes(model);

                    //var solicitacoes = from s in model
                    //                   where s.Situacao.ToUpper() != "REPROVADA"
                    //                      && s.Situacao.ToUpper() != "INTEGRADA"

                    //                   select s;

                    var ajaxGridFactory = new Grid.Mvc.Ajax.GridExtensions.AjaxGridFactory();
                    var grid = ajaxGridFactory.CreateAjaxGrid(model.OrderBy(c => c.Codigo).OrderBy(s => s.Codigo).AsQueryable(), page.HasValue ? page.Value : 1, false);

                    return Json(new { Html = grid.ToJson("_Aprovacoes", this), grid.HasItems }, JsonRequestBehavior.AllowGet);
                }
                catch (Exception ex)
                {
                    return View("Error", ex.Message);
                }
            }
        }
        public ActionResult SalvarDadoPrincipal(DadoPrincipalSolicitacao dps)
        {
            //Autentica
            if (Session["ConexaoSapiens"] == null)
            {
                return RedirectToAction("Login", "Home");
            }

            //Autoriza
            if (!AutorizaUsuario(Helpers.ControlAccessConfig.NovaSolicitacao))
            {
                return View("Erro", null, "Módulo não autorizado para este usuário. ");
            }

            Solicitacao s = Session["Solicitacao"] as Solicitacao;

            // pegar o valor das dropdowns com jquery, e adicionar no "data" da request ajax. FEITO. 11/11/2014
            #region preenche variáveis que não podem ficar nulas.

            if (String.IsNullOrEmpty(dps.Telefone))
            {
                dps.Telefone = "";
            }
            else
            {
                dps.Telefone = Regex.Replace(dps.Telefone, @"(\)+)|(\(+)|(\-+)", "");
                if (dps.Telefone[2] == '0')
                {
                    var ddd = dps.Telefone.Substring(0, 2);
                    var num = dps.Telefone.Substring(2);

                    dps.Telefone = ddd + num;
                }
            }

            dps.Telefone2 = String.IsNullOrEmpty(dps.Telefone2) ? "" : dps.Telefone2;
            dps.Telefone3 = String.IsNullOrEmpty(dps.Telefone3) ? "" : dps.Telefone3;
            dps.Telefone4 = String.IsNullOrEmpty(dps.Telefone4) ? "" : dps.Telefone4;
            dps.Telefone5 = String.IsNullOrEmpty(dps.Telefone5) ? "" : dps.Telefone5;

            //dps.ContribuinteICMS = String.IsNullOrEmpty(dps.ContribuinteICMS) ? "" : dps.ContribuinteICMS;
            var IE = String.IsNullOrEmpty(dps.InscricaoEstadual) ? "" : dps.InscricaoEstadual;

            dps.ContribuinteICMS = IE.Trim().ToLower() == "isento" || IE.Trim().ToLower() == "" ? "N" : "S";

            dps.TributaICMS = "S";
            dps.CodGrupoEmpresa = String.IsNullOrEmpty(dps.CodGrupoEmpresa) ? "" : dps.CodGrupoEmpresa;
            dps.NumeroFax = String.IsNullOrEmpty(dps.NumeroFax) ? "" : dps.NumeroFax;
            dps.PontoDeReferencia = string.IsNullOrEmpty(dps.PontoDeReferencia) ? "" : dps.PontoDeReferencia;

            dps.CodClienteDadoPrincipalSol = s.CodCliente;
            dps.TipoMercado = "I";
            dps.CobraCliente = "S";
            dps.ExpurgaDaInadimplencia = "N";
            dps.ObservacaoMotivoSituacao = string.IsNullOrEmpty(dps.ObservacaoMotivoSituacao) ? "" : dps.ObservacaoMotivoSituacao;
            dps.TipoDireitoPropriedadeEmpresa = "1";

            s.CodFilial = Convert.ToInt32(Session["CodigoFilial"]); // obter a filial no sapiens... OK

            #endregion

            try
            {
                var tiposDeAlteracao = dps.Alteracoes;

                //salvar os tipos de alteração.

                var usuario = (UsuarioSapiens)Session["ConexaoSapiens"];
                s.CodUsuarioSolicitacao = usuario.Codusu;
                s.DatAlteracao = DateTime.Now;

                using (SolicitacaoBLL solicitacaoBLL = new SolicitacaoBLL())
                {
                    DadoPrincipalSolicitacaoBLL dadoPrincipalBLL = new DadoPrincipalSolicitacaoBLL();
                    HistoricoSolicitacaoBLL historicoBLL = new HistoricoSolicitacaoBLL();
                    DocumentoAnexadoSolicitacaoBLL docsBLL = new DocumentoAnexadoSolicitacaoBLL();
                    TipoAlteracaoBLL tipAltBLL = new TipoAlteracaoBLL();

                    var justificativaArmazenada = Session["TxtJustificativa"] as string;
                    s.Usuario = usuario.Nomusu;
                    s.DatCriacao = DateTime.Now;
                    s.TxtJustificativa = !String.IsNullOrEmpty(s.TxtJustificativa) ?
                        s.TxtJustificativa
                        : !String.IsNullOrEmpty(justificativaArmazenada) ? justificativaArmazenada : "";

                    // AQUI GERA O TICKET SE AINDA NÃO HOUVER DADOS DA SOLICITAÇÃO -> OK
                    if (dps.CodigoDadoPrincipal == 0)
                    {

                        //------------------------------------------------------------------------
                        if (s.CodCliente == 0)
                        {
                            s.CodTipoSolicitacao = Convert.ToInt32(TipoSolicitacao.Inclusao);
                        }
                        else // se o código do cliente não for 0, pode ser duplicação ou alteração.
                        {
                            if (s.CodTipoSolicitacao != 3) // se vem da duplicação, o codTipoSolicitacao foi definido lá
                            {
                                s.CodTipoSolicitacao = Convert.ToInt32(TipoSolicitacao.Alteracao);
                            }
                        }
                        //------------------------------------------------------------------------

                        #region Salvar o histórico da solicitação se não existir ( MOSTROU-SE DESNECESSÁRIO )

                        //var historico = s.Historicos.LastOrDefault();
                        //if (historico == null)
                        //{
                        //    // Inserir como 'DIGITANDO' (código 1)
                        //    var h = new HistoricoSolicitacao();
                        //    h.CodSituacaoSolicitacao = Convert.ToInt32(SituacaoSolicitacao.AguardandoFechamento);
                        //    s.CodSituacaoAtual = Convert.ToInt32(SituacaoSolicitacao.AguardandoFechamento);
                        //    h.Solicitacao = s;
                        //    s.Historicos.Add(h);
                        //}
                        #endregion
                        s.CodSituacaoAtual = Convert.ToInt32(SituacaoSolicitacao.AguardandoFechamento);
                        solicitacaoBLL.SalvarOuAtualizar(s);

                        if (tiposDeAlteracao != null)
                        {
                            foreach (var t in tiposDeAlteracao)
                            {
                                var codTipoAlteracao = Convert.ToInt32(t);
                                var tipo = tipAltBLL.ObterPorCodigo(codTipoAlteracao);

                                if (!s.TiposAlteracao.Contains(tipo))
                                {

                                    s.TiposAlteracao.Add(tipo);
                                }

                                //se o tipo de alteração que eu estou tentando gravar já existir, não gravar.

                            }
                        }
                        solicitacaoBLL.Atualizar(s);

                        dps.Solicitacao = s; // atribui a chave estrageira (solicitação) ao dado principal.

                        dps.EmailNFE = String.IsNullOrEmpty(dps.EmailNFE) ? "" : dps.EmailNFE;// +";" + dps.EmailNFE2;

                        dadoPrincipalBLL.Salvar(dps); // salva os dados principais.
                    }
                    else
                    {
                        var dadoPrincipal = dadoPrincipalBLL.ObterPorCodigo(dps.CodigoDadoPrincipal);

                        dadoPrincipal.Ativo = dps.Ativo;
                        dadoPrincipal.Bairro = dps.Bairro;
                        dadoPrincipal.CEP = dps.CEP;
                        dadoPrincipal.Cidade = dps.Cidade;
                        dadoPrincipal.CobraCliente = dps.CobraCliente;
                        dadoPrincipal.CodClienteDadoPrincipalSol = dps.CodClienteDadoPrincipalSol;
                        dadoPrincipal.CodGrupoEmpresa = dps.CodGrupoEmpresa;
                        dadoPrincipal.CodIBGE = dps.CodIBGE;
                        dadoPrincipal.CodigoDadoPrincipal = dps.CodigoDadoPrincipal;
                        dadoPrincipal.CodRamoAtividade = dps.CodRamoAtividade;
                        dadoPrincipal.CodRota = dps.CodRota;
                        dadoPrincipal.CodSubRota = dps.CodSubRota;
                        dadoPrincipal.Complemento = dps.Complemento;
                        dadoPrincipal.ContribuinteICMS = dps.ContribuinteICMS;
                        dadoPrincipal.CPFCNPJ = dps.CPFCNPJ;
                        dadoPrincipal.DataUltimaConsulta = dps.DataUltimaConsulta;
                        dadoPrincipal.EmailNFE2 = dps.EmailNFE2;
                        dadoPrincipal.EmailNFE = dps.EmailNFE + ";" + dps.EmailNFE2;
                        dadoPrincipal.ExpurgaDaInadimplencia = dps.ExpurgaDaInadimplencia;
                        dadoPrincipal.InscricaoEstadual = dps.InscricaoEstadual;
                        dadoPrincipal.Isento = dps.Isento;
                        dadoPrincipal.Logradouro = dps.Logradouro;
                        dadoPrincipal.NomeFantasia = dps.NomeFantasia;
                        dadoPrincipal.Numero = dps.Numero;
                        dadoPrincipal.NumeroFax = dps.NumeroFax;
                        dadoPrincipal.ObservacaoMotivoSituacao = dps.ObservacaoMotivoSituacao;
                        dadoPrincipal.PontoDeReferencia = dps.PontoDeReferencia;
                        dadoPrincipal.RamoFiscal = dps.RamoFiscal;
                        dadoPrincipal.RazaoSocial = dps.RazaoSocial;
                        dadoPrincipal.SituacaoReceitaFederal = String.IsNullOrEmpty(dadoPrincipal.SituacaoReceitaFederal) ? "Consulta não retornou dados" : dadoPrincipal.SituacaoReceitaFederal;
                        dadoPrincipal.SituacaoReceitaEstadual = String.IsNullOrEmpty(dadoPrincipal.SituacaoReceitaEstadual) ? "Consulta não retornou dados" : dadoPrincipal.SituacaoReceitaEstadual;
                        dadoPrincipal.Solicitacao = s;
                        dadoPrincipal.Telefone = dps.Telefone;
                        dadoPrincipal.Telefone2 = dps.Telefone2;
                        dadoPrincipal.Telefone3 = dps.Telefone3;
                        dadoPrincipal.Telefone4 = dps.Telefone4;
                        dadoPrincipal.Telefone5 = dps.Telefone5;
                        dadoPrincipal.TipoCliente = dps.TipoCliente;
                        dadoPrincipal.TipoDireitoPropriedadeEmpresa = dps.TipoDireitoPropriedadeEmpresa;
                        dadoPrincipal.TipoEmpresa = dps.TipoEmpresa;
                        dadoPrincipal.TipoMercado = dps.TipoMercado;
                        dadoPrincipal.TributaICMS = dps.TributaICMS;
                        dadoPrincipal.UF = dps.UF;

                        solicitacaoBLL.SalvarOuAtualizar(s);// AQUI GERA O TICKET     -> OK

                        /////////////////////
                        if (tiposDeAlteracao != null)
                        {
                            foreach (var t in tiposDeAlteracao)
                            {
                                var codTipoAlteracao = Convert.ToInt32(t);
                                var tipo = tipAltBLL.ObterPorCodigo(codTipoAlteracao);

                                if (!s.TiposAlteracao.Contains(tipo))
                                {
                                    s.TiposAlteracao.Add(tipo);
                                }
                            }
                            solicitacaoBLL.Atualizar(s);
                        }
                        /////////////////////

                        dps.Solicitacao = s;
                        dadoPrincipalBLL.Atualizar(dadoPrincipal);
                    }

                    s.DadosPrincipaisSolicitacao.Clear();
                    s.DadosPrincipaisSolicitacao.Add(dps); // as vezes reclama de session aberta, solução -> trazer do banco , preencher os dados e atualizar.

                }

                Session["Solicitacao"] = s;
                new SolicitacaoBLL().ObterNomes(new List<Solicitacao>() { s });
                return Json(new { msg = "Dados Principais gravados com sucesso. ticket nº: " + s.Codigo, codSol = s.Codigo, datCriacao = s.DatCriacao.ToShortDateString(), filial = s.Filial, status = s.Situacao, tipo = s.Tipo }, JsonRequestBehavior.DenyGet);
            }
            catch (Exception ex)
            {
                return Json(new { msg = "Erro ao tentar gravar dados principais: " + ex.Message }, JsonRequestBehavior.DenyGet);
            }
        }
        public ActionResult ExcluirEnderecoEntrega(int codigo)
        {
            using (var bll = new SolicitacaoBLL())
            {
                var s = Session["Solicitacao"] as Solicitacao;

                try
                {
                    var ent = s.EnderecosEntrega.Where(c => c.CodEnderecoEntregaClienteSolicitacao == codigo).Single();
                    s.EnderecosEntrega.Remove(ent);
                    bll.Atualizar(s);
                }
                catch (Exception ex)
                {
                    return Json(new { erro = ex.Message }, JsonRequestBehavior.DenyGet);
                }

                Session["Solicitacao"] = s;

                return Json(new { msg = "endereco de entrega excluido" }, JsonRequestBehavior.DenyGet);
            }
        }
        public JsonResult SalvarJustificativa(string TxtJustificativa)
        {
            using (SolicitacaoBLL solicitacaoBLL = new SolicitacaoBLL())
            {
                var s = Session["Solicitacao"] as Solicitacao;

                if (!String.IsNullOrEmpty(TxtJustificativa))
                {
                    if (s.Codigo != 0)
                    {
                        s.TxtJustificativa = TxtJustificativa;
                        solicitacaoBLL.Atualizar(s);

                    }
                    else
                    {
                        Session["TxtJustificativa"] = TxtJustificativa;
                    }

                    Session["Solicitacao"] = s;
                }
                else
                {
                    return Json(new { erro = "Falta o texto da justificativa." }, JsonRequestBehavior.DenyGet);
                }
            }
            return Json(new { msg = " Justificativa gravada com sucesso." }, JsonRequestBehavior.DenyGet);
        }
        public ActionResult ExcluirReferencia(int codigo)
        {
            using (var bll = new SolicitacaoBLL())
            {
                var s = Session["Solicitacao"] as Solicitacao;

                try
                {
                    var refer = s.Referencias.Where(c => c.CodReferenciaSol == codigo).Single();
                    s.Referencias.Remove(refer);
                    bll.Atualizar(s);
                }
                catch (Exception ex)
                {
                    return Json(new { erro = ex.Message }, JsonRequestBehavior.DenyGet);
                }

                Session["Solicitacao"] = s;

                return Json(new { msg = "referencia excluida" }, JsonRequestBehavior.DenyGet);
            }
        }
        public ActionResult Consultar(int codigo = 0)
        {
            //Autentica
            if (Session["ConexaoSapiens"] == null)
            {
                return RedirectToAction("Login", "Home");
            }

            //Autoriza
            if (!AutorizaUsuario(Helpers.ControlAccessConfig.NovaSolicitacao))
            {
                return View("Erro", null, "Módulo não autorizado para este usuário. ");
            }

            using (var solicitacaoBLL = new SolicitacaoBLL())
            {
                var dpaBLL = new DadoPrincipalAprovacaoBLL();
                var defSolBLL = new DefinicoesClienteSolicitacaoBLL();
                var defBLL = new DefinicoesClienteAprovacaoBLL();
                var parBLL = new ParecerSolicitacaoBLL();
                var perfilBLL = new PerfilUsuarioBLL();
                var carBLL = new CaracteristicaSapiensBLL();
                var usuarioBLL = new UsuarioSapiensBLL();
                var clienteSapiensBLL = new ClienteSapiensBLL();
                // 18/11/2014
                #region buscar a solicitacao usando o código e obter todas as dependencias OK - Update dia 30/12/2014 - Deixando o NHibernate Gerenciar os relacionamentos.

                var s = Session["Solicitacao"] as Solicitacao;

                s = solicitacaoBLL.ObterPorCodigo(codigo);

                s.PareceresSolicitacao = s.PareceresSolicitacao.OrderBy(par => par.CodParecer).ToList();

                foreach (var p in s.PareceresSolicitacao)
                {
                    dpaBLL.PreencheDependencias(p.DadosPrincipaisAprovacao.Last());

                    foreach (var d in p.DefinicoesAprovacao)
                    {
                        defBLL.PreencheDependencias(d, p.Solicitacao.CodCliente);
                    }

                    foreach (var c in p.CaracteristicasAprovacao)
                    {
                        carBLL.ObterNomes(c);
                    }

                    foreach (var c in s.Caracteristicas)
                    {
                        carBLL.ObterNomes(c);
                    }

                    p.Codperusu = p.Codperusu == 0 ? 2 : p.Codperusu;

                    var perfilAprovador = perfilBLL.ObterPorCodigo(p.Codperusu);
                    p.Perfil = perfilAprovador.DesPerfil;
                    var usuarioAprovador = usuarioBLL.ObterPorCodigo((int)p.Codusuapr);
                    p.Aprovador = usuarioAprovador.Nomusu;

                    if (!String.IsNullOrEmpty(p.DefinicoesAprovacao.Last().VlrLimite))
                    {
                        p.DefinicoesAprovacao.Last().VlrLimite = String.Format("{0:C}", Convert.ToInt32(p.DefinicoesAprovacao.Last().VlrLimite));
                    }
                }

                #endregion
                solicitacaoBLL.ObterNomes(new List<Solicitacao> { s });

                var usuario = Session["ConexaoSapiens"] as UsuarioSapiens;

                ViewBag.Usuario = usuario.Nomusu;
                ViewBag.NomeEmpresa = usuario.Numemp;
                var nomeFilial = Session["NomeFilial"] as string;
                ViewBag.Filial = usuario.Codfil + " - " + nomeFilial;

                var clienteSapiens = clienteSapiensBLL.ObterPorCodigo(s.CodCliente);

                if (clienteSapiens != null)
                {

                    int codFilAnulavel = s.Definicoes.Last().CodFilial;

                    var definicoesClienteSapiens = new DefinicoesSapiensBLL().ObterDefinicoesPorCliente(clienteSapiens.codcli, codFilAnulavel);
                    defSolBLL.PreencheDependencias(s.Definicoes.Last(), s.CodCliente, s.CodFilial);

                    clienteSapiens.Definicoes.Add(definicoesClienteSapiens);

                    #region Lógica para mostrar o limite solicitado
                    var limiteAtual = clienteSapiensBLL.ListaLimiteAtual(1, s.CodCliente); // ex de retorno : "R$ 100,00"
                    ViewBag.LimiteAtual = limiteAtual;

                    limiteAtual = Regex.Replace(limiteAtual, @"(\s+)|(\\+)|(\.+)|(/+)|(\-+)|(\,+)|(R+)|(\$+)", "");
                    if (limiteAtual.Length > 1)
                    {
                        limiteAtual = limiteAtual.Substring(0, limiteAtual.Length - 2);
                    }
                    else
                    {
                        limiteAtual = "0";
                    }

                    string limiteSolicitado = String.Format("{0:C}", s.Definicoes.Last().VlrLimite);

                    if (limiteAtual != limiteSolicitado)
                    {
                        ViewBag.HouveAlteracaoLimite = "S";
                        ViewBag.LimiteSolicitado = String.Format("{0:C}", Decimal.Parse(limiteSolicitado));
                    }
                    else
                    {
                        ViewBag.HouveAlteracaoLimite = "N";
                        ViewBag.LimiteSolicitado = "---";
                    }
                    #endregion
                    if (clienteSapiens.Definicoes.Last() != null)
                    {

                        ///////////

                        var codcpgAtual = clienteSapiens.Definicoes.Last().Codcpg;
                        var codcpgSolicitado = s.Definicoes.Last().CodCondicaoPagamento;

                        var prazoDePagamentoAtual = s.Definicoes.Last().CondicoesPagamento.Where(c => c.codcpg == codcpgAtual).Select(cond => cond.descpg).FirstOrDefault();
                        ViewBag.PrazoDePagamentoCadastro = prazoDePagamentoAtual;

                        if (codcpgAtual != codcpgSolicitado)
                        {
                            ViewBag.HouveAlteracaoPrazo = "S";
                        }
                        else
                        {
                            ViewBag.HouveAlteracaoPrazo = "N";
                        }

                        var codFpgAtual = clienteSapiens.Definicoes.Last().Codfpg;
                        var codFpgSolicitado = s.Definicoes.Last().CodFormaDePagamento;

                        var formaDePagamentoAtual = s.Definicoes.Last().FormasPagamento.Where(c => c.codfpg == codFpgAtual).Select(cond => cond.desfpg).FirstOrDefault();
                        ViewBag.FormaDePagamentoCadastro = formaDePagamentoAtual;

                        if (codFpgAtual.ToString() != codFpgSolicitado)
                        {
                            ViewBag.HouveAlteracaoFormaPagamento = "S";
                        }
                        else
                        {
                            ViewBag.HouveAlteracaoFormaPagamento = "N";
                        }

                    }

                }

                Session["Solicitacao"] = s;
                return View("Consultar", s);
            }
        }
        public JsonResult InativarCliente(int codigo, string txtJustificativa)
        {
            try
            {
                var s = Session["Solicitacao"] as Solicitacao;

                var cliente = new ClienteSapiensBLL().ObterPorCodigo(codigo);

                using (var solBLL = new SolicitacaoBLL())
                {
                    var codFilial = Convert.ToInt32(Session["CodigoFilial"]);
                    var usuario = (UsuarioSapiens)Session["ConexaoSapiens"];

                    solBLL.PreencheDadosSolicitacaoUsandoSapiens(s, cliente, false);

                    //s.Definicoes[0].VlrLimite = "R$ " + s.Definicoes[0].VlrLimite + ",00";
                    s.Definicoes[0].VlrLimite = String.Format("{0:c}", Convert.ToInt32(s.Definicoes[0].VlrLimite));
                    s.CodCliente = cliente.codcli;
                    s.CodTipoSolicitacao = Convert.ToInt32(TipoSolicitacao.Inativacao);
                    s.CodFilial = codFilial;
                    if (string.IsNullOrEmpty(txtJustificativa))
                    {
                        s.TxtJustificativa = "Solicito Inativação do Cliente " + cliente.codcli;
                    }
                    else
                    {
                        s.TxtJustificativa = txtJustificativa;
                    }
                    s.CodUsuarioSolicitacao = usuario.Codusu;
                    s.DatCriacao = DateTime.Now;

                    #region Teste Tipo Cliente

                    var tam = cliente.cgccpf.ToString().Length; //tamanho do documento do cliente no banco

                    // se o tipo cliente não for nulo nem vazio, posso testar o tipo o corrigir o doc.
                    if (!string.IsNullOrEmpty(cliente.tipcli))
                    {
                        if (cliente.tipcli.ToUpper() == "F")
                        {

                            // hummmmmm o que temos aqui... uma GAMBIARRA FULL HD 1024 pixels!
                            // ( coluna numérica do oracle foi traduzida para long, então não vem o 0 na frente do CPF. )
                            // isso se chama "Dançar conforme a música"

                            if (tam < 11)
                            {
                                if (tam == 10)
                                {
                                    s.DadosPrincipaisSolicitacao.Last().CPFCNPJ = "0" + s.DadosPrincipaisSolicitacao.Last().CPFCNPJ;
                                }
                                else if (tam == 9)
                                {
                                    s.DadosPrincipaisSolicitacao.Last().CPFCNPJ = "00" + s.DadosPrincipaisSolicitacao.Last().CPFCNPJ;
                                }
                                else if (tam == 8)
                                {
                                    s.DadosPrincipaisSolicitacao.Last().CPFCNPJ = "000" + s.DadosPrincipaisSolicitacao.Last().CPFCNPJ;
                                }
                            }

                        }
                        else if (cliente.tipcli.ToUpper() == "J")
                        {
                            //GAMBIARRA FULL LEVEL 2 ( coluna numérica do oracle foi traduzida para long, então não vem o 0 na frente do CNPJ..)
                            if (tam < 14)
                            {
                                if (tam == 13)
                                {
                                    //$cpfcnpj.val("0" + $cpfcnpj.val());
                                    s.DadosPrincipaisSolicitacao.Last().CPFCNPJ = "0" + s.DadosPrincipaisSolicitacao.Last().CPFCNPJ;
                                }
                                else if (tam == 12)
                                {
                                    //$cpfcnpj.val("00" + $cpfcnpj.val());
                                    s.DadosPrincipaisSolicitacao.Last().CPFCNPJ = "00" + s.DadosPrincipaisSolicitacao.Last().CPFCNPJ;
                                }
                                else if (tam == 11)
                                {
                                    //$cpfcnpj.val("000" + $cpfcnpj.val());
                                    s.DadosPrincipaisSolicitacao.Last().CPFCNPJ = "000" + s.DadosPrincipaisSolicitacao.Last().CPFCNPJ;
                                }
                            }
                        } // FIM DO TESTE TIPO CLIENTE
                    }

                    #endregion

                    s.DadosPrincipaisSolicitacao.Last().Ativo = "I";
                    SalvarDadoPrincipal(s.DadosPrincipaisSolicitacao.Last()); // além de salvar os dados principais, salva as listas em cascata.
                    SalvarDefinicoes(s.Definicoes.Last());
                    EnviarParaAprovacao(s.TxtJustificativa);

                    return Json(new { codigo = s.Codigo , msg = "Solicitacao " + s.Codigo +" foi enviada para aprovação"}, JsonRequestBehavior.DenyGet);
                }
            }
            catch (Exception ex)
            {
                return Json(new { erro = ex.Message }, JsonRequestBehavior.DenyGet);
            }
        }
        public ActionResult ConsultarSerasa(string CPFCNPJ, string UF = "")
        {
            using (var solicitacaoBLL = new SolicitacaoBLL())
            {

                // Consultar o Serasa.
                #region retorna um JSON com o resultado da consulta Confie do Serasa

                // RETIRA OS CARACTERES ESPECIAIS.
                CPFCNPJ = Regex.Replace(CPFCNPJ, @"(\s+)|(\\+)|(\.+)|(/+)|(\-+)", "");

                if (!ValidaDocumento(CPFCNPJ))
                {
                    return Json(new { erro = "CPF ou CNPJ Inválido" }, JsonRequestBehavior.DenyGet);
                }

                var resConsulta = solicitacaoBLL.PreparaConsultaConfie(CPFCNPJ, UF);

                var CodIBGE = resConsulta.DadosReceita.CodIBGE;
                var CodIBGESin = resConsulta.DadosSintegra.CodIBGE;

                if (resConsulta.DadosReceita == null && resConsulta.DadosSintegra == null)
                {
                    return Json(new { erro = "Dados não encontrados." }, JsonRequestBehavior.DenyGet);
                }

                else
                {
                    // Salva o LOG da consulta na base.
                    var consultaReceitaBLL = new ConsultaReceitaBLL();
                    var consultaReceita = new ConsultaReceita();

                    consultaReceita.Codusucon = ((UsuarioSapiens)Session["ConexaoSapiens"]).Codusu;
                    consultaReceita.Datcon = DateTime.Now;

                    consultaReceita.Sitrec = resConsulta.DadosReceita.Situacao;
                    consultaReceita.Sitsin = resConsulta.DadosSintegra.Situacao;
                    consultaReceita.Documento = CPFCNPJ;

                    //consultaReceita.Solicitacao = s;
                    consultaReceitaBLL.Salvar(consultaReceita);

                   // var IEValida = SICAD.DAL.ConsultaConfie.ValidarInscricaoEstadual(resConsulta.DadosSintegra.InscricaoEstadual, ref IEFormatada);
                    var IEFormatada = SICAD.DAL.ConsultaConfie.FormatarInscricaoEstadual(resConsulta.DadosReceita.UF, resConsulta.DadosSintegra.InscricaoEstadual);

                    // atualizar sempre e sobrescrever os valores na tela.
                    return Json(new
                    {
                        CPFCNPJ = CPFCNPJ,
                        SituacaoReceita = resConsulta.DadosReceita.Situacao,
                        SituacaoSin = resConsulta.DadosSintegra.Situacao,
                        /* Dados Principais do Sapiens ------------------------------------ */
                        NomeFantasia = !String.IsNullOrEmpty(resConsulta.DadosReceita.Nome) ? resConsulta.DadosReceita.Nome : resConsulta.DadosSintegra.Nome,
                        RazaoSocial = resConsulta.DadosReceita.RazaoSocial,
                        Logradouro = !String.IsNullOrEmpty(resConsulta.DadosReceita.Endereco) ? resConsulta.DadosReceita.Endereco : resConsulta.DadosSintegra.Endereco,
                        DataUltimaConsulta = new DateTime(),
                        Bairro = !String.IsNullOrEmpty(resConsulta.DadosReceita.Bairro) ? resConsulta.DadosReceita.Bairro : resConsulta.DadosSintegra.Bairro,
                        Cidade = !String.IsNullOrEmpty(resConsulta.DadosReceita.Municipio) ? resConsulta.DadosReceita.Municipio : resConsulta.DadosSintegra.Municipio,
                        UF = !String.IsNullOrEmpty(resConsulta.DadosReceita.UF) ? resConsulta.DadosReceita.UF : resConsulta.DadosSintegra.UF,
                        CEP = !String.IsNullOrEmpty(resConsulta.DadosReceita.CEP) ? resConsulta.DadosReceita.CEP : resConsulta.DadosSintegra.CEP,
                        Complemento = !String.IsNullOrEmpty(resConsulta.DadosReceita.Complemento) ? resConsulta.DadosReceita.Complemento : resConsulta.DadosSintegra.Complemento,
                        Numero = !String.IsNullOrEmpty(resConsulta.DadosReceita.Numero) ? resConsulta.DadosReceita.Numero : resConsulta.DadosSintegra.Num,
                        InscricaoEstadualSin = IEFormatada,//////////////////
                        CodIBGE = !String.IsNullOrEmpty(resConsulta.DadosReceita.CodIBGE) ? resConsulta.DadosReceita.CodIBGE : resConsulta.DadosSintegra.CodIBGE,

                        #region----------------------  daqui pra baixo, é o que veio do SERASA ------------------

                        // não está usando
                        //CNAE = resConsulta.DadosReceita.CNAE,
                        //DataAbertura = resConsulta.DadosReceita.DataAbertura,
                        //DescCNAE = resConsulta.DadosReceita.DescCNAE,
                        //NaturezaJuridica = resConsulta.DadosReceita.NaturezaJuridica,
                        //Simples = resConsulta.DadosReceita.Simples,
                        //DescAtividadeEconomicaSin = resConsulta.DadosSintegra.DescAtividadeEconomica,
                        //DistritoIBGESin = resConsulta.DadosSintegra.DistritoIBGE,
                        //ObservacaoSin = resConsulta.DadosSintegra.Observacao,
                        //UF = resConsulta.DadosReceita.UF,

                        #endregion
                    }, JsonRequestBehavior.DenyGet);
                }
                #endregion
            }//fim do using
        }
        public ActionResult Index(string buscaCli)
        {
            try
            {
                //Autentica
                if (Session["ConexaoSapiens"] == null)
                {
                    return RedirectToAction("Login", "Home");
                }

                var usuario = (UsuarioSapiens)Session["ConexaoSapiens"];

                ViewBag.Usuario = usuario.Nomusu;
                ViewBag.NomeEmpresa = usuario.Numemp;
                var nomeFilial = Session["NomeFilial"] as string;
                ViewBag.Filial = usuario.Codfil + " - " + nomeFilial;

                //Autoriza
                if (!AutorizaUsuario(Helpers.ControlAccessConfig.ListaSolicitacoes))
                {
                    return View("Erro", null, "Módulo não autorizado para este usuário. ");
                }

                IEnumerable<Solicitacao> model = new List<Solicitacao>();

                #region MONTA PÁGINA COM GRID DE SOLICITAÇÕES

                using (var solicitacaoBLL = new SolicitacaoBLL())
                {

                    //TODO: 09/12/2014 Obter as solicitacoes mostrar as solicitações cujo status é diferente de 'AA'

                    // na criacao de uma nova, ou na edicao de uma existente, definir o tipo ao enviar para aprovacao.

                    model = solicitacaoBLL.ObterSolicitacoesPorCodFilial(Convert.ToInt32(Session["CodigoFilial"]));
                    //var listaSolicitacoes = model.OrderByDescending(c => c.Codigo).Where(s => s.CodUsuarioSolicitacao == usuario.Codusu).AsQueryable();

                    // 25/08/2015 - todos os usuários podem ver todas as solicitações da filial. OK
                    //var listaSolicitacoes = model.OrderByDescending(c => c.Codigo).AsQueryable();

                    var listaSolicitacoes = model.OrderByDescending(c => c.Codigo);

                    try
                    {
                        if (listaSolicitacoes.Count() > 0)
                        {
                            solicitacaoBLL.ObterNomes(listaSolicitacoes.ToList());
                        }

                        //var ajaxGridFactory = new Grid.Mvc.Ajax.GridExtensions.AjaxGridFactory();
                        //var grid = ajaxGridFactory.CreateAjaxGrid(listaSolicitacoes, 1, false);
                        //return View(grid);
                        return View(listaSolicitacoes);
                    }

                    catch (Exception ex)
                    {
                        return View("Erro", null, ex.Message);
                    }
                }

            }
            catch (Exception ex)
            {
                return View("Erro", null, ex.Message);
            }
                #endregion
        }
        public ActionResult Editar(int codigo = 0)
        {
            //Autentica
            if (Session["ConexaoSapiens"] == null)
            {
                return RedirectToAction("Login", "Home");
            }

            //Autoriza
            if (!AutorizaUsuario(Helpers.ControlAccessConfig.NovaSolicitacao))
            {
                return View("Erro", null, "Módulo não autorizado para este usuário. ");
            }

            using (var solicitacaoBLL = new SolicitacaoBLL())
            {

                var consultaReceitaBLL = new ConsultaReceitaBLL();

                // 18/11/2014
                #region buscar a solicitacao usando o código e obter todas as dependencias OK - Update dia 30/12/2014 - Deixando o NHibernate Gerenciar os relacionamentos.

                Solicitacao model = solicitacaoBLL.ObterPorCodigo(codigo);

                var cpfcnpj = model.DadosPrincipaisSolicitacao.Last().CPFCNPJ;
                // RETIRA OS CARACTERES ESPECIAIS.
                cpfcnpj = Regex.Replace(cpfcnpj, @"(\s+)|(\\+)|(\.+)|(/+)|(\-+)", "");

                var tipoCliente = "";

                if (cpfcnpj.Length == 11)
                {
                    tipoCliente = "F";
                }
                else
                {
                    tipoCliente = "J";
                }

                var clienteSapiensBLL = new ClienteSapiensBLL();

                // se for inclusão, ignorar esta parte...
                if (model.CodCliente != 0)
                {
                    ClienteSapiens cliente = clienteSapiensBLL.ObterPorCodigo(model.CodCliente);

                    // Obter a data da ultima consulta ao serasa..
                    var ultimaConsulta = consultaReceitaBLL.ObterDataUltimaConsultaDoCliente(cpfcnpj);
                    var dataCadastro = cliente != null && cliente.datcad.HasValue ? cliente.datcad.Value.ToString("dd/MM/yyyy hh:mm:ss") : "";
                    model.DadosPrincipaisSolicitacao.Last().DataUltimaConsulta = ultimaConsulta.Year == 1 ? "Cadastrado em " + dataCadastro : "Última consulta feita em " + ultimaConsulta.ToString("dd/MM/yyyy hh:mm:ss");

                }
                model.DadosPrincipaisSolicitacao.Last().TipoCliente = tipoCliente;

                Session["Solicitacao"] = model;

                #endregion

                return View("Editar", model); // sem as dependencias.
            }
        }
        public ActionResult Pesquisa(DadosPesquisa dados, int? page)
        {
            //Autentica
            if (Session["ConexaoSapiens"] == null)
            {
                return RedirectToAction("Login", "Home");
            }
            //Autoriza
            if (!AutorizaUsuario(ControlAccessConfig.ListaAnalise))
            {
                return View("Erro", null, "Módulo não autorizado para este usuário. ");
            }

            IList<Solicitacao> solicitacoes = new List<Solicitacao>();

            using (var solBLL = new SolicitacaoBLL())
            {

                var usuario = Session["UsuarioSapiens"] as UsuarioSapiens;

                var codUsuario = 0;

                int CodSolicitacao = dados.CodSolicitacao;
                int CodTipoSolicitacao = dados.CodTipoSolicitacao;
                int CodCliente = dados.CodCliente;
                string NomeCliente = dados.NomeCliente;
                string Solicitante = dados.Solicitante;
                bool PessoaFisica = dados.PessoaFisica;
                var tipoCliente = dados.PessoaFisica ? "F" : "J";
                bool MinhasSolicitacoes = dados.MinhasSolicitacoes;
                var dataSolicitacaoIni = Convert.ToDateTime(dados.DataSolicitacaoIni.ToShortDateString());
                var dataSolicitacaoFim = Convert.ToDateTime(dados.DataSolicitacaoFim.ToShortDateString());
                var dataAprovacaoIni = Convert.ToDateTime(dados.DataAprovacaoIni.ToShortDateString());
                var dataAprovacaoFim = Convert.ToDateTime(dados.DataAprovacaoFim.ToShortDateString());
                var CodSituacaoSolicitacao = Convert.ToInt32(dados.Status);

                // se o código da solicitação for infomado, ignorar os outros filtros
                if (CodSolicitacao != 0)
                {
                    //solicitacoes = solBLL.ListarTodos().Where(s => s.Codigo == CodSolicitacao).ToList();
                    solicitacoes.Add(solBLL.ObterPorCodigo(CodSolicitacao));

                }
                else
                {

                    if (CodTipoSolicitacao == 0)
                    {
                        solicitacoes = solBLL.ListarTodos();
                    }
                    else
                    {
                        solicitacoes = solBLL.ListarTodos().Where(s => s.CodTipoSolicitacao == CodTipoSolicitacao).ToList();
                    }

                    if (CodCliente != 0)
                    {
                        solicitacoes = solicitacoes.Where(s => s.CodCliente == CodCliente).ToList();
                    }

                    if (!String.IsNullOrEmpty(NomeCliente))
                    {
                        solicitacoes = solicitacoes.Where(s => s.DadosPrincipaisSolicitacao.Last().RazaoSocial.StartsWith(dados.NomeCliente)).ToList();
                    }

                    if (!String.IsNullOrEmpty(dados.Solicitante))
                    {
                        codUsuario = new UsuarioSapiensBLL().ListarTodos().Where(u => u.Nomusu.StartsWith(dados.Solicitante)).Select(u => u.Codusu).FirstOrDefault();
                        solicitacoes = solicitacoes.Where(s => s.CodUsuarioSolicitacao == codUsuario).ToList();
                    }

                    if (MinhasSolicitacoes)
                    {
                        solicitacoes = solicitacoes.Where(s => s.CodUsuarioSolicitacao == usuario.Codusu).ToList();
                    }

                    if (dataSolicitacaoIni.ToShortDateString() != "01/01/0001")
                    {
                         solicitacoes = solicitacoes.Where(s => s.DatCriacao >= dataSolicitacaoIni && s.DatCriacao <= dataSolicitacaoFim).ToList();
                    }

                    if (dataAprovacaoIni.ToShortDateString() != "01/01/0001")
                    {
                        solicitacoes = solicitacoes.Where(s => s.CodSituacaoAtual == 3
                                        && s.PareceresSolicitacao.OrderBy(p => p.CodParecer).Last().Datpar.Value >= dataAprovacaoIni
                                        && s.PareceresSolicitacao.OrderBy(p => p.CodParecer).Last().Datpar.Value <= dataAprovacaoFim).ToList();
                    }

                    if (CodSituacaoSolicitacao != 0)
                    {
                        solicitacoes = solicitacoes.Where(s => s.CodSituacaoAtual == CodSituacaoSolicitacao).ToList();
                    }

                    solicitacoes = solicitacoes.Where(s => s.DadosPrincipaisSolicitacao.Last().TipoCliente == tipoCliente).ToList();

                }

                solBLL.ObterNomes(solicitacoes.ToList());

                //var ajaxGridFactory = new Grid.Mvc.Ajax.GridExtensions.AjaxGridFactory();
                //var grid = ajaxGridFactory.CreateAjaxGrid(solicitacoes.OrderBy(c => c.Codigo).OrderBy(s => s.Codigo).AsQueryable(), page.HasValue ? page.Value : 1, false);

                return View("Index", solicitacoes.OrderBy(c => c.Codigo).OrderBy(s => s.Codigo).AsQueryable());
            }
            //retornar uma lista de solicitações com os dados da pesquisa
        }
        public ActionResult ExcluirContato(int codigo)
        {
            using (var bll = new SolicitacaoBLL())
            {
                var s = Session["Solicitacao"] as Solicitacao;

                try
                {
                    var ct = s.Contatos.Where(c => c.CodContato == codigo).Single();
                    s.Contatos.Remove(ct);
                    bll.Atualizar(s);
                }
                catch (Exception ex)
                {
                    return Json(new { erro = ex.Message }, JsonRequestBehavior.DenyGet);
                }

                Session["Solicitacao"] = s;

                return Json(new { msg = "contato excluido" }, JsonRequestBehavior.DenyGet);
            }
        }
        // GET: /Aprovacao/
        public ActionResult Index()
        {
            //Autentica
            if (Session["ConexaoSapiens"] == null)
            {
                return RedirectToAction("Login", "Home");
            }
            //Autoriza
            if (!AutorizaUsuario(ControlAccessConfig.ListaAnalise))
            {
                return View("Erro", null, "Módulo não autorizado para este usuário. ");
            }

            var usuario = (UsuarioSapiens)Session["ConexaoSapiens"];

            ViewBag.Usuario = usuario.Nomusu;
            ViewBag.NomeEmpresa = usuario.Numemp;
            var nomeFilial = Session["NomeFilial"] as string;
            ViewBag.Filial = usuario.Codfil + " - " + nomeFilial;

            using (var solicitacaoBLL = new SolicitacaoBLL())
            {
                try
                {
                    var model = solicitacaoBLL.ObterSolicitacoesAguardandoAprovacao();

                    var listaSolicitacoes = model.OrderBy(s => s.DatCriacao).AsQueryable();

                    solicitacaoBLL.ObterNomes(listaSolicitacoes.ToList());

                    foreach (var sol in listaSolicitacoes)
                    {
                        foreach (var tipo in sol.TiposAlteracao)
                        {
                            sol.Tipo += " - " + tipo.Descricao;
                        }
                    }

                    //var ajaxGridFactory = new Grid.Mvc.Ajax.GridExtensions.AjaxGridFactory();
                    //var grid = ajaxGridFactory.CreateAjaxGrid(listaSolicitacoes, 1, false);

                    return View(listaSolicitacoes);
                }
                catch (Exception ex)
                {
                    return View("Error", ex.Message);
                }
            }
        }