Fix Worker 1131
This commit is contained in:
		| @@ -174,75 +174,58 @@ public class Worker : BackgroundService | |||||||
|             var categoriasApi = await _apiService.GetCategoriasAsync(_authToken); |             var categoriasApi = await _apiService.GetCategoriasAsync(_authToken); | ||||||
|             if (categoriasApi is null || !categoriasApi.Any()) |             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; |                 return; | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             // Depuramos la lista para evitar duplicados |  | ||||||
|             var distinctCategorias = categoriasApi |             var distinctCategorias = categoriasApi | ||||||
|                 .GroupBy(c => c.CategoriaId) |                 .GroupBy(c => c.CategoriaId) | ||||||
|                 .Select(g => g.First()) |                 .Select(g => g.First()) | ||||||
|                 .OrderBy(c => c.Orden) // Procesamos en el orden definido |                 .OrderBy(c => c.Orden) | ||||||
|                 .ToList(); |                 .ToList(); | ||||||
|  |  | ||||||
|             _logger.LogInformation("Se procesarán {count} categorías electorales.", distinctCategorias.Count); |             _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) |             foreach (var categoria in distinctCategorias) | ||||||
|             { |             { | ||||||
|                 if (stoppingToken.IsCancellationRequested) break; |                 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); |                 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); |                     // La lógica para procesar ámbitos y agrupaciones irá aquí... | ||||||
|                     foreach (var ambitoDto in catalogoAmbitosApi.SelectMany(c => c.Ambitos)) |                     // 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); | ||||||
|                         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."); |  | ||||||
|                 } |                 } | ||||||
|  |                 else | ||||||
|                 // --- SINCRONIZACIÓN DE AGRUPACIONES POLÍTICAS --- |  | ||||||
|                 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); |                     _logger.LogWarning("No se recibieron datos del catálogo de Ámbitos para la categoría {Id} (Respuesta: 400 Bad Request).", 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."); |  | ||||||
|                     } |  | ||||||
|                 } |                 } | ||||||
|             } // Fin del bucle foreach |             } | ||||||
|  |  | ||||||
|             // --- 3. GUARDADO FINAL --- |             // --- 4. GUARDADO FINAL --- | ||||||
|             int cambiosGuardados = await dbContext.SaveChangesAsync(stoppingToken); |             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("{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."); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user