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