Skip to content

Commit

Permalink
Add CEAP do Rio grande do sul, Sergipe e Tocantins
Browse files Browse the repository at this point in the history
  • Loading branch information
VanderleiDenir committed Jul 11, 2024
1 parent 6f4e06d commit 6aacb23
Show file tree
Hide file tree
Showing 16 changed files with 771 additions and 51 deletions.
4 changes: 4 additions & 0 deletions OPS.Core/Entity/DeputadoEstadual.cs
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,10 @@ public class DeputadoEstadual
[Column("youtube")]
public string YouTube { get; set; }

[NotMapped]
[Column("tiktok")]
public string Tiktok { get; set; }

[Column("perfil")]
public string UrlPerfil { get; set; }

Expand Down
10 changes: 10 additions & 0 deletions OPS.Core/Utilities/Utils.cs
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,11 @@ public static string RemoveCaracteresNaoNumericos(string str)
return Regex.Replace(str ?? "", @"[^\d]", "");
}

public static string RemoveCaracteresNumericos(string str)
{
return Regex.Replace(str ?? "", @"[\d]", "");
}

public static string MySqlEscapeNumberToIn(string str)
{
return Regex.Replace(str, @"[^\d,]", "");
Expand Down Expand Up @@ -305,6 +310,11 @@ public static String ReduceWhitespace(this string text)
return Regex.Replace(text, @"\s+", " ");
}

public static string RemoveSpaces(this string value)
{
return Regex.Replace(value, @"\s+", " ");
}

//public static string GetIPAddress()
//{
// System.Web.HttpContext context = System.Web.HttpContext.Current;
Expand Down
3 changes: 3 additions & 0 deletions OPS.Importador/ALE/Acre.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@ public Acre(IServiceProvider serviceProvider) : base(serviceProvider)
}
}

/// <summary>
/// http://app.al.ac.leg.br/financa/verba-indenizatoria
/// </summary>
public class ImportadorDespesasAcre : ImportadorDespesasRestApiAnual
{
public ImportadorDespesasAcre(IServiceProvider serviceProvider) : base(serviceProvider)
Expand Down
2 changes: 1 addition & 1 deletion OPS.Importador/ALE/Ceara.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ public ImportadorDespesasCeara(IServiceProvider serviceProvider) : base(serviceP

/// <summary>
/// Arquivos disponiveis anualmente a partir de 2021
/// https://transparencia.al.ce.gov.br/index.php/despesas/verba-de-desempenho-parlamentar
/// https://transparencia.al.ce.gov.br/index.php/despesas/despesas-alece/verba-de-desempenho-parlamentar
/// </summary>
/// <param name="ano"></param>
/// <returns></returns>
Expand Down
13 changes: 10 additions & 3 deletions OPS.Importador/ALE/Despesa/ImportadorDespesasBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -399,10 +399,11 @@ public virtual void ValidaImportacao(int ano)
{
logger.LogTrace("Validar importação");

int totalFinal = ContarRegistrosBaseDeDados(ano);
int totalFinal = ContarRegistrosBaseDeDadosFinal(ano);
int totalTemp = ContarRegistrosBaseDeDadosTemp(ano);

if (linhasProcessadasAno != totalFinal)
logger.LogError("Totais divergentes! Arquivo: {LinhasArquivo} DB: {LinhasDB}", linhasProcessadasAno, totalFinal);
logger.LogError("Totais divergentes! Arquivo: {LinhasArquivo} Temp: {totalTemp} DB: {LinhasDB}", linhasProcessadasAno, totalFinal);
else
{
logger.LogInformation("Itens na base de dados: {LinhasDB}", totalFinal);
Expand All @@ -428,7 +429,7 @@ FROM ops_tmp.cl_despesa_temp d
}
}

public virtual int ContarRegistrosBaseDeDados(int ano)
public virtual int ContarRegistrosBaseDeDadosFinal(int ano)
{
return connection.ExecuteScalar<int>(@$"
select count(1)
Expand All @@ -438,6 +439,12 @@ from cl_despesa d
and d.ano_mes between {ano}01 and {ano}12");
}

public virtual int ContarRegistrosBaseDeDadosTemp(int ano)
{
return connection.ExecuteScalar<int>(@$"
select count(1) from ops_tmp.cl_despesa_temp");
}

public virtual void LimpaDespesaTemporaria()
{
connection.Execute("truncate table ops_tmp.cl_despesa_temp");
Expand Down
4 changes: 3 additions & 1 deletion OPS.Importador/ALE/EspiritoSanto.cs
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,9 @@ public override DeputadoEstadual ColetarDadosLista(IElement item)

public override void ColetarDadosPerfil(DeputadoEstadual deputado, IDocument subDocument)
{
var dados = subDocument.QuerySelectorAll(".fonte-dados-deputado>div").Select(x => new { Key = x.QuerySelector("label").TextContent.Trim(), Value = x.QuerySelector("span").TextContent.Trim() });
var dados = subDocument
.QuerySelectorAll(".fonte-dados-deputado>div")
.Select(x => new { Key = x.QuerySelector("label").TextContent.Trim(), Value = x.QuerySelector("span").TextContent.Trim() });

deputado.IdPartido = BuscarIdPartido(dados.First(x => x.Key == "Partido:").Value);

Expand Down
20 changes: 12 additions & 8 deletions OPS.Importador/ALE/Parlamentar/ImportadorParlamentarCrawler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,14 +42,17 @@ public override async Task Importar()
DeputadoEstadual deputado = ColetarDadosLista(parlamentar);
if (deputado == null) continue;

ArgumentException.ThrowIfNullOrEmpty(deputado.UrlPerfil, nameof(deputado.UrlPerfil));
var subDocument = await context.OpenAsync(deputado.UrlPerfil);
if (document.StatusCode != HttpStatusCode.OK)
if (config.ColetaDadosDoPerfil)
{
logger.LogError("Erro ao consultar deputado: {NomeDeputado} {StatusCode}", deputado.UrlPerfil, subDocument.StatusCode);
continue;
};
ColetarDadosPerfil(deputado, subDocument);
ArgumentException.ThrowIfNullOrEmpty(deputado.UrlPerfil, nameof(deputado.UrlPerfil));
var subDocument = await context.OpenAsync(deputado.UrlPerfil);
if (document.StatusCode != HttpStatusCode.OK)
{
logger.LogError("Erro ao consultar deputado: {NomeDeputado} {StatusCode}", deputado.UrlPerfil, subDocument.StatusCode);
continue;
};
ColetarDadosPerfil(deputado, subDocument);
}

InsertOrUpdate(deputado);
}
Expand All @@ -61,9 +64,10 @@ public override async Task Importar()

public abstract void ColetarDadosPerfil(DeputadoEstadual deputado, IDocument subDocument);


public class ImportadorParlamentarCrawlerConfig : ImportadorParlamentarConfig
{
public string SeletorListaParlamentares { get; set; }

public bool ColetaDadosDoPerfil { get; set; } = true;
}
}
2 changes: 1 addition & 1 deletion OPS.Importador/ALE/Piaui.cs
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ public override string SqlCarregarHashes(int ano)
return $"select d.id, d.hash from cl_despesa d join cl_deputado p on d.id_cl_deputado = p.id where p.id_estado = {idEstado} and d.ano_mes between {ano}01 and {ano+4}12";
}

public override int ContarRegistrosBaseDeDados(int ano)
public override int ContarRegistrosBaseDeDadosFinal(int ano)
{
return connection.ExecuteScalar<int>(@$"
select count(1)
Expand Down
2 changes: 1 addition & 1 deletion OPS.Importador/ALE/RioDeJaneiro.cs
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ public override string SqlCarregarHashes(int ano)
return $"select d.id, d.hash from cl_despesa d join cl_deputado p on d.id_cl_deputado = p.id where p.id_estado = {idEstado} and d.ano_mes between {ano}01 and {ano + 4}12";
}

public override int ContarRegistrosBaseDeDados(int ano)
public override int ContarRegistrosBaseDeDadosFinal(int ano)
{
return connection.ExecuteScalar<int>(@$"
select count(1)
Expand Down
2 changes: 1 addition & 1 deletion OPS.Importador/ALE/RioGrandeDoNorte.cs
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ private void ImportarDespesasArquivo(int ano, int mes, IHtmlOptionElement gabine

var paginasPdf = ImportacaoUtils.ReadPdfFile(filename).ToArray();
decimal valorTotal = 0;
if (paginasPdf.Count() > 2) Console.WriteLine("teste");
//if (paginasPdf.Count() > 2) Console.WriteLine("teste");

try
{
Expand Down
113 changes: 106 additions & 7 deletions OPS.Importador/ALE/RioGrandeDoSul.cs
Original file line number Diff line number Diff line change
@@ -1,13 +1,19 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Text.Json.Serialization;
using System.Threading;
using System.Threading.Tasks;
using AngleSharp;
using AngleSharp.Dom;
using AngleSharp.Html.Dom;
using Microsoft.Extensions.Logging;
using OPS.Core;
using OPS.Core.Entity;
using OPS.Core.Enum;
using OPS.Importador.ALE.Despesa;
using OPS.Importador.ALE.Parlamentar;
using OPS.Importador.Utilities;

namespace OPS.Importador.ALE;

Expand All @@ -18,26 +24,119 @@ public class RioGrandeDoSul : ImportadorBase
{
public RioGrandeDoSul(IServiceProvider serviceProvider) : base(serviceProvider)
{
//importadorParlamentar = new ImportadorParlamentarRioGrandeDoSul(serviceProvider);
//importadorDespesas = new ImportadorDespesasRioGrandeDoSul(serviceProvider);
importadorParlamentar = new ImportadorParlamentarRioGrandeDoSul(serviceProvider);
importadorDespesas = new ImportadorDespesasRioGrandeDoSul(serviceProvider);
}
}

public class ImportadorDespesasRioGrandeDoSul : ImportadorDespesasRestApiAnual
public class ImportadorDespesasRioGrandeDoSul : ImportadorDespesasRestApiMensal
{
private CultureInfo cultureInfo = CultureInfo.CreateSpecificCulture("pt-BR");

public ImportadorDespesasRioGrandeDoSul(IServiceProvider serviceProvider) : base(serviceProvider)
{
config = new ImportadorCotaParlamentarBaseConfig()
{
BaseAddress = "",
BaseAddress = "https://www2.al.rs.gov.br/transparenciaalrs/GabinetesParlamentares/Centrodecustos/tabid/5666/Default.aspx",
Estado = Estado.RioGrandeDoSul,
ChaveImportacao = ChaveDespesaTemp.Indefinido
ChaveImportacao = ChaveDespesaTemp.Nome
};
}

public override void ImportarDespesas(IBrowsingContext context, int ano)
public override void ImportarDespesas(IBrowsingContext context, int ano, int mes)
{
throw new NotImplementedException();
var document = context.OpenAsyncAutoRetry(config.BaseAddress).GetAwaiter().GetResult();
IHtmlFormElement form = document.QuerySelector<IHtmlFormElement>("form");

var dcForm = new Dictionary<string, string>();
try
{
if (ano.ToString() != document.QuerySelector<IHtmlSelectElement>("#dnn_ctr9625_ViewalrsTranspRelatorioGastos_ddlAno").Value)
{
dcForm.Add("dnn$ctr9625$ViewalrsTranspRelatorioGastos$ddlAno", ano.ToString());
dcForm.Add("__EVENTTARGET", "dnn$ctr9625$ViewalrsTranspRelatorioGastos$ddlAno");
document = form.SubmitAsync(dcForm, true).GetAwaiter().GetResult();
form = document.QuerySelector<IHtmlFormElement>("form");
}

if (mes.ToString() != document.QuerySelector<IHtmlSelectElement>("#dnn_ctr9625_ViewalrsTranspRelatorioGastos_ddlMes").Value)
{
dcForm = new Dictionary<string, string>();
dcForm.Add("dnn$ctr9625$ViewalrsTranspRelatorioGastos$ddlMes", mes.ToString());
dcForm.Add("__EVENTTARGET", "dnn$ctr9625$ViewalrsTranspRelatorioGastos$ddlMes");
document = form.SubmitAsync(dcForm, true).GetAwaiter().GetResult();
form = document.QuerySelector<IHtmlFormElement>("form");
}
}
catch (Exception)
{
logger.LogError(document.QuerySelector("#dnn_ctr9625_ctl00_lblMessage").TextContent);
return;
}

// Temos de remover o elemento para recria-lo como input e poder ser submetido.
document.QuerySelector<IHtmlInputElement>("#dnn_ctr9625_ViewalrsTranspRelatorioGastos_btnPesquisar")?.Remove();

var deputados = (document.QuerySelector("#dnn_ctr9625_ViewalrsTranspRelatorioGastos_ddlGabinete") as IHtmlSelectElement);
foreach (var deputado in deputados.Options)
{
while (true)
{
try
{
ConsultarDespesasDeputado(deputado, form, ano, mes);

break;
}
catch (Exception)
{
Thread.Sleep(TimeSpan.FromMinutes(1));
}
}
}
}

private void ConsultarDespesasDeputado(IHtmlOptionElement deputado, IHtmlFormElement form, int ano, int mes)
{
if (deputado.Value == "0") return;

var dcForm = new Dictionary<string, string>();
dcForm.Add("dnn$ctr9625$ViewalrsTranspRelatorioGastos$ddlGabinete", deputado.Value);
dcForm.Add("dnn$ctr9625$ViewalrsTranspRelatorioGastos$btnPesquisar", "Pesquisar");
var subDocument = form.SubmitAsync(dcForm, true).GetAwaiter().GetResult();

var nomeParlamentar = deputado.Text.Replace("Gabinete Dep.", "").Replace("55", "").Trim();
var elError = subDocument.QuerySelector("#dnn_ctl01_lblMessage");
if (elError != null)
{
logger.LogError($"Deputado {nomeParlamentar}; {elError.TextContent}");
throw new BusinessException($"Deputado {nomeParlamentar}; {elError.TextContent}");
}

var periodoPesquisa = subDocument.QuerySelector("#dnn_ctr9625_ViewalrsTranspRelatorioGastos_lblResponsavelReferencia").TextContent;
var valorDespesasMes = subDocument.QuerySelector(".lbldespesa").TextContent.Replace("-R$ ", "");
logger.LogInformation($"Deputado {nomeParlamentar}; Periodo: {periodoPesquisa}; Despesas: {valorDespesasMes};");

var despesas = subDocument.QuerySelectorAll<IHtmlTableRowElement>(".grdvwgastosinterno tr");
foreach (var item in despesas)
{
if (item.Cells[1].TextContent == "Valor") continue;

var despesaTemp = new CamaraEstadualDespesaTemp()
{
Nome = nomeParlamentar,
Cpf = deputado.Value,
Ano = (short)ano,
Mes = (short)mes,
TipoDespesa = item.Cells[0].TextContent,
Valor = Math.Abs(Convert.ToDecimal(item.Cells[1].TextContent.Replace("R$ ", ""), cultureInfo)),
DataEmissao = new DateTime(ano, mes, 1)
};

if (despesaTemp.Valor == 0) continue;

InserirDespesaTemp(despesaTemp);
}
}
}

Expand Down
Loading

0 comments on commit 6aacb23

Please sign in to comment.