Fix catalogo y removido el fake de pruebas
This commit is contained in:
		| @@ -42,10 +42,11 @@ public class ElectoralApiService : IElectoralApiService | |||||||
|             : null; |             : null; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public async Task<List<CatalogoDto>?> GetCatalogoCompletoAsync(string authToken) |     public async Task<List<CatalogoDto>?> GetCatalogoAmbitosAsync(string authToken, int categoriaId) | ||||||
|     { |     { | ||||||
|         var client = _httpClientFactory.CreateClient("ElectoralApiClient"); |         var client = _httpClientFactory.CreateClient("ElectoralApiClient"); | ||||||
|         var request = new HttpRequestMessage(HttpMethod.Get, "/api/catalogo/getCatalogo?categoriald=5"); |         // La URL ahora es dinámica y usa el categoriaId | ||||||
|  |         var request = new HttpRequestMessage(HttpMethod.Get, $"/api/catalogo/getCatalogo?categoriald={categoriaId}"); | ||||||
|         request.Headers.Add("Authorization", $"Bearer {authToken}"); |         request.Headers.Add("Authorization", $"Bearer {authToken}"); | ||||||
|  |  | ||||||
|         var response = await client.SendAsync(request); |         var response = await client.SendAsync(request); | ||||||
|   | |||||||
| @@ -1,145 +0,0 @@ | |||||||
| using Elecciones.Core.DTOs; |  | ||||||
| using Microsoft.Extensions.Logging; |  | ||||||
| using System; |  | ||||||
| using System.Collections.Generic; |  | ||||||
| using System.IO; |  | ||||||
| using System.Linq; |  | ||||||
| using System.Text.Json; |  | ||||||
| using System.Threading.Tasks; |  | ||||||
| using static Elecciones.Core.DTOs.BancaDto; |  | ||||||
|  |  | ||||||
| namespace Elecciones.Infrastructure.Services; |  | ||||||
|  |  | ||||||
| public class FakeElectoralApiService : IElectoralApiService |  | ||||||
| { |  | ||||||
|     private readonly ILogger<FakeElectoralApiService> _logger; |  | ||||||
|     private List<AmbitoDto>? _fakeAmbitosCache = null; |  | ||||||
|     private readonly Random _random = new Random(); |  | ||||||
|  |  | ||||||
|     public FakeElectoralApiService(ILogger<FakeElectoralApiService> logger) |  | ||||||
|     { |  | ||||||
|         _logger = logger; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     private void GenerateFakeAmbitosFromGeoJson() |  | ||||||
|     { |  | ||||||
|         if (_fakeAmbitosCache != null) return; |  | ||||||
|         _logger.LogWarning("--- USANDO SERVICIO FALSO (FAKE) ---"); |  | ||||||
|         _logger.LogInformation("Generando datos de prueba de ámbitos desde el archivo GeoJSON..."); |  | ||||||
|  |  | ||||||
|         var geoJsonPath = Path.Combine(AppContext.BaseDirectory, "buenos-aires-municipios.geojson"); |  | ||||||
|         if (!File.Exists(geoJsonPath)) |  | ||||||
|         { |  | ||||||
|             _logger.LogError("No se encontró el archivo buenos-aires-municipios.geojson."); |  | ||||||
|             _fakeAmbitosCache = new List<AmbitoDto>(); |  | ||||||
|             return; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         var geoJsonString = File.ReadAllText(geoJsonPath); |  | ||||||
|         using var document = JsonDocument.Parse(geoJsonString); |  | ||||||
|         var features = document.RootElement.GetProperty("features").EnumerateArray().ToList(); |  | ||||||
|  |  | ||||||
|         var ambitos = new List<AmbitoDto>(); |  | ||||||
|         ambitos.Add(new AmbitoDto { NivelId = 10, Nombre = "BUENOS AIRES", CodigoAmbitos = new CodigoAmbitoDto { DistritoId = "02" } }); |  | ||||||
|         var secciones = new List<AmbitoDto> { |  | ||||||
|             new() { NivelId = 4, Nombre = "PRIMERA SECCION ELECTORAL", CodigoAmbitos = new CodigoAmbitoDto { DistritoId = "02", SeccionId = "0001" } }, |  | ||||||
|             new() { NivelId = 4, Nombre = "SEGUNDA SECCION ELECTORAL", CodigoAmbitos = new CodigoAmbitoDto { DistritoId = "02", SeccionId = "0002" } }, |  | ||||||
|             new() { NivelId = 4, Nombre = "TERCERA SECCION ELECTORAL", CodigoAmbitos = new CodigoAmbitoDto { DistritoId = "02", SeccionId = "0003" } } |  | ||||||
|         }; |  | ||||||
|         ambitos.AddRange(secciones); |  | ||||||
|  |  | ||||||
|         for (int i = 0; i < features.Count; i++) |  | ||||||
|         { |  | ||||||
|             var feature = features[i]; |  | ||||||
|             var properties = feature.GetProperty("properties"); |  | ||||||
|             var seccionAsignada = secciones[i % secciones.Count]; |  | ||||||
|             ambitos.Add(new AmbitoDto { NivelId = 5, Nombre = properties.GetProperty("nam").GetString() ?? "Sin Nombre", CodigoAmbitos = new CodigoAmbitoDto { MunicipioId = properties.GetProperty("cca").GetString(), DistritoId = "02", SeccionId = seccionAsignada.CodigoAmbitos.SeccionId } }); |  | ||||||
|         } |  | ||||||
|         _fakeAmbitosCache = ambitos; |  | ||||||
|         _logger.LogInformation("Se generaron {count} ámbitos de prueba (Provincia, Secciones y Municipios).", _fakeAmbitosCache.Count); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     public Task<ResumenDto?> GetResumenAsync(string authToken, string distritoId) |  | ||||||
|     { |  | ||||||
|         _logger.LogInformation("Simulando obtención de Resumen para distrito {DistritoId}...", distritoId); |  | ||||||
|         var resumen = new ResumenDto |  | ||||||
|         { |  | ||||||
|             ValoresTotalizadosPositivos = new List<ResumenPositivoDto> |  | ||||||
|         { |  | ||||||
|             new() { IdAgrupacion = "025", Votos = 2500000 + _random.Next(1000), VotosPorcentaje = 45.12m }, |  | ||||||
|             new() { IdAgrupacion = "018", Votos = 2100000 + _random.Next(1000), VotosPorcentaje = 38.78m }, |  | ||||||
|             new() { IdAgrupacion = "031", Votos = 800000 + _random.Next(1000), VotosPorcentaje = 14.10m } |  | ||||||
|         } |  | ||||||
|         }; |  | ||||||
|         return Task.FromResult<ResumenDto?>(resumen); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     public Task<EstadoRecuentoGeneralDto?> GetEstadoRecuentoGeneralAsync(string authToken, string distritoId) |  | ||||||
|     { |  | ||||||
|         _logger.LogInformation("Simulando obtención de Estado de Recuento General para distrito {DistritoId}...", distritoId); |  | ||||||
|         var estado = new EstadoRecuentoGeneralDto |  | ||||||
|         { |  | ||||||
|             MesasEsperadas = 38000, |  | ||||||
|             MesasTotalizadas = _random.Next(28000, 37000), |  | ||||||
|             MesasTotalizadasPorcentaje = 95.5m, |  | ||||||
|             CantidadElectores = 12500000, |  | ||||||
|             CantidadVotantes = 9375000, |  | ||||||
|             ParticipacionPorcentaje = 75.0m |  | ||||||
|         }; |  | ||||||
|         return Task.FromResult<EstadoRecuentoGeneralDto?>(estado); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     public Task<string?> GetAuthTokenAsync() |  | ||||||
|     { |  | ||||||
|         _logger.LogInformation("Simulando obtención de token..."); |  | ||||||
|         return Task.FromResult<string?>("FAKE_TOKEN_FOR_DEVELOPMENT"); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     public Task<List<CatalogoDto>?> GetCatalogoCompletoAsync(string authToken) |  | ||||||
|     { |  | ||||||
|         GenerateFakeAmbitosFromGeoJson(); |  | ||||||
|         var catalogo = new List<CatalogoDto> { new() { Version = 1, CategoriaId = 5, Ambitos = _fakeAmbitosCache ?? new List<AmbitoDto>(), Niveles = new List<NivelDto> { new() { NivelId = 10, Nombre = "Provincia" }, new() { NivelId = 4, Nombre = "Seccion" }, new() { NivelId = 5, Nombre = "Municipio" } } } }; |  | ||||||
|         return Task.FromResult<List<CatalogoDto>?>(catalogo); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     public Task<List<AgrupacionDto>?> GetAgrupacionesAsync(string authToken, string distritoId, int categoriaId) |  | ||||||
|     { |  | ||||||
|         var agrupaciones = new List<AgrupacionDto> { new() { IdAgrupacion = "018", IdAgrupacionTelegrama = "131", NombreAgrupacion = "FRENTE DE AVANZADA" }, new() { IdAgrupacion = "025", IdAgrupacionTelegrama = "132", NombreAgrupacion = "ALIANZA POR EL FUTURO" }, new() { IdAgrupacion = "031", IdAgrupacionTelegrama = "133", NombreAgrupacion = "UNION POPULAR" }, new() { IdAgrupacion = "045", IdAgrupacionTelegrama = "134", NombreAgrupacion = "PARTIDO VECINALISTA" } }; |  | ||||||
|         return Task.FromResult<List<AgrupacionDto>?>(agrupaciones); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     public Task<ResultadosDto?> GetResultadosAsync(string authToken, string distritoId, string seccionId, string municipioId) |  | ||||||
|     { |  | ||||||
|         var resultados = new ResultadosDto { FechaTotalizacion = DateTime.Now.ToString("o"), EstadoRecuento = new EstadoRecuentoDto { MesasEsperadas = _random.Next(100, 2000), MesasTotalizadas = _random.Next(50, 100), CantidadElectores = _random.Next(50000, 600000), ParticipacionPorcentaje = _random.Next(60, 85) + (decimal)_random.NextDouble() }, ValoresTotalizadosPositivos = new List<VotosPositivosDto> { new() { IdAgrupacion = "018", Votos = _random.Next(10000, 20000) }, new() { IdAgrupacion = "025", Votos = _random.Next(15000, 25000) }, new() { IdAgrupacion = "031", Votos = _random.Next(5000, 10000) }, new() { IdAgrupacion = "045", Votos = _random.Next(2000, 5000) } }, ValoresTotalizadosOtros = new VotosOtrosDto { VotosEnBlanco = _random.Next(1000, 2000), VotosNulos = _random.Next(500, 1000), VotosRecurridos = _random.Next(20, 50) } }; |  | ||||||
|         return Task.FromResult<ResultadosDto?>(resultados); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     public Task<RepartoBancasDto?> GetBancasAsync(string authToken, string distritoId, string seccionId) |  | ||||||
|     { |  | ||||||
|         var reparto = new RepartoBancasDto { RepartoBancas = new List<BancaDto> { new() { IdAgrupacion = "025", NroBancas = _random.Next(5, 9) }, new() { IdAgrupacion = "018", NroBancas = _random.Next(3, 7) } } }; |  | ||||||
|         return Task.FromResult<RepartoBancasDto?>(reparto); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     public Task<List<string[]>?> GetTelegramasTotalizadosAsync(string authToken, string distritoId, string seccionId) |  | ||||||
|     { |  | ||||||
|         var lista = new List<string[]> { new[] { $"02{seccionId}0001M" }, new[] { $"02{seccionId}0002M" } }; |  | ||||||
|         return Task.FromResult<List<string[]>?>(lista); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     public Task<TelegramaFileDto?> GetTelegramaFileAsync(string authToken, string mesaId) |  | ||||||
|     { |  | ||||||
|         var file = new TelegramaFileDto { NombreArchivo = mesaId, Imagen = "FAKE_BASE64_PDF_CONTENT", FechaEscaneo = DateTime.UtcNow.AddMinutes(-10).ToString("o"), FechaTotalizacion = DateTime.UtcNow.ToString("o") }; |  | ||||||
|         return Task.FromResult<TelegramaFileDto?>(file); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     public Task<List<CategoriaDto>?> GetCategoriasAsync(string authToken) |  | ||||||
|     { |  | ||||||
|         _logger.LogInformation("Simulando obtención de Categorías Electorales..."); |  | ||||||
|         var categorias = new List<CategoriaDto> |  | ||||||
|     { |  | ||||||
|         new() { CategoriaId = 5, Nombre = "DIPUTADOS NACIONALES", Orden = 1 }, |  | ||||||
|         new() { CategoriaId = 6, Nombre = "SENADORES NACIONALES", Orden = 2 } |  | ||||||
|     }; |  | ||||||
|         return Task.FromResult<List<CategoriaDto>?>(categorias); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| @@ -10,7 +10,7 @@ public interface IElectoralApiService | |||||||
|     Task<string?> GetAuthTokenAsync(); |     Task<string?> GetAuthTokenAsync(); | ||||||
|  |  | ||||||
|     // Métodos para catálogos |     // Métodos para catálogos | ||||||
|     Task<List<CatalogoDto>?> GetCatalogoCompletoAsync(string authToken); |     Task<List<CatalogoDto>?> GetCatalogoAmbitosAsync(string authToken, int categoriaId); | ||||||
|     Task<List<AgrupacionDto>?> GetAgrupacionesAsync(string authToken, string distritoId, int categoriaId); |     Task<List<AgrupacionDto>?> GetAgrupacionesAsync(string authToken, string distritoId, int categoriaId); | ||||||
|  |  | ||||||
|     // Métodos para resultados y datos dinámicos |     // Métodos para resultados y datos dinámicos | ||||||
|   | |||||||
| @@ -13,7 +13,7 @@ using System.Reflection; | |||||||
| [assembly: System.Reflection.AssemblyCompanyAttribute("Elecciones.Infrastructure")] | [assembly: System.Reflection.AssemblyCompanyAttribute("Elecciones.Infrastructure")] | ||||||
| [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] | [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] | ||||||
| [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] | [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] | ||||||
| [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+39b1e9707275ed59ac4a7d32e26b951186a346bb")] | [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+527839dd6deeb2314e8edc9f7f83edc264a0ea61")] | ||||||
| [assembly: System.Reflection.AssemblyProductAttribute("Elecciones.Infrastructure")] | [assembly: System.Reflection.AssemblyProductAttribute("Elecciones.Infrastructure")] | ||||||
| [assembly: System.Reflection.AssemblyTitleAttribute("Elecciones.Infrastructure")] | [assembly: System.Reflection.AssemblyTitleAttribute("Elecciones.Infrastructure")] | ||||||
| [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] | [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] | ||||||
|   | |||||||
| @@ -30,9 +30,6 @@ var connectionString = builder.Configuration.GetConnectionString("DefaultConnect | |||||||
| builder.Services.AddDbContext<EleccionesDbContext>(options => | builder.Services.AddDbContext<EleccionesDbContext>(options => | ||||||
|     options.UseSqlServer(connectionString)); |     options.UseSqlServer(connectionString)); | ||||||
|  |  | ||||||
| #if DEBUG |  | ||||||
| builder.Services.AddSingleton<IElectoralApiService, FakeElectoralApiService>(); |  | ||||||
| #else |  | ||||||
| builder.Services.AddHttpClient("ElectoralApiClient", client => | builder.Services.AddHttpClient("ElectoralApiClient", client => | ||||||
| { | { | ||||||
|     var baseUrl = builder.Configuration["ElectoralApi:BaseUrl"]; |     var baseUrl = builder.Configuration["ElectoralApi:BaseUrl"]; | ||||||
| @@ -80,8 +77,6 @@ builder.Services.AddHttpClient("ElectoralApiClient", client => | |||||||
|  |  | ||||||
| builder.Services.AddSingleton<IElectoralApiService, ElectoralApiService>(); | builder.Services.AddSingleton<IElectoralApiService, ElectoralApiService>(); | ||||||
|  |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| builder.Services.AddHostedService<Worker>(); | builder.Services.AddHostedService<Worker>(); | ||||||
|  |  | ||||||
| var host = builder.Build(); | var host = builder.Build(); | ||||||
|   | |||||||
| @@ -170,70 +170,40 @@ public class Worker : BackgroundService | |||||||
|             using var scope = _serviceProvider.CreateScope(); |             using var scope = _serviceProvider.CreateScope(); | ||||||
|             var dbContext = scope.ServiceProvider.GetRequiredService<EleccionesDbContext>(); |             var dbContext = scope.ServiceProvider.GetRequiredService<EleccionesDbContext>(); | ||||||
|  |  | ||||||
|             // --- 1. SINCRONIZACIÓN DE CATEGORÍAS (NUEVO) --- |             // --- 1. OBTENEMOS LA LISTA COMPLETA DE CATEGORÍAS DISPONIBLES --- | ||||||
|             var categoriasApi = await _apiService.GetCategoriasAsync(_authToken); |             var categoriasApi = await _apiService.GetCategoriasAsync(_authToken); | ||||||
|             if (categoriasApi is { Count: > 0 }) |             if (categoriasApi is null || !categoriasApi.Any()) | ||||||
|             { |             { | ||||||
|                 // Primero, nos aseguramos de procesar solo IDs de categoría únicos desde la API |                 _logger.LogWarning("No se recibieron datos del catálogo de Categorías. No se puede continuar con la sincronización."); | ||||||
|                 // para evitar conflictos de seguimiento en Entity Framework. |                 return; | ||||||
|                 var distinctCategoriasApi = categoriasApi |             } | ||||||
|  |  | ||||||
|  |             // Depuramos la lista para evitar duplicados | ||||||
|  |             var distinctCategorias = categoriasApi | ||||||
|                 .GroupBy(c => c.CategoriaId) |                 .GroupBy(c => c.CategoriaId) | ||||||
|                     .Select(g => g.First()) // Tomamos la primera aparición de cada ID único |                 .Select(g => g.First()) | ||||||
|  |                 .OrderBy(c => c.Orden) // Procesamos en el orden definido | ||||||
|                 .ToList(); |                 .ToList(); | ||||||
|  |  | ||||||
|                 var categoriasEnDb = await dbContext.CategoriasElectorales.ToDictionaryAsync(c => c.Id, c => c, stoppingToken); |             _logger.LogInformation("Se procesarán {count} categorías electorales.", distinctCategorias.Count); | ||||||
|  |  | ||||||
|                 // Ahora iteramos sobre la lista depurada |             // --- 2. ITERAMOS SOBRE CADA CATEGORÍA PARA DESCARGAR SUS CATÁLOGOS --- | ||||||
|                 foreach (var categoriaDto in distinctCategoriasApi) |             foreach (var categoria in distinctCategorias) | ||||||
|             { |             { | ||||||
|                     if (categoriasEnDb.TryGetValue(categoriaDto.CategoriaId, out var categoriaExistente)) |                 if (stoppingToken.IsCancellationRequested) break; | ||||||
|                     { |                 _logger.LogInformation("--- Sincronizando catálogos para la categoría: {NombreCategoria} (ID: {CategoriaId}) ---", categoria.Nombre, categoria.CategoriaId); | ||||||
|                         // La categoría ya existe, actualizamos sus datos |  | ||||||
|                         categoriaExistente.Nombre = categoriaDto.Nombre; |  | ||||||
|                         categoriaExistente.Orden = categoriaDto.Orden; |  | ||||||
|                     } |  | ||||||
|                     else |  | ||||||
|                     { |  | ||||||
|                         // La categoría es nueva, la añadimos |  | ||||||
|                         await dbContext.CategoriasElectorales.AddAsync(new CategoriaElectoral |  | ||||||
|                         { |  | ||||||
|                             Id = categoriaDto.CategoriaId, |  | ||||||
|                             Nombre = categoriaDto.Nombre, |  | ||||||
|                             Orden = categoriaDto.Orden |  | ||||||
|                         }, stoppingToken); |  | ||||||
|                     } |  | ||||||
|                 } |  | ||||||
|                 _logger.LogInformation("Sincronización de Categorías Electorales completada."); |  | ||||||
|             } |  | ||||||
|             else |  | ||||||
|             { |  | ||||||
|                 _logger.LogWarning("No se recibieron datos del catálogo de Categorías."); |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             // --- 2. SINCRONIZACIÓN DE ÁMBITOS GEOGRÁFICOS --- |                 // --- SINCRONIZACIÓN DE ÁMBITOS GEOGRÁFICOS --- | ||||||
|             var catalogoAmbitosApi = await _apiService.GetCatalogoCompletoAsync(_authToken); |                 var catalogoAmbitosApi = await _apiService.GetCatalogoAmbitosAsync(_authToken, categoria.CategoriaId); | ||||||
|                 if (catalogoAmbitosApi is { Count: > 0 }) |                 if (catalogoAmbitosApi is { Count: > 0 }) | ||||||
|                 { |                 { | ||||||
|                 // Cargamos los ámbitos existentes de la BD en un diccionario para búsqueda rápida |                     var ambitosEnDb = await dbContext.AmbitosGeograficos.ToDictionaryAsync(a => (a.DistritoId, a.SeccionId, a.MunicipioId), a => a, stoppingToken); | ||||||
|                 var ambitosEnDb = await dbContext.AmbitosGeograficos |  | ||||||
|                     .ToDictionaryAsync(a => a.MunicipioId ?? a.SeccionId ?? a.DistritoId ?? a.Nombre, a => a, stoppingToken); |  | ||||||
|  |  | ||||||
|                     foreach (var ambitoDto in catalogoAmbitosApi.SelectMany(c => c.Ambitos)) |                     foreach (var ambitoDto in catalogoAmbitosApi.SelectMany(c => c.Ambitos)) | ||||||
|                     { |                     { | ||||||
|                     // Usamos una clave única para identificar el ámbito (ej. ID de municipio) |                         var claveUnica = (ambitoDto.CodigoAmbitos.DistritoId, ambitoDto.CodigoAmbitos.SeccionId, ambitoDto.CodigoAmbitos.MunicipioId); | ||||||
|                     var claveUnica = ambitoDto.CodigoAmbitos.MunicipioId ?? ambitoDto.CodigoAmbitos.SeccionId ?? ambitoDto.CodigoAmbitos.DistritoId ?? ambitoDto.Nombre; |                         if (!ambitosEnDb.TryGetValue(claveUnica, out var ambitoExistente)) | ||||||
|  |  | ||||||
|                     if (ambitosEnDb.TryGetValue(claveUnica, out var ambitoExistente)) |  | ||||||
|                         { |                         { | ||||||
|                         // El ámbito ya existe, actualizamos sus datos descriptivos. |                             await dbContext.AmbitosGeograficos.AddAsync(new AmbitoGeografico | ||||||
|                         // No actualizamos los IDs, ya que forman parte de la identidad del ámbito. |  | ||||||
|                         ambitoExistente.Nombre = ambitoDto.Nombre; |  | ||||||
|                         ambitoExistente.NivelId = ambitoDto.NivelId; |  | ||||||
|                     } |  | ||||||
|                     else |  | ||||||
|                     { |  | ||||||
|                         // El ámbito es nuevo, lo añadimos (el código de inserción que ya tenemos es correcto) |  | ||||||
|                         var nuevoAmbito = new AmbitoGeografico |  | ||||||
|                             { |                             { | ||||||
|                                 Nombre = ambitoDto.Nombre, |                                 Nombre = ambitoDto.Nombre, | ||||||
|                                 NivelId = ambitoDto.NivelId, |                                 NivelId = ambitoDto.NivelId, | ||||||
| @@ -241,55 +211,40 @@ public class Worker : BackgroundService | |||||||
|                                 SeccionId = ambitoDto.CodigoAmbitos.SeccionId, |                                 SeccionId = ambitoDto.CodigoAmbitos.SeccionId, | ||||||
|                                 MunicipioId = ambitoDto.CodigoAmbitos.MunicipioId, |                                 MunicipioId = ambitoDto.CodigoAmbitos.MunicipioId, | ||||||
|                                 SeccionProvincialId = ambitoDto.CodigoAmbitos.SeccionProvincialId |                                 SeccionProvincialId = ambitoDto.CodigoAmbitos.SeccionProvincialId | ||||||
|                         }; |                             }, stoppingToken); | ||||||
|                         await dbContext.AmbitosGeograficos.AddAsync(nuevoAmbito, stoppingToken); |  | ||||||
|                         } |                         } | ||||||
|                     } |                     } | ||||||
|                 _logger.LogInformation("Sincronización de Ámbitos Geográficos completada."); |                     _logger.LogInformation("Sincronización de Ámbitos Geográficos completada para la categoría actual."); | ||||||
|             } |  | ||||||
|             else |  | ||||||
|             { |  | ||||||
|                 _logger.LogWarning("No se recibieron datos del catálogo de Ámbitos. Los datos existentes no serán modificados."); |  | ||||||
|                 } |                 } | ||||||
|  |  | ||||||
|             // --- 3. SINCRONIZACIÓN DE AGRUPACIONES POLÍTICAS --- |                 // --- SINCRONIZACIÓN DE AGRUPACIONES POLÍTICAS --- | ||||||
|             var agrupacionesApi = await _apiService.GetAgrupacionesAsync(_authToken, "02", 5); |                 var provincia = catalogoAmbitosApi?.SelectMany(c => c.Ambitos).FirstOrDefault(a => a.NivelId == 10); | ||||||
|  |                 if (provincia != null) | ||||||
|  |                 { | ||||||
|  |                     var agrupacionesApi = await _apiService.GetAgrupacionesAsync(_authToken, provincia.CodigoAmbitos.DistritoId, categoria.CategoriaId); | ||||||
|                     if (agrupacionesApi is { Count: > 0 }) |                     if (agrupacionesApi is { Count: > 0 }) | ||||||
|                     { |                     { | ||||||
|                 var agrupacionesEnDb = await dbContext.AgrupacionesPoliticas |                         var agrupacionesEnDb = await dbContext.AgrupacionesPoliticas.ToDictionaryAsync(a => a.Id, a => a, stoppingToken); | ||||||
|                     .ToDictionaryAsync(a => a.Id, a => a, stoppingToken); |  | ||||||
|  |  | ||||||
|                         foreach (var agrupacionDto in agrupacionesApi) |                         foreach (var agrupacionDto in agrupacionesApi) | ||||||
|                         { |                         { | ||||||
|                     if (agrupacionesEnDb.TryGetValue(agrupacionDto.IdAgrupacion, out var agrupacionExistente)) |                             if (!agrupacionesEnDb.TryGetValue(agrupacionDto.IdAgrupacion, out var agrupacionExistente)) | ||||||
|                             { |                             { | ||||||
|                         // La agrupación ya existe, actualizamos el nombre por si cambia |                                 await dbContext.AgrupacionesPoliticas.AddAsync(new AgrupacionPolitica | ||||||
|                         agrupacionExistente.Nombre = agrupacionDto.NombreAgrupacion; |  | ||||||
|                         agrupacionExistente.IdTelegrama = agrupacionDto.IdAgrupacionTelegrama; |  | ||||||
|                     } |  | ||||||
|                     else |  | ||||||
|                     { |  | ||||||
|                         // La agrupación es nueva, la añadimos |  | ||||||
|                         var nuevaAgrupacion = new AgrupacionPolitica |  | ||||||
|                                 { |                                 { | ||||||
|                                     Id = agrupacionDto.IdAgrupacion, |                                     Id = agrupacionDto.IdAgrupacion, | ||||||
|                                     IdTelegrama = agrupacionDto.IdAgrupacionTelegrama, |                                     IdTelegrama = agrupacionDto.IdAgrupacionTelegrama, | ||||||
|                                     Nombre = agrupacionDto.NombreAgrupacion |                                     Nombre = agrupacionDto.NombreAgrupacion | ||||||
|                         }; |                                 }, stoppingToken); | ||||||
|                         await dbContext.AgrupacionesPoliticas.AddAsync(nuevaAgrupacion, stoppingToken); |  | ||||||
|                             } |                             } | ||||||
|                         } |                         } | ||||||
|                 _logger.LogInformation("Sincronización de Agrupaciones Políticas completada."); |                         _logger.LogInformation("Sincronización de Agrupaciones Políticas completada para la categoría actual."); | ||||||
|                     } |                     } | ||||||
|             else |  | ||||||
|             { |  | ||||||
|                 _logger.LogWarning("No se recibieron datos del catálogo de Agrupaciones. Los datos existentes no serán modificados."); |  | ||||||
|                 } |                 } | ||||||
|  |             } // Fin del bucle foreach | ||||||
|  |  | ||||||
|             // --- 4. GUARDADO FINAL --- |             // --- 3. GUARDADO FINAL --- | ||||||
|             int cambiosGuardados = await dbContext.SaveChangesAsync(stoppingToken); |             int cambiosGuardados = await dbContext.SaveChangesAsync(stoppingToken); | ||||||
|             _logger.LogInformation("{count} cambios en los catálogos han sido guardados en la base de datos.", cambiosGuardados); |             _logger.LogInformation("{count} cambios totales en los catálogos han sido guardados en la base de datos.", cambiosGuardados); | ||||||
|  |  | ||||||
|             _logger.LogInformation("Sincronización de catálogos maestros finalizada."); |             _logger.LogInformation("Sincronización de catálogos maestros finalizada."); | ||||||
|         } |         } | ||||||
|         catch (Exception ex) |         catch (Exception ex) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user