public static string ConsultarEstoquePreACD(string guid, string filtro)
        {
            try
            {
                int usuarioId = HttpContext.Current.Session["UsuarioId"].ToString().ToInt();

                var filtroSQL = new StringBuilder();

                var nomeArquivo = Path.Combine(HttpContext.Current.Server.MapPath("."), "Uploads", $"PACD_{guid}.csv");

                int totalRegistros = 0;

                if (!string.IsNullOrWhiteSpace(filtro))
                {
                    FiltroConsultaPreACD filtroConsultaPreACD = JsonConvert.DeserializeObject <FiltroConsultaPreACD>(filtro);

                    if (filtroConsultaPreACD != null)
                    {
                        if (!string.IsNullOrEmpty(filtroConsultaPreACD.EntradaDe))
                        {
                            if (StringHelpers.IsDate(filtroConsultaPreACD.EntradaDe))
                            {
                                filtroSQL.Append(" AND DataHoraEntradaEstoque >= CONVERT(DATETIME,'" + Convert.ToDateTime(filtroConsultaPreACD.EntradaDe).ToString("dd/MM/yyyy") + " 00:00:00', 103) ");
                            }
                        }

                        if (!string.IsNullOrEmpty(filtroConsultaPreACD.EntradaAte))
                        {
                            if (StringHelpers.IsDate(filtroConsultaPreACD.EntradaAte))
                            {
                                filtroSQL.Append(" AND DataHoraEntradaEstoque <= CONVERT(DATETIME,'" + Convert.ToDateTime(filtroConsultaPreACD.EntradaAte).ToString("dd/MM/yyyy") + " 23:59:59', 103) ");
                            }
                        }

                        if (!string.IsNullOrEmpty(filtroConsultaPreACD.UnidadeRFB))
                        {
                            if (filtroConsultaPreACD.UnidadeRFB.ToInt() > 0)
                            {
                                filtroSQL.Append(" AND CodigoURF = '" + filtroConsultaPreACD.UnidadeRFB + "' ");
                            }
                        }

                        if (!string.IsNullOrEmpty(filtroConsultaPreACD.RecintoDespacho))
                        {
                            if (filtroConsultaPreACD.RecintoDespacho.ToInt() > 0)
                            {
                                filtroSQL.Append(" AND CodigoRA = '" + filtroConsultaPreACD.RecintoDespacho + "' ");
                            }
                        }

                        if (!string.IsNullOrEmpty(filtroConsultaPreACD.CnpjResponsavel))
                        {
                            filtroSQL.Append(" AND REPLACE(REPLACE(REPLACE(IdResponsavel, '.', ''), '/', ''), '-', '') = '" + filtroConsultaPreACD.CnpjResponsavel.RemoverCaracteresEspeciais() + "' ");
                        }

                        if (!string.IsNullOrEmpty(filtroConsultaPreACD.NCM))
                        {
                            filtroSQL.Append(" AND NcmCodigo = '" + filtroConsultaPreACD.NCM + "' ");
                        }

                        if (!string.IsNullOrEmpty(filtroConsultaPreACD.PaisDestinatario))
                        {
                            if (filtroConsultaPreACD.PaisDestinatario.ToInt() > 0)
                            {
                                filtroSQL.Append(" AND CodigoPaisDestinatario = '" + filtroConsultaPreACD.PaisDestinatario + "' ");
                            }
                        }

                        if (!string.IsNullOrEmpty(filtroConsultaPreACD.EmissaoNFDe))
                        {
                            if (StringHelpers.IsDate(filtroConsultaPreACD.EmissaoNFDe))
                            {
                                filtroSQL.Append(" AND DataEmissaoNF >= CONVERT(DATETIME,'" + Convert.ToDateTime(filtroConsultaPreACD.EmissaoNFDe).ToString("dd/MM/yyyy") + " 00:00:00', 103) ");
                            }
                        }

                        if (!string.IsNullOrEmpty(filtroConsultaPreACD.EmissaoNFAte))
                        {
                            if (StringHelpers.IsDate(filtroConsultaPreACD.EmissaoNFAte))
                            {
                                filtroSQL.Append(" AND DataEmissaoNF <= CONVERT(DATETIME,'" + Convert.ToDateTime(filtroConsultaPreACD.EmissaoNFAte).ToString("dd/MM/yyyy") + " 23:59:59', 103) ");
                            }
                        }

                        if (!string.IsNullOrEmpty(filtroConsultaPreACD.CnpjEmitente))
                        {
                            filtroSQL.Append(" AND REPLACE(REPLACE(REPLACE(NotaFiscalEmitenteIdentificacao, '.', ''), '/', ''), '-', '')  = '" + filtroConsultaPreACD.CnpjEmitente.RemoverCaracteresEspeciais() + "' ");
                        }

                        if (!string.IsNullOrEmpty(filtroConsultaPreACD.CnpjDestinatario))
                        {
                            var cnpjs = filtroConsultaPreACD.CnpjDestinatario
                                        .Split(',')
                                        .Select(c => $"'{c.RemoverCaracteresEspeciais()}'");

                            filtroSQL.Append($" AND REPLACE(REPLACE(REPLACE(CnpjDestinatario, '.', ''), '/', ''), '-', '') IN ({string.Join(",", cnpjs)}) ");
                        }

                        if (!string.IsNullOrEmpty(filtroConsultaPreACD.NumeroNF))
                        {
                            filtroSQL.Append(" AND NumeroNF = '" + filtroConsultaPreACD.NumeroNF + "' ");
                        }

                        if (!string.IsNullOrEmpty(filtroConsultaPreACD.ModeloNF))
                        {
                            filtroSQL.Append(" AND NotaFiscalModelo = '" + filtroConsultaPreACD.ModeloNF + "' ");
                        }

                        if (!string.IsNullOrEmpty(filtroConsultaPreACD.SerieNF))
                        {
                            filtroSQL.Append(" AND NotaFiscalSerie = '" + filtroConsultaPreACD.SerieNF + "' ");
                        }

                        if (!string.IsNullOrEmpty(filtroConsultaPreACD.Item))
                        {
                            if (filtroConsultaPreACD.Item.ToInt() > 0)
                            {
                                filtroSQL.Append(" AND Item = " + filtroConsultaPreACD.Item + " ");
                            }
                        }
                    }
                }

                using (SqlConnection Con = new SqlConnection(Banco.StringConexao()))
                {
                    using (SqlCommand Cmd = new SqlCommand())
                    {
                        Cmd.CommandTimeout = 4800;

                        Cmd.Connection  = Con;
                        Cmd.CommandType = CommandType.Text;

                        Cmd.CommandText = $@"
	                            SELECT 
		                            DISTINCT
                                        [DataEmissaoNF]
                                        ,[NumeroNF]		                          
                                        ,[NotaFiscalModelo]
                                        ,[NotaFiscalSerie]
                                        ,[PesoAferido]
                                        ,[Saldo]
                                        ,[UnidadeEstatistica]
                                        ,[DataHoraEntradaEstoque]
                                        ,[ResponsavelNome]
                                        ,[ResponsavelIdentificacao]
                                        ,[Latitude]
                                        ,[Longitude]
                                        ,[LocalRaCodigo]                                  
                                        ,[LocalRaDescricao]
                                        ,[NotaFiscalEmitenteIdentificacao]
                                        ,[NotaFiscalEmitenteNome]
                                        ,[NotaFiscalUf]
                                        ,[TransportadorIdentificacao]
                                        ,[TransportadorNome]
                                        ,[CodigoRA]
                                        ,[NumeroDocumento]
                                        ,[Tipo]                                  
                                        ,[CodigoNCM]
                                        ,[CodigoURF]                                                                   
                                        ,[IdResponsavel]
                                        ,[NomeResponsavel]
                                        ,[CodigoPaisDestinatario]
                                        ,[NomePaisDestinatario]
                                        ,[AnoDeposito]
                                        ,[SequenciaDeposito]
                                        ,[ExisteConteiner]
                                        ,[DataConsulta]
                                        ,[IdentificacaoCondutor]
                                        ,[NomeCondutor]                                  
                                        ,[DescricaoAvarias]
                                        ,[LocalUrfCodigo]
                                        ,[LocalUrfDescricao]
                                        ,[NcmCodigo]
                                        ,[NcmDescricao]
                                        ,[NotaFiscalDestinatarioNome]
                                        ,[NotaFiscalDestinatarioPais]
                                        ,[NotaFiscalEmissao]                                                                   
                                        ,[NotaFiscalEmitentePais]                                  
                                        ,[NotaFiscalNumero]
                                        ,[NumeroDue]
                                        ,[NumeroItem]
                                        ,[PaisDestino]                                  
                                        ,[QuantidadeExportada]                                                                   
                                        ,[ResponsavelPais]                                                                   
                                        ,[TransportadorPais]                                  
                                        ,[Valor]
                                        ,[CnpjDestinatario]
                                        ,[Item]
                                        ,[SaldoAtual]
                                        ,[Cancelado]
		                                ,ROW_NUMBER() OVER (ORDER BY Id) AS Linha
		                                ,COUNT(*) OVER() TotalLinhas
	                                FROM
		                                [dbo].[TbConsultaEstoquePreACD]    
                                    WHERE
                                        Id > 0 and DATAHORAENTRADAESTOQUE is not null {filtroSQL.ToString()}
                                    ORDER BY
                                        DATAHORAENTRADAESTOQUE 
                                 ";

                        Con.Open();
                        Stopwatch stopWatch = new Stopwatch();
                        stopWatch.Start();
                        SqlDataReader dataReader = Cmd.ExecuteReader();

                        //dataReader.Read();
                        stopWatch.Stop();
                        TimeSpan ts = stopWatch.Elapsed;
                        //System.Diagnostics.Debug.WriteLine($"Consulta: {ts} Página: {pagina}");

                        stopWatch = new Stopwatch();
                        stopWatch.Start();
                        //if (dataReader.HasRows)
                        //{
                        //    totalFiltro = Convert.ToInt32(dataReader.GetValue(dataReader.GetOrdinal("TotalLinhas")));
                        //}
                        EstoqueDAO estoqueDAO = new EstoqueDAO(false);
                        totalRegistros = ObterTotalItensProcessar(filtroSQL.ToString());
                        estoqueDAO.InserirStatusExportacaoCSV(guid, usuarioId, totalRegistros, 0, "Iniciando Processamento");

                        StreamWriter sw;

                        if (!File.Exists(nomeArquivo))
                        {
                            sw = new StreamWriter(new FileStream(nomeArquivo, FileMode.Create), Encoding.UTF8, 65536);

                            StringBuilder sb = new StringBuilder();

                            var colunasStr = ObterNomesColunas();

                            var colunas = colunasStr.Split(';');

                            sw.WriteLine(string.Join(";", colunas));

                            sw.Close();
                        }

                        sw = new StreamWriter(new FileStream(nomeArquivo, FileMode.Append), Encoding.UTF8, 65536);

                        stopWatch.Stop();
                        ts = stopWatch.Elapsed;
                        System.Diagnostics.Debug.WriteLine($"Montar Cabeçalho: {ts}");
                        stopWatch = new Stopwatch();
                        stopWatch.Start();

                        while (dataReader.Read())
                        {
                            var sb = new StringBuilder();
                            for (int index = 0; index < dataReader.FieldCount - 2; index++)
                            {
                                if (!dataReader.IsDBNull(index))
                                {
                                    string value = dataReader.GetValue(index).ToString();
                                    if (dataReader.GetFieldType(index) == typeof(String))
                                    {
                                        if (value.IndexOf("\"") >= 0)
                                        {
                                            value = value.Replace("\"", "\"\"");
                                        }

                                        if (value.IndexOf(";") >= 0)
                                        {
                                            value = "\"" + value + "\"";
                                        }
                                    }
                                    sb.Append(value);
                                }

                                if (index < dataReader.FieldCount - 2)
                                {
                                    sb.Append(";");
                                }
                            }

                            if (!dataReader.IsDBNull(dataReader.FieldCount - 3))
                            {
                                sb.Append(dataReader.GetValue(dataReader.FieldCount - 3).ToString().Replace(";", " "));
                            }

                            sw.WriteLine(string.Join(";", sb.ToString().QuebraDeLinhaXML()));

                            if (dataReader.GetValue(dataReader.GetOrdinal("Linha")).ToString().ToInt() % 10000 == 0)
                            {
                                var registrosProcessados = dataReader.GetValue(dataReader.GetOrdinal("Linha")).ToString().ToInt();
                                estoqueDAO.AtualizarStatusExportacaoCSV(guid, usuarioId, registrosProcessados, $"Total de registros processados: {registrosProcessados}");
                            }
                        }
                        estoqueDAO.AtualizarStatusExportacaoCSV(guid, usuarioId, totalRegistros, $"Total de registros processados: {totalRegistros}");
                        stopWatch.Stop();
                        ts = stopWatch.Elapsed;
                        System.Diagnostics.Debug.WriteLine($"Escreveu arquivo: {ts}");
                        dataReader.Close();
                        sw.Close();

                        return("");
                    }
                }
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }