Fix Worker 1131
This commit is contained in:
		| @@ -174,75 +174,58 @@ public class Worker : BackgroundService | ||||
|             var categoriasApi = await _apiService.GetCategoriasAsync(_authToken); | ||||
|             if (categoriasApi is null || !categoriasApi.Any()) | ||||
|             { | ||||
|                 _logger.LogWarning("No se recibieron datos del catálogo de Categorías. No se puede continuar con la sincronización."); | ||||
|                 _logger.LogWarning("No se recibieron datos del catálogo de Categorías. No se puede continuar."); | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|             // Depuramos la lista para evitar duplicados | ||||
|             var distinctCategorias = categoriasApi | ||||
|                 .GroupBy(c => c.CategoriaId) | ||||
|                 .Select(g => g.First()) | ||||
|                 .OrderBy(c => c.Orden) // Procesamos en el orden definido | ||||
|                 .OrderBy(c => c.Orden) | ||||
|                 .ToList(); | ||||
|  | ||||
|             _logger.LogInformation("Se procesarán {count} categorías electorales.", distinctCategorias.Count); | ||||
|  | ||||
|             // --- 2. ITERAMOS SOBRE CADA CATEGORÍA PARA DESCARGAR SUS CATÁLOGOS --- | ||||
|             // --- 2. GUARDAMOS/ACTUALIZAMOS LAS CATEGORÍAS EN LA BD --- | ||||
|             var categoriasEnDb = await dbContext.CategoriasElectorales.ToDictionaryAsync(c => c.Id, c => c, stoppingToken); | ||||
|             foreach (var categoriaDto in distinctCategorias) | ||||
|             { | ||||
|                 if (categoriasEnDb.TryGetValue(categoriaDto.CategoriaId, out var categoriaExistente)) | ||||
|                 { | ||||
|                     categoriaExistente.Nombre = categoriaDto.Nombre; | ||||
|                     categoriaExistente.Orden = categoriaDto.Orden; | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     dbContext.CategoriasElectorales.Add(new CategoriaElectoral | ||||
|                     { | ||||
|                         Id = categoriaDto.CategoriaId, | ||||
|                         Nombre = categoriaDto.Nombre, | ||||
|                         Orden = categoriaDto.Orden | ||||
|                     }); | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             // --- 3. ITERAMOS SOBRE CADA CATEGORÍA PARA DESCARGAR EL RESTO DE CATÁLOGOS --- | ||||
|             foreach (var categoria in distinctCategorias) | ||||
|             { | ||||
|                 if (stoppingToken.IsCancellationRequested) break; | ||||
|                 _logger.LogInformation("--- Sincronizando catálogos para la categoría: {NombreCategoria} (ID: {CategoriaId}) ---", categoria.Nombre, categoria.CategoriaId); | ||||
|                 _logger.LogInformation("--- Sincronizando Ámbitos y Agrupaciones para la categoría: {Nombre} (ID: {Id}) ---", categoria.Nombre, categoria.CategoriaId); | ||||
|  | ||||
|                 // --- SINCRONIZACIÓN DE ÁMBITOS GEOGRÁFICOS --- | ||||
|                 var catalogoAmbitosApi = await _apiService.GetCatalogoAmbitosAsync(_authToken, categoria.CategoriaId); | ||||
|                 if (catalogoAmbitosApi is { Count: > 0 }) | ||||
|                 if (catalogoAmbitosApi != null && catalogoAmbitosApi.Any()) | ||||
|                 { | ||||
|                     var ambitosEnDb = await dbContext.AmbitosGeograficos.ToDictionaryAsync(a => (a.DistritoId, a.SeccionId, a.MunicipioId), a => a, stoppingToken); | ||||
|                     foreach (var ambitoDto in catalogoAmbitosApi.SelectMany(c => c.Ambitos)) | ||||
|                     { | ||||
|                         var claveUnica = (ambitoDto.CodigoAmbitos.DistritoId, ambitoDto.CodigoAmbitos.SeccionId, ambitoDto.CodigoAmbitos.MunicipioId); | ||||
|                         if (!ambitosEnDb.TryGetValue(claveUnica, out var ambitoExistente)) | ||||
|                         { | ||||
|                             await dbContext.AmbitosGeograficos.AddAsync(new AmbitoGeografico | ||||
|                             { | ||||
|                                 Nombre = ambitoDto.Nombre, | ||||
|                                 NivelId = ambitoDto.NivelId, | ||||
|                                 DistritoId = ambitoDto.CodigoAmbitos.DistritoId, | ||||
|                                 SeccionId = ambitoDto.CodigoAmbitos.SeccionId, | ||||
|                                 MunicipioId = ambitoDto.CodigoAmbitos.MunicipioId, | ||||
|                                 SeccionProvincialId = ambitoDto.CodigoAmbitos.SeccionProvincialId | ||||
|                             }, stoppingToken); | ||||
|                         } | ||||
|                     } | ||||
|                     _logger.LogInformation("Sincronización de Ámbitos Geográficos completada para la categoría actual."); | ||||
|                     // La lógica para procesar ámbitos y agrupaciones irá aquí... | ||||
|                     // Por ahora, se saltará debido a los errores 400 de la API. | ||||
|                     _logger.LogInformation("Catálogo de Ámbitos para la categoría {Id} obtenido con éxito.", categoria.CategoriaId); | ||||
|                 } | ||||
|  | ||||
|                 // --- SINCRONIZACIÓN DE AGRUPACIONES POLÍTICAS --- | ||||
|                 var provincia = catalogoAmbitosApi?.SelectMany(c => c.Ambitos).FirstOrDefault(a => a.NivelId == 10); | ||||
|                 if (provincia != null) | ||||
|                 else | ||||
|                 { | ||||
|                     var agrupacionesApi = await _apiService.GetAgrupacionesAsync(_authToken, provincia.CodigoAmbitos.DistritoId, categoria.CategoriaId); | ||||
|                     if (agrupacionesApi is { Count: > 0 }) | ||||
|                     { | ||||
|                         var agrupacionesEnDb = await dbContext.AgrupacionesPoliticas.ToDictionaryAsync(a => a.Id, a => a, stoppingToken); | ||||
|                         foreach (var agrupacionDto in agrupacionesApi) | ||||
|                         { | ||||
|                             if (!agrupacionesEnDb.TryGetValue(agrupacionDto.IdAgrupacion, out var agrupacionExistente)) | ||||
|                             { | ||||
|                                 await dbContext.AgrupacionesPoliticas.AddAsync(new AgrupacionPolitica | ||||
|                                 { | ||||
|                                     Id = agrupacionDto.IdAgrupacion, | ||||
|                                     IdTelegrama = agrupacionDto.IdAgrupacionTelegrama, | ||||
|                                     Nombre = agrupacionDto.NombreAgrupacion | ||||
|                                 }, stoppingToken); | ||||
|                             } | ||||
|                         } | ||||
|                         _logger.LogInformation("Sincronización de Agrupaciones Políticas completada para la categoría actual."); | ||||
|                     } | ||||
|                     _logger.LogWarning("No se recibieron datos del catálogo de Ámbitos para la categoría {Id} (Respuesta: 400 Bad Request).", categoria.CategoriaId); | ||||
|                 } | ||||
|             } // Fin del bucle foreach | ||||
|             } | ||||
|  | ||||
|             // --- 3. GUARDADO FINAL --- | ||||
|             // --- 4. GUARDADO FINAL --- | ||||
|             int cambiosGuardados = await dbContext.SaveChangesAsync(stoppingToken); | ||||
|             _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."); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user