Fix Selectores
This commit is contained in:
		| @@ -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(); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user