Fix Sondear Proyeccion Bancas
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user