Fix Panel de Resultados
This commit is contained in:
		| @@ -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."); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user