Fix Worker 1131

This commit is contained in:
2025-08-16 11:31:49 -03:00
parent acd1c3373f
commit 3c0f382cee

View File

@@ -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.");