Feat BancasWidget

This commit is contained in:
2025-09-04 11:27:12 -03:00
parent 8ce48b3a46
commit 5d0f2460f9
15 changed files with 397 additions and 130 deletions

View File

@@ -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);
}
}