Beispiel #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);
        }
Beispiel #2
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);
        }
        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));
        }
Beispiel #4
0
        private FinancialInfo ParseFinInfo(string content, DocLinkInfo.LinkTypeEnum linktype, FinInfoCategoria categoria, FinInfoTipo tipo)
        {
            var parser = new HtmlParser();
            var doc    = parser.Parse(content);

            FinancialInfo finInfo = new FinancialInfo();

            finInfo.Categoria = categoria;
            finInfo.Tipo      = tipo;


            IHtmlTableElement table = null;

            if (linktype == DocLinkInfo.LinkTypeEnum.Bovespa)
            {
                var div = doc.QuerySelector("div.ScrollMaker");

                if (div == null)
                {
                    var scripts = doc.QuerySelectorAll("script");
                    if (scripts.Any(s => s.TextContent.Contains("Não Possui Dados para Carregar a Página")))
                    {
                        // dado não existe
                        return(null);
                    }
                }

                table = div.FirstElementChild as IHtmlTableElement;
                //table anterior a table é a linha que contém o multiplicador
                var multiplierText = div.PreviousElementSibling.TextContent;
                if (multiplierText.Contains("Mil"))
                {
                    finInfo.Multiplicador = 1000;
                }
            }
            else //cvm
            {
                var title = doc.QuerySelector("#TituloTabelaSemBorda");
                if (title.TextContent.Contains("Reais Mil"))
                {
                    finInfo.Multiplicador = 1000;
                }

                table = title.NextElementSibling as IHtmlTableElement;

                if (table.InnerHtml.Contains("Justificativa para a não prestação da informação"))
                {
                    // dado não existe
                    return(null);
                }
            }

            foreach (var row in table.Rows)
            {
                bool isTopLine = false;
                if (linktype == DocLinkInfo.LinkTypeEnum.Bovespa)
                {
                    isTopLine = row.GetAttribute("valign") == "top";
                }
                else
                {
                    isTopLine = row.Cells[0].TextContent.Trim() == "Conta";
                }

                if (isTopLine) // linha de título
                {
                    // pega a data da terceira célula
                    // Valor do Trimestre Atual 01/04/2009 a 30/06/2009
                    var text       = row.Cells[2].TextContent;
                    var iUltimoNum = text.LastIndexOfNum();
                    var start      = iUltimoNum - 9;
                    var datetext   = text.Substring(start, 10).Trim();
                    finInfo.Data = DateTime.ParseExact(datetext, "dd/MM/yyyy", new CultureInfo("pt-BR"));
                }
                else
                {
                    var           codconta  = row.Cells[0].TextContent;
                    var           nomeconta = row.Cells[1].TextContent;
                    var           valortext = row.Cells[2].TextContent;
                    FinancialItem item      = new FinancialItem();
                    item.Conta = codconta.Trim();
                    item.Nome  = nomeconta.Trim();
                    item.Valor = ParseValor(valortext.Trim());
                    finInfo.Items.Add(item);
                }
            }

            return(finInfo);
        }