From 7d8aff19827a7804160cd4358192410942190283 Mon Sep 17 00:00:00 2001 From: Adriano Serighelli Date: Wed, 19 Nov 2025 15:12:51 -0300 Subject: [PATCH] Add ICalendarioService interface and implement CalendarioService for event retrieval --- Application/ICalendarioService.cs | 7 +++ Infrastructure/CalendarioService.cs | 84 +++++++++++++++++++++++++++++ Presentation/Program.cs | 12 +++-- 3 files changed, 99 insertions(+), 4 deletions(-) create mode 100644 Application/ICalendarioService.cs create mode 100644 Infrastructure/CalendarioService.cs diff --git a/Application/ICalendarioService.cs b/Application/ICalendarioService.cs new file mode 100644 index 0000000..4ee1fc4 --- /dev/null +++ b/Application/ICalendarioService.cs @@ -0,0 +1,7 @@ +namespace Application +{ + public interface ICalendarioService + { + Task ObterEventoLimiteColetaAsync(DateTime dataReferencia, CancellationToken ct = default); + } +} \ No newline at end of file diff --git a/Infrastructure/CalendarioService.cs b/Infrastructure/CalendarioService.cs new file mode 100644 index 0000000..5fd5bb9 --- /dev/null +++ b/Infrastructure/CalendarioService.cs @@ -0,0 +1,84 @@ +using System.Text.Json; +using System.Globalization; +using Application; + +namespace Infrastructure +{ + public class CalendarioService : ICalendarioService + { + private const string Url = "https://www.ccee.org.br/en/web/guest/calendario?p_p_id=com_liferay_calendar_web_portlet_CalendarPortlet_INSTANCE_urjn&p_p_lifecycle=2&p_p_cacheability=cacheLevelPage&doAsUserId=&p_p_resource_id=calendarBookings"; + + public async Task ObterEventoLimiteColetaAsync(DateTime dataReferencia, CancellationToken ct = default) + { + var year = dataReferencia.Year; + var month = dataReferencia.Month - 1; + var dayFinal = DateTime.DaysInMonth(year, month + 1); + + var values = new Dictionary + { + ["_com_liferay_calendar_web_portlet_CalendarPortlet_INSTANCE_urjn_calendarIds"] = "55985", + ["_com_liferay_calendar_web_portlet_CalendarPortlet_INSTANCE_urjn_endTimeDay"] = dayFinal.ToString(), + ["_com_liferay_calendar_web_portlet_CalendarPortlet_INSTANCE_urjn_endTimeHour"] = "23", + ["_com_liferay_calendar_web_portlet_CalendarPortlet_INSTANCE_urjn_endTimeMinute"] = "59", + ["_com_liferay_calendar_web_portlet_CalendarPortlet_INSTANCE_urjn_endTimeMonth"] = month.ToString(), + ["_com_liferay_calendar_web_portlet_CalendarPortlet_INSTANCE_urjn_endTimeYear"] = year.ToString(), + ["_com_liferay_calendar_web_portlet_CalendarPortlet_INSTANCE_urjn_eventsPerPage"] = "-1", + ["_com_liferay_calendar_web_portlet_CalendarPortlet_INSTANCE_urjn_startTimeDay"] = "1", + ["_com_liferay_calendar_web_portlet_CalendarPortlet_INSTANCE_urjn_startTimeHour"] = "0", + ["_com_liferay_calendar_web_portlet_CalendarPortlet_INSTANCE_urjn_startTimeMinute"] = "0", + ["_com_liferay_calendar_web_portlet_CalendarPortlet_INSTANCE_urjn_startTimeMonth"] = month.ToString(), + ["_com_liferay_calendar_web_portlet_CalendarPortlet_INSTANCE_urjn_startTimeYear"] = year.ToString(), + }; + + try + { + using var client = new HttpClient(); + using var content = new FormUrlEncodedContent(values); + var resp = await client.PostAsync(Url, content, ct); + var resposta = await resp.Content.ReadAsStringAsync(ct); + + var alvo = $"Data limite para coleta diária dos dados de medição no SCDE"; + + try + { + using var doc = JsonDocument.Parse(resposta); + string? found = null; + void SearchJson(JsonElement el) + { + if (found != null) return; + switch (el.ValueKind) + { + case JsonValueKind.String: + var s = el.GetString() ?? ""; + if (s.Contains(alvo, StringComparison.OrdinalIgnoreCase)) found = s; + break; + case JsonValueKind.Object: + foreach (var prop in el.EnumerateObject()) SearchJson(prop.Value); + break; + case JsonValueKind.Array: + foreach (var item in el.EnumerateArray()) SearchJson(item); + break; + } + } + SearchJson(doc.RootElement); + if (found != null) return found; + } + catch { } + + var idx = resposta.IndexOf(alvo, StringComparison.OrdinalIgnoreCase); + if (idx >= 0) + { + var start = Math.Max(0, idx - 60); + var len = Math.Min(400, resposta.Length - start); + return resposta.Substring(start, len).Replace("\r", " ").Replace("\n", " "); + } + + return null; + } + catch + { + return null; + } + } + } +} \ No newline at end of file diff --git a/Presentation/Program.cs b/Presentation/Program.cs index 11393a0..bf068ca 100644 --- a/Presentation/Program.cs +++ b/Presentation/Program.cs @@ -10,11 +10,15 @@ class Program // string PG_CONN_STRING_PROD = "Server = 192.168.10.248; Port = 5432; Database = smartenergiadev; Username = postgres; Password = gds21; Timeout = 60; CommandTimeout = 60; ApplicationName = new_med_5_min; Connection Lifetime = 120; Minimum Pool Size = 2; Maximum Pool Size = 4;"; string ACCESS_CONN_STRING = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\\srv-dados\documentos\Middle\Informativo Setorial\Modelo Word\BD1_dados cadastrais e faturas.accdb;Jet OLEDB:Database Password=gds21"; string caminhoLog = $@"\\srv-dados\documentos\Back\Carteira x.x\Codigo\Erros\log_erros_{inicio:MM_dd_HH_mm}.csv"; - //DateTime dataIni = new DateTime(inicio.Year, inicio.Month, 1); - //DateTime dataFim = new DateTime(inicio.Year, inicio.Month, inicio.Day); + //agosto finalizado - DateTime dataIni = new DateTime(inicio.Year, 09, 01); - DateTime dataFim = new DateTime(inicio.Year, 10, 01); + DateTime dataIni = new DateTime(inicio.Year, 11, 01); + // var a = dataFim == DateTime.Today; + DateTime dataFim = inicio.Date; + + var calendarioService = new CalendarioService(); + var evento = await calendarioService.ObterEventoLimiteColetaAsync(inicio, CancellationToken.None); + Console.WriteLine(evento != null ? $"Evento encontrado: {evento}" : "Evento não encontrado no calendário."); // Configuração de dependências (pode usar um container DI depois) var postgresRepo = new PostgresRepository(PG_CONN_STRING_PROD);