private string SubstituirCamposPath(string pathToSave, TipoTituloPublicoBCB tipoTituloPublico, int year)
        {
            StringBuilder construtorCaminho = new StringBuilder(pathToSave);

            construtorCaminho.Replace("{$tipoTituloPublico}", tipoTituloPublico.ToString());
            construtorCaminho.Replace("{$ano}", year.ToString());

            return(construtorCaminho.ToString());
        }
        private void FormatarNomeArquivoLFT(int Ano, TipoTituloPublicoBCB tipoTituloPublico, ref string NomeArquivo, ref string URLDownload)
        {
            var prefixoTipoAtivo = ObterPrefixoTipoTitulo(tipoTituloPublico);
            var sufixoURL        = CriarSufixoURL(Ano, prefixoTipoAtivo);

            if ((Ano <= 2011))
            {
                URLDownload = string.Concat(CONST_URL_DOWNLOAD_HISTORICO_PREFIXO, sufixoURL);
            }
            else
            {
                URLDownload = string.Concat(CONST_URL_DOWNLOAD_ATUAL_PREFIXO, sufixoURL);
            }

            NomeArquivo = string.Format("{2}{0}_{1:yyyyMMdd}.xls", Ano, DateTime.Today, prefixoTipoAtivo);
        }
        private string ObterPrefixoTipoTitulo(TipoTituloPublicoBCB tipoTituloPublico)
        {
            string prefixoTipoTitulo = string.Empty;

            switch (tipoTituloPublico)
            {
            case TipoTituloPublicoBCB.LFT:
                prefixoTipoTitulo = "LFT";
                break;

            case TipoTituloPublicoBCB.LTN:
                prefixoTipoTitulo = "LTN";
                break;

            case TipoTituloPublicoBCB.NTNC:
                prefixoTipoTitulo = "NTN-C";
                break;

            case TipoTituloPublicoBCB.NTNB:
                prefixoTipoTitulo = "NTN-B";
                break;

            case TipoTituloPublicoBCB.NTNBPrincipal:
                prefixoTipoTitulo = "NTN-B_Principal";
                break;

            case TipoTituloPublicoBCB.NTNF:
                prefixoTipoTitulo = "NTN-F";
                break;

            default:
                prefixoTipoTitulo = "";
                break;
            }

            return(prefixoTipoTitulo);
        }
        public void DownloadYear(int year, string pathToSave, TipoTituloPublicoBCB tipoTituloPublico)
        {
            string fileName          = string.Empty;
            string urlFile           = string.Empty;
            string pathToSaveTratado = string.Empty;

            try
            {
                using (var dbContext = new TituloPublicoContext("financeDB"))
                {
                    if (string.IsNullOrEmpty(pathToSave))
                    {
                        throw new InvalidOperationException("In order to download files, it is necessary to setup de path");
                    }

                    pathToSaveTratado = SubstituirCamposPath(pathToSave, tipoTituloPublico, year);
                    FormatarNomeArquivoLFT(year, tipoTituloPublico, ref fileName, ref urlFile);

                    var CaminhoCompleto = string.Format(@"{0}{1}", pathToSaveTratado, fileName);
                    if (Downloader.DownloadFile(fileName, pathToSaveTratado, urlFile))
                    {
                        var dadosPlanilha   = LerDadosSyncfusion(CaminhoCompleto);
                        var cotacoesNovas   = TransformarCotacoes(dadosPlanilha);
                        var cotacoesAntigas = dbContext.CotacaoTituloPublicoTD;

                        var defaultDates = (from cotacaoNova in cotacoesNovas
                                            select new
                        {
                            CodigoTitulo = cotacaoNova.CodigoTitulo,
                            MinDataCotacao = DateTime.Today,
                            MaxDataCotacao = DateTime.Today
                        }).ToList()
                                           .Distinct();

                        var maxCotacaoTitulo = (from x in cotacoesAntigas
                                                group x by x.CodigoTitulo into y
                                                orderby y.Key
                                                select new
                        {
                            CodigoTitulo = y.Key,
                            MinDataCotacao = y.Min(z => z.DataCotacao),
                            MaxDataCotacao = y.Max(z => z.DataCotacao)
                        }).ToList()
                                               .Distinct();

                        var dicionario = maxCotacaoTitulo.ToDictionary(p => p.CodigoTitulo);

                        foreach (var umDefault in defaultDates)
                        {
                            if (!dicionario.ContainsKey(umDefault.CodigoTitulo))
                            {
                                dicionario[umDefault.CodigoTitulo] = umDefault;
                            }
                        }

                        var listaTotal = dicionario.Values.ToList();

                        var queryFiltraPendentes = (from cotacaoNova in cotacoesNovas
                                                    from maxCotacao in listaTotal
                                                    .Where(maxCot => maxCot.CodigoTitulo == cotacaoNova.CodigoTitulo && cotacaoNova.DataCotacao < maxCot.MinDataCotacao)
                                                    select cotacaoNova);

                        var registrosInserir = queryFiltraPendentes.ToList();

                        cotacoesAntigas.AddRange(registrosInserir);
                    }
                    dbContext.SaveChanges();
                }
            }
            catch (Exception ex) { throw ex; }
        }