Fix Campos añadidos

This commit is contained in:
2025-08-16 13:05:44 -03:00
parent 69ddf2b2d2
commit 931d0f4e91
19 changed files with 546 additions and 79 deletions

View File

@@ -174,116 +174,100 @@ 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.");
return;
}
var distinctCategorias = categoriasApi
.GroupBy(c => c.CategoriaId)
.Select(g => g.First())
.OrderBy(c => c.Orden)
.ToList();
var distinctCategorias = categoriasApi.GroupBy(c => c.CategoriaId).Select(g => g.First()).OrderBy(c => c.Orden).ToList();
_logger.LogInformation("Se procesarán {count} categorías electorales.", distinctCategorias.Count);
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))
if (!categoriasEnDb.ContainsKey(categoriaDto.CategoriaId))
{
// Actualizar por si cambia el nombre o el orden
categoriaExistente.Nombre = categoriaDto.Nombre;
categoriaExistente.Orden = categoriaDto.Orden;
}
else
{
// Añadir nueva categoría
dbContext.CategoriasElectorales.Add(new CategoriaElectoral
{
Id = categoriaDto.CategoriaId,
Nombre = categoriaDto.Nombre,
Orden = categoriaDto.Orden
});
dbContext.CategoriasElectorales.Add(new CategoriaElectoral { Id = categoriaDto.CategoriaId, Nombre = categoriaDto.Nombre, Orden = categoriaDto.Orden });
}
}
// Guardamos las categorías primero para asegurar que existan para los siguientes pasos
await dbContext.SaveChangesAsync(stoppingToken);
// --- 2. SINCRONIZAR ÁMBITOS Y AGRUPACIONES ---
// Cargamos los catálogos existentes en memoria UNA SOLA VEZ para eficiencia.
var ambitosEnDb = await dbContext.AmbitosGeograficos.ToDictionaryAsync(
a => (a.DistritoId, a.SeccionId, a.MunicipioId, a.CircuitoId, a.EstablecimientoId),
a => a, stoppingToken);
var agrupacionesEnDb = await dbContext.AgrupacionesPoliticas.ToDictionaryAsync(a => a.Id, a => a, stoppingToken);
// --- 2. ITERAR PARA SINCRONIZAR ÁMBITOS Y AGRUPACIONES ---
foreach (var categoria in distinctCategorias)
{
if (stoppingToken.IsCancellationRequested) break;
_logger.LogInformation("--- Sincronizando Ámbitos y Agrupaciones para la categoría: {Nombre} (ID: {Id}) ---", categoria.Nombre, categoria.CategoriaId);
_logger.LogInformation("--- Sincronizando datos para la categoría: {Nombre} (ID: {Id}) ---", categoria.Nombre, categoria.CategoriaId);
var catalogoDto = await _apiService.GetCatalogoAmbitosAsync(_authToken, categoria.CategoriaId);
if (catalogoDto != null)
{
// SINCRONIZAR ÁMBITOS
// Usamos una clave compuesta para identificar unívocamente cada ámbito geográfico
var ambitosEnDb = await dbContext.AmbitosGeograficos.ToDictionaryAsync(a => (a.DistritoId, a.SeccionId, a.MunicipioId), a => a, stoppingToken);
foreach (var ambitoDto in catalogoDto.Ambitos)
{
var claveUnica = (ambitoDto.CodigoAmbitos.DistritoId, ambitoDto.CodigoAmbitos.SeccionId, ambitoDto.CodigoAmbitos.MunicipioId);
if (ambitosEnDb.TryGetValue(claveUnica, out var ambitoExistente))
// CLAVE ÚNICA CORREGIDA Y MÁS COMPLETA
var claveUnica = (
ambitoDto.CodigoAmbitos.DistritoId,
ambitoDto.CodigoAmbitos.SeccionId,
ambitoDto.CodigoAmbitos.MunicipioId,
ambitoDto.CodigoAmbitos.CircuitoId,
ambitoDto.CodigoAmbitos.EstablecimientoId
);
if (!ambitosEnDb.ContainsKey(claveUnica))
{
// Actualizar datos descriptivos
ambitoExistente.Nombre = ambitoDto.Nombre;
ambitoExistente.NivelId = ambitoDto.NivelId;
}
else
{
// Añadir nuevo ámbito
dbContext.AmbitosGeograficos.Add(new AmbitoGeografico
var nuevoAmbito = new AmbitoGeografico
{
Nombre = ambitoDto.Nombre,
NivelId = ambitoDto.NivelId,
DistritoId = ambitoDto.CodigoAmbitos.DistritoId,
SeccionId = ambitoDto.CodigoAmbitos.SeccionId,
MunicipioId = ambitoDto.CodigoAmbitos.MunicipioId,
CircuitoId = ambitoDto.CodigoAmbitos.CircuitoId,
EstablecimientoId = ambitoDto.CodigoAmbitos.EstablecimientoId,
SeccionProvincialId = ambitoDto.CodigoAmbitos.SeccionProvincialId
});
};
dbContext.AmbitosGeograficos.Add(nuevoAmbito);
ambitosEnDb.Add(claveUnica, nuevoAmbito); // Añadimos al diccionario en memoria para evitar duplicados en el mismo ciclo
}
}
_logger.LogInformation("Sincronización de Ámbitos Geográficos completada para la categoría actual.");
// SINCRONIZAR AGRUPACIONES
var provincia = catalogoDto.Ambitos.FirstOrDefault(a => a.NivelId == 10);
if (provincia != null && provincia.CodigoAmbitos.DistritoId != null)
if (provincia != null && !string.IsNullOrEmpty(provincia.CodigoAmbitos.DistritoId))
{
var agrupacionesApi = await _apiService.GetAgrupacionesAsync(_authToken, provincia.CodigoAmbitos.DistritoId, categoria.CategoriaId);
if (agrupacionesApi != null && agrupacionesApi.Any())
{
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))
if (!agrupacionesEnDb.ContainsKey(agrupacionDto.IdAgrupacion))
{
// Actualizar datos descriptivos
agrupacionExistente.Nombre = agrupacionDto.NombreAgrupacion;
agrupacionExistente.IdTelegrama = agrupacionDto.IdAgrupacionTelegrama;
}
else
{
// Añadir nueva agrupación
dbContext.AgrupacionesPoliticas.Add(new AgrupacionPolitica
var nuevaAgrupacion = new AgrupacionPolitica
{
Id = agrupacionDto.IdAgrupacion,
IdTelegrama = agrupacionDto.IdAgrupacionTelegrama,
Nombre = agrupacionDto.NombreAgrupacion
});
};
dbContext.AgrupacionesPoliticas.Add(nuevaAgrupacion);
agrupacionesEnDb.Add(nuevaAgrupacion.Id, nuevaAgrupacion);
}
}
_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 Ámbitos para la categoría {Id}.", categoria.CategoriaId);
}
}
// --- 3. 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("{count} nuevos registros de catálogo han sido guardados en la base de datos.", cambiosGuardados);
_logger.LogInformation("Sincronización de catálogos maestros finalizada.");
}
catch (Exception ex)

View File

@@ -14,7 +14,7 @@ using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("Elecciones.Worker")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+75ff9d5593b957c5ae0d08223a689a95181172d5")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+69ddf2b2d24d4968c618c6fd9f38c1143625cdcd")]
[assembly: System.Reflection.AssemblyProductAttribute("Elecciones.Worker")]
[assembly: System.Reflection.AssemblyTitleAttribute("Elecciones.Worker")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]

View File

@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="GetEFProjectMetadata">
<MSBuild Condition=" '$(TargetFramework)' == '' "
Projects="$(MSBuildProjectFile)"
Targets="GetEFProjectMetadata"
Properties="TargetFramework=$(TargetFrameworks.Split(';')[0]);EFProjectMetadataFile=$(EFProjectMetadataFile)" />
<ItemGroup Condition=" '$(TargetFramework)' != '' ">
<EFProjectMetadata Include="AssemblyName: $(AssemblyName)" />
<EFProjectMetadata Include="Language: $(Language)" />
<EFProjectMetadata Include="OutputPath: $(OutputPath)" />
<EFProjectMetadata Include="Platform: $(Platform)" />
<EFProjectMetadata Include="PlatformTarget: $(PlatformTarget)" />
<EFProjectMetadata Include="ProjectAssetsFile: $(ProjectAssetsFile)" />
<EFProjectMetadata Include="ProjectDir: $(ProjectDir)" />
<EFProjectMetadata Include="RootNamespace: $(RootNamespace)" />
<EFProjectMetadata Include="RuntimeFrameworkVersion: $(RuntimeFrameworkVersion)" />
<EFProjectMetadata Include="TargetFileName: $(TargetFileName)" />
<EFProjectMetadata Include="TargetFrameworkMoniker: $(TargetFrameworkMoniker)" />
<EFProjectMetadata Include="Nullable: $(Nullable)" />
<EFProjectMetadata Include="TargetFramework: $(TargetFramework)" />
<EFProjectMetadata Include="TargetPlatformIdentifier: $(TargetPlatformIdentifier)" />
</ItemGroup>
<WriteLinesToFile Condition=" '$(TargetFramework)' != '' "
File="$(EFProjectMetadataFile)"
Lines="@(EFProjectMetadata)" />
</Target>
</Project>