Esempio n. 1
0
        private bool DoINeedToExtract(DocLinkInfo link, FinInfoTipo tipo, FinInfoCategoria categoria)
        {
            log.Info($"Obtendo {categoria} {tipo} - {Company.RazaoSocial} - {link.Data.ToString("dd/MM/yyyy")}");
            Console.WriteLine($"Obtendo {categoria} {tipo} - {Company.RazaoSocial} - {link.Data.ToString("dd/MM/yyyy")}");

            bool shouldExtract = true;
            // se não existir o arquivo ou
            // se o arquivo existir mas a data de entrega do arquivo for menor que a data do arquivo
            var fileinfo = new FileInfo(Company.GetFinDataFileName(link, categoria, tipo));

            log.Info($"Verificando se é necessário extrair {categoria} {tipo}");
            Console.WriteLine($"Verificando se é necessário extrair {categoria} {tipo}");
            if (fileinfo.Exists && fileinfo.LastWriteTime > link.DataApresentacao)
            {
                shouldExtract = false;
            }

            if (!shouldExtract)
            {
                Console.WriteLine($"Empresa {Company.RazaoSocial} não necessita extrair {link.DocType} {link.Data.ToString("dd/MM/yyyy")} -{categoria} {tipo}");
                log.Info($"Empresa {Company.RazaoSocial} não necessita extrair {link.DocType} {link.Data.ToString("dd/MM/yyyy")} - {categoria}{tipo}");
            }

            return(shouldExtract);
        }
Esempio n. 2
0
 public bool DoINeedToExtractAny(DocLinkInfo link)
 {
     // método usado para acelerar a extração
     if (DoINeedToExtract(link, FinInfoTipo.Individual, FinInfoCategoria.Ativo))
     {
         return(true);
     }
     if (DoINeedToExtract(link, FinInfoTipo.Individual, FinInfoCategoria.Passivo))
     {
         return(true);
     }
     if (DoINeedToExtract(link, FinInfoTipo.Individual, FinInfoCategoria.DRE))
     {
         return(true);
     }
     if (DoINeedToExtract(link, FinInfoTipo.Consolidado, FinInfoCategoria.Ativo))
     {
         return(true);
     }
     if (DoINeedToExtract(link, FinInfoTipo.Consolidado, FinInfoCategoria.Passivo))
     {
         return(true);
     }
     if (DoINeedToExtract(link, FinInfoTipo.Consolidado, FinInfoCategoria.DRE))
     {
         return(true);
     }
     if (DoINeedToExtractComposicaoCapital(link))
     {
         return(true);
     }
     return(false);
 }
Esempio n. 3
0
        public static string GetFinDataCapitalFileName(this ScrappedCompany c, DocLinkInfo link)
        {
            string date = link.Data.ToString("yyyyMMdd");
            string file = $"{c.CodigoCVM}.{link.DocType}.{date}.CapitalConsolidado.json";
            string path = Path.Combine($"{Program.FINDATA_DIR}", c.CodigoCVM.ToString());

            return(Path.Combine(path, file));
        }
Esempio n. 4
0
        public static string GetFinDataFileName(this ScrappedCompany c, DocLinkInfo link, FinInfoCategoria categoria, FinInfoTipo tipo)
        {
            string date = link.Data.ToString("yyyyMMdd");
            string file = $"{c.CodigoCVM}.{link.DocType}.{date}.{categoria}.{tipo}.json";
            string path = Path.Combine($"{Program.FINDATA_DIR}", c.CodigoCVM.ToString());

            return(Path.Combine(path, file));
        }
Esempio n. 5
0
        private async Task <string> GetAsync(DocLinkInfo link, string url)
        {
            IEnumerable <Cookie> cookies = null;

            // é necessário obter os cookies antes da chamada
            if (link.LinkType == DocLinkInfo.LinkTypeEnum.Bovespa)
            {
                if (CookiesBovespa == null)
                {
                    var tuple = await GetCookiesForBovespaAsync(link);

                    CookiesBovespa = tuple.Item1;
                }
                cookies = CookiesBovespa;
            }
            else //cvm
            {
                if (CookiesCvm == null)
                {
                    var tuple = await GetCookiesForCvmAsync(link);

                    CookiesCvm = tuple.Item1;
                }
                cookies = CookiesCvm;
            }

            var container = new CookieContainer();
            var handler   = new HttpClientHandler();

            handler.CookieContainer = container;
            var client = new HttpClient(handler);

            foreach (var cookie in cookies)
            {
                log.Info($"Cookie name: {cookie.Name}; value: {cookie.Value}");
                handler.CookieContainer.Add(new Uri(url), cookie);
            }

            if (link.LinkType == DocLinkInfo.LinkTypeEnum.Bovespa)
            {
                // bovespa possui encoding "windows-1252"
                var encoding = Encoding.GetEncoding(1252);
                return(await client.GetStringWithRetryAsync(url, encoding));
            }

            return(await client.GetStringWithRetryAsync(url));
        }
Esempio n. 6
0
        public async Task ScrapComposicaoCapital(DocLinkInfo link)
        {
            if (!DoINeedToExtractComposicaoCapital(link))
            {
                return;
            }

            var fileinfo = new FileInfo(Company.GetFinDataCapitalFileName(link));

            var url = "";

            if (link.LinkType == DocLinkInfo.LinkTypeEnum.Bovespa)
            {
                url = "http://www2.bmfbovespa.com.br/dxw/FormDetalheDXWG1CompCapital.asp";
            }
            else //cvm
            {
                var codTipoDocumento = 0;
                if (link.DocType == DocInfoType.ITR)
                {
                    codTipoDocumento = 3;
                }
                if (link.DocType == DocInfoType.DFP)
                {
                    codTipoDocumento = 4;
                }
                url = $"https://www.rad.cvm.gov.br/ENETCONSULTA/frmDadosComposicaoCapitalITR.aspx?Grupo=&Quadro=&NomeTipoDocumento=&Titulo=&Empresa=&DataReferencia=&Versao=&CodTipoDocumento={codTipoDocumento}&NumeroSequencialDocumento={link.NumeroSequencialDocumento}&NumeroSequencialRegistroCvm={Company.CodigoCVM}&CodigoTipoInstituicao=2";
            }

            var content = await GetAsync(link, url);

            ComposicaoCapital capital = null;

            if (link.LinkType == DocLinkInfo.LinkTypeEnum.Bovespa)
            {
                capital = ParseComposicaoCapitalBovespa(content);
            }
            else //cvm
            {
                capital = ParseComposicaoCapitalCvm(content);
            }

            capital.Save(fileinfo.FullName);
        }
Esempio n. 7
0
        private string GetBalancoAtivoUrl(DocLinkInfo link, FinInfoTipo tipo)
        {
            // deve primeiro acessar a url para obter os cookies
            var url = "";

            if (link.LinkType == DocLinkInfo.LinkTypeEnum.Bovespa)
            {
                // itr ou dfp - mesma url
                if (tipo == FinInfoTipo.Individual)
                {
                    url = "http://www2.bmfbovespa.com.br/dxw/FormDetalheDXWBalanco.asp?TipoInfo=C&Tipo=01 - Ativo";
                }
                else //consolidado
                {
                    url = "http://www2.bmfbovespa.com.br/dxw/FormDetalheDXWBalanco.asp?TipoInfo=T&Tipo=01%20-%20Ativo";
                }
            }
            else // cvm
            {
                var codTipoDocumento = 0;
                if (link.DocType == DocInfoType.ITR)
                {
                    codTipoDocumento = 3;
                }
                if (link.DocType == DocInfoType.DFP)
                {
                    codTipoDocumento = 4;
                }
                // o numero sequencial diz se o documento é itr ou dfp
                if (tipo == FinInfoTipo.Individual)
                {
                    url = $"https://www.rad.cvm.gov.br/ENETCONSULTA/frmDemonstracaoFinanceiraITR.aspx?Informacao=1&Demonstracao=2&Periodo=0&Grupo=&Quadro=&NomeTipoDocumento=&Titulo=&Empresa=&DataReferencia=&Versao=&CodTipoDocumento={codTipoDocumento}&NumeroSequencialDocumento={link.NumeroSequencialDocumento}&NumeroSequencialRegistroCvm={Company.CodigoCVM}&CodigoTipoInstituicao=2";
                }
                else
                {
                    url = $"https://www.rad.cvm.gov.br/ENETCONSULTA/frmDemonstracaoFinanceiraITR.aspx?Informacao=2&Demonstracao=2&Periodo=0&Grupo=&Quadro=&NomeTipoDocumento=&Titulo=&Empresa=&DataReferencia=&Versao=&CodTipoDocumento={codTipoDocumento}&NumeroSequencialDocumento={link.NumeroSequencialDocumento}&NumeroSequencialRegistroCvm={Company.CodigoCVM}&CodigoTipoInstituicao=2";
                }
            }

            return(url);
        }
Esempio n. 8
0
        private bool DoINeedToExtractComposicaoCapital(DocLinkInfo link)
        {
            log.Info($"Obtendo Composição de Capital - {Company.RazaoSocial} - {link.Data.ToString("dd/MM/yyyy")}");

            bool shouldExtract = true;
            // se não existir o arquivo ou
            // se o arquivo existir mas a data de entrega do arquivo for menor que a data do arquivo
            var fileinfo = new FileInfo(Company.GetFinDataCapitalFileName(link));

            log.Info("Verificando se é necessário extrair Composição do Capital");
            if (fileinfo.Exists && fileinfo.LastWriteTime > link.DataApresentacao)
            {
                shouldExtract = false;
            }

            if (!shouldExtract)
            {
                Console.WriteLine($"Empresa {Company.RazaoSocial} não necessita extrair {link.DocType} {link.Data.ToString("dd/MM/yyyy")} - Capital Consolidado");
                log.Info($"Empresa {Company.RazaoSocial} não necessita extrair {link.DocType} {link.Data.ToString("dd/MM/yyyy")} - Capital Consolidado");
            }
            return(shouldExtract);
        }
Esempio n. 9
0
        private string GetDREUrl(DocLinkInfo link, FinInfoTipo tipo)
        {
            var url = "";

            if (link.LinkType == DocLinkInfo.LinkTypeEnum.Bovespa)
            {
                // itr e dfp tem a mesma url
                if (tipo == FinInfoTipo.Individual)
                {
                    url = "http://www2.bmfbovespa.com.br/dxw/FormDetalheDXWDRE.asp?TipoInfo=C";
                }
                else
                {
                    url = "http://www2.bmfbovespa.com.br/dxw/FormDetalheDXWDRE.asp?TipoInfo=T";
                }
            }
            else //cvm
            {
                var codTipoDocumento = 0;
                if (link.DocType == DocInfoType.ITR)
                {
                    codTipoDocumento = 3;
                }
                if (link.DocType == DocInfoType.DFP)
                {
                    codTipoDocumento = 4;
                }

                if (tipo == FinInfoTipo.Individual)
                {
                    url = $"https://www.rad.cvm.gov.br/ENETCONSULTA/frmDemonstracaoFinanceiraITR.aspx?Informacao=1&Demonstracao=4&Periodo=0&Grupo=&Quadro=&NomeTipoDocumento=&Titulo=&Empresa=&DataReferencia=&Versao=&CodTipoDocumento={codTipoDocumento}&NumeroSequencialDocumento={link.NumeroSequencialDocumento}&NumeroSequencialRegistroCvm={Company.CodigoCVM}&CodigoTipoInstituicao=2";
                }
                else
                {
                    url = $"https://www.rad.cvm.gov.br/ENETCONSULTA/frmDemonstracaoFinanceiraITR.aspx?Informacao=2&Demonstracao=4&Periodo=0&Grupo=&Quadro=&NomeTipoDocumento=&Titulo=&Empresa=&DataReferencia=&Versao=&CodTipoDocumento={codTipoDocumento}&NumeroSequencialDocumento={link.NumeroSequencialDocumento}&NumeroSequencialRegistroCvm={Company.CodigoCVM}&CodigoTipoInstituicao=2";
                }
            }
            return(url);
        }
Esempio n. 10
0
        public async Task ScrapDoc(DocLinkInfo link, FinInfoTipo tipo, FinInfoCategoria categoria)
        {
            if (!DoINeedToExtract(link, tipo, categoria))
            {
                return;
            }

            var fileinfo = new FileInfo(Company.GetFinDataFileName(link, categoria, tipo));


            var url = "";

            if (categoria == FinInfoCategoria.Ativo)
            {
                url = GetBalancoAtivoUrl(link, tipo);
            }
            if (categoria == FinInfoCategoria.Passivo)
            {
                url = GetBalancoPassivoUrl(link, tipo);
            }
            if (categoria == FinInfoCategoria.DRE)
            {
                url = GetDREUrl(link, tipo);
            }

            var content = await GetAsync(link, url);

            var fininfo = ParseFinInfo(content, link.LinkType, categoria, tipo);

            if (fininfo == null)
            {
                Console.WriteLine($"Empresa {Company.RazaoSocial} não possui dado {link.DocType} {link.Data.ToString("dd/MM/yyyy")} -{categoria} {tipo}");
                log.Info($"Empresa {Company.RazaoSocial} não possui dado {link.DocType} {link.Data.ToString("dd/MM/yyyy")} -{categoria} {tipo}");
                return;
            }

            fininfo.Save(fileinfo.FullName);
        }
Esempio n. 11
0
        private async Task <Tuple <IEnumerable <Cookie>, HttpContent> > GetCookiesForCvmAsync(DocLinkInfo info)
        {
            var url = "http://www.rad.cvm.gov.br/ENETCONSULTA/frmGerenciaPaginaFRE.aspx?NumeroSequencialDocumento=65179&CodigoTipoInstituicao=2";

            log.Info($"Acessando url para obtenção dos cookies");
            log.Info($"url = {url}");

            var container = new CookieContainer();
            var handler   = new HttpClientHandler();

            handler.CookieContainer = container;

            var client   = new HttpClient(handler);
            var response = await client.GetAsync(url);

            var cookies = container.GetCookies(new Uri(url)).Cast <Cookie>().ToList();

            var result = Tuple.Create <IEnumerable <Cookie>, HttpContent>(cookies, response.Content);

            return(await Task.FromResult(result));
        }
Esempio n. 12
0
        private async Task <Tuple <IEnumerable <Cookie>, HttpContent> > GetCookiesForBovespaAsync(DocLinkInfo info)
        {
            // codificar para url
            var razao  = WebUtility.UrlEncode(Company.RazaoSocial);
            var pregao = WebUtility.UrlEncode(Company.NomePregao);
            var data   = info.Data.ToString("dd/MM/yyyy");

            int tipo = 0;

            if (info.DocType == DocInfoType.ITR)
            {
                tipo = 4;
            }
            if (info.DocType == DocInfoType.DFP)
            {
                tipo = 2;
            }

            var url = $"http://www2.bmfbovespa.com.br/dxw/FrDXW.asp?site=B&mercado=18&razao={razao}&pregao={pregao}&ccvm={Company.CodigoCVM}&data={data}&tipo={tipo}";

            log.Info($"Acessando url para obtenção dos cookies");
            log.Info($"url = {url}");

            var container = new CookieContainer();
            var handler   = new HttpClientHandler();

            handler.CookieContainer = container;

            var client   = new HttpClient(handler);
            var response = await client.GetAsync(url);

            var cookies = container.GetCookies(new Uri(url)).Cast <Cookie>().ToList();

            var result = Tuple.Create <IEnumerable <Cookie>, HttpContent>(cookies, response.Content);

            return(await Task.FromResult(result));
        }
Esempio n. 13
0
        public async Task <AvailableDocs> GetAvailableDocs(DocLinkInfo link)
        {
            // esse método obtem os documentos disponíveis
            // isso é para saber se existem as DFs Consolidadas ou somente as individuais

            // Esse método aproveita a chamada e armazena os cookies

            var availableDocs = new AvailableDocs();

            string contentstring = "";

            if (link.LinkType == DocLinkInfo.LinkTypeEnum.Bovespa)
            {
                var tuple = await GetCookiesForBovespaAsync(link);

                CookiesBovespa = tuple.Item1;
                // docs disponiveis
                var url = "http://www2.bmfbovespa.com.br/dxw/DXWMenuBotoes.asp";
                contentstring = await GetAsync(link, url);
            }
            else //cvm
            {
                var tuple = await GetCookiesForCvmAsync(link);

                CookiesCvm = tuple.Item1;

                // docs disponiveis
                contentstring = await tuple.Item2.ReadAsStringAsync();
            }

            HtmlParser parser = new HtmlParser();
            var        doc    = parser.Parse(contentstring);

            if (link.LinkType == DocLinkInfo.LinkTypeEnum.Bovespa)
            {
                var map          = doc.QuerySelector("map");
                var consolidados = map.Children.Where(c => c.GetAttribute("alt").Contains("Consolidado"));

                foreach (var item in consolidados.Where(i => i.GetAttribute("alt").Contains("Balanço Patrimonial Consolidado")))
                {
                    var href = item.GetAttribute("href");
                    if (href.Contains("Não Apresentado"))
                    {
                        availableDocs.AtivoConsolidado   = false;
                        availableDocs.PassivoConsolidado = false;
                        availableDocs.DREConsolidado     = false;
                        Console.WriteLine($"Empresa não possui consolidados de {link.Data.ToString("dd/MM/yyyy")}");
                    }
                }
            }
            else
            {
                var divs = doc.QuerySelectorAll("div.ComboBoxItem_CVM");

                // se não tem nenhum div com o texto Consolidado/a
                if (!divs.Any(d => d.TextContent.Contains("Consolidad")))
                {
                    availableDocs.AtivoConsolidado   = false;
                    availableDocs.PassivoConsolidado = false;
                    availableDocs.DREConsolidado     = false;
                    Console.WriteLine($"Empresa não possui consolidados de {link.Data.ToString("dd/MM/yyyy")}");
                }
            }

            return(availableDocs);
        }