Fix Mapa
This commit is contained in:
		| @@ -22,6 +22,29 @@ public class ResultadosController : ControllerBase | ||||
|         _configuration = configuration; | ||||
|     } | ||||
|  | ||||
|     private string? GetLogoUrl( | ||||
|         string agrupacionId, | ||||
|         int categoriaId, | ||||
|         int? ambitoId, | ||||
|         List<LogoAgrupacionCategoria> todosLosLogos) | ||||
|     { | ||||
|         // Prioridad 1: Buscar un logo específico para este partido, categoría Y ámbito. | ||||
|         var logoEspecifico = todosLosLogos.FirstOrDefault(l => | ||||
|             l.AgrupacionPoliticaId == agrupacionId && | ||||
|             l.CategoriaId == categoriaId && | ||||
|             l.AmbitoGeograficoId == ambitoId); | ||||
|  | ||||
|         if (logoEspecifico != null) return logoEspecifico.LogoUrl; | ||||
|  | ||||
|         // Prioridad 2: Si no hay uno específico, buscar un logo general (sin ámbito) para este partido y categoría. | ||||
|         var logoGeneral = todosLosLogos.FirstOrDefault(l => | ||||
|             l.AgrupacionPoliticaId == agrupacionId && | ||||
|             l.CategoriaId == categoriaId && | ||||
|             l.AmbitoGeograficoId == null); | ||||
|  | ||||
|         return logoGeneral?.LogoUrl; | ||||
|     } | ||||
|  | ||||
|     [HttpGet("partido/{municipioId}")] | ||||
|     public async Task<IActionResult> GetResultadosPorPartido(string municipioId, [FromQuery] int categoriaId) | ||||
|     { | ||||
| @@ -117,53 +140,55 @@ public class ResultadosController : ControllerBase | ||||
|             .Where(r => r.AmbitoGeografico.NivelId == 30) // Nivel 30 = Municipio | ||||
|             .ToListAsync(); | ||||
|  | ||||
|         var logos = await _dbContext.LogosAgrupacionesCategorias.AsNoTracking().ToListAsync(); | ||||
|         // Obtenemos TODOS los logos relevantes en una sola consulta | ||||
|         var todosLosLogos = await _dbContext.LogosAgrupacionesCategorias.AsNoTracking().ToListAsync(); | ||||
|  | ||||
|         // --- LÓGICA DE AGRUPACIÓN Y CÁLCULO CORREGIDA --- | ||||
|         var resultadosAgrupados = resultadosPorMunicipio | ||||
|             .GroupBy(r => r.CategoriaId) | ||||
|             .Select(g => new | ||||
|             { | ||||
|                 CategoriaId = g.Key, | ||||
|                 CategoriaNombre = estadosPorCategoria.ContainsKey(g.Key) ? estadosPorCategoria[g.Key].CategoriaElectoral.Nombre : "Desconocido", | ||||
|                 EstadoRecuento = estadosPorCategoria.GetValueOrDefault(g.Key), | ||||
|                 TotalVotosCategoria = g.Sum(r => r.CantidadVotos), | ||||
|                 // Agrupamos por el ID de la agrupación, no por el objeto, para evitar duplicados | ||||
|                 ResultadosAgrupados = g.GroupBy(r => r.AgrupacionPoliticaId) | ||||
|         .GroupBy(r => r.CategoriaId) | ||||
|         .Select(g => new | ||||
|         { | ||||
|             CategoriaId = g.Key, | ||||
|             CategoriaNombre = estadosPorCategoria.ContainsKey(g.Key) ? estadosPorCategoria[g.Key].CategoriaElectoral.Nombre : "Desconocido", | ||||
|             EstadoRecuento = estadosPorCategoria.GetValueOrDefault(g.Key), | ||||
|             TotalVotosCategoria = g.Sum(r => r.CantidadVotos), | ||||
|             // Agrupamos por el ID de la agrupación, no por el objeto, para evitar duplicados | ||||
|             ResultadosAgrupados = g.GroupBy(r => r.AgrupacionPoliticaId) | ||||
|                                        .Select(partidoGroup => new | ||||
|                                        { | ||||
|                                            Agrupacion = partidoGroup.First().AgrupacionPolitica, | ||||
|                                            Votos = partidoGroup.Sum(r => r.CantidadVotos) | ||||
|                                        }) | ||||
|                                        .ToList() | ||||
|             }) | ||||
|         }) | ||||
|             .Select(g => new | ||||
|             { | ||||
|                 g.CategoriaId, | ||||
|                 g.CategoriaNombre, | ||||
|                 g.EstadoRecuento, | ||||
|                 Resultados = g.ResultadosAgrupados | ||||
|                               .Select(r => | ||||
|                               { | ||||
|                                   var logoUrl = logos.FirstOrDefault(l => l.AgrupacionPoliticaId == r.Agrupacion.Id && l.CategoriaId == g.CategoriaId && l.AmbitoGeograficoId != null)?.LogoUrl | ||||
|                                              ?? logos.FirstOrDefault(l => l.AgrupacionPoliticaId == r.Agrupacion.Id && l.CategoriaId == g.CategoriaId && l.AmbitoGeograficoId == null)?.LogoUrl; | ||||
|                           .Select(r => | ||||
|                           { | ||||
|                               // --- USAMOS EL NUEVO MÉTODO HELPER --- | ||||
|                               // Para el resumen provincial, el ámbito es siempre el de la provincia. | ||||
|                               var logoUrl = GetLogoUrl(r.Agrupacion.Id, g.CategoriaId, provincia.Id, todosLosLogos); | ||||
|  | ||||
|                                   return new | ||||
|                                   { | ||||
|                                       Id = r.Agrupacion.Id, | ||||
|                                       r.Agrupacion.Nombre, | ||||
|                                       r.Agrupacion.NombreCorto, | ||||
|                                       r.Agrupacion.Color, | ||||
|                                       LogoUrl = logoUrl, | ||||
|                                       r.Votos, | ||||
|                                       Porcentaje = g.TotalVotosCategoria > 0 ? ((decimal)r.Votos * 100 / g.TotalVotosCategoria) : 0 | ||||
|                                   }; | ||||
|                               }) | ||||
|                               .OrderByDescending(r => r.Votos) | ||||
|                               .ToList() | ||||
|                               return new | ||||
|                               { | ||||
|                                   Id = r.Agrupacion.Id, | ||||
|                                   r.Agrupacion.Nombre, | ||||
|                                   r.Agrupacion.NombreCorto, | ||||
|                                   r.Agrupacion.Color, | ||||
|                                   LogoUrl = logoUrl, | ||||
|                                   r.Votos, | ||||
|                                   Porcentaje = g.TotalVotosCategoria > 0 ? ((decimal)r.Votos * 100 / g.TotalVotosCategoria) : 0 | ||||
|                               }; | ||||
|                           }) | ||||
|                           .OrderByDescending(r => r.Votos) | ||||
|                           .ToList() | ||||
|             }) | ||||
|             .OrderBy(c => c.CategoriaId) | ||||
|             .ToList(); | ||||
|         .OrderBy(c => c.CategoriaId) | ||||
|         .ToList(); | ||||
|  | ||||
|         return Ok(resultadosAgrupados); | ||||
|     } | ||||
| @@ -436,13 +461,33 @@ public class ResultadosController : ControllerBase | ||||
|  | ||||
|     private async Task<IActionResult> GetComposicionDesdeProyecciones(Dictionary<string, string> config) | ||||
|     { | ||||
|         // --- INICIO DE LA CORRECCIÓN --- | ||||
|         // 1. Obtenemos el ID del ámbito provincial para usarlo en el filtro. | ||||
|         var provincia = await _dbContext.AmbitosGeograficos.AsNoTracking() | ||||
|             .FirstOrDefaultAsync(a => a.NivelId == 10); | ||||
|  | ||||
|         if (provincia == null) | ||||
|         { | ||||
|             // Si no se encuentra la provincia, no podemos continuar. | ||||
|             // Devolvemos un objeto vacío para no romper el frontend. | ||||
|             return Ok(new | ||||
|             { | ||||
|                 Diputados = new { Partidos = new List<object>() }, | ||||
|                 Senadores = new { Partidos = new List<object>() } | ||||
|             }); | ||||
|         } | ||||
|         // --- FIN DE LA CORRECCIÓN --- | ||||
|  | ||||
|         var bancasPorAgrupacion = await _dbContext.ProyeccionesBancas | ||||
|             .AsNoTracking() | ||||
|             // --- CAMBIO CLAVE: Añadimos el filtro por AmbitoGeograficoId --- | ||||
|             .Where(p => p.AmbitoGeograficoId == provincia.Id) | ||||
|             .GroupBy(p => new { p.AgrupacionPoliticaId, p.CategoriaId }) | ||||
|             .Select(g => new | ||||
|             { | ||||
|                 AgrupacionId = g.Key.AgrupacionPoliticaId, | ||||
|                 CategoriaId = g.Key.CategoriaId, | ||||
|                 // Ahora la suma es correcta porque solo considera los registros a nivel provincial | ||||
|                 BancasTotales = g.Sum(p => p.NroBancas) | ||||
|             }) | ||||
|             .ToListAsync(); | ||||
| @@ -638,12 +683,20 @@ public class ResultadosController : ControllerBase | ||||
|             .GroupBy(r => r.AmbitoGeografico.SeccionProvincialId) | ||||
|             .Select(g => | ||||
|             { | ||||
|                 // --- INICIO DE LA CORRECCIÓN --- | ||||
|                 // Para cada sección, encontramos al partido con más votos. | ||||
|                 var ganador = g | ||||
|                     .GroupBy(r => r.AgrupacionPolitica) | ||||
|                     .Select(pg => new { Agrupacion = pg.Key, TotalVotos = pg.Sum(r => r.CantidadVotos) }) | ||||
|                     // CAMBIO CLAVE: Agrupamos por el ID de la agrupación, no por el objeto. | ||||
|                     .GroupBy(r => r.AgrupacionPolitica.Id) | ||||
|                     .Select(pg => new | ||||
|                     { | ||||
|                         // Obtenemos la entidad completa del primer elemento del grupo | ||||
|                         Agrupacion = pg.First().AgrupacionPolitica, | ||||
|                         TotalVotos = pg.Sum(r => r.CantidadVotos) | ||||
|                     }) | ||||
|                     .OrderByDescending(x => x.TotalVotos) | ||||
|                     .FirstOrDefault(); | ||||
|                 // --- FIN DE LA CORRECCIÓN --- | ||||
|  | ||||
|                 // Buscamos el nombre de la sección | ||||
|                 var seccionInfo = _dbContext.AmbitosGeograficos | ||||
| @@ -657,7 +710,7 @@ public class ResultadosController : ControllerBase | ||||
|                     ColorGanador = ganador?.Agrupacion.Color | ||||
|                 }; | ||||
|             }) | ||||
|             .Where(r => r.SeccionId != null) // Filtramos cualquier posible nulo | ||||
|             .Where(r => r.SeccionId != null) | ||||
|             .ToList(); | ||||
|  | ||||
|         return Ok(ganadoresPorSeccion); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user