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