diff --git a/Elecciones-Web/src/Elecciones.Worker/Worker.cs b/Elecciones-Web/src/Elecciones.Worker/Worker.cs index 6a67e38..8157e76 100644 --- a/Elecciones-Web/src/Elecciones.Worker/Worker.cs +++ b/Elecciones-Web/src/Elecciones.Worker/Worker.cs @@ -432,6 +432,10 @@ public class Worker : BackgroundService /// 1. Consulta el reparto de bancas a nivel PROVINCIAL para cada categoría. /// 2. Consulta el reparto de bancas desglosado por SECCIÓN ELECTORAL para cada categoría. /// + /// + /// Sondea la proyección de bancas a nivel Provincial y por Sección Electoral. + /// Esta versión recolecta todos los datos disponibles y los guarda en una única transacción. + /// private async Task SondearProyeccionBancasAsync(string authToken, CancellationToken stoppingToken) { try @@ -461,23 +465,20 @@ public class Worker : BackgroundService _logger.LogInformation("Iniciando sondeo de Bancas a nivel Provincial y para {count} Secciones Electorales...", seccionesElectorales.Count); - bool hasReceivedAnyNewData = false; + // Creamos una lista para recolectar todas las proyecciones que encontremos. var nuevasProyecciones = new List(); - // --- NUEVA LÓGICA: Bucle para el nivel Provincial --- + // 1. Bucle para el nivel Provincial foreach (var categoria in categoriasDeBancas) { if (stoppingToken.IsCancellationRequested) break; - - // Llamamos a la API sin 'seccionProvincialId' para obtener el total provincial. var repartoBancas = await _apiService.GetBancasAsync(authToken, provincia.DistritoId!, null, categoria.Id); - if (repartoBancas?.RepartoBancas is { Count: > 0 }) + // Si la lista de bancas no es nula (incluso si está vacía), la procesamos. + if (repartoBancas?.RepartoBancas != null) { - hasReceivedAnyNewData = true; foreach (var banca in repartoBancas.RepartoBancas) { - // Guardamos la proyección asociándola al ID del ámbito de la provincia. nuevasProyecciones.Add(new ProyeccionBanca { AmbitoGeograficoId = provincia.Id, @@ -488,19 +489,17 @@ public class Worker : BackgroundService } } - // --- LÓGICA EXISTENTE: Bucle para el nivel de Sección Electoral --- + // 2. Bucle para el nivel de Sección Electoral foreach (var seccion in seccionesElectorales) { if (stoppingToken.IsCancellationRequested) break; foreach (var categoria in categoriasDeBancas) { if (stoppingToken.IsCancellationRequested) break; - var repartoBancas = await _apiService.GetBancasAsync(authToken, seccion.DistritoId!, seccion.SeccionProvincialId!, categoria.Id); - if (repartoBancas?.RepartoBancas is { Count: > 0 }) + if (repartoBancas?.RepartoBancas != null) { - hasReceivedAnyNewData = true; foreach (var banca in repartoBancas.RepartoBancas) { nuevasProyecciones.Add(new ProyeccionBanca @@ -514,12 +513,12 @@ public class Worker : BackgroundService } } - // --- LÓGICA DE GUARDADO CENTRALIZADA --- - if (hasReceivedAnyNewData) + // 3. Guardado Final + // Ahora la condición es simple: si nuestra lista recolectora tiene CUALQUIER COSA, actualizamos la BD. + if (nuevasProyecciones.Any()) { - _logger.LogInformation("Se recibieron {count} nuevos datos de bancas. Actualizando la tabla de proyecciones...", nuevasProyecciones.Count); + _logger.LogInformation("Se recibieron {count} registros de proyección de bancas. Actualizando la tabla...", nuevasProyecciones.Count); - // Usamos una transacción para asegurar la consistencia. await using var transaction = await dbContext.Database.BeginTransactionAsync(stoppingToken); await dbContext.Database.ExecuteSqlRawAsync("DELETE FROM ProyeccionesBancas", stoppingToken); @@ -531,7 +530,8 @@ public class Worker : BackgroundService } else { - _logger.LogInformation("Sondeo de Bancas completado. No se encontraron datos nuevos de proyección, la tabla no fue modificada."); + // Si después de todas las llamadas, la lista sigue vacía, no hacemos nada. + _logger.LogInformation("Sondeo de Bancas completado. No se encontraron datos de proyección, la tabla no fue modificada."); } } catch (Exception ex)