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