FEat Widgets Tablas
This commit is contained in:
		| @@ -874,4 +874,83 @@ public class ResultadosController : ControllerBase | ||||
|             ResultadosPorMunicipio = resultadosPorMunicipio | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     [HttpGet("ranking-municipios-por-seccion/{seccionId}")] | ||||
|     public async Task<IActionResult> GetRankingMunicipiosPorSeccion(string seccionId) | ||||
|     { | ||||
|         // 1. Obtener los municipios de la sección | ||||
|         var municipios = await _dbContext.AmbitosGeograficos.AsNoTracking() | ||||
|             .Where(a => a.NivelId == 30 && a.SeccionProvincialId == seccionId) | ||||
|             .OrderBy(a => a.Nombre) | ||||
|             .Select(a => new { a.Id, a.Nombre }) | ||||
|             .ToListAsync(); | ||||
|  | ||||
|         if (!municipios.Any()) | ||||
|         { | ||||
|             return Ok(new List<object>()); | ||||
|         } | ||||
|  | ||||
|         var municipiosIds = municipios.Select(m => m.Id).ToList(); | ||||
|  | ||||
|         // 2. Obtener todos los resultados de esos municipios en una sola consulta | ||||
|         var resultadosCrudos = await _dbContext.ResultadosVotos.AsNoTracking() | ||||
|             .Include(r => r.AgrupacionPolitica) | ||||
|             .Where(r => municipiosIds.Contains(r.AmbitoGeograficoId)) | ||||
|             .ToListAsync(); | ||||
|  | ||||
|         // 3. Procesar los datos por cada municipio | ||||
|         var resultadosPorMunicipio = municipios.Select(municipio => | ||||
|         { | ||||
|             // Filtramos los resultados solo para el municipio actual | ||||
|             var resultadosDelMunicipio = resultadosCrudos.Where(r => r.AmbitoGeograficoId == municipio.Id); | ||||
|  | ||||
|             // Agrupamos por categoría (Senadores, Concejales, etc.) | ||||
|             var resultadosPorCategoria = resultadosDelMunicipio | ||||
|                 .GroupBy(r => r.CategoriaId) | ||||
|                 .Select(g => | ||||
|                 { | ||||
|                     var totalVotosCategoria = (decimal)g.Sum(r => r.CantidadVotos); | ||||
|  | ||||
|                     // Obtenemos los 2 partidos con más votos para esta categoría EN ESTE MUNICIPIO | ||||
|                     var ranking = g | ||||
|                         .OrderByDescending(r => r.CantidadVotos) | ||||
|                         .Take(2) | ||||
|                         .Select(r => new | ||||
|                         { | ||||
|                             NombreCorto = r.AgrupacionPolitica.NombreCorto ?? r.AgrupacionPolitica.Nombre, | ||||
|                             Porcentaje = totalVotosCategoria > 0 ? (r.CantidadVotos / totalVotosCategoria) * 100 : 0 | ||||
|                         }) | ||||
|                         .ToList(); | ||||
|  | ||||
|                     return new | ||||
|                     { | ||||
|                         CategoriaId = g.Key, | ||||
|                         Ranking = ranking | ||||
|                     }; | ||||
|                 }) | ||||
|                 .ToDictionary(r => r.CategoriaId); // Lo convertimos a diccionario para fácil acceso | ||||
|  | ||||
|             return new | ||||
|             { | ||||
|                 MunicipioId = municipio.Id, | ||||
|                 MunicipioNombre = municipio.Nombre, | ||||
|                 ResultadosPorCategoria = resultadosPorCategoria | ||||
|             }; | ||||
|         }).ToList(); | ||||
|  | ||||
|         // Devolvemos las categorías que tuvieron resultados en esta sección para construir la cabecera | ||||
|         var categoriasMap = await _dbContext.CategoriasElectorales.AsNoTracking().ToDictionaryAsync(c => c.Id); | ||||
|         var categoriasActivas = resultadosCrudos | ||||
|             .Select(r => r.CategoriaId).Distinct() | ||||
|             .Select(id => categoriasMap.GetValueOrDefault(id)).Where(c => c != null) | ||||
|             .OrderBy(c => c!.Orden) | ||||
|             .Select(c => new { Id = c!.Id, Nombre = c.Nombre }) | ||||
|             .ToList(); | ||||
|  | ||||
|         return Ok(new | ||||
|         { | ||||
|             Categorias = categoriasActivas, | ||||
|             Resultados = resultadosPorMunicipio | ||||
|         }); | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user