This commit is contained in:
2025-09-07 21:44:22 -03:00
parent 7f49362e55
commit fc97e29f13
7 changed files with 92 additions and 39 deletions

View File

@@ -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);