Fix bancas widget
This commit is contained in:
@@ -295,57 +295,33 @@ public class ResultadosController : ControllerBase
|
||||
.AsNoTracking()
|
||||
.ToDictionaryAsync(c => c.Clave, c => c.Valor);
|
||||
|
||||
// Aquí está el interruptor
|
||||
config.TryGetValue("UsarDatosDeBancadasOficiales", out var usarDatosOficialesValue);
|
||||
bool usarDatosOficiales = usarDatosOficialesValue == "true";
|
||||
|
||||
if (usarDatosOficiales)
|
||||
{
|
||||
// Si el interruptor está en 'true', llama a este método
|
||||
return await GetComposicionDesdeBancadasOficiales(config);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Si está en 'false' o no existe, llama a este otro
|
||||
return await GetComposicionDesdeProyecciones(config);
|
||||
}
|
||||
}
|
||||
|
||||
private async Task<IActionResult> GetComposicionDesdeBancadasOficiales(Dictionary<string, string> config)
|
||||
{
|
||||
config.TryGetValue("MostrarOcupantes", out var mostrarOcupantesValue);
|
||||
bool mostrarOcupantes = mostrarOcupantesValue == "true";
|
||||
|
||||
// Se declara la variable explícitamente como IQueryable<Bancada>
|
||||
IQueryable<Bancada> bancadasQuery = _dbContext.Bancadas.AsNoTracking()
|
||||
.Include(b => b.AgrupacionPolitica);
|
||||
|
||||
if (mostrarOcupantes)
|
||||
{
|
||||
// Ahora sí podemos añadir otro .Include() sin problemas de tipo
|
||||
bancadasQuery = bancadasQuery.Include(b => b.Ocupante);
|
||||
}
|
||||
|
||||
var bancadas = await bancadasQuery.ToListAsync();
|
||||
|
||||
// --- CAMBIO 2: Eliminar la carga manual de Ocupantes ---
|
||||
// Ya no necesitamos 'ocupantesLookup'. Se puede borrar todo este bloque:
|
||||
/*
|
||||
var ocupantesLookup = new Dictionary<int, OcupanteBanca>();
|
||||
if (mostrarOcupantes)
|
||||
{
|
||||
ocupantesLookup = (await _dbContext.OcupantesBancas.AsNoTracking()
|
||||
.ToListAsync())
|
||||
.ToDictionary(o => o.BancadaId);
|
||||
}
|
||||
*/
|
||||
var bancadas = await _dbContext.Bancadas.AsNoTracking()
|
||||
.Include(b => b.AgrupacionPolitica)
|
||||
.Include(b => b.Ocupante)
|
||||
.ToListAsync();
|
||||
|
||||
var bancasPorAgrupacion = bancadas
|
||||
.Where(b => b.AgrupacionPoliticaId != null)
|
||||
.GroupBy(b => new { b.AgrupacionPoliticaId, b.Camara })
|
||||
.Select(g => new
|
||||
{
|
||||
Agrupacion = g.First().AgrupacionPolitica,
|
||||
g.Key.Camara,
|
||||
BancasTotales = g.Count()
|
||||
})
|
||||
.Where(b => b.AgrupacionPolitica != null)
|
||||
.GroupBy(b => b.AgrupacionPolitica)
|
||||
.Select(g => new { Agrupacion = g.Key!, Camara = g.First().Camara, BancasTotales = g.Count() })
|
||||
.ToList();
|
||||
|
||||
var presidenteDiputados = bancasPorAgrupacion
|
||||
@@ -356,25 +332,14 @@ public class ResultadosController : ControllerBase
|
||||
config.TryGetValue("PresidenciaSenadores", out var idPartidoPresidenteSenadores);
|
||||
var presidenteSenadores = await _dbContext.AgrupacionesPoliticas.FindAsync(idPartidoPresidenteSenadores);
|
||||
|
||||
object MapearPartidos(Core.Enums.TipoCamara camara)
|
||||
object MapearPartidosOficial(Core.Enums.TipoCamara camara)
|
||||
{
|
||||
// 1. Filtramos las bancadas que nos interesan (por cámara y que tengan partido).
|
||||
var bancadasDeCamara = bancadas
|
||||
.Where(b => b.Camara == camara && b.AgrupacionPolitica != null);
|
||||
var partidosDeCamara = bancasPorAgrupacion.Where(b => b.Camara == camara);
|
||||
|
||||
// 2. --- ¡EL CAMBIO CLAVE ESTÁ AQUÍ! ---
|
||||
// Agrupamos por el ID de la Agrupación, no por el objeto.
|
||||
// Esto garantiza que todas las bancadas del mismo partido terminen en el MISMO grupo.
|
||||
var partidosDeCamara = bancadasDeCamara
|
||||
.GroupBy(b => b.AgrupacionPolitica!.Id)
|
||||
.Select(g => new
|
||||
{
|
||||
// La Agrupacion la podemos tomar del primer elemento del grupo,
|
||||
// ya que todas las bancadas del grupo pertenecen al mismo partido.
|
||||
Agrupacion = g.First().AgrupacionPolitica!,
|
||||
// g ahora contiene la lista COMPLETA de bancadas para esta agrupación.
|
||||
BancasDelPartido = g.ToList()
|
||||
});
|
||||
|
||||
// 3. Ordenamos, como antes, pero ahora sobre una lista de grupos correcta.
|
||||
var partidosOrdenados = (camara == Core.Enums.TipoCamara.Diputados)
|
||||
@@ -382,28 +347,19 @@ public class ResultadosController : ControllerBase
|
||||
: partidosDeCamara.OrderBy(p => p.Agrupacion.OrdenSenadores ?? 999);
|
||||
|
||||
// 4. Mapeamos al resultado final.
|
||||
return partidosOrdenados
|
||||
.ThenByDescending(p => p.BancasDelPartido.Count)
|
||||
.Select(p =>
|
||||
{
|
||||
// Ahora 'p.BancasDelPartido' contiene TODAS las bancadas del partido (en tu caso, las 2).
|
||||
// Cuando hagamos el .Select() aquí, recorrerá ambas y encontrará a los ocupantes.
|
||||
var ocupantesDelPartido = p.BancasDelPartido
|
||||
.Select(b => b.Ocupante)
|
||||
.Where(o => o != null)
|
||||
.ToList();
|
||||
|
||||
return new
|
||||
{
|
||||
p.Agrupacion.Id,
|
||||
p.Agrupacion.Nombre,
|
||||
p.Agrupacion.NombreCorto,
|
||||
p.Agrupacion.Color,
|
||||
BancasTotales = p.BancasDelPartido.Count,
|
||||
// ¡Esta lista ahora debería contener a tus 2 ocupantes!
|
||||
Ocupantes = mostrarOcupantes ? ocupantesDelPartido : new List<OcupanteBanca?>()
|
||||
};
|
||||
}).ToList();
|
||||
return partidosDeCamara.Select(p => new
|
||||
{
|
||||
p.Agrupacion.Id,
|
||||
p.Agrupacion.Nombre,
|
||||
p.Agrupacion.NombreCorto,
|
||||
p.Agrupacion.Color,
|
||||
p.BancasTotales,
|
||||
// Adjuntamos la lista de ocupantes para este partido
|
||||
Ocupantes = bancadas
|
||||
.Where(b => b.AgrupacionPoliticaId == p.Agrupacion.Id && b.Camara == p.Camara && b.Ocupante != null)
|
||||
.Select(b => b.Ocupante)
|
||||
.ToList()
|
||||
}).ToList();
|
||||
}
|
||||
|
||||
// El resto del método permanece igual...
|
||||
@@ -412,7 +368,7 @@ public class ResultadosController : ControllerBase
|
||||
CamaraNombre = "Cámara de Diputados",
|
||||
TotalBancas = 92,
|
||||
BancasEnJuego = 0,
|
||||
Partidos = MapearPartidos(Core.Enums.TipoCamara.Diputados),
|
||||
Partidos = MapearPartidosOficial(Core.Enums.TipoCamara.Diputados),
|
||||
PresidenteBancada = presidenteDiputados != null ? new { presidenteDiputados.Color } : null
|
||||
};
|
||||
|
||||
@@ -421,7 +377,7 @@ public class ResultadosController : ControllerBase
|
||||
CamaraNombre = "Cámara de Senadores",
|
||||
TotalBancas = 46,
|
||||
BancasEnJuego = 0,
|
||||
Partidos = MapearPartidos(Core.Enums.TipoCamara.Senadores),
|
||||
Partidos = MapearPartidosOficial(Core.Enums.TipoCamara.Senadores),
|
||||
PresidenteBancada = presidenteSenadores != null ? new { presidenteSenadores.Color } : null
|
||||
};
|
||||
|
||||
@@ -466,15 +422,16 @@ public class ResultadosController : ControllerBase
|
||||
.ThenByDescending(b => b.Bancas.BancasTotales);
|
||||
|
||||
return partidosDeCamara
|
||||
.Select(b => new
|
||||
{
|
||||
b.Agrupacion.Id,
|
||||
b.Agrupacion.Nombre,
|
||||
b.Agrupacion.NombreCorto,
|
||||
b.Agrupacion.Color,
|
||||
b.Bancas.BancasTotales
|
||||
})
|
||||
.ToList();
|
||||
.Select(b => new
|
||||
{
|
||||
b.Agrupacion.Id,
|
||||
b.Agrupacion.Nombre,
|
||||
b.Agrupacion.NombreCorto,
|
||||
b.Agrupacion.Color,
|
||||
b.Bancas.BancasTotales,
|
||||
Ocupantes = new List<object>() // <-- Siempre vacío en modo proyección
|
||||
})
|
||||
.ToList();
|
||||
}
|
||||
|
||||
var diputados = new
|
||||
@@ -502,24 +459,20 @@ public class ResultadosController : ControllerBase
|
||||
public async Task<IActionResult> GetBancadasConOcupantes()
|
||||
{
|
||||
var config = await _dbContext.Configuraciones.AsNoTracking().ToDictionaryAsync(c => c.Clave, c => c.Valor);
|
||||
config.TryGetValue("MostrarOcupantes", out var mostrarOcupantesValue);
|
||||
if (mostrarOcupantesValue != "true")
|
||||
|
||||
config.TryGetValue("UsarDatosDeBancadasOficiales", out var usarDatosOficialesValue);
|
||||
if (usarDatosOficialesValue != "true")
|
||||
{
|
||||
// Si la opción está desactivada, devolvemos un array vacío.
|
||||
// Si el modo oficial no está activo, SIEMPRE devolvemos un array vacío.
|
||||
return Ok(new List<object>());
|
||||
}
|
||||
|
||||
// Si el modo oficial SÍ está activo, devolvemos los detalles.
|
||||
var bancadasConOcupantes = await _dbContext.Bancadas
|
||||
.AsNoTracking()
|
||||
.Include(b => b.Ocupante)
|
||||
.Where(b => b.Ocupante != null) // Solo las que tienen un ocupante asignado
|
||||
.Select(b => new
|
||||
{
|
||||
b.Id,
|
||||
b.Camara,
|
||||
b.AgrupacionPoliticaId,
|
||||
Ocupante = b.Ocupante
|
||||
})
|
||||
.Select(b => new { b.Id, b.Camara, b.AgrupacionPoliticaId, Ocupante = b.Ocupante })
|
||||
.OrderBy(b => b.Id)
|
||||
.ToListAsync();
|
||||
|
||||
return Ok(bancadasConOcupantes);
|
||||
|
||||
Reference in New Issue
Block a user