From 2371d0fff8c6afe55248e86616ef3ee93eb43514 Mon Sep 17 00:00:00 2001 From: Eduardo Lopes <155753879+eduardolopesx03@users.noreply.github.com> Date: Mon, 2 Feb 2026 11:06:44 -0300 Subject: [PATCH] =?UTF-8?q?Corrigir=20classifica=C3=A7=C3=A3o=20de=20notif?= =?UTF-8?q?ica=C3=A7=C3=B5es=20vencidas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../VigenciaNotificationBackgroundService.cs | 91 +++++++++++++++++++ 1 file changed, 91 insertions(+) diff --git a/Services/VigenciaNotificationBackgroundService.cs b/Services/VigenciaNotificationBackgroundService.cs index d97ff91..69c281a 100644 --- a/Services/VigenciaNotificationBackgroundService.cs +++ b/Services/VigenciaNotificationBackgroundService.cs @@ -119,6 +119,11 @@ public class VigenciaNotificationBackgroundService : BackgroundService .Where(v => v.DtTerminoFidelizacao != null) .ToListAsync(stoppingToken); + if (vigencias.Count > 0) + { + await CleanupOutdatedNotificationsAsync(db, vigencias, reminderDays, today, stoppingToken); + } + var candidates = new List(); foreach (var vigencia in vigencias) { @@ -223,6 +228,92 @@ public class VigenciaNotificationBackgroundService : BackgroundService await db.SaveChangesAsync(stoppingToken); } + private static async Task CleanupOutdatedNotificationsAsync( + AppDbContext db, + IReadOnlyCollection vigencias, + IReadOnlyCollection reminderDays, + DateTime today, + CancellationToken stoppingToken) + { + var vigenciasById = vigencias.ToDictionary(v => v.Id, v => v); + var vigenciasByLinha = vigencias + .Where(v => !string.IsNullOrWhiteSpace(v.Linha)) + .GroupBy(v => v.Linha!) + .Select(g => g.OrderByDescending(v => v.UpdatedAt).First()) + .ToDictionary(v => v.Linha!, v => v); + + var existingNotifications = await db.Notifications.AsNoTracking() + .Where(n => n.Tipo == "Vencido" || n.Tipo == "AVencer") + .ToListAsync(stoppingToken); + + if (existingNotifications.Count == 0) + { + return; + } + + var idsToDelete = new List(); + foreach (var notification in existingNotifications) + { + var vigencia = ResolveVigencia(notification, vigenciasById, vigenciasByLinha); + if (vigencia?.DtTerminoFidelizacao is null) + { + continue; + } + + var endDate = vigencia.DtTerminoFidelizacao.Value.Date; + if (endDate < today) + { + if (notification.Tipo != "Vencido") + { + idsToDelete.Add(notification.Id); + } + + continue; + } + + var daysUntil = (endDate - today).Days; + if (notification.Tipo == "Vencido") + { + idsToDelete.Add(notification.Id); + continue; + } + + if (!reminderDays.Contains(daysUntil) || notification.DiasParaVencer != daysUntil) + { + idsToDelete.Add(notification.Id); + } + } + + if (idsToDelete.Count == 0) + { + return; + } + + await db.Notifications + .Where(n => idsToDelete.Contains(n.Id)) + .ExecuteDeleteAsync(stoppingToken); + } + + private static VigenciaLine? ResolveVigencia( + Notification notification, + IReadOnlyDictionary vigenciasById, + IReadOnlyDictionary vigenciasByLinha) + { + if (notification.VigenciaLineId.HasValue + && vigenciasById.TryGetValue(notification.VigenciaLineId.Value, out var byId)) + { + return byId; + } + + if (!string.IsNullOrWhiteSpace(notification.Linha) + && vigenciasByLinha.TryGetValue(notification.Linha, out var byLinha)) + { + return byLinha; + } + + return null; + } + private static Notification BuildNotification( string tipo, string titulo,