Feat Widgets Tickers

This commit is contained in:
2025-09-02 17:08:56 -03:00
parent 6ac6034255
commit 9393d2bc05
12 changed files with 203 additions and 62 deletions

View File

@@ -22,57 +22,34 @@ public class ResultadosController : ControllerBase
_configuration = configuration;
}
[HttpGet("partido/{seccionId}")] // 'seccionId' es el ID del municipio
public async Task<IActionResult> GetResultadosPorPartido(string seccionId)
[HttpGet("partido/{municipioId}")] // Renombramos el parámetro para mayor claridad
public async Task<IActionResult> GetResultadosPorPartido(string municipioId, [FromQuery] int categoriaId)
{
var ambito = await _dbContext.AmbitosGeograficos
.AsNoTracking()
.FirstOrDefaultAsync(a => a.SeccionId == seccionId && a.NivelId == 30);
var ambito = await _dbContext.AmbitosGeograficos.AsNoTracking()
.FirstOrDefaultAsync(a => a.SeccionId == municipioId && a.NivelId == 30);
if (ambito == null)
{
return NotFound(new { message = $"No se encontró el partido con ID {seccionId}" });
return NotFound(new { message = $"No se encontró el partido con ID {municipioId}" });
}
var estadoRecuento = await _dbContext.EstadosRecuentos
.AsNoTracking()
.FirstOrDefaultAsync(e => e.AmbitoGeograficoId == ambito.Id);
var estadoRecuento = await _dbContext.EstadosRecuentos.AsNoTracking()
.FirstOrDefaultAsync(e => e.AmbitoGeograficoId == ambito.Id && e.CategoriaId == categoriaId);
if (estadoRecuento == null)
{
return Ok(new MunicipioResultadosDto
{
MunicipioNombre = ambito.Nombre,
UltimaActualizacion = DateTime.UtcNow,
PorcentajeEscrutado = 0,
PorcentajeParticipacion = 0,
Resultados = new List<AgrupacionResultadoDto>(),
VotosAdicionales = new VotosAdicionalesDto()
});
}
// 1. Obtenemos los IDs de las agrupaciones que tienen resultados en este municipio
var agrupacionIds = await _dbContext.ResultadosVotos
.Where(rv => rv.AmbitoGeograficoId == ambito.Id)
.Select(rv => rv.AgrupacionPoliticaId)
.Distinct()
.ToListAsync();
.Where(rv => rv.AmbitoGeograficoId == ambito.Id && rv.CategoriaId == categoriaId)
.Select(rv => rv.AgrupacionPoliticaId).Distinct().ToListAsync();
// 2. Buscamos TODOS los logos relevantes en una sola consulta:
// - Los que son para la categoría Concejales (7)
// - Y pertenecen a los partidos que compiten aquí
// - Y son genéricos (sin ámbito) O específicos para ESTE municipio
var logosRelevantes = await _dbContext.LogosAgrupacionesCategorias
.AsNoTracking()
.Where(l => l.CategoriaId == 7 &&
var logosRelevantes = await _dbContext.LogosAgrupacionesCategorias.AsNoTracking()
.Where(l => l.CategoriaId == categoriaId && // <-- Usamos la categoría del parámetro
agrupacionIds.Contains(l.AgrupacionPoliticaId) &&
(l.AmbitoGeograficoId == null || l.AmbitoGeograficoId == ambito.Id))
.ToListAsync();
var resultadosVotos = await _dbContext.ResultadosVotos
.AsNoTracking()
var resultadosVotos = await _dbContext.ResultadosVotos.AsNoTracking()
.Include(rv => rv.AgrupacionPolitica)
.Where(rv => rv.AmbitoGeograficoId == ambito.Id)
// --- CORRECCIÓN: Usamos la 'categoriaId' que viene como parámetro ---
.Where(rv => rv.AmbitoGeograficoId == ambito.Id && rv.CategoriaId == categoriaId)
.ToListAsync();
long totalVotosPositivos = resultadosVotos.Sum(r => r.CantidadVotos);
@@ -80,17 +57,13 @@ public class ResultadosController : ControllerBase
var respuestaDto = new MunicipioResultadosDto
{
MunicipioNombre = ambito.Nombre,
UltimaActualizacion = estadoRecuento.FechaTotalizacion,
PorcentajeEscrutado = estadoRecuento.MesasTotalizadasPorcentaje,
PorcentajeParticipacion = estadoRecuento.ParticipacionPorcentaje,
UltimaActualizacion = estadoRecuento?.FechaTotalizacion ?? DateTime.UtcNow,
PorcentajeEscrutado = estadoRecuento?.MesasTotalizadasPorcentaje ?? 0,
PorcentajeParticipacion = estadoRecuento?.ParticipacionPorcentaje ?? 0,
Resultados = resultadosVotos.Select(rv =>
{
// --- LÓGICA DE FALLBACK ---
var logoUrl =
// 1. Buscamos primero el logo específico para este municipio.
logosRelevantes.FirstOrDefault(l => l.AgrupacionPoliticaId == rv.AgrupacionPoliticaId && l.AmbitoGeograficoId == ambito.Id)?.LogoUrl
// 2. Si no lo encontramos, buscamos el logo genérico (sin ámbito).
?? logosRelevantes.FirstOrDefault(l => l.AgrupacionPoliticaId == rv.AgrupacionPoliticaId && l.AmbitoGeograficoId == null)?.LogoUrl;
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;
return new AgrupacionResultadoDto
{
@@ -98,16 +71,16 @@ public class ResultadosController : ControllerBase
Nombre = rv.AgrupacionPolitica.Nombre,
NombreCorto = rv.AgrupacionPolitica.NombreCorto,
Color = rv.AgrupacionPolitica.Color,
LogoUrl = logoUrl, // Asignamos el logo encontrado
LogoUrl = logoUrl,
Votos = rv.CantidadVotos,
Porcentaje = totalVotosPositivos > 0 ? (rv.CantidadVotos * 100.0m / totalVotosPositivos) : 0
};
}).OrderByDescending(r => r.Votos).ToList(),
VotosAdicionales = new VotosAdicionalesDto
{
EnBlanco = estadoRecuento.VotosEnBlanco,
Nulos = estadoRecuento.VotosNulos,
Recurridos = estadoRecuento.VotosRecurridos
EnBlanco = estadoRecuento?.VotosEnBlanco ?? 0,
Nulos = estadoRecuento?.VotosNulos ?? 0,
Recurridos = estadoRecuento?.VotosRecurridos ?? 0
}
};