Feat Widgets Tickers
This commit is contained in:
		| @@ -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 | ||||
|             } | ||||
|         }; | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user