Feats y Fixs Varios

This commit is contained in:
2025-08-30 11:31:45 -03:00
parent 3b8c6bf754
commit 608ae655be
22 changed files with 732 additions and 100 deletions

View File

@@ -311,19 +311,47 @@ public class ResultadosController : ControllerBase
}
}
// En ResultadosController.cs
private async Task<IActionResult> GetComposicionDesdeBancadasOficiales(Dictionary<string, string> config)
{
var bancadas = await _dbContext.Bancadas.AsNoTracking()
.Include(b => b.AgrupacionPolitica)
.Include(b => b.Ocupante)
.ToListAsync();
config.TryGetValue("MostrarOcupantes", out var mostrarOcupantesValue);
bool mostrarOcupantes = mostrarOcupantesValue == "true";
IQueryable<Bancada> bancadasQuery = _dbContext.Bancadas.AsNoTracking()
.Include(b => b.AgrupacionPolitica);
if (mostrarOcupantes)
{
bancadasQuery = bancadasQuery.Include(b => b.Ocupante);
}
var bancadas = await bancadasQuery.ToListAsync();
var bancasPorAgrupacion = bancadas
.Where(b => b.AgrupacionPolitica != null)
.GroupBy(b => b.AgrupacionPolitica)
.Select(g => new { Agrupacion = g.Key!, Camara = g.First().Camara, BancasTotales = g.Count() })
// Agrupamos por el ID del partido, que es un valor único y estable
.GroupBy(b => b.AgrupacionPolitica!.Id)
.Select(g =>
{
// Tomamos la información de la agrupación del primer elemento (todas son iguales)
var primeraBancaDelGrupo = g.First();
var agrupacion = primeraBancaDelGrupo.AgrupacionPolitica!;
// Filtramos los ocupantes solo para este grupo
var ocupantesDelPartido = mostrarOcupantes
? g.Select(b => b.Ocupante).Where(o => o != null).ToList()
: new List<OcupanteBanca?>();
return new
{
Agrupacion = agrupacion,
Camara = primeraBancaDelGrupo.Camara,
BancasTotales = g.Count(),
Ocupantes = ocupantesDelPartido
};
})
.ToList();
// --- FIN DE LA CORRECCIÓN CLAVE ---
var presidenteDiputados = bancasPorAgrupacion
.Where(b => b.Camara == Core.Enums.TipoCamara.Diputados)
.OrderByDescending(b => b.BancasTotales)
@@ -332,43 +360,34 @@ public class ResultadosController : ControllerBase
config.TryGetValue("PresidenciaSenadores", out var idPartidoPresidenteSenadores);
var presidenteSenadores = await _dbContext.AgrupacionesPoliticas.FindAsync(idPartidoPresidenteSenadores);
object MapearPartidosOficial(Core.Enums.TipoCamara camara)
object MapearPartidos(Core.Enums.TipoCamara camara)
{
// 1. Filtramos las bancadas que nos interesan (por cámara y que tengan partido).
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.
if (camara == Core.Enums.TipoCamara.Diputados)
partidosDeCamara = partidosDeCamara.OrderBy(p => p.Agrupacion.OrdenDiputados ?? 999);
else
partidosDeCamara = partidosDeCamara.OrderBy(p => p.Agrupacion.OrdenSenadores ?? 999);
// 3. Ordenamos, como antes, pero ahora sobre una lista de grupos correcta.
var partidosOrdenados = (camara == Core.Enums.TipoCamara.Diputados)
? partidosDeCamara.OrderBy(p => p.Agrupacion.OrdenDiputados ?? 999)
: partidosDeCamara.OrderBy(p => p.Agrupacion.OrdenSenadores ?? 999);
// 4. Mapeamos al resultado final.
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();
return partidosDeCamara
.OrderByDescending(p => p.BancasTotales)
.Select(p => new
{
p.Agrupacion.Id,
p.Agrupacion.Nombre,
p.Agrupacion.NombreCorto,
p.Agrupacion.Color,
p.BancasTotales,
p.Ocupantes // Pasamos la lista de ocupantes ya filtrada
}).ToList();
}
// El resto del método permanece igual...
var diputados = new
{
CamaraNombre = "Cámara de Diputados",
TotalBancas = 92,
BancasEnJuego = 0,
Partidos = MapearPartidosOficial(Core.Enums.TipoCamara.Diputados),
Partidos = MapearPartidos(Core.Enums.TipoCamara.Diputados),
PresidenteBancada = presidenteDiputados != null ? new { presidenteDiputados.Color } : null
};
@@ -377,7 +396,7 @@ public class ResultadosController : ControllerBase
CamaraNombre = "Cámara de Senadores",
TotalBancas = 46,
BancasEnJuego = 0,
Partidos = MapearPartidosOficial(Core.Enums.TipoCamara.Senadores),
Partidos = MapearPartidos(Core.Enums.TipoCamara.Senadores),
PresidenteBancada = presidenteSenadores != null ? new { presidenteSenadores.Color } : null
};
@@ -471,7 +490,14 @@ public class ResultadosController : ControllerBase
var bancadasConOcupantes = await _dbContext.Bancadas
.AsNoTracking()
.Include(b => b.Ocupante)
.Select(b => new { b.Id, b.Camara, b.AgrupacionPoliticaId, Ocupante = b.Ocupante })
.Select(b => new
{
b.Id,
b.Camara,
b.NumeroBanca,
b.AgrupacionPoliticaId,
Ocupante = b.Ocupante
})
.OrderBy(b => b.Id)
.ToListAsync();

View File

@@ -42,7 +42,7 @@ builder.Services.AddCors(options =>
policy.WithOrigins(
"http://localhost:5173", // Para widgets
"http://localhost:5174" // Para admin
)
)
.AllowAnyHeader()
.AllowAnyMethod();
});
@@ -107,18 +107,26 @@ using (var scope = app.Services.CreateScope())
{
var bancas = new List<Bancada>();
// 92 bancas de diputados
for (int i = 0; i < 92; i++)
for (int i = 1; i <= 92; i++) // Bucle de 1 a 92
{
bancas.Add(new Bancada { Camara = Elecciones.Core.Enums.TipoCamara.Diputados });
bancas.Add(new Bancada
{
Camara = Elecciones.Core.Enums.TipoCamara.Diputados,
NumeroBanca = i // Asignamos el número de banca
});
}
// 46 bancas de senadores
for (int i = 0; i < 46; i++)
for (int i = 1; i <= 46; i++) // Bucle de 1 a 46
{
bancas.Add(new Bancada { Camara = Elecciones.Core.Enums.TipoCamara.Senadores });
bancas.Add(new Bancada
{
Camara = Elecciones.Core.Enums.TipoCamara.Senadores,
NumeroBanca = i // Asignamos el número de banca
});
}
context.Bancadas.AddRange(bancas);
context.SaveChanges();
Console.WriteLine("--> Seeded 138 empty bancas.");
Console.WriteLine("--> Seeded 138 bancas físicas.");
}
}

View File

@@ -14,7 +14,7 @@ using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("Elecciones.Api")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+1ed9a49a5373209c105168d721df4c77b6c1f329")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+3b8c6bf754cff6ace486ae8fe850ed4d69233280")]
[assembly: System.Reflection.AssemblyProductAttribute("Elecciones.Api")]
[assembly: System.Reflection.AssemblyTitleAttribute("Elecciones.Api")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]

View File

@@ -1 +1 @@
{"GlobalPropertiesHash":"b5T/+ta4fUd8qpIzUTm3KyEwAYYUsU5ASo+CSFM3ByE=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["BNGxWTPjjFD1Fj56FltRDUvsBzgMlQvuqV\u002BraH2IhwQ=","t631p0kaOa0gMRIcaPzz1ZVPZ1kuq4pq4kYPWQgoPcM=","PA/Beu9jJpOBY5r5Y1CiSyqrARA2j7LHeWYUnEZpQO8=","ywKm3DCyXg4YCbZAIx3JUlT8N4Irff3GswYUVDST\u002BjQ=","6WTvWQ72AaZBYOVSmaxaci9tc1dW5p7IK9Kscjj2cb0=","vAy46VJ9Gp8QqG/Px4J1mj8jL6ws4/A01UKRmMYfYek=","cdgbHR/E4DJsddPc\u002BTpzoUMOVNaFJZm33Pw7AxU9Ees=","4r4JGR4hS5m4rsLfuCSZxzrknTBxKFkLQDXc\u002B2KbqTU=","yVoZ4UnBcSOapsJIi046hnn7ylD3jAcEBUxQ\u002Brkvj/4=","/GfbpJthEWmsuz0uFx1QLHM7gyM1wLLeQgAIl4SzUD4=","i5\u002B5LcfxQD8meRAkQbVf4wMvjxSE4\u002BjCd2/FdPtMpms=","AvSkxVPIg0GjnB1RJ4hDNyo9p9GONrzDs8uVuixH\u002BOE=","IgT9pOgRnK37qfILj2QcjFoBZ180HMt\u002BScgje2iYOo4=","ezUlOMzNZmyKDIe1wwXqvX\u002BvhwfB992xNVts7r2zcTc=","y2BV4WpkQuLfqQhfOQBtmuzh940c3s4LAopGKfztfTE=","XNJwPCDHDCECwfNSMw\u002B6U9bmP9Oc1zMcX0NwP0k5bF8=","P8JRhYPpULTLMAydvl3Ky\u002B92/tYDIjui0l66En4aXuQ=","T1/vt/jpzUAMkv7\u002BVei1e0uBlnnKJZz40wzx6s2b4L0="],"CachedAssets":{},"CachedCopyCandidates":{}}
{"GlobalPropertiesHash":"b5T/+ta4fUd8qpIzUTm3KyEwAYYUsU5ASo+CSFM3ByE=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["BNGxWTPjjFD1Fj56FltRDUvsBzgMlQvuqV\u002BraH2IhwQ=","t631p0kaOa0gMRIcaPzz1ZVPZ1kuq4pq4kYPWQgoPcM=","PA/Beu9jJpOBY5r5Y1CiSyqrARA2j7LHeWYUnEZpQO8=","ywKm3DCyXg4YCbZAIx3JUlT8N4Irff3GswYUVDST\u002BjQ=","6WTvWQ72AaZBYOVSmaxaci9tc1dW5p7IK9Kscjj2cb0=","vAy46VJ9Gp8QqG/Px4J1mj8jL6ws4/A01UKRmMYfYek=","cdgbHR/E4DJsddPc\u002BTpzoUMOVNaFJZm33Pw7AxU9Ees=","4r4JGR4hS5m4rsLfuCSZxzrknTBxKFkLQDXc\u002B2KbqTU=","yVoZ4UnBcSOapsJIi046hnn7ylD3jAcEBUxQ\u002Brkvj/4=","/GfbpJthEWmsuz0uFx1QLHM7gyM1wLLeQgAIl4SzUD4=","i5\u002B5LcfxQD8meRAkQbVf4wMvjxSE4\u002BjCd2/FdPtMpms=","AvSkxVPIg0GjnB1RJ4hDNyo9p9GONrzDs8uVuixH\u002BOE=","IgT9pOgRnK37qfILj2QcjFoBZ180HMt\u002BScgje2iYOo4=","ezUlOMzNZmyKDIe1wwXqvX\u002BvhwfB992xNVts7r2zcTc=","y2BV4WpkQuLfqQhfOQBtmuzh940c3s4LAopGKfztfTE=","lHTUEsMkDu8nqXtfTwl7FRfgocyyc7RI5O/edTHN1\u002B0=","BlOQCaw/bt9UsCnDEIqO6LwzwEh4i0OxBfeIZgKDR4U=","P8JRhYPpULTLMAydvl3Ky\u002B92/tYDIjui0l66En4aXuQ=","2x9HRdaMF3CjEHo\u002BFx\u002BfhG7CTomq/ExTkOKw2bUeHms="],"CachedAssets":{},"CachedCopyCandidates":{}}

View File

@@ -1 +1 @@
{"GlobalPropertiesHash":"tJTBjV/i0Ihkc6XuOu69wxL8PBac9c9Kak6srMso4pU=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["BNGxWTPjjFD1Fj56FltRDUvsBzgMlQvuqV\u002BraH2IhwQ=","t631p0kaOa0gMRIcaPzz1ZVPZ1kuq4pq4kYPWQgoPcM=","PA/Beu9jJpOBY5r5Y1CiSyqrARA2j7LHeWYUnEZpQO8=","ywKm3DCyXg4YCbZAIx3JUlT8N4Irff3GswYUVDST\u002BjQ=","6WTvWQ72AaZBYOVSmaxaci9tc1dW5p7IK9Kscjj2cb0=","vAy46VJ9Gp8QqG/Px4J1mj8jL6ws4/A01UKRmMYfYek=","cdgbHR/E4DJsddPc\u002BTpzoUMOVNaFJZm33Pw7AxU9Ees=","4r4JGR4hS5m4rsLfuCSZxzrknTBxKFkLQDXc\u002B2KbqTU=","yVoZ4UnBcSOapsJIi046hnn7ylD3jAcEBUxQ\u002Brkvj/4=","/GfbpJthEWmsuz0uFx1QLHM7gyM1wLLeQgAIl4SzUD4=","i5\u002B5LcfxQD8meRAkQbVf4wMvjxSE4\u002BjCd2/FdPtMpms=","AvSkxVPIg0GjnB1RJ4hDNyo9p9GONrzDs8uVuixH\u002BOE=","IgT9pOgRnK37qfILj2QcjFoBZ180HMt\u002BScgje2iYOo4=","ezUlOMzNZmyKDIe1wwXqvX\u002BvhwfB992xNVts7r2zcTc=","y2BV4WpkQuLfqQhfOQBtmuzh940c3s4LAopGKfztfTE=","XNJwPCDHDCECwfNSMw\u002B6U9bmP9Oc1zMcX0NwP0k5bF8=","P8JRhYPpULTLMAydvl3Ky\u002B92/tYDIjui0l66En4aXuQ=","T1/vt/jpzUAMkv7\u002BVei1e0uBlnnKJZz40wzx6s2b4L0="],"CachedAssets":{},"CachedCopyCandidates":{}}
{"GlobalPropertiesHash":"tJTBjV/i0Ihkc6XuOu69wxL8PBac9c9Kak6srMso4pU=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["BNGxWTPjjFD1Fj56FltRDUvsBzgMlQvuqV\u002BraH2IhwQ=","t631p0kaOa0gMRIcaPzz1ZVPZ1kuq4pq4kYPWQgoPcM=","PA/Beu9jJpOBY5r5Y1CiSyqrARA2j7LHeWYUnEZpQO8=","ywKm3DCyXg4YCbZAIx3JUlT8N4Irff3GswYUVDST\u002BjQ=","6WTvWQ72AaZBYOVSmaxaci9tc1dW5p7IK9Kscjj2cb0=","vAy46VJ9Gp8QqG/Px4J1mj8jL6ws4/A01UKRmMYfYek=","cdgbHR/E4DJsddPc\u002BTpzoUMOVNaFJZm33Pw7AxU9Ees=","4r4JGR4hS5m4rsLfuCSZxzrknTBxKFkLQDXc\u002B2KbqTU=","yVoZ4UnBcSOapsJIi046hnn7ylD3jAcEBUxQ\u002Brkvj/4=","/GfbpJthEWmsuz0uFx1QLHM7gyM1wLLeQgAIl4SzUD4=","i5\u002B5LcfxQD8meRAkQbVf4wMvjxSE4\u002BjCd2/FdPtMpms=","AvSkxVPIg0GjnB1RJ4hDNyo9p9GONrzDs8uVuixH\u002BOE=","IgT9pOgRnK37qfILj2QcjFoBZ180HMt\u002BScgje2iYOo4=","ezUlOMzNZmyKDIe1wwXqvX\u002BvhwfB992xNVts7r2zcTc=","y2BV4WpkQuLfqQhfOQBtmuzh940c3s4LAopGKfztfTE=","lHTUEsMkDu8nqXtfTwl7FRfgocyyc7RI5O/edTHN1\u002B0=","BlOQCaw/bt9UsCnDEIqO6LwzwEh4i0OxBfeIZgKDR4U=","P8JRhYPpULTLMAydvl3Ky\u002B92/tYDIjui0l66En4aXuQ=","2x9HRdaMF3CjEHo\u002BFx\u002BfhG7CTomq/ExTkOKw2bUeHms="],"CachedAssets":{},"CachedCopyCandidates":{}}