Feat BancasWidget
This commit is contained in:
		| @@ -160,15 +160,29 @@ public class ResultadosController : ControllerBase | ||||
|     } | ||||
|  | ||||
|  | ||||
|     [HttpGet("bancas/{seccionId}")] | ||||
|     public async Task<IActionResult> GetBancasPorSeccion(string seccionId) | ||||
|     [HttpGet("bancas-por-seccion/{seccionId}/{camara}")] // <-- CAMBIO 1: Modificar la ruta | ||||
|     public async Task<IActionResult> GetBancasPorSeccion(string seccionId, string camara) // <-- CAMBIO 2: Añadir el nuevo parámetro | ||||
|     { | ||||
|         // 1. Buscamos el ámbito usando 'SeccionProvincialId'. | ||||
|         // La API oficial usa este campo para las secciones electorales. | ||||
|         // Además, el worker guarda estas secciones con NivelId = 20, por lo que lo usamos aquí para consistencia. | ||||
|         // Convertimos el string de la cámara a un enum o un valor numérico para la base de datos | ||||
|         // 0 = Diputados, 1 = Senadores. Esto debe coincidir con cómo lo guardas en la DB. | ||||
|         // O puedes usar un enum si lo tienes definido. | ||||
|         int CategoriaId; | ||||
|         if (camara.Equals("diputados", StringComparison.OrdinalIgnoreCase)) | ||||
|         { | ||||
|             CategoriaId = 6; // Asume que 5 es el CategoriaId para Diputados Provinciales | ||||
|         } | ||||
|         else if (camara.Equals("senadores", StringComparison.OrdinalIgnoreCase)) | ||||
|         { | ||||
|             CategoriaId = 5; // Asume que 6 es el CategoriaId para Senadores Provinciales | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             return BadRequest(new { message = "El tipo de cámara especificado no es válido. Use 'diputados' o 'senadores'." }); | ||||
|         } | ||||
|  | ||||
|         var seccion = await _dbContext.AmbitosGeograficos | ||||
|             .AsNoTracking() | ||||
|             .FirstOrDefaultAsync(a => a.SeccionProvincialId == seccionId && a.NivelId == 20); // Nivel 20 = Sección Electoral Provincial | ||||
|             .FirstOrDefaultAsync(a => a.SeccionProvincialId == seccionId && a.NivelId == 20); | ||||
|  | ||||
|         if (seccion == null) | ||||
|         { | ||||
| @@ -176,14 +190,17 @@ public class ResultadosController : ControllerBase | ||||
|             return NotFound(new { message = $"No se encontró la sección electoral con ID {seccionId}" }); | ||||
|         } | ||||
|  | ||||
|         // 2. Buscamos todas las proyecciones para ese ámbito (usando su clave primaria 'Id') | ||||
|         // --- CAMBIO 3: Filtrar también por el cargo (cámara) --- | ||||
|         var proyecciones = await _dbContext.ProyeccionesBancas | ||||
|             .AsNoTracking() | ||||
|             .Include(p => p.AgrupacionPolitica) | ||||
|             .Where(p => p.AmbitoGeograficoId == seccion.Id) | ||||
|             .Where(p => p.AmbitoGeograficoId == seccion.Id && p.CategoriaId == CategoriaId) // <-- AÑADIDO EL FILTRO | ||||
|             .Select(p => new | ||||
|             { | ||||
|                 AgrupacionId = p.AgrupacionPolitica.Id, // Añadir para el 'key' en React | ||||
|                 AgrupacionNombre = p.AgrupacionPolitica.Nombre, | ||||
|                 NombreCorto = p.AgrupacionPolitica.NombreCorto, // Añadir para el frontend | ||||
|                 Color = p.AgrupacionPolitica.Color, // Añadir para el frontend | ||||
|                 Bancas = p.NroBancas | ||||
|             }) | ||||
|             .OrderByDescending(p => p.Bancas) | ||||
| @@ -191,12 +208,10 @@ public class ResultadosController : ControllerBase | ||||
|  | ||||
|         if (!proyecciones.Any()) | ||||
|         { | ||||
|             // Este caso es posible si aún no hay proyecciones calculadas para esta sección. | ||||
|             _logger.LogWarning("No se encontraron proyecciones de bancas para la sección: {SeccionNombre}", seccion.Nombre); | ||||
|             return NotFound(new { message = $"No se han encontrado proyecciones de bancas para la sección {seccion.Nombre}" }); | ||||
|             _logger.LogWarning("No se encontraron proyecciones de bancas para la sección: {SeccionNombre} y cámara: {Camara}", seccion.Nombre, camara); | ||||
|             return NotFound(new { message = $"No se han encontrado proyecciones de bancas para la sección {seccion.Nombre} ({camara})" }); | ||||
|         } | ||||
|  | ||||
|         // 3. Devolvemos la respuesta | ||||
|         return Ok(new | ||||
|         { | ||||
|             SeccionNombre = seccion.Nombre, | ||||
| @@ -721,4 +736,41 @@ public class ResultadosController : ControllerBase | ||||
|  | ||||
|         return Ok(resultadoFinal); | ||||
|     } | ||||
|  | ||||
|     [HttpGet("secciones-electorales-con-cargos")] | ||||
|     public async Task<IActionResult> GetSeccionesElectoralesConCargos() | ||||
|     { | ||||
|         var secciones = await _dbContext.AmbitosGeograficos | ||||
|             .AsNoTracking() | ||||
|             .Where(a => a.NivelId == 20) // Nivel 20 = Sección Electoral Provincial | ||||
|             .Select(a => new | ||||
|             { | ||||
|                 Id = a.SeccionProvincialId, // Usamos el ID que el frontend espera | ||||
|                 Nombre = a.Nombre, | ||||
|                 // Obtenemos los CategoriaId de las relaciones que tiene esta sección. | ||||
|                 // Esto asume que tienes una tabla que relaciona Ámbitos con Cargos. | ||||
|                 // Por ejemplo, a través de la tabla de Proyecciones o Resultados. | ||||
|                 Cargos = _dbContext.ProyeccionesBancas | ||||
|                             .Where(p => p.AmbitoGeograficoId == a.Id) | ||||
|                             .Select(p => p.CategoriaId) | ||||
|                             .Distinct() | ||||
|                             .ToList() | ||||
|             }) | ||||
|             .ToListAsync(); | ||||
|  | ||||
|         // Mapeamos los CategoriaId a los nombres que usa el frontend | ||||
|         var resultado = secciones.Select(s => new | ||||
|         { | ||||
|             s.Id, | ||||
|             s.Nombre, | ||||
|             // Convertimos la lista de IDs de cargo a una lista de strings ("diputados", "senadores") | ||||
|             CamarasDisponibles = s.Cargos.Select(CategoriaId => | ||||
|                 CategoriaId == 6 ? "diputados" : // Asume 5 = Diputados | ||||
|                 CategoriaId == 5 ? "senadores" : // Asume 6 = Senadores | ||||
|                 null | ||||
|             ).Where(c => c != null).ToList() | ||||
|         }); | ||||
|  | ||||
|         return Ok(resultado); | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user