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); }
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)); }
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); }