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. | ||||
|     /// 2. Consulta el reparto de bancas desglosado por SECCIÓN ELECTORAL para cada categoría. | ||||
|     /// </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) | ||||
|     { | ||||
|         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<ProyeccionBanca>(); | ||||
|  | ||||
|             // --- 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) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user