Fix Selectores

This commit is contained in:
2025-09-07 20:12:03 -03:00
parent 50d3c6bce9
commit 7f49362e55
9 changed files with 45 additions and 39 deletions

View File

@@ -21,35 +21,33 @@ public class CatalogosController : ControllerBase
{
var municipiosQuery = _dbContext.AmbitosGeograficos
.AsNoTracking()
.Where(a => a.NivelId == 30 && !string.IsNullOrEmpty(a.SeccionId));
.Where(a => a.NivelId == 30);
if (categoriaId == null)
// --- LÓGICA UNIFICADA ---
// Si hay una categoría, primero filtramos los municipios que son relevantes.
if (categoriaId.HasValue)
{
var todosLosMunicipios = await municipiosQuery
.OrderBy(a => a.Nombre)
.Select(a => new { id = a.SeccionId, a.Nombre })
var municipiosActivosIds = await _dbContext.ResultadosVotos
.AsNoTracking()
.Where(rv => rv.CategoriaId == categoriaId && rv.AmbitoGeografico.NivelId == 30)
.Select(rv => rv.AmbitoGeografico.SeccionId)
.Distinct()
.ToListAsync();
return Ok(todosLosMunicipios);
if (!municipiosActivosIds.Any()) return Ok(new List<object>());
municipiosQuery = municipiosQuery.Where(m => m.SeccionId != null && municipiosActivosIds.Contains(m.SeccionId));
}
// --- LÓGICA DE FILTRADO CORREGIDA Y SIMPLIFICADA ---
// Un municipio vota para una categoría legislativa si su sección electoral
// tiene proyecciones de bancas para esa categoría.
var seccionesConProyeccion = await _dbContext.ProyeccionesBancas
.AsNoTracking()
.Where(p => p.CategoriaId == categoriaId)
.Select(p => p.AmbitoGeografico.SeccionProvincialId)
.Distinct()
// Devolvemos siempre la misma estructura: { Id, Nombre }
// donde 'Id' es el SeccionId, que es el que se usa en las URLs de resultados.
var municipios = await municipiosQuery
.OrderBy(a => a.Nombre)
.Select(a => new { Id = a.SeccionId, a.Nombre })
.ToListAsync();
var municipiosFiltrados = await municipiosQuery
.Where(m => m.SeccionProvincialId != null && seccionesConProyeccion.Contains(m.SeccionProvincialId))
.OrderBy(m => m.Nombre)
.Select(m => new { id = m.SeccionId, m.Nombre })
.ToListAsync();
return Ok(municipiosFiltrados);
return Ok(municipios);
}
[HttpGet("agrupaciones")]
@@ -69,7 +67,6 @@ public class CatalogosController : ControllerBase
.AsNoTracking()
.Where(a => a.NivelId == 20); // Nivel 20 = Sección Electoral
// Si NO se proporciona una categoriaId, devolvemos todas las secciones.
if (categoriaId == null)
{
var todasLasSecciones = await seccionesQuery
@@ -79,19 +76,25 @@ public class CatalogosController : ControllerBase
return Ok(todasLasSecciones);
}
// --- LÓGICA DE FILTRADO ---
// 1. Encontrar las Secciones Provinciales que SÍ tienen resultados para la categoría solicitada.
// Usamos ProyeccionesBancas como fuente de verdad, ya que es el dato más relevante.
var seccionesActivasIds = await _dbContext.ProyeccionesBancas
// --- LÓGICA DE FILTRADO CORREGIDA Y MÁS ROBUSTA ---
// Usamos los ResultadosVotos como fuente, ya que es más probable que existan
// que las proyecciones de bancas en todo momento.
// Buscamos los municipios que tienen votos para esta categoría.
var municipiosConVotos = await _dbContext.ResultadosVotos
.AsNoTracking()
.Where(p => p.CategoriaId == categoriaId)
.Select(p => p.AmbitoGeografico.SeccionProvincialId)
.Where(rv => rv.CategoriaId == categoriaId)
.Select(rv => rv.AmbitoGeografico.SeccionProvincialId) // De aquí sacamos la sección electoral
.Distinct()
.ToListAsync();
// 2. Filtramos la lista de secciones.
if (!municipiosConVotos.Any())
{
// Si no hay ningún voto en absoluto, devolvemos vacío (esto es correcto).
return Ok(new List<object>());
}
var seccionesFiltradas = await seccionesQuery
.Where(s => seccionesActivasIds.Contains(s.SeccionProvincialId))
.Where(s => s.SeccionProvincialId != null && municipiosConVotos.Contains(s.SeccionProvincialId))
.OrderBy(a => a.Nombre)
.Select(a => new { Id = a.SeccionProvincialId, a.Nombre })
.ToListAsync();