/// <summary>
        /// Processa os dados retornados no arquivo de retorno de carga
        /// </summary>
        /// <param name="idArquivo"></param>
        /// <returns></returns>
        public void ProcessaDadosParaGerarArquivoRetornoCarga(int idArquivo, string pathArquivoOrigem, string codConvenio = "ACSO")
        {
            //using (StringWriter sw = new StringWriter(new System.Globalization.CultureInfo("pt-BR")))
            //{
            DateTime dtAgora      = DateTime.Now;
            string   pathDestino  = ConfigurationManager.AppSettings["ACSOIDTSC_R.CRI.DiretotioDestino"];
            string   nomeArquivo  = this.FormataNomeArquivo(codConvenio, dtAgora);
            string   pathCompleto = Path.Combine(pathDestino, nomeArquivo);

            ENLog.MapaArquivos mapArq = new ENLog.MapaArquivos(nomeArquivo, ENLog.TipoArquivo.ACSOIDTSC_R, pathArquivoOrigem, 0);
            Log.AtualizaArquivo <ENLog.MapaArquivos>(mapArq, ENLog.StatusProcessamentoArquivo.NaoProcessado, pathCompleto, "Inicia processamento de arquivo");
            mapArq.IdArquivo = idArquivo;
            int novoIdArquivo = mapArq.IdArquivo;

            int numLinha = 0;

            EnumRetornoBase.StatusProcessamento statusProc = EnumRetornoBase.StatusProcessamento.Sucesso;

            try
            {
                //Log.AtualizaArquivo<ENLog.MapaArquivos>(mapArq, ENLog.StatusProcessamentoArquivo.EmProcessamento, pathDestino, "Inicia processamento de arquivo");
                numLinha++;

                //Gero Cabeçalho
                var cab = this.MontaCabecalho(novoIdArquivo, dtAgora, nomeArquivo, "ACSO", "ACESSO", numLinha);
                cab.Insere();
                //sw.WriteLine(cab.ToString());

                //Busco os detalhes
                var detalhe = new ACSOPRGCR_RDetalheEN();
                detalhe.IdArquivo = novoIdArquivo;
                var detalhesRetorno = DetalheRetornoBaseBD.ConsultaDetalheCarga(idArquivo);

                //Totalizadores
                var cargaRejet = detalhesRetorno.Where(crgRej => !String.IsNullOrEmpty(crgRej.Retorno));

                int     totalRejeitadas = (cargaRejet != null) ? cargaRejet.Count() : 0;
                int     totalCarga      = detalhesRetorno.Count() - totalRejeitadas;
                decimal vlrTotalCrgRej  = cargaRejet.Sum(vlrCrgRejet => vlrCrgRejet.Valor);
                decimal vlrTotalCrg     = detalhesRetorno.Sum(vlrCrg => vlrCrg.Valor) - vlrTotalCrgRej;

                //Se houve rejeições mudo o status do processamento
                if (totalRejeitadas > 0)
                {
                    statusProc = EnumRetornoBase.StatusProcessamento.ErroGenérico;
                }

                //Gero Lote
                this.MontaLote(novoIdArquivo, "01", totalRejeitadas, totalCarga, numLinha, statusProc).Insere();
                //sw.WriteLine(this.MontaLote(novoIdArquivo, "", totalRejeitadas, totalCarga, numLinha, statusProc).ToString());

                int contErro = 0;
                //Gero Detalhe
                detalhesRetorno.ForEach(delegate(CargaRetornoDetalheEN crgdet)
                {
                    try
                    {
                        numLinha++;
                        this.CompoeDetalhe(crgdet, detalhe, codConvenio, numLinha);
                        detalhe.Insere();
                        //sw.WriteLine(detalhe.ToString());
                    }
                    catch (Exception)
                    {
                        contErro++;
                        string descErro = String.Format("Total de linhas com erro: {0}", contErro);
                        //this.InsereLog(mapArq, numLinha, ENLog.TipoLog.Informação, contErro);
                        this.InsereLog(mapArq, numLinha, ENLog.TipoLog.Alerta, descErro);
                    }
                }
                                        );

                numLinha++;
                //Gero Rodapé
                var rdp = this.MontaRodape(novoIdArquivo, totalCarga, totalCarga, vlrTotalCrg, totalRejeitadas, vlrTotalCrg, numLinha);
                rdp.Insere();
                //sw.WriteLine(rdp.ToString());
            }
            catch (Exception)
            {
                string descErro = "Erro processamento arquivo";
                Log.AtualizaArquivo <ENLog.MapaArquivos>(mapArq, ENLog.StatusProcessamentoArquivo.ProcessadoErro, pathCompleto, descErro);
                this.InsereLog(mapArq, numLinha, ENLog.TipoLog.Informação, descErro);
            }
            //}
        }
        /// <summary>
        /// Monta os dados que irão compor o lote
        /// </summary>
        /// <param name="idArquivo"></param>
        /// <param name="codPrgCarga"></param>
        /// <param name="statusProc"></param>
        /// <param name="numCartoes"></param>
        /// <param name="numReject"></param>
        /// <param name="numLinha"></param>
        /// <returns></returns>
        private ACSOPRGCR_RLoteEN MontaLote(int idArquivo, string codPrgCarga, int numRejeit, int numCart, int numLinha, EnumRetornoBase.StatusProcessamento statusProc)
        {
            var acsPrgCrgLoteEN = new ACSOPRGCR_RLoteEN()
            {
                IdArquivo  = idArquivo,
                CodPrgCrg  = codPrgCarga,
                StatusProc = statusProc,
                NumCart    = numCart,
                NumRejeit  = numRejeit,
                NumLinha   = numLinha
            };

            return(acsPrgCrgLoteEN);
        }