Feat Widgets

Se añade la tabla CandidatosOverrides
Se añade el Overrides de Candidatos al panel de administrador
Se Añade el nombre de los candidatos a los Widgets de categorias por municipio
This commit is contained in:
2025-09-05 11:38:25 -03:00
parent 479c2c60f2
commit d78a02a0eb
23 changed files with 1033 additions and 38 deletions

View File

@@ -22,7 +22,7 @@ public class ResultadosController : ControllerBase
_configuration = configuration;
}
[HttpGet("partido/{municipioId}")] // Renombramos el parámetro para mayor claridad
[HttpGet("partido/{municipioId}")]
public async Task<IActionResult> GetResultadosPorPartido(string municipioId, [FromQuery] int categoriaId)
{
var ambito = await _dbContext.AmbitosGeograficos.AsNoTracking()
@@ -51,6 +51,11 @@ public class ResultadosController : ControllerBase
.Where(rv => rv.AmbitoGeograficoId == ambito.Id && rv.CategoriaId == categoriaId)
.ToListAsync();
var candidatosRelevantes = await _dbContext.CandidatosOverrides.AsNoTracking()
.Where(c => c.CategoriaId == categoriaId && agrupacionIds.Contains(c.AgrupacionPoliticaId) &&
(c.AmbitoGeograficoId == null || c.AmbitoGeograficoId == ambito.Id))
.ToListAsync();
long totalVotosPositivos = resultadosVotos.Sum(r => r.CantidadVotos);
var respuestaDto = new MunicipioResultadosDto
@@ -64,6 +69,9 @@ public class ResultadosController : ControllerBase
var logoUrl = logosRelevantes.FirstOrDefault(l => l.AgrupacionPoliticaId == rv.AgrupacionPoliticaId && l.AmbitoGeograficoId == ambito.Id)?.LogoUrl
?? logosRelevantes.FirstOrDefault(l => l.AgrupacionPoliticaId == rv.AgrupacionPoliticaId && l.AmbitoGeograficoId == null)?.LogoUrl;
var nombreCandidato = candidatosRelevantes.FirstOrDefault(c => c.AgrupacionPoliticaId == rv.AgrupacionPoliticaId && c.AmbitoGeograficoId == ambito.Id)?.NombreCandidato
?? candidatosRelevantes.FirstOrDefault(c => c.AgrupacionPoliticaId == rv.AgrupacionPoliticaId && c.AmbitoGeograficoId == null)?.NombreCandidato;
return new AgrupacionResultadoDto
{
Id = rv.AgrupacionPolitica.Id,
@@ -72,6 +80,7 @@ public class ResultadosController : ControllerBase
Color = rv.AgrupacionPolitica.Color,
LogoUrl = logoUrl,
Votos = rv.CantidadVotos,
NombreCandidato = nombreCandidato,
Porcentaje = totalVotosPositivos > 0 ? (rv.CantidadVotos * 100.0m / totalVotosPositivos) : 0
};
}).OrderByDescending(r => r.Votos).ToList(),
@@ -557,27 +566,18 @@ public class ResultadosController : ControllerBase
if (!municipiosDeLaSeccion.Any())
{
return Ok(new List<object>());
return Ok(new { UltimaActualizacion = DateTime.UtcNow, Resultados = new List<object>() });
}
// --- INICIO DE LA CORRECCIÓN ---
// --- INICIO DE LA CORRECCIÓN DE LOGOS ---
// 1. Obtenemos TODOS los logos para la categoría, sin convertirlos a diccionario todavía.
var todosLosLogos = await _dbContext.LogosAgrupacionesCategorias
// 1. Buscamos logos que sean para esta categoría Y que sean generales (ámbito null).
var logosGenerales = await _dbContext.LogosAgrupacionesCategorias
.AsNoTracking()
.Where(l => l.CategoriaId == categoriaId)
.ToListAsync();
.Where(l => l.CategoriaId == categoriaId && l.AmbitoGeograficoId == null)
.ToDictionaryAsync(l => l.AgrupacionPoliticaId);
// 2. Procesamos los logos en memoria para manejar duplicados, priorizando los que tienen ámbito.
// El resultado es un diccionario limpio sin claves duplicadas.
var logos = todosLosLogos
.GroupBy(l => l.AgrupacionPoliticaId) // Agrupamos por la clave que causa el problema
.ToDictionary(
g => g.Key, // La clave del diccionario es AgrupacionPoliticaId
g => g.OrderByDescending(l => l.AmbitoGeograficoId).First() // Para cada grupo, tomamos el logo más específico (el que tiene un AmbitoId) o el general si es el único.
);
// --- FIN DE LA CORRECCIÓN ---
// --- FIN DE LA CORRECCIÓN DE LOGOS ---
var resultadosMunicipales = await _dbContext.ResultadosVotos
.AsNoTracking()
@@ -601,7 +601,8 @@ public class ResultadosController : ControllerBase
r.Agrupacion.Nombre,
r.Agrupacion.NombreCorto,
r.Agrupacion.Color,
LogoUrl = logos.GetValueOrDefault(r.Agrupacion.Id)?.LogoUrl,
// 2. Usamos el diccionario de logos generales para buscar la URL.
LogoUrl = logosGenerales.GetValueOrDefault(r.Agrupacion.Id)?.LogoUrl,
Votos = r.Votos,
Porcentaje = totalVotosSeccion > 0 ? ((decimal)r.Votos * 100 / totalVotosSeccion) : 0
})