From ed5b78e6c8f2d0bcb3fb7cf1f547ad7bdc9e710b Mon Sep 17 00:00:00 2001 From: dmolinari Date: Wed, 1 Oct 2025 10:27:30 -0300 Subject: [PATCH] =?UTF-8?q?Feat=20Visual=20en=20Producci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Elecciones-Web/frontend/src/main.tsx | 19 +++++++++++++---- .../Controllers/ResultadosController.cs | 21 ++----------------- 2 files changed, 17 insertions(+), 23 deletions(-) diff --git a/Elecciones-Web/frontend/src/main.tsx b/Elecciones-Web/frontend/src/main.tsx index a007d32..427284c 100644 --- a/Elecciones-Web/frontend/src/main.tsx +++ b/Elecciones-Web/frontend/src/main.tsx @@ -2,7 +2,7 @@ import React from 'react'; import ReactDOM from 'react-dom/client'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; - +/* import { BancasWidget } from './features/legislativas/provinciales/BancasWidget' import { CongresoWidget } from './features/legislativas/provinciales/CongresoWidget' import MapaBsAs from './features/legislativas/provinciales/MapaBsAs' @@ -21,16 +21,22 @@ import { SenadoresPorSeccionWidget } from './features/legislativas/provinciales/ import { ConcejalesPorSeccionWidget } from './features/legislativas/provinciales/ConcejalesPorSeccionWidget' import { ResultadosTablaDetalladaWidget } from './features/legislativas/provinciales/ResultadosTablaDetalladaWidget'; import { ResultadosRankingMunicipioWidget } from './features/legislativas/provinciales/ResultadosRankingMunicipioWidget'; +*/ //import { DevApp } from './components/common/DevApp'; + +import { HomeCarouselWidget } from './features/legislativas/nacionales/HomeCarouselWidget'; +import { PanelNacionalWidget } from './features/legislativas/nacionales/PanelNacionalWidget'; +import { ResultadosNacionalesCardsWidget } from './features/legislativas/nacionales/ResultadosNacionalesCardsWidget'; + import './index.css'; import { DevAppLegislativas } from './features/legislativas/DevAppLegislativas'; - const queryClient = new QueryClient(); // Mapeamos el nombre del widget (del atributo data) al componente de React const WIDGET_MAP: Record = { - 'resumen-senadores': SenadoresWidget, + // Widgets Legislativas Provinciales BsAs 2025 + /*'resumen-senadores': SenadoresWidget, 'resumen-diputados': DiputadosWidget, 'resumen-concejales': ConcejalesWidget, 'congreso-provincial': CongresoWidget, @@ -47,7 +53,12 @@ const WIDGET_MAP: Record = { 'senadores-por-seccion': SenadoresPorSeccionWidget, 'concejales-por-seccion': ConcejalesPorSeccionWidget, 'resultados-tabla-detallada-por-seccion' : ResultadosTablaDetalladaWidget, - 'resultados-tabla-detallada-por-municipio' : ResultadosRankingMunicipioWidget, + 'resultados-tabla-detallada-por-municipio' : ResultadosRankingMunicipioWidget,*/ + + // Widgets Legislativas Nacionales 2025 + 'home-carousel': HomeCarouselWidget, + 'panel-nacional': PanelNacionalWidget, + 'resultados-nacionales-cards': ResultadosNacionalesCardsWidget, }; // Vite establece `import.meta.env.DEV` a `true` cuando ejecutamos 'npm run dev' diff --git a/Elecciones-Web/src/Elecciones.Api/Controllers/ResultadosController.cs b/Elecciones-Web/src/Elecciones.Api/Controllers/ResultadosController.cs index c1d8c94..ce62a72 100644 --- a/Elecciones-Web/src/Elecciones.Api/Controllers/ResultadosController.cs +++ b/Elecciones-Web/src/Elecciones.Api/Controllers/ResultadosController.cs @@ -146,7 +146,7 @@ public class ResultadosController : ControllerBase .Where(l => l.EleccionId == eleccionId || l.EleccionId == 0) // Trae los de la elección actual y los de fallback .ToListAsync(); - // --- LÓGICA DE AGRUPACIÓN Y CÁLCULO CORREGIDA --- + // --- LÓGICA DE AGRUPACIÓN Y CÁLCULO --- var resultadosAgrupados = resultadosPorMunicipio .GroupBy(r => r.CategoriaId) .Select(g => new @@ -465,7 +465,6 @@ public class ResultadosController : ControllerBase private async Task GetComposicionDesdeProyecciones(Dictionary config, int eleccionId) { - // --- INICIO DE LA CORRECCIÓN --- // 1. Obtenemos el ID del ámbito provincial para usarlo en el filtro. var provincia = await _dbContext.AmbitosGeograficos.AsNoTracking() .FirstOrDefaultAsync(a => a.NivelId == 10); @@ -480,7 +479,6 @@ public class ResultadosController : ControllerBase Senadores = new { Partidos = new List() } }); } - // --- FIN DE LA CORRECCIÓN --- var bancasPorAgrupacion = await _dbContext.ProyeccionesBancas .AsNoTracking() @@ -490,7 +488,6 @@ public class ResultadosController : ControllerBase { AgrupacionId = g.Key.AgrupacionPoliticaId, CategoriaId = g.Key.CategoriaId, - // Ahora la suma es correcta porque solo considera los registros a nivel provincial BancasTotales = g.Sum(p => p.NroBancas) }) .ToListAsync(); @@ -618,16 +615,12 @@ public class ResultadosController : ControllerBase return Ok(new { UltimaActualizacion = DateTime.UtcNow, Resultados = new List() }); } - // --- INICIO DE LA CORRECCIÓN DE LOGOS --- - // 1. Buscamos logos que sean para esta categoría Y que sean generales (ámbito null). var logosGenerales = await _dbContext.LogosAgrupacionesCategorias .AsNoTracking() .Where(l => l.CategoriaId == categoriaId && l.AmbitoGeograficoId == null) .ToDictionaryAsync(l => l.AgrupacionPoliticaId); - // --- FIN DE LA CORRECCIÓN DE LOGOS --- - var resultadosMunicipales = await _dbContext.ResultadosVotos .AsNoTracking() .Include(r => r.AgrupacionPolitica) @@ -687,7 +680,6 @@ public class ResultadosController : ControllerBase .GroupBy(r => r.AmbitoGeografico.SeccionProvincialId) .Select(g => { - // --- INICIO DE LA CORRECCIÓN --- // Para cada sección, encontramos al partido con más votos. var ganador = g // CAMBIO CLAVE: Agrupamos por el ID de la agrupación, no por el objeto. @@ -700,7 +692,6 @@ public class ResultadosController : ControllerBase }) .OrderByDescending(x => x.TotalVotos) .FirstOrDefault(); - // --- FIN DE LA CORRECCIÓN --- // Buscamos el nombre de la sección var seccionInfo = _dbContext.AmbitosGeograficos @@ -1243,8 +1234,6 @@ public class ResultadosController : ControllerBase { if (string.IsNullOrEmpty(distritoId)) { - // --- VISTA NACIONAL (LÓGICA CORRECTA Y ROBUSTA) --- - // PASO 1: Agrupar y sumar los votos por provincia y partido directamente en la BD. // Esto crea una lista con los totales, que es mucho más pequeña que los datos crudos. var votosAgregadosPorProvincia = await _dbContext.ResultadosVotos @@ -1285,7 +1274,7 @@ public class ResultadosController : ControllerBase } else { - // --- VISTA PROVINCIAL (SIN CAMBIOS, YA ERA EFICIENTE) --- + // --- VISTA PROVINCIAL --- var votosAgregadosPorMunicipio = await _dbContext.ResultadosVotos .AsNoTracking() .Where(r => r.EleccionId == eleccionId @@ -1462,12 +1451,8 @@ List overrides, string agrupacionId, int categoriaId, int? am ?? logos.FirstOrDefault(l => l.EleccionId == 0 && l.AgrupacionPoliticaId == agrupacionId && l.CategoriaId == categoriaId && l.AmbitoGeograficoId == ambitoId) // Prioridad 4: Coincidencia de Fallback por Categoría (Elección y Ámbito genéricos) ?? logos.FirstOrDefault(l => l.EleccionId == 0 && l.AgrupacionPoliticaId == agrupacionId && l.CategoriaId == categoriaId && l.AmbitoGeograficoId == null) - - // --- INICIO DE LA CORRECCIÓN --- // Prioridad 5: LOGO GLOBAL. Coincidencia solo por Partido (Elección y Categoría genéricas) - // Se busca EleccionId = 0 y CategoriaId = 0 (en lugar de null) para que coincida con la lógica de los otros widgets. ?? logos.FirstOrDefault(l => l.EleccionId == 0 && l.AgrupacionPoliticaId == agrupacionId && l.CategoriaId == 0 && l.AmbitoGeograficoId == null); - // --- FIN DE LA CORRECCIÓN --- } [HttpGet("resumen-por-provincia")] @@ -1483,8 +1468,6 @@ List overrides, string agrupacionId, int categoriaId, int? am const int catSenadoresNac = 1; var provinciasQueRenuevanSenadores = new HashSet { "01", "06", "08", "15", "16", "17", "22", "23" }; - - // --- CORRECCIÓN FINAL: Simplificar la carga de datos de soporte --- var todasLasProyecciones = await _dbContext.ProyeccionesBancas.AsNoTracking().Where(p => p.EleccionId == eleccionId && (p.CategoriaId == catDiputadosNac || p.CategoriaId == catSenadoresNac)).ToDictionaryAsync(p => p.AmbitoGeograficoId + "_" + p.AgrupacionPoliticaId + "_" + p.CategoriaId); var todosLosOverrides = await _dbContext.CandidatosOverrides.AsNoTracking().Where(c => c.EleccionId == eleccionId || c.EleccionId == 0).ToListAsync(); var todosLosLogos = await _dbContext.LogosAgrupacionesCategorias.AsNoTracking().Where(l => l.EleccionId == eleccionId || l.EleccionId == 0).ToListAsync();