Fix Sondear Proyeccion Bancas

This commit is contained in:
2025-08-19 18:50:49 -03:00
parent 80a9855acd
commit 68dce9415e

View File

@@ -432,6 +432,10 @@ public class Worker : BackgroundService
/// 1. Consulta el reparto de bancas a nivel PROVINCIAL para cada categoría. /// 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. /// 2. Consulta el reparto de bancas desglosado por SECCIÓN ELECTORAL para cada categoría.
/// </summary> /// </summary>
/// <summary>
/// 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.
/// </summary>
private async Task SondearProyeccionBancasAsync(string authToken, CancellationToken stoppingToken) private async Task SondearProyeccionBancasAsync(string authToken, CancellationToken stoppingToken)
{ {
try 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); _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<ProyeccionBanca>(); var nuevasProyecciones = new List<ProyeccionBanca>();
// --- NUEVA LÓGICA: Bucle para el nivel Provincial --- // 1. Bucle para el nivel Provincial
foreach (var categoria in categoriasDeBancas) foreach (var categoria in categoriasDeBancas)
{ {
if (stoppingToken.IsCancellationRequested) break; 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); 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) foreach (var banca in repartoBancas.RepartoBancas)
{ {
// Guardamos la proyección asociándola al ID del ámbito de la provincia.
nuevasProyecciones.Add(new ProyeccionBanca nuevasProyecciones.Add(new ProyeccionBanca
{ {
AmbitoGeograficoId = provincia.Id, 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) foreach (var seccion in seccionesElectorales)
{ {
if (stoppingToken.IsCancellationRequested) break; if (stoppingToken.IsCancellationRequested) break;
foreach (var categoria in categoriasDeBancas) foreach (var categoria in categoriasDeBancas)
{ {
if (stoppingToken.IsCancellationRequested) break; if (stoppingToken.IsCancellationRequested) break;
var repartoBancas = await _apiService.GetBancasAsync(authToken, seccion.DistritoId!, seccion.SeccionProvincialId!, categoria.Id); 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) foreach (var banca in repartoBancas.RepartoBancas)
{ {
nuevasProyecciones.Add(new ProyeccionBanca nuevasProyecciones.Add(new ProyeccionBanca
@@ -514,12 +513,12 @@ public class Worker : BackgroundService
} }
} }
// --- LÓGICA DE GUARDADO CENTRALIZADA --- // 3. Guardado Final
if (hasReceivedAnyNewData) // 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 using var transaction = await dbContext.Database.BeginTransactionAsync(stoppingToken);
await dbContext.Database.ExecuteSqlRawAsync("DELETE FROM ProyeccionesBancas", stoppingToken); await dbContext.Database.ExecuteSqlRawAsync("DELETE FROM ProyeccionesBancas", stoppingToken);
@@ -531,7 +530,8 @@ public class Worker : BackgroundService
} }
else 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) catch (Exception ex)