Fix Panel de Resultados

This commit is contained in:
2025-09-22 17:56:04 -03:00
parent 5a8bee52d5
commit 67634ae947
8 changed files with 101 additions and 47 deletions

View File

@@ -215,7 +215,7 @@ using (var scope = app.Services.CreateScope())
Console.WriteLine("--> Seeded default configurations.");
}
// --- SEEDER FINAL Y AUTOSUFICIENTE: Resultados Nacionales de Simulación para todo el país ---
// --- SEEDER FINAL Y AUTOSUFICIENTE (CON DATOS DE RECUENTO) ---
using (var scope = app.Services.CreateScope())
{
var services = scope.ServiceProvider;
@@ -226,7 +226,7 @@ using (var scope = app.Services.CreateScope())
if (!context.ResultadosVotos.Any(r => r.EleccionId == eleccionNacionalId))
{
logger.LogInformation("--> No se encontraron datos para la elección nacional ID {EleccionId}. Generando datos de simulación para TODO EL PAÍS...", eleccionNacionalId);
logger.LogInformation("--> No se encontraron datos para la elección nacional ID {EleccionId}. Generando datos de simulación COMPLETOS...", eleccionNacionalId);
var eleccionNacional = await context.Elecciones.FindAsync(eleccionNacionalId) ?? new Eleccion { Id = eleccionNacionalId, Nombre = "Elecciones Nacionales 2025", Nivel = "Nacional", DistritoId = "00", Fecha = new DateOnly(2025, 10, 26) };
if (!context.Elecciones.Local.Any(e => e.Id == eleccionNacionalId)) context.Elecciones.Add(eleccionNacional);
@@ -255,72 +255,105 @@ using (var scope = app.Services.CreateScope())
await context.SaveChangesAsync();
logger.LogInformation("--> Verificados/creados los 24 ámbitos geográficos de Nivel 10.");
// --- INICIO DE LA LÓGICA DE CREACIÓN DE MUNICIPIOS DE EJEMPLO ---
logger.LogInformation("--> Verificando existencia de municipios (Nivel 30) para cada provincia...");
var provinciasEnDb = await context.AmbitosGeograficos.AsNoTracking().Where(a => a.NivelId == 10).ToListAsync();
foreach (var provincia in provinciasEnDb)
{
bool existenMunicipios = await context.AmbitosGeograficos.AnyAsync(a => a.NivelId == 30 && a.DistritoId == provincia.DistritoId);
if (!existenMunicipios)
if (!await context.AmbitosGeograficos.AnyAsync(a => a.NivelId == 30 && a.DistritoId == provincia.DistritoId))
{
logger.LogWarning("--> No se encontraron municipios para {Provincia}. Creando 5 municipios de ejemplo...", provincia.Nombre);
logger.LogWarning("--> No se encontraron municipios para {Provincia}. Creando 5 de ejemplo.", provincia.Nombre);
for (int i = 1; i <= 5; i++)
{
context.AmbitosGeograficos.Add(new AmbitoGeografico
{
Nombre = $"{provincia.Nombre} - Municipio de Ejemplo {i}",
NivelId = 30,
DistritoId = provincia.DistritoId
});
context.AmbitosGeograficos.Add(new AmbitoGeografico { Nombre = $"{provincia.Nombre} - Depto. {i}", NivelId = 30, DistritoId = provincia.DistritoId });
}
}
}
await context.SaveChangesAsync();
// --- FIN DE LA LÓGICA DE CREACIÓN DE MUNICIPIOS DE EJEMPLO ---
var todosLosPartidos = await context.AgrupacionesPoliticas.Take(5).ToListAsync();
if (!todosLosPartidos.Any()) {
logger.LogWarning("--> No hay agrupaciones políticas en la BD. No se pueden generar votos de simulación.");
logger.LogWarning("--> No hay partidos, no se pueden generar votos.");
return;
}
var nuevosResultados = new List<ResultadoVoto>();
var nuevosEstados = new List<EstadoRecuentoGeneral>();
var rand = new Random();
long totalVotosNacional = 0;
int totalMesasNacional = 0;
int totalMesasEscrutadasNacional = 0;
foreach (var provincia in provinciasEnDb)
{
var municipiosDeProvincia = await context.AmbitosGeograficos.AsNoTracking()
.Where(a => a.NivelId == 30 && a.DistritoId == provincia.DistritoId).ToListAsync();
var municipiosDeProvincia = await context.AmbitosGeograficos.AsNoTracking().Where(a => a.NivelId == 30 && a.DistritoId == provincia.DistritoId).ToListAsync();
if (!municipiosDeProvincia.Any()) continue;
logger.LogInformation("--> Generando votos para {Count} municipios en {Provincia}...", municipiosDeProvincia.Count, provincia.Nombre);
long totalVotosProvincia = 0;
int partidoIndex = rand.Next(todosLosPartidos.Count);
foreach (var municipio in municipiosDeProvincia)
{
var partidoGanador = todosLosPartidos[partidoIndex % todosLosPartidos.Count];
partidoIndex++;
nuevosResultados.Add(new ResultadoVoto {
EleccionId = eleccionNacional.Id, AmbitoGeograficoId = municipio.Id, CategoriaId = categoriaDiputadosNac.Id,
AgrupacionPoliticaId = partidoGanador.Id, CantidadVotos = rand.Next(25000, 70000)
});
var otrosPartidos = todosLosPartidos.Where(p => p.Id != partidoGanador.Id).OrderBy(p => rand.Next()).Take(rand.Next(3, 6));
var partidoGanador = todosLosPartidos[partidoIndex++ % todosLosPartidos.Count];
var votosGanador = rand.Next(25000, 70000);
nuevosResultados.Add(new ResultadoVoto { EleccionId = eleccionNacionalId, AmbitoGeograficoId = municipio.Id, CategoriaId = categoriaDiputadosNac.Id, AgrupacionPoliticaId = partidoGanador.Id, CantidadVotos = votosGanador });
totalVotosProvincia += votosGanador;
var otrosPartidos = todosLosPartidos.Where(p => p.Id != partidoGanador.Id).OrderBy(p => rand.Next()).Take(rand.Next(3, todosLosPartidos.Count));
foreach (var competidor in otrosPartidos) {
nuevosResultados.Add(new ResultadoVoto {
EleccionId = eleccionNacional.Id, AmbitoGeograficoId = municipio.Id, CategoriaId = categoriaDiputadosNac.Id,
AgrupacionPoliticaId = competidor.Id, CantidadVotos = rand.Next(1000, 24000)
});
var votosCompetidor = rand.Next(1000, 24000);
nuevosResultados.Add(new ResultadoVoto { EleccionId = eleccionNacionalId, AmbitoGeograficoId = municipio.Id, CategoriaId = categoriaDiputadosNac.Id, AgrupacionPoliticaId = competidor.Id, CantidadVotos = votosCompetidor });
totalVotosProvincia += votosCompetidor;
}
}
// --- LÓGICA DE DATOS DE RECUENTO POR PROVINCIA ---
var mesasEsperadasProvincia = municipiosDeProvincia.Count * rand.Next(15, 30);
var mesasTotalizadasProvincia = (int)(mesasEsperadasProvincia * (rand.Next(75, 99) / 100.0));
var cantidadElectoresProvincia = mesasEsperadasProvincia * 350;
var participacionProvincia = (decimal)(rand.Next(65, 85) / 100.0);
nuevosEstados.Add(new EstadoRecuentoGeneral {
EleccionId = eleccionNacionalId, AmbitoGeograficoId = provincia.Id, CategoriaId = categoriaDiputadosNac.Id,
FechaTotalizacion = DateTime.UtcNow,
MesasEsperadas = mesasEsperadasProvincia,
MesasTotalizadas = mesasTotalizadasProvincia,
MesasTotalizadasPorcentaje = (decimal)mesasTotalizadasProvincia * 100 / mesasEsperadasProvincia,
CantidadElectores = cantidadElectoresProvincia,
CantidadVotantes = (int)(cantidadElectoresProvincia * participacionProvincia),
ParticipacionPorcentaje = participacionProvincia * 100
});
totalVotosNacional += totalVotosProvincia;
totalMesasNacional += mesasEsperadasProvincia;
totalMesasEscrutadasNacional += mesasTotalizadasProvincia;
}
// --- LÓGICA DE DATOS DE RECUENTO A NIVEL NACIONAL ---
var ambitoNacional = await context.AmbitosGeograficos.AsNoTracking().FirstOrDefaultAsync(a => a.NivelId == 0);
if (ambitoNacional == null) {
ambitoNacional = new AmbitoGeografico { Nombre = "Nacional", NivelId = 0, DistritoId = "00" };
context.AmbitosGeograficos.Add(ambitoNacional);
await context.SaveChangesAsync();
}
var participacionNacional = (decimal)(rand.Next(70, 88) / 100.0);
nuevosEstados.Add(new EstadoRecuentoGeneral {
EleccionId = eleccionNacionalId, AmbitoGeograficoId = ambitoNacional.Id, CategoriaId = categoriaDiputadosNac.Id,
FechaTotalizacion = DateTime.UtcNow,
MesasEsperadas = totalMesasNacional,
MesasTotalizadas = totalMesasEscrutadasNacional,
MesasTotalizadasPorcentaje = (decimal)totalMesasEscrutadasNacional * 100 / totalMesasNacional,
CantidadElectores = totalMesasNacional * 350,
CantidadVotantes = (int)((totalMesasNacional * 350) * participacionNacional),
ParticipacionPorcentaje = participacionNacional * 100
});
if (nuevosResultados.Any()) {
await context.ResultadosVotos.AddRangeAsync(nuevosResultados);
await context.EstadosRecuentosGenerales.AddRangeAsync(nuevosEstados);
await context.SaveChangesAsync();
logger.LogInformation("--> Se generaron {Count} registros de votos de simulación para todo el país.", nuevosResultados.Count);
logger.LogInformation("--> Se generaron {Votos} registros de votos y {Estados} de estados de recuento.", nuevosResultados.Count, nuevosEstados.Count);
} else {
logger.LogWarning("--> No se encontraron municipios en la BD para generar votos de simulación.");
logger.LogWarning("--> No se generaron datos de simulación.");
}
}
}