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